Uh oh!
There was an error while loading. Please reload this page.
fix(app-shell): read view-column list identity in the canonical spelling only - #6098
Merged
Merged
Conversation
…ing only `view-column-io`'s `colLabel` and `colFieldName` carried the same undeclared-alias read `ViewColumnInspector` retired in objectui#5344, one file over. `FieldsListEditor` — the sole importer — renders inside the inspector's own panel, so after objectui#5344 the two surfaces gave the author two different answers about what one column is called. Two consequences the list surface had that the inspector did not: - `colLabel`'s chain was INVERTED, not merely tolerant: `label ?? header ?? field ?? accessorKey` preferred the undeclared `header` over the declared `field`, so a canonical column carrying a stray `header` displayed the alias instead of its own identity. - `colFieldName` feeds `usedFieldNames()`, which the Add-field picker reads, so a spec-refused column reserved a field name and the picker tagged that field "Added" for a column no accepted document binds. Both now read `field` / `label` only. A column the canonical keys cannot name falls through to the positional label `col N` that already sat at the end of that chain, so the row is named and still selectable — measured, not assumed. The write path is untouched: no stored document is rewritten. Fixes#5725 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01CSoz9uGhaaSgiq3hshtN7L
…,header} row is green against both sources Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01CSoz9uGhaaSgiq3hshtN7L
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
|
yinlianghui
marked this pull request as ready for review
August 24, 2026 16:54
Uh oh!
There was an error while loading. Please reload this page.
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#5725
view-column-io'scolLabelandcolFieldNamecarried the sameundeclared-alias read
ViewColumnInspectorretired in #5344, one file over.FieldsListEditor— the sole importer — renders inside the inspector's ownpanel, so after #5344 the two surfaces gave the author two different answers
about what one column is called. This is the sixth site in that family and the
second editor-side one; it reuses #5344's retirement shape as triage directed.
The two defects that were not in dispute
1. The label chain was INVERTED, not merely tolerant. It read
label ?? header ?? field ?? accessorKey, preferring the undeclaredheaderover the declared
field. A canonical column carrying a strayheaderkeydisplayed the alias' value instead of its own declared identity.
2. The field-name read backs more than a label. It feeds
usedFieldNames(),which the Add-field picker consults, so a spec-refused column reserved a field
name.
Both now read
field/labelonly. The write path is untouched — the rawcolumnsarray is still reordered and spliced without normalising, so no storeddocument is rewritten.
The open question, and what was measured
The card declined to rule on whether
colLabelshould drop its alias fallbackoutright or keep a best-effort human label, naming the asymmetry: an empty
field-key box invites re-authoring, an empty list row would leave the author
with nothing to click. The PM's lean was to drop the aliases and let the
positional fallback
col N— already the last link in that chain — be thesomething-to-click, conditional on that fallback actually producing a clickable
row.
Measured, not assumed.
FieldsListEditor.retiredAliases.test.tsxmounts thereal editor, asserts the legacy row renders as
col 1, and then clicks itand asserts
onSelectionChangefires with that label.FieldListRowis arole="button"div carrying a grip, an icon, the label span and a removecontrol, so it does not collapse on an empty label either — and the positional
fallback means the label is never empty. No escalation needed.
Verification
Reverse-verified as two separate legs, direction predicted before running,
each mutation proved on disk by grepping the injected text and separately the
removed text (landing site printed, anchor uniqueness asserted first), restored
under
trap … EXIT INT TERM:label/row assertions, the declared-outranks-alias assertion, and the panel
agreement pin. Both picker-reservation tests stayed green.
colFieldNamealias only): 4 red — both field-namebinding assertions, the
usedFieldNamescounter-probe, and the picker "Added"assertion. Every label/row test and the inspector pin stayed green.
The clean split is the point: the two defects are independent, and neither leg
can be satisfied by the other's fix.
Counter-probes are load-bearing and included: a canonical
{field, label}column still shows its declared label in the list and still reserves its name
in the picker ("Added" badge present), and a bare-string column is untouched.
Otherwise "the aliases are gone" would be satisfiable by breaking the list and
the picker outright.
One assertion was strengthened after leg A came back 4 red where 5 were
predicted: a
{field, label, header}row is green against both sources(the old chain returns
labeltoo), so it could never reverse-verify. It is now{field, header}— the shape the inversion actually bit on.The flipped pin
#5344 committed a pin documented to flip —
ViewColumnInspector.identityRead.test.tsx,the test named "records the residue this card is fenced out of", asserting
getAllByText('Name')had length 1. It is flipped, not deleted: it nowasserts
queryAllByText('Name')has length 0 over the whole panel, that therow is named
col 1, and that the identity controls are still empty — so the"the panel agrees" claim is two-sided. The count goes 2 → 1 → 0 across the two
cards.
Gates (union run on
27d56b063, clean tree)pnpm --filter '@object-ui/app-shell^...' buildpnpm --filter @object-ui/app-shell type-checkvitest run(3 files, 17 tests)pnpm --filter @object-ui/app-shell lintnode scripts/check-changeset-presence.mjsnode scripts/check-control-bytes.mjsnode scripts/check-type-check-coverage.mjsnode scripts/check-lint-coverage.mjspnpm check:esm-specifierspnpm check:i18n-keysWhole-package app-shell vitest was not run — it is ~784 s and holds the
shared verify lock; CI runs the farm exactly once regardless.
Note on the size of defect 2
The card priced it as "hiding a field the author is entitled to add". Measured in
AddFieldPopover's own source:usedNamesdoes not filter the option list(only the search query does) — it renders an "Added" badge and the option stays
clickable. So a spec-refused column mislabelled a field as taken; it never
blocked adding it. Real and reachable, smaller than priced. Recorded in the test
docblock so the pin says what the mechanism does.
Generated by Claude Code