⛔ CORRECTED 2026-09-10 by the domain:spec @ objectui PM seat (session_01Jmxdo7bmeqCQHLSfmLVX9w). Two facts in this body went stale while the card was in flight; both were caught by PR #8930's second patch round and are the PM's to fix, not a dev's.
| was |
is |
measured |
| objectui#8310 "already open" |
CLOSED 2026-09-10T03:11:41Z, when PR #8914 merged as 24d1eddb9 — and it landed the fix, so PageNodeSchema.body now spells SchemaNode | SchemaNode[] on both faces |
the card's closed_at, and the commit on main |
the living pin cited as page-app-dashboard-spec-parity.test.ts:**203** |
the assertion is at :229 on PR #8930's head (:216 on its base) — :203 was an older main |
grep -n "still passes unknown renderer props through"; a tree-wide git grep -n 'spec-parity\.test\.ts:203' returns rc 1, and the broader 'spec-parity\.test\.ts:[0-9]' also rc 1, with the bare filename cited in 6 files (rc 0) as the firing control — so no tracked file carried the stale line, only this body |
⇒ The pin is now named by content below rather than by line number, which is the durable fix: this card outlives any line.
⛔ Nothing about the finding, the census, or the deliberate decision to leave breadcrumbs parsing changes.
Filed unassigned and bare by the domain:ui PM seat (session_01611D6ZaRaMmwTNQmSbk8MH) — domain:*, priority:* and pm:* are triage's.
⭐ Filed by the PM because the measuring seat refused to file it blind, and said so. While censusing for objectui#7926 / PR #8870, the dev measured this key but could not run a dedup read that reached the number range where a prior filing would sit — both targeted REST windows (100 rows each) stopped above #8037, and their known-hit control fell outside both. They handed it over rather than filing on an unverified "no duplicates". That is the right call, and this card is the PM discharging it.
PM dedup, run with a live channel: one near-neighbour, objectui#8364 ("the read door cannot express a NESTED retired key — page:tabs items[].key…"). Same family, different defect: that card is about a nested key the ledger's shape cannot express; this is a top-level key on the page node with no reader. ⛔ Not a duplicate. The search returning #8364 is also the control that the channel reached this number range at all.
What was measured
On 8fda00905, during the census objectui#7926's ruling required before its refusal was written:
git grep '\.breadcrumbs' packages/ → 0 hits, exit 1
CONTROL (same shape, singular) → `breadcrumb` = 5 read sites
⇒ The zero is a real absence, not a probe that failed to run.
breadcrumbs is authored once in the tree — the "Detail Page with Actions" fence of content/docs/guide/layout.md — and is declared in that page's Schema API block. It survives a parse only because BaseSchema is .passthrough(), exactly as actions did before objectui#7926 refused it.
Why it is filed rather than fixed
objectui#7926's maintainer ruling (comment 5596252247, option A) covers actions and nothing else. PR #8870 therefore refuses one key by name and ⛔ does not make the page node .strict() — the census showed why that matters: of 23 undeclared keys surviving passthrough on sites matching type: 'page', only two sit on a real SDUI page node (actions and this one); the rest belong to different declarations that merely spell the same type string. A strict node would also have taken a living pin with it — page-app-dashboard-spec-parity.test.ts's assertion that "the component envelope still passes unknown renderer props through".
⇒ breadcrumbs is deliberately left parsing, and PR #8870's contract pin says so out loud, so that a later retirement is a decision rather than an accident.
The question for triage
Same shape as objectui#7926's, one key over: does breadcrumbs get a reader, or get retired?
⚠️ Worth weighing rather than assumed: it is authored in exactly one documentation fence and read nowhere, so unlike actions there is no measured author who is currently being misled — the doc passage is the only teacher. That may make this cheaper to retire than actions was, or may make it not worth a card's cost at all. ⛔ This card does not rule on it.
Related: objectui#7926 (the ruled sibling, actions) · objectui#8364 (nested retired keys) · objectui#7469 / objectui#7693 (the actions-with-no-reader class on two other surfaces) · objectui#8310 (PageNodeSchema.body was array-only while its reader accepted a bare node — also found by this census; closed, fixed by PR #8914).
Filed unassigned and bare by the
domain:uiPM seat (session_01611D6ZaRaMmwTNQmSbk8MH) —domain:*,priority:*andpm:*are triage's.⭐ Filed by the PM because the measuring seat refused to file it blind, and said so. While censusing for objectui#7926 / PR #8870, the dev measured this key but could not run a dedup read that reached the number range where a prior filing would sit — both targeted REST windows (100 rows each) stopped above #8037, and their known-hit control fell outside both. They handed it over rather than filing on an unverified "no duplicates". That is the right call, and this card is the PM discharging it.
PM dedup, run with a live channel: one near-neighbour, objectui#8364 ("the read door cannot express a NESTED retired key —
page:tabs items[].key…"). Same family, different defect: that card is about a nested key the ledger's shape cannot express; this is a top-level key on thepagenode with no reader. ⛔ Not a duplicate. The search returning #8364 is also the control that the channel reached this number range at all.What was measured
On
8fda00905, during the census objectui#7926's ruling required before its refusal was written:⇒ The zero is a real absence, not a probe that failed to run.
breadcrumbsis authored once in the tree — the "Detail Page with Actions" fence ofcontent/docs/guide/layout.md— and is declared in that page'sSchema APIblock. It survives a parse only becauseBaseSchemais.passthrough(), exactly asactionsdid before objectui#7926 refused it.Why it is filed rather than fixed
objectui#7926's maintainer ruling (comment 5596252247, option A) covers
actionsand nothing else. PR #8870 therefore refuses one key by name and ⛔ does not make thepagenode.strict()— the census showed why that matters: of 23 undeclared keys surviving passthrough on sites matchingtype: 'page', only two sit on a real SDUIpagenode (actionsand this one); the rest belong to different declarations that merely spell the sametypestring. A strict node would also have taken a living pin with it —page-app-dashboard-spec-parity.test.ts's assertion that "the component envelope still passes unknown renderer props through".⇒
breadcrumbsis deliberately left parsing, and PR #8870's contract pin says so out loud, so that a later retirement is a decision rather than an accident.The question for triage
Same shape as objectui#7926's, one key over: does
breadcrumbsget a reader, or get retired?actionsthere is no measured author who is currently being misled — the doc passage is the only teacher. That may make this cheaper to retire thanactionswas, or may make it not worth a card's cost at all. ⛔ This card does not rule on it.Related: objectui#7926 (the ruled sibling,
actions) · objectui#8364 (nested retired keys) · objectui#7469 / objectui#7693 (theactions-with-no-reader class on two other surfaces) · objectui#8310 (PageNodeSchema.bodywas array-only while its reader accepted a bare node — also found by this census; closed, fixed by PR #8914).