Observation only, filed unassigned and not queued — surfaced while implementing the objectstack#13626 ruling (PR #7198). Not graded here.
The shape
objectstack#13626 (maintainer ruling 2026-09-01, director decision batch C: retire the reads) removed all seven as any reads of className / gridClassName off the form-view section family, on the grounds that @objectstack/spec deliberately does not declare either key on the form-view/section authorable surface.
ObjectFormSection in @object-ui/types (packages/types/src/objectql.ts) still declares both keys, with doc comments describing an effect they no longer have:
/** * Custom CSS class for the section's wrapper (Card, when the form variant * renders sections as cards; the divider header, for the flat/simple path). */
className?: string;/** * Custom CSS class for the section's field grid. Only used by form variants * that render sections as Card chrome (Modal/Split/Tabbed/Wizard). */
gridClassName?: string;
ObjectFormSchema.sections is typed ObjectFormSection[], so this is the type an author's section metadata is checked against. After #7198 an author can write either key, have it type-check, read a doc comment promising a wrapper class — and get nothing.
That is the mirror image of the original finding rather than its resolution: objectstack#13626 was "not declared on one side, consumed on the other"; what remains is "declared on one side, consumed nowhere" — the declared-but-inert shape of the enforce-or-remove class.
Why it was left alone in #7198
Deliberately out of scope, not overlooked:
- The ruling's action was specifically the cast reads. Removing two members from a published type in
@object-ui/types is a different action against a different surface, and the maintainer weighed three routes (retire the reads / declare the keys / write the status quo down) — not this fourth one. - The declarations are not fully dead. The per-layout section types (
ModalFormSectionConfig, TabbedForm's FormSectionConfig, SplitFormSectionConfig, DrawerFormSectionConfig, WizardStepConfig) declare their own copies and their components still consume them — ModalForm.tsx:668, TabbedForm.tsx:469, SplitForm.tsx:414, WizardForm.tsx:1025 — for programmatic React mounts, which the authorable boundary does not govern. Only the ObjectFormSection (authored-metadata) declaration is now inert.
Why it is worth recording
The live consequence is small but real, and it is the exact hazard that makes the #7198 pin behavioural rather than a source grep:
Because the keys are still declared, restoring consumption needs no cast. A later "cleanup" writing a plain className: s.className type-checks and silently puts the retired read back. packages/plugin-form/src/__tests__/sectionStyleKeysRetired-13626.test.tsx is what catches that; the type system will not.
The question, not answered here
Should ObjectFormSection drop the two members (making the authored-metadata type agree with the authorable boundary, at the cost of a breaking type change to @object-ui/types and a doc pass over the per-layout section types), or keep them with doc comments corrected to say they are inert for authored metadata and honoured only on direct programmatic mounts?
Refs: objectstack#13626 (the ruling) · #7198 (the implementation) · packages/types/src/objectql.ts · packages/plugin-form/README.md "Section styling is not authorable"
Observation only, filed unassigned and not queued — surfaced while implementing the objectstack#13626 ruling (PR #7198). Not graded here.
The shape
objectstack#13626 (maintainer ruling 2026-09-01, director decision batch C: retire the reads) removed all seven
as anyreads ofclassName/gridClassNameoff the form-view section family, on the grounds that@objectstack/specdeliberately does not declare either key on the form-view/section authorable surface.ObjectFormSectionin@object-ui/types(packages/types/src/objectql.ts) still declares both keys, with doc comments describing an effect they no longer have:ObjectFormSchema.sectionsis typedObjectFormSection[], so this is the type an author's section metadata is checked against. After #7198 an author can write either key, have it type-check, read a doc comment promising a wrapper class — and get nothing.That is the mirror image of the original finding rather than its resolution: objectstack#13626 was "not declared on one side, consumed on the other"; what remains is "declared on one side, consumed nowhere" — the declared-but-inert shape of the enforce-or-remove class.
Why it was left alone in #7198
Deliberately out of scope, not overlooked:
@object-ui/typesis a different action against a different surface, and the maintainer weighed three routes (retire the reads / declare the keys / write the status quo down) — not this fourth one.ModalFormSectionConfig,TabbedForm'sFormSectionConfig,SplitFormSectionConfig,DrawerFormSectionConfig,WizardStepConfig) declare their own copies and their components still consume them —ModalForm.tsx:668,TabbedForm.tsx:469,SplitForm.tsx:414,WizardForm.tsx:1025— for programmatic React mounts, which the authorable boundary does not govern. Only theObjectFormSection(authored-metadata) declaration is now inert.Why it is worth recording
The live consequence is small but real, and it is the exact hazard that makes the #7198 pin behavioural rather than a source grep:
The question, not answered here
Should
ObjectFormSectiondrop the two members (making the authored-metadata type agree with the authorable boundary, at the cost of a breaking type change to@object-ui/typesand a doc pass over the per-layout section types), or keep them with doc comments corrected to say they are inert for authored metadata and honoured only on direct programmatic mounts?Refs: objectstack#13626 (the ruling) · #7198 (the implementation) ·
packages/types/src/objectql.ts·packages/plugin-form/README.md"Section styling is not authorable"