feat(types): retire the inert dashboard-root title declaration - #7633
Merged
Conversation
`DashboardComponentSchema.title` was declared under the comment "Dashboard title displayed in the header" — a description of behaviour that had stopped existing: objectui#7509 retired all five dashboard-root `title` read arms under ADR-0049, leaving the key declared, documented as rendering, and inert. The header text is the spec-canonical `label` on `BaseSchema`. Follows the objectui#5830 removal shape, with the one half of it that transfers. `BaseSchema` carries an index signature, so an authored `title` still compiles and a `@ts-expect-error` pin cannot stick; the pinnable effect is that `title` stops being a DECLARED member, which `__tests__/dashboard-title-retired-declaration.test.ts` asserts while keeping `columns` / `widgets` / `header` as positive controls and widget-level `DashboardWidgetSchema.title` — a different, live receiver — as an explicit one. ⛔ No tombstone, unlike `aria`: `@objectstack/spec`'s strict `DashboardSchema` refuses a root `title` as an UNRECOGNIZED key rather than with a named removal message, so there is nothing to inherit by reference and inventing one would assert a spec behaviour that does not exist. objectui's Zod twin is `.passthrough()` and its verdict does not move. `zod-mirror-parity.test.ts`'s `UnmirroredDeclared` ledger shrinks by removing the DECLARATION — the objectui#7129 route, reaching the SPEC-DERIVED half for the first time: 16 entries / 97 keys to 15 / 96, spec-derived 3 / 13 to 2 / 12, and the "no entry in either unmirrored ledger" population 143 to 144. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01KbJQ1y1J12nZxYzFWhP8Q3
Contributor
✅ 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
|
This was referenced Sep 4, 2026
os-warren
marked this pull request as ready for review
September 4, 2026 12:48
Collaborator
Landing — contract review PASS at
|
os-warren
deleted the
claude/issue-7623-dashboard-schema-title-retire
branch
September 4, 2026 13:03
This was referenced Sep 4, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Fixes #7623
DashboardComponentSchema.titlewas declared on objectui's own dashboard componenttype under the comment "Dashboard title displayed in the header". That comment stopped
being true when objectui#7509 (PR #7622, merged 08:32Z) retired all five dashboard-root
titleread arms under ADR-0049: the key was left declared, documented as rendering,and inert. This removes the declaration, following the objectui#5830 (
aria) removalshape — same interface, same treatment — with the one half of that shape which
transfers.
Premise re-verified on
mainbefore writing anything, with a lit control: nodashboard-root
titleread site remains anywhere outside comments and tests, while thesame query still finds the widget-level reads (
DashboardRenderer.tsx:360,DashboardGridLayout.tsx:272,513,DashboardWithConfig.tsx:107). A query that foundnothing at all would have been a dead query, not evidence.
What changed
packages/types/src/complex.ts— the member is gone; a note in its place recordswhat it was, why it went, and where the pin lives (the shape objectui#5830 left for
aria, four members below it).packages/types/src/__tests__/dashboard-title-retired-declaration.test.ts(new) —the retirement pin.
packages/types/src/__tests__/zod-mirror-parity.test.ts— theUnmirroredDeclaredledger shrinks by removing the DECLARATION: the objectui#7129route, reaching the SPEC-DERIVED half for the first time. 16 entries / 97 keys →
15 / 96; spec-derived 3 / 13 → 2 / 12; the "no entry in either unmirrored
ledger" population 143 → 144. Every count sentence in the file header, in the
ledger's own header, and on
assertionUnmirroredMatchesLedgerwas re-derived ratherthan nudged, and the cross-reference the deleted entry carried (
DashboardWidgetSchemaread "same reading as
DashboardComponentSchema") is now self-contained. The pairkeeps its
KnownDriftentry — this touches the unmirrored ledger only..changeset/7623-retire-dashboard-root-title-declaration.md—minorfor@object-ui/types, matching objectui#5830 and objectui#7129: a narrowed publishedtype surface, no capability retired.
Two rulings this PR follows
No tombstone (ruled at dispatch). Unlike
aria,titlehas none to inherit:@objectstack/spec's strictDashboardSchemarefuses a roottitleas anUNRECOGNIZED key, not with a named removal message. objectui's Zod twin extends
.passthrough()BaseSchema, so its verdict on a roottitledoes not move at all —it parsed before, it parses now. Inventing a named refusal would have asserted a spec
behaviour that does not exist, so the Zod-twin half of the objectui#5830 pin is
deliberately absent and the pin file says so in prose. The spec's own refusal stays
measured where it belongs, against the spec schema, in
plugin-dashboard/src/__tests__/dashboardAuthoredInputs.test.tsx.No
@ts-expect-errorpin (the trap).BaseSchemacarries[key: string]: any, soan authored
title:on a dashboard literal still compiles after the removal — it fallsto the index signature. A
@ts-expect-errorpin cannot stick here and would pass forthe wrong reason. The pin is the key-set probe objectui#5830 established: extract the
interface's literal key set (
string extends Kfilters the index signature out) andassert
titleis out whilecolumns,widgetsandheaderstay in.The widget-level key is a different receiver and stays.
DashboardWidgetSchema.titleis the spec's
I18nLabel, live and read. The pin carries it as an explicit control(
'title' extends WidgetDeclared ? true : false), plus a negative control on the sameextraction — without that leg a sweep that deleted both spellings would still read green.
Verification — all at
f997f936, run from the repo rootpnpm exec vitest run packages/types/Test Files 103 passed (103)·Tests 1730 passed (1730)pnpm exec vitest run …/dashboard-title-retired-declaration.test.tsTest Files 1 passed (1)·Tests 2 passed (2)pnpm --filter @object-ui/types type-check(tsc --noEmit+ examples +tsconfig.test.json)pnpm exec turbo run type-check --concurrency=2(repo-wide net)Tasks: 81 successful, 81 total· exit 0pnpm exec eslint .(whole repo,--format json)no-explicit-anywarnings onDashboardWidgetSchema's untouchedchartConfig/filter)node scripts/check-changeset-presence.mjs✅ 2 source file(s) of 1 released package(s) changed, and this change declares 1 changeset(s)node scripts/check-control-bytes.mjs✅ check-control-bytes: OK (scanned 6241 tracked text file(s); skipped 85 binary)node scripts/check-spec-symbol-derivation.mjs✅ spec member citations: no comment cites a key its spec symbol does not declarenode scripts/check-doc-component-types.mjs✅ Every documented component type is registerednode scripts/check-vi-mock-specifiers.mjs✅ OK (4254 tracked source file(s), 2542 test-named)node scripts/check-governed-queue-guard.mjs --testover the four changed paths✅ NOT GOVERNED — none of the 5 governed surfaces matched(this PR still parks as draft, for Clause-② below, not for governance)Declared narrowing — two gates NOT MEASURED locally, and why that is a measurement
gap and not a green:
check:doc-snippetsreturned its own exit 2 /PRECONDITION NOT MET— the snippetprogram needs ~25 packages built first, and the shared verify lock has been held by a
sibling dispatch throughout. Predictable-but-unmeasured reasoning, offered as reasoning
only: no typed doc snippet authors a dashboard-root
title(the soleDashboardComponentSchemaliteral in the docs,plugins/plugin-dashboard.mdx:342, setstype/columns/widgets, and itstitleis a widget's, inside aplaintextfence), and
BaseSchema's index signature would keep such a line compiling anyway.CI's
doc-snippet-types.ymlruns it on this PR.check:readme-exportsexits 1 on this tree for the same class of reason — fiveself-imports it cannot judge because
@object-ui/cliand@object-ui/plugin-aihave nodist/index.d.tson disk (run pnpm build first). Not about this diff: it changes noREADME and no export.
The pin is in the type-check program, not merely on disk:
tsc -p tsconfig.test.json --listFileslistsdashboard-title-retired-declaration.test.ts(checked because atypecheckthat excludes test files is a true statement about nothing).Ablation — predicted before running, then observed
Restored the member on top of the commit, measured, restored. Mutation proved on disk
(injected marker present, blob
01bc2bf8≠ HEAD blob17fe9557) before any reading wastaken; the restore leg proved by blob equality back to
17fe9557and an emptygit diff HEAD, with anEXIT INT TERMtrap on absolute paths as the crash-pathbackstop.
tsc -p tsconfig.test.jsonred on the pin'stitleNotDeclaredlinedashboard-title-retired-declaration.test.ts(65,11): error TS2322: Type 'true' is not assignable to type 'false'— line 65 is exactly that assertiontscred onassertionUnmirroredMatchesLedger, naming the pairzod-mirror-parity.test.ts(1478,14): error TS2322: Type '"complex.zod.ts#DashboardComponentSchema"' is not assignable to type 'never'— line 1478 is that assertionTest Files 1 passed (1)·Tests 2 passed (2), exit 0That third row is the honest statement of where the enforcement lives: this pin is held
by
type-check(viapackages/types/tsconfig.test.json), not by the vitest run. Readingthe vitest exit code for evidence about it measures the wrong instrument.
Housekeeping
yes. Removing a declared member of an exportedtype moves a published name — it narrows the published surface.
needs:contract-reviewis on this PR and on the card. The PR is a draft and parks for the director seat at
CONTRACT_REVIEW_TIER; ⛔ not flipped ready, not enqueued, and the change was nottrimmed to dodge the clause.
minor/@object-ui/types. Notskip-changeset— this is released source.content/docs/api/schema-reference.md'sDashboardComponentSchemaproperty table neverlisted a root
title(itstitleoccurrences are widget-level, or onpage/card),so no doc change is owed. The lone occurrence of the deleted doc comment string in the
whole repo was the declaration itself.
examples/schema-catalog/**(dispatch finding(examples): six catalog dashboards author a roottitlethat no arm reads — and none rendered one even before #7509 #7624),packages/core/**, the four plugin packages,plugin-dashboard/src/utils.tsorreact/src/hooks/useSettledSchema.ts(dispatch finding(core): the six per-blockdata.provider === 'object'folds could collapse onto one shared reader — the seventh now lives innormalizeListViewSchema#7627) was touched — the diff is fourfiles, all under
packages/typesplus the changeset.🤖 Generated with Claude Code
https://claude.ai/code/session_01KbJQ1y1J12nZxYzFWhP8Q3
Generated by Claude Code