Repository navigation
refactor(layout)!: retire the navigation-renderer and responsive-grid node type keys; navigation is app metadata, the breakpoint grid is grid (objectui#11441) - #11460
Conversation
… node type keys (objectui#11441) The maintainer's ruling on objectui#11441 (record 5950208338, letters B / B), executed as one more objectui#10859 batch: - packages/layout/src/index.ts: both registrations become tombstone docblocks (described, not quoted). NavigationRenderer and ResponsiveGrid stay exports; BreakpointColumnMap stays declared (the ruling keeps the objectui#7580 vocabulary half). - known-schema-types.ts regenerated: the two bare keys and their layout: twins leave. The ratchet goes 20 -> 18 (bare) and 374 -> 372 (namespaced), with a row for this batch and the named remainder updated. - The navigation-renderer declaration pins (objectui#3972 / #3987) end with the declaration; a retirement pin replaces them, and the #3900 containment control moves to app-schema-renderer. - Teaching corrected: the layout guide, the layout README, the docs-site registrar docblock, and comments in @object-ui/types that named responsive-grid as the ground for the re-homed breakpoint vocabulary. - Changesets: layout and cli minor with the BREAKING (authoring) banner; dated notes on three pending entries that named either key as live. Co-authored-by: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01YLg8XqWGJ785fwQ5v4pH37
|
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
|
… key, not by name (objectui#11441) Patch round 1. The changeset's responsive-grid migration line and the index.ts tombstone said `grid` refuses an unknown breakpoint key "by name"; the refusal is `unrecognized_keys` on `columns`, so it now reads "as an unrecognized key". The two test titles that say "is refused by name" stay: the unknown-type panel names the key. Co-authored-by: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01YLg8XqWGJ785fwQ5v4pH37
✅ 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#11460 on card objectui#11441, executed as one more batch of objectui#10859. Inputs: the card's body and all six comments (the maintainer ruling 5950208338, the claim 5950898710, the dev report 5951895242, the seat REWORK 5951924235, the patch-round report 5951982748, the seat ACCEPT 5952000728); for the family's conventions, objectui#10859's fork ruling 5948252391 and the phase-2b and phase-2c contract records 5948430381 (PR objectui#11453) and 5950792458 (PR objectui#11457); the PR body, its 28-file list (+455 / -453) and the net diff of the head against ① Derived judgments
② Semver level
③ Boundary flags
Implemented-by: VERDICT: PASS Reading time: 2026-10-02T12:26Z Generated by Claude Code |
Standing down on the merge-queue red:
|
Fixes #11441
Clause-②: yes
Part of #10859: this card runs as one more batch of that family, on the same ratchet. It executes the maintainer's ruling on objectui#11441, record
5950208338(batch 268 item 5, letters B / B, 「同意」), under the seat's claim5950898710. Dispatched dev ofdomain:uiseat 1, sessionhttps://claude.ai/code/session_01YLg8XqWGJ785fwQ5v4pH37.What changes
packages/layout/src/index.ts: theresponsive-gridandnavigation-rendererregistrations (each with itslayout:twin) become tombstone docblocks. They describe the retired calls and do not quote them, because the registration readers take a quoted call in a comment for a live one. The two imports that only fed the registrations go;export *keeps both components public.NavigationRendereris what app-shell'sUnifiedSidebarand this package'sAppSchemaRenderermount.ResponsiveGridhad no in-repo consumer except the retired registration, so it is now a React-only export. It stays because the ruling keeps objectui#7580's vocabulary half:BreakpointColumnMapstays declared inResponsiveGrid.tsx, unchanged, as the type of itscolumnsprop. ⛔BreakpointColumnMapis not removed.known-schema-types.tsis regenerated bynode scripts/regenerate-known-schema-types.mjs. Four entries leave:navigation-renderer,responsive-grid,layout:navigation-renderer,layout:responsive-grid.registered-types-validate-ratchet-10859.test.ts):REFUSED_AT_TYPE20 → 18 andNAMESPACED_REFUSED_AT_TYPE374 → 372. Both namespaced twins were refused attypeon both faces (measured), so the namespaced pin moves by 2. A newUNREGISTERED_11441map and its row;STILL_REFUSED_10859loses both keys and its set-equality row holds; the docblock's projection now reads 8 after phase 2d and 0 after objectui#11440.navigation-renderer-items-declaration.test.tsxis deleted: its objectui#3972 / objectui#3987 rows read the declaration that is gone.navigation-responsive-grid-retired-11441.test.tsxreplaces it: the source read and the live registry both lack every spelling (lit controlapp-schema-renderer, both spellings), a node of either key renders the OBJUI-001 panel (render controllayout:page:card),NavigationRendereris still exported, andResponsiveGridstill resolves a breakpoint map. In the schema-catalog file, the objectui#3972 / objectui#3987 manifest describes go, a retirement pin replaces them (lit controlgrid), and the objectui#3900 containment control moves toapp-schema-renderer.responsive-gridmove:app-shell-not-a-component-keytolayout:page:card;page-header-authorable-keysand the side-effects bundle probe toapp-schema-renderer; the layout containment census to its two remaining registrations. The sidebar-nav doc pin learns the number wordtwo. Scope notes that saidnavigation-renderertakes an icon name now sayNavigationRenderer, the component that still does.content/docs/guide/layout.md: the registered-key sentence (two keys) and the paragraph on a navigation tree that must come from JSON, which now points at the app document'snavigationitems drawn by the shell. The layout README, the docs-site registrar docblock, and the@object-ui/typescomments (mobile.ts,complex.ts,index.ts, two test comments) that named theresponsive-gridregistration as the ground for the re-homed breakpoint vocabulary: they now namegrid's breakpointcolumns, keyed byBreakpointName, andResponsiveGrid's prop.@object-ui/layoutminor and@object-ui/climinor, each with the BREAKING (authoring) banner and migration lines. Dated notes on the three pending entries that named either key as live:10859-retire-page-header-layout,7580-responsive-vocabulary-rehome(the ruling updates its item 2),9910-children-slot-declare-and-pin; frontmatter md5 unchanged on all three. No console entry:apps/consolehas no stub for either key (grep 0).@object-ui/typeschanged comments only and carries no entry.Premise gate, re-measured
ad1785c1d(main with phase 2c): outside CHANGELOGs, every hit for either key is the registration, the generated list, a test, a comment or prose. 0 producers in non-test source,examples/**, the catalog,content/docsandskills/**; 0 runtime emission.origin/main3b4efa74:git grep -E "navigation-renderer|responsive-grid"exit 1 (0 hits). Control in the same command shape:page-headeranswers 23 files. TheNavigationRenderer/ResponsiveGridhits there name the React components in prose.navigation-rendererwhen the tree has to come from metadata" (prose, no node authored). It is corrected here to the ruling's home for navigation. Not a producer, so no fork.Migration lines, measured on both faces
safeValidateSchema(tolerant, whatobjectui validateruns) andStrictAnyComponentSchema(strict), at this head:responsive-gridwithcolumns: { xs: 1, md: 2 }, andlayout:responsive-gridtypetypenavigation-rendererwithitems: [], andlayout:navigation-renderertypetypegridwithcolumns: { xs: 1, md: 2 },gap: 4and one childgridwithcolumns: { xs: 1, xxl: 6 }(control)unrecognized_keysatcolumns(xxl)appwithnameand a one-entrynavigationarrayappwithnavigationas an object (control)invalid_typeatnavigationappwithname,basePathandnavigation: []unrecognized_keys(basePath)app-schema-rendererwith aschemaobjecttype(objectui#11440 arms it)Through the real
SchemaRenderer(a temporary probe, deleted):gridwith{ xs: 1, md: 2 }andgap: 4rendersgrid grid-cols-1 md:grid-cols-2 gap-4and draws its child;responsive-gridrenders the OBJUI-001 panel, which the new test now pins. So the layout changeset namesgridwithcolumns/gap, and the app document'snavigation; it says the strict face refusesbasePathon the app document as an unrecognized key; and it does not recommend theapp-schema-renderernode, whichobjectui validaterefuses attypetoday.Verification, all at head
7f4f8ab64os-verify-lock): the ratchet,check-known-types,known-schema-types-derivation-5115,check-doc-component-types.test,unit-registry-absence-collision,registry-bare-name-collisions,component-registrations,side-effects-declaration-consistency,site-playground-layout-registration-3904, the schema-catalogpageheader-with-actions, the two@object-ui/typestest files, and all ofpackages/layout/:Test Files 46 passed (46),Tests 665 passed (665), VERDICT command-exit 0. A second run over the source-reading pins (node-slot-registered-arms-8499, both container-declaration census / ratchet files,check-prompt-component-keys,check-sdui-registration-pins.test,registry-assertion-ratchet-8316, three@object-ui/typesfiles namingapp-schema-renderer,grid-breakpoint-columns-7097):Test Files 10 passed (10),Tests 925 passed (925).@object-ui/types,@object-ui/layout,@object-ui/cli,@object-ui/example-schema-catalog, andtype-check:scripts, all Done / exit 0. Every changed test file is in its program (--listFilesOnly).check:doc-types(887 registered + 290 exempted of 1177 sites),check:doc-snippets(after its--build-filterturbo build, 35/35 tasks),check:doc-examples,check:doc-example-ids,check:doc-fences,regenerate-catalog-index.py --check,regenerate-known-schema-types.mjs --check,check:registry-bare-names,markdown-test-inputs.mjs --audit,check-doc-links.mjs,check-changeset-presence.mjs(17 source files of 3 released packages, 2 changesets),check:changeset-claims(report-only; the 23 pending entries it lists were read, none falsified),changeset:check,check:pending-changeset-literals,check:control-bytes,check:new-line-citations(0 new),check:prompt-keys,check:installed-pin-claims,check:spec-symbols,check:test-path-roots,check:handler-key-reads,check:component-surface-parity,check:side-effects-array,check:unreferenced-sources,check:doc-example-readers,check:readme-exports,check:skills-paths, andcheck:sdui-registration-pinsafter a console build (14 of 14 derived registrations present; the two retired keys left the derived set).eslint --no-inline-config --format jsonover the 20 changed ts/tsx files that exist, each compared with its base blob through--stdin: per-file error and warning counts equal the base in every file (2 pre-existingno-restricted-importserrors in@object-ui/types, visible only without inline config, identical at base). Population: the rooteslint.config.jsis the only config, read by the packagelintscripts (eslint .; clieslint src). It sets noprojectServiceorparserOptions.project, so type-aware linting is off and this diff cannot move a verdict on an untouched file. Fullpnpm lintis CI's.check-governed-queue-guard --testover the 28 paths answers NOT GOVERNED. Control-byte self-scan over the 27 changed files: 0 hits.Reverse verification and ablation, predicted first
packages/layout/src/index.tsandknown-schema-types.tschecked out atad1785c1d, new tests kept. Predicted 11 red: 4 ratchet rows, 4 in the new layout file, 2 in the schema-catalog retirement pin, 1 in the sidebar-nav doc pin. GotTests 11 failed | 128 passed (139), exactly those, including "refuses 20 registered bare key(s) attype; the pin is 18" and "refuses 374 registered namespaced key(s) attype; the pin is 372". Restored by a trap: both blobs equal HEAD,git diff HEAD0 lines.scripts/ablation-replace.mjs(WRAP mode), restoring ONE registration,responsive-grid, with its import: anchor 1 → 0, blobe4f4ea8ea800→90f86f86b05b, and the on-disk count of the register call is 1. Leg 1 (source only), predicted:derivation-5115red plus 5 rows. Got 7 failed: the two derivation rows ("omits no registered type", "matches … byte for byte"), three in the new layout file, the schema-catalogresponsive-gridrow and the sidebar-nav doc row. Leg 2 (list regenerated under the ablation), predicted 9: got 9, with "refuses 19 … the pin is 18" namingresponsive-gridand "refuses 373 … the pin is 372", the 11441 row and the set-equality row, plus the same five;derivation-5115green. Restored: the tool provedindex.tsblob equals HEAD withgit diff HEADempty, and my trap proved the regenerated list's blob equals HEAD.Acceptance notes (out of scope, not filed)
skills/objectui/rules/protocol.md(governed) still saysBreakpointColumnMapin@object-ui/layout(responsive-grid) spells the same six. The claim about six keys stays true; the parenthetical now names a retired key. Editing it would make this PR governed, so it is left for a separate governed one-line change, named in the dev report.scripts/__tests__/component-registrations.test.tskeepsresponsive-gridandpage-headeras synthetic fixture strings for the registration reader. They are not registry claims, and phase 2c leftpage-headerthe same way.Serial
mainand re-pins; with its tensidebar-*retirements on top of this the bare pin goes 18 → 8.mainmoved to4a1adb76e(objectui#11456, i18n) after this branch mergedad1785c1d. No file overlaps this diff, and the queue rebuilds on currentmain.Generated by Claude Code