Skip to content

refactor(components)!: retire 44 more zero-consumer entry exports - #30791

Merged
objectstack-fleet[bot] merged 5 commits into
mainfrom
claude/project-thread-q0aqk6
Nov 6, 2026
Merged

objectstack-fleet[bot] merged 5 commits into
mainfrom
claude/project-thread-q0aqk6

Conversation

@objectstack-fleet

Copy link
Copy Markdown
Contributor

Requested by Sales · project thread

Part of #25921. The umbrella stays open; this is barrel batch 7, claim 6674577823 (seat domain:ui#1), batch amendments 6674785161 and 6674939838. Earlier batches: #30541, #30576, #30629, #30650, #30708, #30752.

Clause-②: no (narrowing)
Metadata-protocol: none

维护者速读

  • 改了什么:@object-ui/components 的包入口再少导出 44 个名字。其中 13 个包内也无人读,直接删除(item.tsx 的 9 个子件、整个 native-select.tsx、ResizableHandleProps、useRelatedCount);其余 31 个只离开入口,留在原模块供本包渲染器、筛选器和通知组件使用。
  • 为什么改:这 44 个名字在仓内(包外,含测试与文档)与 hotcrm 均零引用或只有同名异物,README 未教,也不被保留导出的签名用到。本卡逐包收窄无人使用的公开导出。
  • 风险与回滚:对外是 breaking 收窄,只影响直接从包入口 import 这些名字的外部宿主;控制台、所有 @object-ui/* 包、所有 schema 节点类型、筛选器和五种通知照常。custom/index.ts 的 8 行 export * 改成具名列表,反向探针证明其余 364 个入口名一个不少。回滚即 revert 本 PR。
  • 先看:ui/packages/components/src/custom/index.ts(具名列表,漏列即丢活名)、src/custom/item.tsx(删掉 9 个子件)、.changeset/25921-components-helpers-and-family-heads.md(迁移说明)。
  • 两分钟验证:git grep -l -w -e ItemMedia -e NativeSelect -e notificationSeverityStyle -- ':!ui/packages/components' ':!**/CHANGELOG.md' 应只命中本 PR 的 changeset。
  • 需要你做的:无,席位落地。

