Scaffold: layout, test harness, shellcheck + actionlint CI #2
Labels
No labels
attention
blocked
blocker:ci-red
blocker:conflict
blocker:drill-pending
blocker:unrequested
bug
claimed
documentation
enhancement
epic
merge-next
needs-ruling
needs-triage
offsite
post-merge
ready
release
scope:docs
scope:guards
scope:labels
scope:release-flow
stale
state:addressing
state:bots-reviewing
state:building
state:needs-human
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference: heavy-duty/ceremony#2
Loading…
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Part of #1. Blocks everything else.
Goal
Turn the empty repo into a workspace the rest of the plan can land in: directory layout, a bash test harness, and a CI workflow that lints and tests every PR. After this issue, every subsequent issue is "add a tested component", never "figure out where things go".
Layout to create
Root
README.mdalready exists; leave it — #12 rewrites it.The test harness
Port the
checkpattern from boxtest/release.shlines 14–36 intotest/harness.shas a sourced lib:check <desc> <want_exit> <want_substr> <cmd...>— runs cmd, asserts exit code, asserts combined stdout+stderr contains the substring when non-empty; printsok:/FAIL:and counts intoPASS/FAILglobals.summary— prints totals, exits 1 if any FAIL.set -ein test files (the harness asserts on failing commands — same note as the source).set -uyes.gh, real git only against repos the test constructs inmktemp -d.Test files are
test/<name>.test.sh, executable, each sourcing the harness.test/run.shfinds and runs them all.CI (
.github/workflows/ci.yml)One job, ubuntu-latest:
fetch-depth: 0— the monotonic guard's tests and later self-guards need history semantics but more importantly this is the family convention for its own CI).shellcheckevery*.shinlib/,actions/,test/(shellcheck -xso sourced libs resolve). Port the discipline from cast'sshellcheck-all.sh: find files by shebang and extension, fail on any finding, and print the file list so an empty glob can't silently pass (the "a guard that quietly stops guarding" rule).actionlinton.github/workflows/*.ymland everyactions/*/action.yml(install the released binary, pinned version).bash test/run.sh.House conventions (write them into a short
CONTRIBUTING.md)set -euo pipefailin executables,set -uonly in test files, mawk-compatible awk (no\xescapes — CI runners ship mawk, learned in boxdrill-recorded.shhistory).box#108,rig#66, …) intact — they are the documentation.0.7.0never matches0.7.0-rc1.Acceptance criteria
bash test/run.shruns locally with zero tests and exits 0 with a "0 tests" notice (loudly saying so, not silently green — print the discovered file count).actionlintruns against the workflows that exist.Out of scope
VERSION/CHANGELOG/self-release wiring — that is #11 (dogfooding), and it needs the release workflow (#9) to exist first.
Claiming this as codex-bot-andresmgsl. I’m starting the scaffold and will open a draft PR shortly.