Skip to content

docs(plugin-dashboard): correct two headers that still claim this package's tests are uncompiled - #6466

Merged
os-support-ai merged 1 commit into
mainfrom
claude/issue-6426-dashboard-test-header
Aug 26, 2026
Merged

docs(plugin-dashboard): correct two headers that still claim this package's tests are uncompiled#6466
os-support-ai merged 1 commit into
mainfrom
claude/issue-6426-dashboard-test-header

Conversation

@claude

@claudeclaudeBot commented Aug 26, 2026

Copy link
Copy Markdown
Contributor

Fixes#6426

Comment-only. Two headers in @object-ui/plugin-dashboard still said this package's tests are "compiled by nothing". That debt was paid, and the paragraphs did not merely describe the old state — they prescribed against writing a compile-time pin in this package, which is how the legitimate pin objectui#6373 landed was nearly written somewhere else.

What changed

src/__tests__/MetricWidget.domPassthrough.test.tsx — the header claimed tsconfig.json excludes the tests, that the package is "the sole remaining TEST_DEBT entry", and that a @ts-expect-error written there "would be especially dishonest: nothing would ever check that the error it expects still happens."

src/domPassthroughPins.tsnot named on the card, found by censusing the shape rather than the string. The counterpart half of the same contract carried the same premise ("this package's tests are compiled by nothing", plus a stale "6 errors, objectui#4118" count). Fixing only the test file would have left the two halves of one contract disagreeing — precisely the defect the card describes. Same defect class, same package, mechanical, same gate family.

Both now state today's arrangement and name the config that does it, so the reader can see which tsc invocation checks these tests:

tsconfig.test.json type-checks this package's tests, this file included, and this package's type-check script chains it (tsc --noEmit && tsc -p tsconfig.test.json) — which is what CI's Type Check job runs.

The domPassthroughPins.ts placement reasoning — the judgement call the card left open

Kept the pins where they are, re-framed the reason. The header gave three reasons for src/ placement; only one was load-bearing and it is now false. Measured:

  • "tests are compiled by nothing"false, so this no longer forces the split.
  • the narrow tsconfig.typetests.json hatch is not availablestill true (zero exist; the ratchet in scripts/__tests__/check-type-check-coverage.test.ts still turns red on one reappearing), but now beside the point, since the tests are compiled directly.
  • pins belong next to the contract, and being type-only they emit zero runtime bytesstill true, and now the whole of the reason.

So the placement stands on its own merits and the file does not move — that would be a code change on a comment-only card. What changed is that it is now described as a preference rather than a constraint, with both headers pointing at __tests__/ObjectDataTable.emitBoundary-6373.test.tsx, which keeps two live @ts-expect-error directives in a test file for exactly that reason.

The sibling note — checked, no change needed

The card asked me to check ObjectMetricWidget.i18nLabel.test.tsx. It is already consistent and needs no edit: its header records that a @ts-expect-error tombstone was written first and tsc reported both directives UNUSED — behaviour only observable if the file is compiled — and line 246 already says "tsconfig.test.json type-checks this file (chained from the package's type-check script)". Left untouched.

Premise verification — all four triage claims re-derived, none contradicted

ClaimMeasured on origin/main @ e929c562a
tsconfig.test.json existspresent, include: ["src/**/*.test.ts", "src/**/*.test.tsx", "src/**/*.d.ts"]
chains in type-check"type-check": "tsc --noEmit && tsc -p tsconfig.test.json"
coverage gate✅ test type-check coverage: 41/41 packages compile their tests, 0 declared debt
broken @ts-expect-error caughterror TS2578: Unused '@ts-expect-error' directive.

Program membership, with controls: tsc -p tsconfig.test.json --listFiles puts 81 of this package's test files in the program, both relevant files among them; a negative control name scores 0. The build tsconfig.json --listFiles includes domPassthroughPins.ts (1) and 0 test files — so both halves of the replacement text are measured, not assumed.

Ablation — how the TS2578 result was produced

An @ts-expect-error guarding a line with no error was injected above a unique anchor, then proved on disk before measuring: injected-marker grep -c = 1, and the blob hash moved (dda92dbb35539651). tsc -p tsconfig.test.json then exited 2 with the TS2578 line above. Restore leg proved by observation, not by exit code: git checkout HEAD -- <abs path> under an EXIT INT TERM trap using an absolute repo-root path, after which git diff HEAD is empty, the marker count is 0, and the on-disk hash equals the HEAD blob hash. No rebuild was needed — the ablation is a pure tsc program-membership probe, not a dist/ consumer.

Verification

