Repository navigation
fix(app-shell): the page designer stops offering the retired page:header breadcrumb toggle (objectui#11173) - #11214
Conversation
…der breadcrumb toggle `breadcrumb` leaves BLOCK_CONFIG['page:header'] and its label key leaves both the en and zh designer tables, the shape the header's `icon` field took. The field-set and label pins move with it. A stored `breadcrumb` is not stripped: a new screen-level control pins that a page carrying it opens and its next save keeps the key, since the spec's ADR-0087 conversion is the one strip. Claude-Session: https://claude.ai/code/session_011p7ikEivgXefNDaE5S5Uec Co-authored-by: Claude <noreply@anthropic.com>
…ntrol pin Claude-Session: https://claude.ai/code/session_011p7ikEivgXefNDaE5S5Uec Co-authored-by: Claude <noreply@anthropic.com>
|
changeset-claim-re-read
|
✅ Console Performance Budget
The eager closure is every chunk the entry reaches through static imports — what the browser fetches and parses before the app renders. The entry chunk on its own is a small fraction of it. 📦 Bundle Size Report
Size Limits
|
Contract reviewServed-tier: Inputs: card #11173 (body and all three comments: triage ① Derived judgments
② Semver level
③ Boundary flags
Implemented-by: VERDICT: PASS Generated by Claude Code |
…ssue-11173-retire-breadcrumb-toggle
✅ Console Performance Budget
The eager closure is every chunk the entry reaches through static imports — what the browser fetches and parses before the app renders. The entry chunk on its own is a small fraction of it. 📦 Bundle Size Report
Size Limits
|
Contract reviewServed-tier: Delta re-record on the landing head, after the base merge. The previous record on this PR, Inputs: card #11173 (body and its three comments, unchanged since ① Derived judgments
② Semver level
③ Boundary flags
Implemented-by: VERDICT: PASS Generated by Claude Code |
Dequeued by an API 502 in the
|
Fixes #11173
Clause-②: no
The Studio page designer stops offering the "Show breadcrumb" toggle on the canonical
page:headerblock.breadcrumbleavesBLOCK_CONFIG['page:header'], and its label keyengine.inspector.pageBlock.field.page:header.breadcrumbleaves both the en and zh tables of the designer's i18n file. This is the shape the header'siconfield took. The field-set pin and the label pin move with it.Why: the canonical
page:headerrenderer already ignores the key (objectui#11166, landed as PR objectui#11172), and objectstack#20758 retiresPageHeaderProps.breadcrumbin the spec through ADR-0087. Until then the toggle authors a key nothing reads. Once objectui pins a spec release carrying that tombstone, the platform refuses the key by name. The producer leaves first, so the pin bump does not find it standing.Implemented by the dispatched os-dev of
domain:uiseat 2, sessionhttps://claude.ai/code/session_011p7ikEivgXefNDaE5S5Uec, branchclaude/issue-11173-retire-breadcrumb-toggle.Stored pages: no strip (triage ruling on the card)
A page that already carries
breadcrumbis not rewritten by the designer. It opens, the key shows under Advanced by its raw name (a checkbox, still checked), and the next save keeps it.RETIRED_BLOCK_PROP_KEYSdeliberately gains nopage:headerentry: the spec's ADR-0087 conversion strips the key on load, with its notice, and a second strip in the designer would be a second mechanism that hides that notice. A new screen-level control pins this, and an ablation shows it can fail (below).Changes, all in the
page:headerregionpreviews/block-config.ts: thebreadcrumbentry leavesBLOCK_CONFIG['page:header']. A comment beside the existingiconnote says why, and why the strip table stays untouched.metadata-admin/i18n.ts: the en row ("Show breadcrumb") and the zh row ofengine.inspector.pageBlock.field.page:header.breadcrumbare removed, with a one-line note beside eachiconnote.previews/__tests__/block-config.test.ts: the header field-set pin is now['title', 'subtitle']. A new describe, "page:headerbreadcrumb— the designer toggle retired with its reader", pins that the toggle is not offered and that neither locale keeps a translation for it.inspectors/PageBlockInspector.i18n.test.tsx: the zh-CN label pair for the toggle leaves the "one language" case. Its absence is now pinned in the new file.inspectors/PageBlockInspector.pageHeaderBreadcrumb-11173.test.tsx(new): screen pins. In en-US and zh-CN, the panel offers Title and Subtitle, has no checkbox, and shows no label or raw key for the toggle. A storedbreadcrumb: trueopens, visible and checked under Advanced, and an edit to Title commits{ title: 'Customer', breadcrumb: true }, which is the control..changeset/11173-retire-page-header-breadcrumb-toggle.md:@object-ui/app-shellpatch.Verification (at
1d8257ab5, the branch head)pnpm exec vitest runoverblock-config.test.ts,block-config-i18n.test.ts,PageBlockInspector.i18n.test.tsx,PageBlockInspector.retiredBlockProps.test.tsxand the new file gives 5 files, 98 passed. At BASE846cec0efthe first four gave 4 files, 92 passed, so the change adds +2 inblock-config.test.tsand +4 in the new file. A verbose run lists all six new cases by name.ablation-replaceplanted the entry back intoBLOCK_CONFIG['page:header'](anchor 1 to 0, blob73518960b48btoebc2ef0c43c7). Result: 3 files failed, 9 failed / 61 passed. The failures include the field-set pin ("still offers the canonical header fields the renderer does implement"), "does NOT offer the retiredbreadcrumbtoggle",block-config-i18n.test.ts's "every key resolves in en-US" / "in zh-CN", "zh-CN is actually translated", "the extractor really sees the keys the derivation implies", and three of the four new screen cases. The restore was proven: blob equal to HEAD73518960b48b,git diff HEADon the path empty. The restore leg ran 3 files, 70 passed. A first attempt was a no-op: its replacement contained its anchor, so the tool refused (anchor 1 to 1) before running any test. It was re-run with a non-overlapping anchor.'page:header': ['breadcrumb']intoRETIRED_BLOCK_PROP_KEYSgave 2 files failed, 3 failed / 67 passed: both stored-page control cases ("opens" and "saves") and the existing "every registered key really is one the block schema refuses BY NAME". The restore was proven the same way, and the restore leg passed 70 of 70.../block-config,../previews/block-config.js), not through a packageexports/dist, so no rebuild hop applies.node scripts/check-changeset-presence.mjs("5 source file(s) of 1 released package(s) changed, and this change declares 1 changeset(s)"),check:control-bytes,check:new-line-citations("0 new citation(s)"),check:i18n-keys,check-changeset-no-major,check-changeset-fixed,check-changeset-overwrite,check:changeset-claims,check:pending-changeset-literals, andnode scripts/markdown-test-inputs.mjs --audit. A raw control-byte self-scan of the changed files found no hits.check:changeset-claimslisted six pending changesets that name a file this diff touches. Each paragraph was read, and none makes a claim about thepage:headerbreadcrumb toggle or its field set.pnpm exec eslinton the 5 changed.ts/.tsxfiles (--format jsoncounts 5 files) gives 0 errors and 2 warnings. Both warnings areno-explicit-anyinblock-config.test.ts, and BASE's copy of that file carries the same 2. Population: the rooteslint.config.js(**/*.{ts,tsx}) that each package'slint(eslint .) runs. Invariance: the config enables no type-aware linting (noparserOptions.project/projectService), and no local rule ineslint-rules/reads another file, so this diff cannot move the verdict on any untouched file.scripts/__tests__, narrowed because the diff adds a markdown changeset: I ran the 38 test files there that mentionchangeset(vitest run --maxWorkers=2, lock-free) and got 38 files, 1433 passed. The whole suite was not run locally.@object-ui/app-shelldependency-closure build (29 packages) andpnpm --filter @object-ui/app-shell type-check. Reason: the shared verify lock was held for more than 49 minutes by one run (issue-11196'sverify-all.sh, pid 14872, alive and busy), with three waiters ahead. This branch spent about an hour queued across five tries without getting the lock for this half. CI'sType Checkjob runs bothtscprojects, and CI's test job runs the fullscripts/__tests__suite.Overlap with PR objectui#10278
PR objectui#10278 edits
block-config.ts,block-config.test.ts,block-config-i18n.test.tsandPageBlockInspector.retiredBlockProps.test.tsxin theobject-kanbanregion only. This PR touches thepage:headerregion ofblock-config.tsandblock-config.test.ts, and does not touch the other two files. The hunks are disjoint.Acceptance notes
breadcrumbstays editable under Advanced, which can set a value but has no delete. That follows from the no-strip ruling. The spec's ADR-0087 conversion removes it on load once objectui pins that release.@objectstack/specpin to a release carrying objectstack#20758's tombstone:RETIRED_BLOCK_PROP_KEYSmembership criterion 2 ("the node schema refuses the key BY NAME") would then admitbreadcrumb, and the existing "every registered key really is one the block schema refuses BY NAME" pin would stop objecting. The new round-trip control is what keeps the ruling.icondescribe's tombstone probe (isShapeKeyTombstoned(PageHeaderProps, …)) is the pattern for a breadcrumb tombstone assertion.page:headercomponent registration in@object-ui/componentsstill declares abreadcrumbinput described as "Ignored … Leave it out." That was PR objectui#11172's deliberate choice while the contract accepts the key. It is not this card's surface.Spec Main Shape Gateis red on every objectui PR against objectstack main (anchor card objectui#11206). It is not caused by this diff and is not touched here.Generated by Claude Code