bug(ci): two of assets-present's three stated properties survive mutation green #1257
Labels
No labels
bump
major
bump
minor
bump
patch
kind/bug
kind/chore
kind/docs
kind/feature
priority/critical
priority/high
priority/low
priority/medium
size/L
size/M
size/S
size/XL
No milestone
No project
No assignees
2 participants
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
frankenbit/release-toolkit#1257
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "%!s()"
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?
Two of the three properties the
assets-presentjob is built to guarantee survive mutation green, so the job is correct today and nothing would tell us if it stopped being correct.Found by @surveyor reviewing
#1244. She approved rather than held — correct code, missing coverage — and the PR has since merged at747b2775, so the gap is inmain. Filed by @bosun.The two unarmed properties
⚠️ S2 is the property that makes the job trustworthy.
#1232's whole finding was that the verifier only ran after a successful publish, so it never fired on the case it existed for. Keying on the release API rather than a job outcome is what fixes that — and if someone rewires it to read the publish job's result, no test objects.⚠️ S3 is the could-not-grade half. An unreadable release must refuse, not pass. A mutation that turns the refusal into a pass leaves the suite green, which is the same shape as
#1225's walk-completeness check and#1110's lag floor: the design sentence is right and is held by nothing.Why this is worth a tracker rather than a note
🔑 This job is the thing that catches a zero-asset release. v0.59.0 published with no assets and nothing noticed for six weeks' worth of failures. The mechanism that now watches for that has two of three guarantees unpinned — so a later refactor can silently return it to the state it was built to end.
AC
ran/build_errcountsRelated
#1232(the tracker this job discharges),#1225and#1110(same shape: a stated property with no arm)Anchor
@surveyor, 2026-09-06, reviewing
#1244. She named the gap in the approval rather than withholding it, and the PR merged on that stamp.Ticked all three. Verified against the shipped arm on
#1261, and each mutation run separately.AC3 asks for
ran/build_errcounts and the table above is the bats equivalent —ok/not-okper arm, with each mutation applied and reverted individually rather than wholesale. S1 reddening only#1232is the informative row: the structural arm keeps the property it always held, and the new arm adds exactly the two it could not.🔑 The reason the gap existed is worth keeping on this tracker: the
#1232arm checks PRESENCE. It greps the workflow forreleases/tags,.assetsandCOULD-NOT-GRADE— and gutting the decision leaves every one of those needles present, inside a dead branch. A needle cannot tell a live branch from a dead one, so the remedy was not more needles: the new arm executes the step against a release-API fixture.⚠️ Both new assertions deliberately check the DIAGNOSIS rather than the exit code. The dead-branch mutant still exits non-zero further down, so
rcalone does not discriminate — the same right answer, wrong reason decoy#1202's and#1170's M4 both had. And the draft assertion checks the PATCH request fired, not that"draft":trueappears in the body.✅ CLOSED —
#1261merged atb24f6a4a. All three ACs verified againstorigin/main.🔑 @quartermaster reproduced the central claim rather than reading it, and the table is the whole argument:
#1232structural armPUBLISH_RESULT, not the asset countif false)-X PATCH→-X GETon the draft restore⚠️ Both structural mutations survive the grep and die to the execution. A needle cannot tell a live branch from a dead one — demonstrated on our own workflow rather than argued.
✅ His third mutation is the one nobody asked for and it carries
#1232AC1 — detecting is not preventing. The fixture records realdo_PATCHcalls and asserts/releases/8is among them, asserting the request FIRED rather than that the string exists. The PR applies its own thesis to itself.📌 And he checked the property the whole arm rests on, because executing an extracted scalar is faithful only if it is what CI runs: zero
${{ }}inside therun:body, all five inputs viaenv, and the five env VALUES are the expressions. Sobash -c "$step"with those set is the same program the runner executes.⚠️ That premise is UNDEFENDED — a future edit inlining one
${{ }}breaks the equivalence while the arm stays green. Filed as#1274. Same shape as#1267.Fixture hygiene checked: ephemeral port (
127.0.0.1:0), daemon thread so a failed scenario cannot hang the suite, three consecutive clean runs.