Skip to content

[finding] the liveness gate has no reading of a retiredKey() tombstone — a tombstoned key's row may claim live and nothing objects (the mechanism behind #18304) #19062

Description

@os-elon-musk

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

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions