Skip to content

test(plugin-view): fold six more ObjectView pins over stand-in child renderers onto the shared harness - #30900

Merged
objectstack-fleet[bot] merged 1 commit into
mainfrom
claude/project-thread-siynsc
Nov 6, 2026
Merged

objectstack-fleet[bot] merged 1 commit into
mainfrom
claude/project-thread-siynsc

Conversation

@objectstack-fleet

@objectstack-fleet objectstack-fleet Bot commented Nov 6, 2026 •

Copy link
Copy Markdown
Contributor

Requested by Tesla · project thread
Part of #29469

Clause-②: no
Metadata-protocol: none

维护者速读

  • 改了什么:视图组件 ObjectView(plugin-view 包)再有 6 个单卡测试文件并入上一片(test(plugin-view): fold nine ObjectView pins over stand-in child renderers onto one shared harness #30872)建好的共享测试文件 ObjectView.harness.test.tsx,每个原文件变成一个顶层 describe,断言和标题一字未改;另有 3 个测试文件里点名这些文件的注释改成点名对应的块。
  • 为什么改:Tests grow 2.5 times faster than source: measure the per-fix test weight and the #25911 pilot, then roll the shared-setup merge out to the heaviest components or retire it #29469 第三族 ObjectView 的第二片,也是这一族最后一个 PR(席位修订 2:每族最多两个 PR)。本地同机实测,这 6 个文件的 CPU 从约 36 秒降到并入后约 8 秒;没有并入的 ObjectView 测试(plugin-view 39 个、app-shell 87 个)按共享的 setup 列在正文末尾。
  • 风险与回滚:只动测试文件,不改源码、门禁、CI,不发布任何东西;块之间串状态的风险用探针在原顺序和三种乱序下排除。formTitleNoProviderFallback 和 createGrant-12082 依赖 ui/vitest.setup.i18n-global.ts 每个测试后复原 react-i18next 全局实例:临时关掉那一步,这两块 7 个测试变红,恢复后全绿。回滚 = revert 本 PR。
  • 先看:ObjectView.formTitleNoProviderFallback 一块的文档注释(原来写着"必须单独成文件",现在说明为什么可以同文件),再看 ObjectView.formTitleI18n.test.tsx 改过的那段注释。
  • 两分钟验证:在 ui/ 下跑 pnpm exec vitest run packages/plugin-view/src/__tests__/ObjectView.harness.test.tsx,应见 1 个文件、119 个测试全过。
  • 需要你做的:无,席位落地。
  • 席位意见:ui 席 2 对照 head f5053769 的 diff 复核:10 个文件,6 个 ObjectView 单卡文件并入已有的 plugin-view 共享文件,另 3 个文件只改指向被并文件的注释(其一在 plugin-form,超出认领面但仅 1 行注释);断言与标题一字未改(it( 61=61、expect( 113=113),乱序三种种子全过;2,867 行未过 3,000 行线;CI 全绿,纯测试改动无发布面,不欠契约复审。未并入的 39 个 plugin-view 文件与 87 个 app-shell 文件已在正文列明。同意落地。

What changes

Slice 3b, the second and last ObjectView* PR of the shared-setup rollout (ruling 6583487846 on #29469; seat amendment 2, 6672694520: at most two PRs per family). Six more pins in ui/packages/plugin-view/src/__tests__/ that render the real ObjectView over the three-mock trio join ObjectView.harness.test.tsx, which slice 3a (#30872) created:

  • The three clean trio pins left after 3a: tableColumnsForwarding, strayGroupByLane-9242 and canonicalTableKeys. Then the three smallest trio pins that pass every census check except that another file names them: createGrant-12082, calendarBinding-7029 and formTitleNoProviderFallback.
  • Each former file is a top-level describe named after its file stem, with its docblock above it, appended after the nine 3a blocks. Its first lines are restoreAfterBlock() and a beforeEach that installs its three stand-ins, each copied verbatim from that file's mock factory; everything else is moved verbatim, re-indented by two spaces. A module-level beforeEach / afterEach of a former file is now the block's own hook. The 6 files are deleted. The harness goes from 9 to 15 top-level describe blocks. No 3a block, and no line of the header, the mocks or restoreAfterBlock(), changed.
  • The import list gains one line: MePermissionsProvider and the type MePermissionsAuthenticatedResponse from @object-ui/permissions, which createGrant-12082 used.
  • formTitleNoProviderFallback said it had to be its own file. Its docblock explained that a mounted I18nProvider installs react-i18next's global instance and that this survives cleanup(), so a provider-less render later in the same file would assert nothing. That no longer holds: ui/vitest.setup.i18n-global.ts (objectui#4514) puts back the pointer the file inherited after every test. The section is rewritten to say so, and keeps the rule not to mount a provider in that block. Measured both ways: the block runs after ObjectView.formLabelsI18nLabel-10993, which mounts a zh provider, and passes in declaration order and under three shuffled orders; with the reset's setI18n call disabled for one throwaway run, 7 tests go red (the 4 of formTitleNoProviderFallback and 3 of createGrant-12082, whose New button label resolves through the same global), and the other 112 stay green. The probe below also reads getI18n() as undefined at every block's start.

Comments that named a folded file (amendment 2: test files are updated, source files stay):

  • ui/packages/plugin-view/src/__tests__/ObjectView.formTitleI18n.test.tsx named ObjectView.formTitleNoProviderFallback.test.tsx and why it lived elsewhere; it now names the block and the setup file.
  • ui/packages/plugin-view/src/__tests__/ObjectView.ganttBinding-7070.test.tsx named ObjectView.calendarBinding-7029 as its sibling next door; it now names the block.
  • ui/packages/plugin-form/src/affordanceGrantMap-12082.test.tsx named ObjectView.createGrant-12082.test.tsx as the opener's runtime pin; it now names the block.

The two ui/packages/app-shell/src/views/ files that name ObjectView.calendarBinding-7029 (ObjectView.galleryBinding-7547, ObjectView.ganttBinding-7070) mean app-shell's own ObjectView.calendarBinding-7029.test.tsx, which stays, so they are unchanged. git grep of each of the 6 stems over ui, scripts, packages, content, apps and .github finds no other hit outside CHANGELOG.md history.

Test files only: no source file, no changeset (skip-changeset). @object-ui/plugin-view and @object-ui/plugin-form build from their entries with vite build, and no entry imports a test file.

Tests

Former file → describe (no title or assertion dropped)

TypeScript AST walk of each former file at 8b9cc712 (the main this was cut from, where they still exist) against the describe of the same name in the harness at this PR's head. An it is a call to it / test (an it.each(...)(...) counts once); titles are the describe > it paths under the block, compared as sorted lists.

former file it before it after expect( before expect( after titles identical
ObjectView.tableColumnsForwarding.test.tsx 14 14 21 21 yes
ObjectView.strayGroupByLane-9242.test.tsx 9 9 21 21 yes
ObjectView.canonicalTableKeys.test.tsx 27 27 47 47 yes
ObjectView.createGrant-12082.test.tsx 4 4 4 4 yes
ObjectView.calendarBinding-7029.test.tsx 3 3 13 13 yes
ObjectView.formTitleNoProviderFallback.test.tsx 4 4 7 7 yes
total 61 61 113 113 yes

The whole harness: 47 it / 97 expect( at 8b9cc712, 108 / 210 at this head (47 + 61, 97 + 113); no statement outside the blocks holds an it or expect(. The 108 it calls run as 119 tests (it.each rows), 55 of them the 3a blocks.

The diff adds one import line and appends after the last 3a block (ObjectView.filterSources); it removes no line of the harness.

CPU before and after (local A/B, one machine)

CI after: NOT MEASURED: the per-file timings reporter (#29517) uploads on main's full-battery runs only. Its first after-reading is the first full-battery main run after this merges.

Local A/B on one 4-vCPU container, under os-verify-lock (shared-box seconds), same command both legs, from ui/: pnpm exec vitest run packages/plugin-view/src/__tests__/ObjectView. --maxWorkers=2 (every ObjectView.* file in that directory, ObjectView.test.tsx included), with a throwaway reporter summing each module's diagnostic(). Fixed = environment + prepare + setup + collect (import). The "before" leg writes the 6 files and the harness from 8b9cc712 into the branch's tree, so both legs run the same 40 other files; run order before, after, before, after.

files tests passed fixed CPU test CPU total CPU wall
ObjectView family in plugin-view, before (run 1 / 2) 47 507 220.5 / 225.8 s 26.3 / 26.5 s 246.8 / 252.3 s 128.8 / 131.8 s
ObjectView family in plugin-view, after (run 1 / 2) 41 507 222.1 / 194.2 s 29.9 / 25.9 s 252.0 / 220.1 s 131.7 / 114.7 s
the 6 + the harness, before (run 1 / 2) 7 119 32.8 / 32.3 s 3.1 / 3.0 s 35.9 / 35.3 s
the harness, after (run 1 / 2) 1 119 6.3 / 5.2 s 2.8 / 2.5 s 9.1 / 7.6 s

The 6 files took 29.2 / 29.0 s of CPU on their own; the harness grew from 6.7 / 6.3 s to 9.1 / 7.6 s to hold them, so the fold saves about 27 s of CPU (−76 % for those seven files together). The family read 249.6 s before and 236.0 s after on average (−5.4 %), and wall 130.3 s to 123.2 s; the two after runs differ by 31.9 s, so that family figure is a reading inside this box's run-to-run spread, not a measured saving; the per-file figures above are the measurement. Across both slices the nine 3a files and these six, 15 files and 2,802 lines, now load the module graph once.

Acceptance notes

  • Why these 6, and not the whole ask. The seat's 3b order named the 3 clean pins, the trio pins another test file names, and the app-shell ObjectView pins in a second harness. Measured at 8b9cc712, that is about 14,000 changed lines: the 3 clean pins are 1,081 lines, the named-by trio pins about 3,300 more, and the app-shell pins 25,358 lines over 20 different mock-module sets. The dev reported that to the seat before writing anything, and the seat agreed (09:06Z) to the 3 clean pins plus the smallest named-by trio pins that fit the 3,000-line bar. 1,485 lines moved make 2,867 changed lines; the next smallest eligible pin (ObjectView.rowColorRelay-7218, 175 lines) would take it past 3,000.
  • This is ObjectView's last PR under amendment 2, so every ObjectView.* pin left unfolded is listed below by the setup it shares, from this head's tree. Whether to fold further is a new card the seat files (amendment 2). Two of the rows are not candidates at all: contractEnvelope-6726 is named by path in ui/scripts/check-vi-mock-inherit.mjs, a ledger outside __tests__, so it stays a file of its own; galleryBlockNested-12053 registers its tests from a for loop over its routes at collection time.
  • The app-shell pins are another family. They test the Console's ObjectView in @object-ui/app-shell, a different component from @object-ui/plugin-view's, and none of them uses the trio. Their largest dom clusters share a base of ./MetadataInspector, ./RecordDetailView, @object-ui/auth, @object-ui/collaboration and @object-ui/permissions mocks but differ in the rest of the set (and, file by file, in the overridden keys), so a fold there needs its own harness in app-shell and its own census; the seat judges whether that is a separate card. 12 dom files there mock nothing (2,548 lines), the natural first cluster for such a harness; 12 more mock nothing but are .test.ts files in the unit project, which is not isolated per file, so folding them saves nothing.
  • formTitleNoProviderFallback and createGrant-12082 fold cleanly only because the ui/ setup resets react-i18next's global after every test (the reverse run above is the evidence); a later change to ui/vitest.setup.i18n-global.ts is the thing that would undo it, and the rewritten docblock says so.
  • The harness header and the moved docblocks name the former files' issue numbers in prose, as the 3a blocks do; no new citation line is added outside moved text.

ObjectView pins left unfolded in @object-ui/plugin-view at this head: 39 files, 9,677 lines

ObjectView.test.tsx is the component's main suite, not a per-issue pin, and is not counted. "The trio" is the harness's three mocks (@object-ui/react with SchemaRenderer, SchemaRendererContext, subscribeDataChanges and notifyDataChanged replaced; @object-ui/plugin-grid with ObjectGrid; @object-ui/plugin-form with ObjectForm). A file sits under the first row it fails, top to bottom. Names drop the ObjectView. prefix and .test.tsx.

shared setup files (lines) lines
the trio and passes every check, but another file names it, so a fold also edits that file: the next fold's first candidates namedViewProtocolKeys-8980 (694; named by plugin-view.mdx, view-overlay-options-bag.test.ts, README.md), specShapedNamedView-8254 (379; named by ObjectView.tsx), mapFlatten (347; named by ListView.mapFlatten.test.tsx, CHANGELOG.md, ObjectMap.filterConfig.test.tsx, ObjectMap.topLevelStyle.test.tsx, index.bareMapKeyRetired-10393.test.tsx, ObjectView.tsx, CHANGELOG.md), calendarAliasRefused-8355 (305; named by CHANGELOG.md, CHANGELOG.md, CHANGELOG.md, CHANGELOG.md, ObjectView.harness.test.tsx, CHANGELOG.md), formTitleI18n (272; named by ObjectView.harness.test.tsx), kanbanConditionalFormatting (226; named by CHANGELOG.md), contractEnvelope-6840 (191; named by ObjectView.tsx), ganttBinding-7070 (191; named by ObjectView.galleryBinding-7547.test.tsx, ObjectView.harness.test.tsx), rowColorRelay-7218 (175; named by CHANGELOG.md, ObjectView.fieldOrderRelay-7516.test.tsx) 2780
the trio, but named by path in a ledger outside __tests__ (check-vi-mock-inherit.mjs): stays a file of its own contractEnvelope-6726 (161) 161
the trio, but its body registers tests from a loop at collection time galleryBlockNested-12053 (160) 160
the trio, plus vi.spyOn, vi.stubGlobal, vi.useFakeTimers or vi.stubEnv expandGate (355), sortSink (303), namedViewContextTokens-10506 (301), legacyChartRetired-6152 (159) 1118
the trio, plus a vi.hoisted or globalThis slot of its own viewIdentityDeps (348) 348
the trio modules, but @object-ui/react keeps its real SchemaRendererContext or data-change bus refreshInPlace-10035 (285), dataSourceContextFallback-7842 (220) 505
mocks @object-ui/plugin-form + @object-ui/plugin-grid, not the trio tableSlotRelay-10976 (280), routeTwoNamedGridMembers-10885 (264), pageSurfaceFallback-11015 (224), drawerDirection-11775 (193), splitPopoverCreate-10975 (148), namedViewNavigation-10885 (145), gridOperationsWithoutRead-6152 (95) 1349
mocks @object-ui/plugin-form, not the trio gridFilterHandoff-11880 (319), namedViewInlineEdit-10885 (129), tableEditable-10976 (121), tableTitleI18nLabel-10993 (114) 683
mocks @object-ui/permissions, not the trio gridDelete-10383 (401) 401
mocks @object-ui/plugin-grid, not the trio fetchAllowList-10982 (278) 278
mocks ../ViewSwitcher + @object-ui/plugin-form + @object-ui/plugin-grid + @object-ui/react, not the trio hostOnlyViewTypes (243) 243
mocks @object-ui/permissions + @object-ui/plugin-form + @object-ui/plugin-grid + @object-ui/react, not the trio expandFls-7429 (232) 232
mocks @object-ui/plugin-grid + @object-ui/react, not the trio namedViewSpecRecord-7928 (138) 138
mocks @object-ui/react, not the trio recordIdFilterToken-7297 (100) 100
no vi.mock (renders the real children), a setup of its own modifierClickNewTab-9806 (493), namedViewSortArity (312), busReread-10887 (232) 1037
.test.ts in the unit project, which is not isolated per file, so a fold saves nothing treeViewConfigDeclared-8253.test.ts (144) 144
total 39 files 9677

ObjectView pins in @object-ui/app-shell (ui/packages/app-shell/src/views/), another family: 87 files, 25,358 lines

Grouped by the set of modules each file passes to vi.mock. Names drop the ObjectView. prefix and .test.tsx.

shared setup (vi.mock modules) files (lines) lines
./MetadataInspector + ./RecordDetailView + @object-ui/auth + @object-ui/collaboration + @object-ui/permissions + @object-ui/plugin-list + @object-ui/plugin-view + sonner createPredicates (434), objectBoundActions-7234 (392), chartRelay-7823 (355), titleFieldConvergence (350), viewRowDeclaredReads-11013 (338), rowColorRelay-7218 (304), servedViewLabel-11295 (302), labelLessViewTab-12774 (291), importPredicates (290), viewDescriptionRelay-7199 (288), fieldOrderRelay-7516 (257), mobileFabListClearance-13134 (232) 3833
nothing setDefaultViewIdentity (467), defaultViewIdentity (337), kanbanLane-8193 (230), kanbanGroupByRetired-8213 (219), galleryBinding-7547 (206), overlayFilterRecovery (201), defaultColumns (187), ganttBinding-7070 (182), calendarBinding-7029 (174), viewOverrides (139), consoleProps.types (124), timelineBinding (82) 2548
./MetadataInspector + ./RecordDetailView + @object-ui/auth + @object-ui/collaboration + @object-ui/permissions + sonner listUrlState-11860 (746), personalViews-29635 (678), refreshInPlace-10035 (400), ufViewSwitch-11992 (294), hostRerenderRefetch-10046 (281), externalRefreshSum-10572 (274), stableFilterIdentity-7237 (274), objectDocSwapNoRefetch-27626 (216), refreshRereadsViews-13057 (192), setupListChrome-12606 (147) 3502
./MetadataInspector + ./RecordDetailView + ./metadata-admin/useMetadata + @object-ui/auth + @object-ui/collaboration + @object-ui/permissions + sonner emptyStateMatchesPage-11687 (321), recordCountFooter-10636 (279), recordOpenDisplay-26681 (261), createViewRefusal-11578 (249), phoneRecordPage-27058 (244), recordOpenPreference-26677 (200), addRecordOpensCreate-13089 (181), createKanbanView-11581 (173) 1908
./MetadataInspector + ./RecordDetailView + ./metadata-admin/useMetadata + @object-ui/auth + @object-ui/collaboration + @object-ui/permissions toolbarScriptSelection-12331 (446), inviteOutcome-27797 (357), inviteFeedback-11817 (354), headerSelectionGate-27831 (316), bulkWiredHeaderDuplicate-12462 (297) 1770
./MetadataInspector + ./RecordDetailView + @object-ui/auth + @object-ui/collaboration + @object-ui/permissions + @object-ui/plugin-list + sonner fallbackTabSessionOnly-11643 (399), inlineEditSessionOnly-5144 (396), toolbarWritesCompose-11642 (368), densityModeThroughFold-7924 (253), recordRelatedNotOnOwnList-11270 (151) 1567
./MetadataInspector + ./RecordDetailView + @object-ui/auth + @object-ui/collaboration + @object-ui/permissions + @object-ui/plugin-view + sonner listLinksPlural-11733 (237), favoritesEntry-12427 (223), starredView-27594 (221), listCrossObjectHost-12673 (218), listTitlePlural-11696 (215) 1114
./MetadataInspector + ./RecordDetailView + @object-ui/auth + @object-ui/collaboration + @object-ui/permissions titleViewSwitcher-27594 (295), objectListTitle-27950 (254), chartViewTabs-13114 (229) 778
./MetadataInspector + ./RecordDetailView + ./metadata-admin/inspectors/ViewVariantInspector + ./metadata-admin/useMetadata + @object-ui/auth + @object-ui/collaboration + @object-ui/permissions + @object-ui/plugin-list + @object-ui/plugin-view + sonner userListState-12418 (1045), viewWriteRefusal-11583 (478) 1523
./MetadataInspector + ./RecordDetailView + ./metadata-admin/useMetadata + @object-ui/auth + @object-ui/collaboration + @object-ui/permissions + @object-ui/plugin-list + sonner listPersonalized-28950 (346), recordDrawer-27545 (272) 618
./MetadataInspector + ./RecordDetailView + @object-ui/auth + @object-ui/collaboration + @object-ui/plugin-list + @object-ui/plugin-view + sonner viewRefusal-12112 (243), listActionsReadGate-12109 (171) 414
./MetadataInspector + ./RecordDetailView + @object-ui/auth + @object-ui/collaboration + @object-ui/plugin-view + sonner managedByBadgeAuthoring-12194 (177), setupListBadge-13385 (165) 342
./MetadataInspector + ./RecordDetailView + ./RuntimeDraftBar + ./metadata-admin/inspectors/ViewVariantInspector + @object-ui/auth + @object-ui/collaboration + @object-ui/permissions + @object-ui/plugin-view + sonner emptyColumnsNoProjection-10694 (618) 618
../providers/MetadataProvider.js + ./MetadataInspector + ./RecordDetailView + @object-ui/auth + @object-ui/collaboration + @object-ui/permissions + @object-ui/plugin-list + @object-ui/plugin-view + @object-ui/react + sonner storedRowParity-10380 (444) 444
./MetadataInspector + ./RecordDetailView + @object-ui/auth + @object-ui/collaboration + @object-ui/permissions + @object-ui/plugin-charts + @object-ui/plugin-view + sonner chartConfigForward-7891 (371) 371
./MetadataInspector + ./RecordDetailView + @object-ui/auth + @object-ui/collaboration + @object-ui/permissions + @object-ui/plugin-grid + @object-ui/plugin-list + @object-ui/plugin-view + sonner headerFold-12705 (294) 294
./MetadataInspector + ./RecordDetailView + ./metadata-admin/useMetadata + @object-ui/auth + @object-ui/collaboration + @object-ui/permissions + @object-ui/plugin-charts + sonner createChartView-11576 (261) 261
./MetadataInspector + ./RecordDetailView + ./metadata-admin/useMetadata + @object-ui/auth + @object-ui/collaboration + @object-ui/permissions + @object-ui/react managedEnvironmentUsers-13330 (253) 253
./MetadataInspector + ./RecordDetailView + ./ViewConfigPanel + ./metadata-admin/useMetadata + @object-ui/auth + @object-ui/collaboration + @object-ui/permissions + sonner viewConfigSaveWiring-10210 (188) 188
nothing, .test.ts in the unit project (not isolated per file, so a fold saves nothing) relayRungCensus-7559.test.ts (861), overlayPatchOnly.test.ts (388), overlayPairValue.test.ts (249), viewConfigSaveEnvelope-10210.test.ts (237), urlFilterSuffix-9196.test.ts (221), unboundAdapterCall.test.ts (214), overrideMasquerade.test.ts (205), listRecordHref.test.ts (188), filterParamsKeyEncoding-9287.test.ts (172), flatOverlayColumns-8411.test.ts (131), relayedBlocksParse-6152.test.ts (81), kanbanSummarizeField-11629.test.ts (65) 3012
total 87 files, 20 module sets 25358

Verification

At head f5053769, after pnpm install --frozen-lockfile and the closure build from slice 3a (turbo run build for @objectstack/spec, formula, lint, client, metadata-protocol, then --filter='@object-ui/plugin-view^...' from ui/), every run under os-verify-lock:

  • pnpm exec vitest run packages/plugin-view/ packages/plugin-form/src/affordanceGrantMap-12082.test.tsx --maxWorkers=2 from ui/ (VERDICT command-exit 0): 66 files, 775 tests, all passed. That is the 65 plugin-view files left after this PR plus the edited plugin-form file.
  • pnpm run type-check in ui/packages/plugin-view (tsc --noEmit && tsc -p tsconfig.test.json) and tsc -p tsconfig.test.json --noEmit in ui/packages/plugin-form: exit 0, 0 error TS.
  • eslint from the package directories: 0 errors. The harness and the two edited plugin-view files give 145 warnings (136 + 3 + 6, all no-explicit-any), the same 145 that the slice-3a harness, the 6 former files and the two edited files give at 8b9cc712; affordanceGrantMap-12082.test.tsx gives 0 before and after.
  • Order: the harness passes 119 / 119 in declaration order and under --sequence.shuffle.tests with --sequence.seed 11, 222 and 3333. A throwaway probe (a copy of the harness whose restoreAfterBlock() logs state at each block's first test: each registry entry's renderer and meta, the localStorage own property and both storage lengths, the html element's lang / dir, react-i18next's getI18n(), the three slots, body, globals added since import) reads every one of the 15 blocks starting from the same state in all four orders. The same probe with the helper's body removed finds the leaks 3a named (slots carried into the next block; lang="zh" / dir="ltr" after formLabelsI18nLabel-10993). The probe copies were deleted.
  • i18n reverse run: with ui/vitest.setup.i18n-global.ts's setI18n restore disabled for one run and then checked out again, the harness gave 7 failed / 112 passed (the 4 formTitleNoProviderFallback and 3 createGrant-12082 tests), as stated in What changes.
  • Derived gates (node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack, change set 10 paths against merge base 8b9cc712): 26 derived, 26 run with stdin from /dev/null, each exit 0 captured before any pipe; pnpm --dir ui exec vitest run scripts/ (VERDICT command-exit 0) gave 170 files passed and 2 skipped, 4,979 tests passed and 2 skipped; node scripts/check-sdui-manifest.mjs and its --self-test exit 0. --ran reconciliation: 26 derived, 26 run, 0 NOT-MEASURED, 0 UNRUN. pnpm check:new-line-citations from ui/: exit 0, 0 new citations.
  • Size: git diff --shortstat 8b9cc712 HEAD is 10 files, +1,373 / −1,494, 2,867 changed lines.
  • main has moved 3 commits past 8b9cc712; none touches ui/packages/plugin-view, ui/packages/plugin-form/src/affordanceGrantMap-12082.test.tsx, ui/vitest.config.mts or the ui/vitest.setup.* files, so the branch is not re-merged and the readings above stand for this head.
  • Open pull requests: the head trees of all 39 open PRs, compared with 8b9cc712 at the 10 paths, are equal except 4 (feat(i18n)!: the Console's language packs follow the platform locale table, keyed by its tags, and Traditional Chinese (zh-Hant) ships #30595, pm:mailbox — domain:devx#2 · marchtian #30515, pm:mailbox — epic:#3600#1 · hotlong #30297, pm:mailbox — triage#1 · os-zhuang #28646) whose affordanceGrantMap-12082.test.tsx (and, for pm:mailbox — triage#1 · os-zhuang #28646, ObjectView.createGrant-12082.test.tsx) lack lines main added after they branched; none of those lines is in a hunk this PR changes.
  • No ablation of a product behaviour: none changed, and the assertions moved verbatim.

Human Minimum

  • 1. Schemas start as Zod; packages/spec holds no runtime logic. (packages/spec not touched.)
  • 2. Every name I added uses the casing for its kind.
  • 3. No formatter ran; pnpm lint passes. (ui/ is linted by its own config; the lint readings are above.)
  • 4. One issue, one branch off an up-to-date main, one pull request.
  • 5. A change that publishes carries a changeset, and both declaration lines are filled in here and in the changeset. (Nothing publishes: skip-changeset.)
  • 6. packages/spec touched: its generated artifacts are regenerated and committed. (Not touched.)
  • 7. No hand edits to content/docs/references/, packages/*/CHANGELOG.md or content/docs/releases/.
  • 8. Title, body and comments are in English (the maintainer quick-read is the allowed Chinese section).

…renderers onto the shared harness

The three clean trio pins (tableColumnsForwarding, strayGroupByLane-9242,
canonicalTableKeys) and the three smallest pins another test file names
(createGrant-12082, calendarBinding-7029, formTitleNoProviderFallback) become
blocks of ObjectView.harness.test.tsx, each opening with restoreAfterBlock()
and installing its own three stand-ins. Every test, title and assertion is
kept. The test-file comments that named the folded files now name the block.

Co-Authored-By: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01L9qibxkcTyv8QYYuvpzAFL
@objectstack-fleet objectstack-fleet Bot added the skip-changeset PR has no user-facing published change; bypasses the changeset gate label Nov 6, 2026
@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

domain:ui#2 · os-tesla · session_01L9qibw7DekEe3wx5f3zphf

席位核对 · ACCEPT · 2026-11-06T10:23Z · head f50537696d5b22375ec5a4c0766ed50974072b27

Seat domain:ui#2 reviewed the diff of its own dispatch (claim 6681206941 on #29469, card thread session_01L9qibxkcTyv8QYYuvpzAFL, report 6682122662; the same seat dispatched and reviews, the code is the thread's).

  1. Shape: 10 files, +1,373 / -1,494, all test files: 6 ObjectView pins (tableColumnsForwarding, strayGroupByLane-9242, canonicalTableKeys, createGrant-12082, calendarBinding-7029, formTitleNoProviderFallback) deleted and folded as top-level blocks into plugin-view/src/__tests__/ObjectView.harness.test.tsx (from test(plugin-view): fold nine ObjectView pins over stand-in child renderers onto one shared harness #30872); comments that named the folded files updated in formTitleI18n, ganttBinding-7070 and plugin-form's affordanceGrantMap-12082. Part of #29469, skip-changeset.
  2. Premise measured: the full slice-3b ask measured ~14k changed lines at main 8b9cc712; the seat agreed to fill the 3,000-line bar with the clean and smallest named-by trio pins. formTitleNoProviderFallback's "own file" note was tested: with the i18n-global reset disabled a reverse run reds 7 tests, so the fold depends on vitest.setup.i18n-global.ts, now said in its comment.
  3. Gates / check-runs: 60 check runs on this head, 44 success, 16 skipped, 0 red. it( 61 = 61, expect( 113 = 113, titles identical; 119/119 in order and under 3 shuffle seeds; block probe clean; tsc 0; lint 145 = 145; plugin-view 775/775; 26 derived gates exit 0, --ran 0 NOT-MEASURED.
  4. Accepted deviation: ui/packages/plugin-form/src/affordanceGrantMap-12082.test.tsx is outside the claim's file surface; the change is a 2-line comment pointing at the folded block's new home. Not re-merged with main; the merge queue tests the merged ref.
  5. Out of scope / Skills-docs: the 39 unfolded plugin-view ObjectView pins (9,677 lines) and the 87 app-shell ObjectView pins (25,358 lines, 20 mock-module sets) are listed in the PR body; whether the app-shell family takes its own card is the seat's call on the card, not this PR. Skills-docs: not owed (test-only).
  6. Landing: check-governed-merges --branch: 0 of 10 paths governed, 2,867 changed lines ≤ 3,000 → Tier S path. Test-only: no contract review owed. Landing on the maintainer's standing word 「按 pm-dispatch 审过的pr你可以自主落地」 (2026-10-30T14:20Z) and 「ui 车道跟进一下 3小时内没更新的pr和已派发的issue,接手处理。」 (2026-11-06T05:20Z): relay pr_ready, then automerge_enable. On merge the card goes back to pm:queue (Part of).

@objectstack-fleet
objectstack-fleet Bot marked this pull request as ready for review November 6, 2026 10:25
@objectstack-fleet
objectstack-fleet Bot enabled auto-merge November 6, 2026 10:25
@objectstack-fleet
objectstack-fleet Bot added this pull request to the merge queue Nov 6, 2026
Merged via the queue into main with commit 7d9682f Nov 6, 2026
65 checks passed
@objectstack-fleet
objectstack-fleet Bot deleted the claude/project-thread-siynsc branch November 6, 2026 10:41
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size/xl skip-changeset PR has no user-facing published change; bypasses the changeset gate

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant