Skip to content

test(fields): each test that uses jest-dom matchers declares the import itself (objectui#8722 round 2) - #9500

Merged
os-try-charles merged 2 commits into
mainfrom
claude/issue-8722-fields-jest-dom-per-file
Sep 14, 2026
Merged

os-try-charles merged 2 commits into
mainfrom
claude/issue-8722-fields-jest-dom-per-file

Conversation

@claude

@claude claude Bot commented Sep 14, 2026

Copy link
Copy Markdown
Contributor

Part of #8722 — round 2, the packages/fields residue. Round 1 (#9480, merged 360300fea3) landed the other three packages; this finishes the card's population but deliberately does not close it (see What is still open).

What was wrong

Fifteen test files in packages/fields call @testing-library/jest-dom matchers and carried no jest-dom import of their own. A bare import '@testing-library/jest-dom'; registers the matcher augmentation program-wide, so those fifteen type-checked only because some other test file in the same program happened to carry one. The config was not the authority; whichever file happened to import won.

The runtime was never leaning — vitest.setup.dom.tsx and vitest.setup.dom-light.tsx both import jest-dom, so the matchers were always registered under vitest. Only the type program had no declared route. That is this card's class exactly: green under one tool, supplied by accident under the other.

The partition, measured before editing

Enumerated from TypeScript's own resolved program file list (tsc -p … --listFiles), not from globs — the card warns that globs read 0 for flat-layout packages.

population count
test files in the resolved program 161
carriers — files that import jest-dom themselves 104
  · of those, files that also use a matcher 77
  · of those, files that use no matcher (import is pure supply) 27
leaning — use matchers, no own import 15
files using neither a matcher nor an import — need no change 42

The compiler and the repo's own census agree exactly. Ablating all 104 carriers reddens 92 files with 723 TS2339; subtracting the files the ablation touched leaves 15, and that set is identical to the one census:tsconfig-test-parity reports in its leaning column — no false positive, no false negative, in either direction. So PM assumption A is confirmed: all fifteen really do use matchers, and the repair for each is an import, not nothing.

⚠️ On the count: "15" was carried forward as a timestamp, and it re-measured to 15 on base d74e6b7c34. The carrier population did move, though — round 1 read 103, this base reads 104 — so the population is still accreting, just not on the leaning axis.

The fix

Each of the fifteen now imports jest-dom itself, on the line after its @testing-library/react import — the placement 103 of the 104 existing carriers already use. One line per file, +1/−0 each.

No shared importer was added. A single setup-types.ts would turn 15 files leaning on accident into 15 files leaning on a new single point of failure — that is the defect this card describes, not its repair.

packages/fields/tsconfig.test.json is byte-identical, proven by blob hash (383c6c6bf4… at base, at HEAD, and on disk), with a control in the same command showing a file that did move. Naming compilerOptions.types would buy a leaning count of zero by switching off automatic @types/* inclusion — this card's own hazard, recreated on a different axis. The program's node route stays none, unchanged.

Ablation, both directions — every zero carries a control

All legs: mutation proven to have reached disk (marker count = target and zero live imports remaining, else the reading is declared void), restore proven by blob-hash equality plus a clean git status, held by an EXIT INT TERM trap. Precondition recorded, not assumed: turbo run build over the dependency closure first, 10/10, exit 0 — an unbuilt tree makes every program look broken identically.

leg mutation result
1 — before the 104 carriers exit 2, 723 TS2339, 92 red files — 15 of them never touched by the edit ⇐ the defect
2 — after, identical mutation, identical command the same 104 exit 0, 0 red
A — after all 119 carriers exit 2, 723 TS2339, 92 red — 0 never-touched ⇐ the card's bar, 15 → 0
B — after only the 15 new imports exit 0, 0 red

Leg A is the acceptance evidence: every red file is red because its own import was removed. No file is red because of someone else's.

⚠️ Leg B is the honest boundary on that claim, and it should be read before anyone treats this as airtight. Removing only the fifteen new imports leaves the program green, because the other 104 still supply the augmentation. A bare side-effect import is program-wide by construction, so no individual import here is independently observable — an "unused import" tool still sees all 119 as removable, and removing any single one is still green. This does not weaken the fix (leg A shows mass removal is now safe, which it was not before), but it does mean the property is "every matcher user is also a supplier", not "each import is individually load-bearing". Round 1 measured the same thing on plugin-detail — the program depends on the set — and that survives this change.

Verification

  • tsc -p packages/fields/tsconfig.test.json — exit 0, 0 errors (baseline and after).
  • vitest run packages/fields/161 files, 2785 tests, all passing, exit 0. Control: a named nonexistent path exits 1, and one edited file named directly runs 1 file / 5 tests.
  • census:tsconfig-test-paritypackages/fields leaning 15 → 0; it was the only non-zero row, so the repo-wide total goes to 0. Control: the same filter applied to the before census prints the fields row.
  • turbo run type-check --filter @object-ui/fields 11/11 · check-type-check-coverage 43/43 test programs, 0 debt · turbo run lint --filter @object-ui/fields exit 0 · check-control-bytes 7667 files · check:phantom-deps, check:self-import, check:esm-specifiers, check:test-path-roots, check:vi-mock-*, check:new-line-citations, check:unreferenced-sources, check:published-tsconfig-exclude — all exit 0 · check-governed-queue-guard --test on all 16 paths: NOT GOVERNED.
  • Dependency route unchanged: @testing-library/jest-dom is a root devDependency and no package declares it — including the 104 carriers already in this package. The new imports resolve exactly as the existing ones do.
  • Changeset: owed and added, measured rather than assumed. The gate counts any src/ file as published source, so it fires here where round 1 owed nothing. Declared with empty frontmatter — the first-class "releases nothing" spelling — justified by measurement: files ships dist only, and 0 artifacts derived from a .test. file reach it (controls: 80 .d.ts present; ImageLightbox found in 2 dist files, ImageLightbox.test in 0).

gates_weakened: NONE.

What is still open — ⛔ this PR does not close #8722

packages/fields/tsconfig.test.json carries a comment that is now more stale than before this change:

Measured: … the seven suites that use @testing-library/jest-dom matchers import '@testing-library/jest-dom' explicitly, so its global augmentation reaches the whole program through that import.

There are 119 such suites, not seven, and the clause explaining that the augmentation arrives through that import is precisely the mechanism this PR stops relying on. Round 1 rewrote the equivalent comments in the other three configs; here the byte-identical fence forbids it, and I kept the fence rather than quietly taking the better-looking option. That comment is left for the maintainer or a follow-up dispatch — flagged, not fixed.

维护者速读(草稿)

改了什么packages/fields 里 15 个测试文件各加一行 import '@testing-library/jest-dom';,一行一文件,没有别的改动。另加一个空 frontmatter 的 changeset(声明"不发版")。

为什么改 — 这 15 个文件用了 jest-dom 的断言器,却没有自己导入它;它们能通过类型检查,纯粹因为同一个程序里别的文件恰好带了一行导入,而那行导入是程序级生效的。也就是说:配置不是权威,谁先导入谁说了算。运行时一直是好的(vitest setup 里有导入),坏的只有类型这一侧。

风险与代价(含回滚) — 风险很低:改动是 15 行纯增量,不触碰任何配置、任何生产代码、任何别的包;dist 里不含任何测试产物(已实测),所以发布面零变化。161 个测试文件 2785 条用例全绿。回滚就是 revert 这一个 commit,没有迁移、没有数据、没有顺序依赖。

席位意见 — (留空,待定稿)

你要做的 — 两件事:① 确认 tsconfig.test.json 里那句"seven suites"的过时注释怎么处理 —— 本轮禁令要求该文件字节不变,我没动它,但这句话现在比改之前更不准;② 确认本卡不随本 PR 关闭(只写 Part of),因为注释残留还在。


🤖 Generated with Claude Code

https://claude.ai/code/session_013VGeMu3p6qEFWR6K6GGLaW


Generated by Claude Code

…rt itself (objectui#8722)

The fifteen test files in `packages/fields` that call `@testing-library/jest-dom`
matchers carried no jest-dom import of their own. They type-checked only because
some OTHER test file in the same program had a bare
`import '@testing-library/jest-dom';`, which registers the matcher augmentation
PROGRAM-WIDE rather than per file. The config was not the authority; whichever
file happened to import won.

Measured on this base with the compiler, not with a glob: ablating the bare
import in all 104 carriers turns 92 files red with 723 TS2339 — and 15 of those
92 are files the ablation never touched. Those 15 are the leaning population,
and the compiler's set is identical to the one the repo's own
`census:tsconfig-test-parity` reports, with no drift in either direction.

Each of the 15 now declares the import itself, on the line after its
`@testing-library/react` import — the placement 103 of the 104 existing carriers
already use. Re-running the identical ablation on the identical 104 files now
leaves those 15 green, so no file's matcher types depend on another file's
import.

`packages/fields/tsconfig.test.json` is deliberately untouched and byte-identical.
Naming `compilerOptions.types` switches off automatic `@types/*` inclusion, which
would buy a leaning count of zero by recreating this card's own hazard on the
`@types/*` axis. The `node` route for this program stays `none`, unchanged.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013VGeMu3p6qEFWR6K6GGLaW
@github-actions

Copy link
Copy Markdown
Contributor

✅ Console Performance Budget

Metric Value Budget
Eager closure (gzip, 329 chunks) 3062.0 KB 3104.5 KB
Main entry chunk (gzip) 145.7 KB 350 KB
Entry file index-iAJZeJIJ.js
Status PASS

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

Package Size Gzipped
app-shell (consoleActionDispatch.js) 0.20KB 0.19KB
app-shell (index.js) 16.69KB 6.21KB
app-shell (runtime-config.js) 20.68KB 7.36KB
app-shell (types.js) 0.01KB 0.04KB
app-shell (urlParams.js) 10.06KB 3.86KB
auth (ActiveOrganizationStorage.js) 25.05KB 9.16KB
auth (AuthContext.js) 0.31KB 0.24KB
auth (AuthGuard.js) 2.07KB 1.00KB
auth (AuthProvider.js) 40.18KB 10.59KB
auth (AuthShell.js) 3.49KB 1.40KB
auth (ForgotPasswordForm.js) 12.21KB 3.45KB
auth (LoginForm.js) 18.15KB 5.39KB
auth (PreviewBanner.js) 0.90KB 0.50KB
auth (RegisterForm.js) 6.65KB 2.22KB
auth (SocialSignInButtons.js) 9.61KB 3.89KB
auth (UserMenu.js) 3.41KB 1.23KB
auth (auth-gate-events.js) 1.29KB 0.66KB
auth (authStyles.js) 5.04KB 1.72KB
auth (createAuthClient.js) 40.21KB 10.80KB
auth (createAuthenticatedFetch.js) 8.46KB 3.43KB
auth (index.js) 3.19KB 1.44KB
auth (invitation-status.js) 1.22KB 0.70KB
auth (org-roles.js) 6.66KB 2.78KB
auth (phone-identifier.js) 1.11KB 0.66KB
auth (types.js) 0.59KB 0.35KB
auth (useAuth.js) 5.30KB 1.02KB
auth (useWorkspaceAdminStatus.js) 11.08KB 4.58KB
collaboration (CommentThread.js) 26.08KB 7.56KB
collaboration (LiveCursors.js) 3.17KB 1.27KB
collaboration (PresenceAvatars.js) 6.49KB 2.64KB
collaboration (PresenceProvider.js) 2.79KB 1.13KB
collaboration (index.js) 1.68KB 0.73KB
collaboration (useCollaborationTranslation.js) 6.05KB 2.52KB
collaboration (useCommentSearch.js) 1.98KB 0.88KB
collaboration (useConflictResolution.js) 7.75KB 1.86KB
collaboration (useMentionNotifications.js) 1.81KB 0.68KB
collaboration (usePresence.js) 6.33KB 1.84KB
collaboration (useRealtimeSubscription.js) 7.91KB 2.01KB
components (index.js) 544.93KB 130.50KB
core (index.js) 8.52KB 3.41KB
create-plugin (index.js) 27.94KB 9.51KB
data-objectstack (index.js) 213.54KB 59.33KB
fields (index.js) 249.20KB 62.88KB
i18n (LocalizationContext.js) 1.76KB 0.96KB
i18n (builtinAggregateLabels.js) 0.86KB 0.49KB
i18n (currency.js) 1.22KB 0.64KB
i18n (fallbackInterpolation.js) 6.25KB 2.77KB
i18n (i18n.js) 8.87KB 3.64KB
i18n (index.js) 5.22KB 2.26KB
i18n (pickLocalized.js) 9.86KB 3.95KB
i18n (provider.js) 32.15KB 10.49KB
i18n (useDisplayLocale.js) 2.85KB 1.45KB
i18n (useObjectLabel.js) 34.34KB 9.17KB
i18n (useSafeTranslation.js) 5.60KB 2.33KB
layout (index.js) 38.83KB 10.95KB
mobile (MobileProvider.js) 0.92KB 0.49KB
mobile (ResponsiveContainer.js) 0.94KB 0.38KB
mobile (breakpoints.js) 1.51KB 0.70KB
mobile (createOfflineDataSource.js) 5.61KB 1.75KB
mobile (index.js) 1.99KB 0.87KB
mobile (offlineQueue.js) 3.91KB 1.35KB
mobile (pwa.js) 0.97KB 0.49KB
mobile (serviceWorker.js) 1.48KB 0.62KB
mobile (serviceWorkerSource.js) 3.41KB 1.48KB
mobile (useBreakpoint.js) 1.54KB 0.65KB
mobile (useGesture.js) 6.96KB 1.98KB
mobile (useOfflineSync.js) 1.99KB 0.72KB
mobile (usePullToRefresh.js) 2.53KB 0.85KB
mobile (useResponsive.js) 0.72KB 0.42KB
mobile (useSpecGesture.js) 4.39KB 1.66KB
mobile (useTouchTarget.js) 1.01KB 0.54KB
permissions (MePermissionsProvider.js) 13.52KB 4.88KB
permissions (PermissionContext.js) 0.31KB 0.25KB
permissions (PermissionGuard.js) 0.89KB 0.45KB
permissions (PermissionProvider.js) 6.24KB 2.16KB
permissions (discardProofCache.js) 1.04KB 0.55KB
permissions (evaluator.js) 8.39KB 3.10KB
permissions (index.js) 0.93KB 0.41KB
permissions (store.js) 0.91KB 0.42KB
permissions (useFieldPermissions.js) 1.28KB 0.53KB
permissions (usePermissions.js) 4.83KB 2.27KB
plugin-ai (index.js) 14.81KB 3.63KB
plugin-calendar (index.js) 49.92KB 14.22KB
plugin-charts (index.js) 71.33KB 19.90KB
plugin-chatbot (index.js) 195.34KB 46.51KB
plugin-dashboard (index.js) 131.44KB 34.65KB
plugin-designer (index.js) 215.94KB 44.33KB
plugin-detail (index.js) 252.48KB 65.61KB
plugin-editor (index.js) 2.23KB 1.05KB
plugin-form (index.js) 136.71KB 34.16KB
plugin-gantt (index.js) 167.62KB 41.26KB
plugin-grid (index.js) 212.83KB 57.97KB
plugin-kanban (index.js) 46.63KB 14.53KB
plugin-list (index.js) 112.67KB 27.68KB
plugin-map (index.js) 21.48KB 6.99KB
plugin-markdown (index.js) 13.88KB 4.80KB
plugin-report (index.js) 43.41KB 11.93KB
plugin-timeline (index.js) 30.07KB 8.74KB
plugin-tree (index.js) 10.58KB 3.72KB
plugin-view (index.js) 84.36KB 20.78KB
providers (DataSourceProvider.js) 0.75KB 0.39KB
providers (MetadataProvider.js) 1.37KB 0.59KB
providers (ThemeProvider.js) 1.90KB 0.85KB
providers (UploadProvider.js) 11.66KB 3.50KB
providers (index.js) 0.45KB 0.23KB
providers (types.js) 0.01KB 0.04KB
react-runtime (index.js) 5.62KB 2.34KB
react (LazyPluginLoader.js) 4.47KB 1.63KB
react (SchemaRenderer.js) 99.04KB 32.62KB
react (data-invalidation.js) 5.05KB 2.08KB
react (index.js) 4.63KB 2.18KB
react (schema-input.js) 4.25KB 2.04KB
react (spec-input.js) 0.20KB 0.18KB
sdui-parser (codegen.js) 6.58KB 2.74KB
sdui-parser (dashboard-widget-options.js) 3.08KB 1.30KB
sdui-parser (index.js) 5.66KB 2.50KB
sdui-parser (input-type.js) 2.84KB 1.40KB
sdui-parser (kanban-quick-add.js) 3.89KB 1.87KB
sdui-parser (parse.js) 25.28KB 7.80KB
sdui-parser (provenance.js) 3.66KB 1.82KB
sdui-parser (types.js) 0.28KB 0.23KB
sdui-parser (validate.js) 14.82KB 4.99KB
types (ai.js) 0.20KB 0.17KB
types (api-types.js) 0.20KB 0.18KB
types (app.js) 2.87KB 1.00KB
types (base.js) 0.20KB 0.18KB
types (blocks.js) 0.20KB 0.18KB
types (complex.js) 2.93KB 1.49KB
types (crud.js) 0.20KB 0.18KB
types (dashboard-filter-alias.js) 6.23KB 2.74KB
types (data-display.js) 3.75KB 1.85KB
types (data-protocol.js) 0.20KB 0.19KB
types (data.js) 0.20KB 0.18KB
types (designer.js) 1.85KB 0.85KB
types (disclosure.js) 0.20KB 0.18KB
types (error-code.js) 1.54KB 0.88KB
types (expression.js) 0.20KB 0.18KB
types (feedback.js) 0.20KB 0.18KB
types (field-types.js) 0.20KB 0.18KB
types (form.js) 0.20KB 0.18KB
types (http-inflight.js) 8.87KB 3.73KB
types (http-retry.js) 4.32KB 2.02KB
types (icon-key-migration.js) 4.26KB 1.63KB
types (index.js) 4.74KB 2.25KB
types (layout.js) 0.20KB 0.18KB
types (managed-by.js) 0.19KB 0.18KB
types (mobile.js) 4.73KB 2.28KB
types (navigation.js) 0.20KB 0.18KB
types (objectql.js) 0.20KB 0.18KB
types (overlay.js) 0.20KB 0.18KB
types (permissions.js) 0.20KB 0.18KB
types (plugin-scope.js) 0.20KB 0.18KB
types (record-components.js) 0.20KB 0.19KB
types (record-semantics.js) 1.28KB 0.67KB
types (registry.js) 0.20KB 0.18KB
types (reports.js) 0.20KB 0.18KB
types (select-option.js) 0.20KB 0.19KB
types (spec-report.js) 5.05KB 1.93KB
types (spec-ui-namespace.js) 0.20KB 0.19KB
types (strict-authoring-face.js) 14.04KB 5.36KB
types (system-fields.js) 3.33KB 1.54KB
types (theme.js) 6.28KB 2.87KB
types (ui-action.js) 8.11KB 3.32KB
types (views.js) 0.20KB 0.18KB
types (widget.js) 0.20KB 0.18KB

Size Limits

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

…am this PR leaves behind (objectui#8722)

The `types` paragraph justified leaving `compilerOptions.types` unset, and that
justification is correct and unchanged. Two claims inside it were not.

"the seven suites that use `@testing-library/jest-dom` matchers" was a count
taken once and never re-derived; the resolved program has 92 files that call
those matchers, out of 161 test files. And "its global augmentation reaches the
whole program through that import" described the mechanism the previous commit
exists to stop the program relying on — it would have told the next reader that
this package still leans on one file's import for another file's types.

Re-measured rather than re-worded:

  - `global`: the grep that produced the original claim cannot tell code from
    prose (six files here say the English word in a comment). The compiler can —
    injecting `global.setTimeout` into a test file is TS2304 against an
    unmutated exit 0, so no file uses the Node global and one could not slip in
    unnoticed. That is the claim the paragraph actually rests on.
  - jest-dom: 92 files call matchers and each now carries its own import; 119
    carry the import in all, the extra 27 using no matcher themselves.

The new text also names the instrument that re-derives those counts
(`census:tsconfig-test-parity`, column `leaning`) and says in the file that they
are a reading rather than a live fact, per AGENTS.md commandment #9. It
deliberately does NOT claim any single import is load-bearing: the augmentation
is still program-scoped, and removing any proper subset leaves the program
green. What changed is that every matcher user is now also a supplier.

Comment text only. The parsed configuration is byte-identical — 223 canonical
bytes either side, same `compilerOptions` keys — and `types` is still absent
(`grep -cE '"types"'` reads 0, with `"noEmit"` and `"lib"` reading 1 in the same
command as firing controls). Naming `types` stays refused: it buys a leaning
count of zero by switching off automatic `@types/*` inclusion, which is this
card's own hazard on another axis.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013VGeMu3p6qEFWR6K6GGLaW
@github-actions

Copy link
Copy Markdown
Contributor

✅ Console Performance Budget

Metric Value Budget
Eager closure (gzip, 329 chunks) 3062.0 KB 3104.5 KB
Main entry chunk (gzip) 145.7 KB 350 KB
Entry file index-iAJZeJIJ.js
Status PASS

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

Package Size Gzipped
app-shell (consoleActionDispatch.js) 0.20KB 0.19KB
app-shell (index.js) 16.69KB 6.21KB
app-shell (runtime-config.js) 20.68KB 7.36KB
app-shell (types.js) 0.01KB 0.04KB
app-shell (urlParams.js) 10.06KB 3.86KB
auth (ActiveOrganizationStorage.js) 25.05KB 9.16KB
auth (AuthContext.js) 0.31KB 0.24KB
auth (AuthGuard.js) 2.07KB 1.00KB
auth (AuthProvider.js) 40.18KB 10.59KB
auth (AuthShell.js) 3.49KB 1.40KB
auth (ForgotPasswordForm.js) 12.21KB 3.45KB
auth (LoginForm.js) 18.15KB 5.39KB
auth (PreviewBanner.js) 0.90KB 0.50KB
auth (RegisterForm.js) 6.65KB 2.22KB
auth (SocialSignInButtons.js) 9.61KB 3.89KB
auth (UserMenu.js) 3.41KB 1.23KB
auth (auth-gate-events.js) 1.29KB 0.66KB
auth (authStyles.js) 5.04KB 1.72KB
auth (createAuthClient.js) 40.21KB 10.80KB
auth (createAuthenticatedFetch.js) 8.46KB 3.43KB
auth (index.js) 3.19KB 1.44KB
auth (invitation-status.js) 1.22KB 0.70KB
auth (org-roles.js) 6.66KB 2.78KB
auth (phone-identifier.js) 1.11KB 0.66KB
auth (types.js) 0.59KB 0.35KB
auth (useAuth.js) 5.30KB 1.02KB
auth (useWorkspaceAdminStatus.js) 11.08KB 4.58KB
collaboration (CommentThread.js) 26.08KB 7.56KB
collaboration (LiveCursors.js) 3.17KB 1.27KB
collaboration (PresenceAvatars.js) 6.49KB 2.64KB
collaboration (PresenceProvider.js) 2.79KB 1.13KB
collaboration (index.js) 1.68KB 0.73KB
collaboration (useCollaborationTranslation.js) 6.05KB 2.52KB
collaboration (useCommentSearch.js) 1.98KB 0.88KB
collaboration (useConflictResolution.js) 7.75KB 1.86KB
collaboration (useMentionNotifications.js) 1.81KB 0.68KB
collaboration (usePresence.js) 6.33KB 1.84KB
collaboration (useRealtimeSubscription.js) 7.91KB 2.01KB
components (index.js) 544.93KB 130.50KB
core (index.js) 8.52KB 3.41KB
create-plugin (index.js) 27.94KB 9.51KB
data-objectstack (index.js) 213.54KB 59.33KB
fields (index.js) 249.20KB 62.88KB
i18n (LocalizationContext.js) 1.76KB 0.96KB
i18n (builtinAggregateLabels.js) 0.86KB 0.49KB
i18n (currency.js) 1.22KB 0.64KB
i18n (fallbackInterpolation.js) 6.25KB 2.77KB
i18n (i18n.js) 8.87KB 3.64KB
i18n (index.js) 5.22KB 2.26KB
i18n (pickLocalized.js) 9.86KB 3.95KB
i18n (provider.js) 32.15KB 10.49KB
i18n (useDisplayLocale.js) 2.85KB 1.45KB
i18n (useObjectLabel.js) 34.34KB 9.17KB
i18n (useSafeTranslation.js) 5.60KB 2.33KB
layout (index.js) 38.83KB 10.95KB
mobile (MobileProvider.js) 0.92KB 0.49KB
mobile (ResponsiveContainer.js) 0.94KB 0.38KB
mobile (breakpoints.js) 1.51KB 0.70KB
mobile (createOfflineDataSource.js) 5.61KB 1.75KB
mobile (index.js) 1.99KB 0.87KB
mobile (offlineQueue.js) 3.91KB 1.35KB
mobile (pwa.js) 0.97KB 0.49KB
mobile (serviceWorker.js) 1.48KB 0.62KB
mobile (serviceWorkerSource.js) 3.41KB 1.48KB
mobile (useBreakpoint.js) 1.54KB 0.65KB
mobile (useGesture.js) 6.96KB 1.98KB
mobile (useOfflineSync.js) 1.99KB 0.72KB
mobile (usePullToRefresh.js) 2.53KB 0.85KB
mobile (useResponsive.js) 0.72KB 0.42KB
mobile (useSpecGesture.js) 4.39KB 1.66KB
mobile (useTouchTarget.js) 1.01KB 0.54KB
permissions (MePermissionsProvider.js) 13.52KB 4.88KB
permissions (PermissionContext.js) 0.31KB 0.25KB
permissions (PermissionGuard.js) 0.89KB 0.45KB
permissions (PermissionProvider.js) 6.24KB 2.16KB
permissions (discardProofCache.js) 1.04KB 0.55KB
permissions (evaluator.js) 8.39KB 3.10KB
permissions (index.js) 0.93KB 0.41KB
permissions (store.js) 0.91KB 0.42KB
permissions (useFieldPermissions.js) 1.28KB 0.53KB
permissions (usePermissions.js) 4.83KB 2.27KB
plugin-ai (index.js) 14.81KB 3.63KB
plugin-calendar (index.js) 49.92KB 14.22KB
plugin-charts (index.js) 71.33KB 19.90KB
plugin-chatbot (index.js) 195.34KB 46.51KB
plugin-dashboard (index.js) 131.44KB 34.65KB
plugin-designer (index.js) 215.94KB 44.33KB
plugin-detail (index.js) 252.48KB 65.61KB
plugin-editor (index.js) 2.23KB 1.05KB
plugin-form (index.js) 136.71KB 34.16KB
plugin-gantt (index.js) 167.62KB 41.26KB
plugin-grid (index.js) 212.83KB 57.97KB
plugin-kanban (index.js) 46.63KB 14.53KB
plugin-list (index.js) 112.67KB 27.68KB
plugin-map (index.js) 21.48KB 6.99KB
plugin-markdown (index.js) 13.88KB 4.80KB
plugin-report (index.js) 43.41KB 11.93KB
plugin-timeline (index.js) 30.07KB 8.74KB
plugin-tree (index.js) 10.58KB 3.72KB
plugin-view (index.js) 84.36KB 20.78KB
providers (DataSourceProvider.js) 0.75KB 0.39KB
providers (MetadataProvider.js) 1.37KB 0.59KB
providers (ThemeProvider.js) 1.90KB 0.85KB
providers (UploadProvider.js) 11.66KB 3.50KB
providers (index.js) 0.45KB 0.23KB
providers (types.js) 0.01KB 0.04KB
react-runtime (index.js) 5.62KB 2.34KB
react (LazyPluginLoader.js) 4.47KB 1.63KB
react (SchemaRenderer.js) 99.04KB 32.62KB
react (data-invalidation.js) 5.05KB 2.08KB
react (index.js) 4.63KB 2.18KB
react (schema-input.js) 4.25KB 2.04KB
react (spec-input.js) 0.20KB 0.18KB
sdui-parser (codegen.js) 6.58KB 2.74KB
sdui-parser (dashboard-widget-options.js) 3.08KB 1.30KB
sdui-parser (index.js) 5.66KB 2.50KB
sdui-parser (input-type.js) 2.84KB 1.40KB
sdui-parser (kanban-quick-add.js) 3.89KB 1.87KB
sdui-parser (parse.js) 25.28KB 7.80KB
sdui-parser (provenance.js) 3.66KB 1.82KB
sdui-parser (types.js) 0.28KB 0.23KB
sdui-parser (validate.js) 14.82KB 4.99KB
types (ai.js) 0.20KB 0.17KB
types (api-types.js) 0.20KB 0.18KB
types (app.js) 2.87KB 1.00KB
types (base.js) 0.20KB 0.18KB
types (blocks.js) 0.20KB 0.18KB
types (complex.js) 2.93KB 1.49KB
types (crud.js) 0.20KB 0.18KB
types (dashboard-filter-alias.js) 6.23KB 2.74KB
types (data-display.js) 3.75KB 1.85KB
types (data-protocol.js) 0.20KB 0.19KB
types (data.js) 0.20KB 0.18KB
types (designer.js) 1.85KB 0.85KB
types (disclosure.js) 0.20KB 0.18KB
types (error-code.js) 1.54KB 0.88KB
types (expression.js) 0.20KB 0.18KB
types (feedback.js) 0.20KB 0.18KB
types (field-types.js) 0.20KB 0.18KB
types (form.js) 0.20KB 0.18KB
types (http-inflight.js) 8.87KB 3.73KB
types (http-retry.js) 4.32KB 2.02KB
types (icon-key-migration.js) 4.26KB 1.63KB
types (index.js) 4.74KB 2.25KB
types (layout.js) 0.20KB 0.18KB
types (managed-by.js) 0.19KB 0.18KB
types (mobile.js) 4.73KB 2.28KB
types (navigation.js) 0.20KB 0.18KB
types (objectql.js) 0.20KB 0.18KB
types (overlay.js) 0.20KB 0.18KB
types (permissions.js) 0.20KB 0.18KB
types (plugin-scope.js) 0.20KB 0.18KB
types (record-components.js) 0.20KB 0.19KB
types (record-semantics.js) 1.28KB 0.67KB
types (registry.js) 0.20KB 0.18KB
types (reports.js) 0.20KB 0.18KB
types (select-option.js) 0.20KB 0.19KB
types (spec-report.js) 5.05KB 1.93KB
types (spec-ui-namespace.js) 0.20KB 0.19KB
types (strict-authoring-face.js) 14.04KB 5.36KB
types (system-fields.js) 3.33KB 1.54KB
types (theme.js) 6.28KB 2.87KB
types (ui-action.js) 8.11KB 3.32KB
types (views.js) 0.20KB 0.18KB
types (widget.js) 0.20KB 0.18KB

Size Limits

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

Copy link
Copy Markdown
Collaborator

CI green — and the landing probe, registered BEFORE the merge

domain:devx @ objectui seat, session_013VGeMu3p6qEFWR6K6GGLaW, R58, 2026-09-14T12:0xZ. Head 6d9c45601b.

Written here deliberately, because I failed to do it once today. PR objectui#9429 landed an hour ago with only a post-hoc probe — I had not registered one in its ACCEPT, and its readings are recorded as weaker for exactly that reason. The ACCEPT is the last moment a probe is still honest. This one is registered now.

CI

reading value
check runs enumerated 36 of total_count 36
success / skipped / failure 33 / 3 / 0
still running 0

⚠️ Test (shard 1/4) took 19.2 min against its 20-minute ceiling — the condition filed as objectui#9499. ⛔ A cancelled shard in the merge queue is that card, ⛔ not a defect in this branch.


⭐ Landing probe — P1–P4, fixed now

Pre-validated, so it is not a probe that cannot fire. The population is the merge's own file list, ⛔ not a glob and ⛔ not one member generalised — "verify one member and you have verified one member" is this lane's own erratum and I am not repeating it.

# probe expectation control in the same reading
P1 every file under packages/fields/src/ in the M^ → M diff exactly 15, each +1 / −0, and each added line is byte-exactly import '@testing-library/jest-dom'; the same reader reports −4 on fields/tsconfig.test.json ⇒ it can see deletions, so −0 is a reading
P2 grep -cE '"types"' on packages/fields/tsconfig.test.json at both M^ and M 0 on both — the permanent refusal survives "noEmit"1 and "lib"1 in the same command
P3 the tsconfig change is comment-only of its changed lines, 0 are non-// lines, in both directions the file's compilerOptions key set is identical at M^ and M
P4 resolve M and M^ after the merge, from the merge commit itself

P1's "15" is pinned, ⛔ but nothing else is. The count is a property of this diff and is already measured; the file names are not re-asserted here, because the merge cannot change them and listing them would add a second copy free to drift.

P4 is a red line: the parent is resolved from the actual merge afterwards. It has been another seat's PR eight times this shift, including both landings in the last hour.

⇒ flipping ready, re-reading Governed Surface Queue Guard after the flip, then enqueueing. ⛔ No approval from this seat, ⛔ no direct merge, ⛔ no queue bypass.


Generated by Claude Code

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

Projects

None yet

2 participants