Skip to content

feat(types,plugin-dashboard): land the #6425 per-key ruling — declare format/options/currency, retire decimals - #6626

Merged
os-sales merged 2 commits into
mainfrom
claude/issue-6425-per-key-declare-retire
Aug 27, 2026
Merged

feat(types,plugin-dashboard): land the #6425 per-key ruling — declare format/options/currency, retire decimals#6626
os-sales merged 2 commits into
mainfrom
claude/issue-6425-per-key-declare-retire

Conversation

@os-sales

@os-salesos-sales commented Aug 27, 2026

Copy link
Copy Markdown
Collaborator

Fixes#6425

Lands the maintainer's per-key ruling (2026-08-27, decision-inbox batch 6, 「其他同意」 accepting the post-merge per-key recommendation) on the five authored column override keys ObjectDataTable.enrich() reads. PR #6590 already landed the read-side keyhole (AuthoredColumnOverrides, per-key verdicts, derived ?: never band); this PR is the verdict flip that keyhole was built to carry.

Per-key disposition

keyrulinglanded as
formatdeclareTableColumn.format?: string + TableColumnSchema mirror, same stroke
optionsdeclareTableColumn.options?: Array of value/label/color entries + structured zod mirror
currencydeclareTableColumn.currency?: string + mirror; README now names it an author override (it was kept-but-unpromised; the PM order asked for an explicit decision — decided YES, a declared-but-undocumented key is where authors guess)
decimalsretire, immediatehold member removed, so it falls into the derived refusal band (the held-band verdict flips to RETIRED with no hand-edit to the band); the authored read in enrich() is gone
referenceTo⛔ not declared as spelledleft exactly as held — the remaining hold belongs to #6597 and is NOT unfinished scope here.#6597 remains open: fix the spelling chain (consumers read reference_to / reference) or withdraw the README line.

Static-side decisions (the lockstep gate)

static-table-narrow-surface.test.ts pins Equal over the key sets of StaticTableColumn and TableColumn, so each declared key needed a deliberate static-side decision. All three are tombstones (?: never + z.never().optional()), not live: the static renderer's measured read set is exactly the five live keys (#5474), and all three new keys are field-meta overrides consumed by object-data-table's cell pipeline, which the static table renderer does not have — implementing them there was #5474's rejected Option A. Census moves 5 live + 10 → 5 live + 13; RETIRED_COLUMN_KEYS and RICH_COLUMN_KEYS carry the three new entries.

The zod mirror is pinned by OUTPUT SURVIVAL, not acceptance

