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

  7. objectstack-fleet commented on Nov 2, 2026

    @objectstack-fleet
    Contributor

    domain:ui#5 · zhuangjianguo · session_01QsR2jRTYHhqj3r6SiMnrkT
    os-dev-report addendum

    {
      "issue": 25921,
      "pr": "https://github.com/objectstack-ai/objectstack/pull/29616",
      "head": "9502086d",
      "addendum_to": 6589301972,
      "fixes": "contract review record 6589388719 must-fix: the changeset now bumps '@object-ui/plugin-designer': patch beside '@object-ui/i18n': patch (DESIGNER_DEFAULT_TRANSLATIONS is exported from src/index.tsx L51), its title reads refactor(i18n, plugin-designer)!, and one sentence says the exported map loses its designer.versionHistory row (a read now yields undefined; type Record<string, string> unchanged), naming #29529 as the predecessor. Seat 3's pending changeset untouched.",
      "files_changed": [".changeset/25921-designer-version-history-key.md"],
      "gates": "on 9502086d with the corrected title and body: check-adr-0087-registration exit 0, check-changeset-no-major exit 0, check-empty-changeset exit 0, check-closing-keyword-parity exit 0, check:pm-changeset-deadline-census exit 0, check-partof-closing-keyword exit 0. The first adr-0087 and closing-keyword runs in a fresh worktree refused (no node_modules, exit 1 / 3, nothing measured); re-run after pnpm install.",
      "pr_title_and_body": "not written by the dev. New title: refactor(i18n, plugin-designer)!: retire the unread designer.versionHistory key. Seat-signed corrected body: /mnt/project-files/issue-25921-b4/pr-body-v2.md (signature line, blank line, then the body).",
      "deviations": ["The first report's claim that the map is not exported was wrong: the export grep looked at src/index.ts, but the entry is src/index.tsx."],
      "mcp_calls": "0",
      "api_writes": "1 (this addendum) plus 1 git push"
    }
  8. objectstack-fleet commented on Nov 2, 2026

    @objectstack-fleet
    Contributor

    domain:ui#5 · zhuangjianguo · session_01QsR2jQjvWkZ7is6GXbC6DB

    Landed (partial, one batch) · 2026-11-02T22:36Z

    • Landed: PR refactor(i18n, plugin-designer)!: retire the unread designer.versionHistory key #29616 merged at 2026-11-02T22:36Z (4d8095ba, Part of #25921). The seat's ACCEPT is 6589798777. The director's contract review was a FAIL (6589388719) and then a PASS on the fixed head (6589480821).
    • This batch delivered: designer.versionHistory leaves all ten @object-ui/i18n packs and plugin-designer's exported DESIGNER_DEFAULT_TRANSLATIONS. That key went unread when refactor(ui)!: retire plugin-designer's dead collaboration code, VersionHistory and the useConfirmDialog entry export #29529 deleted the VersionHistory module. One patch changeset covers both packages.
    • Trap for later batches: @object-ui/plugin-designer's entry is src/index.tsx, not index.ts. A grep of the wrong file misreads what the package exports. That is what the review's FAIL caught.
    • Left on this card:
      • CommentSearchResult;
      • the providers/upload fold;
      • clearSharedDiscoveryCache;
      • other packages' barrel batches.
    • Card state: the claim is released, and the card goes back to pm:queue with no assignee. A narrowing batch owes a director contract review again.
  9. objectstack-fleet commented on Nov 3, 2026

    @objectstack-fleet
    Contributor

    domain:ui#5 · zhuangjianguo · session_01QsR2jQjvWkZ7is6GXbC6DB

    Claim: PM loop round 6 · 2026-11-03T01:42Z
    Session: session_01QsR2jSoUd7Uhw6ei5FFLD1 (card thread, os-dev); dispatched by seat session session_01QsR2jQjvWkZ7is6GXbC6DB
    Account: zhuangjianguo
    Branch: claude/project-thread-un6127 (platform-assigned to the card thread; it can push only this branch)
    Worktree: objectstack-issue-25921
    Domain: domain:ui
    Seat: domain:ui#5
    Batch: retire the zero-consumer useMentionNotifications hook (with MentionNotificationsConfig and MentionNotificationsResult) from @object-ui/collaboration, and the MentionNotification interface from @object-ui/types, which only that hook reads. Part of #25921; the umbrella stays open.
    File surface: ui/packages/collaboration/src/useMentionNotifications.ts (delete), ui/packages/collaboration/src/index.ts, ui/packages/types/src/views.ts, ui/packages/types/src/index.ts, ui/packages/types/src/__tests__/record-id-string-survivors-10078.test.ts (comment only, if needed), and one new changeset (stop on breach)
    Container & model: S, mode:thread, model: default tier (no Fable per the maintainer's standing rule), effort: medium
    Clause-②: no (narrowing)
    Metadata-protocol: none
    Responsibility: a host importing useMentionNotifications or MentionNotification from the published packages | a hook no console surface reads (the bell reads the server inbox via useInboxBell) stays exported with its type | readers of the barrels and the zero-consumer census, which keeps counting it
    Thread-read: none
    Premise: to prove first on current main. The seat's census at a2f77f7 found 0 files outside the collaboration package for the hook and its two types, and the module as the type's only reader. The dev repeats it with a positive control and stops if any reader exists.
    Serial constraints cleared: the dev reports any open PR on these files before editing and merges main right before pr_create.

  10. objectstack-fleet commented on Nov 3, 2026

    @objectstack-fleet
    Contributor

    domain:ui#5 · zhuangjianguo · session_01QsR2jSoUd7Uhw6ei5FFLD1
    os-dev-report

    {
      "issue": 25921,
      "status": "done",
      "branch": "claude/project-thread-un6127",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/29732",
      "head": "9be84e1e",
      "session": "session_01QsR2jSoUd7Uhw6ei5FFLD1",
      "premise_still_valid": true,
      "summary": "Retired useMentionNotifications (with MentionNotificationsConfig and MentionNotificationsResult) from @object-ui/collaboration and the MentionNotification interface from @object-ui/types. Premise census on origin/main 1c1a5d40: the hook and its types have 0 files outside the package except QA checklist prose; MentionNotification was read only by the hook plus a doc comment in the 10078 test; control useRealtimeSubscription 72 files; hotcrm and docs.objectos.ai 0. One patch changeset with BREAKING paragraph, four FROM/TO lines and a runtime-export-retired ADR-0087 marker naming all four operands. Part of #25921, no closing keyword.",
      "files_changed": [
        "ui/packages/collaboration/src/useMentionNotifications.ts (deleted, 97 lines)",
        "ui/packages/collaboration/src/index.ts (-6)",
        "ui/packages/types/src/views.ts (-28)",
        "ui/packages/types/src/index.ts (-1)",
        "ui/packages/types/src/__tests__/record-id-string-survivors-10078.test.ts (doc comment, +2 -1)",
        ".changeset/25921-collab-mention-notifications.md (new)"
      ],
      "line_budget": "+20 / -133 across 6 files, under the 3000 human-merge threshold",
      "tests": "turbo type-check types+collaboration+app-shell+console with ^build: 74/74 successful (VERDICT command-exit 0). vitest packages/collaboration/ packages/types/: Test Files 394 passed, Tests 10545 passed. Reverse probe in app-shell against rebuilt d.ts: TS2305 for MentionNotification (@object-ui/types) and useMentionNotifications (@object-ui/collaboration); control CommentEntry resolved; probe deleted. check:readme-exports census: 0 fabricated, 0 stale omission(s); exit 1 only on the unbuilt packages/cli prerequisite. No ablation: no tested behaviour changed (a pure export removal).",
      "gates": "dispatch-gates --commands at 4d64f54c: 35 commands; 33 in loop all exit 0; vitest run scripts/ (ui) exit 0 (170 passed, 2 skipped files); check:type-check-debt exit 0. dispatch-gates --ran: 35 derived, 35 run, 0 NOT-MEASURED, 0 UNRUN. PR-body gates: check-changeset-no-major 0, check-adr-0087-registration 0 (4 operands verified), check-closing-keyword-parity 0, check-partof-closing-keyword 0. check-platform-checklist --changed-from origin/main: 0 anchored files. CI check-runs: in_progress at report time.",
      "dogfood_battery": "d6bab300 · VERDICT command-exit 0 (held 34m19s, shared box) · Test Files 401 passed, 3 skipped (404) · Tests 3310 passed, 28 skipped (3338) · no failures",
      "mcp_calls": "2 — mcp__github__issue_read (get, get_comments) on #25921; no write tools",
      "api_writes": "2 — fleet-write pr_create (PR 29732, read back byte-identical, no assignees), this post-stamped comment on #25921; plus 3 git pushes",
      "deviations": [
        "Worktree path is objectstack-issue-25921-b6, not objectstack-issue-25921 as the claim spells it (another batch's worktree name); branch matches the claim.",
        "Dogfood ran at d6bab300; final head 9be84e1e adds only a main merge touching ui/packages/fields (lookup cell) plus non-ui files, no collaboration or types file; census re-read on 9be84e1e with identical counts.",
        "Pending precedent changeset 25921-types-comment-search-result.md says MentionNotification stays exported unchanged; now untrue for the release consuming both. Not edited (pending 25921 changesets are off-limits); named in PR Acceptance notes for the seat."
      ],
      "open_questions": [],
      "security_findings": "none",
      "out_of_scope_findings": [
        "carrier: seat 5 · docs/qa/platform-checklist/areas/records-forms.json L3265 source line now stale (says the hook is exported); left untouched per claim, named in PR Acceptance notes; L3299 history row unchanged"
      ]
    }
  11. objectstack-fleet commented on Nov 3, 2026

    @objectstack-fleet
    Contributor

    domain:ui#5 · zhuangjianguo · session_01QsR2jSoUd7Uhw6ei5FFLD1
    os-dev-report

    Addendum 1 to report 6594357327: the director's must-fix from review 6594389562.

    {
      "issue": 25921,
      "status": "done",
      "branch": "claude/project-thread-un6127",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/29732",
      "head": "d92625f8",
      "previous_head": "9be84e1e",
      "session": "session_01QsR2jSoUd7Uhw6ei5FFLD1",
      "summary": "The BREAKING paragraph of .changeset/25921-collab-mention-notifications.md gains one sentence: The `CommentSearchResult` entry of this release said `MentionNotification` stays exported; it leaves here. 25921-types-comment-search-result.md is untouched. After that commit, main was merged. Delta 9be84e1e..d92625f8: this one changeset line, plus main's own files (none under ui/packages/collaboration or ui/packages/types).",
      "files_changed": [".changeset/25921-collab-mention-notifications.md (+1 -1, one sentence)"],
      "gates": "PR-body event file, on d92625f8: check-changeset-no-major --base origin/main exit 0; check-adr-0087-registration --base origin/main exit 0 (4 operands verified); check-empty-changeset --base origin/main exit 0 (no changeset from the merge base modified). Census on d92625f8: MentionNotificationsConfig 0, MentionNotificationsResult 0, MentionNotification 0, useMentionNotifications 1 (QA prose), control useRealtimeSubscription 73.",
      "tests": "not re-run: the delta touches no source file of either package. Readings in report 6594357327 stand at 4d64f54c and d6bab300.",
      "dogfood_battery": "unchanged: d6bab300 · VERDICT command-exit 0 · 401 passed, 3 skipped (404) files",
      "mcp_calls": "0 this round",
      "api_writes": "1 — this post-stamped comment; plus 1 git push",
      "deviations": ["The PR body is not amended. Its Acceptance notes still say the precedent sentence is untrue for the release; the changeset now says so itself. The seat applies a body change if it wants one."]
    }
  12. objectstack-fleet commented on Nov 3, 2026

    @objectstack-fleet
    Contributor

    domain:ui#5 · zhuangjianguo · session_01QsR2jQjvWkZ7is6GXbC6DB

    Landed (partial, one batch) · 2026-11-03T03:44Z

    • Landed: PR refactor(collaboration, types)!: retire the zero-consumer useMentionNotifications hook and MentionNotification #29732 merged through the queue at 2026-11-03T03:44Z (3eeb81d1, Part of #25921). The seat's ACCEPT is 6594661024. The director's contract review was a FAIL (6594389562) and then a PASS on the fixed head (6594433248).
    • This batch delivered: useMentionNotifications with MentionNotificationsConfig and MentionNotificationsResult leaves @object-ui/collaboration. The MentionNotification interface, which only that hook read, leaves @object-ui/types. The console bell reads the server inbox through useInboxBell. One patch changeset covers both packages.
    • Trap for later batches: a pending 25921-* changeset can go stale when a later batch retires a name it said "stays exported". Do not edit the pending entry, because that reds check-empty-changeset's DELIBERATE CORRECTION. Correct it in the new batch's own BREAKING paragraph instead (director ruling on 6594389562).
    • Left on this card:
      • the providers/upload fold;
      • clearSharedDiscoveryCache, which needs a test-support home first because tests in other packages import it;
      • the other packages' barrel batches.
      • Leave mobile's offline-queue and native exports alone while mobile work is active.
    • Card state: the claim is released, and the card goes back to pm:queue with no assignee. A narrowing batch owes a director contract review again.
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