Skip to content

test(app-shell): wait for the counted backfill checkbox in the unchecked publish case (objectui#13120) - #13168

Merged
objectstack-fleet[bot] merged 3 commits into
mainfrom
claude/issue-13120-backfill-checkbox-wait
Oct 20, 2026
Merged

objectstack-fleet[bot] merged 3 commits into
mainfrom
claude/issue-13120-backfill-checkbox-wait

Conversation

@objectstack-fleet

@objectstack-fleet objectstack-fleet Bot commented Oct 20, 2026 •

Copy link
Copy Markdown
Contributor

Fixes #13120

Clause-②: no

What changed

Two objectui#12929 test files read the backfill checkbox by its counted name with a synchronous getByRole. Both reads now wait with findByRole. Each keeps exactly the same name and the same assertion, so a checkbox without the count still fails.

  1. StudioDesignSurface.publishBackfill-12929.test.tsx, case "unchecked: the publish names no field, so nothing is written into existing rows". The read right after openSheet() is now await within(sheet).findByRole('checkbox', { name: new RegExp(...N...) }): the same \bN\b name (N = 12) and the same not.toBeChecked(). The other two cases already read it this way. openSheet() gets a doc comment saying it resolves once the option is drawn, not once its count is.
  2. DraftChangesPanel.backfill-12929.test.tsx, case "one choice — the added literal-default field of the published object — unchecked, naming the record count". The read after settled() and findAllByTestId('draft-backfill-option') is now await screen.findByRole('checkbox', { name: 'Backfill default (12 existing records)' }), with the exact same string. The claim was amended to add this file in patch round 1.

The PR also adds .changeset/13120-backfill-checkbox-wait.md with an empty frontmatter, so it releases nothing; its text names both files. node scripts/check-changeset-presence.mjs asked for it because it counts every file under a released package's src/ as published source, test files included. No product source changed.

Why it flaked

In DraftChangesPanel.tsx, EntryDetail draws the backfill option in the same render that sets detail and candidates. The record count comes from an effect that runs after that render (source.find(entry.name, { $top: 0 })). Until setRecordCount lands, the label reads "Backfill default" with no number. Both tests waited for the option, not for its count, so on a slow runner they could read between those two renders. That read finds a checkbox named "Backfill default" and no checkbox whose name contains 12.

Deterministic reproduction (one-shot, not left in the tree)

For each leg, a script rewrote the file's count-read mock (ADAPTER.find in file 1, the find set in beforeEach in file 2) and checked the rewrite on disk: the anchor count went from 1 to 0 and the injected marker from 0 to 1. After each leg it restored the file from HEAD (git checkout HEAD -- with an absolute path, under an EXIT/INT/TERM trap). The restore was confirmed by comparing blob hashes and by an empty git diff HEAD. "+200 ms" means the count resolves 200 ms after it is asked for (setTimeout). "Never" means it returns a promise that never settles.

File Tree and count read Result
1 publishBackfill BASE ed28057, unmutated exit 0, 3 passed: the flake's usual green
1 publishBackfill BASE, +200 ms exit 1, 1 failed and 2 passed: the unchecked case, Unable to find an accessible element with the role "checkbox" and name /\b12\b/ (the same message as merge-group run 39367006901); the role dump shows Name "Backfill default"
1 publishBackfill this branch, +200 ms exit 0, 3 passed
1 publishBackfill this branch, never exit 1, 3 failed: each Unable to find role="checkbox" and name /\b12\b/ once the findByRole window runs out (1164 to 1396 ms)
2 DraftChangesPanel BASE ed28057, unmutated exit 0, 10 passed
2 DraftChangesPanel BASE, +200 ms exit 1, 1 failed and 9 passed: the one-choice case, Unable to find an accessible element with the role "checkbox" and name "Backfill default (12 existing records)"; the role dump shows Name "Backfill default"
2 DraftChangesPanel this branch, +200 ms exit 0, 10 passed
2 DraftChangesPanel this branch, never exit 1, 1 failed and 9 passed: the one-choice case, Unable to find role="checkbox" and name "Backfill default (12 existing records)" after 1306 ms

In the "never" legs, every read of the counted name goes red, so none of them was weakened. In file 2, the other nine cases do not read the counted name and stay green.

Every read in both files

File 1 (publishBackfill)

  • Changed: the unchecked case's counted-checkbox read, which was the file's only synchronous read of the counted name.
  • Left alone:
    • The checked and stopped-short cases already used findByRole.
    • openSheet() reads only through waits.
    • getByTestId('draft-changes-publish') is the footer button, drawn with the sheet and not count-gated.
    • The request and toast assertions sit behind waitFor.

File 2 (DraftChangesPanel)

  • Changed: the one-choice case's counted-checkbox read, the file's only synchronous read of the counted name.
  • Left alone:
    • In the same case, options[0] and its = false text come from the option and the literal span, which are drawn with the option, not with the count. The find call assertions sit behind waitFor.
    • "names no number when the count read carries no numeric total" uses a waiting findByRole on the exact name 'Backfill default'. That name is also the pre-count name, so a slow runner can only push it toward green, never red. A one-shot probe showed the case still discriminates: given a numeric total (7), it goes red, Unable to find role="checkbox" and name "Backfill default", 1 failed and 9 passed.
    • The no-package and no-Publish cases make synchronous absence reads after settled(). No option is drawn and no count is read, and an absence read cannot turn red because of a slow runner.
    • The footer cases read /^Backfill default/, a prefix that matches the label with or without the count. That includes the synchronous getByRole after the click in "checked: Publish all passes…". With the count delayed 200 ms, all 10 cases pass on this branch, so these reads were measured as not count-gated. getByTestId('draft-changes-publish') is the footer button.
    • The backfillCandidates cases are pure function tests.

Gates

Head 05dc463. Exit codes were captured before any pipe.

  • File 2 unmutated, three runs: exit 0 each, Tests 10 passed (10). File 1 unmutated at this head: exit 0, Tests 3 passed (3).

  • pnpm --filter @object-ui/app-shell type-check and lint: exit 0 each. They ran after turbo run build --filter=@object-ui/app-shell^... (exit 0, 28 of 28 tasks from cache). Lint reports 0 errors, plus the package's existing warnings, none on either file. eslint --max-warnings 0 on the two files: exit 0.

  • pnpm check:new-line-citations: exit 0 (0 new citation(s)).

  • pnpm check:control-bytes: exit 0.

  • node scripts/check-changeset-presence.mjs: exit 0 (2 source files, 1 changeset, empty frontmatter).

  • These also exit 0: check:changeset-claims, check:pending-changeset-literals, changeset:check, check-changeset-overwrite.mjs.

  • check-governed-queue-guard.mjs --test on all three paths: NOT GOVERNED.

  • The full CI farm runs in CI.

  • Adds no product-specific widget, dialog, hook or string (see AGENTS.md › Product-neutral renderer)

Implemented in session https://claude.ai/code/session_014MXhk1yjWh37d634hLy3p7 (round 0 and patch round 1).


Generated by Claude Code

…ked publish case (objectui#13120)

The unchecked case read the backfill checkbox by its counted name (N)
synchronously right after openSheet(). openSheet() resolves once the
option is drawn, but the drill-in asks the adapter for the record count
only after that render, so on a slow runner the name had no number yet
and getByRole missed it. The read now waits (findByRole), like the two
cases above it; the name still has to carry N.

Claude-Session: https://claude.ai/code/session_014MXhk1yjWh37d634hLy3p7
Co-authored-by: Claude <noreply@anthropic.com>
… (objectui#13120)

check-changeset-presence counts any file under a released package's src/
as published source, the test file included, so the test-only change
declares an empty-frontmatter changeset.

Claude-Session: https://claude.ai/code/session_014MXhk1yjWh37d634hLy3p7
Co-authored-by: Claude <noreply@anthropic.com>
@github-actions

Copy link
Copy Markdown
Contributor

✅ Console Performance Budget

Metric Value Budget
Eager closure (gzip, 78 chunks) 3210.9 KB 3744.1 KB
Main entry chunk (gzip) 81.6 KB 350 KB
Entry file index-DdZKu0NO.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 (buildIdentity.js) 0.80KB 0.49KB
app-shell (consoleActionDispatch.js) 0.20KB 0.19KB
app-shell (index.js) 21.17KB 7.81KB
app-shell (runtime-config.js) 24.52KB 8.48KB
app-shell (types.js) 0.01KB 0.04KB
app-shell (urlParams.js) 10.11KB 3.87KB
auth (ActiveOrganizationStorage.js) 27.95KB 10.04KB
auth (AuthContext.js) 0.31KB 0.24KB
auth (AuthGuard.js) 2.07KB 1.00KB
auth (AuthProvider.js) 45.59KB 12.03KB
auth (AuthShell.js) 3.49KB 1.40KB
auth (ForgotPasswordForm.js) 12.21KB 3.45KB
auth (LoginForm.js) 20.67KB 6.12KB
auth (PreviewBanner.js) 0.90KB 0.50KB
auth (RegisterForm.js) 6.72KB 2.24KB
auth (SocialSignInButtons.js) 9.74KB 3.94KB
auth (UserMenu.js) 3.39KB 1.21KB
auth (auth-gate-events.js) 1.62KB 0.83KB
auth (authStyles.js) 5.27KB 1.86KB
auth (createAuthClient.js) 42.84KB 11.66KB
auth (createAuthenticatedFetch.js) 8.54KB 3.46KB
auth (index.js) 3.63KB 1.64KB
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) 27.26KB 8.03KB
collaboration (LiveCursors.js) 3.17KB 1.27KB
collaboration (PresenceAvatars.js) 6.28KB 2.60KB
collaboration (PresenceProvider.js) 2.79KB 1.13KB
collaboration (commentAuthorship.js) 1.39KB 0.78KB
collaboration (index.js) 1.93KB 0.85KB
collaboration (useCollaborationTranslation.js) 6.50KB 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) 615.09KB 149.86KB
core (index.js) 10.18KB 4.04KB
create-plugin (index.js) 27.94KB 9.51KB
data-objectstack (index.js) 252.96KB 70.67KB
fields (index.js) 292.36KB 74.70KB
i18n (LocalizationContext.js) 2.92KB 1.42KB
i18n (builtinAggregateLabels.js) 0.86KB 0.49KB
i18n (currency.js) 2.59KB 1.22KB
i18n (fallbackInterpolation.js) 6.25KB 2.77KB
i18n (i18n.js) 8.87KB 3.64KB
i18n (index.js) 5.52KB 2.39KB
i18n (pickLocalized.js) 9.86KB 3.95KB
i18n (provider.js) 39.35KB 12.88KB
i18n (translateFn.js) 0.20KB 0.18KB
i18n (useDisplayLocale.js) 3.52KB 1.76KB
i18n (useObjectLabel.js) 36.87KB 9.88KB
i18n (useSafeTranslation.js) 7.14KB 2.92KB
layout (index.js) 41.40KB 12.01KB
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) 6.62KB 2.45KB
mobile (useResponsive.js) 0.72KB 0.42KB
mobile (useSpecGesture.js) 5.52KB 2.10KB
mobile (useTouchTarget.js) 1.01KB 0.54KB
permissions (MePermissionsProvider.js) 15.35KB 5.51KB
permissions (PermissionContext.js) 0.31KB 0.25KB
permissions (PermissionGuard.js) 0.89KB 0.45KB
permissions (PermissionProvider.js) 6.82KB 2.38KB
permissions (discardProofCache.js) 1.04KB 0.55KB
permissions (evaluator.js) 8.33KB 3.07KB
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) 16.04KB 3.92KB
plugin-calendar (index.js) 55.04KB 16.10KB
plugin-charts (index.js) 85.14KB 23.42KB
plugin-chatbot (index.js) 238.47KB 56.30KB
plugin-dashboard (index.js) 147.53KB 39.95KB
plugin-designer (index.js) 233.95KB 50.08KB
plugin-detail (index.js) 266.70KB 70.83KB
plugin-editor (index.js) 2.23KB 1.05KB
plugin-form (index.js) 184.11KB 47.60KB
plugin-gantt (index.js) 178.46KB 45.13KB
plugin-grid (index.js) 273.26KB 75.83KB
plugin-kanban (index.js) 64.49KB 19.83KB
plugin-list (index.js) 149.69KB 39.23KB
plugin-map (index.js) 27.17KB 9.00KB
plugin-markdown (index.js) 13.88KB 4.80KB
plugin-report (index.js) 46.66KB 13.13KB
plugin-timeline (index.js) 39.31KB 11.88KB
plugin-tree (index.js) 15.27KB 5.40KB
plugin-view (index.js) 94.68KB 24.36KB
providers (DataSourceProvider.js) 0.75KB 0.39KB
providers (MetadataProvider.js) 1.37KB 0.59KB
providers (ThemeProvider.js) 1.90KB 0.85KB
providers (UploadProvider.js) 12.07KB 3.68KB
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) 126.45KB 41.40KB
react (data-invalidation.js) 5.05KB 2.08KB
react (index.js) 4.71KB 2.11KB
react (schema-input.js) 4.31KB 2.07KB
react (spec-input.js) 0.20KB 0.18KB
sdui-parser (body-dialect.js) 4.50KB 1.99KB
sdui-parser (codegen.js) 9.45KB 3.76KB
sdui-parser (dashboard-widget-options.js) 3.07KB 1.30KB
sdui-parser (index.js) 7.30KB 3.12KB
sdui-parser (input-type.js) 2.84KB 1.40KB
sdui-parser (parse.js) 25.28KB 7.81KB
sdui-parser (provenance.js) 3.84KB 1.90KB
sdui-parser (types.js) 0.29KB 0.24KB
sdui-parser (validate.js) 23.87KB 7.83KB
types (ai.js) 4.39KB 2.17KB
types (api-types.js) 0.20KB 0.18KB
types (app.js) 4.12KB 1.61KB
types (authoring-nodes.js) 0.20KB 0.19KB
types (base.js) 0.20KB 0.18KB
types (blocks.js) 0.20KB 0.18KB
types (cloud.js) 0.20KB 0.18KB
types (complex.js) 4.44KB 2.07KB
types (crud.js) 0.20KB 0.18KB
types (dashboard-filter-alias.js) 6.23KB 2.74KB
types (dashboard-widget-layout.js) 2.06KB 0.96KB
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) 1.13KB 0.65KB
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) 5.78KB 2.70KB
types (layout.js) 0.20KB 0.18KB
types (managed-by.js) 0.19KB 0.18KB
types (mobile.js) 5.00KB 2.39KB
types (navigation.js) 0.20KB 0.18KB
types (node-slots.js) 7.18KB 2.34KB
types (objectql.js) 0.20KB 0.18KB
types (overlay.js) 0.20KB 0.18KB
types (permissions.js) 2.52KB 1.31KB
types (plugin-scope.js) 0.20KB 0.18KB
types (product-blocks.js) 0.20KB 0.19KB
types (record-approval-decision.js) 0.20KB 0.20KB
types (record-components.js) 0.20KB 0.19KB
types (record-panels.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) 4.99KB 1.96KB
types (spec-ui-namespace.js) 0.20KB 0.19KB
types (strict-authoring-face.js) 19.93KB 7.26KB
types (system-fields.js) 3.33KB 1.54KB
types (theme.js) 6.28KB 2.87KB
types (ui-action.js) 8.48KB 3.50KB
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

