Skip to content

test(console): pin object-calendar member shapes (objectui#8071 slice 5) - #8872

Merged
os-warren merged 2 commits into
mainfrom
claude/issue-8071-member-pins-slice-5
Sep 10, 2026
Merged

os-warren merged 2 commits into
mainfrom
claude/issue-8071-member-pins-slice-5

Conversation

@os-warren

@os-warren os-warren commented Sep 9, 2026 •

Copy link
Copy Markdown
Collaborator

Refs #8071

What

Converts both remaining object-calendar MEMBER_PIN_EXEMPTIONS entries (calendar, dataSource) into real per-block member pins and lowers MEMBER_PIN_EXEMPTION_CEILING 48 -> 46 in the same commit. This closes object-calendar outright — every other key it declares (data, filter, sort, staticData) was already pinned by earlier slices — the same shape element:record_picker (slice 3) and record:quick_actions (slice 4) closed in.

before after
MEMBER_PINS 42 44
MEMBER_PIN_EXEMPTIONS 48 46
MEMBER_PIN_EXEMPTION_CEILING 48 46
population 90 90

Census by TypeScript AST walk (ts.createSourceFile, visiting VariableDeclaration/PropertyAssignment — not brace-depth counting), taken at BASE (42ddd7f71) and on the current tree; both match the dispatched ledger exactly.

Why this batch

object-calendar's only two remaining exemptions were both left over from objectui#8176 (AWAITING_A_PIN_NEWLY_JUDGED), on a block where the other four keys were already pinned — a two-key remainder on an already-mostly-pinned block, closeable outright rather than skimmed for the easy key and left with a straggler. NEWLY_JUDGED_UNPINNED_MEMBERS shrinks from 4 to 2 (only object-kanban's pair remain) — that array is checked against the live MEMBER_PIN_EXEMPTIONS state by the gate's own the ceiling correction admits exactly the four keys objectui#8176 made visible test, so it has to shrink in the same commit, not just the docblock prose.

  • dataSource — the shared elementDataSourceBlock per-element binding (ELEMENT_DATA_SOURCE_INPUT, @object-ui/core), the same mechanism element:record_picker.dataSource and record:related_list.dataSource already pin. Promotes a pre-existing file, ObjectCalendar.elementDataSource.test.tsx, read end to end before being credited.
  • calendar — had no existing candidate covering its own member set. New file: packages/plugin-calendar/src/__tests__/objectCalendarConfigMembers-8071.test.tsx, asserting startDateField/endDateField reaching an event's start/end, titleField outranking the object's own display-name resolution, and the sharp claim nothing else tests — getCalendarConfig returns schema.calendar outright when set, never merged against the flat legacy spelling it falls back to otherwise. colorField's resolution ladder and allDayField are each already pinned narrowly elsewhere (ObjectCalendar.colorFieldLadder-7243.test.tsx, ObjectCalendar.allDayFieldIsHonoured-8026.test.tsx) and are not re-asserted.

Corrected instruction applied

Per the dispatch correction: MEMBER_PIN_EXEMPTION_CEILING is a single constant with a single symbolic assertion (:3992 region). The "BOTH assertions must move together" sentence belongs to objectui#8176's UNPUBLISHED_EXEMPTIONS/LAZY_REGISTERED_BLOCKS backlog ceiling, a different constant — not touched here, and no second assertion was added or hunted for.

Verification

  • Gate: pnpm exec vitest run apps/console/src/__tests__/registry-inputs-spec-parity.test.ts — exit 0, 198 tests passed.
  • Full plugin-calendar suite: exit 0, 33 files / 232 tests passed.
  • Typecheck (via turbo run type-check, dependency closure built first): @object-ui/plugin-calendar exit 0 (15/15 tasks); @object-ui/console exit 0 (36/36 tasks).
  • Changeset presence check: exit 0 — empty-frontmatter changeset declared, matching PR test(console): pin record:quick_actions member shapes (objectui#8071 slice 4) #8860's (slice 4) shape.

Ablation 1 (gate mechanism)

Re-added 'object-calendar.calendar': AWAITING_A_PIN to MEMBER_PIN_EXEMPTIONS without touching the ceiling. Mutation proven on disk first (anchor grep count + blob hash changed: f7bce6b1b... -> cca09e53a...). Gate went red on 4 rows: the non-vacuity census, carries no stale member-pin exemption, the member-pin exemption list only ratchets DOWN (47 > 46), and — because this key sits on a LAZY_REGISTERED_BLOCKS member — the ceiling correction admits exactly the four keys objectui#8176 made visible. Restored via git checkout HEAD -- <abs path> from a trap ... EXIT INT TERM, restoration proven by blob hash (f7bce6b1b... exactly, matching HEAD's tree object). Gate re-ran green (198/198) after restoration.

Ablation 2 (each new pin is non-vacuous)

  • calendar: reversed getCalendarConfig's precedence (flat legacy fields checked before the nested calendar object, instead of the object short-circuiting outright). Ran the new pin file alongside the FULL plugin-calendar suite (33 files): exactly 1 of 6 rows in the new file went red (the precedence claim); the other 5 rows in the same file and all 231 other tests across 32 files — including the dataSource pin file, the colorField ladder file, and the allDayField file — stayed green. Mutation proven on disk (blob hash 5ede88b2... -> 821e1dc4...), restored via the same trap+git checkout HEAD, verified back to 5ede88b2....
  • dataSource: neutered the mapping (mapping={OBJECT_CALENDAR_DATA_SOURCE} -> mapping={{}}) in index.tsx. Ran the promoted pin file alongside its neighbours (object-calendar-renderer.propsContract.test.tsx, registration.test.tsx — the latter authors an unrelated dataSource: {...} shape, the same-named-but-different-mechanism control). Exactly 2 of 4 rows went red (the filter/view and sort/view rows); the unresolvable-view row, the no-binding control, and both neighbour files (all green) were unaffected. Mutation proven on disk (blob hash ac9230f3... -> 16a1d716...), restored and verified back to ac9230f3....

Non-vacuity: gate exit 0 at rest both before and after each ablation.

Ledger hazard (objectui#8614 UNGATED_EXAMPLES)

Grepped scripts/check-doc-example-types.mjs for any row citing a file this diff shifts lines in. Control (packages/auth/src/AuthGuard.tsx:, a real ledger key) fires: 1 hit. Target files — the gate file, the new test file, and the promoted dataSource file — 0 hits each. No re-keying needed.

Base -> main pre-flight

origin/main is unchanged at 42ddd7f71 (the dispatched ledger commit) as of this push — the window is empty, so this is not evidence of no collision, only that none is measurable yet.

Live-branch file-surface measurement

claude/kanban-gantt-family-retirement (still open on origin at c695a1c8d) touches packages/plugin-kanban/**, packages/types/src/complex.ts, packages/types/src/zod/complex.zod.ts, and console/docs/examples files — measured via git diff --name-only origin/main...FETCH_HEAD, re-fetched fresh at push time. Zero overlap with this PR's three files (the gate file, packages/plugin-calendar/src/__tests__/objectCalendarConfigMembers-8071.test.tsx, .changeset/object-calendar-member-pins-8071.md).

Repair round — @object-ui/plugin-calendar#lint

This PR was RED from the moment it opened: 29 checks green, 3 skipped, Lint failed. turbo named exactly one task, @object-ui/plugin-calendar#lint, 235 problems (1 error, 234 warnings) (the ELIFECYCLE lines other packages printed were tasks CANCELLED when that one failed — no eslint output of their own). Reproduced locally on head 603f4da8, exit code redirected to a file and captured before any pipe:

packages/plugin-calendar/src/__tests__/objectCalendarConfigMembers-8071.test.tsx
  45:27  error  'screen' is defined but never used. Allowed unused vars must match /^_/u  object-ui/no-unused-imports

Whose failure: mine. object-ui/no-unused-imports is an error in this repo, while the paired @typescript-eslint/no-unused-vars report on the very same token is only a warning — which is why 234 warnings sat above it in the log and the single error was easy to miss.

lint run exit problems
head 603f4da8 1 235 (1 error, 234 warnings)
same tree, added file excluded — byte-equivalent to base 42ddd7f71, where this file is the sole plugin-calendar delta (git diff --name-status returns one A row) 0 226 (0 errors, 226 warnings)
head 0987aee1a (fixed) 0 233 (0 errors, 233 warnings)

The fix: delete the screen specifier from line 45. One token — that is the whole repair. No eslint-disable: the rule is reporting a genuinely dead import (screen occurs twice in the file — the import itself, and the English word "screen" inside a docblock sentence), and the sibling pin files that do not use it simply do not import it (ObjectCalendar.allDayFieldIsHonoured-8026.test.tsx, ObjectCalendar.expandFls-7230.test.tsx, ObjectCalendar.expandGate-6453.test.tsx all import { render, waitFor, cleanup } only). There is no no-unused-imports disable anywhere under packages/plugin-calendar/src/.

What the pins assert is unchanged. screen appeared in no assertion — the file reads its three claims off the captured event objects, never off the DOM. Re-verified at 0987aee1a, every exit code captured before any pipe: the gate apps/console/src/__tests__/registry-inputs-spec-parity.test.ts exit 0, 198 passed (identical to the prior head); the full plugin-calendar suite exit 0, 33 files / 232 tests passed — 33 being every *.test.ts* on disk in that package, so the new pin file did run.

The ablation blob hashes quoted above are unaffected: all three name files this repair did not touch (registry-inputs-spec-parity.test.ts, ObjectCalendar.tsx, index.tsx). The pin file's own blob moved 652ebc163 -> f766cfec6, differing by that one import specifier and nothing else.

⚠️ The "Base -> main pre-flight" reading above was taken at 603f4da8. origin/main has since advanced past 42ddd7f71 to 93127bd6; mergeable_state: behind is the merge queue's to rebuild, per the dispatch.

维护者速读(草稿)

  • 改了什么:把 object-calendar 剩下的两个成员豁免(calendar、dataSource)转成真实的逐块成员 pin,同一提交里把豁免上限 48 降到 46,该 block 现在零豁免、完全 pin 住。
  • 为什么改:承接 objectui#8071 的过渡计划,这两个 key 是 objectui#8176 遗留的最后两个"新发现但未 pin"的成员,选它是因为能一次性关掉整个 block,而不是挑软柿子留硬骨头。
  • 风险与代价(含回滚):纯测试改动,Clause-②: no,不涉及任何声明面变化,没有运行时源码被触碰。回滚只需 revert 这一个 commit,不影响其它 slice。
  • 席位意见:(留空,供评审席位填写)
  • 你要做的:确认两个新断言文件的行文与命名符合仓库既有 pin 文件的风格;确认 NEWLY_JUDGED_UNPINNED_MEMBERS 收缩到只剩 object-kanban 两项没有引入遗漏。

🤖 Generated with Claude Code

https://claude.ai/code/session_01Jmxdo7bmeqCQHLSfmLVX9w


Generated by Claude Code


Generated by Claude Code

Converts both remaining `object-calendar` MEMBER_PIN_EXEMPTIONS entries
(calendar, dataSource) into real per-block member pins and lowers
MEMBER_PIN_EXEMPTION_CEILING 48 -> 46 in the same commit, closing this
block outright — every other key it declares (data, filter, sort,
staticData) was already pinned.

`dataSource` is the shared elementDataSourceBlock per-element binding
(the same mechanism element:record_picker.dataSource and
record:related_list.dataSource already pin) and promotes a pre-existing
file (ObjectCalendar.elementDataSource.test.tsx) after reading it end to
end. `calendar` had no single existing candidate covering its own member
set — startDateField/endDateField reaching an event's start/end,
titleField outranking the object's own display-name resolution, and the
calendar-object-vs-flat-legacy-spelling precedence getCalendarConfig
applies — so it is a new file (objectCalendarConfigMembers-8071.test.tsx).
colorField's ladder and allDayField were already pinned narrowly
elsewhere and are not re-asserted.

Refs #8071

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

github-actions Bot commented Sep 9, 2026

Copy link
Copy Markdown
Contributor

✅ Console Performance Budget

Metric Value Budget
Eager closure (gzip, 50 chunks) 3486.3 KB 3512.7 KB
Main entry chunk (gzip) 144.1 KB 350 KB
Entry file index-ybqCeroT.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.00KB 114.54KB
core (index.js) 7.48KB 2.96KB
create-plugin (index.js) 26.68KB 8.94KB
data-objectstack (index.js) 198.39KB 55.29KB
fields (index.js) 246.94KB 62.28KB
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.39KB 19.92KB
plugin-chatbot (index.js) 194.54KB 46.34KB
plugin-dashboard (index.js) 131.43KB 34.44KB
plugin-designer (index.js) 215.51KB 44.29KB
plugin-detail (index.js) 252.45KB 65.33KB
plugin-editor (index.js) 2.23KB 1.05KB
plugin-form (index.js) 136.26KB 34.13KB
plugin-gantt (index.js) 167.16KB 40.99KB
plugin-grid (index.js) 210.86KB 57.28KB
plugin-kanban (index.js) 57.03KB 16.26KB
plugin-list (index.js) 112.73KB 27.69KB
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.54KB 20.84KB
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) 81.07KB 26.86KB
react (data-invalidation.js) 5.05KB 2.08KB
react (index.js) 4.63KB 2.18KB
react (schema-input.js) 2.32KB 1.24KB
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.55KB 2.45KB
sdui-parser (input-type.js) 2.84KB 1.40KB
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) 13.64KB 4.59KB
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

Copy link
Copy Markdown
Collaborator Author

⛔ This PR has been RED since it opened — Lint failed, and no one read it for ten hours

domain:spec @ objectui PM seat, session session_01Jmxdo7bmeqCQHLSfmLVX9w. Reporting my own miss first: the slice-5 os-dev report (issue comment 5605858951) recorded its own local runs and I took the PR as landable without reading the checks. It was not. 入队资格 = every check on the PR green, and this one is not.

The reading, on head 603f4da81e0e1c75358044904b9b7bfe6473216e

get_check_runs returns 33 check runs: 3 skipped (the coverage pair and dependabot), 29 success, and 1 failure — Lint, completed 17:16:18Z.

turbo's own summary names exactly one failing task:

✖ 235 problems (1 error, 234 warnings)     ← @object-ui/plugin-calendar
Tasks:    33 successful, 47 total
Failed:   @object-ui/plugin-calendar#lint

⚠️ The ELIFECYCLE Command failed. lines printed for @object-ui/react, components, plugin-form, plugin-grid, app-shell, permissions, fields, plugin-gantt, data-objectstack and example-schema-catalog carry no eslint output of their own — those are tasks cancelled when plugin-calendar failed, not ten separate failures. Only the one task is named under Failed:.

⚠️ I did not read the error's own line, and am not guessing at it. The tail I retrieved begins below it — everything I can see in plugin-calendar is @typescript-eslint/no-explicit-any and react-refresh/only-export-components warnings (234 of them, which do not fail the run). The single error is above the retrieved window. Reproduce it, do not infer it.

What this PR is, so the repair stays inside it

Slice 5 of objectui#8071: object-calendar's two remaining MEMBER_PIN_EXEMPTIONS entries (calendar, dataSource) become real per-block member pins, MEMBER_PIN_EXEMPTION_CEILING 48 → 46 in the same commit. Three files, pure test change, Clause-②: no. The new file packages/plugin-calendar/src/__tests__/objectCalendarConfigMembers-8071.test.tsx is the only thing this PR adds to the package whose lint failed — which makes it the first place to look, ⛔ not a conclusion.

mergeable_state is behind (base pinned at 42ddd7f71); the merge queue rebuilds on main, so that is not itself a blocker — the red check is.

A repair round is dispatched now. ⛔ The PR stays draft and is ⛔ not enqueued until every check is green on the new head.


Generated by Claude Code

… pin

The slice-5 pin file imported `screen` from `@testing-library/react` and
never referenced it — it reads its three claims off the captured event
objects, not off the DOM, so nothing in the file ever queries the screen.

`object-ui/no-unused-imports` is an ERROR in this repo (the paired
`@typescript-eslint/no-unused-vars` report is only a warning), so the
single unused specifier was the one error in
`@object-ui/plugin-calendar#lint` and the only reason the PR was red:

    src/__tests__/objectCalendarConfigMembers-8071.test.tsx
      45:27  error  'screen' is defined but never used.
                    Allowed unused vars must match /^_/u   object-ui/no-unused-imports

Deleting the specifier is the whole repair. No `eslint-disable`: the rule
is correctly reporting a genuinely dead import, and the sibling pin files
that do not use `screen` simply do not import it
(`ObjectCalendar.allDayFieldIsHonoured-8026.test.tsx`,
`ObjectCalendar.expandFls-7230.test.tsx`,
`ObjectCalendar.expandGate-6453.test.tsx` all import
`{ render, waitFor, cleanup }` only). There is no `no-unused-imports`
disable anywhere under `packages/plugin-calendar/src/`.

What the pins assert is unchanged — `screen` appeared in no assertion.

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

Copy link
Copy Markdown
Contributor

✅ Console Performance Budget

Metric Value Budget
Eager closure (gzip, 50 chunks) 3487.6 KB 3512.7 KB
Main entry chunk (gzip) 144.1 KB 350 KB
Entry file index-DWcSrO6M.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) 7.48KB 2.96KB
create-plugin (index.js) 28.04KB 9.46KB
data-objectstack (index.js) 200.01KB 55.77KB
fields (index.js) 246.97KB 62.30KB
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.39KB 19.92KB
plugin-chatbot (index.js) 194.54KB 46.34KB
plugin-dashboard (index.js) 132.41KB 34.84KB
plugin-designer (index.js) 215.69KB 44.34KB
plugin-detail (index.js) 252.45KB 65.33KB
plugin-editor (index.js) 2.23KB 1.05KB
plugin-form (index.js) 136.79KB 34.19KB
plugin-gantt (index.js) 166.96KB 40.93KB
plugin-grid (index.js) 210.86KB 57.28KB
plugin-kanban (index.js) 57.58KB 16.47KB
plugin-list (index.js) 112.54KB 27.65KB
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) 81.07KB 26.86KB
react (data-invalidation.js) 5.05KB 2.08KB
react (index.js) 4.63KB 2.18KB
react (schema-input.js) 2.32KB 1.24KB
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.55KB 2.45KB
sdui-parser (input-type.js) 2.84KB 1.40KB
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) 13.64KB 4.59KB
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

@os-warren
os-warren marked this pull request as ready for review September 10, 2026 03:35
@os-warren
os-warren added this pull request to the merge queue Sep 10, 2026

Copy link
Copy Markdown
Collaborator Author

Green on 0987aee1a — flipped ready and enqueued. ⚠️ The enqueue itself is NOT VERIFIED, and here is why.

domain:spec @ objectui PM seat, session session_01Jmxdo7bmeqCQHLSfmLVX9w.

Eligibility, measured

get_check_runs on head 0987aee1aca334fea742a00db57226c28a4aae70: 33 runs — 30 success, 3 skipped, 0 failure, 0 in_progress. The three skips are by design (Test (coverage), Test (coverage shard …), dependabot).

⛔ 入队资格 is every check green, ⛔ not a required subset — so the four test shards and Type Check, which were still running at 03:16Z, were waited out rather than assumed: shard 4 landed 03:22:19Z, shard 3 03:22:36Z, shard 2 03:27:49Z, shard 1 03:28:29Z, Type Check 03:17:30Z. Lint, the check that was red for ten hours, completed success at 03:16:31Z.

What I did, and what I can prove

act verified? how
flip out of draft ✅ yes read back: "draft": false
enqueue (enable_pr_auto_merge, SQUASH) ⚠️ NO see below

⚠️ enable_pr_auto_merge's return string is content-free. It came back as "Auto-merge enabled … (method: , enabled at )" — the method and timestamp are empty, so the string asserts a state it does not carry evidence for. This seat's rule is to verify such a call in the PR's event log, by ACTION and ACTOR.

⛔ I cannot run that check. This session reaches GitHub only through the MCP server, and it exposes no issue-timeline / PR-events tool — pull_request_read's get does not surface an auto_merge object either. So there is no reading available to me that distinguishes "enqueued" from "the call was a no-op". ⇒ Reported as NOT VERIFIED rather than dressed up as done.

The substitute is the outcome, and it is checked by content. A check-in is scheduled; when this PR merges I will verify on origin/main that MEMBER_PIN_EXEMPTIONS reads 46 keys, MEMBER_PIN_EXEMPTION_CEILING = 46, object-calendar leftovers NONE, with a firing control on the same matcher (object-form. entries still non-zero) so an empty result is a closure and not a broken matcher — ⛔ not from an API field. If it has not merged by then, the no-op reading wins and I enqueue again.

mergeable_state is unstable and the base is still pinned at 42ddd7f71 while main has moved to 93127bd6 — the merge queue rebuilds on main, so that is the queue's job, not a blocker.

⭐ The process gap this PR paid for, recorded so slice 6 does not repeat it

The verification recipe these slices have followed — vitest gate + full package suite + turbo run type-check — has no lint step. All three were run and all three were green while a one-token dead import made Lint red. ⇒ Slice 6's dispatch requires pnpm --filter <touched package> lint → exit 0 before push, with the exit code captured into a file before any pipe. That is now part of the template, not a note.


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

Development

Successfully merging this pull request may close these issues.

2 participants