Repository navigation
[seam] page:header's breadcrumb ("Show breadcrumb", default true) draws only an empty slot — the declared capability is never honoured #11166
Description
Activity
objectstack-fleet commented
on Sep 30, 2026 ContributorAuthorMore actionsTriage: first grade —
enhancement·priority:p3·domain:ui·area:records·pm:queue. Ruling: RETIREpage:header'sbreadcrumb(#18900 A′④: no consumer). The spec half is filed as objectstack-ai/objectstack#20758; this card is the renderer and docs halfTriage seat (objectstack-wide, seat post objectstack-ai/objectstack#6015) ·
session_01AavokzJ5DndAwitDXvKy4U· 2026-09-30T02:55Z. ⛔ Not a claim, ⛔ not a dispatch.Triage: lands in
packages/components/src/renderers/layout/containers.tsx(PageHeaderRenderer), a published library ⇒domain:ui. The docs pages move with it.Why retire, not enforce. This is the maintainer's standing rule 「有 ⇒ 补消费端;没有 ⇒ 退役」.
- No consumer. The default-true slot has rendered empty on every page header, and nothing fills it.
- The trail is already drawn. The console shell draws it once:
AppHeaderrenders the breadcrumb path inside/apps/:appName/*(read at objectuiorigin/mainc2a8d23c67). A renderer here would duplicate the shell, not supply something missing. - If the maintainer wants a page-level trail after all (for pages the shell draws none on), that is ENFORCE, and it is said on spec(ui): retire
PageHeaderProps.breadcrumb("Show breadcrumb", default true) — no renderer draws a trail and the console shell already draws one; the spec half of objectui#11166 objectstack#20758, where it is re-graded.
Why p3. The empty slot is harmless markup, and no author loses anything today.
Direction for this half.
- The renderer. It stops reading
breadcrumband drops both emptydata-page-breadcrumb-slotdivs (:1508,:2343-2347,:2379-2380).- Until the spec retirement reaches objectui's install face, an authored
breadcrumbmust still render without error. It is ignored, which is today's behaviour minus an empty div. - ⛔ No trail is added.
- Until the spec retirement reaches objectui's install face, an authored
- Docs.
content/docs/layout/page-header.mdxstops listing the key. objectui#11165's example drops it in that card. - Pins:
- a
page:headerwithbreadcrumb: truerenders no slot; - one with the key absent renders the same (the control);
- the
actions-slotpins stay green.
- a
- Order. The two halves are independent: this half removes only an empty element. spec(ui): retire
PageHeaderProps.breadcrumb("Show breadcrumb", default true) — no renderer draws a trail and the console shell already draws one; the spec half of objectui#11166 objectstack#20758 retires the key through ADR-0087, and it also measures the spec'snav:breadcrumbcomponent, which has no objectui renderer either.
- addedarea:recordsBusiness objects, records, the views that show data, usable forms, searchBusiness objects, records, the views that show data, usable forms, searchdomain:uiobjectui ui stream: fix lands on the published library or apps — objectui execution seatobjectui ui stream: fix lands on the published library or apps — objectui execution seatenhancementNew feature or requestNew feature or requestand removed
on Sep 30, 2026 objectstack-fleet commented
on Sep 30, 2026 ContributorAuthorMore actionsClaim: PM loop round 8 —
domain:uiexecution seat 2
Session:session_011p7ikEivgXefNDaE5S5Uec
Account:os-support-ai(the seat's linked user asGET /useranswers it; the card's assignee)
Branch:claude/issue-11166-page-header-breadcrumb-retire
Worktree:objectui-issue-11166
Domain:domain:ui
Seat:domain:ui#2
File surface (triage5903152845, ruling RETIRE: the renderer and docs half; the spec half is objectstack-ai/objectstack#20758):packages/components/src/renderers/layout/containers.tsx,PageHeaderRenderer: it stops readingbreadcrumb(:1508) and drops both emptydata-page-breadcrumb-slotdivs (:2343-2347,:2379-2380). An authoredbreadcrumbstill renders without error and is ignored. ⛔ No trail is added.- The
page-headerregistration's declared inputs, if they listbreadcrumb. content/docs/layout/page-header.mdx: the key leaves the prop table, the prose and the layout diagram.- Pins:
breadcrumb: truerenders no slot; the key absent renders the same; theactions-slotpins stay green. One changeset ('@object-ui/components': patch).
Stop on breach; explain in the report.
Container & model:S,mode:subagent,model: opus(TIER_DEFAULT;dispatch-gates --tier --repo objectstack-ai/objectuiover this surface: no path-derived mandate, at objectstack288611e3)
Clause-②: no
Why no: an empty element leaves the render. The spec still accepts the key until spec(ui): retirePageHeaderProps.breadcrumb("Show breadcrumb", default true) — no renderer draws a trail and the console shell already draws one; the spec half of objectui#11166 objectstack#20758 retires it, so no accepted set moves in objectui.
Thread-read: 5903152845
Serial constraints cleared: read 2026-09-30T03:35Z at objectuiorigin/mainc2a8d23c6. PR objectui#11162 (objectui#3906,page-header.mdx) merged asce26f401f. No open PR touchescontainers.tsxorpage-header.mdx. objectui#11165 (domain:devx, the slotted-pages example) drops its ownbreadcrumb: truein its own file.
Generated by Claude Code
objectstack-fleet commented
on Sep 30, 2026 ContributorAuthorMore actionsos-dev-report
{ "issue": 11166, "status": "done", "branch": "claude/issue-11166-page-header-breadcrumb-retire", "pr": "https://github.com/objectstack-ai/objectui/pull/11172", "session": "session_011p7ikEivgXefNDaE5S5Uec — the dispatching PM seat's id (mode:subagent; this run is its subagent)", "premise_still_valid": true, "summary": "PageHeaderRenderer no longer reads `breadcrumb`. Both empty `data-page-breadcrumb-slot` divs are gone, from the record-chip layout and from the bare layout. An authored `breadcrumb` (`true` or `false`, in `properties` or on the node) renders the same header as an absent key, with no error. No trail was added. The registration keeps the `breadcrumb` input, now with a description that says it is ignored. It must stay while spec 17.4.0 accepts the key, for two reasons: dropping it makes the manifest warn `unknown-prop` (probed), and the parity reverse direction demands it. The parity file (objectui#11086) is untouched. Docs: page-header.mdx drops the table row, the prose and the diagram line, and one sentence replaces them. Declared surface extension, rule-3 must-fix: guide/layout.md described the key as a toggle for the slot above the title. Its Schema API line and three callouts are corrected. The same file's overview bullet no longer promises breadcrumbs from PageHeader (a bounded in-place fix; all four conditions hold). Changeset: @object-ui/components patch. It names the visible shift, measured in Chromium: the title moves up 8px (bare) and 4px (record). All root class strings are byte-unchanged, and no existing pin moved.", "tests": "All at head 8ef26fe20 unless marked. NEW PIN packages/components/src/__tests__/page-header-breadcrumb-ignored-11166.test.tsx: `Tests 8 passed (8)`, at 26bc72b6e, where containers.tsx has the same blob as head. It covers both layouts, three authored spellings against an absent-key CONTROL, and asserts no slot, no breadcrumb text, no console.error, and identical markup. ABLATION (fix committed first; objectstack scripts/ablation-replace.mjs WRAP mode, anchor hit 1 to 0, blob changed): re-planting the old read and slot in the bare layout gave `Tests 4 failed | 4 passed (8)`, exactly the 4 bare rows. Re-planting it in the record layout gave `Tests 4 failed | 4 passed (8)`, exactly the 4 record rows. After each leg the restore was proven: blob == HEAD c07608e4cc2a and git diff HEAD empty. PACKAGE: `pnpm exec vitest run packages/components/ examples/schema-catalog/` in 4 shards under the verify lock, every shard VERDICT command-exit 0. Shard 1/4: 94 files passed, 1354 passed + 7 skipped. Shard 2/4: 94 files passed, 1534 passed + 10 skipped. Shard 3/4: 93 files passed, 1796 passed. Shard 4/4: 92 files passed + 1 skipped, 827 passed + 7 skipped. That is 374 files, which equals 376 git-listed *.test.* files minus 2 .snap files. The unsharded attempt hit `timeout 560` (exit 124) with no verdict, so it was sharded. CROSS-PACKAGE: 75 files that read containers.tsx or the edited docs from disk, or name page:header, outside those two trees: `Test Files 75 passed (75)`, `Tests 2006 passed (2006)`. They include registry-inputs-spec-parity, public-contract, component-input-union-specimens, widget-dom-leak-sweep, block-config*, the RecordDetailView header suites, page-breadcrumbs-refusal-8871 and zod-mirror-parity. TYPE-CHECK: `pnpm --filter @object-ui/components type-check` exit 0, with the script name echoed (tsc --noEmit && tsc -p tsconfig.test.json). It ran after building the ^... closure (7 packages). --listFiles includes the new pin. ESLINT (proven narrowing): (1) Population, from eslint's own config: only the 2 .tsx of the 5 changed files match; the .md, .mdx and changeset files report \"File ignored because no matching configuration was supplied\". (2) Count, from --format json: 2 files, 0 errors. The new pin has 0 messages. containers.tsx has 97 warnings, equal to the base by rule (no-explicit-any 89, only-export-components 7, exhaustive-deps 1; base read via --stdin). (3) Invariance: no type-aware linting in eslint.config.js, so untouched files cannot move.", "files_changed": [ ".changeset/11166-page-header-breadcrumb-slot-retired.md (+23 -0)", "content/docs/guide/layout.md (+7 -8)", "content/docs/layout/page-header.mdx (+2 -4)", "packages/components/src/__tests__/page-header-breadcrumb-ignored-11166.test.tsx (+154 -0)", "packages/components/src/renderers/layout/containers.tsx (+15 -12)" ], "gates": [ "check:doc-types 0", "check:doc-snippets 2 then 0: first run PRECONDITION NOT MET (unbuilt packages); 0 after turbo build of its own --build-filter closure (35/35 tasks), 679 of 679 blocks judged, 0 failed", "check:doc-examples 2 then 0: same precondition; 0 after the build, every covered @example compiles or fails as its ledger row declares", "docs:check-links 0", "check:doc-fences 0", "check:doc-example-ids 0", "check:doc-example-readers 0", "check-doc-expression-carriage 0", "check:control-bytes 0 (plus a self-scan of the 5 files for control bytes: none)", "check:new-line-citations 0", "check-changeset-presence 0", "changeset:check 0", "check-changeset-overwrite 0", "check:changeset-claims 0", "check:pending-changeset-literals 0", "check:installed-pin-claims 0", "check:handler-key-reads 0", "check:action-forward-parity 0", "check:element-data-source-declaration 0", "check:designer-field-key-parity 0", "check:prompt-keys 0", "check:spec-symbols 0", "check:unreferenced-sources 0", "check:readme-exports 0", "check:test-path-roots 0", "check:vi-mock-specifiers 0", "check:vi-mock-inherit 0", "check:vi-mock-override-shape 0", "lint:coverage 0", "type-check:coverage 0", "check:phantom-deps 0", "check:self-import 0", "check:i18n-designer-parity 0", "check:metadata-write-doors 0", "check-governed-queue-guard --test: NOT GOVERNED (5 paths)", "NOT MEASURED: check:sdui-registration-pins, reason: exit 2 precondition, no console bundle at apps/console/dist/assets. The diff adds or removes no registration and no sideEffects entry. Declared to CI.", "CI: in_progress (not awaited, per the role file)" ], "line_budget": "n/a: no skills/** or governed ledger touched", "deviations": [ "Surface extension: content/docs/guide/layout.md is outside the claimed surface. This change made three statements there false (a display toggle for the slot above the title), and it is a published doc, so the fix is mandatory under the role file rule 3. Same file: the overview bullet drops \"breadcrumbs\" as a bounded in-place fix of the same defect class, with conditions 1-4 held. Condition 3 (no other claim on the file) was not checked against open PRs; the PR body asks the seat to check.", "Gate lead `pnpm exec vitest run packages/components/src/renderers/layout/ examples/schema-catalog/` was widened to the whole components package plus schema-catalog, run in 4 shards because the unsharded run exceeded the foreground cap. The page-header suites live in packages/components/src/__tests__, not in renderers/layout.", "The `breadcrumb` input kept its declaration but gained a `description` (the registration is in the claimed surface).", "The first commit was amended BEFORE its first push, to drop a `Refs:` card trailer (the role file says commits carry no card trailer). No force-push happened." ], "mcp_calls": "0 — no MCP GitHub tool was called (reads went through unauthenticated REST GETs via the proxy)", "api_writes": "3 — all through the objectstack scripts/pm fleet relay, each one POST /repos/objectstack-ai/objectstack/dispatches executed as objectstack-fleet[bot]: (1) pr_create, which executed POST /repos/objectstack-ai/objectui/pulls (draft, PR 11172); (2) label-write --assign, which executed POST /repos/objectstack-ai/objectui/issues/11172/assignees (os-support-ai; read back MATCHES; no labels written); (3) post-stamped, which executed POST /repos/objectstack-ai/objectui/issues/11166/comments (this report). git push is not a REST write: 3 pushes to the claimed branch (the empty probe and 2 commits), no force.", "open_questions": [], "out_of_scope_findings": [ "class: c · reach: named producer — the Studio page designer's block inspector. BLOCK_CONFIG['page:header'] in packages/app-shell/src/views/metadata-admin/previews/block-config.ts offers a \"Show breadcrumb\" boolean (label key engine.inspector.pageBlock.field.page:header.breadcrumb, en and zh) and writes `breadcrumb` into stored page metadata. The renderer now ignores that key, and once objectstack-ai/objectstack#20758's tombstone is installed the platform refuses the whole node by name. · evidence: block-config.test.ts pins fieldNames() toEqual [title, subtitle, breadcrumb]. The same file's page:header icon retirement pin states the precedent: \"A retirement that leaves its producer standing makes the failure worse, not better.\" Not fixed in place because condition 4 fails (it adds app-shell and i18n to the verification surface). · placement: an independent objectui card, related to objectstack-ai/objectstack#20758. It must land before or with the objectui pin bump that installs the tombstone. It is not Blocked-by anything (it can land now). · dedupe words: \"Show breadcrumb\", \"BLOCK_CONFIG page:header breadcrumb\", \"pageBlock.field.page:header.breadcrumb\", \"designer breadcrumb toggle\"", "carrier: the objectui @objectstack/spec pin-bump PR that installs objectstack-ai/objectstack#20758's tombstone · it must drop the `breadcrumb` entry from page:header `inputs` (the parity forward direction will name it) and the one \"accepts it until objectstack#20758 retires it\" sentence in page-header.mdx and guide/layout.md · noted in PR Acceptance notes, not filed", "carrier: objectstack-ai/objectstack#20758 · triage says the spec's nav:breadcrumb \"has no objectui renderer\", but the parity file's EXPECTED_WITHOUT_INPUTS lists nav:breadcrumb as \"Registered, spec-carried, and deliberately propless\" · read-only inference, noted, not filed", "carrier: 承接者:无 · the bare root's gap-2 now spaces a single child and is inert (polish), and the page-breadcrumbs-refusal-8871.test.ts LIT CONTROL comment still calls .breadcrumb \"the live page:header toggle\" (unpublished comment; the control still fires) · noted in PR Acceptance notes, not filed" ] }
Generated by Claude Code
objectstack-fleet commented
on Sep 30, 2026 ContributorAuthorMore actions✅ ACCEPT: PR objectui#11172 at
8ef26fe20; ready and auto-merge follow this ACCEPTdomain:uiseat 2,session_011p7ikEivgXefNDaE5S5Uec. Checked against the diff and the head's check-runs, not against the report's own account.- Claim
5903543704, on triage ruling RETIRE5903152845. - Dev report
5904174524. - Contract review
5904304282, atCONTRACT_REVIEW_TIER: PASS on this head. This diff touches two docs faces, and the record covers this landing head.
Implemented-by: claude/issue-11166-page-header-breadcrumb-retire Reviewed-by: session_011p7ikEivgXefNDaE5S5Uecitem reading the render PageHeaderRendererno longer readsbreadcrumb. Both emptydata-page-breadcrumb-slotdivs are gone, from the record-chip layout and from the bare layout. Every authored spelling (true/false, inpropertiesor on the node) renders the same header as an absent key, with no error, and no trail is added. The title sits 8px higher (bare) and 4px higher (record), measured in Chromium and stated in the changeset. Every root class string is byte-unchangedthe registration The breadcrumbinput stays declared, now described as ignored. The installed spec still accepts the key, dropping it makes the manifest warnunknown-prop, and the parity ledger's reverse direction demands it. The parity file (PR objectui#11086's) is untoucheddocs content/docs/layout/page-header.mdxdrops the row, the prose and the diagram line, and one sentence replaces them.content/docs/guide/layout.mdhad four statements this change made false (three callouts and the Schema API line) plus a false overview bullet; each is corrected in one phrase. That is a rule-3 must-fix and minimal. Its hunks are disjoint from draft PR objectui#11069's single hunk in the same file, which leaves 11 untouched lines between themtests New pin: 8 cases covering both layouts and three authored spellings, each against an absent-key control. It asserts no slot, no breadcrumb text, no console.error, and identical markup. A two-leg ablation (re-planting the read and the slot in one layout at a time) turns exactly that layout's 4 cases red. No existing pin movedchangeset '@object-ui/components': patch;Clause-②: no, the accepted key set is unchanged until objectstack-ai/objectstack#20758 retires the keyCI head 8ef26fe20: 43 runs, 40 success, 3 expected skips, 0 failuresize 5 files, +201 / −24 closing keywords Fixes #11166onlygoverned none of the 5 paths is on objectui's governed surfaces Out of scope, one line each:
- The Studio page designer's
BLOCK_CONFIG['page:header']still offers "Show breadcrumb" and writesbreadcrumbinto stored pages. It is a producer left standing by this retirement, and it must go before the spec tombstone installs. filed objectui#11173. - When objectui's pin bump installs spec(ui): retire
PageHeaderProps.breadcrumb("Show breadcrumb", default true) — no renderer draws a trail and the console shell already draws one; the spec half of objectui#11166 objectstack#20758's tombstone, three things go with it: thebreadcrumbinput on the registration, and the one "accepts it until objectstack#20758 retires it" sentence inpage-header.mdxand inguide/layout.md. Acceptance notes, carrier: that pin-bump PR; not filed. nav:breadcrumbis registered only asplaceholders.tsx's dashed scaffold, not as a renderer that draws a trail. The triage's "no objectui renderer" and the ledger's "registered" are both true. Relayed to spec(ui): retirePageHeaderProps.breadcrumb("Show breadcrumb", default true) — no renderer draws a trail and the console shell already draws one; the spec half of objectui#11166 objectstack#20758's measurement; not filed.- The bare root's
gap-2now spaces a single child, andpage-breadcrumbs-refusal-8871.test.ts's control comment still calls.breadcrumba live toggle. Acceptance notes, carrier: none; not filed. Both are inert: the class is kept so that no class string moves, and the comment is unpublished while the control still fires.
domain:uiseat 2 · ACCEPT · 2026-09-30T04:54Z
Generated by Claude Code
- Claim
- added a commit that references this issue
on Sep 30, 2026
Seam: spec:
PageHeaderProps.breadcrumb→ renderer:PageHeaderRenderer(@object-ui/components)Filing-gate category: ② declared but not enforced, class (b).
reach:a public door, measured: anypage:headerrendered throughSchemaRenderer, bare or record layout.page:headerat PR objectui#11162's headc79ae7497. With the defaultbreadcrumb: true, both layouts draw only an emptydiv[data-page-breadcrumb-slot](itstextContentis""), with no trail. In the control,breadcrumb: falseremoves the slot.git grep 'breadcrumb-slot'outsidecontainers.tsxfinds no code that fills it. As a control,actions-slotdoes hit tests and the CHANGELOG.5902367106, ③ out-of-scope (b)) confirmed it real and pre-existing. The spec describes the key as "Show breadcrumb",z.boolean().default(true).Reader: triage first. The route is enforce-or-remove (ADR-0049): either the renderer draws the trail the key promises, or the key is retired from
PageHeaderProps. Which one is triage's call, and the spec side of this seam is the spec lane's. Filed bydomain:uiseat 2 (session_011p7ikEivgXefNDaE5S5Uec) at the ACCEPT of PR objectui#11162 (objectui#3906), from the dev report'sout_of_scope_findings[1](5902224540). ⛔ Not graded here.The sites (read at objectui
origin/maina8c550938,packages/components/src/renderers/layout/containers.tsx)const breadcrumb = (schema?.breadcrumb ?? schema?.properties?.breadcrumb) !== false;(:1508).{breadcrumb && ( … data-page-breadcrumb-slot … )}(:2343-2347), an empty div.{breadcrumb && (<div className="text-xs text-muted-foreground" data-page-breadcrumb-slot />)}(:2379-2380), an empty div.The rewritten reference page
content/docs/layout/page-header.mdx(PR objectui#11162) states this truthfully: the slot renders, and nothing fills it.Facts for the choice (not a ruling)
RecordDetailViewbuilds a record breadcrumb title (objectui#10434 names its "breadcrumb / favourite / recent title").content/docs/guide/slotted-pages.md's header example writesbreadcrumb: true. That is the sibling docs card filed with this one.Dedupe
The 1000 most recently updated objectui issues and PRs (down to #10338) were grepped:
breadcrumb-slotandShow breadcrumb: only PR objectui#11162 (the source).page:headerwithin 300 characters ofbreadcrumb: three closed items that mention the key in other contexts (objectui#10499, docs(skills,console): record why the seven sectioning tags stay off the curated tier; retract the section row (objectui#8775) #10852, docs: cite landing commits where pending changesets and source comments name 41 objectui issues that answer 404 (objectui#10803, batch 5) #10892).A search of objectstack for
breadcrumb PageHeaderPropsreturned nothing. No card covers this.Generated by Claude Code