Repository navigation
test(console): pin object-calendar member shapes (objectui#8071 slice 5) - #8872
Conversation
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
✅ Console Performance Budget
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
Size Limits
|
⛔ This PR has been RED since it opened —
|
… 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
✅ Console Performance Budget
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
Size Limits
|
Green on
|
| act | verified? | how |
|---|---|---|
| flip out of draft | ✅ yes | read back: "draft": false |
enqueue (enable_pr_auto_merge, SQUASH) |
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
Refs #8071
What
Converts both remaining
object-calendarMEMBER_PIN_EXEMPTIONSentries (calendar,dataSource) into real per-block member pins and lowersMEMBER_PIN_EXEMPTION_CEILING48 -> 46 in the same commit. This closesobject-calendaroutright — every other key it declares (data,filter,sort,staticData) was already pinned by earlier slices — the same shapeelement:record_picker(slice 3) andrecord:quick_actions(slice 4) closed in.MEMBER_PINSMEMBER_PIN_EXEMPTIONSMEMBER_PIN_EXEMPTION_CEILINGCensus by TypeScript AST walk (
ts.createSourceFile, visitingVariableDeclaration/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_MEMBERSshrinks from 4 to 2 (onlyobject-kanban's pair remain) — that array is checked against the liveMEMBER_PIN_EXEMPTIONSstate by the gate's ownthe ceiling correction admits exactly the four keys objectui#8176 made visibletest, so it has to shrink in the same commit, not just the docblock prose.dataSource— the sharedelementDataSourceBlockper-element binding (ELEMENT_DATA_SOURCE_INPUT,@object-ui/core), the same mechanismelement:record_picker.dataSourceandrecord:related_list.dataSourcealready 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, assertingstartDateField/endDateFieldreaching an event'sstart/end,titleFieldoutranking the object's own display-name resolution, and the sharp claim nothing else tests —getCalendarConfigreturnsschema.calendaroutright when set, never merged against the flat legacy spelling it falls back to otherwise.colorField's resolution ladder andallDayFieldare 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_CEILINGis a single constant with a single symbolic assertion (:3992region). The "BOTH assertions must move together" sentence belongs to objectui#8176'sUNPUBLISHED_EXEMPTIONS/LAZY_REGISTERED_BLOCKSbacklog ceiling, a different constant — not touched here, and no second assertion was added or hunted for.Verification
pnpm exec vitest run apps/console/src/__tests__/registry-inputs-spec-parity.test.ts— exit 0, 198 tests passed.plugin-calendarsuite: exit 0, 33 files / 232 tests passed.turbo run type-check, dependency closure built first):@object-ui/plugin-calendarexit 0 (15/15 tasks);@object-ui/consoleexit 0 (36/36 tasks).Ablation 1 (gate mechanism)
Re-added
'object-calendar.calendar': AWAITING_A_PINtoMEMBER_PIN_EXEMPTIONSwithout 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 aLAZY_REGISTERED_BLOCKSmember —the ceiling correction admits exactly the four keys objectui#8176 made visible. Restored viagit checkout HEAD -- <abs path>from atrap ... EXIT INT TERM, restoration proven by blob hash (f7bce6b1b...exactly, matchingHEAD's tree object). Gate re-ran green (198/198) after restoration.Ablation 2 (each new pin is non-vacuous)
calendar: reversedgetCalendarConfig's precedence (flat legacy fields checked before the nestedcalendarobject, instead of the object short-circuiting outright). Ran the new pin file alongside the FULLplugin-calendarsuite (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 thedataSourcepin file, the colorField ladder file, and the allDayField file — stayed green. Mutation proven on disk (blob hash5ede88b2...->821e1dc4...), restored via the same trap+git checkout HEAD, verified back to5ede88b2....dataSource: neutered the mapping (mapping={OBJECT_CALENDAR_DATA_SOURCE}->mapping={{}}) inindex.tsx. Ran the promoted pin file alongside its neighbours (object-calendar-renderer.propsContract.test.tsx,registration.test.tsx— the latter authors an unrelateddataSource: {...}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 hashac9230f3...->16a1d716...), restored and verified back toac9230f3....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.mjsfor 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 promoteddataSourcefile — 0 hits each. No re-keying needed.Base -> main pre-flight
origin/mainis unchanged at42ddd7f71(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 atc695a1c8d) touchespackages/plugin-kanban/**,packages/types/src/complex.ts,packages/types/src/zod/complex.zod.ts, and console/docs/examples files — measured viagit 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#lintThis PR was RED from the moment it opened: 29 checks green, 3 skipped,
Lintfailed. turbo named exactly one task,@object-ui/plugin-calendar#lint,235 problems (1 error, 234 warnings)(theELIFECYCLElines other packages printed were tasks CANCELLED when that one failed — no eslint output of their own). Reproduced locally on head603f4da8, exit code redirected to a file and captured before any pipe:Whose failure: mine.
object-ui/no-unused-importsis an error in this repo, while the paired@typescript-eslint/no-unused-varsreport 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.603f4da842ddd7f71, where this file is the soleplugin-calendardelta (git diff --name-statusreturns oneArow)0987aee1a(fixed)The fix: delete the
screenspecifier from line 45. One token — that is the whole repair. Noeslint-disable: the rule is reporting a genuinely dead import (screenoccurs 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.tsxall import{ render, waitFor, cleanup }only). There is nono-unused-importsdisable anywhere underpackages/plugin-calendar/src/.What the pins assert is unchanged.
screenappeared in no assertion — the file reads its three claims off the captured event objects, never off the DOM. Re-verified at0987aee1a, every exit code captured before any pipe: the gateapps/console/src/__tests__/registry-inputs-spec-parity.test.tsexit 0, 198 passed (identical to the prior head); the fullplugin-calendarsuite 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 moved652ebc163->f766cfec6, differing by that one import specifier and nothing else.603f4da8.origin/mainhas since advanced past42ddd7f71to93127bd6;mergeable_state: behindis the merge queue's to rebuild, per the dispatch.维护者速读(草稿)
object-calendar剩下的两个成员豁免(calendar、dataSource)转成真实的逐块成员 pin,同一提交里把豁免上限 48 降到 46,该 block 现在零豁免、完全 pin 住。Clause-②: no,不涉及任何声明面变化,没有运行时源码被触碰。回滚只需 revert 这一个 commit,不影响其它 slice。NEWLY_JUDGED_UNPINNED_MEMBERS收缩到只剩object-kanban两项没有引入遗漏。🤖 Generated with Claude Code
https://claude.ai/code/session_01Jmxdo7bmeqCQHLSfmLVX9w
Generated by Claude Code
Generated by Claude Code