Uh oh!
There was an error while loading. Please reload this page.
test(plugin-list): pin all eight reported columns spellings on a kind:'html' page - #6787
Merged
Merged
Conversation
…nd:'html' page The reported defect no longer reproduces on main. Re-measured every one of the eight spellings objectstack#12649 tried: none lands in the reported state (a populated table whose only header is the index column, with zero diagnostics). Six render data columns — forms 1 and 3 render exactly the authored projection, forms 2, 4, 5, 7 and 8b render the block's defaults — and forms 6 and 8a fail loudly with the compile-error block on screen. Three separate mechanisms produced one symptom, and each was fixed elsewhere: the braced literal subset (#6614 / PR #6669), the unauthored-projection handoff (PR #6679), and the grid's default-column derivation (#6677). What none of those pinned is the card's own claim, which is a statement about all eight spellings at once. This adds that matrix, through the real page renderer, the real html-tier compile against the real registry manifest, the real `list-view` registration and the real `object-grid` — so no future change can put any spelling back into the reported state. Tests only; the changeset declares an empty frontmatter accordingly. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01CRJge11jso9TpXRWFt1Z49
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
|
os-sales
marked this pull request as ready for review
August 29, 2026 13:58
Uh oh!
There was an error while loading. Please reload this page.
This was referenced Aug 29, 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 freeto 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#6598
The reported defect no longer reproduces — this PR is the measurement and the pin
⛔ No product code changes here. The first action on this card was to reproduce the
original symptom on current
main(c6732825d) before writing anything, because themerge that discharged the blocker was the one most likely to have already discharged
this card. It had.
The reported state: a
kind:'html'page whoselist-viewblock renders the rowcount ("23 records") and the filter/group/sort toolbar, but no data columns at all —
only the index column — with zero diagnostics, in all eight spellings the reporter
tried.
Measured on
c6732825d, all eight spellings, end to end through the real pagerenderer, the real html-tier compile against the real registry manifest, the real
list-viewregistration and the realobject-grid:# / Opportunity Name / Amounttype-mismatchwarning), block defaults render# / Opportunity Name / Stage / Amount# / Opportunity Name / AmountviewNamereferenceunknown-prop), block defaults render# / Opportunity Name / Stage / Amountviewreference# / Opportunity Name / Stage / Amountcolumnelementscolumnsattribute at all# / Opportunity Name / Stage / Amountobject-nameview-name# / Opportunity Name / Stage / AmountNot one of the eight lands in the reported state. Six render data columns; the two
that fail do so loudly, with the reason on the page — the opposite of the silent
vanish that was reported.
Why one symptom had three causes
The uniformity of the eight is what made this card hard to anchor: it read as one bug
and was never one. Three unrelated mechanisms happened to look identical from the page,
and each was already discharged elsewhere:
interpretBracematerialized strict JSON only, so thesingle-quoted array every JSX author writes became an inert
{ $expr }marker thatnothing downstream evaluates. Ruled on [Decision] html 层 braced 属性值的字面量语法 —— interpretBrace 是否材料化 JS 字面量子集(单引号字符串 / 无引号键) #6614, landed by PR feat(sdui-parser): materialize the JS literal subset in braced attribute values #6669.
ListViewspelled "the author declared nothing" asfields: [], and an empty array is truthy, soObjectGridpinned its projection atzero and neither default-columns derivation could run. Landed by PR fix(plugin-list): a list-view with no authored columns renders the grid's defaults, not an empty table #6679.
separately on plugin-grid: with a host owning the fetch, ObjectGrid derives default columns from the row payload's keys — the object-schema policy branch is unreachable #6677.
The card's title and its "Triage anchoring evidence" section remain disproven (the
block is
list-view, notobject-table; the live registration does declarecolumns;parse.tskeeps every attribute andvalidateTreeonly warns). Re-titling is triage'swrite, so it is flagged here rather than edited.
What this PR adds
Sibling files pin those mechanisms one at a time —
literal-subset-6614.test.tsandinert-expression-6598.test.tsown the grammar and its diagnostic;ListView.unauthoredColumnProjection-6598.test.tsxowns the handoff against a stubgrid;
htmlTierListViewDefaultColumns-6598.test.tsxtakes the unauthored case end toend.
spellings at once. That can only be checked as a matrix, and only through the real live
registration. The invariant each spelling must satisfy is a disjunction: it either
renders at least one data column, or it fails loudly with the compile-error block
on screen. What no spelling may do is what all eight did when the card was filed —
render a populated table whose only header is the index column.
A spelling moving between those two is a design decision someone can argue about; a
spelling falling out of both is this card regressing.
Reverse verification — two ablations, from the committed state
Both mutate, prove the mutation reached disk by grep counts of the injected and
deleted text plus a blob-hash change, run, then restore via
git checkout HEAD -- PATHproven by an emptygit diff HEADand the blob back at theHEAD value. Each script carries a
traponEXIT INT TERMwith absolute paths. Nodistrebuild applies: the root vitest config aliases@object-ui/*tosrc, so theseruns read source.
Ablation A — undo the handoff fix (
ListView.tsx, blobec955200to840764f2;hasAuthoredColumnshits 4 to 0, injected text 1):Tests 5 failed | 4 passed (9). The five reds are forms 7, 2, 4, 5 and 8b — every"no projection this tier can read" case — and each fails on the card's own invariant
line, i.e. it reproduces the reported symptom exactly. Forms 1 and 3 (authored
projection) and 6 and 8a (loud) stayed green, so the pin is not red for a general
reason.
Ablation B — undo the grammar widening (
parse.ts, blobe162048cto0d9c4dec;readLiteralcall hits 1 to 0, marker 1):Tests 2 failed | 7 passed (9). Only forms1 and 3 go red, and — as predicted before the run — they fail on the exact-projection
assertion, not on the card invariant:
expected [ '#', 'Opportunity Name', ...(2) ] to deeply equal [ '#', 'Opportunity Name', 'Amount' ]. That separation is the usefulresult. PR #6679 alone is what keeps the page out of the reported state; PR #6669 is
what makes it honour the author's projection instead of the defaults.
Verification
Union at final HEAD
3d3103371, working tree clean, all under the shared verify lock,each exit code captured before any pipe.
pnpm exec vitest run packages/plugin-list/ packages/sdui-parser/ scripts/__tests__/=
Test Files 152 passed (152)/Tests 3309 passed (3309)(includes the 9 new cases).scripts/__tests__/is run because the diff editsvitest.config.mts— deriving gatefamilies from changed paths does not answer "what tests read the thing I changed".
pnpm --filter @object-ui/plugin-list run type-checkclean, and proven to coverthe new file:
tsc -p tsconfig.test.json --listFilesshows 1 hit for the new test and1 for
ListView.tsx.pnpm run check:control-bytes=check-control-bytes: OK (scanned 5648 tracked text file(s); skipped 85 binary).pnpm run check:phantom-deps=Every in-scope import is declared by the package that publishes it.pnpm run check:self-import=No package names itself inside its own src/.(runbecause that script reads
vitest.config.mts).node scripts/check-changeset-presence.mjsandcheck-changeset-no-major.mjsbothgreen; the changeset carries an empty frontmatter, the first-class "releases
nothing" declaration for a tests-only change.
pnpm --filter @object-ui/plugin-list lint=439 problems (0 errors, 439 warnings);pnpm run lint:root(coversvitest.config.mts) =28 problems (0 errors, 28 warnings). Thenew file contributes 2 warnings, both
no-explicit-anyon the data-source fixture,matching the sibling end-to-end file.
pnpm run check:sdui-registration-pinsis reported as NOT MEASURED, not as afailure: it exits 2 with
No console build to weigh at apps/console/dist/assets— adeclared prerequisite miss, not a verdict. It is not derived from this diff either (no
registration and no side-effects array is touched). CI builds the console and runs it.
Scope
packages/plugin-list/andpackages/sdui-parser/were the declared surface; the difflands one new test file in
packages/plugin-list/src/__tests__/, the one-lineheavyDomTestsregistration it needs invitest.config.mts, and the changeset. Thesibling surfaces held by other seats are untouched.
Generated by Claude Code