…s one-choice case (objectui#13120)

DraftChangesPanel.backfill-12929's "one choice" case read the checkbox by
its counted name ('Backfill default (12 existing records)') synchronously
after the option was found. The drill-in asks the adapter for the count
only after the option renders, so the name could still carry no number;
the read now waits (findByRole) with the exact same name. The empty
changeset's text names both test files.

Claude-Session: https://claude.ai/code/session_014MXhk1yjWh37d634hLy3p7
Co-authored-by: Claude <noreply@anthropic.com>
@github-actions

Copy link
Copy Markdown
Contributor

✅ Console Performance Budget

Metric Value Budget
Eager closure (gzip, 78 chunks) 3210.9 KB 3744.1 KB
Main entry chunk (gzip) 81.6 KB 350 KB
Entry file index-hoBddXoc.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 (buildIdentity.js) 0.80KB 0.49KB
app-shell (consoleActionDispatch.js) 0.20KB 0.19KB
app-shell (index.js) 21.17KB 7.81KB
app-shell (runtime-config.js) 24.52KB 8.48KB
app-shell (types.js) 0.01KB 0.04KB
app-shell (urlParams.js) 10.11KB 3.87KB
auth (ActiveOrganizationStorage.js) 27.95KB 10.04KB
auth (AuthContext.js) 0.31KB 0.24KB
auth (AuthGuard.js) 2.07KB 1.00KB
auth (AuthProvider.js) 45.59KB 12.03KB
auth (AuthShell.js) 3.49KB 1.40KB
auth (ForgotPasswordForm.js) 12.21KB 3.45KB
auth (LoginForm.js) 20.67KB 6.12KB
auth (PreviewBanner.js) 0.90KB 0.50KB
auth (RegisterForm.js) 6.72KB 2.24KB
auth (SocialSignInButtons.js) 9.74KB 3.94KB
auth (UserMenu.js) 3.39KB 1.21KB
auth (auth-gate-events.js) 1.62KB 0.83KB
auth (authStyles.js) 5.27KB 1.86KB
auth (createAuthClient.js) 42.84KB 11.66KB
auth (createAuthenticatedFetch.js) 8.54KB 3.46KB
auth (index.js) 3.63KB 1.64KB
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) 27.26KB 8.03KB
collaboration (LiveCursors.js) 3.17KB 1.27KB
collaboration (PresenceAvatars.js) 6.28KB 2.60KB
collaboration (PresenceProvider.js) 2.79KB 1.13KB
collaboration (commentAuthorship.js) 1.39KB 0.78KB
collaboration (index.js) 1.93KB 0.85KB
collaboration (useCollaborationTranslation.js) 6.50KB 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) 615.09KB 149.86KB
core (index.js) 10.18KB 4.04KB
create-plugin (index.js) 27.94KB 9.51KB
data-objectstack (index.js) 252.96KB 70.67KB
fields (index.js) 292.36KB 74.70KB
i18n (LocalizationContext.js) 2.92KB 1.42KB
i18n (builtinAggregateLabels.js) 0.86KB 0.49KB
i18n (currency.js) 2.59KB 1.22KB
i18n (fallbackInterpolation.js) 6.25KB 2.77KB
i18n (i18n.js) 8.87KB 3.64KB
i18n (index.js) 5.52KB 2.39KB
i18n (pickLocalized.js) 9.86KB 3.95KB
i18n (provider.js) 39.35KB 12.88KB
i18n (translateFn.js) 0.20KB 0.18KB
i18n (useDisplayLocale.js) 3.52KB 1.76KB
i18n (useObjectLabel.js) 36.87KB 9.88KB
i18n (useSafeTranslation.js) 7.14KB 2.92KB
layout (index.js) 41.40KB 12.01KB
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) 6.62KB 2.45KB
mobile (useResponsive.js) 0.72KB 0.42KB
mobile (useSpecGesture.js) 5.52KB 2.10KB
mobile (useTouchTarget.js) 1.01KB 0.54KB
permissions (MePermissionsProvider.js) 15.35KB 5.51KB
permissions (PermissionContext.js) 0.31KB 0.25KB
permissions (PermissionGuard.js) 0.89KB 0.45KB
permissions (PermissionProvider.js) 6.82KB 2.38KB
permissions (discardProofCache.js) 1.04KB 0.55KB
permissions (evaluator.js) 8.33KB 3.07KB
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) 16.04KB 3.92KB
plugin-calendar (index.js) 55.04KB 16.10KB
plugin-charts (index.js) 85.14KB 23.42KB
plugin-chatbot (index.js) 238.47KB 56.30KB
plugin-dashboard (index.js) 147.53KB 39.95KB
plugin-designer (index.js) 233.95KB 50.08KB
plugin-detail (index.js) 266.70KB 70.83KB
plugin-editor (index.js) 2.23KB 1.05KB
plugin-form (index.js) 184.11KB 47.60KB
plugin-gantt (index.js) 178.46KB 45.13KB
plugin-grid (index.js) 273.26KB 75.83KB
plugin-kanban (index.js) 64.49KB 19.83KB
plugin-list (index.js) 149.69KB 39.23KB
plugin-map (index.js) 27.17KB 9.00KB
plugin-markdown (index.js) 13.88KB 4.80KB
plugin-report (index.js) 46.66KB 13.13KB
plugin-timeline (index.js) 39.31KB 11.88KB
plugin-tree (index.js) 15.27KB 5.40KB
plugin-view (index.js) 94.68KB 24.36KB
providers (DataSourceProvider.js) 0.75KB 0.39KB
providers (MetadataProvider.js) 1.37KB 0.59KB
providers (ThemeProvider.js) 1.90KB 0.85KB
providers (UploadProvider.js) 12.07KB 3.68KB
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) 126.45KB 41.40KB
react (data-invalidation.js) 5.05KB 2.08KB
react (index.js) 4.71KB 2.11KB
react (schema-input.js) 4.31KB 2.07KB
react (spec-input.js) 0.20KB 0.18KB
sdui-parser (body-dialect.js) 4.50KB 1.99KB
sdui-parser (codegen.js) 9.45KB 3.76KB
sdui-parser (dashboard-widget-options.js) 3.07KB 1.30KB
sdui-parser (index.js) 7.30KB 3.12KB
sdui-parser (input-type.js) 2.84KB 1.40KB
sdui-parser (parse.js) 25.28KB 7.81KB
sdui-parser (provenance.js) 3.84KB 1.90KB
sdui-parser (types.js) 0.29KB 0.24KB
sdui-parser (validate.js) 23.87KB 7.83KB
types (ai.js) 4.39KB 2.17KB
types (api-types.js) 0.20KB 0.18KB
types (app.js) 4.12KB 1.61KB
types (authoring-nodes.js) 0.20KB 0.19KB
types (base.js) 0.20KB 0.18KB
types (blocks.js) 0.20KB 0.18KB
types (cloud.js) 0.20KB 0.18KB
types (complex.js) 4.44KB 2.07KB
types (crud.js) 0.20KB 0.18KB
types (dashboard-filter-alias.js) 6.23KB 2.74KB
types (dashboard-widget-layout.js) 2.06KB 0.96KB
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) 1.13KB 0.65KB
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) 5.78KB 2.70KB
types (layout.js) 0.20KB 0.18KB
types (managed-by.js) 0.19KB 0.18KB
types (mobile.js) 5.00KB 2.39KB
types (navigation.js) 0.20KB 0.18KB
types (node-slots.js) 7.18KB 2.34KB
types (objectql.js) 0.20KB 0.18KB
types (overlay.js) 0.20KB 0.18KB
types (permissions.js) 2.52KB 1.31KB
types (plugin-scope.js) 0.20KB 0.18KB
types (product-blocks.js) 0.20KB 0.19KB
types (record-approval-decision.js) 0.20KB 0.20KB
types (record-components.js) 0.20KB 0.19KB
types (record-panels.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) 4.99KB 1.96KB
types (spec-ui-namespace.js) 0.20KB 0.19KB
types (strict-authoring-face.js) 19.93KB 7.26KB
types (system-fields.js) 3.33KB 1.54KB
types (theme.js) 6.28KB 2.87KB
types (ui-action.js) 8.48KB 3.50KB
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