All on the final commit 771ebb3eb, exit codes captured before any pipe.

  • pnpm --filter @object-ui/plugin-dashboard type-check → exit 0 (output echoes @object-ui/plugin-dashboard@17.6.0 type-check and tsc --noEmit && tsc -p tsconfig.test.json, so it is not a zero-match filter reading as green)
  • pnpm exec vitest run on the two touched-adjacent suites plus the finding(plugin-dashboard): ObjectDataTable's enrich() spreads a FieldMeta into the TableColumn[] slot, writing seven keys TableColumn does not declare #6373 pin suite → Test Files 3 passed (3), Tests 25 passed (25)
  • node scripts/check-type-check-coverage.mjs✅ test type-check coverage: 41/41 packages compile their tests, 0 declared debt
  • node scripts/check-changeset-presence.mjs✅ 2 source file(s) of 1 released package(s) changed ... Every one of them has an EMPTY frontmatter — declared as releasing nothing
  • node scripts/check-changeset-no-major.mjs✅ No changeset declares a 'major' bump.
  • pnpm check:control-bytes✅ check-control-bytes: OK (scanned 5344 tracked text file(s); skipped 85 binary).

Lint, and the measurement for narrowing it

Ran the affected package's own lint rather than the repo-wide farm: pnpm --filter @object-ui/plugin-dashboard lint → exit 0, ✖ 393 problems (0 errors, 393 warnings), all pre-existing no-explicit-any warnings in files this PR does not touch.

The narrowing is measured, not assumed:

  1. Population from eslint's own config, not my guess: eslint . --format json in the package reports 111 files selected.
  2. Both changed files are in that set, each errors: 0, warnings: 0.
  3. Nothing outside can move: eslint.config.js configures no project / projectService / tsconfigRootDir, so type-aware linting is off and each file's verdict is a function of its own bytes plus the shared config. This diff changes no config file and touches 2 files, both inside the linted set.

Clause ② — public surface

No public surface change.git diff restricted to **/src/index.ts is empty (0 lines), and no src/index.ts appears in the changed-file list. The diff is 3 files: two block comments and one changeset.

Changeset

.changeset/6426-dashboard-test-header-compiled.md, empty frontmatter — the repo's explicit "releases nothing" declaration (AGENTS.md §Housekeeping). objectui has no skip-changeset label; this is the equivalent and the changeset-presence gate accepts it as a complete answer.

Out of scope, filed separately

#6465 — the same two stale claims in app-shell and core, plus ~10 headers citing a tsconfig.typetests.json that no longer exists anywhere (including one naming packages/core/tsconfig.typetests.json as chained, which it is not). Filed unassigned, finding label. Not touched here: different packages, ~10 files, a much larger review surface than this card. #6465 remains open.


Generated by Claude Code

…s package's tests are uncompiled
`MetricWidget.domPassthrough.test.tsx` and its counterpart
`domPassthroughPins.ts` both said this package's tests are "compiled by
nothing". That debt was paid: `tsconfig.test.json` type-checks this package's
tests and the package's `type-check` script chains it.
The paragraphs did not merely describe the old state, they prescribed against
writing a compile-time pin here — which nearly misrouted the legitimate pin
objectui#6373 landed a few files away in the same package.
Both headers now state today's arrangement and name the config that does it.
The `src/` placement of the pins is kept and re-framed as a preference rather
than a constraint: they still belong next to the contract and still emit zero
runtime bytes, but a pin in a test file is checked now too.
Comment-only. No behaviour change, no public surface change.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011SfZeFWrhGLHmfq61xbz4q
@github-actions

Copy link
Copy Markdown
Contributor

✅ Console Performance Budget

MetricValueBudget
Eager closure (gzip, 52 chunks)3233.9 KB3266.6 KB
Main entry chunk (gzip)157.4 KB350 KB
Entry fileindex-Cs7Gql81.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.30KB4.28KB
app-shell (runtime-config.js)18.10KB6.51KB
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)505.99KB114.64KB
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.66KB12.84KB
plugin-charts (index.js)64.66KB18.32KB
plugin-chatbot (index.js)188.60KB44.82KB
plugin-dashboard (index.js)133.48KB34.49KB
plugin-designer (index.js)211.90KB42.74KB
plugin-detail (index.js)245.26KB62.38KB
plugin-editor (index.js)2.46KB1.10KB
plugin-form (index.js)131.78KB32.19KB
plugin-gantt (index.js)164.14KB39.87KB
plugin-grid (index.js)201.79KB54.60KB
plugin-kanban (index.js)53.16KB14.65KB
plugin-list (index.js)112.74KB27.50KB
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)84.82KB20.79KB
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)56.69KB19.03KB
react (data-invalidation.js)5.05KB2.08KB
react (index.js)2.05KB1.04KB
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)7.54KB2.63KB
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-support-ai
os-support-ai marked this pull request as ready for review August 26, 2026 02:22
@os-support-ai
os-support-ai added this pull request to the merge queueAug 26, 2026
Merged via the queue into main with commit 76da948Aug 26, 2026
30 checks passed
@os-support-ai
os-support-ai deleted the claude/issue-6426-dashboard-test-header branch August 26, 2026 02:34
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

finding(plugin-dashboard): a test header still says this package's tests are compiled by nothing — that debt was paid

2 participants

@os-support-ai@claude