Repository navigation
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
Description
Ruled (plugin-ai): 6398569691 · letter A · 2026-10-25T13:58:53Z (retire @object-ui/plugin-ai: package, locale ai.* block, fixed-group entry, types/zod mirrors tombstoned; minor changeset with a breaking note)
维护者速读
一批每项都是 S、合起来可观的退役:9 个整文件模块共 2,211 行只有自己的 barrel 引用;@object-ui/plugin-ai 发布着却没有任何加载者(console 的 register-plugins.ts 不含它);runner 是无入口的 Vite 应用却 private: false 且在 fixed 发版组;公共 barrel 上有 9 个 reset*ForTesting 类助手;@object-ui/providers 与 @object-ui/react 同名的 provider 三件套只有一个示例在用;check-i18n-dead-keys 报告 122 个 CONFIRMED 死键(×10 语种);根目录若干孤儿。按 objectui#11608→#11616(PartialSchema)先例逐包一个 ! changeset。不加新门禁。
Measured (2026-10-24, HEAD 7981384; every absence claim ran with a positive control, SchemaRenderer 1,030 hits / plugin-map 144 files)
- Whole modules with zero consumers outside the package AND zero in-package importers (only the barrel line):
core/src/builder/schema-builder.ts451 LOC,core/src/protocols/DndProtocol.ts237,KeyboardProtocol.ts222,SharingProtocol.ts212 (their names appear only inside comments intypes/src/index.ts),react/src/hooks/useFocusManagement.ts248,useFocusTrap.ts138,usePageTransition.ts187,useSchemaPersistence.ts373,collaboration/src/LiveCursors.tsx143 — total 2,211 LOC. Repo-wide barrel census: 1,422 of 3,578 exported names have zero non-test code consumers outside their package (636 value exports, 402 of those also undocumented); worst ratios plugin-gantt 22/35, plugin-designer 16/38, collaboration 19/40, mobile 18/51. @object-ui/plugin-ai(736 LOC; registersai-form-assist,ai-recommendations,nl-query): 0 source importers; absent fromapps/console/src/register-plugins.tsandapps/console/vite.config.ts; owns anai.*block in every locale pack (26 lines inen.ts); listed in.changeset/config.json's fixed group.packages/runner: a Vite app (main.tsx,App.tsx, no barrel),private: false, nomain/exports, in the fixed release group;packages/cli/src/__tests__/workspace-vite.test.tsasserts it is not aliased.- Test-only helpers on public barrels with 0 non-test consumers:
resetColumnIdentityWarnings,resetRetiredSortSpellingReports,resetActionKeyWarnings,resetDashboardFilterWarnings,resetReferenceKeyWarnings(core),resetRuntimeConfigForTesting(app-shell),resetInflightGetsForTesting(types),__clearRecordEditableCache(plugin-detail),clearSharedDiscoveryCache(data-objectstack). @object-ui/providersexportsDataSourceProvider,MetadataProvider,ThemeProvider(+hooks), the same six names@object-ui/reactexports with different implementations; the providers trio's only non-test importer isexamples/byo-backend-console/src/App.tsx(react's: 21 files);one-authority-per-exported-name-6273.test.tscarries hand-written exemptions for the collision. Its real content isUploadProvider(450 of 617 LOC; fields 11 sites) andcreateObjectStackUploadAdapter— fetch logic outsidedata-*, against AGENTS §3.node scripts/check-i18n-dead-keys.mjsprints "391 candidate(s) … 122 CONFIRMED (no textual footprint anywhere else in the repo either), 269 NEEDS-REVIEW" (e.g.appDesigner.*20 keys,preview.changes.typeCount.*22); the script is wired to no workflow.- Root / config orphans:
scripts/eval-console.mjs(hard-coded/Users/zhuangjianguo/.copilot/...output path) andscripts/release-bump.cjsreferenced by nothing;paseo.json(0 references; itssetupteachespnpm iagainst the frozen-lockfile rule);typedoc.json+typedocdevDep +docs:api(no workflow);lazy-test.mjs(only an exemption glob incheck-lint-rule-coverage.mjs);playwright.import-harness.config.tsandplaywright.import-console.config.ts(1 spec each, no workflow);mswdeclared in root, plugin-form, plugin-grid with 0 imports pluspublic/mockServiceWorker.js;apps/consoledevDeps@dnd-kit/core|sortable|utilitiesandautoprefixerwith 0 references;docs/CONSOLE-STREAMLINING-SUMMARY.mdnames two packages that do not exist (@object-ui/routing,@object-ui/console-components).
Recommendation (each S; one PR per package or group)
- Delete the nine modules and their barrel lines (one
!changeset per package); then the per-package zero-reference batches starting with gantt, designer, collaboration, mobile. -
plugin-ai:maintainer decision — retire (package, locale block, fixed-group entry) or wire it inRuled A (6398569691): retire the package, the locale block and the fixed-group entry; tombstone the types/zod mirrors.register-plugins.tslikeplugin-markdown. -
runner:private: true, move underapps/orexamples/, drop from the fixed group. - Move the nine
reset*helpers into@object-ui/test-supportor tag them@internaland strip in the dts build. -
providers: delete the trio and the test exemptions; point the byo example at@object-ui/react; foldUploadProviderinto fields and the upload adapter into data-objectstack, then retire the package. - One PR deleting the 122 CONFIRMED dead keys from all ten packs (read each key's screen first, as the tool asks; CONFIRMED only).
- Delete the root orphans and the unused declarations listed above; update
skills/objectui/guides/testing.md, which still teaches msw.
Benefit: at least 2,200 source lines, about 1,220 translated strings, two packages out of the release group, nine public symbols, four root files and two Playwright configs. External npm consumers are 未实测; rollback is a revert per item.
Refs: objectui#11608, objectui#11616, objectui#12083, objectui#12058, objectui#12428, objectui#3530, objectui#3650.
Filed by the read-only whole-repo review session https://claude.ai/code/session_01BDtwYUWhLGyWLzYQjZ95Cf on 2026-10-24; the maintainer approved filing (「同意,创建任务」). Full evidence files sit in that session's scratchpad (objectui-review-report.md, findings-*.md). ⛔ Not a claim; for triage to grade and route. Graded; the plugin-ai bullet is ruled (see the first line).
Activity
objectstack-fleet commentedon Oct 24, 2026
Triage: first grade —
tech-debt·priority:p3·domain:ui·area:devpath·pm:queue· triage seat ·session_01AavokzJ5DndAwitDXvKy4U· 2026-10-24T15:00Z⛔ Not a claim, ⛔ not a dispatch.
findingcomes off.PartialSchemaexport, which had no reader; a census pin keeps it gone (objectui#11608) objectui#11616 precedent:runnerset toprivate: trueand out of the fixed group;reset*ForTestinghelpers off the public barrels;providerstrio;plugin-ai's fate (retire it, or wire it inregister-plugins.ts) cuts or keeps a product surface. It goes to the maintainer, and it stays out of these PRs until ruled.Generated by Claude Code
objectstack-fleet commentedon Oct 25, 2026
Claim: PM loop round 4 · 2026-10-25T04:45Z
Session:
session_011yfYeuX2ptMSCcYZiq61tS(card thread 「清理无人使用的导出与模块」, dispatched by thedomain:uiseat 4 sessionsession_01XWGTsmqrtrt1Zqh1ioWqsT)Account:
os-elon-muskBranch:
claude/project-thread-u9kgfd(platform-assigned)Worktree:
objectui-issue-13453Domain:
domain:uiSeat:
domain:ui#4File surface (triage
6385727878's in-scope list only; one PR per package or group is fine, all on this branch in sequence):core/src/builder/schema-builder.ts,core/src/protocols/{Dnd,Keyboard,Sharing}Protocol.ts,react/src/hooks/{useFocusManagement,useFocusTrap,usePageTransition,useSchemaPersistence}.ts,collaboration/src/LiveCursors.tsx(plus the comment mentions intypes/src/index.ts);packages/runner/package.json→private: true, and its entry out of.changeset/config.json's fixed group;reset*ForTesting-style helpers off the public barrels (core ×5, app-shell, types, plugin-detail), moved to@object-ui/test-supportor tagged@internal, whichever the repo's existing pattern is;@object-ui/providerstrio (DataSourceProvider,MetadataProvider,ThemeProvider+ hooks), the hand-written exemptions inone-authority-per-exported-name-6273.test.ts, andexamples/byo-backend-console/src/App.tsxrepointed at@object-ui/react;(Stop on breach; explain in the report.)
⛔ Not in this claim:
@object-ui/plugin-ai: retire or wire it is the maintainer's call;UploadProvider/ upload-adapter folding and retiring the providers package;clearSharedDiscoveryCacheindata-objectstack: seat 1's objectui#13442 holdspackages/data-objectstack/src/**, so it waits for that card;Container & model:
M, card thread,model: default tier (no path-derived mandate),effort: highClause-②: no (nothing added a consumer or author can target)
Metadata-protocol: none (code exports, not metadata). Removing a published export is still breaking for an npm consumer: per objectui's version policy, each changeset is
minorwith the removal named, nevermajor. Measure external consumers where you can (npm dependents); otherwise record them NOT MEASURED.Responsibility:
published barrels carry dead modules, test-only helpers and a duplicate provider trio; runner is published with no entry | delete or internalise them | every consumer reading the public API, and the release groupThread-read: 6385727878
Premise: holds as filed on HEAD
7981384. Re-measure every zero-consumer claim onmainbefore deleting, with a positive control, as the filing did.Serial constraints cleared: seat 1's objectui#13442 (
data-objectstack/src/**,core/src/actions/**, list/view/grid), security(components): the ui 'html' renderer injects schema.html unsanitised — the spec declares no html component; retire the type objectui#13449 (components/src/renderers/basic/**,types/src/data-display*) and security(core): WidgetRegistry loads a widget from source.url through new Function('url', 'return import(url)') — the runtime dynamic import AGENTS.md #6 forbids; retire the module source objectui#13450 (core/src/registry/WidgetRegistry.ts,types/src/widget.ts, cli, create-plugin) are not touched by the surface above; checktypes/src/index.tsagainst security(core): WidgetRegistry loads a widget from source.url through new Function('url', 'return import(url)') — the runtime dynamic import AGENTS.md #6 forbids; retire the module source objectui#13450 before editing it. Seat 4's console: four routed developer/system pages import no i18n at all (ApiConsolePage, PublicFormsPage, IntegrationsPage, AiPendingActionsPage) and DatasourceResourcePage has 17 English literals — 233 hard-coded strings #25916 pass 2 owns the locale packs for now.Writes: all PR, comment and label writes go only through objectstack's relay (
scripts/pm/fleet-write); never write with GitHub MCP.objectstack-fleet commentedon Oct 25, 2026
Claim amendment ·
domain:ui#4· 2026-10-25T04:58Z · amends claim6393574403resetActionKeyWarningsstays out. It lives incore/src/actions/actionKeys.tsand reaches the core barrel throughcore/src/actions/index.ts(export *), and seat 1's objectui#13442 holdscore/src/actions/**. It waits for that card, asclearSharedDiscoveryCachedoes. The other four core helpers sit incore/src/utilsand come offcore/src/index.ts.skills/objectui/guides/project-setup.mdteachesDataSourceProvider/MetadataProvider/ThemeProviderfrom@object-ui/providers, and calls@object-ui/runnera "universal runtime";skills/objectui/guides/architecture.mddoes the same.skills/**is governed, so this PR is Tier H (it waits for GOVERNED_APPROVERS). It opens from this card's branch, restarted onmain, after the code PR merges. The code PR stays Tier S and names both files under a follow-up line. An objectui merge publishes nothing until a human runs the release, so the gap between the two merges ships nothing stale.Generated by Claude Code
objectstack-fleet commentedon Oct 25, 2026
Claim amendment 2 ·
domain:ui#4· 2026-10-25T05:27Z · amends claim6393574403and amendment6393680911The two PRs are re-cut along the governed line. The dev measured that deleting the providers trio turns
scripts/__tests__/check-skills-paths.test.tsred. The cause is.claude/skills/objectui-contributor/guides/console-development.md, which namespackages/providers/src/MetadataProvider.tsx. So whichever PR deletes the trio must also edit a governed.claude/**file.PR 1, Tier S, lands under the maintainer's standing word: the nine modules,
runnersetprivate: trueand taken out of the fixed group, and the reset helpers off the public barrels. It contains no providers change and no.claude/**orskills/**edit.PR 2, Tier H, waits for GOVERNED_APPROVERS:
.claude/skills/objectui-contributor/guides/console-development.mdsentence;skills/objectui/guides/project-setup.mdandarchitecture.md, which still teach the trio and therunner"universal runtime".It opens from this card's branch, restarted on
main, after PR 1 merges.This keeps everything that needs no governed approval from waiting on one that does. Clause-② and Metadata-protocol are unchanged (no / none).
Generated by Claude Code
docs(quick-reference): count runner among the private packages (#13453)
59 remaining items
objectstack-fleet commentedon Oct 31, 2026
domain:ui#5 · os-sales · session_01L6bhgUhKx1XHzkoikGjRB4
Landed (partial: the barrel batch for
collaborationandmobile) · 2026-10-31T10:36Z · PR #28385 merged through the merge queue as8c8c5b52at 2026-10-31T10:34:24Z (seat ACCEPT 6542143551 pinned tob6c6ff29, contract review PASS 6542128649).origin/mainui/packages/collaboration/src/useCommentSearch.ts,ui/packages/mobile/src/useOfflineSync.tsgit grep -w -e useOfflineSync -e useCommentSearchon the two package entriesRelease: claim 6541128113 (session
session_01L6bhgUhKx1XHzkoikGjRB4,domain:ui#5). Partial landing, so the card returns topm:queuewith no assignee.Resume-from: none (the next item starts from
main).@object-ui/collaboration(useCommentSearch,CommentSearchConfig,CommentSearchReturn,createPresenceUpdater) and@object-ui/mobile(useOfflineSync,OfflineSyncState,requestBackgroundSync,resolveResponsiveValue), one!changeset each.@object-ui/plugin-ganttnames (24) and@object-ui/plugin-designervalues (6) that their own READMEs teach, so retiring them takes a README edit in the same PR; the module bodies ofcreatePresenceUpdater(usePresence.ts) andrequestBackgroundSync(serviceWorkerSource.ts), now read by nothing;CommentSearchResultin@object-ui/types, which lost its last code reader.resetActionKeyWarningsbehind open PR feat(spec): an action's param dialog can name its own submit verb —submitText#28188, andclearSharedDiscoveryCache), the msw text inskills/**, and the other packages' barrel batches.Generated by Claude Code
objectstack-fleet commentedon Oct 31, 2026
domain:ui#5 · os-sales · session_01L6bhgUhKx1XHzkoikGjRB4
Claim: PM loop round 3 · 2026-10-31T11:13Z
Session:
session_01L6bhgUhKx1XHzkoikGjRB4Account:
os-salesBranch:
claude/issue-25921-readerless-helpersWorktree:
objectstack-issue-25921Domain:
domain:uiSeat:
domain:ui#5File surface: partial,
Part of #25921: deletecreatePresenceUpdaterfromui/packages/collaboration/src/usePresence.tsandrequestBackgroundSyncfromui/packages/mobile/src/serviceWorkerSource.ts(both left module-local with no reader by PR #28385), plus any test of exactly those two functions (stop on breach; explain in the report). Excluded: every other item on this card.Container & model: S mechanical,
mode:subagent,model: floor (no path-derived mandate),effort: mediumClause-②: no
Metadata-protocol: none
Responsibility: n/a — not a defect card
Thread-read: 6542309053
Premise: holds (
origin/mainafter8c8c5b52:git grep -wfinds each name only at its definition,usePresence.ts≈L215 andserviceWorkerSource.ts≈L104, plus CHANGELOG history; neither package entry exports them)Serial constraints cleared: no open PR touches the two files; split note to seat 4 sent
Generated by Claude Code
objectstack-fleet commentedon Oct 31, 2026
domain:ui#5 · os-sales · session_01L6bhgUhKx1XHzkoikGjRB4
os-dev-report
{ "issue": 25921, "status": "done", "branch": "claude/issue-25921-readerless-helpers", "pr": "https://github.com/objectstack-ai/objectstack/pull/28402", "session": "session_01L6bhgUhKx1XHzkoikGjRB4", "premise_still_valid": true, "summary": "Deleted createPresenceUpdater (usePresence.ts) and requestBackgroundSync (serviceWorkerSource.ts), 50 lines, no test or import became orphaned. Re-measured repo-wide on origin/main 125ad062: each name only at its definition plus CHANGELOG/changeset history. Patch changeset added because both packages ship tsc dist whose compiled files change; no skip-changeset.", "tests": "collaboration type-check exit 0, vitest 7 files/83 tests pass; mobile type-check exit 0, vitest 6 files/50 tests pass (lock VERDICT command-exit 0 each; closure built first)", "gates": "head bec3be15; dispatch-gates --commands (28 cmds) all exit 0 incl. check-sdui-manifest and its self-test, check:published-files, check:nul-bytes, check:test-source-alias, check:undeclared-dep-imports, except: pnpm --dir ui exec vitest run scripts/ exit 1 (1 failed/4900 passed: unit-registry-absence-collision, '@objectstack/client' entry unresolved because not built in this worktree; NOT MEASURED, CI builds it). CI check-runs not yet read.", "dogfood_battery": "n/a", "mcp_calls": "0", "api_writes": "2 - fleet-write relay: pr_create (draft) on objectstack-ai/objectstack#28402, os-dev-report comment on #25921; plus git push x2 (empty branch, commit)", "open_questions": [], "out_of_scope_findings": [ "carrier: none · PR body's two-minute-verify line says the grep should hit only the new changeset, but the two earlier 25921 changesets also name the symbols; body not PATCHed per role file, seat may correct" ], "files_changed": [ "ui/packages/collaboration/src/usePresence.ts", "ui/packages/mobile/src/serviceWorkerSource.ts", ".changeset/25921-readerless-presence-sync-helpers.md" ], "line_budget": "-50 source lines, +9 changeset lines", "deviations": [ "verify-line inaccuracy in PR body (see out_of_scope_findings)", "ui scripts vitest family not measured (unbuilt @objectstack/client)" ] }Generated by Claude Code
objectstack-fleet commentedon Oct 31, 2026
domain:ui#5 · os-sales · session_01L6bhgUhKx1XHzkoikGjRB4
Landed (partial: the two readerless helper bodies) · 2026-10-31T12:28Z · PR #28402 merged through the merge queue as
3fb1a245at 2026-10-31T12:21:48Z (seat ACCEPT 6543144914 pinned tobec3be15).origin/maingit grep -w -e createPresenceUpdater -e requestBackgroundSync -- 'ui/packages/*/src/**'Release: claim 6542651046 (session
session_01L6bhgUhKx1XHzkoikGjRB4,domain:ui#5). Partial landing, so the card returns topm:queuewith no assignee.Resume-from: none (the next item starts from
main).createPresenceUpdater(ui/packages/collaboration/src/usePresence.ts) andrequestBackgroundSync(ui/packages/mobile/src/serviceWorkerSource.ts), left with no reader by PR refactor(ui)!: retire zero-consumer exports from@object-ui/collaborationand@object-ui/mobile#28385; one patch changeset.@object-ui/plugin-gantt(24) and@object-ui/plugin-designer(6) names,CommentSearchResultin@object-ui/types, the two playwright import-harness configs, the providers/upload fold, the two reset helpers (resetActionKeyWarningsbehind open PR feat(spec): an action's param dialog can name its own submit verb —submitText#28188, andclearSharedDiscoveryCache), the msw text inskills/**, and the other packages' barrel batches.Generated by Claude Code
objectstack-fleet commentedon Nov 1, 2026
domain:ui#1 · os-tesla · session_01L9qibw2uhdSeHYfnZdAf4V
Claim: PM loop round 2 · 2026-11-01T04:38Z · items B1, B3, B4, B6, B10 of the card thread's ledger
Session:
session_01L9qibw2uhdSeHYfnZdAf4V(seat; implementation by card thread sessionsession_01L9qibzKqWksC1TiqsHCrrU,mode:thread)Account:
os-tesla(the seat's linked user asGET /useranswers it; the card's assignee)Branch:
claude/project-thread-ula03vWorktree:
objectstack-issue-25921Domain:
domain:uiSeat:
domain:ui#1File surface: B1
resetActionKeyWarningsoff@object-ui/core's barrel; B3__resetVisibilityPredicateWarningsoff@object-ui/react's barrel (repoint its 5 cross-package tests to a test-only path); B4resetUnknownActivityTypeWarningsoff@object-ui/plugin-detail's barrel; B6CommentSearchResultoff@object-ui/types(and its one pin test); B10 the four deadpublicForm.*keys in the ten i18n packs; tests beside; one!changeset per package whose barrel narrows (stop on breach; explain in the report)Container & model:
M,mode:thread,model: default,effort: highClause-②: no (narrowing)
Metadata-protocol: none
Responsibility:
n/a — not a defect cardThread-read: none
Premise: holds. The card thread's item ledger,
/mnt/project-files/ui-seat-1/r2026-10-31b/out/25921-ledger.md(objectstackefb1620c, hotcrma598256, positive controls SchemaRenderer 1,198 files / useRecordPresence 113), re-measured each picked item zero-consumer in-repo, inexamples/**and in hotcrm.Serial constraints cleared: none of the 19 open PRs touches a picked file (ledger).
Order: /mnt/project-files/ui-seat-1/r2026-10-31b/dispatch-25921-ledger.md, Step 2. Not picked here: B2 (≈33 test imports, its own claim), B5 (its changeset called the helper deliberately published), B7 (storage adapters a customer may wire outside the repo), B8 and B11 (Tier H), B9, B12, B13. The PR carries
Part of #25921. A barrel narrowing owes oneCONTRACT_REVIEW_TIERreview before the queue.