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. 64 remaining items

  7. 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

  8. 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

  9. 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

  10. 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.

  11. objectstack-fleet commented on Nov 1, 2026

    @objectstack-fleet
    Contributor

    domain:ui#1 · os-tesla · session_01L9qibzKqWksC1TiqsHCrrU
    os-dev-report

    {
      "issue": 25921,
      "status": "done",
      "branch": "claude/project-thread-ula03v",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/28544",
      "session": "session_01L9qibzKqWksC1TiqsHCrrU",
      "premise_still_valid": true,
      "summary": "Part of #25921, claim 6553495326 items B1 B3 B4 B6 B10. resetActionKeyWarnings leaves the @object-ui/core entry (actions barrel re-exports actionKeys by name); __resetVisibilityPredicateWarnings leaves @object-ui/react (nine cross-package tests now import ui/packages/react/src/utils/visibilityDiagnostic); resetUnknownActivityTypeWarnings leaves @object-ui/plugin-detail (one app-shell test repointed); CommentSearchResult is deleted from @object-ui/types with its record-id pin row; publicForm.consentRequired/rateLimited/redirectBlocked/requiredHint leave all ten packs. Five patch changesets with BREAKING banner, Clause-② no (narrowing), Metadata-protocol none and an ADR-0087 disposition each. Draft, label tech-debt, no assignee, no reviewer.",
      "tests": "Head fef5795d. vitest packages/core/src/actions, react, plugin-detail, types, i18n + the ten edited cross-package tests: 1022 passed, 7 failed, 1 skipped (1030); all seven reds were the spec dist without .d.ts (closure built with OS_SKIP_DTS=1); after pnpm --filter @objectstack/spec build with declarations the seven rerun 7/7, 184 tests passed. turbo type-check for types, core, react, plugin-detail, i18n, components, app-shell, console: 78/78 tasks, lock VERDICT command-exit 0. No ablation: export removals and dead strings, no tested behaviour changed.",
      "gates": "dispatch-gates --commands at fef5795d: 34 commands, all run with stdin closed, exits recorded before any pipe. --ran: 34 derived, 34 run, 0 NOT-MEASURED, exit 0. All 34 exit 0; check:type-check-debt first exited 3 (prerequisite, ran during the build) and 0 on rerun. check-adr-0087-registration --base origin/main: 5 declared-breaking changesets, each disposition verified. Outside the derived set: check-sdui-manifest exit 0, check-platform-checklist --changed-from origin/main exit 0 (0 anchored files), ui check:new-line-citations exit 0 (0 new). CI on fef5795d: not yet read at report time. dispatch-gates --tier: no path-derived mandate, TIER_DEFAULT.",
      "line_budget": "+104 / -90 over 31 files, under the 3000 human-merge threshold; no governed path",
      "dogfood_battery": "n/a: no dogfood run; title carries ! and Clause-② carries the (narrowing) arm, but the diff touches no packages/** source the dogfood closure builds (ui packages and tests only) — declared NOT MEASURED for the seat to rule",
      "files_changed": [
        ".changeset/25921-core-reset-action-key-warnings-off-barrel.md",
        ".changeset/25921-i18n-dead-public-form-keys.md",
        ".changeset/25921-plugin-detail-reset-activity-warnings-off-barrel.md",
        ".changeset/25921-react-reset-visibility-warnings-off-barrel.md",
        ".changeset/25921-types-comment-search-result.md",
        "ui/packages/core/src/actions/index.ts",
        "ui/packages/react/src/index.ts",
        "ui/packages/plugin-detail/src/index.tsx",
        "ui/packages/types/src/index.ts",
        "ui/packages/types/src/views.ts",
        "ui/packages/types/src/__tests__/record-id-string-survivors-10078.test.ts",
        "ui/packages/i18n/src/locales/{ar,de,en,es,fr,ja,ko,pt,ru,zh}.ts",
        "ui/apps/console/src/__tests__/App.homePermissions-12700.test.tsx",
        "ui/packages/app-shell/src/layout/__tests__/UnifiedSidebar.navCanPermissions-12700.test.tsx",
        "ui/packages/app-shell/src/providers/ExpressionProvider.visibleFaultDiagnostic.test.ts",
        "ui/packages/app-shell/src/providers/__tests__/navigationVisibility-12700.test.ts",
        "ui/packages/app-shell/src/providers/__tests__/navigationVisibility.bareCel-27457.test.ts",
        "ui/packages/app-shell/src/providers/__tests__/navigationVisibility.unboundScope-25892.test.tsx",
        "ui/packages/app-shell/src/views/RecordDetailView.activityUnmappedType-5896.test.tsx",
        "ui/packages/components/src/__tests__/page-node-visibility-fail-closed-13299.test.tsx",
        "ui/packages/components/src/__tests__/page-tabs-visible-when-fail-closed-13286.test.tsx",
        "ui/packages/components/src/__tests__/page-tabs-visible-when-fault-warning.test.tsx"
      ],
      "deviations": [
        "B3 repointed nine cross-package tests, not the five the claim names: the ledger's first scan missed multi-line imports; the import-statement scan on the branch found nine. Same item, same file class.",
        "@object-ui/i18n gets its own ! changeset: the pack-derived key type narrows, so it is a barrel narrowing in the claim's sense.",
        "Full dogfood not run (see dogfood_battery).",
        "PR body carries the harness attribution lines (line 1 comment, closing Generated-with lines) besides the session-URL footer."
      ],
      "mcp_calls": "1 — subscribe_pr_activity on #28544 (claude-code-remote, not GitHub MCP); 0 GitHub MCP calls",
      "api_writes": "3 — git push x1 (claude/project-thread-ula03v, fef5795d); relay pr_create objectstack#28544 (run 41277275786, body 7438 bytes sent and stored identical, assignees none, label tech-debt); this os-dev-report comment via post-stamped",
      "open_questions": [],
      "out_of_scope_findings": []
    }
  12. objectstack-fleet commented on Nov 1, 2026

    @objectstack-fleet
    Contributor

    domain:ui#1 · os-tesla · session_01L9qibw2uhdSeHYfnZdAf4V

    Landed · 2026-11-01T06:31Z · PR #28544 (B1, B3, B4, B6 and B10) merged through the merge queue as 8a12a17a at 2026-11-01T06:30:39Z. The maintainer readied and queued it from os-zhuang, which confirmed the correction of the pending collaboration changeset. Records: contract FAIL 6554050725 (fef5795d), delta PASS 6554291417, and ACCEPT 6554317117 (both at 90c5e251).

    probe before (8a12a17a~1) now (origin/main)
    export * from './actionKeys in core/src/actions/index.ts 1 0
    interface CommentSearchResult in types/src/views.ts 1 0
    rateLimited in i18n/src/locales/en.ts 1 0
    "can keep using" in .changeset/25921-collaboration-zero-consumer-exports.md 1 0

    Release

    Part of: the card stays open. B2, B5, B7, B8, B9, B11, B12 and B13 are untaken, and the ledger dispositions are in the thread ledger. B8 and B11 sit on governed paths. B5 is declared published on purpose. The seat is signing off, so the card goes back to pm:queue, and pm:dispatched and the assignee are removed in the same stroke as this note.

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

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions