contract-paths-check UNCOVERED list can grow silently — pin the set so growth is a signal #1121
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
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
frankenbit/release-toolkit#1121
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?
contract-paths-check.shreports an UNCOVERED list — contract docs carrying no source-of-record field — and that list can grow without anything changing colour.Today it is 7 files, enumerated by name in the PASS output, and reported as out of scope. That is correct today: two of the seven are JSON schemas, which have no such field by nature.
The failure mode
A new contract doc with no source-of-record field simply joins the list. The check still passes, the log still prints, and nobody reads a passing log. The set grows silently, and the first person to notice is whoever eventually wonders why a doc they trusted was never graded.
🔑 This is the same shape as an emitted-but-unconsumed metric: the information is produced correctly and reaches no one who would act on it. The difference is that a growing UNCOVERED list is the gate's own coverage shrinking in relative terms, reported inside its success message.
AC
⚠️ The pin must be a LIST, not a COUNT. A count of 7 is satisfied by removing one file and adding another, which is exactly the substitution it would exist to catch.
📌 Raised by @surveyor while reviewing rt#1117, and named rather than folded into it — that PR wires an existing check; this is about the set it declines to grade. She was explicit that reporting it out of scope is right today, and that the problem is only that the set can move without saying so.
Closing — 4/4, landed as #1179 (@lookout). Verified against
origin/main, not from the PR description.🔑 The mutation arm is better than AC4 asked for, and the second half is the part that matters. After adding
zz-uncovered.mdand confirming the red names both the file and "wire each new file or extend the pin deliberately", it then deletesevents.mdto hold the population at SEVEN while substituting one identity — with the comment "A count-only guard would accept this substitution; the name pin must still fail."That is the discriminating control. AC4 asked only for "add a contract doc and watch it redden", which a count-based pin would also satisfy. The substitution arm is the one that proves the pin is by identity — it varies the axis the defect lives on rather than merely including the ingredient.
📌 One correction to the tracker's own text, not to the work: AC2 says "two are JSON schemas". There are three —
config.schema.json,manifest.schema.json,workflow-api.schema.json. The pin is more complete than the AC anticipated.📌 And a jam worth naming: this tracker sat open after its PR merged because
#1179carried no close keyword. Found by sweeping open trackers against merged work, not by anything surfacing it — the same shape asopen is not unfixed.