A non-strict z.object() accepted all three keys before this PR and silently stripped them, so acceptance was green before the fix and cannot distinguish it from the defect. The new pin asserts the keys survive into the parsed output — format / currency by value, options deep-equal plus the option value sentinel surviving by identity through z.any() (same discipline as editable: false in #5821 and headerIcon in #6424).

decimals: measured before cut, render pinned unchanged

Re-measured on this tree before removing the read: zero .decimals member reads across @object-ui/fields, @object-ui/i18n, @object-ui/components, @object-ui/core and plugin-dashboard itself (every other occurrence is a local variable parsed from a format string); positive control in the same query shape: .scale member reads hit. NumberCellRenderer reads scale, PercentCellRenderer reads precision. The suite's decimals reaches NOTHING pin renders an authored decimals column byte-identical to its absence — before and after the retire (see reverse verification).

The #6004options collision — resolved here under a PM fence extension (option A)

Declaring options on TableColumn silently disarmed #6004's options-retirement at ObjectGrid's emit: that refusal rested on the key's non-membership (excess-property freshness refuses a key no part of the type declares), and membership arrived wholesale through Omit of TableColumn. Nothing went red at the moment of loss — columnEmitBoundary-6004.test.ts:167 merely reported TS2578 (unused directive), which is luck, not design. The PM extended this claim's fence by exactly two files, and the patch round (3f5c1bc7) restores the enforcement while changing nothing about the verdict:

  • ObjectGridRetiredOptionsTombstone (options?: never) in ObjectGrid.tsx, with a docblock recording the mechanism so the "redundant-looking" never cannot be tidied away. It is intersected into bothObjectGridColumnDraft (the type the order named) and the post-fold ObjectGridColumn — deliberately half a step past the order's letter, inside the named file: the post-fold type is the emit that actually reaches the data-table slot, its options membership arrived through the same inheritance, and tombstoning only the draft would leave the very seam finding(plugin-grid): ObjectGrid's generateColumns() is untyped (any[]), so nothing type-checks what it writes into DataTableSchema.columns: TableColumn[] — the hole that hid #5853 and #5453 #6004 ruled about re-openable by a fold-site write. Flagged here so the choice is reviewable, not silent.
  • The emit-boundary pin is re-routed through a non-fresh source (the file's own discipline for tombstone pins), so the tombstone is the refusal's single cause, and its rationale comment records the mechanism move.

The general rule, stated for the record: a pin enforced by a key's non-membership silently stops enforcing the moment the key becomes a member — and inherited membership (an Omit/extends of a published type) is where this dies silently, because someone else's declaration moves your type. Survey of columnEmitBoundary-6004.test.ts for other pins on the same mechanism: nonesummary/label rest on the derived RetiredListColumnKey band (assignability), the #5853lookup pin on union membership; the options pin was the file's only freshness-based refusal, per its own former comment. Nearest relative outside the file, named for carding rather than fixed: overrideSource-6425.test.tsx's scale pin refuses by non-membership too, but AuthoredColumnOverrides' membership is curated (an explicit Pick plus the holds), not inherited — a TableColumn declaration alone cannot silently disarm it; only a deliberate adjudication into the keyhole can, and that edit's own type-check reports the unused directive. Structurally the safer shape.

Verification

Patch-round readings at final commit 3f5c1bc7 (clean tree; every heavy run through the shared verify lock, exits from its VERDICT line, never through a pipe); first-round readings at c63f6913 where noted:

  • Full turbo run type-check sweep — the control that found the collision — now Tasks: 81 successful, 81 total, all 45 package type-check tasks ran, zero red, wrapper VERDICT command-exit 0.
  • Enforcement probe: a temporary non-directive probe authoring options on both emit types went red exactly as predicted — TS2322 at the probe's two lines (…is not assignable to type 'ObjectGridColumnDraft' / …'ObjectGridColumn') — then removed with the restore proven by observation: git diff HEAD empty AND worktree blob == HEAD blob (1d1bc3cb… both sides), never by exit code.
  • Union re-run on the shipped head: repo-root pnpm exec vitest run over types (lockstep + zod-mirror-parity), components (both data-table suites), columnEmitBoundary-6004.test.ts, and all of packages/plugin-dashboardTest Files 87 passed (87) / Tests 832 passed (832), VERDICT command-exit 0, the run itself printing HEAD: 3f5c1bc7.
  • Changeset gates re-run after extending the changeset to @object-ui/plugin-grid: patch: presence (8 source file(s) of 3 released package(s) … declares 1 changeset(s)), no-major, overwrite — each exit 0 with its own OK line. check:control-bytes / check:vi-mock-specifiers / check:phantom-deps re-run — exit 0.
  • First round, at c63f6913: tsc --listFiles proves the edited suites are program inputs (2 + 1 hits); full pnpm build 43/43 then check:readme-exports reporting 0 unbuilt (population intact, NOT the collapse self-report); full turbo run lint 47/47 green.
  • Reverse verification (first round, both committed-first, direction predicted before running, mutation proven on disk by anchored grep counts + blob-hash difference vs HEAD, restores proven by observation):
    • Ablation A (mirror strip): predicted exactly the survival pin and the mirror-census pin turn red while plain acceptance stays green → observed exactly those 2 failed / 26 passed. Vitest resolves these suites on SOURCE via the root alias table (@object-ui/types/zodpackages/types/src/zod/index.zod.ts), so no dist rebuild is part of either leg.
    • Ablation B (decimals read restored): predicted the whole suite STAYS GREEN (no reader exists; the currency positive control separates its pair in the same query shape) → observed 10/10 green. The runtime half staying green under restoration IS the render-unchanged evidence.

Changeset: @object-ui/types minor + @object-ui/plugin-dashboard patch + @object-ui/plugin-grid patch (no major — repo rule).

Out-of-scope finding filed: #6625 (FieldMeta.decimals is schema-written but read by nothing — the dead member this retire exposes; left in place because recordFields.tsx is outside the fence).

Draft on purpose; landing is the PM/maintainer's.

Generated by Claude Code

… format/options/currency, retire decimals
Maintainer ruling (2026-08-27, per key): `format` / `options` — documented AND
kept, declaring is truth-maintenance; `currency` — kept in production, never
promised, declaring makes it honest; `decimals` — neither promised nor kept
(zero readers measured: NumberCellRenderer reads `scale`, PercentCellRenderer
reads `precision`), retired immediately; `referenceTo` — NOT declared as
spelled, stays held for the enforce-or-remove card.
- TableColumn + TableColumnSchema declare the three keys in the same stroke
(zod-mirror-parity); the mirror now passes them through instead of silently
stripping them, pinned by output SURVIVAL (identity for the z.any() value
sentinel), not parse acceptance.
- StaticTableColumn + StaticTableColumnSchema tombstone all three under the
#5474 lockstep rule; RETIRED_COLUMN_KEYS and RICH_COLUMN_KEYS move to
5 live + 13 tombstones.
- AuthoredColumnOverrides reads the trio via Pick<TableColumn, ...>; the
decimals hold is removed, so the key falls into the derived refusal band
(the held-band verdict flips to RETIRED) and the authored read is gone.
Render pinned unchanged — no reader exists for the key.
- README documents `currency` as an author override now that it is a promise.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CRJge11jso9TpXRWFt1Z49
@github-actionsgithub-actionsBot added documentation Improvements or additions to documentation package: types plugin tests labels Aug 27, 2026
@github-actions

Copy link
Copy Markdown
Contributor

✅ Console Performance Budget

MetricValueBudget
Eager closure (gzip, 52 chunks)3237.0 KB3266.6 KB
Main entry chunk (gzip)157.3 KB350 KB
Entry fileindex-HwDBR5HR.js
StatusPASS

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

PackageSizeGzipped
app-shell (consoleActionDispatch.js)0.20KB0.19KB
app-shell (index.js)11.89KB4.50KB
app-shell (runtime-config.js)20.61KB7.35KB
app-shell (types.js)0.01KB0.04KB
app-shell (urlParams.js)10.06KB3.86KB
auth (ActiveOrganizationStorage.js)25.05KB9.16KB
auth (AuthContext.js)0.31KB0.24KB
auth (AuthGuard.js)2.07KB1.00KB
auth (AuthProvider.js)40.18KB10.59KB
auth (AuthShell.js)3.49KB1.40KB
auth (ForgotPasswordForm.js)12.21KB3.45KB
auth (LoginForm.js)18.15KB5.39KB
auth (PreviewBanner.js)0.90KB0.50KB
auth (RegisterForm.js)6.65KB2.22KB
auth (SocialSignInButtons.js)9.61KB3.89KB
auth (UserMenu.js)3.41KB1.23KB
auth (auth-gate-events.js)1.29KB0.66KB
auth (authStyles.js)5.04KB1.72KB
auth (createAuthClient.js)40.21KB10.80KB
auth (createAuthenticatedFetch.js)8.46KB3.43KB
auth (index.js)3.19KB1.44KB
auth (invitation-status.js)1.22KB0.70KB
auth (org-roles.js)6.66KB2.78KB
auth (phone-identifier.js)1.11KB0.66KB
auth (types.js)0.59KB0.35KB
auth (useAuth.js)5.30KB1.02KB
auth (useWorkspaceAdminStatus.js)5.13KB2.35KB
collaboration (CommentThread.js)26.08KB7.56KB
collaboration (LiveCursors.js)3.17KB1.27KB
collaboration (PresenceAvatars.js)6.49KB2.64KB
collaboration (PresenceProvider.js)2.79KB1.13KB
collaboration (index.js)1.68KB0.73KB
collaboration (useCollaborationTranslation.js)6.05KB2.52KB
collaboration (useCommentSearch.js)1.98KB0.88KB
collaboration (useConflictResolution.js)7.75KB1.86KB
collaboration (useMentionNotifications.js)1.81KB0.68KB
collaboration (usePresence.js)6.33KB1.84KB
collaboration (useRealtimeSubscription.js)7.91KB2.01KB
components (index.js)507.69KB114.99KB
core (index.js)5.30KB2.13KB
create-plugin (index.js)10.08KB3.26KB
data-objectstack (index.js)173.10KB47.96KB
fields (index.js)238.89KB60.02KB
i18n (LocalizationContext.js)1.76KB0.96KB
i18n (currency.js)1.22KB0.64KB
i18n (fallbackInterpolation.js)6.25KB2.77KB
i18n (i18n.js)4.28KB1.75KB
i18n (index.js)3.44KB1.39KB
i18n (pickLocalized.js)7.62KB3.26KB
i18n (provider.js)26.89KB9.04KB
i18n (useDisplayLocale.js)2.85KB1.45KB
i18n (useObjectLabel.js)33.40KB8.71KB
i18n (useSafeTranslation.js)5.60KB2.33KB
layout (index.js)38.95KB10.97KB
mobile (MobileProvider.js)0.92KB0.49KB
mobile (ResponsiveContainer.js)0.94KB0.38KB
mobile (breakpoints.js)1.51KB0.70KB
mobile (createOfflineDataSource.js)5.61KB1.75KB
mobile (index.js)1.55KB0.62KB
mobile (offlineQueue.js)3.91KB1.35KB
mobile (pwa.js)0.97KB0.49KB
mobile (serviceWorker.js)1.48KB0.62KB
mobile (serviceWorkerSource.js)3.41KB1.48KB
mobile (useBreakpoint.js)1.54KB0.65KB
mobile (useGesture.js)6.96KB1.98KB
mobile (useOfflineSync.js)1.99KB0.72KB
mobile (usePullToRefresh.js)2.53KB0.85KB
mobile (useResponsive.js)0.72KB0.42KB
mobile (useResponsiveConfig.js)1.37KB0.63KB
mobile (useSpecGesture.js)4.32KB1.64KB
mobile (useTouchTarget.js)1.01KB0.54KB
permissions (MePermissionsProvider.js)9.53KB3.38KB
permissions (PermissionContext.js)0.31KB0.25KB
permissions (PermissionGuard.js)0.89KB0.45KB
permissions (PermissionProvider.js)4.64KB1.50KB
permissions (evaluator.js)5.12KB1.74KB
permissions (index.js)0.93KB0.41KB
permissions (store.js)0.91KB0.42KB
permissions (useFieldPermissions.js)1.28KB0.53KB
permissions (usePermissions.js)1.93KB0.88KB
plugin-ai (index.js)15.75KB3.80KB
plugin-calendar (index.js)46.85KB12.89KB
plugin-charts (index.js)64.66KB18.32KB
plugin-chatbot (index.js)190.33KB45.10KB
plugin-dashboard (index.js)133.46KB34.48KB
plugin-designer (index.js)212.80KB43.15KB
plugin-detail (index.js)245.29KB62.39KB
plugin-editor (index.js)2.46KB1.10KB
plugin-form (index.js)132.01KB32.23KB
plugin-gantt (index.js)165.16KB40.33KB
plugin-grid (index.js)201.66KB54.57KB
plugin-kanban (index.js)53.11KB14.62KB
plugin-list (index.js)112.86KB27.54KB
plugin-map (index.js)20.09KB6.62KB
plugin-markdown (index.js)13.72KB4.69KB
plugin-report (index.js)43.51KB11.94KB
plugin-timeline (index.js)26.72KB7.71KB
plugin-tree (index.js)9.26KB3.13KB
plugin-view (index.js)85.87KB21.12KB
providers (DataSourceProvider.js)0.75KB0.39KB
providers (MetadataProvider.js)1.37KB0.59KB
providers (ThemeProvider.js)1.90KB0.85KB
providers (UploadProvider.js)11.66KB3.50KB
providers (index.js)0.45KB0.23KB
providers (types.js)0.01KB0.04KB
react-runtime (index.js)5.62KB2.34KB
react (LazyPluginLoader.js)4.47KB1.63KB
react (SchemaRenderer.js)65.97KB21.98KB
react (data-invalidation.js)5.05KB2.08KB
react (index.js)2.44KB1.21KB
react (schema-input.js)2.32KB1.24KB
react (spec-input.js)0.20KB0.18KB
sdui-parser (codegen.js)5.41KB2.34KB
sdui-parser (dashboard-widget-options.js)3.08KB1.30KB
sdui-parser (index.js)4.93KB2.24KB
sdui-parser (input-type.js)2.84KB1.40KB
sdui-parser (parse.js)12.13KB3.65KB
sdui-parser (provenance.js)3.66KB1.82KB
sdui-parser (types.js)0.28KB0.23KB
sdui-parser (validate.js)9.30KB3.22KB
types (ai.js)0.20KB0.17KB
types (api-types.js)0.20KB0.18KB
types (app.js)2.87KB0.99KB
types (base.js)0.20KB0.18KB
types (blocks.js)0.20KB0.18KB
types (complex.js)2.74KB1.41KB
types (crud.js)0.20KB0.18KB
types (dashboard-filter-alias.js)6.23KB2.74KB
types (data-display.js)3.75KB1.85KB
types (data-protocol.js)0.20KB0.19KB
types (data.js)0.20KB0.18KB
types (designer.js)1.85KB0.85KB
types (disclosure.js)0.20KB0.18KB
types (error-code.js)1.54KB0.88KB
types (feedback.js)0.20KB0.18KB
types (field-types.js)0.20KB0.18KB
types (form.js)0.20KB0.18KB
types (http-inflight.js)8.87KB3.73KB
types (http-retry.js)4.32KB2.02KB
types (icon-key-migration.js)4.26KB1.63KB
types (index.js)4.72KB2.24KB
types (layout.js)0.20KB0.18KB
types (managed-by.js)0.19KB0.18KB
types (mobile.js)2.59KB1.31KB
types (navigation.js)0.20KB0.18KB
types (objectql.js)0.20KB0.18KB
types (overlay.js)0.20KB0.18KB
types (permissions.js)0.20KB0.18KB
types (plugin-scope.js)0.20KB0.18KB
types (record-components.js)0.20KB0.19KB
types (record-semantics.js)1.28KB0.67KB
types (registry.js)0.20KB0.18KB
types (reports.js)0.20KB0.18KB
types (spec-report.js)5.05KB1.93KB
types (spec-ui-namespace.js)0.20KB0.19KB
types (system-fields.js)3.33KB1.54KB
types (theme.js)6.28KB2.87KB
types (ui-action.js)3.40KB1.71KB
types (views.js)0.20KB0.18KB
types (widget.js)0.20KB0.18KB

Size Limits

  • ✅ Core packages should be < 50KB gzipped
  • ✅ Component packages should be < 100KB gzipped
  • ⚠️ Plugin packages should be < 150KB gzipped

@os-salesClaude

Copy link
Copy Markdown
CollaboratorAuthor

Type Check red at c63f6913 — known, diagnosed, fix in flight. ⛔ No re-run: this is a real failure with a real cause.

ui execution seat, session_01CRJge11jso9TpXRWFt1Z49. Recording it here because the diagnosis existed only in the dev report and a dispatch message, and ⭐ a conclusion that is not on the PR is not a state.

Failing check: Type CheckTS2578: Unused '@ts-expect-error' directive at packages/plugin-grid/src/__tests__/columnEmitBoundary-6004.test.ts:167. Sole red across a full 45-package turbo run type-check sweep.

Why it is this PR's, and not an infrastructure problem. It is a direct, expected consequence of the ruled change, and it is the interesting part of this PR:

⭐⭐ #6004's options-retire pin at ObjectGrid's emit was enforced only by excess-property freshness — that is, by options NOT being a member of TableColumn. The maintainer's ruling declares options on TableColumn, so the excess-property error disappears, the directive goes unused, and TS2578 fires.

The generalisable finding: a pin enforced by a key's non-membership silently stops enforcing the moment that key becomes a member. Nothing goes red at the moment of loss — TS2578 fired here only because the directive happened to become unused, which is luck rather than design. Had the pin been written without a directive, the enforcement would have evaporated in silence.

The fix, and its fence.#6004's verdict is unchanged — options stays retired at ObjectGrid's emit. Only the mechanism moves: from implicit freshness to an explicit never-tombstone on ObjectGridColumnDraft, plus a rationale comment recording why the tombstone is now the only thing holding the refusal.

That lands in packages/plugin-grid/**, which this dispatch originally forbade. ⭐ The dev stopped at the fence and reported rather than crossing it — correct behaviour; the fence being drawn too narrow was the PM's error, not the dev's to route around. The fence has been extended to exactly two files (ObjectGrid.tsx and that test), on the measurement that plugin-grid is currently unheld: no dev in flight, and no other open PR touches it. The patch round is in progress.

⛔ Nothing else in plugin-grid is in scope — in particular the seven surviving (col as any) reads, fitContent (its verdict is in the decision box on #6424), and the name alias (#5120, held on purpose) are all untouched.

Landing is gated on the patch round bringing the 45-package sweep to zero red, on the new head.


Generated by Claude Code

…t tombstone
PM fence extension on the #6425 claim (option A). Declaring `options` on
TableColumn (the #6425 ruling) silently ended the #6004 retirement's only
enforcement, which rested on the key's NON-membership of the emit types:
excess-property freshness refuses a key no part declares, and stops the
moment it becomes a member — nothing goes red at the moment of loss.
`ObjectGridRetiredOptionsTombstone` (`options?: never`) restores the refusal
by assignability, intersected into BOTH ObjectGridColumnDraft and
ObjectGridColumn because the retirement belongs to the seam, not one type.
The emit-boundary pin is re-routed through a non-fresh source so the
tombstone is its single cause, and both the type's docblock and the test's
rationale record the mechanism so the "redundant-looking" never cannot be
tidied away. #6004's verdict is unchanged.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CRJge11jso9TpXRWFt1Z49
@github-actions

Copy link
Copy Markdown
Contributor

✅ Console Performance Budget

MetricValueBudget
Eager closure (gzip, 52 chunks)3237.0 KB3266.6 KB
Main entry chunk (gzip)157.3 KB350 KB
Entry fileindex-HwDBR5HR.js
StatusPASS

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

PackageSizeGzipped
app-shell (consoleActionDispatch.js)0.20KB0.19KB
app-shell (index.js)11.89KB4.50KB
app-shell (runtime-config.js)20.61KB7.35KB
app-shell (types.js)0.01KB0.04KB
app-shell (urlParams.js)10.06KB3.86KB
auth (ActiveOrganizationStorage.js)25.05KB9.16KB
auth (AuthContext.js)0.31KB0.24KB
auth (AuthGuard.js)2.07KB1.00KB
auth (AuthProvider.js)40.18KB10.59KB
auth (AuthShell.js)3.49KB1.40KB
auth (ForgotPasswordForm.js)12.21KB3.45KB
auth (LoginForm.js)18.15KB5.39KB
auth (PreviewBanner.js)0.90KB0.50KB
auth (RegisterForm.js)6.65KB2.22KB
auth (SocialSignInButtons.js)9.61KB3.89KB
auth (UserMenu.js)3.41KB1.23KB
auth (auth-gate-events.js)1.29KB0.66KB
auth (authStyles.js)5.04KB1.72KB
auth (createAuthClient.js)40.21KB10.80KB
auth (createAuthenticatedFetch.js)8.46KB3.43KB
auth (index.js)3.19KB1.44KB
auth (invitation-status.js)1.22KB0.70KB
auth (org-roles.js)6.66KB2.78KB
auth (phone-identifier.js)1.11KB0.66KB
auth (types.js)0.59KB0.35KB
auth (useAuth.js)5.30KB1.02KB
auth (useWorkspaceAdminStatus.js)5.13KB2.35KB
collaboration (CommentThread.js)26.08KB7.56KB
collaboration (LiveCursors.js)3.17KB1.27KB
collaboration (PresenceAvatars.js)6.49KB2.64KB
collaboration (PresenceProvider.js)2.79KB1.13KB
collaboration (index.js)1.68KB0.73KB
collaboration (useCollaborationTranslation.js)6.05KB2.52KB
collaboration (useCommentSearch.js)1.98KB0.88KB
collaboration (useConflictResolution.js)7.75KB1.86KB
collaboration (useMentionNotifications.js)1.81KB0.68KB
collaboration (usePresence.js)6.33KB1.84KB
collaboration (useRealtimeSubscription.js)7.91KB2.01KB
components (index.js)507.69KB114.99KB
core (index.js)5.30KB2.13KB
create-plugin (index.js)10.08KB3.26KB
data-objectstack (index.js)173.10KB47.96KB
fields (index.js)238.89KB60.02KB
i18n (LocalizationContext.js)1.76KB0.96KB
i18n (currency.js)1.22KB0.64KB
i18n (fallbackInterpolation.js)6.25KB2.77KB
i18n (i18n.js)4.28KB1.75KB
i18n (index.js)3.44KB1.39KB
i18n (pickLocalized.js)7.62KB3.26KB
i18n (provider.js)26.89KB9.04KB
i18n (useDisplayLocale.js)2.85KB1.45KB
i18n (useObjectLabel.js)33.40KB8.71KB
i18n (useSafeTranslation.js)5.60KB2.33KB
layout (index.js)38.95KB10.97KB
mobile (MobileProvider.js)0.92KB0.49KB
mobile (ResponsiveContainer.js)0.94KB0.38KB
mobile (breakpoints.js)1.51KB0.70KB
mobile (createOfflineDataSource.js)5.61KB1.75KB
mobile (index.js)1.55KB0.62KB
mobile (offlineQueue.js)3.91KB1.35KB
mobile (pwa.js)0.97KB0.49KB
mobile (serviceWorker.js)1.48KB0.62KB
mobile (serviceWorkerSource.js)3.41KB1.48KB
mobile (useBreakpoint.js)1.54KB0.65KB
mobile (useGesture.js)6.96KB1.98KB
mobile (useOfflineSync.js)1.99KB0.72KB
mobile (usePullToRefresh.js)2.53KB0.85KB
mobile (useResponsive.js)0.72KB0.42KB
mobile (useResponsiveConfig.js)1.37KB0.63KB
mobile (useSpecGesture.js)4.32KB1.64KB
mobile (useTouchTarget.js)1.01KB0.54KB
permissions (MePermissionsProvider.js)9.53KB3.38KB
permissions (PermissionContext.js)0.31KB0.25KB
permissions (PermissionGuard.js)0.89KB0.45KB
permissions (PermissionProvider.js)4.64KB1.50KB
permissions (evaluator.js)5.12KB1.74KB
permissions (index.js)0.93KB0.41KB
permissions (store.js)0.91KB0.42KB
permissions (useFieldPermissions.js)1.28KB0.53KB
permissions (usePermissions.js)1.93KB0.88KB
plugin-ai (index.js)15.75KB3.80KB
plugin-calendar (index.js)46.85KB12.89KB
plugin-charts (index.js)64.66KB18.32KB
plugin-chatbot (index.js)190.33KB45.10KB
plugin-dashboard (index.js)133.46KB34.48KB
plugin-designer (index.js)212.80KB43.15KB
plugin-detail (index.js)245.29KB62.39KB
plugin-editor (index.js)2.46KB1.10KB
plugin-form (index.js)132.01KB32.23KB
plugin-gantt (index.js)165.16KB40.33KB
plugin-grid (index.js)201.66KB54.57KB
plugin-kanban (index.js)53.11KB14.62KB
plugin-list (index.js)112.86KB27.54KB
plugin-map (index.js)20.09KB6.62KB
plugin-markdown (index.js)13.72KB4.69KB
plugin-report (index.js)43.51KB11.94KB
plugin-timeline (index.js)26.72KB7.71KB
plugin-tree (index.js)9.26KB3.13KB
plugin-view (index.js)85.87KB21.12KB
providers (DataSourceProvider.js)0.75KB0.39KB
providers (MetadataProvider.js)1.37KB0.59KB
providers (ThemeProvider.js)1.90KB0.85KB
providers (UploadProvider.js)11.66KB3.50KB
providers (index.js)0.45KB0.23KB
providers (types.js)0.01KB0.04KB
react-runtime (index.js)5.62KB2.34KB
react (LazyPluginLoader.js)4.47KB1.63KB
react (SchemaRenderer.js)65.97KB21.98KB
react (data-invalidation.js)5.05KB2.08KB
react (index.js)2.44KB1.21KB
react (schema-input.js)2.32KB1.24KB
react (spec-input.js)0.20KB0.18KB
sdui-parser (codegen.js)5.41KB2.34KB
sdui-parser (dashboard-widget-options.js)3.08KB1.30KB
sdui-parser (index.js)4.93KB2.24KB
sdui-parser (input-type.js)2.84KB1.40KB
sdui-parser (parse.js)12.13KB3.65KB
sdui-parser (provenance.js)3.66KB1.82KB
sdui-parser (types.js)0.28KB0.23KB
sdui-parser (validate.js)9.30KB3.22KB
types (ai.js)0.20KB0.17KB
types (api-types.js)0.20KB0.18KB
types (app.js)2.87KB0.99KB
types (base.js)0.20KB0.18KB
types (blocks.js)0.20KB0.18KB
types (complex.js)2.74KB1.41KB
types (crud.js)0.20KB0.18KB
types (dashboard-filter-alias.js)6.23KB2.74KB
types (data-display.js)3.75KB1.85KB
types (data-protocol.js)0.20KB0.19KB
types (data.js)0.20KB0.18KB
types (designer.js)1.85KB0.85KB
types (disclosure.js)0.20KB0.18KB
types (error-code.js)1.54KB0.88KB
types (feedback.js)0.20KB0.18KB
types (field-types.js)0.20KB0.18KB
types (form.js)0.20KB0.18KB
types (http-inflight.js)8.87KB3.73KB
types (http-retry.js)4.32KB2.02KB
types (icon-key-migration.js)4.26KB1.63KB
types (index.js)4.72KB2.24KB
types (layout.js)0.20KB0.18KB
types (managed-by.js)0.19KB0.18KB
types (mobile.js)2.59KB1.31KB
types (navigation.js)0.20KB0.18KB
types (objectql.js)0.20KB0.18KB
types (overlay.js)0.20KB0.18KB
types (permissions.js)0.20KB0.18KB
types (plugin-scope.js)0.20KB0.18KB
types (record-components.js)0.20KB0.19KB
types (record-semantics.js)1.28KB0.67KB
types (registry.js)0.20KB0.18KB
types (reports.js)0.20KB0.18KB
types (spec-report.js)5.05KB1.93KB
types (spec-ui-namespace.js)0.20KB0.19KB
types (system-fields.js)3.33KB1.54KB
types (theme.js)6.28KB2.87KB
types (ui-action.js)3.40KB1.71KB
types (views.js)0.20KB0.18KB
types (widget.js)0.20KB0.18KB

Size Limits

  • ✅ Core packages should be < 50KB gzipped
  • ✅ Component packages should be < 100KB gzipped
  • ⚠️ Plugin packages should be < 150KB gzipped

@os-salesClaude

Copy link
Copy Markdown
CollaboratorAuthor

Patch round ACCEPTED on substance; the Type Check red above is resolved. ui execution seat, session_01CRJge11jso9TpXRWFt1Z49. New head 3f5c1bc7; farm re-registered 29/29 with 0 failures and Type Check running fresh. ⛔ Not flipped — landing waits on every check green on this head.

The control fired, and the control is the point

The collision was found by a full turbo run type-check sweep, so the same sweep is what clears it: 81/81 tasks, all 45 package type-checks, zero red — against exactly one red (the TS2578) on the previous head. ⭐ Re-running the instrument that found the problem, rather than a narrower one that would also have gone green, is what makes this a resolution instead of a disappearance.

And the tombstone was proven to enforce, not merely to compile: a probe authoring options on both emit types went red with TS2322 at exactly the probe's two lines, with the mutation proven on disk and the restore proven by observation (git diff HEAD empty and matching blob hashes) rather than by exit code. ⛔ A never member that type-checks is not evidence it refuses anything.

The half-step past my order is accepted, and it was the right call

My fence named ObjectGridColumnDraft. The tombstone went into both that and the post-fold ObjectGridColumn, with the reason stated rather than assumed: the post-fold type is the emit that actually reaches the data-table slot, its options membership arrived through the same TableColumn inheritance, and tombstoning only the draft would have left #6004's ruled seam re-openable at the fold site.

⭐ That is a fence I drew from a report rather than from the file, and the dev found the hole in it. Declaring the widening in the PR body, staying inside the file I named, and not touching anything else in plugin-grid is exactly the handling I want — the alternative was a refusal that looked complete and was not.

⛔ Confirmed still untouched: the seven (col as any) reads, fitContent (its verdict is in the decision box on #6424), and the name alias (#5120).

The survey answer is the durable part

I asked for other pins resting on the same non-membership mechanism — named, not fixed. The answer:

⭐ That distinction is worth more than the fix: inherited membership is what makes a non-membership pin fragile, not non-membership itself. A refusal built on a curated surface stays enforceable; one built on an inherited surface disarms the moment an upstream declaration lands, with nothing going red at the moment of loss. Named here for carding rather than fixed, per the order.

Scope

Fixes #6425 stands — all four in-scope keys remain disposed of (three declared with static tombstones, decimals retired). referenceTo's hold still belongs to #6597 and is not unfinished scope for this card. Changeset correctly extended to @object-ui/plugin-grid: patch.


Generated by Claude Code

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentationImprovements or additions to documentationpackage: typesplugintests

Projects

None yet

Development

Successfully merging this pull request may close these issues.

finding(plugin-dashboard): ObjectDataTable honours five undeclared authored column keys as field-meta overrides

2 participants

@os-sales@claude