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 ae0ca66
Browse filesBrowse the repository at this point in the historyBrowse files
feat(spec)!: retire page:header showStar — the follow star the reference console no longer draws (#23781)
Fixes#23650
Clause-②: no (narrowing)
Regen-provenance: merge of origin/main at
46ca793 plus check:generated
regeneration; no source change since the reviewed head 75ddc30.
## What
Retires `page:header` `showStar` (`PageHeaderProps`) through the
spec-property-retirement route, per the maintainer's ruling on the card
(record `6203775759`, letter A: 「A 退役 showStar (Recommended)」).
Since objectstack-ai/objectui#12427 the record chip draws the follow
star only where the host wires `onToggleFavorite` into the record
context, and no reference host does: the record's favorites entry is the
header's ⋯ menu. So `showStar: true` (the default) drew nothing and
`showStar: false` hid nothing.
| surface | change |
| --- | --- |
| `packages/spec/src/ui/component.zod.ts` | `showStar` becomes a
`retiredKey()` tombstone. The prescription names the header's ⋯ menu as
the favorites entry and says metadata does not control it.
`recordChrome`'s describe stops promising a star. |
| `packages/spec/src/conversions/registry.ts` | D2 conversion
`page-header-show-star-removed` (toMajor 18, `retiredFromLoadPath`,
`retiredAfter: '17.7.0'`, order 66). It strips both values from every
`page:header` (region, nested `children`, slotted page slot) and is
scoped by component type. |
| `migrations/entries/retired-keys/18.ui__PageHeaderProps__showStar.ts`
| `RETIRED_KEYS_BY_MAJOR[18]` entry |
| `migrations/entries/semantic/18.page-header-show-star-retired.ts` +
`STEP18_RATIONALE` fragment (order 98) | ADR-0087 D3 entry |
| `packages/spec/liveness/page.json` | `[1] page:header` read-point
list: `showStar` is now marked refused. `recordChrome` and `showCopyId`
stay. |
| generated | `authorable-surface/ui.json` (`[RETIRED]`),
`authorable-defaults/ui.json` (`showStar = true` removed),
`content/docs/references/ui/component.mdx` |
| `.changeset/23650-page-header-show-star-retired.md` |
`@objectstack/spec` minor, BREAKING, FROM → TO, ADR-0087 `registered`
marker |
### Pins
- **New:**
`packages/spec/src/ui/page-header-show-star-retirement.test.ts` (repo
project, listed in `vitest.repo-tests.json`). It covers:
- the tombstone refuses `true`, `false` and `'no'` at the key with the
prescription;
- a not-unrecognized-keys control;
- the type-level `never` (`@ts-expect-error`);
- the page parse still accepts a stored header;
- the D2 strip for stored and built rows, plus its type scope,
idempotence and load-path retirement;
- the ledger rows;
- a tree-scoped absence pin over the radius the package already
declares.
- **Replaced pins:** `component.test.ts`'s `#6776` block pinned
`showStar` default `true`, accepted `false`, and refused `'no'`. Those
pins are deleted together with the key. The tombstone refusal pin
`refuses \`true\` AND \`false\` at the key, with the prescription` and
`a non-boolean is refused by the same tombstone, at the key` replace
them, and the block keeps pinning `recordChrome` / `showCopyId`.
- `packages/lint/src/validate-component-props.test.ts`: the `#6776`
acceptance fixture drops `showStar`. A new case pins
`component-props-invalid` + `error` + path + prescription for `true` and
`false`.
- `retired-key-removal-version.pin.test.ts` JOIN row added.
`page-header-breadcrumb-retirement.test.ts`'s exact `PageHeaderProps:*`
ledger list now includes `showStar`.
## Measurements
- **Producers:** none. The search was a `git grep showStar` at
`140238a47` over `examples/`, `packages/*/src`, `skills/` and `content/`
(outside the spec's schema/tests, generated references and the
historical `registry.ts.template` rationale). objectui at the pinned
`f96f771140f1` has no producer in apps or examples either.
- **objectui at the pinned `.objectui-sha` (`f96f771140f1`), for the
Console Pin Gate:**
- No TYPE reference: no import of `PageHeaderProps` and no `z.infer` of
it. `app-shell`'s `ConsolePageHeaderProps` is its own interface.
- The reads are untyped `schema?.showStar` /
`schema?.properties?.showStar` in
`packages/components/src/renderers/layout/containers.tsx` (around
`:1581`-`:1584`), plus `RecordTitleChip`'s own React prop.
- The Console Pin Gate runs objectui's `tsc` against objectui's
installed `@objectstack/spec` (the `OBJECTSTACK_SPEC_DIST` hook only
reaches vite). So no compile break is expected from this removal. The
gate itself was not run locally.
- **objectui read points for the follow-up card (the seat files it):**
- `packages/components/src/renderers/layout/containers.tsx`
`:1580`-`:1584` (the read), `:2616` (passes `showStar` to the chip),
`:2681` (the registration's `{ name: 'showStar', type: 'boolean' }`
input);
- `packages/components/src/custom/RecordTitleChip.tsx`
`:45`/`:63`/`:134`;
- the CONTROL pin
`packages/components/src/__tests__/page-header-star-host-toggle-12427.test.tsx`
`:117`-`:120`;
- ⚠️ `apps/console/src/__tests__/registry-inputs-spec-parity.test.ts`
`:5787` lists `['page:header', 'showStar']` in `settledUpstream`. It
asserts `specTopLevelKeys(type)` contains the key, and that set
subtracts tombstones. That test reads objectui's installed spec, so it
goes red there on the first spec bump that carries this retirement, not
here. The forward direction also reds while the registration still
publishes the input.
- docs: `content/docs/layout/page-header.mdx:49` and
`content/docs/guide/layout.md:373`.
- **`sdui.manifest.json`:** still lists `showStar` as a renderer input.
It is not edited by hand. `check-sdui-manifest` checks shape, tamper,
staleness and pin correspondence, not spec parity, and it is green. No
gate here compares manifest inputs against `ComponentPropsMap`. It
updates on the pin bump after objectui drops the input.
## Verification (head `75ddc305`)
- `pnpm --filter @objectstack/spec typecheck && test && test:repo`: 680
files / 20787 tests, then 63 files / 1070 tests, VERDICT command-exit 0.
- `pnpm --filter @objectstack/lint typecheck` exit 0. `pnpm --filter
@objectstack/lint test`: 139 files / 6772 tests, exit 0.
- `pnpm --filter @objectstack/spec check:generated`: all 14 artifacts up
to date.
- `node scripts/pm/dispatch-gates.mjs --commands`: 111 derived families,
each run with its exit code captured before any pipe, all 0. `--ran`
reports 111 run, 0 NOT-MEASURED (a derived zero).
- Ablation, one-time: `node scripts/ablation-replace.mjs` swapped
`showStar: retiredKey(` for `showStar:
z.boolean().default(true).describe(`. The new pin file went red (6
tombstone cases), then was restored byte-identically to HEAD (blob
`d3db276b1322`). A first attempt was a syntax-broken mutation that ran
no tests; it was discarded as void.
- `main` was merged once (merge commit `75ddc305`) after the retirement
commit. The one conflict was in
`retired-key-removal-version.pin.test.ts`, where both sides added JOIN
rows, and both were kept. Nothing needed regenerating afterwards.
`scripts/pm/os-regen-merge.sh` was refused by this container's command
classifier, so a plain `git merge origin/main` was used, followed by
build + `check:generated`.
## Acceptance notes
- `@objectstack/lint` gets no changeset: only a test file changed there,
and test files do not publish.
- The historical step-17 rationale in `registry.ts.template` still names
`showStar` among the keys declared at 17. That text records a past step
and is left as is.
---
_Generated by [Claude
Code](https://claude.ai/code/session_0127kfChiciCXiqVX5g7E5rJ)_
---------
Co-authored-by: Claude <noreply@anthropic.com>
feat(spec)!: retire `page:header``showStar` — the follow-star switch the reference console no longer draws (#23650)
6
+
7
+
**BREAKING** — `showStar` on a `page:header` component (`PageHeaderProps`) is now refused. Since objectui#12427 the header's record chip draws the follow star only where the host wires a favorites toggle into the record context, and the reference console wires none: the record's favorites entry is the header's ⋯ menu. So `showStar: true` (the default) drew nothing and `showStar: false` hid nothing. Delete the key; the ⋯ menu's favorites entry is unchanged, and metadata does not control it.
8
+
9
+
Clause-②: no (narrowing)
10
+
11
+
Measured before removal, at `140238a47`: no producer. No example app, skill, doc or package source in this repository authors the key outside the spec's own schema and tests, and neither does any app or example in objectui at the pinned `f96f771140f1`.
12
+
13
+
## FROM → TO
14
+
15
+
| you wrote (17.7 and earlier) | write instead |
16
+
| --- | --- |
17
+
|`showStar: true` or `showStar: false` in a `page:header`'s `properties`| nothing — delete the key; the record's favorites entry is the header's ⋯ menu |
18
+
19
+
**The one-line fix:** delete `showStar` from every `page:header`.
20
+
21
+
**What an author who still writes it sees.**`tsc` fails at a typed authoring site (`PageHeaderProps` types the key as retired), and `os validate`, `os build` and `os lint` refuse it as an `error` (`component-props-invalid`) at its own path with the prescription:
22
+
23
+
> `page:header` property `showStar` was removed in @objectstack/spec 18 (ADR-0087 D2) — the reference console draws no star beside the record title, so the key switched nothing: the record's favorites entry is the header's ⋯ menu, and metadata does not control it. Delete the key, whether it was `true` or `false`; the ⋯ menu's favorites entry is unchanged. Run `os migrate meta --from 17` to list the mechanical edits for existing sources; `--write` applies the ones it can prove, and you apply the rest by hand.
24
+
25
+
A page's own parse keeps its component `properties` as an open bag, so an existing page carrying the key is never refused at load.
26
+
27
+
## The retirement kit
28
+
29
+
-**A `retiredKey()` tombstone** on `PageHeaderProps`, a `strictObject`, beside the `icon` and `breadcrumb` this row lost before it. `RETIRED_KEYS_BY_MAJOR[18]`: `ui/PageHeaderProps:showStar`. The authorable-surface row reads `[RETIRED]`, and the `showStar = true` default leaves the defaults baseline.
30
+
-**The D2 conversion `page-header-show-star-removed`** (protocol 18, retired from the load path) deletes the key from every `page:header` — region-level, nested in a container's `children`, and in a slotted page's named slot — `true` and `false` alike, one notice per header, as a lossless delete. It is scoped by component `type`: the same key name on another component is left alone.
31
+
-**The D3 entry `page-header-show-star-retired`** records the one case the conversion cannot decide: a host of your own that wires the favorites toggle now draws its star on every record header, a header that said `false` included.
32
+
-**No deprecation window**, per the project's startup-stage posture.
33
+
34
+
**Not part of it:** the record context's favorites hook in the published objectui component library (`onToggleFavorite`) stays — this removes the metadata switch, not the host hook. The renderer's read of the key leaves on the objectui side.
35
+
36
+
⚠️ **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
+2-2Lines changed: 2 additions & 2 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -1506,8 +1506,8 @@ View filter rule
1506
1506
|**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; `--write` applies the ones it can prove, and you apply the rest by hand. |
1507
1507
|**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; `--write` applies the ones it can prove, and you apply the rest by hand. |
1508
1508
|**actions**|`string[]`| optional | Action IDs the header draws, resolved against the actions declared on the page's object. An authored list is the whole set: an action that declares `record_header` (or `record_more`) in its `locations` but is not named here is not drawn, and omitting the key draws none of the object's actions. A named action that declares neither location renders nowhere. The host's own Edit / Share / Delete chrome is separate from this list. |
1509
-
|**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. |
1510
-
|**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. |
1509
+
|**recordChrome**|`boolean`| optional (default: `true`) | Render the record chrome — the title as a record chip with its copy-id button. Set false on a non-record page (dashboard, landing) to fall back to the bare heading layout. |
1510
+
|**showStar**|`never`| optional |[REMOVED]`page:header` property `showStar` was removed in @objectstack/spec 18 (ADR-0087 D2) — the reference console draws no star beside the record title, so the key switched nothing: the record's favorites entry is the header's ⋯ menu, and metadata does not control it. Delete the key, whether it was `true` or `false`; the ⋯ menu's favorites entry is unchanged. Run `os migrate meta --from 17` to list the mechanical edits for existing sources; `--write` applies the ones it can prove, and you apply the rest by hand. |
1511
1511
|**showCopyId**|`boolean`| optional (default: `true`) | Show the copy-record-id button beside the record title. Part of the record chrome — no effect when `recordChrome` is false. |
1512
1512
|**maxVisible**|`integer`| optional | How many header actions render as inline buttons before the rest fold into the overflow menu (renderer default 3). |
1513
1513
|**mobileMaxVisible**|`integer`| optional | The `maxVisible` budget on mobile viewports (renderer default 1). |
0 commit comments