Skip to content

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

Open

Description

@os-zhuang

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.ts 451 LOC, core/src/protocols/DndProtocol.ts 237, KeyboardProtocol.ts 222, SharingProtocol.ts 212 (their names appear only inside comments in types/src/index.ts), react/src/hooks/useFocusManagement.ts 248, useFocusTrap.ts 138, usePageTransition.ts 187, useSchemaPersistence.ts 373, collaboration/src/LiveCursors.tsx 143 — 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; registers ai-form-assist, ai-recommendations, nl-query): 0 source importers; absent from apps/console/src/register-plugins.ts and apps/console/vite.config.ts; owns an ai.* block in every locale pack (26 lines in en.ts); listed in .changeset/config.json's fixed group.
  • packages/runner: a Vite app (main.tsx, App.tsx, no barrel), private: false, no main / exports, in the fixed release group; packages/cli/src/__tests__/workspace-vite.test.ts asserts 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/providers exports DataSourceProvider, MetadataProvider, ThemeProvider (+hooks), the same six names @object-ui/react exports with different implementations; the providers trio's only non-test importer is examples/byo-backend-console/src/App.tsx (react's: 21 files); one-authority-per-exported-name-6273.test.ts carries hand-written exemptions for the collision. Its real content is UploadProvider (450 of 617 LOC; fields 11 sites) and createObjectStackUploadAdapter — fetch logic outside data-*, against AGENTS §3.
  • node scripts/check-i18n-dead-keys.mjs prints "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) and scripts/release-bump.cjs referenced by nothing; paseo.json (0 references; its setup teaches pnpm i against the frozen-lockfile rule); typedoc.json + typedoc devDep + docs:api (no workflow); lazy-test.mjs (only an exemption glob in check-lint-rule-coverage.mjs); playwright.import-harness.config.ts and playwright.import-console.config.ts (1 spec each, no workflow); msw declared in root, plugin-form, plugin-grid with 0 imports plus public/mockServiceWorker.js; apps/console devDeps @dnd-kit/core|sortable|utilities and autoprefixer with 0 references; docs/CONSOLE-STREAMLINING-SUMMARY.md names 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 in register-plugins.ts like plugin-markdown. Ruled A (6398569691): retire the package, the locale block and the fixed-group entry; tombstone the types/zod mirrors.
  • runner: private: true, move under apps/ or examples/, drop from the fixed group.
  • Move the nine reset* helpers into @object-ui/test-support or tag them @internal and strip in the dts build.
  • providers: delete the trio and the test exemptions; point the byo example at @object-ui/react; fold UploadProvider into 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

  1. added
    area:devpathThe road — create, dev, verify, publish/install, connect an agent, iterate
    and removed on Oct 24, 2026
  2. objectstack-fleet commented on Oct 24, 2026

    @objectstack-fleet
    Contributor

    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. finding comes off.


    Generated by Claude Code

  3. objectstack-fleet commented on Oct 25, 2026

    @objectstack-fleet
    Contributor

    Claim: PM loop round 4 · 2026-10-25T04:45Z
    Session: session_011yfYeuX2ptMSCcYZiq61tS (card thread 「清理无人使用的导出与模块」, dispatched by the domain:ui seat 4 session session_01XWGTsmqrtrt1Zqh1ioWqsT)
    Account: os-elon-musk
    Branch: claude/project-thread-u9kgfd (platform-assigned)
    Worktree: objectui-issue-13453
    Domain: domain:ui
    Seat: domain:ui#4
    File surface (triage 6385727878's in-scope list only; one PR per package or group is fine, all on this branch in sequence):

  4. objectstack-fleet commented on Oct 25, 2026

    @objectstack-fleet
    Contributor

    Claim amendment · domain:ui#4 · 2026-10-25T04:58Z · amends claim 6393574403

    1. Narrowed: resetActionKeyWarnings stays out. It lives in core/src/actions/actionKeys.ts and reaches the core barrel through core/src/actions/index.ts (export *), and seat 1's objectui#13442 holds core/src/actions/**. It waits for that card, as clearSharedDiscoveryCache does. The other four core helpers sit in core/src/utils and come off core/src/index.ts.
    2. Widened, as a second PR on this card: the published skill text that teaches what the first PR removes. skills/objectui/guides/project-setup.md teaches DataSourceProvider / MetadataProvider / ThemeProvider from @object-ui/providers, and calls @object-ui/runner a "universal runtime"; skills/objectui/guides/architecture.md does the same. skills/** is governed, so this PR is Tier H (it waits for GOVERNED_APPROVERS). It opens from this card's branch, restarted on main, 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.
    3. Unchanged: Clause-② no / Metadata-protocol none.

    Generated by Claude Code

  5. objectstack-fleet commented on Oct 25, 2026

    @objectstack-fleet
    Contributor

    Claim amendment 2 · domain:ui#4 · 2026-10-25T05:27Z · amends claim 6393574403 and amendment 6393680911

    The two PRs are re-cut along the governed line. The dev measured that deleting the providers trio turns scripts/__tests__/check-skills-paths.test.ts red. The cause is .claude/skills/objectui-contributor/guides/console-development.md, which names packages/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, runner set private: true and taken out of the fixed group, and the reset helpers off the public barrels. It contains no providers change and no .claude/** or skills/** edit.

    • PR 2, Tier H, waits for GOVERNED_APPROVERS:

      • the providers trio, its exemptions, and the byo example repointed;
      • the .claude/skills/objectui-contributor/guides/console-development.md sentence;
      • skills/objectui/guides/project-setup.md and architecture.md, which still teach the trio and the runner "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

  6. 59 remaining items

  7. objectstack-fleet commented on Oct 31, 2026

    @objectstack-fleet
    Contributor

    domain:ui#5 · os-sales · session_01L6bhgUhKx1XHzkoikGjRB4

    Landed (partial: the barrel batch for collaboration and mobile) · 2026-10-31T10:36Z · PR #28385 merged through the merge queue as 8c8c5b52 at 2026-10-31T10:34:24Z (seat ACCEPT 6542143551 pinned to b6c6ff29, contract review PASS 6542128649).

    probe on origin/main reading
    ui/packages/collaboration/src/useCommentSearch.ts, ui/packages/mobile/src/useOfflineSync.ts gone (both)
    git grep -w -e useOfflineSync -e useCommentSearch on the two package entries 0 hits

    Release: claim 6541128113 (session session_01L6bhgUhKx1XHzkoikGjRB4, domain:ui#5). Partial landing, so the card returns to pm:queue with no assignee.
    Resume-from: none (the next item starts from main).

    • Landed this time: eight zero-consumer names leave @object-ui/collaboration (useCommentSearch, CommentSearchConfig, CommentSearchReturn, createPresenceUpdater) and @object-ui/mobile (useOfflineSync, OfflineSyncState, requestBackgroundSync, resolveResponsiveValue), one ! changeset each.
    • Still open on this card (added by this pass): the zero-hit @object-ui/plugin-gantt names (24) and @object-ui/plugin-designer values (6) that their own READMEs teach, so retiring them takes a README edit in the same PR; the module bodies of createPresenceUpdater (usePresence.ts) and requestBackgroundSync (serviceWorkerSource.ts), now read by nothing; CommentSearchResult in @object-ui/types, which lost its last code reader.
    • Still open from before: the two playwright import-harness configs, the providers/upload fold, the two reset helpers (resetActionKeyWarnings behind open PR feat(spec): an action's param dialog can name its own submit verb — submitText #28188, and clearSharedDiscoveryCache), the msw text in skills/**, and the other packages' barrel batches.

    Generated by Claude Code

  8. objectstack-fleet commented on Oct 31, 2026

    @objectstack-fleet
    Contributor

    domain:ui#5 · os-sales · session_01L6bhgUhKx1XHzkoikGjRB4

    Claim: PM loop round 3 · 2026-10-31T11:13Z
    Session: session_01L6bhgUhKx1XHzkoikGjRB4
    Account: os-sales
    Branch: claude/issue-25921-readerless-helpers
    Worktree: objectstack-issue-25921
    Domain: domain:ui
    Seat: domain:ui#5
    File surface: partial, Part of #25921: delete createPresenceUpdater from ui/packages/collaboration/src/usePresence.ts and requestBackgroundSync from ui/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: medium
    Clause-②: no
    Metadata-protocol: none
    Responsibility: n/a — not a defect card
    Thread-read: 6542309053
    Premise: holds (origin/main after 8c8c5b52: git grep -w finds each name only at its definition, usePresence.ts ≈L215 and serviceWorkerSource.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

  9. objectstack-fleet commented on Oct 31, 2026

    @objectstack-fleet
    Contributor

    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

  10. objectstack-fleet commented on Oct 31, 2026

    @objectstack-fleet
    Contributor

    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 3fb1a245 at 2026-10-31T12:21:48Z (seat ACCEPT 6543144914 pinned to bec3be15).

    probe on origin/main reading
    git grep -w -e createPresenceUpdater -e requestBackgroundSync -- 'ui/packages/*/src/**' 0 hits

    Release: claim 6542651046 (session session_01L6bhgUhKx1XHzkoikGjRB4, domain:ui#5). Partial landing, so the card returns to pm:queue with no assignee.
    Resume-from: none (the next item starts from main).


    Generated by Claude Code

  11. objectstack-fleet commented on Nov 1, 2026

    @objectstack-fleet
    Contributor

    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 session session_01L9qibzKqWksC1TiqsHCrrU, mode:thread)
    Account: os-tesla (the seat's linked user as GET /user answers it; the card's assignee)
    Branch: claude/project-thread-ula03v
    Worktree: objectstack-issue-25921
    Domain: domain:ui
    Seat: domain:ui#1
    File surface: B1 resetActionKeyWarnings off @object-ui/core's barrel; B3 __resetVisibilityPredicateWarnings off @object-ui/react's barrel (repoint its 5 cross-package tests to a test-only path); B4 resetUnknownActivityTypeWarnings off @object-ui/plugin-detail's barrel; B6 CommentSearchResult off @object-ui/types (and its one pin test); B10 the four dead publicForm.* 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: high
    Clause-②: no (narrowing)
    Metadata-protocol: none
    Responsibility: n/a — not a defect card
    Thread-read: none
    Premise: holds. The card thread's item ledger, /mnt/project-files/ui-seat-1/r2026-10-31b/out/25921-ledger.md (objectstack efb1620c, hotcrm a598256, positive controls SchemaRenderer 1,198 files / useRecordPresence 113), re-measured each picked item zero-consumer in-repo, in examples/** 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 one CONTRACT_REVIEW_TIER review before the queue.

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

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions