You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
[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
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.
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 wholecancel 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:
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.
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.
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.
Filed by the
domain:servicesPM 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:
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):restore-suspensionrow fromcontent/docs/automation/flows.mdxaffected-docs.mjsoutput changescancelentry fromROUTE_LEDGER⇒ 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.tscontains six assertions. Every one is either domain-granular or about a row's internal shape:Not one asserts that a particular route has a row. Deleting
cancelleaves theautomationdomain 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.tsfiles 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.mjsis scoped tocontent/docs/**/*.mdx, sopackages/services/service-automation/README.mdis 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:
:namescoping 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.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)
README.mdis 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.
Provenance
PR #17038 (card #16896),
os-dev-reportcomment 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.