What changes

  • @object-ui/components, deleted (nothing inside the package read them, tests included): the item sub-parts ItemMedia, ItemContent, ItemActions, ItemGroup, ItemSeparator, ItemTitle, ItemDescription, ItemHeader, ItemFooter (with the local itemMediaVariants; Item stays); src/custom/native-select.tsx with NativeSelect and NativeSelectProps; the type alias ResizableHandleProps; the hook useRelatedCount (one doc line that recommended it now points at RelatedCountStore.get under useRelatedCountVersion()). item.tsx is listed under customComponents in shadcn-components.json and native-select.tsx is not listed at all, so pnpm shadcn:update restores neither.
  • @object-ui/components, off the entry only (module files untouched except the deletions above; the shadcn registry files under src/ui/ are not edited):
    • src/ui/index.ts: MenubarMenu, MenubarItem, NavigationMenuItem, InputOTPGroup, InputOTPSeparator, CarouselItem (the batch-6 family heads, per the seat's ruling). input-otp and navigation-menu leave the entry entirely; Menubar, Carousel and CarouselApi stay (see Acceptance notes).
    • src/custom/index.ts: export * over filter-builder, filterRecordCurrency, kbd, navigation-overlay, view-states, mobile-dialog-content becomes named lists, native-select goes, the record-list-face list keeps only ActiveListRecordProvider. Off: mountedOperatorValue, retypeFilterValue, narrowFilterValueToOptions, CURRENCY_COMPANION_SUFFIX, currencyCompanionId, currencyCompanionOf, pairedCurrencyField, KbdGroup, SIDEBAR_WIDTH_FALLBACK, SIDEBAR_WIDTH_ICON_FALLBACK, DataLoadingState, DataLoadingStateProps, isInsidePopperLayer, usePopperAwareInteractOutside, useIsActiveListRecord, useScrollActiveListRecordIntoView, ActiveListRow, listRecordIdOf. Each named list was built from the checker's export list of that module, so no name a module re-exports is lost.
    • src/notifications/index.ts: the severity block goes (NOTIFICATION_ACTION_BUTTON_VARIANTS, NOTIFICATION_POSITION_CLASSES, NOTIFICATION_SEVERITY_STYLES, notificationActionVariant, notificationIcon, notificationSeverityStyle, NotificationSeverityStyle); the four surfaces read it from the module file already.
  • All in-package readers already import these names from their module files (renderers/overlay/menubar.tsx, renderers/basic/navigation-menu.tsx, renderers/form/input-otp.tsx, renderers/complex/carousel.tsx, renderers/complex/data-table.tsx, custom/panel-toggles.tsx, custom/navigation-overlay.tsx, the notification surfaces and the tests), so no import path changes.
  • One test floor re-measured: __tests__/empty-description-props-name-the-element-8571.test.tsx walks every wrapper function under src/custom/ and floors the population at 12; deleting the item parts leaves 11, so the floor is now 8 (still above the seven-member Empty family a broken walk would stop at), with the comment saying why.
  • One new changeset, .changeset/25921-components-helpers-and-family-heads.md: patch level, ! title, BREAKING paragraph that separates the 13 deleted names from the 31 off-entry ones, FROM/TO lines for every retired name, ADR-0087 marker not-required (runtime-export-retired …) naming all 44 operands. No pending 25921-* changeset is edited.

Why

Card #25921 narrows ui/packages barrels to names someone imports. The checker export list after this PR is exactly the base list minus these 44 (408 to 364), nothing added.

Tests

Census on origin/main b309866 with the method of batches 1 to 6 (full per-name table with same-module controls: project file issue-25921-seat6/census-b7.md): entry names from the TypeScript checker (getExportsOfModule on src/index.ts, 408); per name git grep -l -w -F outside the package minus **/CHANGELOG.md, pnpm-lock.yaml, .changeset/** (tests and prose count); the package *.md, docs/, *.json minus its CHANGELOG; keep rule 3 by an identifier walk of the built dist/**/*.d.ts from every kept export (through local declarations and reached candidates, to fixpoint) plus a source read where the d.ts inlines a type; a TS parse of every tracked source and doc file for named imports from @object-ui/components (0 for every retired name); hotcrm 6961ab1 (0 hits for all 44; hotcrm does not import the package, control Select 8 files).

Entry names Zero outside hits README-taught Kept by rule 3 Kept: released migration names them Family heads ruled in (homonym hits) Kept: ADR-0087 gate Retired
408 87 3 41 4 (KanbanSkeleton, FormSkeleton, ListSkeleton, KanbanSkeletonProps) +8 3 (Menubar, Carousel, CarouselApi) 44

Controls (outside hits, same module as retired names): FilterBuilder 63, NavigationOverlay 54, DataEmptyState 30, RelatedCountStore 37, NotificationSnackbar 10, MobileDialogContent 5, Kbd 4, ResizablePanel 5, ActiveListRecordProvider 2, Select 458, Command 215.

Readings at ecad190f (branch head; origin/main has since moved 5 commits, none touching ui/packages/components, and a re-grep of the 44 names there outside the package answers only the six family heads' homonym files the census lists, 0 files for the other 38):

Build, type-check, package tests
  • pnpm --filter '@object-ui/components...' build (the package and its dependency closure) on the base: VERDICT command-exit 0; components rebuilt on the final head (vite build, declarations rebuilt).
  • pnpm --filter @object-ui/components type-check (tsc --noEmit && tsc -p tsconfig.test.json): exit 0.
  • pnpm --filter @object-ui/components test: Test Files 477 passed, 1 skipped (478); Tests 4565 passed, 24 skipped (4589); VERDICT command-exit 0. The first run (at da20801) had 1 red, empty-description-props-name-the-element-8571.test.tsx "finds the population" (expected 11 to be ≥ 12), the consequence of deleting the item parts; re-floored in ecad190, single-file run 7/7 green, then the full run above.
Reverse check over every former entry name

A temporary probe under ui/packages/plugin-view/src importing ALL 408 base entry names of @object-ui/components (as import type), tsc --noEmit -p in ui/packages/plugin-view against the rebuilt dist/index.d.ts: exactly 44 errors in the probe (TS2305 35, TS2724 9), and the set of names they name is identical (diff empty) to the 44 retired names; the other 364 resolve. The run's 3 other errors are unbuilt sibling packages imported by ObjectView.tsx (plugin-grid, plugin-form, permissions), outside the probe. Probe deleted; git status clean.

Gates
  • node scripts/pm/dispatch-gates.mjs --commands: 35 derived families, each run on ecad190 with its exit code captured before any pipe, all exit 0 (pnpm --dir ui exec vitest run scripts/ under the lock: Test Files 170 passed, 2 skipped (172), Tests 4970 passed, 2 skipped; check:type-check-debt after dogfood under the lock: OK, 0 raw tsc errors).
  • check-adr-0087-registration --base origin/main was red on da20801: predicate 2 (no-metadata-surface) refused Menubar and Carousel (Zod describe strings, see Acceptance notes). Both were put back in 76d6484; green since, with all 44 operands verified.
  • dispatch-gates --ran: 35 derived, 35 run, 0 NOT-MEASURED, 0 UNRUN (a derived zero: all 35 recorded an exit code, none 3).
  • node scripts/check-platform-checklist.mjs --changed-from origin/main: exit 0, 0 anchored files in the change set.
Dogfood (narrowing arm)

pnpm --workspace-concurrency=2 --filter '@objectstack/dogfood^...' build && pnpm --filter @objectstack/dogfood test under os-verify-lock on ecad190: VERDICT command-exit 0; Test Files 422 passed, 3 skipped (425); Tests 3527 passed, 41 skipped (3568); no failures.

No ablation: export lines, deleted declarations nothing read, and one population floor re-measured.

Acceptance notes

  • Menubar and Carousel stay on the entry, against the first amendment, and CarouselApi with them (the setApi prop of Carousel names it). check-adr-0087-registration --base origin/main refuses runtime-export-retired for both under predicate 2 (no-metadata-surface): ui/packages/types/src/zod/overlay.zod.ts carries .describe('Menubar menus') and zod/complex.zod.ts carries .describe('Carousel items'), and the gate deliberately counts a string inside a Zod schema as a reference. Retiring them would need an ADR-0087 ledger entry under packages/spec, outside the claim; the seat ruled to keep them (amendment 6674939838) and puts them back on the card's open list.
  • KanbanSkeleton, FormSkeleton, ListSkeleton and KanbanSkeletonProps have zero readers anywhere, but the released ViewSkeleton retirement in ui/packages/components/CHANGELOG.md says the other skeletons "stay exported unchanged" and gives them as its FROM/TO targets; the seat ruled them kept.
  • Item stays: its outside hits are the generic word (346 files, 0 named imports) and cannot be shown hit by hit to be homonyms.
  • The previous components changeset in this series (pending in the release PR) lists MenubarMenu, MenubarItem, NavigationMenuItem, InputOTPGroup, InputOTPSeparator and CarouselItem among the names that stay; this changeset says in its body that they leave now. That changeset is not edited (claim rule).

Verification

Reviewer: git grep -l -w -e ItemMedia -e NativeSelect -e notificationSeverityStyle -- ':!ui/packages/components' ':!**/CHANGELOG.md' answers only this PR's changeset; the CI Type Check UI lane compiles every @object-ui/* consumer against the narrowed entry.


Generated by Claude Code

The @object-ui/components entry stops exporting the menubar,
navigation-menu, input-otp and carousel family heads (every outside hit
is a homonym), the filter-builder, record-currency, record-list-face,
popper-layer and sidebar-width helpers, DataLoadingState, KbdGroup and
the notifications/severity module. The item parts, NativeSelect,
ResizableHandleProps and useRelatedCount had no reader in the package
either and are deleted. shadcn registry files under src/ui are untouched.

Claude-Session: https://claude.ai/code/session_01L6bhgWd23yaWptSYazSPUo
Co-authored-by: Claude <noreply@anthropic.com>
A Zod schema's describe text names both, so the ADR-0087
runtime-export-retired disposition cannot claim them.

Claude-Session: https://claude.ai/code/session_01L6bhgWd23yaWptSYazSPUo
Co-authored-by: Claude <noreply@anthropic.com>
@github-actions github-actions Bot added size/m documentation Improvements or additions to documentation tooling Fix lands in tooling, not a product package — enters pm:queue only with Unblocks: or a named surface labels Nov 6, 2026
@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

domain:ui#1 · os-sales · session_01L6bhgWn6zhNa4LL7VB1rtL

Contract-review-claim: session_01L6bhgWn6zhNa4LL7VB1rtL · head ecad190 · 2026-11-06T03:22Z

@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

domain:ui#1 · os-sales · session_01L6bhgWn6zhNa4LL7VB1rtL

Contract review

Served-tier: CONTRACT_REVIEW_TIER
Head-sha: ecad190f81f927702ed53f12ed000d18bbe48c7a
Local-runs: none
Scope: ui/packages/components/src/index.ts, ui/packages/components/src/ui/index.ts, ui/packages/components/src/custom/index.ts, ui/packages/components/src/notifications/index.ts, ui/packages/components/src/custom/item.tsx, ui/packages/components/src/custom/native-select.tsx (deleted), ui/packages/components/src/custom/resizable.tsx, ui/packages/components/src/hooks/related-count-store.ts, ui/packages/components/src/tests/empty-description-props-name-the-element-8571.test.tsx + ui/packages/components/package.json (exports), ui/packages/components/shadcn-components.json, ui/packages/components/src/custom/{filter-builder,filterRecordCurrency,kbd,navigation-overlay,view-states,mobile-dialog-content,record-list-face}.tsx, ui/packages/components/src/notifications/severity.ts, ui/packages/components/src/renderers/complex/data-table.tsx, ui/packages/types/src/{overlay,navigation,complex}.ts and src/zod/{overlay,complex,navigation}.zod.ts, ui/examples/schema-catalog/test/{input-otp-separator-11365.test.tsx,component-fixture-declared-keys.test.ts}, .changeset/25921-components-zero-consumer-exports.md (read for the batch-6 "stays" list), scripts/check-adr-0087-registration.mjs (read for predicates 1-3 of runtime-export-retired). Inputs: card #25921 body and all 100 comments (claim 6674577823, amendments 6674785161 and 6674939838, batch-6 Release 6674253508, dev report 6675848357), PR #30791 body and file list, git diff origin/main...ecad190f (origin/main read at 561d532), check-runs on the head.

① Derived judgments

Accept-set / public-surface changes the diff implies, each judged on the tree:

  1. @object-ui/components root entry (.) loses exactly 44 names — RIGHT. Counted from the hunks: src/ui/index.ts 6 (MenubarMenu, MenubarItem, NavigationMenuItem, InputOTPGroup, InputOTPSeparator, CarouselItem); src/custom/index.ts 30 (filter-builder 3, filterRecordCurrency 4, KbdGroup, NativeSelect + NativeSelectProps, the two SIDEBAR_WIDTH_* fallbacks, record-list-face 4, DataLoadingState + DataLoadingStateProps, mobile-dialog-content 2, the 9 Item* parts via the trimmed module, ResizableHandleProps via the trimmed module); src/notifications/index.ts 7; src/index.ts 1 (useRelatedCount). The package exports map at the head is . and ./style.css only, so no sub-path entry re-exposes any of them; src/index.ts's other star exports (./dev, ./share) re-export none (grep of all 44 over src/ for export lines outside the declaring modules: none).
  2. The seven export * → named-list rewrites lose no kept name — RIGHT. Each module's ^export set on the head was compared with its new list: filter-builder 18 exports = 15 listed + 3 retired; filterRecordCurrency 7 = 3 + 4; kbd 2 = 1 + 1; navigation-overlay 7 = 5 + 2; view-states 8 (incl. the EmptyState/EmptyStateProps aliases) = 6 + 2; mobile-dialog-content 4 = 2 + 2; record-list-face 5 = 1 + 4. item and resizable stay export *, correct because the modules themselves now export only Item and the three Resizable* components.
  3. The 13 deletions are dead inside the package — RIGHT. git grep -w on the head over ui/packages/components for the nine Item* parts, itemMediaVariants, NativeSelect, NativeSelectProps, native-select, ResizableHandleProps, useRelatedCount: hits only in the release-owned CHANGELOG.md (two prose lines). item.tsx after the cut still uses every import it keeps (SlotPrimitive, cva/VariantProps, cn); related-count-store.ts still uses useSyncExternalStore in useRelatedCountVersion. item is listed under customComponents in shadcn-components.json and native-select is listed nowhere, so no sync restores them.
  4. No consumer is left outside the package — RIGHT for 38 names (zero hits repo-wide on the head excluding CHANGELOG.md, the lockfile and .changeset/: ui/packages/*, ui/apps/*, ui/examples/*, apps/*, packages/*, examples/*, content/docs, skills/, ADR anchors, every generated registry). For the six family heads every hit was read: ui/packages/types/src/overlay.ts:1282 (interface MenubarMenu), navigation.ts:579 (interface NavigationMenuItem), complex.ts:805 and index.ts:408 (interface CarouselItem), zod/navigation.zod.ts:22 (imports the types interface from ../navigation.js), zod/complex.zod.ts:731 (a comment), zod-mirror-parity.test.ts:1010,1020 (imports the types interfaces), component-fixture-declared-keys.test.ts:411 and input-otp-separator-11365.test.tsx:20,61,73 (prose; the latter imports @object-ui/components for its side effect only). None imports these components. In-package readers all import from the module files (renderers/complex/data-table.tsx:16 from ../../custom/record-list-face, the notification test from ../severity, etc.); no in-package import goes through a barrel or the package name.
  5. The ADR-0087 marker names exactly the removed set — RIGHT: the 44 @object-ui/components#Name operands sorted equal the 44 names read off the hunks (diff empty), and every one of the 44 appears backticked on a - FROM … TO … line (predicate 3's shape). Predicate 2 read against the gate's own rule: none of the 44 is declared in a *.zod.ts, none is a Zod projection, and the only metadata-surface mentions are the types-package homonyms imported from their own declaring module, which the gate's metadataSurfaceReference excludes by design; the .describe('Menubar menus') / .describe('Carousel items') strings that refused Menubar and Carousel do not contain the retired names as words.
  6. The population floor in empty-description-props-name-the-element-8571.test.tsx stays a real guard — RIGHT. The head's src/custom/ still holds ~11 judged members (ButtonGroup, ButtonGroupText, the seven Empty*, Kbd, KbdGroup, Spinner, minus the dynamic-root ones); the floor 8 is above the seven-member Empty family, so a walk that reaches only empty.tsx still fails, and the companion toEqual(LEDGER) assertion remains the strict half. The main-tree population was ~19 against a floor of 12; the margin shrank from 7 to 3 but the guard's stated purpose holds.
  7. Kept names, each with a sound reason on the tree: Menubar, Carousel (predicate-2 describe strings, amendment 6674939838) and CarouselApi (named by Carousel's setApi prop); KanbanSkeleton/FormSkeleton/ListSkeleton/KanbanSkeletonProps (the released ViewSkeleton migration names them as TO targets); Item (generic-word hits); Pagination (seat ruling, 6674253508).

② Semver level

.changeset/25921-components-helpers-and-family-heads.md: '@object-ui/components': patch, ! title, BREAKING paragraph, Clause-②: no (narrowing) and Metadata-protocol: none on both the changeset and the PR body — matches what the diff publishes: no spec or metadata-protocol change, a breaking narrowing of a published runtime entry, which under Post-Task Checklist step 3 ships patch with its BREAKING banner and ADR-0087 disposition. The disposition is one marker, not-required (runtime-export-retired …), naming the 44 operands. No pending 25921-* changeset is edited (claim rule). Clause-②: no (narrowing) is the right arm.

③ Boundary flags

  • Dev flag: Menubar, Carousel, CarouselApi stay against amendment 1 — answered by amendment 2 (6674939838); the tree matches it (src/ui/index.ts:38,85).
  • Dev flag: the four skeleton names and Item stay — answered by amendment 1 (Q2, Q3); the tree keeps them.
  • Dev flag: the pending batch-6 changeset (25921-components-zero-consumer-exports.md:32) says the six family heads "stay exported unchanged" and this changeset says they leave; both compile into the same CHANGELOG release. Accepted as ruled: editing a pending 25921-* changeset is barred by the claim, and this changeset's second paragraph names the earlier statement and supersedes it, so a reader who greps a head lands on the explanation. Not a fix.
  • open_questions: empty. security_findings: none. The two out_of_scope_findings (the three kept heads back on the card's open list; stray container-root files) touch no path of this PR.
  • Noted, not a finding: ui/packages/components/CHANGELOG.md:1833 (released, release-owned) cites the compiler's "Did you mean 'ItemGroup'?" hint as a landmark; with ItemGroup gone the hint text will differ. Release-owned text is never edited in a code PR; recorded here only.

④ Design judgment

The narrowing read against the published surface on main: the spec declares no capability through these names. No packages/spec schema, no ui/packages/types schema, no registered node type and no renderer reaches any of the 44 from the entry — the menubar, navigation-menu, input-otp, carousel and data-table renderers, the filter builder, the notification surfaces and MobileDialogContent keep their module-file imports, so every declared schema node renders as before and nothing a metadata author can write is refused or changed. The deletions remove declared-but-undelivered surface (nothing read them), which is the retire arm of Prime Directive #10, not a consumer-side narrowing of a declared capability. Attempts to break it: a sub-path entry (none exists), a barrel re-export through ./dev/./share (none), a generated registry or shadcn sync that re-materialises a deleted file (item sits under customComponents, native-select is unlisted), a kept export whose signature names a retired type (ActiveListRow, NotificationSeverityStyle, DataLoadingStateProps are referenced only inside their own modules and by the data-table's value import), a homonym that is really an import (none of the twelve hits is). Every FROM → TO line was checked against the live module: KbdGroup's classes are inline-flex items-center gap-1 (kbd.tsx:31), the sidebar fallbacks are 16rem/3rem (navigation-overlay.tsx:330-331), DataLoadingStateProps is ComponentProps<"div"> plus message? (view-states.tsx:19-22), NativeSelectProps extended SelectHTMLAttributes<HTMLSelectElement> with no key, MobileDialogContent calls usePopperAwareInteractOutside itself (mobile-dialog-content.tsx:125), RelatedCountStore.get is getCount(objectName, relField, parentId, filter?) (related-count-store.ts:166-173).

Findings:

  • should-fix (non-blocking, prose): the useRelatedCount TO line says "the same four arguments", but the deleted hook accepted objectName: string | undefined and answered undefined for it, whereas RelatedCountStore.get requires objectName: string (related-count-store.ts:167); a host that passed an optional object name needs a guard, which the prescription does not say. A later docs-only touch of the changeset, before it is consumed, would close it.
  • No must-fix.

Check-runs on the head (read after every run completed): 55 check-runs, 44 success, 11 skipped (path-filtered core lanes: Build Core, Test Core shards, Build Docs, Dogfood Verify CLI, Temporal Conformance, the opt-in harnesses), 0 red. All ten required contexts green: Lint & Repo Gates, TypeScript Type Check, Test Core, Build Core (aggregate), Governed Surface Queue Guard, Lint UI, Type Check UI, Test UI (16/16 shards), Build & E2E UI, Live E2E UI; Check Changeset, Check PR Size, PR-body guards and Lint · repo & tooling gates (which carries check:adr-0087-registration) green too.

Implemented-by: claude/project-thread-q0aqk6
Reviewed-by: session_01L6bhgWn6zhNa4LL7VB1rtL

VERDICT: PASS

@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

domain:ui#1 · os-sales · session_01L6bhgWn6zhNa4LL7VB1rtL

Regen-provenance: 6676114298 · ecad190f81f927702ed53f12ed000d18bbe48c7a → e1178e90a8f315674cac7321fd63c8d064107771 · git diff --name-only ecad190f e1178e90 -- . ':!.changeset/' → (empty)

The hop is prose-only: one line of .changeset/25921-components-helpers-and-family-heads.md (the useRelatedCount FROM → TO now says to guard an absent object name, since RelatedCountStore.get takes objectName: string). That closes the record's one should-fix; nothing the review judged moved.

@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

domain:ui#1 · os-sales · session_01L6bhgWn6zhNa4LL7VB1rtL

维护者速读

席位核对 — ACCEPT · head e1178e9

  • 形态:10 个文件,+114/−232(3 个入口具名列表、删 native-select.tsx、裁 item.tsx / resizable.tsx / related-count-store.ts、改一个人口下限测试、一份 changeset)。check-governed-merges --pr 30791:不在受管面,≤ 3000 行。Part of #25921,目标 main。批次与认领 6674577823 及修订 6674785161、6674939838(47 → 44)一致。
  • 契约(收窄,契约复审档):Clause-②: no (narrowing),Metadata-protocol: none,@object-ui/components patch,带 ! 标题、BREAKING 段、每个名字一条 FROM → TO,以及 ADR-0087 runtime-export-retired 标记(44 个操作数,每个有自己的反引号 FROM 行)。CONTRACT_REVIEW_TIER 复审 6676114298 在 ecad190f 上 PASS,无必改项。唯一的应改项(useRelatedCount 的迁移句没说要判空)已由只改 changeset 一行的提交 e1178e90 修掉。这一跳只动散文面,Regen-provenance 6676164181 把记录续到现 head(git diff --name-only 排除 .changeset/ 后为空)。
  • 席位自己核对:读了新 head 上的 changeset 改动:RelatedCountStore.get(related-count-store.ts:166-173)确实要求 objectName: string,被删的 hook 在名字为空时返回 undefined,补的判空写法与之对应。复审逐项核了:入口正好少 44 个名字;7 处具名列表没有漏掉保留的导出;13 个删除项包内无读者;包 exports 只有 . 和 ./style.css;38 个非族首名字全仓 0 引用;6 个族首的 12 处命中都是 types 包里的同名接口或散文;人口下限从 12 改 8 后仍高于 Empty 族的 7 个成员,还是一道真防线。
  • 前提实测:dev 报告 6675848357(status done,在 ecad190f 上)。components 测试 477 个文件全过(1 跳过);反向探针导入全部 408 个旧入口名,恰好 44 个报错,名单与退役集一致。派生门禁 35/35 exit 0,--ran 0 NOT-MEASURED。完整 dogfood(收窄必跑):425 个文件中 422 过、3 跳过,0 失败。e1178e90 上 dev 另跑了 check-adr-0087-registration --base origin/main、check-changeset-no-major、check-empty-changeset,都 exit 0。
  • 门禁 check-runs:e1178e90 上 55 个,44 success,11 skipped(ui-only diff 按路径跳过的 core 车道),0 红;Type Check UI、Lint UI、Test UI 16 片、Build & E2E UI、Live E2E UI、Lint & Repo Gates(含 ADR-0087 登记检查)都绿。mergeable_state clean。
  • 接受的偏差:① 人口下限测试从 12 降到 8,原因写在测试注释里(删了 item 子部件),复审判它仍有效。② 待发布的第 6 批 changeset 说这 6 个族首「保留」,本 changeset 第二段点名并取代那句话;按认领规则不改待发布的 25921-* changeset。③ 已发布的 CHANGELOG.md:1833 引用了编译器提示 "Did you mean 'ItemGroup'?",ItemGroup 删掉后提示文字会变;已发布文本归发版流程管,代码 PR 不改。
  • 范围外:Menubar、Carousel、CarouselApi(Zod 描述字符串引用,需 ADR-0087 登记或裁定字符串规则)、四个 skeleton 名、Item、Pagination 留在入口,回 retire the zero-consumer surface: nine dead modules (2,211 LOC), plugin-ai, runner's publish flag, test-only reset helpers on public barrels, the providers trio, 122 dead i18n keys, root orphans #25921 待后续批次。
  • 落地条款:中继 pr_ready + automerge_enable。合并后在 retire the zero-consumer surface: nine dead modules (2,211 LOC), plugin-ai, runner's publish flag, test-only reset helpers on public barrels, the providers trio, 122 dead i18n keys, root orphans #25921 写落地记录和 Release(Part of,卡不关),摘 pm:dispatched,回 pm:queue,清 assignee。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentation Improvements or additions to documentation size/m tooling Fix lands in tooling, not a product package — enters pm:queue only with Unblocks: or a named surface

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant