|
| 1 | +--- |
| 2 | +"@objectstack/spec": minor |
| 3 | +--- |
| 4 | + |
| 5 | +fix(spec): `PageHeaderProps.title` is optional — matches the platform's own synthesized header (#7702) |
| 6 | + |
| 7 | +`PageHeaderProps.title` was declared **required**, but the platform's own |
| 8 | +synthesizer (objectui `buildDefaultHeader`) emits every seeded `page:header` |
| 9 | +with **no `title` at all** — `{ type: 'page:header', recordChrome, …actions }`. |
| 10 | +`PageHeaderRenderer` (`containers.tsx`) reads |
| 11 | +`schema?.title ?? schema?.properties?.title` and, finding neither, falls |
| 12 | +through to the record chip's own record-derived heading: a static authored |
| 13 | +title would be wrong on every record but one. `PageHeaderProps.safeParse` |
| 14 | +therefore rejected the platform's own canonical output with `title: Invalid |
| 15 | +input` — invisible on the write path today (`PageComponent.properties` is an |
| 16 | +opaque `z.record`), but a standing contradiction that surfaces the moment any |
| 17 | +props-level validation runs against a header node (`validateComponentProps`, |
| 18 | +#5068, is exactly that consumer). |
| 19 | + |
| 20 | +Maintainer ruling 2026-08-11 (accepting the spec lane's A/B recommendation, |
| 21 | +rejecting a sentinel-value option C): `title` becomes optional, and its |
| 22 | +describe states the sanctioned spelling — **title omitted ⇒ the renderer |
| 23 | +derives the heading from the record**. Authors still set it explicitly on |
| 24 | +non-record pages (dashboards, landing pages) where there is no record to |
| 25 | +derive a heading from. |
| 26 | + |
| 27 | +This is a widening change: every payload that validated before (with `title`) |
| 28 | +still validates identically, and `title`, when present, still parses as |
| 29 | +`I18nLabelSchema` exactly as before. The only newly-accepted shape is a |
| 30 | +`page:header` with `title` omitted — the platform's own default. Minor, not |
| 31 | +patch, because the accepted-input surface grows. |
0 commit comments