Symptom
Creating a page in Studio never completes. The console issues a PUT whose body contains recordChrome and items; the server strictly rejects that body per ADR-0089 D3a, so no page is ever stored.
- Observed: the create round-trip fails on every attempt; no page row exists afterwards. Reproduced 2×.
- Expected: the create round-trips and the page is persisted.
Root cause
The default page schema the console synthesises carries properties the server's strict validator refuses.
packages/plugin-detail/src/synth/buildDefaultPageSchema.ts — the header synthesiser emits {type: 'page:header', recordChrome: true} (recordChrome: options.recordChrome !== false, ~line 414; the option is declared ~line 141 and threaded again ~line 730). items comes from the same synthesis path (page:tabs.items).
This is NOT a stale bundle — and the emission is pinned
The QA run is pinned to vendored console 09987b68, but the defect was re-verified against objectui origin/main at bb68488 (current at filing time), where the same emission is still present. Additionally:
packages/plugin-detail/src/synth/__tests__/buildDefaultPageSchema.test.ts pins the emitted shape: expect(node).toEqual({ type: 'page:header', recordChrome: true }) (~line 677), plus page:header.recordChrome defaults to true and can be turned off (~line 240).
⚠️Whoever fixes this must change BOTH sides — the emitted shape AND the pin that currently locks it in place. A fixer who changes only one side will go red: change the emitter alone and the pin fails; change the pin alone and the server still rejects the PUT. Budget for both in the same change.
One more constraint on the fix shape: page:header.recordChrome is a declared registry property — packages/components/src/renderers/layout/containers.tsx declares it ({ name: 'recordChrome', type: 'boolean', ... defaultValue: true }, ~line 1644) and consumes it (~lines 1036 / 1510), and the spec-parity pin apps/console/src/__tests__/registry-inputs-spec-parity.test.ts lists ['page:header', 'recordChrome'] (~line 687). So the real decision is whether the property is stripped from the create payload or accepted by the server, not simply deleted from the renderer.
Reproduction
Framework a86db175, vendored console 09987b68, showcase app, admin session.
- Open Studio and create a page bound to an object (the create path seeds
regions from buildDefaultPageSchema(objectDef)). - Save.
Observed: the console PUTs a body containing recordChrome and items; the server rejects it strictly (ADR-0089 D3a); no page is stored. Reproduced 2×.
Dedup
Searched objectstack-ai/objectui for buildDefaultPageSchema, recordChrome, and Studio page-save/strict-rejection symptoms — no open or closed duplicate found.
Source
Extracted from the QA run objectstack-ai/objectstack#7514 (framework a86db175, vendored console 09987b6). Root-cause re-verification is against objectui origin/main @ bb68488.
Symptom
Creating a page in Studio never completes. The console issues a
PUTwhose body containsrecordChromeanditems; the server strictly rejects that body per ADR-0089 D3a, so no page is ever stored.Root cause
The default page schema the console synthesises carries properties the server's strict validator refuses.
packages/plugin-detail/src/synth/buildDefaultPageSchema.ts— the header synthesiser emits{type: 'page:header', recordChrome: true}(recordChrome: options.recordChrome !== false, ~line 414; the option is declared ~line 141 and threaded again ~line 730).itemscomes from the same synthesis path (page:tabs.items).This is NOT a stale bundle — and the emission is pinned
The QA run is pinned to vendored console
09987b68, but the defect was re-verified against objectuiorigin/mainatbb68488(current at filing time), where the same emission is still present. Additionally:packages/plugin-detail/src/synth/__tests__/buildDefaultPageSchema.test.tspins the emitted shape:expect(node).toEqual({ type: 'page:header', recordChrome: true })(~line 677), pluspage:header.recordChrome defaults to true and can be turned off(~line 240).One more constraint on the fix shape:
page:header.recordChromeis a declared registry property —packages/components/src/renderers/layout/containers.tsxdeclares it ({ name: 'recordChrome', type: 'boolean', ... defaultValue: true }, ~line 1644) and consumes it (~lines 1036 / 1510), and the spec-parity pinapps/console/src/__tests__/registry-inputs-spec-parity.test.tslists['page:header', 'recordChrome'](~line 687). So the real decision is whether the property is stripped from the create payload or accepted by the server, not simply deleted from the renderer.Reproduction
Framework
a86db175, vendored console09987b68, showcase app, admin session.regionsfrombuildDefaultPageSchema(objectDef)).Observed: the console PUTs a body containing
recordChromeanditems; the server rejects it strictly (ADR-0089 D3a); no page is stored. Reproduced 2×.Dedup
Searched objectstack-ai/objectui for
buildDefaultPageSchema,recordChrome, and Studio page-save/strict-rejection symptoms — no open or closed duplicate found.Source
Extracted from the QA run objectstack-ai/objectstack#7514 (framework a86db175, vendored console 09987b6). Root-cause re-verification is against objectui
origin/main@bb68488.