Development record
2026-08-28 — Release-pipeline gates: two decisions land together. (a) The
2026-08-28 — Release-pipeline gates: two decisions land together. (a) The
semantic receipt_gate moves to the safe side of the tag (adr-52,
Alternative 1 accepted): its arming — content-commit resolution plus the
fail-closed record-lint --release-gate — now runs in release.yml's verify
job, alongside the deterministic gates, gated off the rehearsal path
(github.event_name != 'workflow_dispatch') so a receipt-less rehearsal never
refuses. The release job keeps only provenance signing (re-derive + attest),
and the tag itself is untouched — only the gate moved (iss-2608231226347380).
Caveat recorded for a real-release run: auto-release.yml still mints the tag in
its tag job before it calls release.yml, so fully eliminating a consumed
version on the auto-release path also needs auto-release's tag gated on
verify — out of this change's scope, maintainer-verified separately. (b) The
reviewed content commit is now derived from the RECEIPTS DIRECTORY
(record-lint --derive-content-sha, reading .abcd/work/reviews/<sha>/ of the
released tree) rather than HEAD^2^/HEAD^ ancestry, because a batched
merge-queue push makes github.sha the batch tip and HEAD^2^ can resolve an
unrelated PR's commit past the ancestry guard (iss-355). New Go derivation
(lint.DeriveReleaseContentSha + gitutil.IsAncestor) with tests covering the
merge, batched-queue, nearest-ancestor, stray/off-lineage, and fail-closed
cases; release.yml and the scaffold template (self-scaffold parity held) and
the rehearsal (now a batched-queue regression) all use it.
Frontmatter
| id | dcn-2608280000000003 |
|---|---|
| type | decision |
| date | 2026-08-28 |
.abcd/work/decisions/dcn-2608280000000003-release-pipeline-gates-two-decisions.md
open on GitHub ↗ · commit history ↗
mentions3
- adr-52The semantic gate sits on the wrong side of the tag
- iss-355a batched merge-queue push makes github.sha the batch tip, so auto-release tags the wrong commit and release.yml's HEAD-caret-2-caret receipt derivation resolves an unrelated PR's commit whenever the release roll is not the last entry in its queue batch; the ancestry guard passes and the run wedges after the immutable tag, the iss-326 outcome by a route itd-93's pre-merge check cannot close because batch composition is decided by the queue
- iss-2608231226347380`auto-release.yml` runs `detect` -> `tag` -> `release`, and the semantic