Repository navigation
feat(types,plugin-dashboard)!: a dashboard widget's chartConfig type / xAxis / yAxis / series follow the spec retirement on the TS face and the dataset read path (objectui#11315) - #11371
Conversation
…ype / xAxis / yAxis / series follow the spec retirement (objectui#11315) @objectstack/spec 17.5.0 retired the four structure keys on the dashboard widget's own chart config carrier (DashboardWidgetChartConfigSchema). The zod faces already refused them by reference; this brings the TypeScript twin and the dashboard read path into line. - types: DashboardWidgetSchema.chartConfig types type / xAxis / yAxis / series by reference from the spec's members, as aria already was, so an authored value fails tsc. Pinned by chartconfig-structure-retired-11315.test.ts. - plugin-dashboard: DatasetWidget no longer merges authored series / axis presentation onto the dataset derivation; comparison overlays carry no inherited mark. The combo pin is re-pinned as the refusal. - core: chart-presentation comments corrected; mergeAuthoredPresentation keeps its signature and has no production caller. - plugin-charts: a control pin that the react ObjectChart tier still draws an authored series as a combo. Claude-Session: https://claude.ai/code/session_0122Knsowci76D2rBWReCzzZ Co-authored-by: Claude <noreply@anthropic.com>
…rd minor, core and plugin-charts no release) The pending objectui#4044 changeset said every other chartConfig key keeps its previous typing; this change types four more, so that sentence is corrected in the same change. Claude-Session: https://claude.ai/code/session_0122Knsowci76D2rBWReCzzZ Co-authored-by: Claude <noreply@anthropic.com>
…i#11315 changes about its axis-title point The dashboard no longer reads chartConfig.xAxis / yAxis, so the axis-title fix that changeset describes no longer reaches a dashboard; its series-label aside named DatasetWidget as the overriding caller, which it no longer is. Claude-Session: https://claude.ai/code/session_0122Knsowci76D2rBWReCzzZ Co-authored-by: Claude <noreply@anthropic.com>
…itional default would not draw (objectui#11315) An ablation that stopped the renderer reading series[].type left the explicit-combo case green: a combo's positional default (a bar, then lines) drew the same counts as the authored bar + line. The case now authors an area and a line, so only a renderer that reads series[].type draws them. Claude-Session: https://claude.ai/code/session_0122Knsowci76D2rBWReCzzZ 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: Inputs: card objectui#11315 (body; triage ① Derived judgments(a) TS face, and the falsified premise — RIGHT. (b) Read path — RIGHT. At the base, (c) Pins — RIGHT, and the ablations are sound. Types: (d) Fixture triage — harmless. (e) Public surface, named. (f) Check-runs on the head (read twice during this review). 31 completed success, 3 skipped (the matrix and dependabot placeholders), and 8 still ② Semver levelClause-②: yes
③ Boundary flagsDev deviations, each answered:
Out-of-scope findings, each routed:
Nothing in the inputs names an open card any of the three should join. Implemented-by: VERDICT: PASS The PASS is on the contract: every derived judgment holds, the semver level and the Clause-② line match what the diff publishes, and every flag is answered. Eight check-runs on the head are not concluded ( |
…scribing the dashboard chartConfig axis / series merge spec 17.5.0 retired (objectui#11373) (objectstack-ai#11447) Fixes objectstack-ai#11373 Clause-②: no ## What changed Comments, one docs sentence and one pending changeset. No code changed: every changed line in the `.ts` / `.tsx` files is a comment line (116 comment lines, 0 other lines, counted from `git diff -U0` against the merge base `31987bd50`). Each sentence that said something false at `main` now says what is true: - `@objectstack/spec` 17.5.0 refuses `type` / `xAxis` / `yAxis` / `series` (and `aria`) on a dashboard widget's `chartConfig` (`DashboardWidgetChartConfigSchema`). Measured on the installed spec: `safeParse` refuses each of the five and accepts `title`. - The react `ObjectChart` tier keeps `xAxis` / `yAxis` / `series`. - `mergeAuthoredPresentation` and `axisPresentation` no longer exist. objectui#11372 removed them (squash `f9c8c4e45`). - objectstack#17385 has been in state `completed` since 2026-09-20, and the spec PR that ended it is the retirement. objectstack#5175 has been in state `not_planned` since 2026-08-10: it moved to objectui#4044, which is also done. A sentence that is true history ("was re-exported here until objectui#11315") stays as written. Where a history sentence names the removed function, it now also says the function is gone. ## The sites, sentence by sentence Population: `git grep -n -E 'mergeAuthoredPresentation|axisPresentation|objectstack#17385|objectstack#5175'` at `31987bd50` gives the seat's list exactly (21 hits, changelogs and the `11372` / `10132` / `11315` changesets included). A broader grep for `full ChartConfigSchema`, `chartConfig.series|xAxis|yAxis` and `authored axis|axes|series` turned up nothing beyond those sites. Its other hits are true or belong to another carrier: the list view's `chartConfig.xAxisField` in app-shell, and report and ObjectChart pins. | Site | Before | After | |---|---|---| | `plugin-dashboard/src/DatasetWidget.tsx`, `chartConfigPresentation` re-export docblock | "…see that module's header." / "…so this widget no longer calls it." | The admission criteria and the `aria` reason live in `chartConfigPresentation`'s docblock, not the module header, so the pointer names both. "…so this widget stopped calling it, and objectui#11372 then removed it from `@object-ui/core`." | | `DatasetWidget.tsx`, "The chart's STRUCTURE is the dataset's" | "(objectstack-ai#4229, through `@object-ui/core`'s `mergeAuthoredPresentation`)" | "(objectstack-ai#4229, through `mergeAuthoredPresentation`, which objectui#11372 has since removed from `@object-ui/core`)" | | `plugin-dashboard/src/DashboardRenderer.tsx`, inline relay | "declared as the spec's full `ChartConfigSchema` on EVERY dashboard widget" and "keeps objectstack#17385's open precedence question … out of this change" | Declared on every widget, since 17.5.0 as `DashboardWidgetChartConfigSchema` (appearance keys, the four structure keys refused at parse). The whitelist emits no `xAxisKey` / `series`, and there is no authored axis to weigh against the derived bindings: 17.5.0 refuses them, which answered the question objectstack#17385 carried. | | `__tests__/DashboardChart.chartConfig-4044.test.tsx`, header "What was measured" | "`chartConfig` is declared as the spec's full `ChartConfigSchema`" | "was declared … ; since spec 17.5.0 it is `DashboardWidgetChartConfigSchema`" | | same header, "keys deliberately NOT here" | `xAxis` / `yAxis` / `series`: "an open PROTOCOL question … objectstack#17385 … cannot pre-empt it"; `aria`: "declared by the spec" | 17.5.0 refuses all three at parse, which answered objectstack#17385: the derived binding wins. `type` is also refused at parse. `aria` is no longer declared: a `retiredKey` tombstone (objectstack#17751). | | same file, refusal block (`emits no xAxis / yAxis / series from chartConfig`) | "objectstack#17385 owns the precedence … Until it answers, the three keys must not travel" | 17.5.0 refuses them and the derived binding wins. A widget that reaches the relay still carrying them (stored metadata never re-validated) must not have them travel. | | `__tests__/DatasetWidget.chartConfig.dom.test.tsx`, the `aria` negative pin | "the current contract, pending objectstack#5175" | The protocol settled the same way: 17.5.0 retired `ChartConfig.aria` (objectstack#17751). The pin holds the renderer side for a widget that reaches it without that parse. | | `__tests__/DatasetWidget.comboPresentation.test.tsx`, History | "through `@object-ui/core`'s `mergeAuthoredPresentation`. This file pinned that merge." | Same, plus "(since removed by objectui#11372)". | | `plugin-report/src/DatasetReportRenderer.tsx`, import comment | "`mergeAuthoredSeries` — not `mergeAuthoredPresentation` — because…" | The chrome and the per-series presentation. No axis is lowered, and none needs to be: a report's axes are bare name strings. | | `DatasetReportRenderer.tsx`, `authoredSeriesLabel` docblock | "the same ruling the dashboard's `mergeAuthoredPresentation` makes for its own `chartConfig.series`" | "the same ruling `mergeAuthoredSeries` (`@object-ui/core`) makes over this same `chart.series`". Read in core: "The FIRST entry naming a measure wins". | | `DatasetReportRenderer.tsx`, the series-merge call site | "`mergeAuthoredSeries` is the same merge the dashboard makes" and "Deliberately NOT `mergeAuthoredPresentation`: that entry point also reads…" | `mergeAuthoredSeries` merges by `series[].name`. The dashboard made the same merge until 17.5.0 (objectui#11315). There is no axis to lower on this surface. The object-axis lowering was deliberately not used here and objectui#11372 removed it. | | `types/src/zod/data-display.zod.ts`, `ChartSchema` axis comment | "a dashboard's dataset-bound chart hands it this node's `xAxis` / `yAxis` straight from the widget's `chartConfig` (`DatasetWidget` → `mergeAuthoredPresentation`)" | The react `ObjectChart` tier, where the spec keeps both keys, hands `ChartRenderer` the author's own axes. A dashboard widget no longer does, because 17.5.0 refuses them there (objectui#11315). | | `plugin-charts/src/ObjectChart.axisTitleLocale-10132.test.tsx` | "used to build its schema through … `mergeAuthoredPresentation` … removed by objectui#11372" | **Unchanged**: true history, written by objectui#11372 itself. | | `content/docs/plugins/plugin-charts.mdx`, Axis options (**published**) | "the `ChartAxis` a dashboard widget's `chartConfig` uses" | "`ChartAxis` — the same object the react `ObjectChart` tier (an `object-chart` node) takes for its own `xAxis` / `yAxis`". Measured: `ObjectChartSchema.xAxis` / `yAxis` in `objectql.zod.ts` take the same `stripImportedDefaults(SpecChartAxisSchema)` as `ChartSchema`. | | `.changeset/dashboard-inline-chartconfig-4044.md` (**publishes verbatim**) | "declared as the spec's full `ChartConfigSchema`"; "Five of the fourteen declared keys"; `xAxis` / `yAxis` / `series` "an open protocol question … objectstack#17385"; `aria` "needs a reader … a separate decision" | "declared on every dashboard widget"; "Five of the fourteen keys of the spec's `ChartConfigSchema` are not forwarded, and 17.5.0 refuses all five on a dashboard widget's chart config at parse"; the three are refused by `DashboardWidgetChartConfigSchema`, which answered objectstack#17385; the spec retired `aria` instead of giving it a reader (objectstack#17751). The front matter is untouched. | ### The pending changeset: one PM assumption did not hold The triage direction says this changeset's correction is "the one PR objectstack-ai#11371 already made". **PR objectui#11371 did not touch this file.** Its file list (REST, 13 files) has no `dashboard-inline-chartconfig-4044.md`. Its own body lists the file under "Comments stale since 17.5.0 that this change does not touch". At `31987bd50`, the only commit in reach that touches the file is the shallow boundary. The two false sentences (the open protocol question, and `aria` waiting on a separate decision) would have published in the same release as the `11315` changeset, which says the opposite. Following the ruling's intent ("re-read, not edit twice"), this PR edits the file once, and it is the only edit. ### Bounded edits beyond the listed sites These are the same defect class, in files already on the claim's surface, comments only: - the `aria` bullet in `DashboardChart.chartConfig-4044.test.tsx`'s header ("declared by the spec"); - the `aria` sentence in the pending changeset. The spec's own CHANGELOG puts the `ChartConfig.aria` tombstone in the 17.5.0 section. ## Acceptance notes Noted, not filed: - `plugin-report/src/__tests__/DatasetReportRenderer.chartChrome.test.tsx` header calls `aria` "the one declared key with no reader anywhere on this path". It is no longer declared, since 17.5.0 retired it on `ReportChartSchema` too. This is the `aria` family, not this card's axis / series family, and the file is outside the claim. Carrier: none. - `.changeset/11315-core-plugin-charts-no-release.md` says `mergeAuthoredPresentation` "keeps its signature and its behaviour". That was true of objectui#11371's own diff and became false with objectui#11372. The front matter is empty, so it publishes nothing. The dispatch excluded it. Carrier: none. - The `aria` refusal test's own comment in `DashboardChart.chartConfig-4044.test.tsx` ("Delivering `aria` therefore needs a READER … Reported rather than guessed") was left as written. It records the measurement history of that card. The header bullet above now carries the retirement. - Cross-file `path:line` citations elsewhere in `data-display.zod.ts` (the `data` comment) were not swept. They are outside the rewritten blocks, and the gate's ruling says not to sweep them. This diff adds none (gate verdict below). ## Verification All runs are on head `f1a7fa00f`, the only commit on the branch. - Tests, from the worktree root, through the shared verify lock: `pnpm exec vitest run --maxWorkers=2` on the three edited test files plus every `scripts/markdown-test-inputs.mjs --list` reader of `content/docs/**` and `.changeset/**` (17 files). Result: `Test Files 20 passed (20)` · `Tests 809 passed (809)` · lock `VERDICT command-exit 0`. - `pnpm check:doc-fences`: ✅ exit 0. - `pnpm check:doc-example-ids`: `✅ 415 real reference(s) all resolve`, exit 0. - `node scripts/check-doc-links.mjs`: `Links are valid across 17 scan roots.`, exit 0. - `pnpm check:control-bytes`: `✅ check-control-bytes: OK`, exit 0. - `pnpm check:new-line-citations`: `VERDICT new-cross-file-line-citations: 0 new citation(s)`, exit 0. - `pnpm check:changeset-claims`: exit 0. It is report-only and names 9 pending changesets that mention `data-display.zod.ts` / `DatasetWidget.tsx`. I read each one. None describes a comment this diff changed. - `node scripts/check-changeset-presence.mjs`: `✅ 7 source file(s) of 3 released package(s) changed … EMPTY frontmatter`, exit 0. - `pnpm check:doc-types`, `pnpm check:doc-example-readers`, `pnpm check:spec-symbols`, `node scripts/check-installed-spec-pin-claims.mjs`: exit 0. - `pnpm check:doc-examples`: **NOT MEASURED**. Reason: `THE GATE COULD NOT RUN — the packages these examples import are not built`, which is a prerequisite, not a verdict. The `.mdx` change is prose outside every code fence, which is the only thing that gate type-checks. CI runs it after its build. - ESLint, narrowed to the 7 changed `.ts` / `.tsx` files: - Population, from `eslint.config.js`: rules are scoped to `**/*.{ts,tsx}` minus the `ignores` list. The `.md` / `.mdx` files are in no `files` glob. - Count, from `--format json`: 7 files, 0 errors, 32 warnings. Per file, base vs head through `--stdin` is identical for all 7. - Invariance: `eslint.config.js` has 0 `projectService` / `parserOptions` / `TypeChecked` hits, so linting is not type-aware. No rule in `eslint-rules/` reads the filesystem. So this diff cannot move the verdict of an untouched file. - With `--no-inline-config`, the run reports 1 error: `react-hooks/static-components` in `DatasetReportRenderer.tsx`. It is the site carrying an `eslint-disable-next-line` that exists at the base too. The package `lint` script is `eslint .`, which honours the directive. - Type-check: not run. No `.ts` / `.tsx` line outside a comment changed. - Governed surface: `check-governed-queue-guard.mjs --test` reports `✅ NOT GOVERNED`. Dev session: `https://claude.ai/code/session_01YLg8XqWGJ785fwQ5v4pH37`. Dispatched by the `domain:ui` seat 1 PM loop; this PR stays draft for the seat. --- _Generated by [Claude Code](https://claude.ai/code/session_01YLg8XqWGJ785fwQ5v4pH37)_ Co-authored-by: Claude <noreply@anthropic.com>
Fixes #11315
Clause-②: yes
@objectstack/spec17.5.0 gave the dashboard widget its own chart config carrier,DashboardWidgetChartConfigSchema, which retirestype,xAxis,yAxisandseries(ADR-0021 · ADR-0049 D2; decision batch #121 item 1). objectui's Zod faces already refused the four by reference. The TypeScript twin still compiled them, and the dashboard's dataset widget still read three of them. This PR brings both into line. The reactObjectCharttier, where the spec keeps the four authorable, is unchanged, and it now has a control pin.What changed
packages/types/src/complex.ts).DashboardWidgetSchema.chartConfigkeeps its index signature.type,xAxis,yAxisandseriesare now typed by reference from the spec's own members, the same way PR objectui#11310 typedaria: each isNonNullableofSpecDashboardWidget['chartConfig'], indexed at the key. Each resolves to the spec's retired-key type, so an authored value is a compile error (TS2322). Only the key names are written here. Whether a key admits a value is the spec's answer, so a key the spec re-opened would compile again with no edit to this member.packages/plugin-dashboard/src/DatasetWidget.tsx). The widget no longer callsmergeAuthoredPresentation. It emits the dataset-derived series and category axis as they are, and spreads no authored axes. A comparison overlay no longer copies its primary's merged mark and axis, because there is none. Thecomboentry inCHART_TYPE_MAPstays, so acombowidget still draws as a combo, and the renderer picks each series' mark. The chrome lowering (chartConfigPresentation) is unchanged.mergeAuthoredPresentationand its two series types are no longer re-exported from this module. The package index never exported them.@object-ui/core(chart-presentation.ts): comments only. The file header now names which keys each carrier may author. It also says thatmergeAuthoredPresentationhas had no production caller since this change. ThechartConfigPresentationdocblock no longer callsaria"declared" or "pending objectstack#5175": since 17.5.0 it is a tombstone. Criterion 2 now notes that the spec refuseschartConfig.typeon this carrier. The function's signature and behaviour are unchanged.packages/types/src/__tests__/chartconfig-structure-retired-11315.test.tsfollows the shape of theariapin. On the TypeScript side, each key is declared, is notany, and is the retired-key type (IsRetiredKeyType), withtitleas the live control. A@ts-expect-errorsits on an authored literal for each key,chartConfig.seriesamong them, and a legal{ title, showLegend, colors }literal is the control. On the Zod side, the twin,DashboardComponentSchema,safeValidateSchemaandStrictAnyComponentSchemaeach refuse every key atchartConfig.KEYwithinvalid_typeand the spec's own message, read from the spec at run time. A spec-standing case checks both halves of the carrier split: the dashboard carrier refuses the four, and the baseChartConfigSchemastill admits them.DatasetWidget.comboPresentation.test.tsxis re-pinned as the dashboard refusal. Acombowidget still resolvescombo. With the retired combo shape authored, the series are byte-identical to the derived ones, no axis is spread, the normalizedyAxesequal the no-chartConfigcontrol, abarwidget stays a bar, the chrome still lowers, and the overlays carry no mark.DatasetWidget.chartConfig.test.tsx: the REFUSED block now pins all three structure keys as unread. Its header no longer citesChartConfigSchemaor "pending objectstack#5175". The incidentaltype: 'bar'(a retired key) is dropped from the fixtures of the LOWERED block.packages/plugin-charts/src/ObjectChart.inlineComboSeries-11315.test.tsxis new. It renders a realObjectChartwith inline rows and counts the recharts marks and axes. An authoredseriesdraws 1 bar, 1 line and 2 y-axes. An explicitspecType: 'combo'authoring an area plus a line draws exactly those. The control with no per-series mark draws 2 bars.@object-ui/typesminor (TypeScript break, migration example included).@object-ui/plugin-dashboardminor (rendering break: stored widgets that still carry the keys render the derivation).@object-ui/core(comments) and@object-ui/plugin-charts(test only).4044-chartconfig-aria-tombstone.md, "every otherchartConfigkey keeps its previous typing" now names the four keys.10132-dashboard-i18n-declared-not-resolved.mdgains a note that its axis-title point no longer reaches a dashboard, and its series-label aside no longer namesDatasetWidgetas the overriding caller. Both edits are prose corrections to changesets this PR does not own.check-changeset-overwritelists them, report-only.Zone 2 measurements (dispatch order)
origin/main5638529e67.DashboardWidgetSchemaliterals (chartConfig.series/xAxis/yAxis/type) plus a live control compiled withtscexit 0. The positive control (chartConfig.aria) in the same probe failed with TS2322, so the probe could fail. After this change, the same probe exits 2 with four TS2322s, and the control line still compiles.mergeAuthoredPresentation(derived, { series, xAxis, yAxis })returnedchartType: 'line',yAxis: 'right',axes.xAxis.titleand twoaxes.yAxisentries.DashboardComponentSchema,safeValidateSchemaandStrictAnyComponentSchemarefuse all four atchartConfig.KEYwithinvalid_type, and a{ title }control parses on all four faces.id,title,description,type,chartConfig(appearance only),colorVariant,requiresObject,requiresService,filter,compareTo,dataset,dimensions,values,layout,options(dateGranularity,sortBy,sortOrder,limitandstageOrderdeclared,$loose),filterBindingsandsuppressWarnings. Retired as tombstones:actionUrl,actionType,actionIcon,responsiveandariaon the widget, andaria,type,xAxis,yAxisandseriesinsidechartConfig. Nothing declares a per-series mark or a second value axis. Theseriestombstone text says per-series appearance "is not authorable on a dataset-bound widget", and theyAxisone says "A second axis is a second measure, not a second axis declaration". The spec's liveness ledger (objectstackpackages/spec/liveness/dashboard.json, theseriesrow) records it as a ruled cost: "The per-series mark type that made a dataset-bound COMBO chart authorable goes with the key". The widgettypeenum still carriescombo, which this PR keeps rendering. So the dashboard combo presentation retires on this carrier, and nothing was escalated.mergeAuthoredPresentation. It had one production caller,DatasetWidget, plus that module's own re-export, which no importer used. Two tests also call it directly:chart-presentation.axisTitleI18n-10132.test.tsin core andChartRenderer.axisTitleLocale-10132.test.tsxin plugin-charts. The reactObjectCharttier never called it.ObjectCharthandsschema.series/xAxis/yAxistoChartRenderer, andnormalizeChartSchemareads them there. So the carriers needed no switch, because the caller is the carrier. The dashboard call was removed, the function keeps its signature, and no second copy of the merge logic exists.plugin-reportcallsmergeAuthoredSeries(not this function), andReportChartSchema.seriesis still live, so that path is unchanged.WIDGET_CHART_STRUCTURE_RETIREDis importable does not hold. In the installed spec it is a module-private message builder,(key, carried, instead) => string. It is absent from the@objectstack/spec/uiexport list and from every.d.ts, so nothing can be read from it. The four keys are therefore typed exactly as PR objectui#11310 typedaria: by reference fromSpecDashboardWidget['chartConfig'], the exported spec type whose members those tombstones build. No local list of retired keys, and no localnever. Proof: the@ts-expect-errorpins (they go stale if a key compiles again, see ablation 2) and the legal-literal control.ObjectChartcontrol in plugin-charts pins that an authoredseriesstill draws a combo.Verification (union at head
25e43c3259, after the last commit)pnpm --workspace-concurrency=2 --filter '@object-ui/plugin-dashboard^...' --filter '@object-ui/plugin-charts^...' build→ 12 packages built (the^...direction is upstream dependencies).@object-ui/typesdist/complex.d.tscarries the new members.@object-ui/types,@object-ui/core,@object-ui/plugin-chartsand@object-ui/plugin-dashboardall printtype-check: Done. Each runstsc --noEmitplustsc -p tsconfig.test.json, and--listFilesOnlyconfirms the new and edited tests are in those programs. Downstream consumers of the narrowed face (DashboardWidgetSchema/DashboardComponentSchemaimporters):@object-ui/sdui-parser,@object-ui/plugin-listand@object-ui/plugin-designerprinttype-check: Doneagainst the rebuilt dist.@object-ui/app-shellandexamples/schema-catalogare left to CI. A grep finds no dashboardchartConfigkey use in either. The control: the same grep does hit app-shell's list-viewchartConfig, which is a different carrier.pnpm exec vitest run packages/types/ packages/core/src/utils/ packages/plugin-dashboard/ packages/plugin-charts/→Test Files 653 passed (653),Tests 12268 passed | 15 skipped (12283)(lock verdictcommand-exit 0).packages/plugin-dashboard/srcfile typing aDashboardWidgetSchemafrom@object-ui/types(the rebuilt dist) withchartConfig: { title, series }→tscexit 2,TS2322 … is not assignable to type 'undefined'atseriesonly. The file was removed under a trap, andgit statusis clean afterwards.check:new-line-citations(0 new citation(s)),check:control-bytesOK,node scripts/check-changeset-presence.mjs(8 source file(s) of 4 released package(s) changed, and this change declares 3 changeset(s)),changeset:checkOK,check:changeset-claims(the 10 pending bodies naming touched files were each read; none concernschartConfig),check:pending-changeset-literalsOK,check:test-path-rootsOK,check:vi-mock-specifiers/-inherit/-override-shapeOK,type-check:coverage(43/43),check:spec-symbolsOK,check:installed-pin-claimsOK,check:unreferenced-sourcesOK,check:component-surface-parity(report-only, no finding onchartConfig).apps/console/src/__tests__/registry-inputs-spec-parity.test.tswas not run, because no registration input text changed.eslint --no-inline-config --format json): 8 files, 0 errors. Warnings per modified file did not rise against the base blobs (complex.ts9 → 9,DatasetWidget.tsx12 → 11, the combo test 13 → 5, the chartConfig test 2 → 2). The new plugin-charts test has 2no-explicit-anywarnings, from the recharts mock its siblings use. The config enables no type-aware linting, so this diff cannot move another file's verdict. The repo-widepnpm lintbelongs to CI.Ablations
Each ablation ran from committed state through
ablation-replace.mjs. The anchor hit was proven, and each restore was proven by the blob equalling HEAD plus an emptygit diff HEAD. Every subject is imported by relative source path, so nodistwas involved.DatasetWidget(import plusseries: mergeAuthoredPresentation(…).seriesand...mergeAuthoredPresentation(…).axes). Predicted 7 red, and 7 went red: 5 in the combo file and 2 in the REFUSED block. The other 14 stayed green: thecombofamily, the no-chartConfigcontrol, the forwards, andtype/aria.series?:deleted from the TypeScript member →tsc -p tsconfig.test.jsonexit 2. The output hadTS2322onseriesTombstonedandTS2578(unused@ts-expect-error) on the authoredseriesliteral.normalizeChartSchemastops readingseries[].type(str(raw.chartType) ?? str(raw.type)→str(raw.chartType)).combocase stayed green, because a combo's positional default (a bar, then lines) draws the same counts.Acceptance notes
mergeAuthoredPresentationandaxisPresentationhave no production caller now. They are published exports of@object-ui/core. They were kept on purpose: the claim's Clause-② treats the function as staying exported, and deleting it would also rewriteChartRenderer.axisTitleLocale-10132.test.tsxin plugin-charts, which is outside this claim's file surface. The comments in this file say so. Deleting both, and re-homing that render pin onto a chart node that authors its own axes, is the follow-up. Carrier: none.packages/types/src/zod/data-display.zod.ts: "DatasetWidget→mergeAuthoredPresentation".packages/plugin-report/src/DatasetReportRenderer.tsx: two places say the dashboard makes the same series merge.chart-presentation.axisTitleI18n-10132.test.ts: "mergeAuthoredPresentationis whatDatasetWidgetcalls".ChartRenderer.axisTitleLocale-10132.test.tsx: "the path a dataset-bound surface actually takes".content/docs/plugins/plugin-charts.mdx: "theChartAxisa dashboard widget'schartConfiguses".DashboardRenderer.tsx(inline relay): "declared as the spec's fullChartConfigSchema", and objectstack#17385 described as still open.DashboardChart.chartConfig-4044.test.tsx: "objectstack#17385 owns the precedence … Until it answers".DatasetWidget.chartConfig.dom.test.tsx: "pending objectstack#5175".dashboard-inline-chartconfig-4044.md, which says the same aboutChartConfigSchemaand objectstack#17385.compareTo. Every series now takes the combo's positional mark, overlays included, so an overlay can draw in a different mark from its own measure. Before this change, the same happened to any combo that authored noseries. This is the ruled cost of the retirement, not a new defect class. No public-entry reading was taken. Carrier: none.origin/mainmoved 3 commits since the branch point (objectui#11361, objectui#11359, objectui#11346). None touches this diff's files, andgit merge-treeis clean, so no merge was needed.Dev session:
https://claude.ai/code/session_0122Knsowci76D2rBWReCzzZ(dispatched by thedomain:uiseat 1 PM loop).Generated by Claude Code