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
console(grid): density / row-height change is saved as a flat top-level rowHeight on the whole served view envelope — the save door drops it with 200 and the density reverts on reload #11625
Clause A2 of records-forms.grid-personalization fails in the ObjectStack 17.7 pre-release checklist run objectstack-ai/objectstack#21782 (framework subject 316be321e, console pin 2e818d0b51ec). An independent verifier (VF3, RUNNER rule 7; live twice, plus code) confirmed it: P2. It predates the 17.6.0 console pin 31971ff1e; no open duplicate was found. Owner: objectui. The server drop is by design, so the fix is client-side. An optional framework follow-up: the save answer could flag discarded undeclared envelope keys.
Reproduction
Stock showcase, admin. Open /_console/apps/com.example.showcase/showcase_task (also reproduced on …/view/showcase_task.grid).
Click "Density: Compact (click to cycle)". It changes to "Comfortable" and rows go from 41 px to 45 px.
Wire: PUT /api/v1/meta/view/showcase_task.default → 200 "Saved customization overlay". The body is the full served item (config{…}, _provenance, scope, _diagnostics) plus a flat "rowHeight":"medium".
Server truth: GET /api/v1/meta/view/showcase_task.default has no rowHeight, either at top level or in config.
Reload in a fresh context. Expected: Comfortable. Actual: "Density: Compact" and 41 px rows.
Control: a PUT with config.rowHeight:"tall" reads back "rowHeight":"tall".
Mechanism
packages/app-shell/src/views/ObjectView.tsx:1181buildPersistedViewBody returns { ...baseViewDef, ...patch } for a view the switcher classes as saved. That is the whole served ViewItem {name, object, viewKind, config:{…}} with rowHeight (set at ObjectView.tsx:2985-2991) spread at the envelope top level instead of into config.
The framework save door stores only the declared keys of a view body (packages/metadata-protocol/src/protocol.ts ~757-765, ADR-0005 appendix (c), #20051 / #20868, pre-17.6.0), so it drops the key.
sort / hiddenFields patches probably share the loss (not driven).
QA-source: objectstack-ai/objectstack#21782 · records-forms.grid-personalization · acceptance[1]
Clause A2 of
records-forms.grid-personalizationfails in the ObjectStack 17.7 pre-release checklist run objectstack-ai/objectstack#21782 (framework subject316be321e, console pin2e818d0b51ec). An independent verifier (VF3, RUNNER rule 7; live twice, plus code) confirmed it: P2. It predates the 17.6.0 console pin31971ff1e; no open duplicate was found. Owner: objectui. The server drop is by design, so the fix is client-side. An optional framework follow-up: the save answer could flag discarded undeclared envelope keys.Reproduction
/_console/apps/com.example.showcase/showcase_task(also reproduced on…/view/showcase_task.grid).PUT /api/v1/meta/view/showcase_task.default→ 200 "Saved customization overlay". The body is the full served item (config{…},_provenance,scope,_diagnostics) plus a flat"rowHeight":"medium".GET /api/v1/meta/view/showcase_task.defaulthas norowHeight, either at top level or inconfig.config.rowHeight:"tall"reads back"rowHeight":"tall".Mechanism
packages/app-shell/src/views/ObjectView.tsx:1181buildPersistedViewBodyreturns{ ...baseViewDef, ...patch }for a view the switcher classes as saved. That is the whole served ViewItem{name, object, viewKind, config:{…}}withrowHeight(set atObjectView.tsx:2985-2991) spread at the envelope top level instead of intoconfig.packages/metadata-protocol/src/protocol.ts~757-765, ADR-0005 appendix (c), #20051 / #20868, pre-17.6.0), so it drops the key.sort/hiddenFieldspatches probably share the loss (not driven).31971ff1e. Nearest precedent: closed Retire the threeKNOWN_BARE_ANY_EXAMPLESrows inskills/objectui/guides/testing.md(:60as any,:208mockClientand itsas any) by teaching the honest test-double idiom #7494 (different, org-wide scope).Done when
The density patch is persisted inside
config, so it survives reload (pinned), for both stock and saved views.Generated by Claude Code