Uh oh!
There was an error while loading. Please reload this page.
refactor(plugin-dashboard): retire the written-never-read FieldMeta.decimals - #6636
Merged
Merged
Conversation
…ecimals `buildFieldMeta` resolved `decimals` from the schema def on every call and the value reached no reader. Re-measured on efdc6c6: zero `.decimals` member reads across @object-ui/fields, @object-ui/i18n, @object-ui/components, @object-ui/core and plugin-dashboard, with `.scale` as a positive control in the same query shape (NumberField.tsx, GridField.tsx, fields/src/index.tsx). The `overrides.decimals` half had already lost its only feeder to objectui#6425; `RecordDetailDrawer` passes no overrides at all. Both halves retire together. The refusal does NOT leave with the member. `ObjectDataTable` derives two bands from `keyof FieldMeta` — `EnrichedColumn`'s write-side tombstones and `AuthoredColumnOverrides`' read-side refusal — so deleting the member would have dropped `decimals` from both and silently un-enforced objectui#6425's retire, with nothing going red. `ObjectDataTableRetiredDecimalsTombstone` now carries that refusal by hand, intersected into both halves of the seam, the same shape as ObjectGrid's `ObjectGridRetiredOptionsTombstone`. Both pin suites keep their directives; each gains a counter-control proving the tombstone — not the derived band, not the excess-property check, not weak-type detection — is what refuses the key. The emit-side pin's source becomes a variable rather than a fresh literal for that reason. 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 28, 2026 07:50
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#6625
Retires
FieldMeta.decimalstogether with the now-unfedBuildFieldMetaParams.overrides.decimals, so the key leaves in one move — andkeeps the refusal that rode on its membership.
The measurement, re-established on this branch's base
⛔ Not inherited from the card, which measured at
c63f6913before objectui#6425landed. Re-run on
efdc6c62, same query shape, same positive control:.decimalsmember reads.scalemember reads (control)NumberField.tsx,GridField.tsx,fields/src/index.tsxThe control fires on exactly the three files the card named, so the zero is a
finding rather than a broken query.
RecordDetailDrawer— the only otherbuildFieldMetacaller — passes no overrides at all, so theoverrides.decimals ??head of the chain had no feeder left either.The post-merge tree agrees with the card.
recordFields.tsx,ObjectDataTable.tsxand the pin were re-read against currentorigin/main;nothing in them contradicts what the card quoted.
The band coupling — and why the pin passes
AuthoredColumnOverrides' refusal band is anExcludetaken over thekeyof FieldMetapool, sodecimals' MEMBERSHIP inFieldMetais whatenforced objectui#6425's retire at the read site. Deleting the member removes it
from the band as a side effect, and the pin would then pass because its subject
stopped existing.
read-side band;
EnrichedColumn's write-side tombstones (objectui#6373) derivefrom the same
keyof FieldMetapool and would have lost the key just assilently.
The refusal is preserved, so no pin needed a deliberate update. A new
ObjectDataTableRetiredDecimalsTombstone({ decimals?: never }) is intersectedinto both halves of the seam. That is not an invention: it is the same shape,
for the same reason, as
ObjectGrid'sObjectGridRetiredOptionsTombstone, whosedocblock already records the mirror-image rule — a pin enforced by a key's
non-membership silently stops enforcing the moment the key becomes a member.
Read from this end: a refusal derived from a key's membership silently stops
enforcing the moment that member is deleted. Both halves get it because the
retirement belongs to the seam, not to one of its two types.
So, in words:
ObjectDataTable.overrideSource-6425.test.tsxpasses because therefusal is still enforced — by the hand-written tombstone rather than by the
derived band. The verdict is unchanged since 2026-08-27; only the artefact
carrying it moved.
That claim is ablated, not asserted
Neutralizing the tombstone to
{}(mutation confirmed on disk: injected-textcount 1, original-text count 0, blob
012508dftoc430a2f6):Both directives go TS2578-unused without it — i.e. without the tombstone this
really would have been a pin going green while blind. Restore proven by observed
state, not exit code: blob hash back to
012508df,git diff HEADempty.ablated tree the runtime suites stayed green —
Test Files 2 passed (2),Tests 22 passed (22), exit 0.@ts-expect-erroris type-erased, so vitestcannot see a lost refusal at all. Only
tsc -p tsconfig.test.jsoncatches it.A bare test-run green would have proved nothing here.
Pins strengthened so they cannot decay
Omitthat drops justdecimalsis the seam type minus the tombstone and nothing else, and it accepts the
very source the directive refuses. So the refusal is the tombstone's: not the
derived band's (which can no longer reach the key), not the excess-property
check's, not weak-type detection's.
literal. As a literal it was refused by the excess-property check whether or
not any tombstone existed — it pinned "something refused this" without pinning
what, and would have gone on passing after the member left.
⛔ No reader was added. Per the card, a future reader for decimal places reads
scale;decimalsis not to be revived. The scale-vs-precision knowledge fromobjectui#2131 moved into the retirement docblock rather than being dropped.
Verification
Every verdict below is the gate's own printed line, with exit status captured
before any pipe. Union re-run on the final commit
c16891e0.pnpm --filter @object-ui/plugin-dashboard build✓ built in 8.85spnpm --filter @object-ui/plugin-dashboard type-check(tsc --noEmit && tsc -p tsconfig.test.json)pnpm --filter @object-ui/plugin-dashboard lint✖ 398 problems (0 errors, 398 warnings)— 0 errors; all warnings pre-existingno-explicit-anyon lines this PR did not authorpnpm exec vitest run packages/plugin-dashboard/(repo root)Test Files 82 passed (82)/Tests 776 passed (776)pnpm --filter @object-ui/app-shell type-checknode scripts/check-changeset-presence.mjs✅ 4 source file(s) of 1 released package(s) changed, and this change declares 1 changeset(s)node scripts/check-changeset-no-major.mjs✅ No changeset declares a major bump.Consumer surface, measured rather than assumed.
app-shellis the closestreal consumer and imports this package in source, so it was type-checked against
a freshly built closure. Beyond it:
FieldMetais not re-exported by thepackage barrel and the
exportsmap publishes only".", so no consumer canname the removed members;
ObjectDataTableProps.schema.columnsisany[], so noconsumer type depends on
FieldMeta's shape.Changeset
minor, per this repo's version-alignment rule (AGENTS.md 版本号策略), whichreserves
majorfor following@objectstackacross a major and has thatmechanically enforced.
re-scored down to satisfy one —
minoris this repo's honest declaration fora breaking removal, with the breaking semantics spelled out in the changeset
prose. Behaviour is unchanged either way: the removed write reached no reader.
Not folded in
objectui#6597 (
referenceTo) is a second dead member in the same type and wasdeliberately left alone — it is a separate unclaimed card, and it stays open. It
would fold cleanly; see the report for what that would need.
Generated by Claude Code