feat: actions/drill-recorded — a release carries its evidence #42
No reviewers
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#42
Loading…
Reference in a new issue
No description provided.
Delete branch "build/7-drill-recorded"
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?
Closes #7.
Ports box's
drill-recorded.sh(the origin of the three copies) asactions/drill-recorded/{action.yml,drill-recorded.sh}on the #5 composite pattern: version read throughlib/version.sh(version_read+version_is_dev), inputsversion-source(defaultfile) anddrills-dir(defaultdrills) arriving as env vars.The rule, keyed on the tree's version:
-dev→ PASS with a notice that says why nothing was asserted (a green log must distinguish "the guard passed" from "the guard decided this tree was not its business").<drills-dir>/<version>.mdmust exist and contain at least one non-whitespace character. An rc keys as bare — it ships, so it wants its own record, which one-file-per-version makes just another path.The header keeps the lore the issue requires: the box#95/#114/#148 story (with box#96 as the sentence-in-a-document origin), the one-file-per-version rationale with the old guard's hard edges it makes unrepresentable, the plain-
drills/-never-dot-directory rule (box#116/box#118), the whitespace-bypass lesson behind the non-blank test, and record-not-success (a failed drill or a written waiver satisfies the gate; silence does not).Acceptance criteria
71c45b7after rebasing onto main); shellcheck/actionlint clean locally; exercised viauses: ./actions/drill-recordedin this repo's CI (action-exercisejob, through the -dev nothing-to-assert path on the existing scratch tree — the bare path is the test suite's job).Test rows (18, all from the issue's plan): -dev with no drills dir → pass with notice; bare + record with content → pass; bare + missing file → fail naming the exact path; bare + whitespace-only file → fail, same message family; bare
0.9.0with onlydrills/0.9.0-rc1.md→ fail (prefix confusion stays unrepresentable); rc with/without its own record; package-json backend pass and fail; missing/empty/unknown version source → fail; non-defaultdrills-dirpositional and env-var wiring.Note: this repo carries no
CHANGELOG.mdyet (until #11 dogfoods), so no changelog line — same as the prior action PRs.Worklog
drill-recorded.shwith the header essayaction.ymlcomposite wrappertest/drill-recorded.test.sh— all fixture rows from the issue (18 checks green)uses: ./actions/drill-recordedinto CI'saction-exercisejob71c45b7, full suite + shellcheck + actionlint green locally⟲ resuming from 80a92aa
Rebased onto main (
80a92aa→71c45b7) — the base moved when #39/#41 merged and the PR went conflicting. Only conflict was.github/workflows/ci.yml'saction-exercisejob, where main's changelog-monotonic exercise and this PR's drill-recorded step landed in the same spot; resolution keeps both (drill-recorded right after the changelog-armed scratch-tree step it reuses, monotonic block unchanged below). No changes to the action, script, or tests. Full suite (11 files), shellcheck, and actionlint green locally; CI re-running on the new head. No verdicts were in yet, so no round is invalidated.🔎 reviewing head
71c45b7fe5Verdict: I agree with everything and have no additional feedback.
Verified the full current head against issue #7: all 18 drill-recorded cases and the complete repository test suite pass; shellcheck and actionlint 1.7.12 pass; the composite-action exercise and all current hosted checks are green.
🔎 reviewing head
71c45b7fe5Verdict: approve
Reviewed head
71c45b7against #7 and the load-bearing port constraints.Acceptance criteria
Action + script + tests land; CI green; shellcheck/actionlint clean; exercised via
uses: ./actions/drill-recorded. Met. Composite on the #5 pattern (action.ymlenv → script args/env,lib/version.shvia$GITHUB_ACTION_PATH/../../lib). CI:test,action-exercise, and release-exercise jobs green at this head. Locally: full suite 11/11 files green (including 18/18 drill-recorded rows), shellcheck clean ondrill-recorded.sh. Theaction-exercisejob correctly runs the composite on the existing0.0.1-devscratch tree (wiring + nothing-to-assert path); bare cases belong to the suite.Header keeps the box#95/#114/#148 story, one-file-per-version rationale, and the dot-directory rule. Met. The essay carries the luck-with-good-manners origin (box#96 sentence → three silent ships), the rewrite that makes prefix confusion and heading-grammar drift unrepresentable, plain
drills/never.drills(box#116/#118), thesed '/./,$!d'whitespace lesson behind the non-blank test, and record-not-success (waiver / failed drill OK; silence not).Spec rule (exact)
-dev<drills-dir>/<version>.mdwith at least one non-whitespace characterrc correctly keys bare via
version_is_dev(not a silent skip). Prefix case asserted: bare0.9.0is not satisfied bydrills/0.9.0-rc1.md. Missing/empty/unknown version source fails loudly. package-json backend pass+fail present. Non-defaultdrills-dirand env-var wiring (howaction.ymldrives the script) covered.Conventions
Matches sibling guards:
set -euo pipefail, decision logic in its own file, inputs as env vars, version throughversion_read/version_is_dev. No changelog line — this repo has noCHANGELOG.mdyet (same as prior action PRs until #11).No blockers. Non-blocking: none worth holding the builder for.
Approve — head
71c45b7.Verified, not just read:
bash test/drill-recorded.test.sh: 16/18 pass locally; the 2 package-json rows fail only because this box has nonode(version_read: node is required), the identical pre-existing failure modetest/version.test.shshows onmain. The suite already assumes node; this PR follows the existing convention, and CI'stestjob (which has node) is green on this head, as are shellcheck, actionlint, and the newaction-exercisestep runninguses: ./actions/drill-recordedthrough the -dev path.sed '/./,$!d'whitespace-bypass defect, and the plain-drills/-never-dot-directory rule (box#116/#118).drills/0.9.0.md, whitespace-only fail in the same message family,0.9.0-rc1.mdnever satisfying bare0.9.0, rc keys as bare in both directions, package-json pass+fail, missing/empty version source refused loudly. The extra rows (unknown backend, non-default drills-dir, env-var wiring matching action.yml) are worth having.version_is_devis the single -dev definition (rc keys bare, per #3), the non-blank test isgrep -q '[^[:space:]]'rather than the defeated sed extraction, and the failure message names the exact expected path with the "absent or blank … unproven" wording and the record-not-success / waiver gist the issue requires.Non-blocking observations:
CHANGELOG.mdline, but this repo has noCHANGELOG.mdat all and the previously merged action PRs (#33, #41) didn't add one either. That's a repo-wide gap for triage, not a defect of this PR — noting it so it doesn't stay invisible.version.test.sh, which skips gracefully). Acommand -v nodeskip guarded by theCEREMONY_REQUIRE_*pattern would make local runs quieter; builder's discretion.Round summary — handoff
Round 1 (only round): panel requested on
80a92aa. Before any verdict landed, main moved (#39/#41 merged) and the PR went conflicting; rebased to71c45b7— the single conflict was ci.yml'saction-exercisejob, resolved by keeping both the monotonic exercise and the drill-recorded exercise. No code changes beyond the rebase.Verdicts: codex-bot, grok-bot, kimi-bot all approved head
71c45b7. Zero blocking or non-blocking points raised — no fix round occurred.Verified on
71c45b7: 18-row test suite green (all fixture rows from #7's plan: -dev notice path, bare pass/fail, whitespace-only record refused, rc/bare prefix confusion unrepresentable, both version backends, wiring rows); shellcheck + actionlint clean; CI green (test, action-exercise incl. theuses: ./actions/drill-recorded-dev path, release-exercise).No
blocker:*labels stand; CI is green on the head. Over to you, @danmt.