Repository navigation
refactor!: retire pie-chart, donut-chart, radar-chart and page-header; the chart examples author chart + chartType (objectui#10859 batch 8, phase 2c) - #11457
Conversation
…hart examples author chart + chartType (objectui#10859 batch 8, phase 2c)
The @object-ui/layout registration of PageHeader under page-header (and
layout:page-header) is replaced by a tombstone note, and the opt-in
PROTOCOL_COMPONENTS placeholder entry for the same spelling goes with it.
PageHeader stays an export. The layout tests, the catalog alias section,
the side-effects bundle probe and the docs are re-pointed or corrected.
pieChartExample / donutChartExample / radarChartExample now author
{ type: 'chart', chartType: 'pie' | 'donut' | 'radar' }, the last producer
of the three chart aliases.
Claude-Session: https://claude.ai/code/session_01YLg8XqWGJ785fwQ5v4pH37
Co-authored-by: Claude <noreply@anthropic.com>
…rt; repin the ratchet to 20 (objectui#10859 batch 8, phase 2c) The three chart-family aliases are unregistered with their plugin-charts twins and CHART_TYPE_KEYWORD_FAMILIES rows, under one tombstone note. The 7401 test runs its "renders as itself" rows on chart:bar and on chart + chartType, pins the three keys absent under both spellings, and keeps the item-3 rows asserting each migrated example draws its family and no bar. The console stubs, the console / cli / types stub readers and the DOM-leak sweep follow. Known-schema-types regenerated (9 deletions). Ratchet: REFUSED_AT_TYPE 24 to 20, NAMESPACED 379 to 374, a phase-2c row, STILL_REFUSED_10859 at 20, and the fork-2 reason rewritten with the key reading. Changesets for plugin-charts, layout, components, cli and console, plus dated notes on five pending entries this phase overtakes. Claude-Session: https://claude.ai/code/session_01YLg8XqWGJ785fwQ5v4pH37 Co-authored-by: Claude <noreply@anthropic.com>
…he chartType, not the example object (objectui#10859 batch 8) Claude-Session: https://claude.ai/code/session_01YLg8XqWGJ785fwQ5v4pH37 Co-authored-by: Claude <noreply@anthropic.com>
|
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
|
Contract reviewServed-tier: PR objectui#11457 on card objectui#10859, batch 8 phase 2c. Inputs: the card's body and all 62 comments (every comment from the batch-8 claim 5945225235 onward read in full, among them the phase-1 report 5945491717, the seat ruling 5945530142 and its amendment 5945583855, the phase-2b report 5948183744, the fork ruling 5948252391, the phase-2b ACCEPT and landing 5948265747 / 5948722028, the phase-2c report 5950551575 and the seat ACCEPT 5950575948; the earlier ones skimmed for the rulings this PR cites), the phase-2b contract record 5948430381 on PR objectui#11453; the PR body, its 44-file list (+549 / -805) and the net diff of the head against ① Derived judgments
② Semver level
③ Boundary flags
Implemented-by: VERDICT: PASS Reading time: 2026-10-02T10:52Z Generated by Claude Code |
Part of #10859
Clause-②: yes
Phase 2c of batch 8 on the family card: four node type keys leave the registry under the seat's fork ruling
5948252391. Fork 1 is answered with route A: the three chart aliases retire after their one producer moves. Fork 2 is answered with route B:page-headerretires. Implemented byos-devfordomain:uiseat 1, sessionsession_01YLg8XqWGJ785fwQ5v4pH37. Base:origin/main37140f4f5, after phase 2b (objectui#11453) landed. Phase 2d (thesidebar-*family) follows as its own PR and is untouched here.Premise gate: re-measured after the example migration
Each key was searched at a type position across objectui (source,
examples/**, the catalog, docs,skills/) and across objectstackorigin/main3937ad2f, and checked for runtime emission.pie-chart,donut-chart,radar-chartexamples/chart-examples.tsmoved; objectstack 0page-headerOn
page-header, the seat's corrected reading holds. The objectstack conversionpage-header-subtitle-aliasrenames the KEYdescription→subtitleon both header spellings. Its docblock says it does not rewrite the type and that this registration "is objectui's to retire, on its own schedule". Its fixtures are test data. Nothing new turned up, so there is no fork.What changed
The three chart aliases (fork 1, route A)
packages/plugin-charts/examples/chart-examples.ts:pieChartExample/donutChartExample/radarChartExamplenow author{ type: 'chart', chartType: 'pie' | 'donut' | 'radar' }.objectui validateaccepts each on both faces (measured).plugin-charts:twins and theirCHART_TYPE_KEYWORD_FAMILIESrows. One tombstone note replaces them. The table now holdschart:baralone.scatter-charttombstone now describes its old call instead of quoting it, because@object-ui/types' node-slot test reads quoted calls in comments as live registrations.chart-family-from-type-7401.test.tsx:pie/pie/radarmarks and no bar. They now also pintype: 'chart'and thechartType, so an example cannot drift back onto a retired key.chart:bar(both spellings) and onchart+chartType.chartTyperow moved to surviving spellings.chart:bar, becauseradar-chartis gone.register-plugins.tsdrops the three lazy stubs, andpreview-gallery.tsxdropspie-chart.RETIRED, moves its control tochart:barand expects 3 stubs.chart:bar, and so is the@object-ui/typesnode-slot reader's..changeset/10859-retire-scatter-chart.md. It answers that entry's "wait on their own decision" sentence.page-header(fork 2, route B)@object-ui/layout: thepage-headerregistration (bare pluslayout:page-header) is replaced by a tombstone note, and the now-unused import goes.PageHeaderstays a named export.registerLayout()now registers four keys.@object-ui/components:'page-header'leaves the opt-inPROTOCOL_COMPONENTSlist. Without that,registerPlaceholders()would have kept the bare key registered, and the derivation would have kept blessing it (the ablation below measures exactly that).content/docs/guide/layout.mdandcontent/docs/layout/page-header.mdxreplace the "alias is still accepted" passages with the retirement and apage:headerexample that validates.page-header-authorable-keys.test.tsxkeeps its name, because five files (and two changelogs) cite it by path. It now pins the retirement, withresponsive-gridas the lit control, and keeps thePageHeaderrender rows of objectui#3789. The alias's declaration-surface describes went with the alias.unknown-componentin the manifest, withpage:headeras control), and itsnavigation-rendererhalves stay.responsive-grid.test-support's README,spec-tombstonesandblock-config.Optional item: left on purpose
sdui-parser'sDASHBOARD_WIDGET_HOST_TYPESstill listsdashboard-grid. objectstack's copy of that module opens with "ported into this copy in lockstep (objectstack#12810)", so the mirror rule requires both copies to move together. Both are left as they are, with no cross-repo edit.Ratchet
REFUSED_AT_TYPE(bare)pie-chart,donut-chart,radar-chart,page-headerNAMESPACED_REFUSED_AT_TYPEplugin-charts:pie-chart,plugin-charts:donut-chart,plugin-charts:radar-chart,layout:page-header,protocol-placeholder:page-headerThe pin's docblock names the 20 that remain: the ten the ruling kept (objectui#11440 and objectui#11441) and the ten
sidebar-*primitives (phase 2d). The fork-2 reason that the contract review flagged is rewritten with the key reading.STILL_REFUSED_10859now holds 20, and its set-equality row holds. A new phase-2c row asserts that the four keys are out of the population and still refused attype, that the five twins are gone, and thatchartandpage:headerare lit controls that are not refused. ⛔ Neither pin rises.Changesets
Each is
minor, with a BREAKING (authoring) banner and a migration line per spelling:@object-ui/plugin-charts: the three aliases.@object-ui/layout:page-header. Its migration lines are measured againstobjectui validate:title/subtitle/actionsgo intopage:header'sproperties;iconhas nopage:headerspelling (the contract refusesproperties.iconby name), so drop it or composePageHeaderin JSX;childrenhas nopage:headerspelling either: the contract refuses a node-levelchildrenby name, andproperties.childrenas an unrecognized key. Useproperties.actions, or composePageHeaderin JSX.@object-ui/components: the placeholder entry.@object-ui/cli: the regenerated list.@object-ui/console: the stubs.app-shell,typesandtest-supportchanged test files only, so they have no entry. Pending entries 7401, 9910, 11044 and the 4761 app-shell entry gain dated notes, and phase 2b's plugin-charts entry gains one. Each note is a pure append, and each entry's frontmatter is byte-identical.Local runs (final head
ff1cb3c5a)origin/mainmoved after the work was done, when objectui#11454 (objectui#11434 PR 2, types and plugin-designer) landed. It was merged before opening; the merge is clean and touches none of this PR's files.ff1cb3c5a, throughos-verify-lock, withpnpm exec vitest run --maxWorkers=2, in two calls:packages/layout/andpackages/plugin-charts/in full;known-schema-types-derivation-5115,check-doc-component-types.test.ts,unit-registry-absence-collision,registry-bare-name-collisions,check-prompt-component-keys,palette-placeholder-blocksandReportRenderer.test.tsx;@object-ui/typesdesigner tests, one of which is objectui#10859's owndesigner-zod-arms-10859.Test Files 94 passed (94),Tests 1298 passed | 9 skipped (1307), thenTest Files 45 passed (45),Tests 764 passed (764). Both calls VERDICT command-exit 0.ff1cb3c5a:pnpm check:doc-typesandpnpm check:doc-snippets(after its scoped turbo build and a@object-ui/typesrebuild);pnpm check:doc-example-idsandpnpm check:doc-fences;python3 scripts/regenerate-catalog-index.py --check;node scripts/markdown-test-inputs.mjs --audit;node scripts/check-doc-links.mjs;node scripts/check-changeset-presence.mjs(20 source files of 7 released packages, 5 changesets);node scripts/regenerate-known-schema-types.mjs --check;check:registry-bare-names,check:prompt-keys,check:readme-exports,check:control-bytes,check:new-line-citations(0 new);changeset:check,check:pending-changeset-literals,check:changeset-claims,check:side-effects-array,check:handler-key-reads.c695a9611(before that merge; this PR's own files are identical at both heads):pnpm --filter @object-ui/plugin-charts --filter @object-ui/example-schema-catalog type-check:Test Files 137 passed (137),Tests 2006 passed | 9 skipped (2015), both type-checks Done;check:doc-examples,check:spec-symbols,check:component-surface-parity,check:test-path-roots,check:element-data-source-declaration,check:unreferenced-sources,check:doc-example-readers,check:self-import,check:vi-mock-inherit,check:vi-mock-specifiers,docs:check-links;check:sdui-registration-pins(16 of 16 present, afterpnpm --filter @object-ui/console build;page-headerleft the derived set).5b35f07ac(differs fromc695a9611only in the 7401 case-title order):pnpm --filter X type-checkis Done forplugin-charts,layout,components,cli,types,test-support,app-shellandconsole, after building theconsole^...,cli^...andtest-support^...closures.packages/plugin-charts/ packages/cli/ apps/console/src/__tests__/plus the types reader and the sweep: 157 files, 2368 tests, all passed.packages/layout/ examples/schema-catalog/test/plus 14 gate and reader tests: 88 files, 2927 tests, all passed.eslint --no-inline-config --format jsonover the 30 changed ts/tsx/mjs files gives 0 errors and 21 warnings.eslint.config.js, which sets noprojectService/parserOptions.project, so no untouched file's verdict can move. Fullpnpm lintis CI's.apps/sitetype-check (the five site files changed comments only), and type-checks for feat(types,plugin-designer)!: draw the data-model and process designers' read members; respell onDelete as deleteBehavior (objectui#11434, PR 2 of 3) #11454's packages after the merge (this PR touches none of their files).Reverse verification
The prediction was written to the scratchpad before either leg ran.
BASE leg. The eight changed source files went back to
37140f4f5, and the new and edited tests ran against them. The files are the two plugin-charts sources, the examples, the layout index, the placeholders, the known-types list and the two console stub files.Tests 19 failed | 80 passed (99), exactly those 19, including "refuses 24 registered bare key(s) … the pin is 20" (the count row) and the three item-3 rows red ontype: 'pie-chart'and its siblings.git diff HEADis 0 lines, and status is 0 lines.Ablation.
'page-header'was put back intoPROTOCOL_COMPONENTSwithscripts/ablation-replace.mjs, run from../objectstack. The anchor went from 1 hit to 0, and the blob from4c56f29214afto555e164b6888.known-schema-types-derivation-5115went red, "expected [ 'page-header', …(1) ] to deeply equal []" (the second entry isprotocol-placeholder:page-header), and so did its byte-for-byte regen case. Result:Tests 2 failed | 11 passed (13), as predicted.type; the pin is 20", withpage-headerin the Refused list, and the phase-2c row and the exact-set row were red too. Result:Tests 4 failed | 21 passed (25).protocol-placeholder:page-headercame back with it. The direction was more red, not a reversal.4c56f29214af) andgit diff HEADis empty. A second trap restored the known-types file, and its blobf9514f0c69baequals HEAD.Acceptance notes
iconand a right-handchildrenslot.page:headerrefusesproperties.iconby name and a node-levelchildrenby name (both measured), so JSON authors lose both. The JSXPageHeaderkeeps them, and the layout changeset says so.ui/component-type-vocabulary.tsand lintvalidate-component-types.ts) citepage-headeras an example of a registered kebab string-arm block. Once this lands, they cite a retired key. Carrier: objectstack. Not edited here.plugin-charts:chart.register(...)calls in comments. No source reader reads those files today, so they are left as they are.Generated by Claude Code