Repository navigation
feat(plugin-list)!: the renderers stop reading the list-view keys every door refuses (objectui#6152, round 14) - #12052
Conversation
…ry door refuses (objectui#6152 round 14) Retires classes A, B, C, E and F of the round-13 census on every route that read them: ListView, app-shell's object-page relays, plugin-view's generateViewSchema and ObjectTimeline's nested date rung. - A: the pre-#2231 alias rungs (kanban groupField / cardFields, gallery imageField, timeline dateField, and calendar dateField read as a timeline axis) in ListView's branches and capability gate, the relays, the object-view element and ObjectTimeline. - B: calendar.defaultView's lift and the ...restKanban / ...restCalendar spreads; the declared summarizeField, colorField and allDayField are read by name instead. - C: the tree titleField label rung and the tree, gantt and options.grid spreads; gantt (and plugin-view's timeline) go through typed total tables of the spec block's keys. A block key named like a node key no longer overrides the node. - E: the projection collectors list the blocks' spec keys only. - F: the types prose, the refusal messages and two pending changesets' dated notes say the readers moved. The core fold (normalize-list-view.ts) is parked until PR objectui#12036 lands. Class D (the legacy chart binding) is the next round. Claude-Session: https://claude.ai/code/session_01CijGnfWLxTLUFcJkY2ouUw Co-authored-by: Claude <noreply@anthropic.com>
…d 14) Claude-Session: https://claude.ai/code/session_01CijGnfWLxTLUFcJkY2ouUw Co-authored-by: Claude <noreply@anthropic.com>
…still reads its legacy keys (objectui#6152 round 14) The calendar relay's "fully declared block" fixture carried `defaultView`, which is not a member of a list view's calendar block. The options-bag prose names `chart` as the one kind whose legacy axes are still read, until the legacy chart binding's own round. Claude-Session: https://claude.ai/code/session_01CijGnfWLxTLUFcJkY2ouUw Co-authored-by: Claude <noreply@anthropic.com>
…jectui#12036 landed) The parking rule of objectui#6152 round 14: the core fold leg starts after the other lane's edit to normalize-list-view.ts landed. Merge, not rebase. Claude-Session: https://claude.ai/code/session_01CijGnfWLxTLUFcJkY2ouUw Co-authored-by: Claude <noreply@anthropic.com>
…aliases (objectui#6152 round 14) The core leg of round 14, unparked now that PR objectui#12036 has landed: PER_VIEW_CONFIG_ALIASES, its collection, its early-return term, its fold loop and its docblock bullet are retired. A view whose only legacy vocabulary is a nested kanban groupField / cardFields, gallery imageField or timeline dateField now returns by reference, with the alias in place, and binds nothing downstream. Fixtures re-judged: the core describe's fold cases are replaced; the arms that held only through the fold (ListView kanban and timeline, the kanban gate, the 8365 control, the 7322 source pin) flip to refusal arms; the console reach pin covers the top-level spelling and the bag. Claude-Session: https://claude.ai/code/session_01CijGnfWLxTLUFcJkY2ouUw Co-authored-by: Claude <noreply@anthropic.com>
✅ 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
|
…set, the readers moved (objectui#6152 round 14, patch 1) Its round-11 note says the renderers' reads have not moved; round 14 retires them. Append-only, in the round-11 shape; the existing sentence stays. Claude-Session: https://claude.ai/code/session_01CijGnfWLxTLUFcJkY2ouUw Co-authored-by: Claude <noreply@anthropic.com>
✅ 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: PR objectui#12052, round 14 of card objectui#6152 (draft, no auto-merge; six commits, the last the patch-1 changeset note). Inputs, and nothing else: the card body and all 88 of its comments (the round-11 answer 6066456661, the round-12 answer 6070475966, the round-13 claim 6076867462, the census report 6077447919 and the seat's answer to it 6077535247, the pointer 6078647073, the round-14 report 6079545549 and the patch-1 report 6079625484; the earlier records and rulings read for the shape they fixed), the PR body, its 36-file list, the net diff against Check-runs at the final read: 42 on this head, read 2026-10-09T11:17Z: 35 success, 3 skipped (dependabot, Test coverage, Test coverage shard), 4 in_progress and NOT read as passes: Test shards 1/8, 2/8, 4/8 and 7/8 (started 11:03Z, still running at that read). Success at that read includes Type Check, Lint, Spec Main Shape Gate, Test shards 3/8, 5/8, 6/8 and 8/8, Test (dist pins), Build & E2E, Build Docs, Bundle Analysis, Changeset Declaration, Changeset Bump Policy, Changeset Fixed Group Check, Changeset Overwrite Report, Changeset Claim Re-read, Line Citation Gate, Inert vi.mock Specifier Check, Doc Snippet Type Check and the rest of the text and docs gates. The four open shards are the dispatching seat's landing pre-check to read when they complete; this record's judgments below rest on the diff and on the gates that had concluded, and a red among the four re-opens the record on this same head. ① Derived judgmentsAccept sets (the doors): none moves. The Published behaviour, by package and route (each judged against the plan 6077535247 took, Q1 → C: classes A, B, C, E and F on every route the census named; class D not in it):
② Semver level
③ Boundary flagsDev-declared deviations (report 6079545549), each answered:
Noted, not flagged:
Escalations to the seat: three bookkeeping items above (record Q1 → A on the card; file the gallery Implemented-by: VERDICT: PASS Rendered 2026-10-09T11:18Z · a read-only contract review of PR objectui#12052 on the head named above; the newest record naming this head governs, and any push after it voids it. |
Part of #6152 (round 14). This card stays open for the next round, the legacy chart binding (class D of the round-13 census).
Clause-②: no
The renderers stop reading the list-view keys every door already refuses. Rounds 11 and 12 closed the doors (
@object-ui/types,objectui validate, the spec's view write door). The readers stayed, so a stored row still rendered as written. This round retires them on every route the round-13 census (report 6077447919) named, under the seat's answer 6077535247 (Q2 → A, Q1 → C). Authority: the startup-transition clause, 「废弃别名/拼写与能力退役默认立即退休,无分阶段窗口、无双拼写宽限;staged 仅凭具名外部用户证据方可荐」. Production stores are NOT MEASURED; the changeset says so and gives the FROM → TO a surviving row needs.What retires, per class and route
kanban.groupField/cardFields,gallery.imageField,timeline.dateField, andcalendar.dateFieldread as a timeline axis, in both nestingsnormalizeListViewSchema(PER_VIEW_CONFIG_ALIASES, its collection, its early-return term, its loop, its docblock bullet);ListView's kanban / gallery branches, capability gate andresolveTimelineDateBinding; app-shell'skanbanViewOptions/galleryViewOptions/timelineViewOptions; plugin-view'sgenerateViewSchema;ObjectTimeline's nestedtimeline.dateFieldrung and its entry in the refusal's key listcalendar.defaultView's lift; the...restKanban/...restCalendarspreadsListView,generateViewSchema. The declared keys those spreads also carried are now read by name: kanbansummarizeField, calendarcolorField/allDayFieldtree.titleField; the tree, gantt andoptions.gridspreads; plugin-view's raw gallery / timeline / gantt spreadsListView, app-shell's tree relay,generateViewSchema. Gantt goes through a typed TOTAL table of the spec block's keys (GANTT_CONFIG_SPELLING,satisfies Recordoverkeyofthe spec type), and plugin-view's timeline through the same shapegroupField,groupBy,cardTitle,dateField,endField,imageField,swimlaneField,valueField,cardFieldsListViewcollectors (expandFieldsand its$selecttwin)groupByrefusal no longer suggests the refusedgroupFieldobjectql.zod.ts,packages/types/src/zod/README.md, the docblocks beside each reader, and dated notes on.changeset/6152-list-view-blocks-strict.md,.changeset/6152-list-view-options-bag.mdand (patch 1).changeset/6152-object-calendar-container-strict.md⛔ Not in this round: class D, the legacy chart binding (
resolveListChartBinding's legacy half andListView's legacy chart branch);inlineEditOffered; app-shell'sonInlineEditChange/persistViewPatchpath; any door or schema shape inpackages/types.The core leg was parked behind PR objectui#12036 at dispatch. It landed during this round (
3c3115e), soorigin/mainwas merged in (a merge commit, no rebase) and the core leg is in this PR. Nothing is parked. Its four shared files keep its work intact: this diff, read against3c3115e, changes no line that namesinlineEdit,editInline,foldsInlineEditIntoEditInline,keepInlineEditModeForTheSession,onInlineEditChangeorpersistViewPatch.One typing note.
ListView'sviewComponentSchemamemo wasanyby INFERENCE: the tree branch spread an untyped block, and oneanymember made the unionany. Retiring that spread exposed it, so the memo now states(): anyopenly, the same type, as plugin-view'sgenerateViewSchemaalready does. Measured: without the annotationtscrefuses the union at theSchemaRendererhand-off (TS2322).Fixtures, re-judged (H1)
The census's lists were candidates. The instrument was a run of every test file that imports or names a touched module, plus the census's candidates: 16 existing arms went red before the merge, the arms that held only through the core fold flipped with the core leg, and a
git grepper removed rung found the arms that stayed green for the wrong reason.galleryOptionsBagCanonical-6152,kanbanOptionsBagCanonical-8193(bag and top-level arms),timeline-binding(three arms),strayGroupByRefused-8365,ListView.test(thegroupFieldalias arm),calendarAliasRefused-8355(the renderer-ahead knob control); app-shellgalleryBinding-7547,timelineBinding,titleFieldConvergence(the treetitleFieldrung); plugin-viewstrayGroupByLane-9242(the alias control and the passthrough control),timelineBinding-7070; plugin-timelinetimeline-date-binding,absentDateAxisRefusal-7459; consoletimelineAxisRefusalReach-7070(both faces, both nestings); plugin-calendarcalendarUnionReads-8651(the producer ledger); typesobject-kanban-group-by-limit-7322(the view-level alias source pin, core included) andtree-view-config-readers-8253; corenormalize-list-view.test(the eleven fold cases become seven: passthrough, by-reference, a fold that still runs, and the four boundary cases).kanbanLane-8193andkanbanGroupByRetired-8213wrotegroupField: 'stage'on an object whose detector also picksstage, so they could not tell a read alias from an ignored one; they now write a value the detector never picks.speculativeFls-7216PIN 4 (the FLS gate on the timeline start binding),timeline-binding's precedence case,timelineMetaFieldsRetired-10222's firing control (visibleFields, a key the collectors still read), app-shellcalendarBinding-7029(its "fully declared" block carrieddefaultView).packages/typesassert refusal and did not flip.New pins
packages/plugin-list/src/__tests__/ListView.readersRetired-6152.test.tsx, on the nodeListViewgenerates: (1) the K8 hazard, a block key named like a node key (objectName) no longer overrides the node, on the kanban, calendar, gantt, tree and grid branches, each with a lit control that the block was read; (2) the declared keys keep their route:summarizeField,colorField/allDayField, and every gantt key, driven off the spec's own shape, block winning over bag per key; (3) each retired key reaches nothing, beside a control in the same position; (4) the top-level spellings the core fold used to rewrite; H2, below.packages/plugin-view/src/__tests__/ObjectView.readersRetired-6152.test.tsx, the same three ongenerateViewSchema's node, with gantt and timeline driven off the spec's shapes.Measurements
ListViewbuilds forgallery.coverField(top-level and bag) has no flatimageField, and the REALObjectGallerydraws the cover from it; the retired bagimageFielddraws none. On plugin-view's route the flatimageFieldstays (that route handsObjectGalleryno nested block), read fromcoverFieldonly.apps/console/dist/eager-closure.json, both builds underos-verify-lock):main3c3115e 3,239,495 B gzipped, this PR at de08bfa 3,239,666 B, delta +171 B, headroom 41,801 B toMAX_EAGER_CLOSURE_GZIP_BYTES(untouched). Before the merge the same instrument read +411 B against 8de8ba2, before the core leg freed its share.pnpm check:eager-closureexits 0 at the head.Ablations (each through
ablation-replace.mjsin wrap mode, restore proven by blob hash against HEAD)timeSegmentsfromGANTT_CONFIG_SPELLING:tscred, TS1360. The first attempt was a no-op the tool refused (its replacement text was already in the file), so it was re-anchored and re-run.swimlaneFieldto the table:tscred, TS2353.options.kanbanspread after the kanban node's keys: the K8 kanban arm red, and the bagcardFieldsarm red too (the spread carried it back). Predicted the first only; observed both.?? s.dateFieldinresolveTimelineDateBinding: the four-source arm and the bag-alias arm red.kanban.groupFieldfold at the head ofnormalizeListViewSchema: four arms red (the core by-reference arm and its control, the top-level kanban arm, the top-level gate arm). Predicted the core passthrough arm too; it stayed green, because its fixture also carriesgroupByField, which the ablated fold skips.Gates
Patch 1 (
0ad881d, the seat's answer to the round's one question) adds one dated note to.changeset/6152-object-calendar-container-strict.mdand nothing else: no source or test file changes, so the battery, the builds,type-check, ESLint and the bundle reading below stand as measured atde08bfa, and only the changeset and text gates were re-run at0ad881d(all exit 0, listed in the last bullet).Tests at de08bfa, under
os-verify-lock, from the repo root: every test file that imports or names a touched module (relative importers and the@object-ui/plugin-list/plugin-view/plugin-timelinepackage importers), every test file this PR changes, thenormalize-list-view*suites and the wholescripts/__tests__/suite: 588 files,Test Files 586 passed | 2 skipped (588),Tests 14141 passed | 14 skipped (14155),VERDICT command-exit 0. The@object-ui/corepackage importers (most of the repo) were not enumerated; the suites that exercisenormalizeListViewSchemathroughListViewandObjectVieware in the set, and CI runs the rest.type-check(script name echoed) exit 0 for@object-ui/types,core,plugin-list,plugin-view,plugin-timeline,plugin-calendar,app-shelland@object-ui/console, on the dependency closure built at de08bfa.ESLint (
--no-inline-config) on the 31 changed TS files: 0 errors. Warnings: the modified files are unchanged againstmain(541 → 541); the two new test files add 12no-explicit-anywarnings from the house node-capture harness. The config is not type-aware (noparserOptions.project), so the diff cannot move a verdict on an untouched file. The repo-wide run is CI's.check-changeset-presence,-no-major,-fixed,-claims,-overwrite(atde08bfait reported the two dated notes then present, case 2, declarations unchanged),check-pending-changeset-literals,check-control-bytes,check-new-cross-file-line-citations(0 new),check-vi-mock-specifiers/-inherit/-override-shape,check-test-path-roots,check-doc-links: all exit 0.check-governed-queue-guard --test: NOT GOVERNED. Re-run at0ad881dafter patch 1, each exit 0:check-changeset-presence,-no-major,-fixed,-overwrite(three dated notes, declarations unchanged),check:changeset-claims,check:pending-changeset-literals,check:control-bytes,check:new-line-citations(0 new).Acceptance notes (not fixed here)
coverFit,cardSizeorvisibleFields:generateViewSchemaflattens the block, andObjectGalleryreads those keys only nested. Measured onmainand on this branch with the realObjectGallery(coverFit: 'contain'drawsobject-coveron both; the same block nested drawsobject-contain). Unchanged by this round; reported to the seat.generateViewSchema, app-shell's object page) still listdateField,groupField,imageFieldandcardFieldsand tell an author to move them into the block, where every door now refuses them. Reported to the seat.kanban.conditionalFormattingby name (hostviewsentries); the census did not classify it, and it is not in this round.Contract review at
CONTRACT_REVIEW_TIERis the seat's, after this report.Generated by Claude Code