fix(release,guard): a short release cannot be signed; withdraw a false claim - #407
Merged
Conversation
…e claim Batch 1 of the multi-persona review of REQ-GUARD-GATE-EVIDENCE-002. Three changes, all of which correct something that currently renders "nothing happened" as "it worked". 1. release.yml can no longer publish a signed release with no binaries (#402) `find ... -exec cp` exits 0 when it matches nothing, and every one of the six upstream upload-artifact steps sat at the default `if-no-files-found: warn`. So an empty or partial artifacts/ produced an empty release-assets/ in silence, and the checksum, attest, cosign and `gh release create` steps all succeeded over nothing. The gather is now counted against a floor, the same shape the SBOM block ten lines below already used. The floor is derived rather than guessed: build-binaries has 5 matrix targets and build-vsix has 5, so a complete release carries at least 10 of these three extensions. All six uploads now declare `if-no-files-found: error` — the value trace-fixtures.yml already uses, so the repo knew the difference. release.yml only runs on tags, so CI will never exercise this. The logic was therefore exercised locally against four trees: 0 assets -> exit 1, 4 -> exit 1, 10 -> exit 0, 13 -> exit 0. The pre-fix form exits 0 on all four. 2. ci.yml's mutants comment no longer contradicts the gate it calls It still read "Nothing here yet fails a truncated run: that detector, and the runner disk-pressure fault behind it, are #389" — false since #401 merged two commits earlier. This is the "code drifted out from under its comment" species that #385's own fix narrative identifies as its root cause, so it is worth not leaving in place. The replacement also corrects the attribution: the disk-pressure hook was a red herring (it only runs BETWEEN jobs); the reaper was a tmpfiles sweep resting on a false assumption about mtime. 3. A false universal in REQ-GUARD-GATE-EVIDENCE-002 is withdrawn (#405) I wrote "each was mutation-tested to show its cases are load-bearing rather than merely green" into the requirement in #401. It is not true. Results exist for two of six, both manual shell runs with no committed harness, and an adversarial review falsified the universal directly: substituting `filt` -> `filt.split('::')[-1]` in check_verification_filters.py leaves 13/13 green while changing vacuity semantics for the 16 of 60 filters containing `::`; deleting check_lean_sorries.py's below-floor branch leaves 8/8 green. Both reproduced before writing this. The replacement records the correlation rather than hiding it: the two tools that claimed mutation testing have the strongest suites, and the two with live holes claimed nothing. It also states what mechanising it would NOT buy — mutation testing shows the cases present are load-bearing, not that the case set covers the hazard. Refs #402, #405. REQ-GUARD-GATE-EVIDENCE-002. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Rivet verification gate✅ 20/20 passed
Filter: Failed artifacts(none) Updated automatically by |
Codecov Report✅ All modified and coverable lines are covered by tests. 📢 Thoughts on this report? Let us know! |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Batch 1 of the multi-persona review of REQ-GUARD-GATE-EVIDENCE-002 — the three
changes that need no design debate. Refs #402, #405.
Four independent reviewers (safety assessor, adversarial verifier, defect
archaeologist, release manager) all recommended holding
-002atproposed.This PR takes the uncontested subset; the two live obligation holes (#404, #385)
and the systemic layer (#403, #405, #406) follow separately.
1.
release.ymlcan no longer publish a signed release with no binaries (#402)find … -exec cpexits 0 when it matches nothing, and all six upstreamupload-artifactsteps sat at the defaultif-no-files-found: warn. An empty orpartial
artifacts/therefore produced an emptyrelease-assets/in silence —and
sha256sum, the SLSA attestation, cosign, andgh release createallsucceed over nothing. The result is a signed, attested release containing no
binaries.
The gather is now counted against a floor, which is the shape the SBOM block
ten lines below already used — the pattern was recognised once and not applied
to its five siblings. The floor is derived, not guessed:
build-binarieshas 5matrix targets and
build-vsixhas 5, so a complete release carries at least 10of these three extensions before wasm/compliance/evidence are counted.
All six uploads now declare
if-no-files-found: error— the valuetrace-fixtures.yml:453already uses, so the repo demonstrably knew thedifference.
release.ymlonly runs on tags, so CI will never exercise this. The logicwas therefore exercised locally against four trees:
The pre-fix form exits 0 on all four.
2.
ci.yml's mutants comment no longer contradicts the gate it callsIt still read "Nothing here yet fails a truncated run: that detector, and the
runner disk-pressure fault behind it, are #389" — false since #401 merged two
commits earlier. This is precisely the "code drifted out from under its comment"
species that #385's own fix narrative identifies as its root cause, so leaving it
would be leaving the same trap re-armed.
The replacement also fixes the attribution. The disk-pressure hook was a red
herring —
ACTIONS_RUNNER_HOOK_JOB_COMPLETEDonly runs between jobs. Theactual reaper was a tmpfiles sweep on a false premise: "a job that's still
running keeps mtime fresh", which does not hold for cargo-mutants, since it
copies each worker's source tree once at start and never touches it again.
3. A false universal in the requirement is withdrawn (#405)
I wrote this into
REQ-GUARD-GATE-EVIDENCE-002in #401:It is not true. Results exist for two of six, both manual shell runs with no
committed harness. An adversarial reviewer falsified the universal directly, and
I reproduced both mutants before writing this:
Mutant A is not cosmetic: 16 of the 60 distinct filters in
verification.yamlcontain::, and no self-test case has one, so the suite isstructurally blind to it.
The replacement text records the correlation rather than burying it: the two
tools that claimed mutation testing have the strongest suites; the two with live
holes (#404, #385) claimed nothing. The claim was reached for where confidence
was already high, which is where it adds least. It also states what mechanising
it (#405) would not buy — mutation testing shows the cases present are
load-bearing, not that the case set covers the hazard.
Not in this PR
REQ-GUARD-GATE-EVIDENCE-002staysproposedand keeps itshuman-scopedtag.Nothing here promotes it.
🤖 Generated with Claude Code