Repository navigation
feat(plugin-form,types,app-shell)!: object-form.layout is vertical | horizontal on every face — delivers objectui#7759 group C (objectui#11168 slice 3) - #11351
Conversation
…horizontal on every face — delivers objectui#7759 group C (objectui#11168 slice 3) `@objectstack/spec` 17.5.0 retired `inline` and `grid` from the form layout enum (objectstack#20221). The authored `object-form` arm, which reads the row by reference, already refused both; every other face still published them. Measured through the real SchemaRenderer at the base, `inline` / `grid` / absent rendered byte-identical to `vertical` on the simple, tabbed, wizard and split layouts, with `horizontal` as the lit control, and the `form` renderer drew `grid` as `vertical` (it reads only `layout === 'horizontal'`). Narrowed: the `object-form` registration input; `ObjectFormSchema.layout` (TS and zod, the row's enum by reference); the `FormSchema` zod mirror (`grid`, whose WiderThanDeclared row resolves and is struck, header figures 4/4/4 -> 3/3/3); the designer's two options and their en/zh labels. The folds that mapped the retired values to `vertical` (ObjectForm simple/drawer/modal, DrawerForm, ModalForm) are retired; an absent layout still draws as vertical. OFF_SPEC_ARM_EXEMPTIONS is empty again: refusedArms 1 -> 0, owner 8 -> 7. Claude-Session: https://claude.ai/code/session_01VhxTqosz7wn54ahqyxgERT Co-authored-by: Claude <noreply@anthropic.com>
|
changeset-claim-re-read
|
✅ Console Performance Budget
The eager closure is every chunk the entry reaches through static imports — what the browser fetches and parses before the app renders. The entry chunk on its own is a small fraction of it. 📦 Bundle Size Report
Size Limits
|
Contract reviewServed-tier: Scope: PR #11351 (slice 3, PR B of objectui#11168; delivers objectui#7759 group C) at the head above, judged from the card's body and comments, the PR body, its 17-file list and the net diff against ① Derived judgmentsThe narrowing, face by face — each RIGHT.
The measurement premise — RIGHT, on two legs. (a) By code, not only by probe: at the base every The drawer / modal rows, declared NOT MEASURED with The five folds retired — what a stored The guard ledger — census-true for this PR alone. Changesets. Three new bodies. The Docs. ② Semver level
③ Boundary flagsDev flags on PR B, each answered.
Reviewer findings — none moves the contract; each is booked with its fix.
CI on the head, read last at 2026-10-01T07:02Z: 43 check-runs, all completed — 40 success, 3 skipped by design (two coverage shards and Implemented-by: VERDICT: PASS Rendered 2026-10-01T07:05Z by the isolated at-tier reviewer running inside the seat session named above. |
…jectui#11168 slice 3, round 3) origin/main db0beb2: PR B (#11351, 17dc167), objectui#11331 (bef9f20) and #11337 (db0beb2). Two conflicts, both resolved by measurement: - apps/console registry-inputs-spec-parity.test.ts: the per-owner total. Census of the merged ledgers: unjudgedBlocks 2 (object-gantt, object-timeline), offSpecInputs 0, unpublishedKeys 3, refusedArms 0 (B emptied the map), memberPins 0, so objectui#11168 owns 5; 8652 and 8649 stay 0. Neither side's 6 or 7. - packages/app-shell i18n.ts (en and zh): B's deletions of option.layout.inline / grid kept, with this branch's reworded object-form.columns row. Claude-Session: https://claude.ai/code/session_01VhxTqosz7wn54ahqyxgERT Co-authored-by: Claude <noreply@anthropic.com>
Refs #11168
Refs #7759
Clause-②: no (narrowing). Nothing widens.
object-form.layoutlosesinline/gridon the registration, on bothObjectFormSchemafaces and in the designer, and theformnode's zodFormSchema.layoutlosesgrid. The fixed group ships it asminor. (The claim's line readsyesfor slice 3 as a whole; that answer lives on the lazy-blocks PR, objectui#11335,yes (narrowing). This PR widens nothing, so it carries theno (narrowing)arm.)This PR delivers objectui#7759 group C, as objectui#11168 slice 3 part 2 of 2. It was split from objectui#11335 at the PM seat's boundary. The direction was settled before dispatch (triage
5863068721): narrow objectui'slayoutmirror tovertical | horizontal, following the spec, with no alias and no fold.@objectstack/spec17.5.0 retiredinline/grid(objectstack#20221), and the installed row refuses both withinvalid_valueatlayout.Measured at this base (
5262f7dd3), before any editThe probe ran through the real
SchemaRenderer, normalisedbody.innerHTML(ids, React ids, Radix ids,data-state), on anobject-formwithmode: 'create':grid==verticalinline==verticalverticalhorizontal==vertical(lit control)formrenderer drawsgridexactly as it drawsvertical(justify-start, the same markup length).horizontalgivesjustify-end. The renderer reads onlylayout === 'horizontal'.drawer/modal: NOT MEASURED in this harness. The lit control did not fire there (evenhorizontalmatchedvertical, because the overlay body is not mounted by that probe), so those two rows prove nothing. The earlier record5855353651covers them; I did not re-derive it here.objectui validatealready refusedproperties.layoutinline/gridon an authoredobject-form, withinvalid_valueatproperties.layout. The bag arm reads the spec row by reference, andhorizontalwas the lit control. The acceptance row held at the base.ObjectFormSchemamirror accepted all four values.FormSchemaacceptedgrid.layout: 'inline' / 'grid'only on other schemas (detail-view, filter-ui, AI, record highlights). The designer'sobject-forminspector OFFERED both values.What narrows (the objectui#7759 group C surface, item by item)
ObjectFormSchema.layout, both faces. It is the row's own enum by reference:SpecObjectFormProps['layout']on the TS face andstripImportedDefaults(SpecObjectFormPropsSchema).shape.layouton the zod face.ObjectViewSchema.formpicks the key, so it narrows with it.columnsloses its "for grid layout" wording: it sets the field grid's width, whatever thelayout.FormSchemamirror dropsgrid. ItsWiderThanDeclaredrow (form.zod.ts#FormSchema::layout, CONCRETE) resolves and is struck, together with itsWIDER_ARMSrow. The header figures, re-derived: 4 / 4 / 4 — 2 / 2 / 0 / 0 became 3 / 3 / 3 — 2 / 1 / 0 / 0, with a dated history line.zod-mirror-parity.test.tsreconciles the figures (green) and tsc compiles the ledger (green).object-formregistrationinputs:layoutis['vertical', 'horizontal'], now with a description.block-config.tsno longer offersinline/grid. Their two labels (en, zh) are removed, andcheck:i18n-designer-paritystays green.vertical. The folds are retired, mechanically and only inplugin-form, at five sites:ObjectForm(simple, drawer, modal),DrawerFormandModalForm.layoutnow passes through, and an absentlayoutstill draws asvertical(pinned).plugin-view.mdxlisted the four values forform.layoutand now lists two.schema-reference.mdalready said they were retired, and theplugin-formREADME already saidvertical | horizontal.Ledger (registry parity guard)
OFF_SPEC_ARM_EXEMPTIONSis EMPTY again:object-form.layout:enumis struck andrefusedArmsgoes 1 → 0. The owner count forobjectui#11168goes 8 → 7 on this base.mainand re-derives that line and the cap comment.Pin
packages/plugin-form/src/__tests__/objectFormLayout-11168.test.tsxholds 10 rows plus compile-time rows checked bytsc -p tsconfig.test.json:objectui validaterefusesinlineandgrid, with the two live values as the lit control);layout;FormSchemaagainst theformregistration;@ts-expect-erroron both retired values;layoutrendering byte-identical tovertical, withhorizontalas the lit control.Ablations (predictions written first; every leg restored, blob == HEAD,
git diff HEADempty)gridback in the registration enumObjectFormSchema.layoutback to the four valuesWiderThanDeclaredreconciliationWiderLedgerMismatchandWiderLedgerKeyDriftinzod-mirror-parity.test.tsGates (at
ea40d40cd)packages/types: 308 files, 7804 passed.packages/plugin-form: 158 files, 1832 passed, 1 skipped.packages/plugin-view+ the guard +components/src/renderers/form: 133 files, 1298 passed, 17 skipped.app-shelldesigner previews: 95 files, 1219 passed.os-verify-lock, each with VERDICT command-exit 0.types,plugin-form,app-shell,plugin-viewandconsoleall exit 0, after building@object-ui/console^...(34 tasks).check-governed-queue-guard --teston the 17 changed paths: NOT GOVERNED.eslint --format jsonover the 12 touched TS files gives 0 errors and 0 warnings on an added line.eslint.config.jshas noparserOptions.project/projectService, so the linting is not type-aware and untouched files cannot move.Changesets
11168-object-form-layout-two-values(plugin-formminor),11168-types-form-layout-mirrors(typesminor) and11168-designer-form-layout-options(app-shellpatch).10859-object-form-properties-bag.mdships in the same release and listslayoutamong the places the bag and the flat mirror differ. That is no longer true, so the file gets a dated, append-only note; its frontmatter is byte-identical.Session:
https://claude.ai/code/session_01VhxTqosz7wn54ahqyxgERT(dispatched by thedomain:spec @ objectuiseat).Generated by Claude Code