Uh oh!
There was an error while loading. Please reload this page.
feat(types)!: ObjectFormSection drops the inert className/gridClassName members (objectstack#13626 remainder) - #7278
Merged
yinlianghui merged 1 commit intoSep 2, 2026
Conversation
…me members
objectstack#13626 (maintainer ruling 2026-09-01: "retire the reads ... Declaring
the keys was weighed and not adopted") removed every renderer read of the two
keys off an authored form-view section, but `ObjectFormSection` in
@object-ui/types still declared both with doc comments promising an effect
nothing delivered. Remove the members so the authored-metadata type agrees with
the spec's strict FormSectionSchema, which declares neither.
- packages/types/src/objectql.ts: drop the two members + JSDoc; leave a
deliberate-omission note naming the ruling and the two pins.
- packages/types/src/__tests__/object-form-section-style-keys-undeclared.test.ts:
compile-time pin (`@ts-expect-error` on annotated literals, a directive-free
contrast row, and a `Record<keyof ObjectFormSection, true>` census).
- packages/plugin-form fixture sectionStyleKeysRetired-13626.test.tsx: keeps
authoring both keys, now through a fixture type widened at its boundary
(`ObjectFormSection & { className; gridClassName }`); header reworded.
- ObjectForm.tsx comment and plugin-form README: the "still declares both keys"
sentences were made false by the removal; reworded.
- changeset: @object-ui/types minor, breaking semantics in the body.
The five per-layout section config types in plugin-form keep their members
(read uncast for programmatic mounts). No zod mirror exists for
ObjectFormSection (ObjectFormSchema in zod/objectql.zod.ts declares no
`sections`), so a `?: never` tombstone has no parse door and was not used.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01V3hPr7riucnMfhcHY86MsdContributor
✅ 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
|
yinlianghui
marked this pull request as ready for review
September 2, 2026 03:08
Uh oh!
There was an error while loading. Please reload this page.
yinlianghui
deleted the
claude/issue-7200-object-form-section-inert-style-keys
branch
September 2, 2026 03:23
This was referenced Sep 2, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for freeto join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Fixes#7200
Clause-② contract-review tier (narrows a published
@object-ui/typessurface): parks as draft withneeds:contract-reviewfor the spec@objectui seat's in-seat review. Do not flip ready.What was removed
ObjectFormSection(packages/types/src/objectql.ts) no longer declaresclassNameorgridClassName; both members and their JSDoc are gone, replaced by a deliberate-omission note naming the ruling and the two pins. This is the declared-but-inert remainder of objectstack#13626 (maintainer 2026-09-01, director batch C, verbatim): "retire the reads … Declaring the keys was weighed and not adopted: it would formally invite free Tailwind strings into authored metadata, the exact class the boundary exists to keep out." The authored-metadata type now agrees with the spec's strictFormSectionSchema, which declares neither key.Premise re-verified on
64d624dbefore editing: both members atobjectql.ts:1132/1138; zero read sites of either viaObjectFormSection(control:columnsreads still hit in ObjectForm/ModalForm/SplitForm/TabbedForm);git grep gridClassName -- packages/types/src/zod= 0; a structural sweep over everysections: [literal in packages/apps/examples/content/skills found none carrying either key; last touch ofobjectql.tson main is still03380aa(#7109).Why a deletion, not a
?: nevertombstoneObjectFormSectionhas no zod mirror at all:ObjectFormSchemainzod/objectql.zod.ts(a.passthrough()BaseSchema.extend) does not declaresections, so there is no parse door to attach a refusal to and no runtime refusal pin is possible. The ruling's rationale is specifically "do not declare", and a tombstone is still a declaration in completion and in the published.d.ts.Why the five per-layout types stay
ModalFormSectionConfig,SplitFormSectionConfig, TabbedForm'sFormSectionConfig,WizardStepConfig,DrawerFormSectionConfigkeepclassName/gridClassNameuntouched (members and JSDoc): their renderers read them uncast (ModalForm.tsx:668/697,SplitForm.tsx:414,TabbedForm.tsx:469,WizardForm.tsx:1025) for programmatic React mounts, which the authorable boundary does not govern.ObjectFormrebuildssectionskey by key and copies neither key, so the authored path stays sealed. No read of either key was reintroduced; the #7198 behavioural pin is not weakened.The pin and its ablation
New
packages/types/src/__tests__/object-form-section-style-keys-undeclared.test.ts.ObjectFormSectioncarries no index signature and extends nothing (checked), so akeyofpin is not vacuous; the file uses both shapes:@ts-expect-erroron annotated literals carrying each key (excess-property refusal at the authoring site), a directive-free contrast row authoring every live key, and aRecord<keyof ObjectFormSection, true>census that fails in both directions. The package type-checks its tests viatsconfig.test.json, so the directives are real enforcement.Ablation, direction predicted before running (RED: two
TS2578+ one census error, nothing else). Mutation = re-insert the two members intoobjectql.ts; landing proven bygrep -c 'ABLATION-7200'= 2 andgrep -c 'gridClassName?: string'0 → 1,git diff --stat HEAD= 1 file, +5.tsc -p tsconfig.test.jsonon the mutated tree:Observed direction = predicted. Restore via
git checkout HEAD -- ABSOLUTE_PATH(trap on EXIT INT TERM, absolute path), proven bygit diff HEAD --statempty andgit hash-object= HEAD blob1b57cd5…(non-empty, matching); marker count after restore 0. No dist involved: the pin imports../objectqlfrom source.Fixture (#7198 pin) — keeps authoring the keys
sectionStyleKeysRetired-13626.test.tsxstill authors both keys on every section; the literal is now typedObjectFormSection & { className: string; gridClassName: string }, widened at the fixture boundary only, with a comment saying why deleting the keys would make every row pass for free. Header paragraph reworded ("still declares" was made false). Same rewording inObjectForm.tsx(the comment at the tabbed arm) andpackages/plugin-form/README.md("Section styling is not authorable" + the contributor note).content/docs: zerogridClassName, theplugin-form.mdxmentions are field-levelclassNameand unaffected — untouched.Consumer-package readings (all at
1f3f33f, dependency closure built first)Importers of
ObjectFormSectionacrosspackages/*/srcandapps/*/src:plugin-form(constructs,fieldGroups.ts),types,console(comment-only in one test).plugin-designerdoes not import it.@object-ui/typestype-check(tsc --noEmit && tsc -p tsconfig.examples.json && tsc -p tsconfig.test.json): exit 0, script name echoed.@object-ui/plugin-formtype-check(tsc --noEmit && tsc -p tsconfig.test.json): exit 0, script name echoed.@object-ui/consoletype-check: first run exit 2 was aTS2882unbuilt-plugin precondition (not a verdict); afterpnpm --filter '@object-ui/console^...' build(BUILD_EXIT=0) it isTC_EXIT=0.pnpm exec vitest run --maxWorkers=2 packages/types/(repo root):Test Files 85 passed (85),Tests 1067 passed (1067).pnpm exec vitest run --maxWorkers=2 packages/plugin-form/(repo root):Test Files 81 passed (81),Tests 821 passed | 8 skipped (829)— includes the 7-arm #13626 pin.packages/types/dist/objectql.d.ts:gridClassNamecount 0; controlcolumnsin theObjectFormSectionblock = 1.Gates (real judgement lines)
check-changeset-presence: "✅ 3 source file(s) of 2 released package(s) changed, and this change declares 1 changeset(s)".check-changeset-no-major: "✅ No changeset declares amajorbump."check-changeset-fixed: "✅ All workspace packages are in the changeset fixed group."check-changeset-overwrite: "✅ No pre-existing changeset was modified or deleted."check:spec-symbols: "✅ spec symbol derivation: 1333 files scanned against 4959 spec export names; 16 declared dialects, 0 untriaged collisions".check:control-bytes: "✅ check-control-bytes: OK (scanned 6004 tracked text file(s))".--no-inline-config) on the four edited.ts/.tsxfiles: 0 errors (72 pre-existingno-explicit-anywarnings inobjectql.ts, none on touched lines).check:doc-snippets: not owed for this diff (no covered snippet types a section literal); ran anyway — see the issue report for the final reading.Changeset:
@object-ui/typesminorwith the breaking semantics in the body (fixed-group rule; nevermajor).🤖 Generated with Claude Code
https://claude.ai/code/session_01V3hPr7riucnMfhcHY86Msd
Generated by Claude Code
Generated by Claude Code