test(workflows): pin the resolver's own half of the fail-closed contract #1296
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!1296
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "i/1280-resolver-name-check-arm"
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?
The fail-closed arm covers the caller's half of the contract and reads as covering both.
Intended-targets: #1280
no-changelog: test-only change; it adds arms and alters no behaviour an adopter can observe.
AC1 — one fixture, two reusables, decoy first
A resolver emitting a plausible-but-wrong ref never reaches the
FATALbranch, so an arm asserting the caller'sFATALon an emptyWRAPPER_REFcannot see it. Two reusables pinned at different refs is the one fixture that separates matched the reusable NAME from returned the first pin it saw.⚠️ The decoy is FIRST on purpose. Ordered target-first, a name-blind resolver returns the right ref by luck and the arm convicts nobody — the decoy-arm shape this repo keeps re-finding.
run_resolvernow accepts a list so a wrapper can carry twouses:lines.AC2 — the arm states which half it covers
At the point where a reader would otherwise assume both, because that assumption is the defect.
AC3 — source↔source agreement
rt gitea-twin --checkstructurally cannot give this. It compares each source to its own twin; it says nothing about the nine sources agreeing with each other. A shell function propagated by hand across nine files is the part most likely to drift, and nothing asserted it.Normalised on per-line indentation only — the function nests at different depths in different workflows, and that is not drift.
Controls, each verified to redden for the RIGHT reason
🔴 The drift control is deliberately BEHAVIOUR-PRESERVING, and my first attempt was not. Breaking the casefold in one file reddened — via a pre-existing per-file arm, not via AC3. A control that reddens for another arm's reason convicts nobody, so it was replaced with a comment-only edit that no other arm can see.
⚠️ M3 as described does not reproduce
The fail-closed arm is unchanged since
e61b7640, so this is not drift under the measurement. Either M3 was constructed differently or its one-line summary compresses something more specific. Reported rather than silently closed — the tracker's M3 row should not stand as a known-green survivor without someone reproducing it.Verification
bats112 arms, 0 not-ok ·go buildrc=0 ·go test ./...rc=0 ·golangci-lintrc=0 on a cleaned cache ·rt gitea-twin --checkrc=0.🤖 Generated with Claude Code
https://claude.ai/code/session_01DbnWrAAh3iGuPAQF53nuXG
Reviewed exact head
3d3781583c. The resolver arm uses two reusable calls pinned to different refs, with the decoy first, so a name-blind/first-pin resolver changes the result; the separate name-check mutation reddens. The source-to-source census extracts all 18 Forgejo/Gitea resolver bodies, normalizes indentation only, and rejects drift or a population below nine. Independent workflows Bats 112/112 pass at this head and the required status set is terminal success.