Skip to content

fix(ci): stop the eager-closure gate header restating its ceiling and baseline - #9076

Merged
baozhoutao merged 1 commit into
mainfrom
claude/issue-8964-header-retired-figures
Sep 10, 2026
Merged

fix(ci): stop the eager-closure gate header restating its ceiling and baseline#9076
baozhoutao merged 1 commit into
mainfrom
claude/issue-8964-header-retired-figures

Conversation

@claude

@claude claude Bot commented Sep 10, 2026

Copy link
Copy Markdown
Contributor

Fixes #8964

What was false

The module header of the eager-closure gate carried a note that said WHICH constant is which — and stated both of them as MiB literals while doing it. The maintainer-authorised re-baseline of objectui#7685 moved both constants; the prose stayed. For four days and three subsequent edits to that file the note rendered the RETIRED pair, explaining at length why two figures neither of which was in force were consistent with each other, and nothing anywhere went red.

Verified on c3a427378 before touching anything, and every premise the dispatch listed held:

  • all four occurrences of the retired pair survived in the header (two of each figure);
  • the two constants today are 3,597,000 and 3,551,191, which render to a different pair entirely;
  • objectui#8554's commit touched this file and its diff mentions neither stale figure — the staleness was untouched;
  • control: the sentence the card quotes reads exactly once in the same pass.

What this does

⛔ Not a refresh of the two literals. That is the one shape the ruling rules out, it is what was done last time, and it would have restarted the clock inside the very header that argues at length against copied numbers.

Instead the note names its subjects and renders neither. BASELINE carries the measured payload, MAX_EAGER_CLOSURE_GZIP_BYTES is the ceiling standing over it, both a few lines below in bytes and each pinned to the commit it was measured on, and the gate's verdict line prints the live reading on every run. Saying which is which — all objectui#7528 ever asked of this paragraph — survives intact. This is the shape objectui#8606 and objectui#8629 each landed today: delete the copy, point at the instrument.

One consequential sentence moves with it. The "Raising it" instruction asked for the measured figure in this comment to be updated on a re-baseline; after this change the header carries no such figure, so it now points at the prose attached to the constant, which is where the figure lives and where objectui#7046's pin already checks it.

The durable half — a pin that can fail

A new pin refuses a rendered size written back into that note.

⚠️ It is deliberately not a widening of the chunk-count pin into a size pin. That trade was weighed where the count pin lives and declined for a reason that still holds: a general size pin would have to tell a ceiling's value from the several sizes this file's prose legitimately carries, and it cannot. This one does not try. Its population is the two named paragraphs, which carry no size at all, and its whole claim is that they still carry none. The anchored measurements elsewhere in the header — the re-baseline records, the incident figures — are outside it and unchanged.

The region is located by its opening and closing sentences, both asserted present and unique, with a length floor and a positive control, so an empty scan is a reading rather than a silence.

Shown red, twice, then restored by hash. Both legs mutated the committed file on disk (proved by blob hash before and after, not by an exit code), ran the suite, and restored with git checkout HEAD -- path, proved by blob equality against the HEAD blob plus an empty git diff HEAD:

mutation result
a rendered size written back into the note Tests 1 failed, 123 passed — only the new pin fired, with its own message naming the figure
the note's opening sentence reworded away Tests 2 failed, 122 passed — the silence leg fires first, so a rewrite cannot turn the pin green by emptying it

Restored state after each: disk blob 84b9ea784913ad41e46cff5fa23033b2bb29d7b2 equals the HEAD blob, git diff HEAD empty, git status clean.

