Repository navigation
feat(types)!: UnifiedViewConfig.chart retires with a tombstone naming the spec's list chart block; the object-chart legacy-axis refusals stop calling the keys a list-view spelling (objectui#12063) - #12065
Conversation
… the spec's list chart block; the object-chart legacy-axis refusals stop calling the keys a list-view spelling UnifiedViewConfig.chart declared the list-view chart's pre-ADR-0021 inline query (xAxisField, yAxisFields, aggregation, series, config, filter), which no route reads since objectui#6152 round 15. It becomes `chart?: never`, whose docblock names the spec's list chart block (chartType, dataset, dimensions, values) as the remedy; a deletion would have left the interface's index signature admitting `chart` as `any`. The three object-chart refusals of xAxisField / yAxisFields / aggregation drop "the list-view chart block's spelling" and keep their remedies. Claude-Session: https://claude.ai/code/session_01CijGnfWLxTLUFcJkY2ouUw Co-authored-by: Claude <noreply@anthropic.com>
… fails on the tombstone alone A readonly value would have been refused by the retired declaration too, so the row could not tell a revived member from a tombstone. 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
|
…-axis tombstones drop the list-view spelling clause The TypeScript docblocks of ObjectChartSchema.xAxisField / yAxisFields / aggregation opened with "the list-view chart block's spelling", the clause the zod refusals already dropped. Each now opens "no `object-chart` reader consumes KEY"; the remedies and @deprecated lines are unchanged. The changeset names the docblocks beside the refusals. 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: Inputs: card objectui#12063 (body and all five comments: triage 6082380722, claim 6083287264, first-round report 6084051741, claim amendment 6084083560, patch-round report 6084202406); PR objectui#12065 (body, file list, commits, net diff against main at 2a48bd4); the check-runs on the head. The tree was read with git show and git grep at the head and at the base in the local objectui clone; the spec's list chart block was read in the objectstack checkout at e148ca98 (spec 17.7.0, the version objectui's lockfile resolves its Net diff: three commits, linear on the base (merge-base equals the base sha), five files, +209/-22, all under packages/types or .changeset; head repo equals base repo; no governed path (Governed Surface Queue Guard concluded ① Derived judgments
② Semver level
③ Boundary flags
Deviations, first round:
Deviations, patch round:
Not measured, and named as such: consumers outside the reachable checkouts (hotcrm, cloud, production apps). The triage ruling's startup-transition clause puts the burden on named external evidence, none surfaced, and the changeset says so. Right. Check-runs on the head, read at 2026-10-09T15:54Z: 42 runs, 31 Implemented-by: VERDICT: PASS |
Fixes #12063
Clause-②: no
Lane
domain:spec @ objectui. Claim6083287264, amended by6084083560(patch round 1 addspackages/types/src/objectql.ts); ruling: triage6082380722(census first; with zero consumers the member retires with a tombstone naming the spec's list chart block; the three messages ride the same PR). Base:mainat2a48bd4, which carries PR objectui#12060 (0253416). The first round's gates were read at headad25686, and patch round 1's at headdc8e887. Written by a dispatched dev run of the PM seat, sessionhttps://claude.ai/code/session_01CijGnfWLxTLUFcJkY2ouUw.What changes
@object-ui/types,designer.ts:UnifiedViewConfig.chartretires. The member declared the list-view chart's pre-ADR-0021 inline query (chartTypebesidexAxisField,yAxisFields,aggregation,series,config,filter). No route reads those axes since objectui#6152 round 15, and every list-view door refuses them by name. The member is nowchart?: never. Its docblock names the remedy: the spec's list chart block,ListChartConfigfrom@objectstack/spec/ui(thechartmember of itsListView),{ chartType, dataset, dimensions, values }. The otherUnifiedViewConfigmembers are untouched.@object-ui/types,zod/objectql.zod.ts: theobject-chartrefusals ofxAxisField,yAxisFieldsandaggregationdrop "is the list-view chart block's spelling". Each now opens "noobject-chartreader consumes KEY". Each remedy is unchanged:xAxis: { field: 'status' },yAxis: [{ field: 'amount' }],aggregate: { field, function, groupBy }with itsfunctionlist.@object-ui/types,objectql.ts(patch round 1): the TypeScript twins of those three refusals. The docblocks ofObjectChartSchema.xAxisField,yAxisFieldsandaggregationship in the.d.tsand opened with the same clause ("the list-view chart block's spelling, read by noobject-chartreader"). Each now opens "noobject-chartreader consumes KEY". Each remedy sentence and each@deprecatedline is unchanged. Nothing else in the file moves.packages/types/src/__tests__/unified-view-config-chart-retired-12063.test.ts.tsc -p tsconfig.test.json: the member readsundefined; a sibling block does not (the helper can fail); an undeclared key readsany(why a deletion is no refusal); the remedy is the spec's ownListView['chart']. Three@ts-expect-errorrows: the legacy block, a dataset-shaped block (the member retires whole, it is not narrowed) and a widened value.ListChartConfigSchema, and the retired block's six axis keys are refused there by name (unrecognized_keys)..changeset/12063-unified-view-config-chart-retired.md:minorfor@object-ui/types. objectui's version policy never declaresmajor; the body states the break, the remedy table and the unmeasured consumers, and names the docblocks beside the three refusals.git grepover.changeset/forUnifiedViewConfig, the clause and10608answers exit 1 (no hits).Census (H1, H2): zero consumers, so the ruling's retire branch
Read on
2a48bd4withgit grep. Each scope is shown as files namingUnifiedViewConfig/ control files namingDashboardWidgetConfig,ListViewSchemaor@object-ui/types:packages/*/srcdesigner.ts,index.ts)apps/*/src**/__tests__/**,*.test.*)docscontent/docsexamplesskillsThe whole tracked tree has 4 hits: the declaration and one docblock mention in
designer.ts, the re-export inpackages/types/src/index.ts, and oneROADMAP.mdchecklist line that names the type, not.chart. Nothing reads.chartoff the type.Published
.d.tsreach (H2). Radius measured:e148ca98, read only):git grep UnifiedViewConfigexit 1, no hits; control@object-ui/types39 files. No code file there imports from@object-ui/typesat all; it is named only in prose.node_modules. This worktree's pnpm store holds 1587 packages, among them the seven@objectstack/*17.7.0 packages: 0 files nameUnifiedViewConfig. Control@object-ui/typesorListChartConfigSchemainside the@objectstack/*packages: 37 files.No named consumer turned up, so there is no stop and no re-shape.
Tombstone shape (H3)
This follows the house pattern for a type member:
?: neverwith a RETIRED docblock and@deprecatednaming the remedy, the shape ofObjectGridSchema.resizableColumns(objectui#6152 round 7) and of thedesigner.tstombstones (parentId,autoLayout,previewMode). The retire-vs-remove discriminator incomplex.tsputs a tombstone on a surviving carrier when it steers to a live replacement or a deletion would keep the key silently. Both hold here. The remedy is the spec block, andUnifiedViewConfigkeeps[key: string]: any, so a deleted member readsanyand admits every value; ablation R2 below measures that. The interface has no zod mirror, so there is noretirementTombstonehalf to write.The three messages and their pin (H4)
The three arms sit under the objectui#10608 comment block in
ObjectChartSchema. One pin reads them:object-chart-legacy-axis-keys-retired-10608.test.ts. It asserts:invalid_typeat the key;.describe()text;functionvocabulary it PARSES out of theaggregationmessage, against the spec'sChartAggregateSchema.It does not pin the dropped clause, and no test reads the
objectql.tsdocblocks: the pin's block (f) reads types only, and the tests that readobjectql.tsoff disk assert other members. Under the rule that message text is pinned only where a consumer parses it, the clause is not contract. So the pin needs no edit, and no new assertion pins the new wording. The parsedfunctionlist is byte-identical. Ablation R3 confirms the pin does not read the clause.Reverse verification (one-time, committed first)
Each leg ran through objectstack's
scripts/ablation-replace.mjsin WRAP mode. Its own EXIT/INT/TERM trap held the mutation, the anchor hit exactly once, and the write was verified on disk by blob change. A belt trap restored both files fromHEADby absolute path. Nodistis involved: the pin imports../designerand../zod/objectql.zodfrom source. The predicted direction is in brackets.chartasany.ListChartConfiginstead of retiring it [red]: TS2344, plus TS2578 on the dataset-shaped row.xAxisFieldmessage [green, by design]: the 10608 pin passes, 24 of 24.HEADfor both files andgit diff HEADis empty.A first R1 at
f07e75cshowed the widened row passing for a second reason: a readonlyas constvalue is refused by the old type too.ad25686makes that row's value mutable, and R1 atad25686turns it red.Gates at
ad25686(first round)--maxWorkers=2, underos-verify-lock:packages/types/plus every test that namesUnifiedViewConfig,designer.ts,objectql.zodor the messages (9 files outside the package): 377 files, 10279 tests passed.scripts/__tests__/suite: 179 files passed and 2 skipped (5452 tests passed, 2 skipped).VERDICT command-exit 0.pnpm turbo run type-check --filter='...@object-ui/types' --concurrency=2 --continue, under the lock:@object-ui/typesand its 41 downstream packages. Each one echoed its hyphenatedtype-checkscript.Tasks: 77 successful, 77 total,VERDICT command-exit 0.tsc -p tsconfig.test.json --listFilesincludes the new pin.pnpm exec eslint --no-inline-config --format jsonon the 3 changed TS files: exit 0, 0 errors.designer.tswarnings went from 10 to 7, because the retired block's threeanyare gone. The new pin carries 1no-explicit-any, the row that assertsanyon purpose. The population comes fromeslint.config.jsfilesglobs (**/*.{ts,tsx}). The config is not type-aware (noparserOptions.project), so an untouched file's verdict cannot move. The repo-widepnpm lintis CI's.check-changeset-presence("3 source file(s) of 1 released package(s) changed, and this change declares 1 changeset(s)"),check-changeset-no-major,check-changeset-fixed,check-changeset-claims,check-changeset-overwriteandcheck-pending-changeset-literals.check-new-cross-file-line-citations("0 new citation(s)"),check-control-bytes,check-type-check-coverage,check-test-path-roots,check-vi-mock-specifiers,check-vi-mock-inherit,check-vi-mock-override-shape,check-spec-symbol-derivation,check-lint-coverage,check-phantom-dependencies,check-unreferenced-sources,check-shell-escape-residue,check-action-ref-conventionandcheck-pre-install-import-graph.check-governed-queue-guard --testover the 4 paths: NOT GOVERNED.check:readme-exports: not owed. No README or doc changes, and no export is added or removed.Patch round 1: the
objectql.tsdocblock twinsThe claim first named only the zod messages. The first round's report raised the three docblocks as the same clause on the TypeScript face, and the seat amended the claim to add
objectql.ts(6084083560). The in-place fix meets all four conditions:@deprecatedline;objectql.ts(the seat's reading onmainat2a48bd4);packages/types.Body refreshed for patch round 1 at 2026-10-09T15:39Z. Gates at
dc8e887:pnpm --filter @object-ui/types type-check, under the lock: exit 0. It echoedtsc --noEmit && tsc -p tsconfig.examples.json && tsc -p tsconfig.test.jsonand printedVERDICT command-exit 0.packages/types/, under the lock: 368 files and 10115 tests passed,VERDICT command-exit 0.pnpm exec eslint --no-inline-config --format json packages/types/src/objectql.ts: exit 0, 0 errors; 26 warnings, the same as onmainat2a48bd4.pnpm check:control-bytesandpnpm check:new-line-citations("0 new citation(s)"): exit 0.ad25686still covers every type this PR publishes.Acceptance notes
UnifiedViewConfiginterface docblock says "Used by ViewConfigPanel (create/edit)". The census reads no import of the type anywhere. That is out of this card's scope, which is thechartmember only. Noted, not changed.UnifiedViewConfiginterface at all, not only itschartmember. This is an observation with no carrier; onlychartwas this card's to retire.Generated by Claude Code