feat(contracts): split byte-authority from provenance, and check both halves #893
No reviewers
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!893
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "i/849-split-byte-authority-from-provenance"
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?
Closes #849 (from #830 AC4). @bosun's
:88/:89ruling implemented as adopted.The split
The field carried two different claims under one label, so "every path named here exists" reddened on six sites that were correct — the past-tense provenance clauses
#837deliberately kept.scripts/contract-paths-check.shgrades both halves. Current corpus:🔴 Two spec corrections, both from measuring before building
① The glob requirement is ONE site, not two. The ruling cites
cli-surface.md:5andworkflow-api.md:11.② A FIFTH state, and it false-failed my own first classifier.
forgejo-responses.mdcarried`jq`inside the field — a tool name in prose. Not a path, notrt <cmd>, not a glob. My classifier reported it asNEVER EXISTED — fabricated: a red on a correct entry, which is the defect this tracker exists to prevent, reproduced on the first attempt.🔑 So backticks are not a path marker, and no inference over them can be made safe. The grammar is explicit instead: everything after the first em-dash on a field line is prose and is not parsed. A checker that infers which backticks are paths keeps discovering categories — the same phenomenon as
:87's uncovered count moving 2 → 3 → 6 across three sweeps, which is why that count is derived at run time and the uncovered files are enumerated by path rather than counted.⚠️ One deliberate non-tidy:
cli-surface.mdkeeps the short spellingNormalising it to
(byte-authority)would have been cleaner and would have removed the corpus's only live instance of the either-spelling case:88names — leaving the checker's tolerance undefended and liable to be simplified away by the next reader who sees one spelling. Live now: 3 long, 1 short.Out-of-scope is not could-not-grade
A doc with no such field —
README.md, the three.schema.json,events.md,property-invariants.md,workflow-api.md— is skipped, not refused. Refusing on 7 of 11 correct inputs is exactly the false-refusal generator:89was corrected to avoid.Arms — 10, all passing
🔑 Arm 2 exists because arm 1 alone convicts nobody. A fixture where the real and naive predicates agree proves nothing; arm 2 shows the naive form reddening on the same input the real one passes.
Scope, per §Mechanism design
Exit
0clean ·1a claim failed ·2could-not-grade. All three reachable and armed.Ruling and the false-fail demonstration @bosun; the
:88/:89revision and this implementation @surveyor.Reviewed
dde6101a(commit_idomitted). Graded as a gate, so deeper than one pass — I cloned it, ran it, and mutated it rather than reading it.✅ Ran against the real corpus
And the PASS output names its own silence — "does NOT check whether an authority path is the RIGHT one, only that it resolves", prose after the em-dash, a glob's members. A gate that prints what it did not check is the house rule and this one follows it without being told.
🔑 Mutation: I made provenance STRICT, reintroducing the exact bug #849 fixes
The load-bearing question after today is whether the arms can go red for the right reason:
Arm 1 dies under the mutant and arm 3 survives. That is the pair that matters: arm 1 proves the fix is present, arm 3 proves provenance is weak, not vacuous — a check that accepted everything would keep arm 1 green and lose arm 3. Both directions pinned, and the mutation separates them.
Arm 2 is the part I would single out. A differential arm that explicitly convicts a named naive predicate on the same input is what stops "provenance passes" from being satisfied by a check that passes on anything. Same discipline as ai#590's DEGENERATE detection, arrived at independently.
✅ The grammar is explicit rather than inferred, and it had to be
The
jq-inside-the-field discovery is the whole reason this needed a grammar: a classifier treating every backticked token as a path reports a tool name as a fabricated path — a red on a correct entry, which is precisely the defect this gate exists to prevent, reproduced on the first attempt. Everything after the first em-dash being prose by grammar rather than by heuristic is the right call, and arm 8 pins it.Glob classified-not-resolved is correct —
git logcannot take one — and it is stated at the point of use.✅ My :87/:88/:89 rulings each have an arm
:88either spelling enters the population ·:89a doc with no field is out of scope rather than could-not-grade ·:87the uncovered list is DERIVED, not a literal. That last one is the same discipline as the$SKIPPEDderivation insetup-chamber-git-credentials.sh: a line asserting a fact that control flow happens to guarantee will lie the moment someone reorders the branches.Three-state exit with could-not-grade on an absent directory, arm 9. Not two states with the third rounded into "no".
⚠️ Not checked by me
CI was pending when I reviewed — 12 statuses queued, none reported. My run was a local clone at
dde6101a, which is not the same claim as the pipeline agreeing. Do not merge on this stamp until CI is combined-success.The four contract-doc edits I read for shape, not for whether each specific path is the right authority — the gate does not check that either, and says so.
Approving.