Uh oh!
There was an error while loading. Please reload this page.
test(plugin-dashboard): the legacy-retired rows say what they really are, and the fixture claim becomes a read - #7158
Conversation
…are, and the fixture claim becomes a read The two annotated `it.each` rows in DashboardGridLayout.legacyRetired.test.tsx introduced their literals with provenance comments naming `examples/schema-catalog/src/schemas/plugin-dashboard/filtered-dashboard.json`. Both comments are false against that fixture as it stands today, mechanically checked key-for-key. They were true when written. `8640cec19` added this file at 01:05:19Z with a literal byte-for-byte identical to the fixture's `widgets[0]` — same keys, same order, same values — and `e028dfcd8` (objectui#4600, PR #4615) migrated the `filtered-*` catalog entries off the retired shape at 02:11:37Z, 66 minutes later. So this is drift, not an invented fixture. The annotations now state the measured history and say plainly that the rows no longer carry the independent-corpus property. The relationship they assert stops being prose: a derived block reads the same fixture at test time, pins that no shipped catalog widget authors the retired binding, and runs the three real shipped widgets through the surface as corpus-derived negative controls. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_012wwHa4aaFybxXrfmfHioDM
…easing nothing Empty frontmatter: the change is one test file in `plugin-dashboard`, with no published behaviour moving. `check-changeset-presence.mjs` names this as the explicit exemption rather than a workaround. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_012wwHa4aaFybxXrfmfHioDM
✅ 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
|
os-warren
commented
Sep 1, 2026
✅ Reviewed and armedAll 30 check runs in one call at
|
| commit | time | what |
|---|---|---|
8640cec19 | 01:05:19Z | added the suite |
e028dfcd8 | 02:11:37Z | migrated the filtered-* entries off the retired shape |
66 minutes apart, with the fixture at the earlier sha byte-for-byte equal to the test literal (checked mechanically, with a self-comparison control). ⇒ the row was a genuine independent corpus specimen, not invented to match the detector. This is drift — caused by a migration named in the card's own Refs.
Recovering that from the public commit log without deepening the shared .git is the right move in this environment, and it is the only reason the truth was reachable at all.
The other half of the card stands, confirmed key-for-key: both comments are false against today's fixture. That is why the repair was still needed.
Route 3 selected by both gates, not by preference
Gate 1 (route 2 — is there a live corpus specimen?) — a structural walk of every widgets[] element across 628 tracked JSON files: 0 carrying the retired keys and 0 the shipped detector would flag, against live controls of 28 widgets in the population, 15 options-shaped, 2 dataset-shaped. An independent git-grep instrument agreed. The only structural hits anywhere were globalFilters[N].optionsFrom nodes — a filter option source, not a widget. So objectui#4600's summary is confirmed by direct measurement, not inherited.
Gate 2 (route 1 vs 3) — plugin-dashboard/tsconfig.test.json declares types: [node], the precondition the packages/types precedent could not meet and relocated for; confirmed afterwards by 82 @types/node files in the program. So route 3 was available, which is what made it correct rather than aspirational.
The honest limit, stated rather than papered over
The independent-corpus property cannot be restored for the legacy rows, and the reason is structural: the zero is by design, because the retirement's whole content is that no authoring surface emits the shape (WidgetConfigPanel scrubs it via LEGACY_ANALYTICS_KEYS) and the catalog is an authoring corpus. So the derived block restores the property on the side where the corpus still has specimens, and the annotations say plainly that the legacy rows no longer carry it — which is exactly what I ruled route 1 would have had to do, arrived at from the other direction.
A3.3: no third false claim. Every remaining provenance claim in the file was checked mechanically and all hold, with the neighbourhood swept too — the sibling DashboardRenderer.legacyRetired.test.tsx carries no provenance claim, and app-shell's "VERBATIM transcription" comments are the well-behaved version of the pattern (they state the claim must be re-earned, and pin it).
Evidence
Two ablation legs distinguishing the two new pins, direction predicted before running: leg A 1 failed | 13 passed (14), leg B 2 failed | 12 passed (14), both failures named. Not green-always pins — the objectui#7102 trap, avoided by demonstration.
xField, which is not unique to widgets[0], so it returned 1 and carries no information — the blob-hash change and injected-marker count are what prove that leg. Naming a check that did not measure what it claimed, inside an otherwise green report, is the same discipline that caught the graft boundary. It is also the second self-caught broken instrument in this round (objectui#7157's dev found theirs too), and I broke one myself earlier today.
Generated by Claude Code
Uh oh!
There was an error while loading. Please reload this page.
Fixes#7151
Measured on
origin/maindd35800af; shipped at81b5da034.The routing tree landed on route 3, and both gates were measurements
Route 2 gate — is there a live corpus specimen of the pre-ADR-0021 shape? No. Two independent instruments, each with a live non-zero control on the same instrument:
widgets[]element in all 628 tracked JSON filesobject/categoryField/valueField/aggregate/rowField/columnFieldat top level; 0 the shipped detector would flagoptions-shaped, 2dataset-shapedgit grep -cover tracked*.jsoncategoryField0,rowField0,columnField0,aggregate0xField11,dataset2The only two structural hits anywhere were
globalFilters[N].optionsFromnodes — a filter's option source, not a widget, and a live surface.A3.4 checked directly rather than inherited: objectui#4600's "all the dashboard catalog examples were migrated" holds against the fixtures, measured, not taken from another card's summary.
Route 1-vs-3 gate — can this package's test tsconfig read a fixture at test time? Yes.
packages/plugin-dashboard/tsconfig.test.jsondeclares"types": ["node"], and its own comment records that as load-bearing and measured. Independently confirmed after the fact: the test program loads 82@types/nodefiles. This is exactly the preconditionpackages/types/src/__tests__/timeline-catalog-fixture-migrated.test.tscould not meet inplugin-timelineand relocated for. So: route 3.The card's premise is half falsified — the claim was TRUE when written
The card's title says the fixture "has never carried" the shape, and its "It was never true" section rests on
git logreturning exactly one commit for both paths. That reading is an artifact.ad0f5f11fis the shallow clone's graft boundary — the oldest commit present. Every file alive at the boundary reports as added there. Control: of 40 randomly sampled tracked files, 35 return exactly that same one commit, and the boundary commit also reports addinglegacyRetiredWidget.ts, which this suite's own header attributes to objectui#4612 — a lower number than the boundary commit's own PR. The instrument can distinguish (package.jsonreturns 18 commits,packages/types/src/complex.tsreturns 3); it simply has nothing to say about paths untouched since the boundary.Recovered the real history from the public commit log without deepening the shared
.git(zero-quota, no shared-state mutation), and it inverts the finding:8640cec19e028dfcd8filtered-*catalog entries off the retired shape (objectui#4600, PR objectui#4615)66 minutes apart. The fixture as it stood at
8640cec19haswidgets[0]equal to the test literal byte-for-byte — same keys, same order, same values (checked mechanically, with a self-comparison control returning true on the same comparator). So the row was a genuine independent corpus specimen; it was not "a fixture invented to match the detector". This is drift, and the migration that caused it is named in the card's own Refs.The second row's comment made the looser claim "
widgets[2]of the same catalog entry" and was never byte-for-byte; its retired binding was verbatim, withidgenericised tow1andtitle/filterBindingsdropped. Substantially true then, false now.Both are false against today's fixture — that part of the card stands, mechanically confirmed key-for-key.
What changed
Both annotations now state the measured history and say explicitly that the rows no longer carry the independent-corpus property — they are historical specimens of stored metadata, which is still the right thing to pin, but is weaker evidence and now says so rather than leaving the next reader to re-derive the confidence.
Route 3's half: the relationship stops being prose. A derived block reads the same fixture at test time and
The property cannot be restored for the legacy rows themselves, and the block says why: the zero is by design. The retirement's whole content is that no authoring surface emits the shape —
WidgetConfigPanelscrubs it on save viaLEGACY_ANALYTICS_KEYS— and the catalog is an authoring corpus.A3.3 sweep — no third false claim
Swept every remaining provenance claim in the file and checked each mechanically. All hold:
object/categoryField/aggregateare not onDashboardWidgetSchema— enumerated the spec Zod schema's 22 top-level keys plus objectui's own additions; controlsdataset/dimensions/values/optionsall present.DashboardGridLayoutis separately exported and registered asdashboard-grid.rowField/columnField— both inLEGACY_ANALYTICS_KEYS.DashboardRendererreally does return the placeholder family-wide for pivot, and this surface really does have a pivot renderer.provider: 'object'config really is read offwidgetData, never the widget top level.Tests, at
81b5da034Whole package, from the repo root: 85 files, 800 tests, all passing. This suite alone went 9 passing to 14.
Ablation, direction predicted before running, on the committed tree:
objecttowidgets[0], keepoptions.datawidgets[0]to its8640cec19retired formwidgets[0]controlMutation proved on disk by blob hash change plus injected-marker count, never an editor's exit code; restore proved by state — blob hash back to the HEAD blob and
git diff HEAD,git diff --cached,git status --shortall empty; absolute paths and anEXIT INT TERMtrap throughout. The restored tree re-measured at 14 passing. One caveat reported rather than quoted as evidence: leg B's "removed marker" check usedxField, which is not unique towidgets[0], so it carries no information; the hash and the injected-marker count are what prove that leg.So this is not the objectui#7102 situation where no available pin could fail — both new pins are independently falsifiable, shown two different ways.
Gates:
check:control-bytes,check:phantom-deps(green on the newnode:builtin imports),check:esm-specifiers,check:vi-mock-specifiers,check:vi-mock-inherit,type-check:coverageall exit 0.pnpm --filter @object-ui/plugin-dashboard type-checkexits 0, and--listFilesconfirms the edited file is genuinely in the test program rather than silently excluded.eslint .for the package: 0 errors, and 0 findings on the edited file (control: sibling files do appear).Changeset verdict quoted rather than predicted — empty frontmatter, per the gate's own named exemption:
Scope
One test file plus one changeset. No published type, export, or parse behaviour is touched, so the contract-review tier is not engaged. Nothing under
content/docs/releases/, and the schema-catalog fixture is unmodified in the diff — it was read, and temporarily mutated only inside the ablation, which restored it provably.Stayed clear of the objectui#6875 lane: no relational-meta file and no
CELL_RELATIONAL_META_KEYS.🤖 Generated with Claude Code
Generated by Claude Code
Generated by Claude Code