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
{{ message }}
Repository navigation
Commit f10d802
Browse filesBrowse the repository at this point in the historyBrowse files
feat(spec)!: retire a page header's breadcrumb switch — no renderer draws a trail for it (#20758) (#20785)
Closes#20758
Clause-②: no (narrowing)
`PageHeaderProps.breadcrumb` retires through the ADR-0087 route, the way
`icon` left the same row. It has a `retiredKey()` tombstone, the D2
conversion `page-header-breadcrumb-removed` (it strips `true` and
`false` from stored and built pages with a notice, retired from the load
path), the `RETIRED_KEYS_BY_MAJOR[18]` entry and the D3 entry
`page-header-breadcrumb-retired`. A stored page is never refused for the
key: the props lint reports it as a warning.
`nav:breadcrumb` stays, because objectui's Studio page palette writes
it.
The published skill `skills/objectstack-ui/rules/pages.md` stops
teaching the key (two lines). That path is governed, so this PR lands
Tier H, after an authorized approval.
`@objectstack/spec` minor, BREAKING.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
https://claude.ai/code/session_01Sfe5YjBLwB9J3y8fvm2xq1
---------
Co-authored-by: Claude <noreply@anthropic.com>
feat(spec)!: retire a page header's `breadcrumb` switch — no renderer ever drew a trail for it (#20758)
6
+
7
+
**BREAKING** — `breadcrumb` on a `page:header` component (`PageHeaderProps`) is retired, with its `true` default: no renderer ever drew a trail for it. objectui drew an empty slot that nothing filled, and the console draws the navigation trail once, in the app shell's header. Delete the key, whether it was `true` or `false`. The shell's trail is unchanged.
8
+
9
+
Clause-②: no (narrowing)
10
+
11
+
Measured before removal: objectui's `PageHeaderRenderer` reads the key only to draw an empty `div[data-page-breadcrumb-slot]`, and nothing fills it. The one producer is objectui's Studio page-block inspector ("Show breadcrumb"), so stored pages may carry either value. The one in-repo author found was the published `objectstack-ui` skill's record-page example. No example app authors it. The `nav:breadcrumb` component type is not part of this retirement: the Studio page palette still offers it.
**The one-line fix:** delete `breadcrumb` from every `page:header`'s `properties`.
21
+
22
+
**What an author who still writes it sees.** A page is never refused for it. A page component's `properties` is an open bag, so `definePage()`, `defineStack({ pages })` and the page write door accept the page as before. `os validate` / `os build` / `os lint` report the key as a warning at `properties.breadcrumb`, with the prescription:
23
+
24
+
> `page:header` property `breadcrumb` was removed in @objectstack/spec 17 (ADR-0087 D2) — no renderer ever drew a trail for it: objectui drew an empty slot and nothing filled it, and the navigation trail is drawn once, by the app shell's header. Delete the key, whether it was `true` or `false`; the shell's trail is unchanged. Run `os migrate meta --from 17` to list the mechanical edits for existing sources; apply them by hand.
25
+
26
+
A typed `PageHeaderProps` input fails `tsc` at the key.
27
+
28
+
## The retirement kit
29
+
30
+
-**A `retiredKey()` tombstone** on `PageHeaderProps`, a `strictObject`, beside the `icon` that row lost at 17. `RETIRED_KEYS_BY_MAJOR[18]`: `ui/PageHeaderProps:breadcrumb`. No retired-default residue stage is owed: the `true` default was never written into a built artifact, because a page parses its component `properties` as an open bag and only the advisory props lint reads this row.
31
+
-**The D2 conversion `page-header-breadcrumb-removed`** (protocol 18, retired from the load path) deletes the key from every `page:header`, `true` and `false` alike, with one notice per header. It reaches headers in regions, nested in a container's `children`, and in a slotted page's named slots. A stored `page` row or a built artifact that carries the key loads through the rehydration seams, which replay it.
32
+
-**The D3 entry `page-header-breadcrumb-retired`**: a header that said `false` reads as absent after the strip, so it shows the empty slot's spacing again until the renderer stops drawing the slot.
33
+
-**No deprecation window**, per the project's startup-stage posture.
34
+
35
+
⚠️ **The out-of-repo consumer population is NOT MEASURED.**`@objectstack/spec` is published, so this is breaking for consumers no telemetry was consulted for.
Copy file name to clipboardExpand all lines: content/docs/references/ui/component.mdx
+1-1Lines changed: 1 addition & 1 deletion
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -1198,7 +1198,7 @@ View filter rule
1198
1198
|**title**|`string \| Record<string, string>`| optional | Page title. Omit to let the renderer derive the heading from the record (the default for record pages) — set explicitly on non-record pages (dashboard, landing) with no record to derive from. |
|**icon**|`never`| optional |[REMOVED]`page:header` property `icon` was removed in @objectstack/spec 17.0.0 (ADR-0087 D2) — no renderer ever read it: objectui resolves `icon` only per header action (`action.icon`), never off the header's own props bag, and the component registry never published it as an input, so an authored value was accepted and dropped. Delete the key. The header's own identity is drawn by the record chrome (`recordChrome`, on by default) and each action carries its own `icon`. Run `os migrate meta --from 16` to list the mechanical edits for existing sources; apply them by hand. |
1201
-
|**breadcrumb**|`boolean`| optional (default: `true`) | Show breadcrumb|
1201
+
|**breadcrumb**|`never`| optional |[REMOVED]`page:header` property `breadcrumb` was removed in @objectstack/spec 17 (ADR-0087 D2) — no renderer ever drew a trail for it: objectui drew an empty slot and nothing filled it, and the navigation trail is drawn once, by the app shell's header. Delete the key, whether it was `true` or `false`; the shell's trail is unchanged. Run `os migrate meta --from 17` to list the mechanical edits for existing sources; apply them by hand.|
1202
1202
|**actions**|`string[]`| optional | Action IDs to show in header |
1203
1203
|**recordChrome**|`boolean`| optional (default: `true`) | Render the record chrome — the title as a record chip with its follow star and copy-id button. Set false on a non-record page (dashboard, landing) to fall back to the bare heading layout. |
1204
1204
|**showStar**|`boolean`| optional (default: `true`) | Show the follow (favourite) star beside the record title. Part of the record chrome — no effect when `recordChrome` is false. |
0 commit comments