Skip to content

refactor(components)!: retire ten zero-consumer shadcn sub-part entry exports - #31318

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

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

Conversation

@objectstack-fleet

Copy link
Copy Markdown
Contributor

Requested by Leehom · project thread

Part of #25921

Clause-②: no (narrowing)
Metadata-protocol: none
Skills-docs: none (none of the ten names appears under skills/** or content/docs/**)

维护者速读

What changes

Batch 14 as named in the seat's amendment 6714859776 on claim 6714776657 (census /mnt/project-files/pm-orders/ui/25921-b14-census.md, origin/main 7c523aa1, hotcrm 6961ab13).

  • ui/packages/components/src/ui/index.ts (the unpublished sub-barrel that src/index.ts star-exports): the export * lines for ./dialog, ./dropdown-menu, ./sheet and ./sidebar become named lists without the ten names. The four shadcn module files are unchanged (No-Touch, ui AGENTS Remove explicit pnpm version from workflows to fix version conflict #7); no module is deleted.
  • Changeset .changeset/25921-components-shadcn-subparts.md: ! patch, BREAKING, FROM/TO for each name, runtime-export-retired ×10 (FROM spans 1:1), both declaration lines.

Every other name of the four modules stays exported, among them DialogContent, SheetOverlay, SheetContent, every other DropdownMenu* part, SidebarMenuAction, useSidebar and useOptionalSidebar. DrawerClose stays too (seat ruling in 6714859776).

Tests

  • Census per name (git grep -lw on origin/main outside ui/packages/components): every hit is in ui/scripts/__tests__/fixtures/shadcn-registry/{dialog,dropdown-menu,sheet,sidebar}.registry.txt, the upstream snapshots that declare their own copies. DialogPortal also hits a comment in ui/e2e/console-boot-indicator.spec.ts that names Radix's own part. hotcrm 0 for all ten. Positive controls, same command (files): DialogContent 67, SheetContent 29, DropdownMenuItem 87, SidebarMenuButton 14.
  • In-package readers: only src/custom/mobile-dialog-content.tsx reads DialogPortal and DialogOverlay, and it imports them from ../ui/dialog, not through the sub-barrel.
  • Reverse probe of the entry (TypeScript checker export list of src/index.ts): 364 names before, 354 after; exactly these ten gone, none added. Built dist/index.js imported at runtime: none of the ten is a key; the controls DialogContent, SheetContent, DropdownMenuItem, SidebarMenuButton and DrawerClose are.
  • pnpm --dir ui exec vitest run --maxWorkers=2 packages/components/ → Test Files 477 passed | 1 skipped (478), Tests 4573 passed | 24 skipped. pnpm --filter @object-ui/components run type-check → exit 0.
  • No test was added or removed, and there is no ablation: this only stops re-exporting ten names and changes no tested behaviour.

Acceptance notes

  • Left on the card: DrawerClose (its outside hits are JSX text in an eslint rule comment and its RuleTester fixture; seat ruling 6714859776), MobileDialogContentProps (a custom/ Props type with zero hits, not the shadcn family), and the census's other notes (plugin-timeline primitives and fields' index.tsx values need a module move; react's LazyPluginLoader trio is taught by name in content/docs/frontend/* and skills/objectui/guides/page-builder.md).

Verification

Derived gates on HEAD 254394d (30/30, all exit 0, --ran reconciled)

node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack --ran → "30 derived famil(ies) accounted for — 30 run, 0 NOT-MEASURED".

  • node scripts/check-adr-0087-registration.mjs --base origin/main exit 0: all ten verified … (export, ui/packages/components/src/ui/…); --self-test exit 0
  • node scripts/check-changeset-no-major.mjs --base origin/main exit 0
  • node scripts/check-empty-changeset.mjs --base origin/main exit 0; --self-test exit 0
  • node scripts/check-closing-keyword-parity.mjs exit 0; --self-test exit 0
  • node scripts/check-comment-mask-corpus.mjs, check-sdui-manifest.mjs (+ --self-test), ci/snapshot-next.mjs --self-test, pm/release-rehearsal-clone.mjs --self-test, release-pending-publish.mjs --self-test: exit 0
  • pnpm --dir ui exec vitest run scripts/ → Test Files 170 passed | 2 skipped (172), Tests 4996 passed
  • pnpm --filter @objectstack/spec run check:duration-unit-keys, pnpm check:changeset-gate-self-tests, check:closed-ceremony-text, check:dispatcher-error-vocabulary, check:driver-memory-census, check:gitlink-declared, check:nul-bytes, check:published-files, check:refd-timer-probe, check:registry-log-declared, check:rest-log-spy-declared, check:skill-identifier-liveness, check:test-source-alias, check:tier-file-adoption, check:undeclared-dep-imports, check:watch-hint-literal: exit 0

Outside the derivation: pnpm check:changeset-fixed exit 0; node scripts/check-platform-checklist.mjs --changed-from origin/main exit 0 (no anchored file); pnpm check:published-readme-exports exit 3, NOT MEASURED (31 unrelated packages unbuilt locally; CI runs it).

Full dogfood battery on HEAD 254394d

bash scripts/pm/os-verify-lock.sh -c "pnpm --workspace-concurrency=2 --filter '@objectstack/dogfood^...' build && pnpm --filter @objectstack/dogfood test" → os-verify-lock: VERDICT command-exit 0 (held 33m38s) · Test Files 435 passed | 3 skipped (438) · Tests 3610 passed | 41 skipped (3651) · no failure.


Generated by Claude Code

🤖 Generated with Claude Code

https://claude.ai/code/session_01FEkQ5mTpxApu2S7hHNSreS

The dialog, dropdown-menu, sheet and sidebar lines of the unpublished
src/ui/index.ts sub-barrel become named lists without DialogPortal,
DialogOverlay, DialogClose, DropdownMenuPortal, SheetPortal, SheetClose,
SidebarSeparator, SidebarGroupAction, SidebarMenuBadge and
SidebarMenuSkeleton. The shadcn module files are unchanged.

Co-Authored-By: Claude <noreply@anthropic.com>
@github-actions github-actions Bot added the size/s label Nov 8, 2026
@github-actions github-actions Bot added 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 8, 2026
@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

domain:ui#1 · os-project-manager · session_01FEkQ5nLA7wiVY5YWjT9Svr

Contract review

Served-tier: CONTRACT_REVIEW_TIER
Head-sha: 254394d46f57cf3989c169d107c5d1f6d04061bb
Local-runs: none
Scope: ui/packages/components/src/ui/index.ts + ui/packages/components/src/ui/dialog.tsx, ui/packages/components/src/ui/dropdown-menu.tsx, ui/packages/components/src/ui/sheet.tsx, ui/packages/components/src/ui/sidebar.tsx, ui/packages/components/src/custom/mobile-dialog-content.tsx, ui/packages/components/src/index.ts

Rendered 2026-11-08T01:23Z on card #25921 (batch 14: claim 6714776657, amendment 6714859776), face narrowing. Inputs: the card body and all 133 comments, PR #31318's body, file list and net diff against main (merge-base 7c523aa1, origin/main 57675a21 at review time), and the head's check-runs. Nothing from the dispatch order was read.

① Derived judgments

  • Accept set. The diff changes one code file, the unpublished sub-barrel ui/packages/components/src/ui/index.ts, which src/index.ts star-exports as the whole shadcn layer (export * from './ui'). Four export * lines (./dialog, ./dropdown-menu, ./sheet, ./sidebar) become named lists. Judged right: the published entry of @object-ui/components (exports["."], the only JS subpath besides ./style.css) stops naming exactly ten values; nothing else in the accept set moves.
  • Exactly ten, none else. Read against the four module files on origin/main (byte-identical to the merge-base, blobs 90d770ad, 233df367, a81015bc, 15cca610): the module export blocks minus the head's named lists are precisely DialogClose, DialogOverlay, DialogPortal; DropdownMenuPortal; SheetClose, SheetPortal; SidebarGroupAction, SidebarMenuBadge, SidebarMenuSkeleton, SidebarSeparator. No phantom name (a name in a list that the module does not export) and no unintended drop; the four modules declare no export type/export const/export * outside their export block, so no type leaves by accident. Judged right.
  • Consumer census, re-run by the reviewer. git grep -w per name on origin/main 57675a21 over the whole tree: every hit outside ui/packages/components/src/ui/*.tsx is one of (a) the upstream snapshots ui/scripts/__tests__/fixtures/shadcn-registry/{dialog,dropdown-menu,sheet,sidebar}.registry.txt, which declare their own copies; (b) for DialogPortal, a comment in ui/e2e/console-boot-indicator.spec.ts that reads "A Radix DialogPortal" (prose about Radix, no import); (c) for DialogPortal and DialogOverlay, src/custom/mobile-dialog-content.tsx, whose import reads from '../ui/dialog', the module path, not the sub-barrel. Every in-package import that goes through the sub-barrel (from '../ui', '../../ui', '../../../ui': SidebarProvider, DropdownMenu* trigger/content, Button, Tooltip*, Popover* and the rest) names none of the ten. No package re-exports @object-ui/components wholesale (export * from '@object-ui/components' has zero hits), so no second barrel carries the ten onward. Judged right.
  • hotcrm. origin/main 6961ab13 (the census's own rev): zero hits for all ten. Noted, not a finding: hotcrm has zero imports of @object-ui/components at all, so its zero is vacuous rather than a positive control; the in-repo Console is the only live consumer measured.
  • No baseline or generated surface goes stale. No api-surface/export-origins snapshot exists under ui/; the gate check-unreferenced-sources.test.ts reads the sub-barrel only for from './toast' / from './sonner'; check-governed-queue-guard.mjs names packages/spec/src/ui/index.ts, a different file; the components README names none of the ten (check:published-readme-exports therefore has nothing to disagree with); ui/scripts/shadcn-sync.js never writes index.ts, so pnpm shadcn:update cannot re-widen the entry. Judged right.
  • Check-runs on the head at 2026-11-08T01:21Z: 53 runs, 21 success, 11 skipped, 21 in progress, 0 failure. Green already: Check Changeset, PR-body guards, Governed Surface Queue Guard, Dogfood Regression Gate, Type Check · workspace, Type Check · debt ledger, Test Core, Build UI Deps. Still running: Type Check UI, Type Check · consumer gates, Type Check · source gates, Lint UI, Lint · PM dispatch-gates, the 16 Test UI shards, Build & E2E UI, Live E2E UI. Type Check · consumer gates is the one that would contradict the census above (a Console import of a retired name through the entry); the reviewer's grep found no such import, so the verdict does not wait on it.

② Semver level

  • Changeset .changeset/25921-components-shadcn-subparts.md: '@object-ui/components': patch, title refactor(components)!: …, a BREAKING paragraph, both line-initial declarations (Clause-②: no (narrowing), Metadata-protocol: none), one ADR-0087 marker not-required (runtime-export-retired …) naming all ten operands as @object-ui/components#Name, and a FROM/TO block whose FROM spans cover exactly the ten (grouped lines, each operand its own code span, the shape readFromBlock reads; no vertical pair, no table, no bare placeholder). Matches the rule in AGENTS.md Post-Task step 3: a non-protocol change, breaking, ships patch and keeps its BREAKING banner and ADR-0087 disposition; it matches the merged batch-6 precedent .changeset/25921-components-zero-consumer-exports.md line for line in shape. Judged right.
  • Clause-②: no (narrowing) on both the PR body and the changeset body, line-initial. Right: an export leaves the published entry; no author-writable spec surface changes (Metadata-protocol: none is right, since none of the ten is a schema node type, key or value; the node types dialog, sheet, dropdown-menu, sidebar keep rendering through in-package module imports).
  • Migration prescriptions, read against the code they cite: DialogContent does mount DialogPortal and DialogOverlay and draws a DialogPrimitive.Close button; SheetContent mounts SheetPortal, SheetOverlay (behind hideOverlay) and a SheetPrimitive.Close, and SheetPrimitive is @radix-ui/react-dialog, so "the Close part of @radix-ui/react-dialog" is the right package for both; DropdownMenuContent wraps DropdownMenuPrimitive.Portal itself; Separator, Skeleton (both still export *) and SidebarMenuAction stay on the entry. Every TO is true in the tree.

③ Boundary flags

④ Design judgment

Narrowing read against the published spec on main. The declared capability of @object-ui/components (README: "A complete set of UI components, Shadcn's plus custom ones"; content/docs/** and skills/** name none of the ten) is the primitive family, not every Radix wrapper part; the entry keeps Dialog/DialogTrigger/DialogContent and its header, footer, title and description, the full DropdownMenu family minus Portal, Sheet with SheetOverlay/SheetContent, and the Sidebar provider, hooks and every structural part except four decorative ones. Each retired name is a part its kept sibling already mounts (Portal, Overlay, Close inside *Content) or a part whose replacement stays exported (Separator, SidebarMenuAction, Skeleton). The narrowing therefore takes nothing away that any consumer in either repo exercises and leaves no declared capability undeliverable: no implementation gap is being papered over at the consumer, and no spec refusal becomes real, since no schema surface names these parts. Attempts to break it: (i) a consumer composing a custom dialog from DialogPortal + DialogOverlay + DialogPrimitive.Content loses the entry route, but none exists in the tree, hotcrm or the docs, the changeset prescribes the Radix route, and the package declares @radix-ui/react-dialog and @radix-ui/react-dropdown-menu as dependencies; (ii) an in-package reader through the sub-barrel would break the build, but every such reader names kept parts only, and the one reader of two retired parts imports from the module path; (iii) the shadcn sync could re-widen the barrel, but the sync script does not write index.ts; (iv) a sub-menu host needing DropdownMenuPortal around DropdownMenuSubContent is told the Radix Portal part, which is what the retired name was (DropdownMenuPrimitive.Portal, a bare alias). No must-fix, no should-fix.

Implemented-by: claude/project-thread-cnk5a9
Reviewed-by: session_01FEkQ5nLA7wiVY5YWjT9Svr

VERDICT: PASS

@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

domain:ui#1 · os-project-manager · session_01FEkQ5nLA7wiVY5YWjT9Svr

席位核对 · ACCEPT · 2026-11-08T01:35Z · head 254394d46f57cf3989c169d107c5d1f6d04061bb

Seat domain:ui#1 reviewed the diff of its own dispatch (claim 6714776657 on #25921, batch 14, amendment 6714859776, card thread session_01FEkQ5mTpxApu2S7hHNSreS, report 6715517592). Read against GitHub, not the report.

  1. Shape: 2 files, +88 / -4. In the unpublished sub-barrel ui/packages/components/src/ui/index.ts, the export * lines for dialog, dropdown-menu, sheet and sidebar become named lists without ten shadcn sub-parts: DialogPortal, DialogOverlay, DialogClose, DropdownMenuPortal, SheetPortal, SheetClose, SidebarSeparator, SidebarGroupAction, SidebarMenuBadge, SidebarMenuSkeleton. The shadcn module files are untouched. One ! patch changeset, .changeset/25921-components-shadcn-subparts.md. Body says Part of #25921; no closing keyword.
  2. Premise: every outside hit for the ten is a shadcn-registry snapshot declaring its own copy, one prose comment about Radix, or custom/mobile-dialog-content.tsx, which imports from ../ui/dialog (the module path). The contract review re-measured this on 57675a21.
  3. Gates / check-runs: 55 runs on this head, 44 success, 11 skipped, 0 red. Dev: 30/30 derived gates exit 0, entry probe 364 → 354, components 477 test files, full dogfood battery VERDICT 0 on this head. mergeable_state clean.
  4. Accepted deviations / notes: the extra check:published-readme-exports run was NOT MEASURED locally (31 unrelated packages unbuilt); CI answered it on this head. DrawerClose stays exported by the amendment's ruling.
  5. Contract review: Clause-②: no (narrowing), so CONTRACT_REVIEW_TIER was owed: PASS on this same head, 6715579355, with no must-fix and no should-fix.
  6. Landing: check-governed-merges --pr 31318: not governed, 92 changed lines, so no human approval owed. Landing on the maintainer's standing words 「按照 pm-dispatch 规则复核过的都授权」 (2026-10-25T11:35Z) and 「你应该使用 pm-dispatch 技能审核和落地pr」 (2026-11-07T16:59Z). Relay pr_ready + automerge_enable now. The two batches touch disjoint files. 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 stays open (Part of).

@objectstack-fleet
objectstack-fleet Bot marked this pull request as ready for review November 8, 2026 01:37
@objectstack-fleet
objectstack-fleet Bot added this pull request to the merge queue Nov 8, 2026
Merged via the queue into main with commit 85d9264 Nov 8, 2026
56 checks passed
@objectstack-fleet
objectstack-fleet Bot deleted the claude/project-thread-cnk5a9 branch November 8, 2026 02:05
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/s 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