Reading taken 2026-09-18T14:59Z on origin/main@221dabb72; every grep below is git grep <PAT> origin/main -- <paths>, not the shared working tree.
Defect
packages/spec/scripts/liveness/check-liveness.mts classifies a schema property from two sources: the ledger row's status, and — for a property with no row — a MARKER read out of its description by markerStatus(). That function knows exactly two markers:
:468 experimental: /\[experimental|not enforced|aspirational/i,
:469 planned: /\[planned|not yet implemented|coming soon/i,
There is no third arm, and no liveness script reads [REMOVED] at all. So the two removal routes are governed asymmetrically:
- strict removal (the key leaves the walked shape) —
orphans.mts fails the build on the ledger row left behind.
retiredKey() tombstone (the key stays in the shape as z.never()) — orphans.mts's own guidance requires the row to stay: "a retiredKey() tombstone KEEPS the key in the walked shape, so a tombstoned key's row must STAY — deleting it reports UNCLASSIFIED instead" (orphans.mts, ORPHAN_GUIDANCE). And nothing constrains what that row's status says. A tombstoned key may be graded live, carrying live evidence, indefinitely, with CI green.
That is a mechanism, not a hypothesis. #18304 is one measured instance of it: agent.tools was tombstoned in the spec and its only reader deleted in cloud, while agent.json graded the row live for three months and no gate objected.
Measurement
Instrument: git grep over origin/main@221dabb72; unit = occurrences.
| reading |
value |
[REMOVED] read by any script under packages/spec/scripts/liveness/ |
0 |
lit control, same instrument, same corpus: \[planned / \[experimental |
2 — both in MARKER_RE (:468, :469) |
lit control that the marker is real: [REMOVED] in packages/spec/src/**/*.ts |
15 |
retiredKey identifier anywhere in the liveness family |
2, both prose in orphans.mts — no import, no join |
lit control on that: files importing retired-key under packages/spec/src + packages/spec/scripts |
103 |
The tombstone mechanism is pervasive (103 importers). The one place that grades a key's liveness is the place that does not read it.
What would have made these numbers different
A single arm in MARKER_RE for the tombstone marker, or any import of retired-key from the liveness family, would have shown up in the first two rows. The lit controls rule out a dead grep in both directions — the corpus answers when a marker is read, and the marker exists to be found.
Evidence limit
Grep only, on one ref. What this does not establish: how many ledger rows are in the defective state right now. #18304 is one confirmed instance; the population is unmeasured, and measuring it is the first piece of the work — it needs exactly the join the gate lacks (walk the retiredKey() tombstones, ask each one's ledger row for its status). Do not read "0 readings of [REMOVED]" as a count of affected rows.
Dedup words
liveness tombstone status, retiredKey ledger dead, markerStatus REMOVED
Provenance
Out-of-scope finding from the os-dev report on #18304 (PR #19059), re-measured independently by the domain:spec#3 execution seat before filing; the controls and the origin/main anchoring are the seat's. Filed bare per the finding contract — grading, type and routing are the triage seat's production, not this seat's.
Generated by Claude Code
Reading taken 2026-09-18T14:59Z on
origin/main@221dabb72; every grep below isgit grep <PAT> origin/main -- <paths>, not the shared working tree.Defect
packages/spec/scripts/liveness/check-liveness.mtsclassifies a schema property from two sources: the ledger row'sstatus, and — for a property with no row — a MARKER read out of its description bymarkerStatus(). That function knows exactly two markers:There is no third arm, and no liveness script reads
[REMOVED]at all. So the two removal routes are governed asymmetrically:orphans.mtsfails the build on the ledger row left behind.retiredKey()tombstone (the key stays in the shape asz.never()) —orphans.mts's own guidance requires the row to stay: "aretiredKey()tombstone KEEPS the key in the walked shape, so a tombstoned key's row must STAY — deleting it reports UNCLASSIFIED instead" (orphans.mts,ORPHAN_GUIDANCE). And nothing constrains what that row'sstatussays. A tombstoned key may be gradedlive, carryingliveevidence, indefinitely, with CI green.That is a mechanism, not a hypothesis. #18304 is one measured instance of it:
agent.toolswas tombstoned in the spec and its only reader deleted in cloud, whileagent.jsongraded the rowlivefor three months and no gate objected.Measurement
Instrument:
git grepoverorigin/main@221dabb72; unit = occurrences.[REMOVED]read by any script underpackages/spec/scripts/liveness/\[planned/\[experimentalMARKER_RE(:468,:469)[REMOVED]inpackages/spec/src/**/*.tsretiredKeyidentifier anywhere in the liveness familyorphans.mts— no import, no joinretired-keyunderpackages/spec/src+packages/spec/scriptsThe tombstone mechanism is pervasive (103 importers). The one place that grades a key's liveness is the place that does not read it.
What would have made these numbers different
A single arm in
MARKER_REfor the tombstone marker, or any import ofretired-keyfrom the liveness family, would have shown up in the first two rows. The lit controls rule out a dead grep in both directions — the corpus answers when a marker is read, and the marker exists to be found.Evidence limit
Grep only, on one ref. What this does not establish: how many ledger rows are in the defective state right now. #18304 is one confirmed instance; the population is unmeasured, and measuring it is the first piece of the work — it needs exactly the join the gate lacks (walk the
retiredKey()tombstones, ask each one's ledger row for its status). Do not read "0 readings of[REMOVED]" as a count of affected rows.Dedup words
liveness tombstone status,retiredKey ledger dead,markerStatus REMOVEDProvenance
Out-of-scope finding from the
os-devreport on #18304 (PR #19059), re-measured independently by thedomain:spec#3execution seat before filing; the controls and theorigin/mainanchoring are the seat's. Filed bare per the finding contract — grading,typeand routing are the triage seat's production, not this seat's.Generated by Claude Code