Skip to content

🐛 fix(ci): run the orphaned release-verify-test gate (D-159) - #89

Merged
konih merged 2 commits into
mainfrom
lane/orphan-integrate
Aug 23, 2026
Merged

🐛 fix(ci): run the orphaned release-verify-test gate (D-159)#89
konih merged 2 commits into
mainfrom
lane/orphan-integrate

Conversation

@konih

@konih konih commented Aug 23, 2026

Copy link
Copy Markdown
Contributor

release-verify-test was the only test of hack/release/verify-artifacts.sh — the verification procedure SECURITY.md:61 publishes to release consumers — and was invoked by nothing (D-124). Now wired into task check as stage 14 of 21, in its three offline modes (REQ-E9-S12-02/03/04, sub-second). The default all mode was deliberately not wired: it runs a networked go install goreleaser, a go mod tidy before-hook that would rewrite go.mod/go.sum mid-gate, and --cleans the developer's dist/. REQ-E9-S12-01 (the snapshot→verify round trip) is already automated push-only via hack/release/exitgate_test.sh — not a coverage gap, a PR-visibility one (RELSE-08). Three mutation controls prove the wiring can fail.

konih added 2 commits August 23, 2026 21:10
`Taskfile.yml` defined `release-verify-test` — the ONLY test of
`hack/release/verify-artifacts.sh` — and nothing invoked it: not `check:`,
not `CHECK_STAGES`, not any workflow, not the push-only `release-exitgate`.
That script is what `SECURITY.md:61` publishes to release consumers, so its
test going dead is D-124's "a gate invoked by nothing is not a gate" on a
path D-153/AUD2-F01 just proved rots silently. Measured before fixing: the
gate was green, so this is a wiring defect only.

Wired in its three OFFLINE modes, not the `all` default. `all` adds
test_snapshot_pass -> `task release-snapshot`: a networked `go install
goreleaser`, a `go mod tidy` before-hook that rewrites go.mod/go.sum in the
middle of `task check`, `--clean` on the developer's dist/, and a five-target
cross-compile. `negative` + `cosign-skip-when-absent` + `readme` are
REQ-E9-S12-02/03/04, offline, well under a second. REQ-E9-S12-01 stays the
L1 release-time step the spec already names — stated as a residual in D-159
and the backlog, not hidden.

CHECK_STAGES 20 -> 21 in this commit (the AUD-S18/RELSE-08 lockstep), and
STAGE_BODY_PINS pins the body PER MODE: a bare `bash …/verify_test.sh` pin
would stay green both if two modes were dropped and if the stage were
reverted to the unrunnable default. Three controls, each red for its stated
reason — the `check:` line deleted (by stage NAME, not the count message),
one of three modes gutted while the other two still run, and the same
deletion applied to the real tree (rc=1).

Also: verify_test.sh captured stdout/stderr to fixed /tmp paths and grepped
them. Harmless while nothing ran it; now that concurrent lane worktrees each
run `task check`, one run truncating /tmp/verify-nosig.err at open would fail
another's `skip.*cosign` grep. Scratch now lives in each case's own mktemp -d,
which verify-artifacts.sh cannot see — it reaches dist/ only via a
`find -maxdepth 1` for `*.tar.gz`/`*.zip` and via find_sigstore_bundle's four
archive-name-derived candidates.
Independent review, both P1s docs-truth: my closure was MORE complete than
D-159 and the backlog row claimed, and in an append-only record that still
costs.

ORPH-01/02. D-159 asserted, bolded, that "REQ-E9-S12-01 ... remains covered
by NO automatic gate", and the backlog row repeated it. False, and verified
false at source: openspec/specs/p5-e9-distribution/spec.md:441-442 gives the
requirement the Verify: string `task release-snapshot && task release-verify`;
hack/release/exitgate_test.sh:33-34 runs exactly those two, in that order;
.github/workflows/verify.yaml:196 runs that script as the "E9 release exit
gate (RELSE-03 — REQ-E9-S13)" step. So it IS automated — push-only, under
`if: github.event_name != 'pull_request'`, which is the RELSE-08 blind spot,
not an absence. Both places now say that. D-159 additionally directed a
future lane to "a release-workflow job" if the coverage were not good enough:
that would have duplicated exitgate_test.sh:33-34. Backlog rows drive lane
selection here, so a DONE row carrying a fabricated residual spends a future
session building a gate that exists — the same defect class D-124, D-153 and
AUD2-F01 exist to prosecute, all three of which D-159 invokes.

ORPH-03. I entered the AUD2 paragraph specifically to fix a stale count and
fixed only the first of two. `CHECK_STAGES stays 19 there too` was a LIVE
claim; the array is 21.

ORPH-04. The check: comment justified the stage's position "BEFORE docs-gates
because its readme mode reads hack/release/README.md, which docs-gates does
not cover" — if docs-gates does not read that file, ordering against it is not
a reason. Position is in fact not load-bearing here; what is worth recording
is that this stage is that file's only pin.

No mechanical change: the check: wiring, CHECK_STAGES (21) and the three
mutation controls are untouched. origin/main c094f15 merged down first
(clean, no conflicts).
@konih
konih merged commit 5edb044 into main Aug 23, 2026
7 checks passed
@konih
konih deleted the lane/orphan-integrate branch August 23, 2026 19:26
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant