feat(types,components)!: retire data-table selectionStyle and chatbot floatingConfig on both faces, file data-table's inline-edit flags by name (objectui#6152, round 5) - #11320
Conversation
… floatingConfig, file editable/singleClickEdit by name (objectui#6152, round 5) Round 5 of objectui#6152, on the seat's three answers to round 4's open questions (seat review 5921390451): - DataTableSchema.editable / singleClickEdit (B): filed by name on RuntimeOnlyNamedAllowList as host-paired flags ObjectGrid sets in code; data-table.mdx stops teaching them on an authored node. - DataTableSchema.selectionStyle (B): retired on both faces (a `?: never` tombstone and a retirementTombstone arm); the hover-only checkbox branch in the data-table renderer is dropped. - ChatbotSchema.floatingConfig (A): retired on the base chatbot face on both faces. ChatbotFloatingSchema never inherited it (it picks the shared keys and declares its own member), so no re-declaration was needed. UnmirroredDeclared 6 / 20 -> 5 / 16 (3 / 14 spec-derived, 2 / 2 local: the two displayMode entries kept by decision under objectui#7654 ruling B). Claude-Session: https://claude.ai/code/session_01TdiauJaVCHuj45EzZGUxHh Co-authored-by: Claude <noreply@anthropic.com>
…e two unmirrored ledgers are disjoint (objectui#6152, round 5) Round 5 emptied DataTableSchema's UnmirroredDeclared entry, the last pair in both unmirrored ledgers, so their intersection is now genuinely empty and the header's shared figure reads 0. The leg that asserted a non-empty intersection would have forced a key back onto a ledger. It is replaced by a lit control on the same reader: KnownDrift shares a pair with each unmirrored ledger, so a 0 intersection is a reading and not a name-normalisation artefact. Claude-Session: https://claude.ai/code/session_01TdiauJaVCHuj45EzZGUxHh Co-authored-by: Claude <noreply@anthropic.com>
…ssue-6152-unmirrored-round5
…ssue-6152-unmirrored-round5
|
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
|
Refs #6152
Clause-②: yes (narrowing).
selectionStyleand the base-facefloatingConfigretire on both faces, andeditable/singleClickEditleave the authored docs, under the startup no-gradualism rule. It is priced in the changeset.Round 5 of objectui#6152, dispatched under claim
5923137359(domain:devxseat 2, sessionsession_01TdiauJaVCHuj45EzZGUxHh, on the maintainer's direct order). The rulings are the seat review5921390451: its three answers to round 4's open questions. ⛔ This is a draft from a dispatched dev: do not mark it ready and do not enable auto-merge. The card stays open:ObjectGridSchema's keys and the spec-derived pairs (objectui#2231) are not this round's.What changed
DataTableSchema.editable/singleClickEdit: answer 1, B. Both keys are filed by name onRuntimeOnlyNamedAllowList, each with its reason, under round 4's class rule: a key a host produces in code and no document authors (theshowAddRowprecedent). No declaration moved.content/docs/components/complex/data-table.mdxno longer teaches them on an authored node. The interface block drops them, and theeditable: trueexample becomes an "Inline editing" section. That section says the capability is host-paired: the table only stages an edit, andobject-gridsets both keys on the table it builds and supplies the save path. It points a document author atobject-grid. The two members' doc comments say the same.DataTableSchema.selectionStyle: answer 2, B. It is retired on both faces: a?: nevertombstone ondata-display.ts, and aretirementTombstone()onzod/data-display.zod.tswhose message says to delete the key and thatselectablealone turns selection on. The hover-only checkbox branch inpackages/components/src/renderers/complex/data-table.tsxis dropped, so the'always'behaviour is the only one.ChatbotSchema.floatingConfig: answer 3, A. It is retired on thechatbotface only:?: neveroncomplex.tsand aretirementTombstone()onzod/complex.zod.ts, whose message namestype: "chatbot-floating".ChatbotFloatingSchemadoes NOT inherit the base member. Its TS face isBaseSchemaplusPickofChatbotSchemaoverChatbotSharedKeyandmaxToolRoundtrips, plus its ownfloatingConfigmember. Its zod twin isBaseSchema.extendwith the shared pick spread and its ownfloatingConfigarm. So the floating registration's declaration, mirrored in round 4, was already separate on both faces and is untouched.ChatbotSchemais aBaseSchemacarrier, where a deleted member reads asanythrough the index signature. The discriminator is cited, not restated, sotombstone-discriminator-agreement-9684.test.tsstill counts four statements.floating-chatbot-trigger-icon-retired.test.tsis flipped, not deleted. On achatbotnode it now asserts the refusal of the wholefloatingConfigkey on both faces, a live config included, with a no-floatingConfigcontrol.chatbot-registration-authoring-faces-7655.test.ts's type pins follow.zod-mirror-parity.test.ts: theUnmirroredDeclared,RuntimeOnlyDeclaredandRuntimeOnlyNamedAllowListblocks, and every prose total reconciled to the parser count. One non-vacuity leg was reshaped; see the acceptance notes.content/docs/plugins/plugin-chatbot.mdxno longer saysfloatingConfigtype-checks and parses on achatbotnode..changeset/6152-unmirrored-round5.mdbumps@object-ui/typesand@object-ui/componentsto minor, with the break stated. Three pending entries that this round makes false get dated, append-only**Correction, 2026-10-01**notes, with frontmatter and every prior line intact:6152-unmirrored-round4.md,7654-floating-chatbot-trigger-icon-tombstone.mdand7655-chatbot-registration-authoring-faces.md.Per key
editabledata-tableboolean), doc comment notes the pairingsingleClickEditdata-tableboolean), doc comment notes the pairingselectionStyledata-table?: neverretirementTombstone()floatingConfigchatbot?: neverretirementTombstone()plugin-chatbot.mdxcorrectedfloatingConfigchatbot-floatingLedger totals, by TypeScript-parser count of
zod-mirror-parity.test.ts3d09948c1b5767KnownDriftUnmirroredDeclaredRuntimeOnlyDeclaredRuntimeOnlyNamedAllowListWiderThanDeclaredMirroredUndeclareddisplayModeonChatbotSchemaand onChatbotFloatingSchema. Under objectui#7654 maintainer ruling B, kept by round 4's Q3 B, their refusal stays TypeScript-only: stored designer documents carrydisplayMode: 'floating'. So they stay inUnmirroredDeclaredby decision, not as mirroring debt. The ledger prose says so, and the non-vacuity pin "the LOCAL half read as EMPTY" still holds. After this round,UnmirroredDeclaredholds only the spec-derived 3 / 14 (objectui#2231) and those two decided entries.What was measured, before editing (base
3d09948)packages/*/srcandapps/*/src, 5585 files.ChatbotSchema.floatingConfig: 0 reads, 0 producers, 1 test producer (the tripwire).ChatbotFloatingSchema.floatingConfig: 1 read (the floating registration).DataTableSchema.selectionStyle: 1 read (thedata-tabledestructure) and 0 producers.editable/singleClickEdit: 1 read each (the destructure) and 1 producer each (ObjectGrid).ChatbotSchema.messages3 reads,maxHeight2,DataTableSchema.columns2 reads and 2 producers.type.data-table:selectionStyle0, andeditable/singleClickEdit1 each, bothObjectGridin code with no document.chatbot:floatingConfig1, a test.data-table.columns71,selectable8,chatbot-floating.floatingConfig4.git grep -ion a self-named ref of objectstackorigin/main(9b0de7de7):selectionStyle,selection_styleandfloatingConfig0 hits. The lit control on the same ref wassingleClickEdit, with 6 hits, all on the spec'sObjectGridProps, notdata-table. There is no named user of hover-style selection, so the stop condition did not fire.SchemaRendererand registry, varying one key. Both files were deleted after each run, leavinggit statusandgit diff HEADempty.data-tablewithselectionStyle: 'hover'differed from unset: 6651 against 6481 characters. The checkbox cell gainedrelative, and each checkbox was wrapped in atransition-opacity opacity-0 group-hover/row:opacity-100div.'always'was byte-equal to unset, and theshowRowNumberscontrol moved the DOM.'hover'is byte-equal to unset (6481 = 6481), with no hover wrapper.chatbotwith against without a fullfloatingConfig: byte-equal at base and at head (2600 = 2600). Theplaceholdercontrol moved the DOM, and the same config onchatbot-floatingdrew its title.Verification on head
c1b5767Every heavy run went through
bash /home/user/objectstack/scripts/pm/os-verify-lock.shwithOS_VERIFY_LOCK_SLOT=issue-6152,NODE_OPTIONS=--max-old-space-size=4096and a memory watchdog; the lowest available memory was 11244 MB.pnpm exec turbo run buildovercheck-doc-snippet-types --build-filterwith--concurrency=2: "Tasks: 35 successful, 35 total".@object-ui/typesreports "dist completeness: 1 package(s) complete (138 emitted files verified)".pnpm --filter X run type-checkexits 0 with 0 TS errors for@object-ui/types(tsc --noEmit,-p tsconfig.examples.json,-p tsconfig.test.json),components,plugin-chatbotandplugin-grid. The last three are the packages the type-checker census named.pnpm exec vitest run --maxWorkers=4:packages/types/: 306 passed (306), 7701 tests passed;packages/components/in two runs: 192 passed and 1 skipped (193), with 1920 tests passed; then 156 passed (156), with 1560 tests passed;plugin-chatbot,plugin-grid,examples/schema-catalog,packages/cli, the three app-shell files importing@object-ui/types/zodandapp-shell/.../metadata-admin/previews/__tests__/.check:changeset-claims, report-only, with 47 pending entries naming a touched file; three were re-read and corrected as above. Alsocheck:pending-changeset-literals,check-changeset-presence("9 source file(s) of 2 released package(s) changed, and this change declares 1 changeset(s)"),changeset:checkandcheck-changeset-overwrite, report-only, whose findings are the 3 dated appends with frontmatter unchanged.check:doc-fences,check:doc-snippets("698 of 698 block(s) judged, 0 failed"),docs:check-links("Links are valid across 17 scan roots"),check:doc-examples,check:doc-types,check:doc-example-ids,check:doc-example-readersandcheck:skill-examples.check:control-bytes,check:new-line-citations("0 new citation(s)"),check:handler-key-reads,check:component-surface-parity(report-only),check:designer-field-key-parity,check:element-data-source-declaration,check:prompt-keys,check:readme-exports,check:spec-symbols,check:test-path-roots,check:unreferenced-sourcesandcheck-type-check-coverage.check-governed-queue-guard --testover the 15 paths: NOT GOVERNED.cd5b19a. The 9 lintable changed files ran througheslint --format json.--no-inline-config: 1 error and 77 warnings. The one error is thereact-hooks/static-componentsline indata-table.tsx's row-action menu, inline-disabled at an untouched line, and it is identical at base. Per-file error and warning counts are equal at base and head; the new test file reads 0 / 0.eslint.config.jsdeclares noparserOptions(so no type-aware project), and no rule ineslint-rules/reads the disk, so the diff cannot move an untouched file's verdict. The repo-wide lint is CI's.Ablations, predictions written first, each restored to blob == HEAD with
git diff HEADemptyEach ran through
ablation-replace.mjs, with its anchor count proven 1 → 0 on disk and restored.selectionStylezod arm. The round-5 pin file read "5 failed | 9 passed (14)", exactly the five predictedselectionStylerows.tsc -p tsconfig.test.jsonexited 2 with one error, atassertionUnmirroredMatchesLedger.ChatbotSchema.floatingConfigtoFloatingChatbotConfig. vitest stayed green on the three chatbot pin files (43 passed), since the change is type-level.tscexited 2 with exactly the four predicted errors: TS2578 in the round-5 pin file and in the trigger-icon tripwire, TS2344 in the 7655 pin file, and one atassertionDriftMatchesLedger.editableallow-list row.tscexited 2 with exactly one TS2344, atassertionRuntimeOnlyIsCallbackShapedOrNamed, and the parity file's vitest stayed 37 passed, as predicted.Acceptance notes
DataTableSchema, the last pair in both, leftUnmirroredDeclared. Keeping the leg would have forced a key back onto a ledger. It is replaced by a lit control on the same reader:KnownDriftshares a pair with each unmirrored ledger, so the header's0is a reading, not a name-normalisation artefact. The reasoning is in the test's own comment.origin/maintwice, never rebased:de4459a, thenc1b5767. The second merge followed PR feat(types): the dashboard widget's TypeScript chartConfig refuses the retiredaria, and both faces are pinned (objectui#4044) #11310, which editscomplex.ts. The ledger counts did not move with either merge.objectNamewhendataSource.objectbinds the node (objectui#11117) #11312 (open) adds aWiderThanDeclaredentry to the same parity file. The two diffs touch disjoint blocks. Whichever lands second mergesmainand re-derives the totals by parser count.with-item-countcatalog id rename was not done, because this round does not touch that file.pnpm testfarm and the repo-wide lint (CI's);apps/consoletests, because no file it owns changed;Generated by Claude Code