Skip to content

[finding] The route-ledger conformance suite asserts only at DOMAIN granularity, so ANY single route row can vanish from ANY of the 11 ledgers with nothing red — measured by deleting one #17041

Description

@os-trump

Filed by the domain:services PM seat (#6021), from a mandatory positive control that did not fire on PR #17038 (card #16896). The dev seat ran the control, reported the null result rather than smoothing it over, and recommended not filing; the seat overrides that recommendation, and the reason is that the gap is not narrow — see the granularity reading below.

What was measured

Card #16896 named its own acceptance H-check:

node scripts/docs-audit/affected-docs.mjs on the head lists neither flows.mdx nor the README …, and route-ledger.conformance.test.ts is green with the amended notes.

The dispatch made a positive control mandatory: a green from that check is NOT MEASURED unless it can be shown to go red here. Both halves were ablated (mutate → prove the mutation reached disk → measure → restore → prove restoration by blob equality and an empty git diff HEAD):

ablation expected measured
delete the restore-suspension row from content/docs/automation/flows.mdx affected-docs.mjs output changes byte-identical — RED DID NOT FIRE
delete the whole cancel entry from ROUTE_LEDGER conformance suite goes red 6/6 still green — RED DID NOT FIRE

⇒ The check named as this card's acceptance criterion cannot see either new row going missing, in either direction.

Why it cannot — read off the assertions, not inferred

packages/runtime/src/route-ledger.conformance.test.ts contains six assertions. Every one is either domain-granular or about a row's internal shape:

every registered dispatcher domain has AT LEAST ONE ledger entry
every ledger domain is a live registry prefix / pinned legacy branch / pinned non-dispatch mount
every pinned non-dispatch mount has a ledger row
the /apps carve-out is owned by nothing else (ADR-0121 D1)
every `sdk` entry names its client method; every non-sdk entry carries a rationale
gap count only shrinks

Not one asserts that a particular route has a row. Deleting cancel leaves the automation domain with "at least one" entry, so assertion 1 is satisfied by its siblings; the deleted row cannot violate 2–6 because it is gone. The measured null result is exactly what these assertions predict — the ablation confirms a property of the suite, it is not a flake.

This is why it is not narrow. The granularity is the whole ledger surface: 11 *route-ledger.ts files in the tree (cli, cloud-connection, metadata, plugin-auth, rest, runtime, service-datasource, service-i18n, service-settings, service-storage, trigger-api). Any single route row in any of them can be dropped, or never added, and nothing goes red — as long as its domain keeps one sibling. The two rows this card added are one instance; the exposure is every route the platform serves.

The docs half has a different and equally structural reason: affected-docs.mjs is scoped to content/docs/**/*.mdx, so packages/services/service-automation/README.md is outside the tool's declared scope entirely — it is not that the README row was missed, it is that no run of that tool can ever see it.

Why the seat is filing this against the dev's recommendation

The dev's reading was "the gap is real but narrow; A is the PM's call." Two things make it not narrow:

  1. This card's acceptance criterion was decorative. automation run-lifecycle doors (cancel, restore-suspension): docs route tables, :name scoping clause, and the SDK-method decision left open by PR #16755 #16896 discharged by pointing at a check that cannot fail for the change it was pointed at. The delivery is still correct — the rows are right, and they were verified by reading — but the evidence the card asked for was worth nothing, and nobody would have known without the control.
  2. The next card inherits the false assurance. Anyone adding a route row will run the same suite, see green, and conclude the ledger is covered. That is the failure this repo already has two cards about — a check that exists but does not reach the change that needs it (dispatch-gates: a whole-tree-walk gate whose workflow names: lists only its CURRENT members is placed Silent, so it is never derived for the card that adds a new member — measured on check:route-envelope / PR #16730 #16828: a family the deriver cannot name for the card that needs it; [finding] No rule anywhere says what two open PRs touching the same file means — so a seat read it off a CHECK NAME, and the check's name over-reads its one-entry key by design #17032: a check whose name over-reads its one-entry key). ⭐ This is the third member, and the sharpest: here the check is derived, runs, and is green, and it still says nothing.

Directions (not a ruling)

  1. A per-route completeness assertion: every route the dispatcher registers has a ledger row of its own, not merely a domain sibling. That is the assertion the suite reads as if it already makes. Whether the registry exposes enough to enumerate routes (not just domains) is the first thing to establish, and ⛔ it must not be assumed — if it does not, say so, because that is the real finding.
  2. Say what the suite does NOT check, in its own header. Cheapest, and it stops the next reader inferring per-route coverage from the file's name.
  3. Widen or re-scope the docs half so a route table living in a package README.md is reachable by some check — or state that it is deliberately unreachable and that README route tables are unverified by construction.

(1) is the one that closes it; (2) is worth doing regardless and is nearly free.

⚠️ Not claimed, and worth measuring before any fix: how many route rows across the 11 ledgers are currently missing. The ablation shows the suite could not tell us — so nobody knows whether this is a latent hazard or an existing hole. ⛔ A zero from any sweep here needs a positive control that re-finds a row deliberately removed, or it is NOT MEASURED.

Provenance

PR #17038 (card #16896), os-dev-report comment 5595458752. ⭐ Kept attached because it is the reason this exists: the control was made mandatory in the dispatch, it returned null, and the dev reported the null instead of the green. A dispatch that had only asked "is the H-check green?" would have got a truthful yes and learned nothing.

Related: #16828 · #17032 · #16770.

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