Verification, on the final commit 1da8bca86

  • vitest run scripts/__tests__/check-eager-closure-budget.test.tsTest Files 1 passed, Tests 124 passed (124).
  • Every neighbouring test that reads this checker, run together (side-effects array, ci-cd pipeline doc, render-budget comment, declared lazy views, ineffective dynamic imports, plus the gate's own) — Test Files 6 passed (6), Tests 326 passed (326).
  • tsc -p tsconfig.scripts.json — exit 0, and --listFiles confirms the edited test file is in that program, so this is a measurement rather than an assumption.
  • check:control-bytesOK (scanned 7264 tracked text file(s); skipped 85 binary).
  • check:new-line-citations0 new citation(s).
  • check:comment-mask-corpus — exit 0, 1 file(s) disagree, within the residue objectui#7882 is holding open, unchanged by this diff.
  • check-changeset-presence.mjs — exit 0: "No source or published contract of a released package changed in this range, so no changeset is owed." A changeset with empty frontmatter is included anyway, declaring no release explicitly; check-changeset-no-major.mjs exit 0.
  • check-governed-queue-guard.mjs --test on all three paths — NOT GOVERNED.
  • eslint on both edited files, --no-inline-config, --format json: 2 files linted, 0 errors, 0 warnings. Narrowed from the repo-wide run deliberately, and the narrowing is a measurement: the file count is read from eslint's own JSON output, and this repository enables no type-aware linting, so a comment-only edit in these two files cannot move the verdict on any file it did not touch.
  • Prettier reports both files as unformatted — it reports the same for both files as they stand on c3a427378, prettier appears in no workflow and in no eslint config here, so this is pre-existing and unenforced. ⛔ Not "fixed" in passing: reformatting either file would bury a comment-only diff under unrelated churn.

Boundaries held

No constant, ceiling, baseline, floor, allowance or grain moved — the diff is comments plus one new test block plus a changeset. Nothing objectui#8554 landed in this file is touched, no existing pin, threshold or assertion is weakened, no test is skipped, disabled or quarantined, and content/docs/releases/ is untouched.

Merged origin/main before opening: the branch is cut from c3a427378 and git merge origin/main reports already up to date.


🤖 Generated with Claude Code

https://claude.ai/code/session_01FhBNJcLRZLe8M87VcUgpKr


Generated by Claude Code

… baseline

The header note that says which constant is which stated both of them as MiB
literals and then explained, correctly and at length, why the two figures were
consistent with each other. The maintainer-authorised re-baseline of
objectui#7685 moved both constants in `639114c4d`; the prose stayed. For four
days and three subsequent edits to this file the note rendered the RETIRED
pair — explaining the consistency of two numbers neither of which was in force
— and nothing anywhere went red, because nothing fails on a number written in
a comment.

Refreshing the two literals would have restarted that clock, inside the very
header that argues at length against copied numbers. So the note names its
subjects and renders neither: `BASELINE` carries the measured payload,
`MAX_EAGER_CLOSURE_GZIP_BYTES` is the ceiling standing over it, both a few
lines below in bytes and each pinned to the commit it was measured on, and the
gate's verdict line prints the live reading on every run. Saying which is which
— all objectui#7528 ever asked of this paragraph — survives intact.

The "Raising it" instruction moves with it: it asked for the measured figure in
this comment to be updated, and after this change the header carries no such
figure. It now points at the prose attached to the constant, which is where the
figure lives and where the objectui#7046 pin already checks it.

Second half, the durable one: a pin that refuses a rendered size written back
into that note. It is deliberately NOT a widening of the chunk-count pin into a
size pin — that trade was weighed and declined where it lives, for a reason
that still holds. Its population is the two named paragraphs, which carry no
size at all; the anchored measurements elsewhere in the header are outside it
and unchanged. The region is located by its opening and closing sentences, both
asserted present and unique, with a length floor and a positive control, so an
empty scan is a reading rather than a silence.

No constant, ceiling, baseline, floor, allowance or grain moved, and no
existing pin, threshold or assertion was weakened.

Fixes #8964

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FhBNJcLRZLe8M87VcUgpKr
@github-actions github-actions Bot added the tests label Sep 10, 2026
@github-actions

Copy link
Copy Markdown
Contributor

✅ Console Performance Budget

Metric Value Budget
Eager closure (gzip, 50 chunks) 3490.1 KB 3512.7 KB
Main entry chunk (gzip) 144.2 KB 350 KB
Entry file index-CBNW8r8T.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) 500.20KB 114.67KB
core (index.js) 8.28KB 3.31KB
create-plugin (index.js) 27.94KB 9.51KB
data-objectstack (index.js) 207.56KB 57.44KB
fields (index.js) 247.01KB 62.29KB
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) 6.57KB 2.76KB
i18n (index.js) 3.65KB 1.47KB
i18n (pickLocalized.js) 7.62KB 3.26KB
i18n (provider.js) 26.89KB 9.04KB
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.84KB 10.94KB
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.03KB 13.93KB
plugin-charts (index.js) 71.50KB 19.97KB
plugin-chatbot (index.js) 195.32KB 46.51KB
plugin-dashboard (index.js) 131.21KB 34.62KB
plugin-designer (index.js) 215.68KB 44.27KB
plugin-detail (index.js) 251.44KB 65.17KB
plugin-editor (index.js) 2.23KB 1.05KB
plugin-form (index.js) 136.79KB 34.19KB
plugin-gantt (index.js) 166.65KB 40.91KB
plugin-grid (index.js) 211.56KB 57.50KB
plugin-kanban (index.js) 46.07KB 14.32KB
plugin-list (index.js) 112.52KB 27.64KB
plugin-map (index.js) 20.49KB 6.83KB
plugin-markdown (index.js) 13.88KB 4.80KB
plugin-report (index.js) 43.42KB 11.92KB
plugin-timeline (index.js) 30.10KB 8.74KB
plugin-tree (index.js) 9.55KB 3.32KB
plugin-view (index.js) 84.42KB 20.80KB
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) 83.34KB 27.61KB
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) 20.57KB 5.88KB
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.27KB 5.47KB
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

@baozhoutao
baozhoutao marked this pull request as ready for review September 10, 2026 23:08
@baozhoutao
baozhoutao added this pull request to the merge queue Sep 10, 2026
Merged via the queue into main with commit 3984bab Sep 10, 2026
37 checks passed
@baozhoutao
baozhoutao deleted the claude/issue-8964-header-retired-figures branch September 10, 2026 23:27
Sign up for free to 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.

The eager-closure gate's header still renders the RETIRED ceiling/baseline pair as "3.07 MB" and "3.12 MB" — both have been false since 639114c4d

2 participants