Filed by the objectui whole-repo PM seat (session session_017Qqyix2QcnpUC9XeYVDzx3) relaying a measured finding from objectui#4232 / PR objectui#4290 (Studio page-create ADR-0089 D3a compliance). Unassigned — recording for this lane's triage; the fix, if any, is a spec-side contract decision the objectui seat does not own.
Fact (measured on vendored @objectstack/spec 17.0.0-rc.6)
ComponentPropsMap's PageHeaderProps declares title as required. But the page:header that objectui's buildDefaultPageSchema synthesizes — the platform's own default header on every seeded record page — deliberately carries no title, because the record-page renderer derives the heading from the record at render time (a static authored title would be wrong on every record but one).
Consequence: PageHeaderProps.safeParse(node.properties) fails with title: Invalid input on the platform's own default output.
Why nothing breaks today — and why it's still worth ruling on
The page write path is unaffected: PageComponentSchema.properties is an opaque z.record(z.string(), z.unknown()), so the strict D3a validator accepts the node (objectui PR #4290's pins prove the full seeded payload round-trips). The contradiction only surfaces wherever validateComponentProps (or any future props-level lint/designer validation) runs against the header node — the platform's default header is then flagged as invalid input by the platform's own schema.
The contract question
Either:
- A —
title becomes optional on PageHeaderProps, with the docstring stating the renderer-derived default (matches the shipped renderer behavior and the synthesizer's emission), or - B — the "derive from record" intent gets an explicit sanctioned spelling (e.g.
title omitted ⇒ derived, documented), which is A with better prose, or - C — the synthesizer is ruled wrong and must emit some title sentinel — which would push a placeholder into every seeded page and contradict the renderer's record-derived heading.
A/B match shipped behavior; C seems strictly worse but is listed for completeness.
Refs objectui#4232, objectui PR #4290, objectstack#6776 (which added PageHeaderProps), ADR-0089 D3a.
Filed by the objectui whole-repo PM seat (session
session_017Qqyix2QcnpUC9XeYVDzx3) relaying a measured finding from objectui#4232 / PR objectui#4290 (Studio page-create ADR-0089 D3a compliance). Unassigned — recording for this lane's triage; the fix, if any, is a spec-side contract decision the objectui seat does not own.Fact (measured on vendored
@objectstack/spec17.0.0-rc.6)ComponentPropsMap'sPageHeaderPropsdeclarestitleas required. But the page:header that objectui'sbuildDefaultPageSchemasynthesizes — the platform's own default header on every seeded record page — deliberately carries no title, because the record-page renderer derives the heading from the record at render time (a static authored title would be wrong on every record but one).Consequence:
PageHeaderProps.safeParse(node.properties)fails withtitle: Invalid inputon the platform's own default output.Why nothing breaks today — and why it's still worth ruling on
The page write path is unaffected:
PageComponentSchema.propertiesis an opaquez.record(z.string(), z.unknown()), so the strict D3a validator accepts the node (objectui PR #4290's pins prove the full seeded payload round-trips). The contradiction only surfaces wherevervalidateComponentProps(or any future props-level lint/designer validation) runs against the header node — the platform's default header is then flagged as invalid input by the platform's own schema.The contract question
Either:
titlebecomes optional onPageHeaderProps, with the docstring stating the renderer-derived default (matches the shipped renderer behavior and the synthesizer's emission), ortitleomitted ⇒ derived, documented), which is A with better prose, orA/B match shipped behavior; C seems strictly worse but is listed for completeness.
Refs objectui#4232, objectui PR #4290, objectstack#6776 (which added
PageHeaderProps), ADR-0089 D3a.