feat: actions/changelog-armed — the version-keyed arming guard #33
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#33
Loading…
Reference in a new issue
No description provided.
Delete branch "build/5-changelog-armed"
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 #5
Ports box's
.github/scripts/changelog-armed.sh(at the issue's pinned ref) asactions/changelog-armed/— the version-keyed arming guard, and the composite-action pattern #6 and #7 will copy.What's here
actions/changelog-armed/changelog-armed.sh— the port, with the issue's three deltas: version read throughversion_read(#3, so the guard works for cast's package-json trees), the bare-version emptiness check throughchangelog_section(#4, so the guard and the publisher cannot disagree about what a section is), andversion_is_devas the single-devdefinition (an rc keys as bare). Top-section detection, the$2-field parse, the failure messages, and the header essay are kept; references are de-repo-ified (#108→box#108,release.yml→ the release workflow, box's CONTRIBUTING pointer dropped) and the essay states this is the guard rig and cast regain at adoption (rig#44 / cast#108 reverts).actions/changelog-armed/action.yml— composite; inputsversion-source(defaultfile) andchangelog(defaultCHANGELOG.md) passed as env vars; one step runs the co-located script via$GITHUB_ACTION_PATH. The libs are sourced relative to the script — a consumer'suses:fetch brings the whole repo at the pinned ref, so no skew is possible. The description says to check out the consumer's repo first.test/changelog-armed.test.sh— 18 checks: the issue's full matrix (both-devrows, all four bare shapes including the empty stamp and the half-ceremony, the no-sections / missing-file degenerates, both backends) plus rc-keys-as-bare, whole-version rc non-match, unknown backend, and the env-var wiring action.yml relies on.ci.yml— a newaction-exercisejob drivesuses: ./actions/changelog-armedagainst a scratch armed tree after checkout, proving the composite wiring itself.No
CHANGELOG.mdentry: the repo's changelog arrives with #11 (same sequencing as #28/#29/#31).Acceptance criteria
uses: ./actions/changelog-armedafter checkout — theaction-exercisejob.Note for reviewers
Issue #5 sat
blockedon #3/#4, both merged; I corrected the stale label per LABELS.md ("anyone may correct it") and claimed — see the issue comment.Verdict: Approve — I agree with this as-is.
First review of tip
dde6b25. Closes #5.What holds
## Unreleased” form.version_read(file + package-json),changelog_sectionfor non-empty bare section (half-ceremony refuse),version_is_devso rc keys as bare.$ver; wrong number refused; empty stamp refused via the publisher’s extractor (guard and notes cannot disagree).$here/../../libat the same ref as the action (no skew). Description requires consumer checkout first.action-exercise: constructs a scratch armed tree and runsuses: ./actions/changelog-armed— proves action.yml +$GITHUB_ACTION_PATHwiring the unit tests cannot.test+action-exercisegreen.No CHANGELOG yet matches #11 sequencing. No blockers.
🔎 reviewing head
dde6b25Verdict: Approve — head
dde6b25. Closes #5.Verified, not just read:
test/changelog-armed.test.sh18/18 where the runner has node. The 2 local package-json failures are my box lacking node (version_read: node is required) — the same absence fails pre-existing version tests on main, and CI'stestjob (withCEREMONY_REQUIRE_NPM: 1) is green, so those rows genuinely ran there.test(shellcheck + actionlint + suite) andaction-exerciseboth pass on this head. Theaction-exercisejob satisfies the acceptance criterion the unit tests can't —uses: ./actions/changelog-armed,$GITHUB_ACTION_PATH, relative lib sourcing.changelog_section(the publisher can't disagree); stamped-own-version on top with a stray## Unreleasedlower down → correctly passes (both ceremony shapes legal, the rig#44/cast#108 lesson).a17903f). Messages and the header essay carry over faithfully with the stated de-repo-ification; incident numbers (box#108, rig#66, rig#44, cast#108, rig#67) intact, and the essay states this is the guard rig and cast regain.version_readfor both backends,changelog_sectionfor the emptiness check,version_is_devso rc keys as bare (tested — rc section never satisfies the bare version, own rc stamp ships). Whole-version matching holds.set -euo pipefail/set -usplit correct, mawk-safe awk, comments carry the why.No CHANGELOG entry matches the #11 sequencing. No blockers.
Verdict: I agree with everything and have no additional feedback.
Head
dde6b25satisfies #5: the version-keyed guard preserves both legal bare-version shapes, rejects empty/missing/misnumbered sections through the shared extractor, treats only -dev as development, and keeps whole-version matching. The composite action passes inputs via environment variables, sources co-located libraries at the pinned action ref, and documents the consumer checkout requirement. The contract matrix, shellcheck/actionlint suite, and local-action exercise are all green; the explicit no-CHANGELOG exception matches the #11 sequencing.Round summary — converged, handing off
What shipped (head
dde6b25):actions/changelog-armed/— box's version-keyed arming guard ported as a composite action, with the three #5 deltas: version read throughversion_read(file + package-json backends), the bare-version emptiness check throughchangelog_section(guard and publisher share one section definition), andversion_is_devas the single-devtest (rc keys as bare). Plustest/changelog-armed.test.sh(18 checks, the issue's matrix row for row) and a CIaction-exercisejob that drivesuses: ./actions/changelog-armedagainst a scratch armed tree.Rounds: one. All three panel verdicts (grok, kimi, codex) approved the first head
dde6b25with no changes requested — no fixup commits, the reviewed head is the current head.What was verified:
test(shellcheck + actionlint + full suite, 5/5 files) andaction-exercise— the latter proving the action.yml /$GITHUB_ACTION_PATH/ relative-lib wiring the unit tests can't reach.a17903f(messages and header essay verbatim modulo the stated de-repo-ification, incident numbers intact), and ran adversarial probes: empty stamped section under an armed top → refused; stamped-own-version with a stray lower## Unreleased→ passes (both ceremony shapes legal, the rig#44/cast#108 lesson).$veron top, wrong number refused, empty stamp refused via the publisher's extractor) and the no-skew lib sourcing.Post-merge residue:
CHANGELOG.mdentry by design — the repo's changelog arrives with #11.Requesting @danmt's review and setting
state:needs-human. Over to you.