@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

席位核对 · ACCEPT · objectui#13120 · PR #13168 · domain:ui#1 · session_014MXhk1yjWh37d634hLy3p7 · 2026-10-20T06:02Z

Head 05dc4638ac62824c2e69ae0123013b54fe1e3083. Reviewed against the claim and its amendment (6283862182, then 6284284090 adding the sibling file), and the dev reports (6284264204 6284511151) on objectui#13120, read on GitHub rather than from the report. No contract-review record is owed: the claim and the PR body read Clause-②: no, the diff is test code plus an empty-frontmatter changeset, and no published face moves.

  1. Shape: draft PR against main. The body's first line is Fixes #13120, the only closing keyword. Assignee huangyiirene. 3 files, +17 / −3. Not Tier H.
  2. Premise, re-measured: the counted backfill checkbox's name gains its number only after an asynchronous count read that runs after the option draws. Two of this seat's objectui#12929 tests read that name synchronously: StudioDesignSurface.publishBackfill-12929.test.tsx:231 (the read that ejected PR feat(app-shell): the create entry uses the object's create form view when declared #13117 from merge-group run 39367006901) and DraftChangesPanel.backfill-12929.test.tsx:117. A git grep over packages/**/*.test.tsx finds no third.
  3. The fix: both reads become waiting findByRole reads with the exact same name, so a checkbox without the count still fails. No other read changes; the report lists each one left and why.
  4. Reproduction and discrimination, per file, with a deterministic 200 ms delay on the count mock, each mutation restored by blob hash:
    • BASE ed28057 is red with the merge-group message verbatim: 1 failed, 2 passed and 1 failed, 9 passed.
    • The head is green under the same delay.
    • With a count that never arrives, the head is red at the waiting read: 3 failed and 1 failed, 9 passed.
    • Unmutated runs are green 3 times each.
  5. Gates: the dev's local runs at the head: app-shell type-check and lint, eslint --max-warnings 0 on both files, check:new-line-citations, check:control-bytes, changeset presence, claims and pending-literals all exit 0. CI on this head: 36 check-runs, 33 success and 3 expected skips.
  6. Accepted deviation: an empty-frontmatter changeset. check-changeset-presence counts a test file under src/ as source, and the brief allows it.
  7. Landing: not Tier H, and no contract-review face is hit. CI is green on this head, so the seat flips to ready and enables auto-merge.

@objectstack-fleet
objectstack-fleet Bot marked this pull request as ready for review October 20, 2026 06:03
@objectstack-fleet
objectstack-fleet Bot enabled auto-merge October 20, 2026 06:03
@objectstack-fleet
objectstack-fleet Bot added this pull request to the merge queue Oct 20, 2026
Merged via the queue into main with commit 96036bd Oct 20, 2026
37 checks passed
@objectstack-fleet
objectstack-fleet Bot deleted the claude/issue-13120-backfill-checkbox-wait branch October 20, 2026 06:16
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

2 participants