Skip to content

test(core): name the closed-surface pin after the project that compiles it - #6555

Merged
os-support-ai merged 1 commit into
mainfrom
claude/issue-6548-stale-test-name
Aug 26, 2026
Merged

test(core): name the closed-surface pin after the project that compiles it#6555
os-support-ai merged 1 commit into
mainfrom
claude/issue-6548-stale-test-name

Conversation

@claude

@claudeclaudeBot commented Aug 26, 2026

Copy link
Copy Markdown
Contributor

Fixes#6548

One test name changes. Nothing else.

 describe('ActionDef is a closed surface (objectstack#4075 step 3)', () => {
- it('states its contract as types, compiled by tsconfig.typetests.json', () => {+ it('states its contract as types, compiled by tsconfig.test.json', () => {

tsconfig.typetests.json was the narrow per-file project that used to name this
file by hand; it was retired when the package graduated (objectui#4040) and zero
files by that name exist anywhere in the repo today. What actually compiles this
file is packages/core/tsconfig.test.json, chained off the package's
type-check script. The replacement matches the house style already used by
#6465's corrected headers in this same package
(Compile-time pins — compiled by tsconfig.test.json, chained off type-check.).

This was the last present-tense citation left after #6465's sweep, which was
fenced comment-only: an it() string is code, not a comment, and rewording it
changes what the suite reports. That fence is why the site survived; this PR is
its other side.

Pre-flight — nothing pins this test's reported name

The one real risk here was a hidden pin on the reported name, where the breakage
would surface as an unrelated failure. Checked before renaming:

CheckedResult
The literal name string, repo-wideExactly 1 occurrence — its own definition. No consumer.
Snapshot filesOnly 2.snap files exist repo-wide, both under packages/components/src/__tests__/__snapshots__/. packages/core has none. Neither contains this suite's describe/it text.
--testNamePattern / -t filtersOne hit repo-wide: the known-flag list inside scripts/vitest-invocation-guard.mjs (argument parsing). No script, package manifest or workflow filters by name.
Reporter configThe only reporter key in any vitest config is coverage.reporter in the root vitest.config.mts. No name-based selection anywhere.
Another suite asserting on this suite's output5 files mention actionDef-closed-surface.test.ts; all 5 are prose (comments plus one changeset). None reads or asserts this suite's reported names.
The describe nameAppears only at its own definition.
Workflows and docsNo workflow and no doc/QA inventory names this suite.
Lint rulesNo rule in eslint-rules/ inspects test names.

Verification, at 27c8b6670

The test runs and passes under its new name — verbose reporter, so the
reported string is the evidence:

 ✓ |unit| packages/core/src/actions/__tests__/actionDef-closed-surface.test.ts > ActionDef is a closed surface (objectstack#4075 step 3) > states its contract as types, compiled by tsconfig.test.json 3ms
Test Files 1 passed (1)
Tests 3 passed (3)

The reported name actually flipped, measured in both directions with the same
command shape so a zero cannot come from a pattern that simply matches nothing:

vitest run actionDef-closed-surface.test.ts -t 'compiled by tsconfig.typetests.json' -> Tests 3 skipped (3) # zero matched
vitest run actionDef-closed-surface.test.ts -t 'compiled by tsconfig.test.json' -> Tests 1 passed | 2 skipped (3)

Present-tense citations go to zero, with positive controls:

MeasurementBeforeAfter
compiled by tsconfig.typetests.json in packages/app-shell/src + packages/core/src10
Positive control 1 — the same pattern against the pre-edit blob (git show HEAD: on that path)11 (pattern is live)
Positive control 2 — tsconfig.test.json over the same corpus3131 (corpus is live)
Positive control 3 — files named tsconfig.typetests.json on disk00 (control: 36 tsconfig.test.json files)

The 7 remaining typetests mentions in that scope are all past-tense retirement
narrative ("used to name", "was retired", "once named ... was retired") — the
census is in the report on #6548. A fourth, gate-issued control:
type-check:coverage reports 0 with a narrow type-assertion project, i.e. the
mechanism the old string named no longer exists at all.

Proof the renamed file is still in the program the new string names
tsc -p packages/core/tsconfig.test.json --listFiles counts the file: 1.

Gates, re-run at the final commit 27c8b6670 (clean tree):

U1 check-changeset-presence 0 ✅ 1 changeset, EMPTY frontmatter — the explicit exemption
U2 changeset:check 0 ✅ fixed group OK · no `major` declared
U3 check:control-bytes 0 ✅ scanned 5417 tracked text file(s)
U4 type-check:coverage 0 ✅ 41/41 packages compile their tests, 0 with a narrow project
U5 @object-ui/core type-check 0 (tsc --noEmit && tsc -p tsconfig.test.json)
U6 @object-ui/core lint 0 ✖ 513 problems (0 errors, 513 warnings) — all pre-existing
U7 @object-ui/core vitest 0 Test Files 103 passed (103) · Tests 2075 passed (2075)

Note on U5: this package's type-check chains tsconfig.test.json, whose
include is src/**/*.test.ts(x), so the test tree is genuinely measured here —
not the "typecheck excludes the tests" shape that reads green while saying
nothing.

Changeset

check-changeset-presence was asked for its own verdict before assuming: it
failed the bare rename (1 source file(s) of 1 released package(s) changed, and this change adds no changeset) and named empty frontmatter as the legitimate
pass. .changeset/6548-stale-test-name.md declares releasing nothing. objectui
has no skip-changeset label mechanism, so no label was created or applied.

Scope

Two files: the one test name, and the changeset. The assertions beneath the
renamed it(), the file's block comment (already corrected by #6465), and every
other file in the repo are untouched. No behaviour changes; nothing publishes.
#6426 is not addressed here — it is the same defect class in plugin-dashboard
and remains open.


Generated by Claude Code

…es it
The it() name at packages/core/src/actions/__tests__/actionDef-closed-surface.test.ts
cited `tsconfig.typetests.json` in the present tense. Zero files by that name
exist anywhere in the repo — the narrow per-file project was retired when the
package graduated (objectui#4040), and what actually compiles this file is
`packages/core/tsconfig.test.json`, chained off the package's `type-check`.
Only the string the runner prints changes. The assertions beneath it, the file's
prose and every other file are untouched.
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)3234.4 KB3266.6 KB
Main entry chunk (gzip)157.0 KB350 KB
Entry fileindex-CzjJ2_ms.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.71KB4.46KB
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)506.01KB114.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.91KB12.92KB
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)212.80KB43.15KB
plugin-detail (index.js)245.29KB62.39KB
plugin-editor (index.js)2.46KB1.10KB
plugin-form (index.js)131.78KB32.19KB
plugin-gantt (index.js)165.16KB40.33KB
plugin-grid (index.js)201.66KB54.58KB
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.85KB20.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)63.21KB21.05KB
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)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-aiClaude

Copy link
Copy Markdown
Collaborator

ACCEPT — PM review of #6548, done from the tree and the diff, not from the report.

The one-line change verifies

actionDef-closed-surface.test.ts:124, tsconfig.typetests.jsontsconfig.test.json. Two files, one insertion, one deletion, plus a changeset with genuinely empty frontmatter. No assertion, no neighbouring prose, no other file.

The delta is clean, and the deliberate non-changes survived

The card's subject was present-tense citations, not the substring — a past-tense retirement narrative matches the same string and is correct. Measured across packages/app-shell/src + packages/core/src:

  • seven typetests mentions survive on the branch, and all seven are past-tense: "used to name", "was retired", "once named … was retired", "that used to name it was retired", "naming this file by hand, until the package";
  • the target file went 2 → 1 while the other six files each held at 1 — so the removal is localised to the one present-tense citation and nothing else was swept up;
  • files literally named tsconfig.typetests.json: 0, against a control of 36tsconfig.test.json files.

The claim that decides whether this is a real fix

A rename is only better than a deletion if the new name is true — otherwise it swaps one stale citation for another. It is true, and by more than a glob match:

  • packages/core/tsconfig.test.json includes src/**/*.test.ts, which matches src/actions/__tests__/actionDef-closed-surface.test.ts;
  • that config's own header names this exact file as one of only two it is the ONLY project to compile, "whose compile-time pins are erased at runtime — vitest proves nothing about them and tsc is the only thing that can";
  • packages/core's type-check script is tsc --noEmit && tsc -p tsconfig.test.json, and check-type-check-coverage.mjs enforces that chaining, so CI's Type Check job is what actually runs it.

So the pin now cites the project that genuinely enforces it. That is a strictly better outcome than removing the citation, which is what the card literally asked for. Kept.

What earned this review's confidence

The bidirectional reported-name flip, run with the same command shape in both directions so a zero could not come from a dead pattern: -t 'compiled by tsconfig.typetests.json'Tests 3 skipped (3); -t 'compiled by tsconfig.test.json'Tests 1 passed | 2 skipped (3). A test name has no assertion behind it, so the only way to prove the rename took effect on the thing that is actually observable — the string the runner reports — is to select on it. That is the right instrument for this defect class, and it is not the obvious one.

⭐ Likewise the pre-flight: before renaming, six independent checks that nothing pins the old name (snapshots, --testNamePattern call sites, reporter config, cross-suite references, workflows, lint rules). Renaming a test is only safe if no consumer reads the name, and that was established rather than assumed.

⭐ And asking check-changeset-presence for its own verdict instead of assuming the empty-frontmatter exemption applied.

Landing on green.


Generated by Claude Code

@os-support-ai
os-support-ai marked this pull request as ready for review August 26, 2026 11:49
@os-support-ai
os-support-ai added this pull request to the merge queueAug 26, 2026
Merged via the queue into main with commit 51f9c5bAug 26, 2026
30 checks passed
@os-support-ai
os-support-ai deleted the claude/issue-6548-stale-test-name branch August 26, 2026 12:01
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

finding(core): one it() test NAME still cites tsconfig.typetests.json — the last stale citation, left as out-of-scope by the comment-only sweep

2 participants

@os-support-ai@claude