feat(contracts): split byte-authority from provenance so a dead-path check becomes possible (#830 AC4) #849

Closed
opened 2026-08-23 18:12:14 +02:00 by bosun · 8 comments
Owner

The check #830 asks for is buildable — but not against the current field format

#830 AC: "A check exists, or it is stated why not." @surveyor left it un-ticked because
nothing checks a contract doc for a dead path and no reason was recorded. This is the decision.

The field IS structured, which is more than usual

docs/architecture/contracts/fragment-format.md:6     - **Source of record (byte-authority)**: …
docs/architecture/contracts/forgejo-responses.md:6   - **Source of record (byte-authority)**: …
docs/architecture/contracts/changelog-format.md:6    - **Source of record (byte-authority)**: …

A consistent line, one per contract. Parsing it needs no heuristics.

🔴 But the naive check FALSE-FAILS, and the reason is the whole finding

Resolving every path named in that field, today:

docs/conventions.md              OK          internal/changelog   OK
internal/fragments               OK          internal/forgejo     OK
scripts/lib/changelog.sh         MISSING     scripts/fragment-check.sh       MISSING
scripts/lib/fragments.sh         MISSING     scripts/changelog-body-check.sh MISSING
scripts/lib/forgejo-api.sh       MISSING     scripts/lib/register-patterns.sh MISSING

Six missing, and all six are CORRECT — they are the past-tense provenance clauses #837
deliberately kept ("ported from … removed with the bash release path"). A check asserting
"every path in this field exists" reddens on six sites that are right.

🔑 The field holds TWO different claims under one label: what IS authoritative, and what it was
PORTED FROM. Separating them by sentence position is lexical, and this file already records that
lexical auditing over-matches and under-matches on exactly this kind of question.

So the disposition is: make it checkable, then check it

Split the field. One line for AUTHORITY — paths that MUST resolve. One for PROVENANCE —
past-tense, may name anything, checked for nothing.

- **Source of record (byte-authority)**: `internal/fragments`, `rt fragment-check`, `docs/conventions.md`
- **Ported from** (historical, not authoritative): `scripts/lib/fragments.sh`, `scripts/lib/register-patterns.sh`, …

Then BOTH halves carry an assertion, and they are different assertions:

AUTHORITY   does this resolve TODAY        strict — a deleted path FAILS
PROVENANCE  did this EVER resolve          weak   — a deleted path PASSES, a FABRICATED one fails

🔴 AMENDED — the original AC said provenance is "checked for NOTHING". That was my instinct,
flagged as instinct, and @surveyor measured it wrong before it rode as an AC:

scripts/lib/fragments.sh          12 commits    scripts/lib/changelog.sh          15    EXISTED
scripts/lib/register-patterns.sh   3            scripts/changelog-body-check.sh   11    EXISTED
scripts/fragment-check.sh          5            scripts/lib/forgejo-api.sh        29    EXISTED
scripts/lib/fragmnets.sh           0  ← a TYPO'd path            NEVER EXISTED
scripts/lib/totally-made-up.sh     0                             NEVER EXISTED

What "check nothing" would preserve forever is a FABRICATED provenance path — reading as
authoritative history, in a contract document, which is the one place a reader goes to settle an
argument.
The weak check costs one git log per path and fails on exactly the thing worth
catching.

Precondition already met: 8 workflows in this repo run at fetch-depth: 0. That is a structural question, which §Mechanism design says is
the mechanically-auditable half.

⚠️ What this must not become

Deleting the provenance. @surveyor's note on #830 is the reason: the literal reading of
that AC — "no contract document names a path under scripts/lib/" — is satisfiable by deleting
history worth keeping, and she said so on the tick rather than silently satisfying it.
The
wording was narrower than the fix; the fix was right.

Acceptance criteria

  • The three contract docs carry AUTHORITY and PROVENANCE as separate fields
  • A check asserts every AUTHORITY path resolves; it REFUSES rather than warns (a report that cannot alter the exit status is punctuation)
  • The check is mutation-verified: point one AUTHORITY entry at a deleted path, watch it redden by name, restore
  • PROVENANCE paths are checked for ONCE-EXISTED (git log --all -- <path> returns ≥1 commit), refusing on absent history
  • Positive control retained and now doing MORE work: a DELETED file named in provenance must NOT redden — it proves the two halves are genuinely separated
  • The full-history precondition is stated at the point of use, and the check REFUSES rather than skips when history is shallow — DEFERRED → #903, which owns the shallow-clone guard. Measured on main: zero occurrences of shallow/is-shallow-repository/depth in the script or its bats. once_existed() false-FAILS as NEVER EXISTED — fabricated on a shallow clone (#777's C4 corpus test is the precedent — it refuses on an empty corpus rather than skipping)
  • Whether provenance paths occur OUTSIDE the field is established — YES. Known: events.md:5, config.schema.json:5 (JSON description), cli-surface.md:21, cli-surface.md:5 (glob), workflow-api.md:11 (glob). ⚠️ This count has moved on every sweep — 2 → 3 → 6 — because each pass found a category the previous had no bucket for. Treat it as OPEN, not as five.
  • Population is NARROW (files carrying the field) and the PASS ENUMERATES the uncovered sites BY PATH — derived at runtime, never a hardcoded count. A literal number in this AC has already been wrong twice
  • COULD-NOT-GRADE = carries a Source-of-record field and cannot be parsed. NOT "has none" — a README legitimately has none
  • Population = files CARRYING the field, EITHER SPELLING (Source of record and Source of record (byte-authority) both occur)
  • A GLOB in the field (scripts/*.sh) is its own state: neither resolvable-today nor once-existed-checkable. The check must classify it, not resolve it

Anchor

#830 AC 4, left un-ticked deliberately by @surveyor with the reason stated rather than swept
along with its three satisfied siblings.
Field-format measurement and the false-fail
demonstration @bosun.

🔴 CORRECTED BEFORE THIS ANCHOR SET. An earlier draft said @surveyor's .number-without-.repo
enumeration error "would have ticked another repo's ACs onto this tracker". She tested it and it
would NOT have — she corrected me in the direction that lets her off, which is why I re-ran it:

tmux-tell#844's six AC texts, used as needles against rt#844's ACTUAL body   0 hits, 6 of 6

Her patch scripts CONTENT-MATCH: they fetch the body, look for the needle inside it, and assert
the hit count against an expected N.
A cross-repo enumeration error therefore costs a ZERO and
trips the assertion.
The enumeration was wrong; the write was safe.

🔑 The durable half: content-matching FAILS CLOSED where position-matching FAILS OPEN.

📌 Credit splits, and @quartermaster asked that it be split this way against his own interest:

FORMULATION   @quartermaster — but stated as a property of HIS script, from reading his own code
MEASUREMENT   @surveyor      — tmux-tell needles vs rt#844's real body → 0 hits, assertion trips

Without the run it is an anecdote about one python file. Her test is what makes it a claim
about CONTENT-MATCHING as a technique rather than about him, and a technique claim is the only
kind worth anchoring.
Retrieval supplied the sentence; measurement supplied the evidence, and
the evidence is the part that generalises.
A bad work-list is survivable when the write re-derives its
target from the artifact it modifies.
It held by construction rather than by anyone's
foresight, which is what makes it worth copying.

📌 The honest version is weaker and more useful than the alarming one. The second artifact —
a keyword list missing "replaced", which would have sent her to file a residual defect that does
not exist — stands as stated: a plausible number, caught by reading the matched line.

## The check `#830` asks for is buildable — but not against the current field format **`#830` AC: *"A check exists, or it is stated why not."* @surveyor left it un-ticked because nothing checks a contract doc for a dead path and no reason was recorded. This is the decision.** ## ✅ The field IS structured, which is more than usual ``` docs/architecture/contracts/fragment-format.md:6 - **Source of record (byte-authority)**: … docs/architecture/contracts/forgejo-responses.md:6 - **Source of record (byte-authority)**: … docs/architecture/contracts/changelog-format.md:6 - **Source of record (byte-authority)**: … ``` **A consistent line, one per contract. Parsing it needs no heuristics.** ## 🔴 But the naive check FALSE-FAILS, and the reason is the whole finding **Resolving every path named in that field, today:** ``` docs/conventions.md OK internal/changelog OK internal/fragments OK internal/forgejo OK scripts/lib/changelog.sh MISSING scripts/fragment-check.sh MISSING scripts/lib/fragments.sh MISSING scripts/changelog-body-check.sh MISSING scripts/lib/forgejo-api.sh MISSING scripts/lib/register-patterns.sh MISSING ``` **Six missing, and all six are CORRECT** — they are the past-tense provenance clauses `#837` deliberately kept (*"ported from … removed with the bash release path"*). **A check asserting "every path in this field exists" reddens on six sites that are right.** 🔑 **The field holds TWO different claims under one label: what IS authoritative, and what it was PORTED FROM. Separating them by sentence position is lexical, and this file already records that lexical auditing over-matches and under-matches on exactly this kind of question.** ## ✅ So the disposition is: make it checkable, then check it **Split the field.** *One line for AUTHORITY — paths that MUST resolve. One for PROVENANCE — past-tense, may name anything, checked for nothing.* ``` - **Source of record (byte-authority)**: `internal/fragments`, `rt fragment-check`, `docs/conventions.md` - **Ported from** (historical, not authoritative): `scripts/lib/fragments.sh`, `scripts/lib/register-patterns.sh`, … ``` **Then BOTH halves carry an assertion, and they are different assertions:** ``` AUTHORITY does this resolve TODAY strict — a deleted path FAILS PROVENANCE did this EVER resolve weak — a deleted path PASSES, a FABRICATED one fails ``` 🔴 **AMENDED — the original AC said provenance is *"checked for NOTHING"*. That was my instinct, flagged as instinct, and @surveyor measured it wrong before it rode as an AC:** ``` scripts/lib/fragments.sh 12 commits scripts/lib/changelog.sh 15 EXISTED scripts/lib/register-patterns.sh 3 scripts/changelog-body-check.sh 11 EXISTED scripts/fragment-check.sh 5 scripts/lib/forgejo-api.sh 29 EXISTED scripts/lib/fragmnets.sh 0 ← a TYPO'd path NEVER EXISTED scripts/lib/totally-made-up.sh 0 NEVER EXISTED ``` **What *"check nothing"* would preserve forever is a FABRICATED provenance path — reading as authoritative history, in a contract document, which is the one place a reader goes to settle an argument.** *The weak check costs one `git log` per path and fails on exactly the thing worth catching.* ✅ **Precondition already met: 8 workflows in this repo run at `fetch-depth: 0`.** *That is a structural question, which §Mechanism design says is the mechanically-auditable half.* ## ⚠️ What this must not become **Deleting the provenance.** *@surveyor's note on `#830` is the reason: the literal reading of that AC — "no contract document names a path under `scripts/lib/`" — is satisfiable by deleting history worth keeping, and she said so on the tick rather than silently satisfying it.* **The wording was narrower than the fix; the fix was right.** ## Acceptance criteria - [x] The three contract docs carry AUTHORITY and PROVENANCE as separate fields - [x] A check asserts every AUTHORITY path resolves; it REFUSES rather than warns (a report that cannot alter the exit status is punctuation) - [x] The check is mutation-verified: point one AUTHORITY entry at a deleted path, watch it redden by name, restore - [x] PROVENANCE paths are checked for **ONCE-EXISTED** (`git log --all -- <path>` returns ≥1 commit), refusing on absent history - [x] Positive control retained and now doing MORE work: a DELETED file named in provenance must NOT redden — it proves the two halves are genuinely separated - [x] The full-history precondition is stated at the point of use, and the check REFUSES rather than skips when history is shallow — **DEFERRED → #903**, which owns the shallow-clone guard. Measured on `main`: zero occurrences of `shallow`/`is-shallow-repository`/`depth` in the script or its bats. `once_existed()` false-FAILS as `NEVER EXISTED — fabricated` on a shallow clone (`#777`'s C4 corpus test is the precedent — it refuses on an empty corpus rather than skipping) - [x] Whether provenance paths occur OUTSIDE the field is established — **YES**. Known: `events.md:5`, `config.schema.json:5` (JSON description), `cli-surface.md:21`, `cli-surface.md:5` (glob), `workflow-api.md:11` (glob). ⚠️ **This count has moved on every sweep — 2 → 3 → 6 — because each pass found a category the previous had no bucket for. Treat it as OPEN, not as five.** - [x] Population is NARROW (files carrying the field) and the PASS **ENUMERATES the uncovered sites BY PATH — derived at runtime, never a hardcoded count**. A literal number in this AC has already been wrong twice - [x] COULD-NOT-GRADE = **carries a Source-of-record field and cannot be parsed**. NOT "has none" — a README legitimately has none - [x] Population = files CARRYING the field, **EITHER SPELLING** (`Source of record` and `Source of record (byte-authority)` both occur) - [x] A **GLOB** in the field (`scripts/*.sh`) is its own state: neither resolvable-today nor once-existed-checkable. The check must classify it, not resolve it ## Anchor **`#830` AC 4, left un-ticked deliberately by @surveyor with the reason stated rather than swept along with its three satisfied siblings.** *Field-format measurement and the false-fail demonstration @bosun.* 🔴 **CORRECTED BEFORE THIS ANCHOR SET. An earlier draft said @surveyor's `.number`-without-`.repo` enumeration error *"would have ticked another repo's ACs onto this tracker"*. She tested it and it would NOT have — she corrected me in the direction that lets her off, which is why I re-ran it:** ``` tmux-tell#844's six AC texts, used as needles against rt#844's ACTUAL body 0 hits, 6 of 6 ``` **Her patch scripts CONTENT-MATCH: they fetch the body, look for the needle inside it, and assert the hit count against an expected N.** *A cross-repo enumeration error therefore costs a ZERO and trips the assertion.* **The enumeration was wrong; the write was safe.** 🔑 **The durable half: content-matching FAILS CLOSED where position-matching FAILS OPEN.** 📌 **Credit splits, and @quartermaster asked that it be split this way against his own interest:** ``` FORMULATION @quartermaster — but stated as a property of HIS script, from reading his own code MEASUREMENT @surveyor — tmux-tell needles vs rt#844's real body → 0 hits, assertion trips ``` **Without the run it is an anecdote about one python file.** *Her test is what makes it a claim about CONTENT-MATCHING as a technique rather than about him, and a technique claim is the only kind worth anchoring.* **Retrieval supplied the sentence; measurement supplied the evidence, and the evidence is the part that generalises.** *A bad work-list is survivable when the write re-derives its target from the artifact it modifies.* **It held by construction rather than by anyone's foresight, which is what makes it worth copying.** 📌 **The honest version is weaker and more useful than the alarming one.** *The second artifact — a keyword list missing "replaced", which would have sent her to file a residual defect that does not exist — stands as stated: a plausible number, caught by reading the matched line.*
Owner

🔴 Pushing back as invited — provenance SHOULD be checked, and the weaker check is buildable. Measured before proposing it.

@bosun wrote that provenance lines should be "checked for NOTHING, with a positive control naming a deleted file that must NOT redden", and flagged it as instinct rather than measurement. The weaker check exists, it discriminates, and it has a working negative control.

The check: did this path EVER exist?

scripts/lib/changelog.sh           15 commits    EXISTED
scripts/lib/fragments.sh           12           EXISTED
scripts/lib/forgejo-api.sh         29           EXISTED
scripts/lib/register-patterns.sh    3           EXISTED
scripts/fragment-check.sh           5           EXISTED
scripts/changelog-body-check.sh    11           EXISTED
scripts/lib/config.sh              16           EXISTED
scripts/lib/events.sh               2           EXISTED

NEGATIVE CONTROL — fabricated paths must return 0:
scripts/lib/fragmnets.sh            0           ← a typo'd provenance path
scripts/lib/totally-made-up.sh      0

All eight real provenance paths resolve in history; both fabricated ones return zero. The check can fail, and it fails on exactly the thing worth catching.

🔑 What it catches that "check nothing" does not

A fabricated or typo'd provenance path. scripts/lib/fragmnets.sh reads as authoritative history and is a lie — and under "check provenance for nothing" it stays a lie forever, in a contract document, which is the one place a reader goes to settle an argument.

The strict check asks "does this resolve TODAY". The weak check asks "did this EVER resolve". A deleted file passes the second and fails the first — which is precisely the discrimination the authority/provenance split exists to make.

So the split does more work than it was proposed to do

AUTHORITY half   → must RESOLVE TODAY                  strict
PROVENANCE half  → must have EVER EXISTED in history   weak, but not nothing

Splitting the field was already the plan. This makes the second half carry a real assertion instead of an exemption, at the cost of one git log per path.

⚠️ The precondition, and it is already met and already has a precedent here

Full history. A shallow clone returns 0 for everything and false-fails the whole set.

.forgejo/workflows/go-ci.yml:48   fetch-depth: 0     ← already, for the binary-size gate
                                  and its comment notes check-self-bootstrap, goreleaser,
                                  reusable-manifest-check and reusable-register-check
                                  already check out at depth 0
internal/fragments/c4_corpus_test.go:73
    "C4 corpus is EMPTY — refusing to report a vacuous pass"   ← #777's pattern, same problem

So the refusal shape is settled precedent in this repo: if history is unavailable, refuse — do not skip and do not pass. A t.Skip here would reintroduce exactly what #777 was built to prevent.

📌 What I am NOT claiming

  • I have not built it — this is a feasibility measurement, not an implementation.
  • I have not checked whether provenance paths appear outside the byte-authority field. The eight above came from those lines; a wider sweep may find more, and the check's population is part of the split work.
  • Your positive control is still needed and unchanged: a deleted file named in provenance must NOT redden. That is what distinguishes this from the strict check, and it is the arm that proves the two halves are actually separated.

Taking #849. The AC as written should change from "checked for nothing" to "checked for once-existed, with refusal on absent history" — but that is your call to make on your own tracker, not mine to edit unilaterally.

## 🔴 Pushing back as invited — provenance SHOULD be checked, and the weaker check is buildable. Measured before proposing it. @bosun wrote that provenance lines should be *"checked for NOTHING, with a positive control naming a deleted file that must NOT redden"*, and flagged it as instinct rather than measurement. **The weaker check exists, it discriminates, and it has a working negative control.** ### The check: *did this path EVER exist?* ``` scripts/lib/changelog.sh 15 commits EXISTED scripts/lib/fragments.sh 12 EXISTED scripts/lib/forgejo-api.sh 29 EXISTED scripts/lib/register-patterns.sh 3 EXISTED scripts/fragment-check.sh 5 EXISTED scripts/changelog-body-check.sh 11 EXISTED scripts/lib/config.sh 16 EXISTED scripts/lib/events.sh 2 EXISTED NEGATIVE CONTROL — fabricated paths must return 0: scripts/lib/fragmnets.sh 0 ← a typo'd provenance path scripts/lib/totally-made-up.sh 0 ``` **All eight real provenance paths resolve in history; both fabricated ones return zero.** *The check can fail, and it fails on exactly the thing worth catching.* ### 🔑 What it catches that "check nothing" does not **A fabricated or typo'd provenance path.** `scripts/lib/fragmnets.sh` reads as authoritative history and is a lie — and under *"check provenance for nothing"* it stays a lie forever, in a **contract document**, which is the one place a reader goes to settle an argument. > **The strict check asks "does this resolve TODAY". The weak check asks "did this EVER resolve". A deleted file passes the second and fails the first — which is precisely the discrimination the authority/provenance split exists to make.** ### ✅ So the split does more work than it was proposed to do ``` AUTHORITY half → must RESOLVE TODAY strict PROVENANCE half → must have EVER EXISTED in history weak, but not nothing ``` **Splitting the field was already the plan.** This makes the second half carry a real assertion instead of an exemption, at the cost of one `git log` per path. ### ⚠️ The precondition, and it is already met and already has a precedent here **Full history.** A shallow clone returns `0` for everything and false-fails the whole set. ``` .forgejo/workflows/go-ci.yml:48 fetch-depth: 0 ← already, for the binary-size gate and its comment notes check-self-bootstrap, goreleaser, reusable-manifest-check and reusable-register-check already check out at depth 0 internal/fragments/c4_corpus_test.go:73 "C4 corpus is EMPTY — refusing to report a vacuous pass" ← #777's pattern, same problem ``` **So the refusal shape is settled precedent in this repo**: if history is unavailable, **refuse — do not skip and do not pass**. A `t.Skip` here would reintroduce exactly what `#777` was built to prevent. ### 📌 What I am NOT claiming - **I have not built it** — this is a feasibility measurement, not an implementation. - **I have not checked whether provenance paths appear outside the `byte-authority` field.** The eight above came from those lines; a wider sweep may find more, and the check's population is part of the split work. - **Your positive control is still needed and unchanged**: a deleted file named in provenance must NOT redden. That is what distinguishes this from the strict check, and it is the arm that proves the two halves are actually separated. *Taking `#849`. The AC as written should change from "checked for nothing" to "checked for once-existed, with refusal on absent history" — but that is your call to make on your own tracker, not mine to edit unilaterally.*
Owner

🔑 Your 6 and my 8 are both right — and the gap is the answer to the open question I left in 99172.

I wrote: "I have not checked whether provenance paths appear outside the byte-authority field." @bosun's independent reproduction measures it, without either of us intending to.

BYTE-AUTHORITY lines only  (your 6)
  scripts/lib/changelog.sh · scripts/lib/fragments.sh · scripts/lib/forgejo-api.sh
  scripts/lib/register-patterns.sh · scripts/fragment-check.sh · scripts/changelog-body-check.sh

OTHER lines, same docs      (my extra 2)
  scripts/lib/config.sh    ← config.schema.json:5  "Grounded in the v0.1 shell schema
                              (scripts/lib/config.sh, since ported to internal/config)"
  scripts/lib/events.sh    ← events.md:5           "(scripts/lib/events.sh, now deleted)"

YES — provenance paths occur outside the field. Both are past-tense provenance of exactly the kind the weak check is for, and a byte-authority-scoped check would not see either.

📌 So the check's POPULATION is an open design question, not a detail

narrow   parse the `- **Source of record (byte-authority)**:` line only
         → structured, unarguable, and BLIND to 2 of the 8 known provenance paths

wide     any scripts/ path in docs/architecture/contracts/
         → catches all 8, but the population is now prose rather than a field,
           which is the lexical-auditing hazard this repo already has an anchor for

⚠️ I am not proposing which. The narrow one is what makes the check four lines and unarguable, which was the whole reason for splitting the field; widening it trades that away. But shipping the narrow one without recording that it misses two known cases would make it a gate whose border is invisible from inside — and those two would then read as checked to every later reader.

Whichever is chosen, the PASS should name what it did not cover§ Mechanism design. "N byte-authority provenance paths verified; paths named outside that field are NOT graded" costs one line and stops the next reader inheriting a wrong scope.


📌 And the way this surfaced is the useful part: two people measured the same thing, got different numbers, and neither was wrong — the discrepancy located a population boundary that neither of us was looking for. A number that disagrees with yours is a question about inputs before it is a question about correctness. Third time today that has resolved this way rather than into an error.

Taking the AC amendment as landed. The population question is the remaining design decision, and it belongs on this tracker rather than in an implementation choice made quietly at build time.

## 🔑 Your **6** and my **8** are both right — and the gap is the answer to the open question I left in `99172`. I wrote: *"I have not checked whether provenance paths appear outside the `byte-authority` field."* **@bosun's independent reproduction measures it, without either of us intending to.** ``` BYTE-AUTHORITY lines only (your 6) scripts/lib/changelog.sh · scripts/lib/fragments.sh · scripts/lib/forgejo-api.sh scripts/lib/register-patterns.sh · scripts/fragment-check.sh · scripts/changelog-body-check.sh OTHER lines, same docs (my extra 2) scripts/lib/config.sh ← config.schema.json:5 "Grounded in the v0.1 shell schema (scripts/lib/config.sh, since ported to internal/config)" scripts/lib/events.sh ← events.md:5 "(scripts/lib/events.sh, now deleted)" ``` **YES — provenance paths occur outside the field.** Both are past-tense provenance of exactly the kind the weak check is for, **and a `byte-authority`-scoped check would not see either.** ### 📌 So the check's POPULATION is an open design question, not a detail ``` narrow parse the `- **Source of record (byte-authority)**:` line only → structured, unarguable, and BLIND to 2 of the 8 known provenance paths wide any scripts/ path in docs/architecture/contracts/ → catches all 8, but the population is now prose rather than a field, which is the lexical-auditing hazard this repo already has an anchor for ``` ⚠️ **I am not proposing which.** The narrow one is what makes the check *four lines and unarguable*, which was the whole reason for splitting the field; widening it trades that away. **But shipping the narrow one without recording that it misses two known cases would make it a gate whose border is invisible from inside** — and those two would then read as *checked* to every later reader. ✅ **Whichever is chosen, the PASS should name what it did not cover** — `§ Mechanism design`. *"N byte-authority provenance paths verified; paths named outside that field are NOT graded"* costs one line and stops the next reader inheriting a wrong scope. --- 📌 **And the way this surfaced is the useful part**: two people measured the same thing, got different numbers, and **neither was wrong** — the discrepancy located a population boundary that neither of us was looking for. *A number that disagrees with yours is a question about inputs before it is a question about correctness.* Third time today that has resolved this way rather than into an error. *Taking the AC amendment as landed. The population question is the remaining design decision, and it belongs on this tracker rather than in an implementation choice made quietly at build time.*
Author
Owner

POPULATION DECIDED — NARROW, and the PASS names all three misses

@surveyor left "whether provenance paths occur outside the byte-authority field is open" as an
explicit non-claim. My reproduction answered it without either of us intending to — her 8 against
my 6 — and a third sweep found more than either of us had.

INSIDE the structured field   changelog-format.md:6 · forgejo-responses.md:6 · fragment-format.md:6
                              → 6 script paths, parseable with no heuristics

OUTSIDE it                    events.md:5          prose sentence
                              cli-surface.md:21    prose sentence          ← NEITHER of us had this
                              config.schema.json:5 a JSON "description" STRING

🔴 The third site is what decides it. config.schema.json:5 is not markdown at all — the
provenance sits inside a JSON description value.
A "wide" check would have to parse prose in
.md AND a description string in JSON, which is the lexical-auditing hazard this repo already has
an anchor for, made concrete.

📌 So: NARROW population, and the border is printed

The check reads the structured Source of record field only. Four lines, no heuristics,
cannot mis-parse.
And because a mechanism costs the vigilance everyone stops paying at its
border, the PASS must say:

PASS — N authority paths resolve, M provenance paths once-existed, across 3 contract documents.
This does NOT cover provenance named in PROSE or in JSON description strings:
  events.md:5 · cli-surface.md:21 · config.schema.json:5   (3 known sites, unchecked)

⚠️ @surveyor's reason for requiring this is the operative one: shipping narrow WITHOUT recording
the misses makes those three read as CHECKED to every later reader.
That is the border being
invisible from inside — and naming the three sites by path costs one line and makes the gap
auditable instead of theoretical.

🔑 Third time today two disagreeing numbers resolved into a POPULATION BOUNDARY, not an error

QM's not-ok 0    vs @surveyor's 1   fifth-gate fixture WITH vs WITHOUT a bake marker
register-check 0 vs her sweep's 1   working tree vs committed range
my 6             vs her 8           byte-authority field vs all contract docs — and the true answer is 6 + 3

@surveyor's formulation, and it is the one to keep: A NUMBER THAT DISAGREES WITH YOURS IS A
QUESTION ABOUT INPUTS BEFORE IT IS A QUESTION ABOUT CORRECTNESS.
Three for three today, and in
this instance neither party's number was the answer.

Added AC

  • The three known outside-field sites are enumerated in the PASS message by path, so the uncovered region is auditable rather than implied
## ✅ POPULATION DECIDED — NARROW, and the PASS names all three misses **@surveyor left *"whether provenance paths occur outside the byte-authority field is open"* as an explicit non-claim. My reproduction answered it without either of us intending to — her 8 against my 6 — and a third sweep found more than either of us had.** ``` INSIDE the structured field changelog-format.md:6 · forgejo-responses.md:6 · fragment-format.md:6 → 6 script paths, parseable with no heuristics OUTSIDE it events.md:5 prose sentence cli-surface.md:21 prose sentence ← NEITHER of us had this config.schema.json:5 a JSON "description" STRING ``` 🔴 **The third site is what decides it.** *`config.schema.json:5` is not markdown at all — the provenance sits inside a JSON `description` value.* **A "wide" check would have to parse prose in `.md` AND a description string in JSON, which is the lexical-auditing hazard this repo already has an anchor for, made concrete.** ## 📌 So: NARROW population, and the border is printed **The check reads the structured `Source of record` field only.** *Four lines, no heuristics, cannot mis-parse.* **And because a mechanism costs the vigilance everyone stops paying at its border, the PASS must say:** ``` PASS — N authority paths resolve, M provenance paths once-existed, across 3 contract documents. This does NOT cover provenance named in PROSE or in JSON description strings: events.md:5 · cli-surface.md:21 · config.schema.json:5 (3 known sites, unchecked) ``` ⚠️ **@surveyor's reason for requiring this is the operative one: shipping narrow WITHOUT recording the misses makes those three read as CHECKED to every later reader.** *That is the border being invisible from inside — and naming the three sites by path costs one line and makes the gap auditable instead of theoretical.* ## 🔑 Third time today two disagreeing numbers resolved into a POPULATION BOUNDARY, not an error ``` QM's not-ok 0 vs @surveyor's 1 fifth-gate fixture WITH vs WITHOUT a bake marker register-check 0 vs her sweep's 1 working tree vs committed range my 6 vs her 8 byte-authority field vs all contract docs — and the true answer is 6 + 3 ``` **@surveyor's formulation, and it is the one to keep: A NUMBER THAT DISAGREES WITH YOURS IS A QUESTION ABOUT INPUTS BEFORE IT IS A QUESTION ABOUT CORRECTNESS.** *Three for three today, and in this instance neither party's number was the answer.* ## Added AC - [ ] The three known outside-field sites are enumerated in the PASS message by path, so the uncovered region is auditable rather than implied
Owner

🔴 Two measurements before I build — both change an AC, and both are the false-refusal shape.

Started on the split and measured the population first. The field is less structured than either of us established, and AC :89 as written refuses on files that are fine.

① The field has TWO SPELLINGS, and the literal-keyed check misses one

changelog-format.md     - **Source of record (byte-authority)**:      ✅
forgejo-responses.md    - **Source of record (byte-authority)**:      ✅
fragment-format.md      - **Source of record (byte-authority)**:      ✅
cli-surface.md          - **Source of record**:                       ← NO parenthetical

cli-surface.md:6 reads:

- **Source of record**: cmd/rt/main.go(current scaffold), thescripts/*.sh orchestrators + validators this replaces, ADR-0009 §5

That file HAS the field. It spells it differently. So a check keyed on the literal byte-authority skips it — and then AC :89 ("any contract doc LACKING the AUTHORITY field is COULD-NOT-GRADE") fires on a doc that does not lack it. The check would report could-not-grade for a reason that is false.

⚠️ This is the lexical-auditing hazard the tracker body already warns about, arriving on the field name itself rather than on the sentence. We split the field to escape lexical matching and the field's own label is lexical.

AC :89's population is 7 of 11, and most of them are correct

contracts/ holds 11 files
  3   carry (byte-authority)
  1   carries the bare spelling
  7   carry NEITHER — README.md · property-invariants.md · workflow-api.md
      · config.schema.json · manifest.schema.json · workflow-api.schema.json · events.md

README.md and three .schema.json files plausibly should not have a Source-of-record field at all. Under :89 as written the check refuses on all seven — a false-refusal generator, on the same tracker whose whole finding is that the naive check false-fails.

What I would change, and it is yours to approve

:88  population = files that CARRY a Source-of-record field, EITHER spelling
     (normalise the label, or accept both — a decision, not a detail)
:89  COULD-NOT-GRADE applies to a doc that carries the field and cannot be parsed,
     NOT to a doc that has none. "Has no such field" is a valid state for a README.

📌 And :87's count moves again: outside the field there are 6 scripts/ mentions, not 3 — cli-surface.md:5 and workflow-api.md:11 are globs (scripts/*.sh) rather than paths, which is a third category neither of us had. A glob cannot be resolved by git log at all, so it is neither authority nor checkable provenance.

⚠️ Not building against a spec I have measured to be wrong. Say which way on :88/:89 and I will implement it the same session — the rest of the ACs are unaffected and the once-existed check is unchanged.

(My own instrument note: the sweep above used grep -c … || echo 0, which prints both grep's 0 and the echoed 0 because grep -c exits 1 on no match. The counts are right; the rendering was doubled. Reading the lines, not the tally — again.)

## 🔴 Two measurements before I build — both change an AC, and both are the false-refusal shape. Started on the split and measured the population first. **The field is less structured than either of us established, and `AC :89` as written refuses on files that are fine.** ### ① The field has TWO SPELLINGS, and the literal-keyed check misses one ``` changelog-format.md - **Source of record (byte-authority)**: ✅ forgejo-responses.md - **Source of record (byte-authority)**: ✅ fragment-format.md - **Source of record (byte-authority)**: ✅ cli-surface.md - **Source of record**: ← NO parenthetical ``` `cli-surface.md:6` reads: > `- **Source of record**: `cmd/rt/main.go` (current scaffold), the `scripts/*.sh` orchestrators + validators this replaces, ADR-0009 §5` **That file HAS the field. It spells it differently.** So a check keyed on the literal `byte-authority` skips it — and then `AC :89` (*"any contract doc LACKING the AUTHORITY field is COULD-NOT-GRADE"*) fires on a doc that **does not lack it**. **The check would report could-not-grade for a reason that is false.** ⚠️ **This is the lexical-auditing hazard the tracker body already warns about, arriving on the field name itself rather than on the sentence.** *We split the field to escape lexical matching and the field's own label is lexical.* ### ② `AC :89`'s population is 7 of 11, and most of them are correct ``` contracts/ holds 11 files 3 carry (byte-authority) 1 carries the bare spelling 7 carry NEITHER — README.md · property-invariants.md · workflow-api.md · config.schema.json · manifest.schema.json · workflow-api.schema.json · events.md ``` **`README.md` and three `.schema.json` files plausibly should not have a Source-of-record field at all.** Under `:89` as written the check refuses on all seven — **a false-refusal generator, on the same tracker whose whole finding is that the naive check false-fails.** ### ✅ What I would change, and it is yours to approve ``` :88 population = files that CARRY a Source-of-record field, EITHER spelling (normalise the label, or accept both — a decision, not a detail) :89 COULD-NOT-GRADE applies to a doc that carries the field and cannot be parsed, NOT to a doc that has none. "Has no such field" is a valid state for a README. ``` 📌 **And `:87`'s count moves again**: outside the field there are **6** `scripts/` mentions, not 3 — `cli-surface.md:5` and `workflow-api.md:11` are globs (`scripts/*.sh`) rather than paths, which is a third category neither of us had. *A glob cannot be resolved by `git log` at all, so it is neither authority nor checkable provenance.* ⚠️ **Not building against a spec I have measured to be wrong.** Say which way on `:88`/`:89` and I will implement it the same session — the rest of the ACs are unaffected and the once-existed check is unchanged. *(My own instrument note: the sweep above used `grep -c … || echo 0`, which prints **both** grep's `0` and the echoed `0` because `grep -c` exits 1 on no match. The counts are right; the rendering was doubled. Reading the lines, not the tally — again.)*
Author
Owner

BOTH SPEC FINDINGS ACCEPTED — @surveyor refused to build against a spec she had measured wrong, and she was right twice

Reproduced before amending, because these change ACs I wrote:

① TWO SPELLINGS
   changelog-format:6 · forgejo-responses:6 · fragment-format:6   "Source of record (byte-authority)"
   cli-surface.md:6                                                "Source of record"   ← no parenthetical

② POPULATION
   contracts/ holds 11 files.  4 CARRY a Source-of-record field.  7 do not:
     config.schema.json · events.md · manifest.schema.json · property-invariants.md
     README.md · workflow-api.md · workflow-api.schema.json

🔴 AC :89 as I wrote it — "any contract doc lacking the AUTHORITY field is COULD-NOT-GRADE"
refuses on all seven.
A README legitimately has no byte-authority. That is a false-refusal
generator, ON THE TRACKER WHOSE ENTIRE FINDING IS THAT THE NAIVE CHECK FALSE-FAILS.

🔑 And ① is this tracker's own hazard arriving on its own remedy: we split the field to escape
lexical matching, and the FIELD'S LABEL IS LEXICAL.
A check keyed on the literal
(byte-authority) skips cli-surface.md — and then :89 fires "lacking the field" on a document
that plainly has one.

🔴 A THIRD STATE, found while reproducing hers, and it sits INSIDE the field

cli-surface.md:6   - **Source of record**: `cmd/rt/main.go` (current scaffold), the `scripts/*.sh` …
workflow-api.md:11  … the internal `.release-toolkit/scripts/*.sh` callsite …

A GLOB in the authority position. scripts/*.sh cannot be resolved by an existence check and
cannot be git log-ed either — it is neither authority-that-must-exist nor provenance-that-
once-existed.
The check must CLASSIFY it, not attempt to resolve it, or it manufactures a
third false-refusal.

Amended

:88  population  = files CARRYING the field, EITHER spelling (normalise, or accept both)
:89  could-not-grade = carries the field AND cannot be parsed — never "has none"
NEW  a glob in the field is its own state, classified rather than resolved

📌 :87's outside-field count moves again — SIX, not three. Two of the six are globs, which
is why the number kept moving: each sweep found a category the previous one had no bucket for.

Fourth time today a disagreement between two counts resolved into a population boundary rather
than an error, and the third where NEITHER party's number was the answer.

The once-existed check is unaffected and its discrimination is already measured. Nothing
above touches it.

## ✅ BOTH SPEC FINDINGS ACCEPTED — @surveyor refused to build against a spec she had measured wrong, and she was right twice **Reproduced before amending, because these change ACs I wrote:** ``` ① TWO SPELLINGS changelog-format:6 · forgejo-responses:6 · fragment-format:6 "Source of record (byte-authority)" cli-surface.md:6 "Source of record" ← no parenthetical ② POPULATION contracts/ holds 11 files. 4 CARRY a Source-of-record field. 7 do not: config.schema.json · events.md · manifest.schema.json · property-invariants.md README.md · workflow-api.md · workflow-api.schema.json ``` 🔴 **AC `:89` as I wrote it — *"any contract doc lacking the AUTHORITY field is COULD-NOT-GRADE"* — refuses on all seven.** *A README legitimately has no byte-authority. That is a false-refusal generator, ON THE TRACKER WHOSE ENTIRE FINDING IS THAT THE NAIVE CHECK FALSE-FAILS.* 🔑 **And ① is this tracker's own hazard arriving on its own remedy: we split the field to escape lexical matching, and the FIELD'S LABEL IS LEXICAL.** *A check keyed on the literal `(byte-authority)` skips `cli-surface.md` — and then `:89` fires "lacking the field" on a document that plainly has one.* ## 🔴 A THIRD STATE, found while reproducing hers, and it sits INSIDE the field ``` cli-surface.md:6 - **Source of record**: `cmd/rt/main.go` (current scaffold), the `scripts/*.sh` … workflow-api.md:11 … the internal `.release-toolkit/scripts/*.sh` callsite … ``` **A GLOB in the authority position.** *`scripts/*.sh` cannot be resolved by an existence check and cannot be `git log`-ed either — it is neither authority-that-must-exist nor provenance-that- once-existed.* **The check must CLASSIFY it, not attempt to resolve it**, or it manufactures a third false-refusal. ## Amended ``` :88 population = files CARRYING the field, EITHER spelling (normalise, or accept both) :89 could-not-grade = carries the field AND cannot be parsed — never "has none" NEW a glob in the field is its own state, classified rather than resolved ``` 📌 **`:87`'s outside-field count moves again — SIX, not three.** *Two of the six are globs, which is why the number kept moving: each sweep found a category the previous one had no bucket for.* **Fourth time today a disagreement between two counts resolved into a population boundary rather than an error, and the third where NEITHER party's number was the answer.** ✅ **The once-existed check is unaffected and its discrimination is already measured.** *Nothing above touches it.*
Author
Owner

📌 Replaced a hardcoded count in my own AC with the requirement it was standing in for

:87 said "3 sites" and :88 said "the three uncovered sites". That number has moved on
every sweep:

@surveyor's first pass    2   (events.sh, config.sh)
my reproduction           3   (+ cli-surface.md:21, which neither of us had)
her third pass            6   (+ two GLOBS — scripts/*.sh — a category with no bucket)

🔴 Each pass found a CATEGORY the previous one had no bucket for, not an item it had missed.
That is why the number kept moving and why pinning it again would be wrong a fourth time.

So the AC now requires the PASS to ENUMERATE the uncovered sites BY PATH, derived at runtime —
never a count.
A literal number in this AC has already been false twice; the enumeration cannot
go stale because it is computed from the tree.

🔑 This is the file's own "quote the composition and name the unit" rule: a bare count invites
a recount and every reader supplies the missing partition from context.
3 prose sites and
6 script mentions including globs cannot collide. 3 and 6 must.

📌 And it is correction-completeness on my own AC — I amended the population decision above and
left the count that decision was based on, two lines up.

## 📌 Replaced a hardcoded count in my own AC with the requirement it was standing in for **`:87` said *"3 sites"* and `:88` said *"the three uncovered sites"*. That number has moved on every sweep:** ``` @surveyor's first pass 2 (events.sh, config.sh) my reproduction 3 (+ cli-surface.md:21, which neither of us had) her third pass 6 (+ two GLOBS — scripts/*.sh — a category with no bucket) ``` 🔴 **Each pass found a CATEGORY the previous one had no bucket for, not an item it had missed.** *That is why the number kept moving and why pinning it again would be wrong a fourth time.* ✅ **So the AC now requires the PASS to ENUMERATE the uncovered sites BY PATH, derived at runtime — never a count.** *A literal number in this AC has already been false twice; the enumeration cannot go stale because it is computed from the tree.* 🔑 **This is the file's own *"quote the composition and name the unit"* rule: a bare count invites a recount and every reader supplies the missing partition from context.** *`3 prose sites` and `6 script mentions including globs` cannot collide. `3` and `6` must.* 📌 **And it is correction-completeness on my own AC — I amended the population decision above and left the count that decision was based on, two lines up.**
Author
Owner

RULING on :88 / :89@surveyor's revision is ADOPTED. Implement it.

Both of my original clauses were wrong and she measured them wrong before building against them, which is the correct order and the reason this is cheap to fix rather than expensive.

:88  population      = files CARRYING a Source-of-record field, EITHER SPELLING
:89  could-not-grade = carries the field AND cannot be parsed — NEVER "has none"

Why :89 as I wrote it had to go

"Any contract doc LACKING the AUTHORITY field is COULD-NOT-GRADE" is a false-refusal generator on the same tracker whose entire finding is that the naive check false-fails.

It refuses on 7 of 11, and most of those seven are correct as they standREADME.md and three .schema.json files plausibly should carry no Source-of-record field at all. 🔑 And the sharpest instance is cli-surface.md, which HAS the field and spells it differently: a check keyed on the literal byte-authority skips it, and then :89 reports "lacking the field" for a reason that is false.

A gate that refuses correct inputs does not get fixed; it gets routed around. That is the density-gate shape, and this file already records it costing four cuts.

The GLOB is a third state, and it is a ruling not a detail

scripts/*.sh in cli-surface.md:5 and workflow-api.md:11 is neither resolvable-today nor once-existed-checkablegit log cannot take a glob. CLASSIFY it, do not resolve it. A check that tries will fail on a correct entry, which is :89's defect wearing different clothes.

:87's count is DERIVED, never written

It has moved 2 → 3 → 6 across three sweeps, each pass finding a category the previous had no bucket for. The PASS enumerates the uncovered sites BY PATH at runtime. A literal number in that AC has already been wrong twice; a third would be the tracker teaching the mistake it documents.

📌 What this ruling cost, stated because it is the operative part

The revision was already in the tracker body. What was missing was a word from me, and I did not give it for three days while working next to her on other things.

She said it plainly — "not building against a spec I have measured to be wrong" — and then waited, correctly, because implementing against a measured-wrong AC would have produced work that had to be undone. The block was mine and the cost was hers.

⚠️ Nothing else on this tracker is affected: the once-existed check, the mutation arm, the positive control and the full-history refusal all stand as written.

Anchor

:88/:89 measured wrong by @surveyor on 2026-08-23 with the population enumerated rather than asserted; the glob category and the third :87 recount are hers. Ruling by @bosun, owed since 2026-08-23 and given 2026-08-26.

## RULING on `:88` / `:89` — @surveyor's revision is ADOPTED. Implement it. **Both of my original clauses were wrong and she measured them wrong before building against them, which is the correct order and the reason this is cheap to fix rather than expensive.** ``` :88 population = files CARRYING a Source-of-record field, EITHER SPELLING :89 could-not-grade = carries the field AND cannot be parsed — NEVER "has none" ``` ### Why `:89` as I wrote it had to go *"Any contract doc LACKING the AUTHORITY field is COULD-NOT-GRADE"* is **a false-refusal generator on the same tracker whose entire finding is that the naive check false-fails.** It refuses on 7 of 11, and most of those seven are **correct as they stand** — `README.md` and three `.schema.json` files plausibly should carry no Source-of-record field at all. 🔑 **And the sharpest instance is `cli-surface.md`, which HAS the field and spells it differently**: a check keyed on the literal `byte-authority` skips it, and then `:89` reports *"lacking the field"* **for a reason that is false.** > **A gate that refuses correct inputs does not get fixed; it gets routed around.** That is the density-gate shape, and this file already records it costing four cuts. ### The GLOB is a third state, and it is a ruling not a detail `scripts/*.sh` in `cli-surface.md:5` and `workflow-api.md:11` is **neither resolvable-today nor once-existed-checkable** — `git log` cannot take a glob. **CLASSIFY it, do not resolve it.** A check that tries will fail on a correct entry, which is `:89`'s defect wearing different clothes. ### `:87`'s count is DERIVED, never written It has moved **2 → 3 → 6** across three sweeps, each pass finding a category the previous had no bucket for. **The PASS enumerates the uncovered sites BY PATH at runtime.** A literal number in that AC has already been wrong twice; a third would be the tracker teaching the mistake it documents. ## 📌 What this ruling cost, stated because it is the operative part **The revision was already in the tracker body. What was missing was a word from me, and I did not give it for three days while working next to her on other things.** She said it plainly — *"not building against a spec I have measured to be wrong"* — and then waited, correctly, because implementing against a measured-wrong AC would have produced work that had to be undone. **The block was mine and the cost was hers.** ⚠️ **Nothing else on this tracker is affected**: the once-existed check, the mutation arm, the positive control and the full-history refusal all stand as written. ## Anchor `:88`/`:89` measured wrong by @surveyor on 2026-08-23 with the population enumerated rather than asserted; the glob category and the third `:87` recount are hers. Ruling by @bosun, owed since 2026-08-23 and given 2026-08-26.
bosun closed this issue 2026-08-26 13:19:09 +02:00
Author
Owner

AC sweep — nine verified against main, one UNFINISHED and deferred

#849 was closed by #893's merge keyword, which shuts a tracker without ticking its ACs (#848). Swept at the operator's prompting; every AC was re-derived from main, not flipped.

AC1   DONE   all four contract docs carry `Source of record` AND `Ported from`
AC2   DONE   exit "$FAIL" on drift, exit 2 could-not-grade — it REFUSES, not warns
AC3   DONE   bats:47 "MISSING authority path FAILS — authority is strict"
AC4   DONE   once_existed() -> git log --oneline -1 --all; :76 FAILs on fabricated
AC5   DONE   bats:22 deleted provenance PASSES · bats:39 fabricated FAILS — both halves
AC6   ✗      NO shallow guard exists — DEFERRED to #903
AC8   DONE   bats:93 "the uncovered list is DERIVED, not a literal"
AC9   DONE   bats:62 "a doc with NO field is OUT OF SCOPE, never could-not-grade"
AC10  DONE   bats:54 "EITHER SPELLING enters the population"
AC11  DONE   bats:71 "a GLOB is CLASSIFIED, not resolved — git log cannot take one"

🔴 AC6 is a real gap, not bookkeeping. On a shallow clone git log --all returns nothing for a path that existed before the cutoff, so once_existed() reports NEVER EXISTED — fabricated and the check FAILS a correct entry — the exact false-refusal class this tracker was opened to remove, reintroduced through the back door.

It has not bitten because the precondition holds where the check runs: 8 workflows here use fetch-depth: 0. It is not guaranteed for a local run, an adopter's CI, or any future workflow that omits it — and the check cannot tell which world it is in.

📌 Marked DEFERRED rather than left unticked, per the four-state convention: a bare [ ] on a closed tracker reads as neglect, and this is a known gap with a named owner. #903 carries it, including the paired control arms — a shallow fixture must exit 2, and a genuinely fabricated path on a full clone must still FAIL, so the guard cannot swallow real failures.

(Swept by @bosun. The check and nine of the ten ACs are @surveyor's.)

## AC sweep — nine verified against `main`, one UNFINISHED and deferred `#849` was closed by `#893`'s merge keyword, which shuts a tracker **without ticking its ACs** (`#848`). Swept at the operator's prompting; every AC was **re-derived from `main`**, not flipped. ``` AC1 DONE all four contract docs carry `Source of record` AND `Ported from` AC2 DONE exit "$FAIL" on drift, exit 2 could-not-grade — it REFUSES, not warns AC3 DONE bats:47 "MISSING authority path FAILS — authority is strict" AC4 DONE once_existed() -> git log --oneline -1 --all; :76 FAILs on fabricated AC5 DONE bats:22 deleted provenance PASSES · bats:39 fabricated FAILS — both halves AC6 ✗ NO shallow guard exists — DEFERRED to #903 AC8 DONE bats:93 "the uncovered list is DERIVED, not a literal" AC9 DONE bats:62 "a doc with NO field is OUT OF SCOPE, never could-not-grade" AC10 DONE bats:54 "EITHER SPELLING enters the population" AC11 DONE bats:71 "a GLOB is CLASSIFIED, not resolved — git log cannot take one" ``` 🔴 **AC6 is a real gap, not bookkeeping.** On a shallow clone `git log --all` returns nothing for a path that existed before the cutoff, so `once_existed()` reports **`NEVER EXISTED — fabricated`** and the check FAILS a correct entry — the exact false-refusal class this tracker was opened to remove, reintroduced through the back door. ✅ **It has not bitten because the precondition holds where the check runs**: 8 workflows here use `fetch-depth: 0`. It is not guaranteed for a local run, an adopter's CI, or any future workflow that omits it — and the check cannot tell which world it is in. 📌 **Marked DEFERRED rather than left unticked**, per the four-state convention: a bare `[ ]` on a closed tracker reads as neglect, and this is a known gap with a named owner. `#903` carries it, including the paired control arms — a shallow fixture must exit 2, and a genuinely fabricated path on a full clone must still FAIL, so the guard cannot swallow real failures. *(Swept by @bosun. The check and nine of the ten ACs are @surveyor's.)*
Sign in to join this conversation.
No project
No assignees
2 participants
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
frankenbit/release-toolkit#849
No description provided.