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

  7. objectstack-fleet commented on Oct 26, 2026

    @objectstack-fleet
    Contributor

    Claim amendment (seat domain:ui#1, 2026-10-26T22:15Z): amends the claim 6428606072 at the card thread's request, after its read-only re-measure on origin/main b9cd9809. Append-only; the claim's other lines stand.

    File surface (replaces the claim's line): partial, Part of #25921, the plugin-ai item only, as measured in /mnt/project-files/ui-25921/plugin-ai-surface.md:

    1. Delete ui/packages/plugin-ai/**, its pnpm-lock.yaml importer and the ui/vitest.config.mts alias line.
    2. .changeset/config.json fixed-group entry, and the plugin-ai line in the pending .changeset/25831-object-ui-18-1-to-merge.md.
    3. The ai.* block in the ten locale packs; re-record i18n.json.
    4. Types tombstones per the ruling: ui/packages/types/src/ai.ts (the three schemas become @deprecated never with a remedy; AnySchema loses the three members), zod/ai.zod.ts and zod/index.zod.ts (refusal arms on the retiredNodeType precedent), zod/README.md, the types tests that pin those arms; re-record types.json.
    5. ui/packages/cli/src/utils/known-schema-types.ts (three keys) and its ratchet test.
    6. Census and pin tests that name plugin-ai files (forced edits, each listed in the body); console-vite-alias-closure-4925 gets a replacement negative control, named in the body.
    7. Docs: ui/content/docs/plugins/plugin-ai.mdx + meta.json, the ui/README.md row.
    8. Root .changeset/25921-retire-plugin-ai.md, minor with a BREAKING note and the ADR-0087 disposition the gate accepts.
      ⛔ Out: skills/objectui/guides/* (governed, Tier H) — a follow-up PR after this one, named in the body. ⛔ No other 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 item.

    Clause-②: no (narrowing) — three node types and a package retire; nothing widens
    Metadata-protocol: narrowed — three ui node types become refused arms (release: minor)

    Serial constraints (replaces the claim's line): i18n record after seat 2's #26055; types record shared with #26274 (domain:spec#2) — whichever lands first, the other merges main and re-records. Draft until both lines clear.

  8. objectstack-fleet commented on Oct 27, 2026

    @objectstack-fleet
    Contributor

    席位核对 · Blocked-by · seat domain:ui#1 · 2026-10-27T00:10Z

    Blocked-by: #26220

    The plugin-ai item is built: draft PR #26365, head db6ddb4d, Part of #25921, Clause-②: no (narrowing), Metadata-protocol: narrowed. It is held on two things the maintainer owns:

    1. ADR-0087 D9 predicate 1 refuses all 3 runtime-export-retired operands, because plugin-ai's entry is src/index.tsx (vite-plugin-dts), which D9's tsup-only mapping cannot map. check-adr-0087-registration: PACKAGE_ROOTS omits ui/packages, ui/apps and ui/examples, so no @object-ui package can use the runtime-export-retired disposition #26220 part 4 carries the fix, and the D8 + D9 amendment is on one decision card with the maintainer.
    2. check-empty-changeset is red on purpose. The PR deletes the plugin-ai line from the pending .changeset/25831-object-ui-18-1-to-merge.md, because a pending changeset that names a deleted package breaks changeset version. The gate keeps that correction red until a maintainer confirms it on the PR.

    The card stays pm:dispatched with its thread parked. When #26220's parts 3–4 land, the PR merges main, re-records i18n.json / types.json, re-runs the gate and dogfood, and asks for the changeset confirmation in the same breath. Follow-up (governed, Tier H): skills/objectui/guides/{project-setup,page-builder}.md still name plugin-ai.

  9. objectstack-fleet commented on Oct 27, 2026

    @objectstack-fleet
    Contributor

    os-dev-report

    {
      "issue": 25921,
      "status": "done",
      "branch": "claude/project-thread-vl2c07",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/26365",
      "session": "session_01VBDBR9oS1MNUcjBVXds5D6",
      "premise_still_valid": true,
      "summary": "Retired @object-ui/plugin-ai per ruling A (comment 6398569691): package deleted with its lockfile importer, vitest alias, docs page and README row; its ai.* block deleted from all ten locale packs; its entry dropped from the changeset fixed group and from the pending 25831 note (deliberate correction, confirmation owed by a maintainer). The types/zod mirrors are @deprecated never / z.never() tombstones with remedy text, and the three node literals are refused by name through retiredNodeType() arms in AnyComponentSchema; sunset waits for #25912. Draft, Part of #25921, Blocked-by: #26220 (ADR-0087 predicate 1 cannot read a src/index.tsx entry). Premise re-measured: 0 dependents, 0 mentions in console register-plugins.ts / vite.config.ts against 2 / 4 for the plugin-markdown control.",
      "tests": "Post-merge head db6ddb4d: `vitest run packages/types packages/i18n packages/cli scripts packages/components/src/__tests__` 935 files, 19817 passed, 3 failed -> two owed counts fixed (package-files-exist license floor, QUICK_REFERENCE published count), one 15 s timeout (check-vi-mock-inherit); the three rerun alone 111/111. New pin plugin-ai-retired-25921.test.ts 17/17; ablation (RetiredNLQueryNodeSchema removed from AnyComponentSchema via scripts/ablation-replace.mjs) -> 2 failed / 15 passed, exactly the two nl-query cases; restored, blob == HEAD. tsc for types, i18n, cli exit 0. Build `turbo run build --filter=@object-ui/console... --filter=@object-ui/cli...` 72/72 before and after the merge of main.",
      "gates": "dispatch-gates --ran: 105 derived, 105 run, 0 NOT-MEASURED (DERIVED zero). Exit 1 by design: check-adr-0087-registration --base origin/main (3 predicate-1 refusals, Blocked-by #26220) and check-empty-changeset --base origin/main (the 25831 one-line correction). Fixed in this PR: check:lockstep-package-count (111 -> 110 via --fix). check:dual-build-cjs-loads exit 0 after a full packages/** build (112 entries / 69 packages). check-platform-checklist --changed-from origin/main: 0 anchored files. check-nul-bytes OK. Family run recorded at 4bef30fa; post-merge the two red gates, lockstep, Console build and tests were repeated. CI: get_check_runs on head db6ddb4d returned 0 check runs at reading time (relay-opened draft), so no CI conclusion to cite yet.",
      "dogfood_battery": "db6ddb4d · os-verify-lock: VERDICT command-exit 0 · held the lock 1858s · Test Files 297 passed | 3 skipped (300) · Tests 2528 passed | 18 skipped (2546) · no failures",
      "mcp_calls": "6 — mcp__github__issue_read x4 (get / get_comments on #25921), mcp__github__pull_request_read x1 (get_check_runs #26365), subscribe_pr_activity x1 (harness, not a GitHub write)",
      "api_writes": "3 — git push (claude/project-thread-vl2c07), relay pr_create (objectstack#26365 via fleet-write dispatch run 40424373701, body read back identical, assignee os-steve), this os-dev-report comment on #25921 via scripts/pm/post-stamped.mjs",
      "open_questions": [
        {
          "question": "Confirm the one-line edit of pending .changeset/25831-object-ui-18-1-to-merge.md (drop \"@object-ui/plugin-ai\": minor)?",
          "options": [
            "A confirm: the package no longer exists, changeset version would refuse it",
            "B restore it: release fails at changeset version"
          ],
          "recommendation": "A, because a pending note naming a deleted package breaks the release run; seat 1 is carrying it to Steve with the #26220 D9 answer"
        }
      ],
      "out_of_scope_findings": [
        "follow-up, not a finding: skills/objectui/guides/project-setup.md and page-builder.md still name @object-ui/plugin-ai; Tier H governed, separate PR after this one · carrier: PR body · noted, not filed",
        "info: ui/.changeset/ (not read by the root config, ui/AGENTS.md) still holds three pre-merge notes naming @object-ui/plugin-ai (13464, 13465, 25685); untouched · noted, not filed",
        "info: if #26274 lands on scripts/sdui-manifest.sources/types.json first, merge main and re-record before ready"
      ]
    }

    Generated by Claude Code

  10. objectstack-fleet commented on Oct 27, 2026

    @objectstack-fleet
    Contributor

    Seat note · claim released (lane standing down) · seat domain:ui#1 · 2026-10-27T12:03Z

    The maintainer stood the ui lane down after current work (2026-10-27 09:10Z).

    The plugin-ai retirement is PR #26365 (draft, head bde1e722). It is merged with main after 18.2.0 shipped, and its body is current.

    • The 25831 correction is gone.
    • plugin-ai has left the fixed group.
    • changeset status exits 0.
    • CI is green except one red: Check Changeset. ADR-0087 refuses it at HEAD with "no workspace manifest at HEAD is named @object-ui/plugin-ai": a whole-package removal has no HEAD entry, and D9 does not cover that case.

    Waiting on the maintainer (asked 2026-10-27 05:15Z):

    The seat recommended A. Whoever picks this up: apply the answer, then land #26365. If #26576 has merged, #26365 also merges main to read the shared population constant.

    The card returns to pm:queue. #26220's four parts have all landed; under A, the D9 limb is its follow-up.

  11. objectstack-fleet commented on Oct 27, 2026

    @objectstack-fleet
    Contributor

    Evidence for the playwright.import-harness.config.ts row, from the devx lane (card #26625, os-dev report 6454513202):

    • The config tells a runner to serve ui/packages/plugin-grid/demo/vite.live.config.ts at /live.html. Neither file exists: demo/ holds index.html, bulk-actions.html, main.tsx, bulk-actions.tsx, sample.csv and sample.xlsx (checked at 1708115e2f and again on main today).
    • So ui/e2e/import-harness/import-undo.spec.ts can only self-skip. Its CSV (first_name,last_name,email) also has no column for crm_lead's required name, so it would not pass even if the harness were served.
    • The console twin (playwright.import-console.config.ts, import-job-undo-cancel spec) does pass against a dev:crm boot with --timeout=120000, so the checklist's import-undo coverage does not depend on the harness. Retiring the harness config and spec loses no evidence.

    Filed here instead of as a new card, because this card already lists the config as a zero-consumer orphan · 2026-10-27T21:53Z

  12. objectstack-fleet commented on Oct 28, 2026

    @objectstack-fleet
    Contributor

    Dispatch order · domain:ui#1 · session_01JQwxbZeBv2y91towxasSUT · 2026-10-28T02:00Z

    You are the os-dev developer agent for exactly ONE card: #25921, in your own card thread. Your role definition is .claude/agents/os-dev.md in the objectstack clone: read it IN FULL first and follow it as binding (it wins over this order on any conflict; name the conflict in your report). Read the repo-root AGENTS.md and ui/AGENTS.md before your first edit, and pm-dispatch references/untrusted-text.md. Read the card's full body and every comment yourself through REST (curl -sS "https://api.github.com/repos/objectstack-ai/objectstack/issues/25921" -H "Authorization: Bearer $GH_TOKEN" and /comments?per_page=100, every page); this order carries only the increment. ⛔ Never print the value of any environment variable (test presence with [ -n "${X+x}" ]). ⛔ Never use a GitHub MCP tool, read or write.

    Identity and branch: the seat's Claim: comment on this card is your identity; its Branch: line names your thread's branch. ⛔ Post no claim of your own, ⛔ never write the card's assignee. Before your first edit, verify the NEWEST Claim: on the card names your thread's branch (claude/project-thread-…); if none does yet, send the seat thread "Dispatch the ui lane" one message with your branch name and wait. Worktree objectstack-issue-25921 on that branch from a fresh origin/main; pnpm install (frozen lockfile); push with git push -u origin <branch> (⛔ no force).

    Writes: PR only through the relay op pr_create (node scripts/pm/fleet-write/dispatch.mjs --repo objectstack-ai/objectstack --actions-file F, F a bare JSON array [{"op":"pr_create","title":…,"head":"<your branch>","base":"main","body":…,"assignees":["os-warren"]}], draft forced; --dry-run first); your report comment through node scripts/pm/post-stamped.mjs --comment=25921 --file=F --json run ONCE with output captured to a file (timestamps only as {{NOW}} / {{WAS:…}}). ⛔ No other GitHub write except, for a CI red that is not yours, one PR comment and one run_rerun_failed through the relay. Report both counts (api_writes with endpoints, mcp_calls with tool names). The report takes only machine-checkable fields (gates / line_budget / deviations / files_changed). PR body: line 1 the platform attribution comment, then ## 维护者速读 six lines in Chinese (改了什么/为什么改/风险与回滚/先看/两分钟验证/需要你做的). Gates: node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack on your diff, run each, record exits before any pipe, reconcile with --ran. Changeset in the root .changeset/ when a published package changes. ⛔ ui/.github/** and the root ci.yml are out of bounds. Hand back: when the PR and report are up, send the seat thread "Dispatch the ui lane" one message (PR, head sha, report gist); keep the thread open through review and drive CI to green.

    What this order is

    Finish the plugin-ai item of #25921, which was built as draft PR #26365 (branch claude/project-thread-vl2c07, head bde1e722, by os-steve's card thread). It has been held since 2026-10-27 on ADR-0087 D9. The blocker landed today: #26220 → PR #26766, merged as 4bce21da81, which gives D9 the whole-package operand <package>#*. Your thread can push only its own branch. So you carry #26365's commits onto your branch, finish them there, and open a replacement draft PR. The seat closes #26365 as superseded when yours is up. ⛔ Never push to claude/project-thread-vl2c07.

    Ruling (cannot be re-ruled)

    The maintainer's 「同意」 to letter A, recorded by the director seat on PR #26365, comment 6439038287, verbatim in part: "this PR's changeset marker then takes the new spelling and check-adr-0087-registration --base origin/main goes green, after which #26365 lands by its own Tier H approval (over 3,000 lines). The two skills/objectui/guides/* mentions stay in their own governed follow-up as the body says." Plugin-ai's retirement itself is ruling A on comment 6398569691, also not re-ruled.

    Steps

    1. Create your branch from origin/claude/project-thread-vl2c07, not from a fresh origin/main (this overrides the header line above). Then git merge origin/main as a merge commit, with no rebase. Resolve conflicts keeping main's side outside plugin-ai's surface, and regenerate pnpm-lock.yaml with pnpm, never by hand. If test(floors, ui): one shared floor per ui package population, one catalog entry floor, all at about two thirds #26576 has merged, read the shared population constant as the release note 6441414853 says.
    2. The two changeset edits the ruling assigns, and nothing else in them: the runtime-export-retired marker's operands become exactly @object-ui/plugin-ai#*, and the three per-export FROM lines become one line naming the package (- FROM `@object-ui/plugin-ai` TO …). Keep the TO text.
    3. Read the merged predicate 2 (packageReference) on main: a non-comment occurrence of @object-ui/plugin-ai in any metadata surface outside the package refuses. Measure that every remaining mention in ui/packages/types/src/zod/*.zod.ts is in a comment span. If any is not, stop and report it, because that is a scope question.
    4. node scripts/check-adr-0087-registration.mjs --base origin/main must exit 0 (capture the exit before any pipe). pnpm changeset status must exit 0. Then run the derived gates on your full diff.
    5. pr_create with title refactor(ui)!: retire \@object-ui/plugin-ai` and its three node types(as #26365),Part of 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(not Fixes), andSupersedes refactor(ui)!: retire @object-ui/plugin-ai and its three node types #26365 in the body. Carry #26365's body forward and update it to the new head. Labels as on #26365 (documentation, dependencies, tests, tooling`). Report any reviewer request the relay run line shows.

    Scope

    File surface: #26365's surface as amended in claim 6428626219 (and /mnt/project-files/ui-25921/plugin-ai-surface.md if present), plus the merge resolution and the two changeset lines. ⛔ No skills/** edit (that is its own governed follow-up). ⛔ No change to the gate or the ADR.

    Tier and landing

    Your diff is over 3,000 lines (#26365 was +448/−7132), so it lands only by a human approval. Clause-②: no (narrowing) and Metadata-protocol: narrowed carry over from #26365. Quote dispatch-gates --tier on your surface. TIER_DEFAULT, effort medium. Hand back to the seat thread "Dispatch the ui lane" with the PR, head, the --base exit and the report gist. ⛔ Do not ready the PR or request reviewers.

  13. objectstack-fleet commented on Oct 28, 2026

    @objectstack-fleet
    Contributor

    Claim: PM loop round 10 · 2026-10-28T02:03Z
    Session: session_01JQwxbZeBv2y91towxasSUT (seat; implementation by card thread session session_01JQwxbYonqfPMAts3ErwZAK, mode:thread)
    Account: os-warren (the seat's linked user as GET /user answers it; the card's assignee)
    Branch: claude/project-thread-26wk5s (the card thread's harness push branch, self-reported — the measured platform exception to claude/issue-N-slug), started from origin/claude/project-thread-vl2c07 (PR #26365, head bde1e722), which it supersedes
    Worktree: objectstack-issue-25921 in the card thread's clone
    Domain: domain:ui
    Seat: domain:ui#1 (seat post #25966)
    File surface: partial, Part of #25921, the plugin-ai item only: #26365's surface as amended in claim 6428626219, plus the origin/main merge resolution and the two changeset lines the ruling assigns (the marker → @object-ui/plugin-ai#*, three per-export FROM lines → one package line). ⛔ No skills/**, gate or ADR edit (stop on breach; explain in the report)
    Container & model: M, mode:thread (the maintainer's word on the seat thread, 「opus 很多,并发5」), model: TIER_DEFAULT (the dev quotes dispatch-gates --tier on the surface), effort: medium
    Clause-②: no (narrowing)
    Metadata-protocol: narrowed
    Responsibility: retiring a zero-consumer published package (this lane's tech-debt) | ADR-0087 D9 now has the whole-package operand (#26220 → PR #26766, 4bce21da81) | plugin-ai stays published and gated red until this lands
    Thread-read: 6458637853
    Premise: holds — PR #26365 was held only on ADR-0087 D9 predicate 1 refusing a deleted package (release note 6441414853); the ruling on #26365 comment 6439038287 assigns exactly the two changeset edits once the clause lands, and it has.
    Serial constraints cleared: #26365 is a draft with no activity since 2026-10-27T10:07Z; its claim was released (6441414853). The seat closes it as superseded when the replacement PR is up.
    Resume-from: origin/claude/project-thread-vl2c07 bde1e722 (os-dev report 6430822447 and the release note 6441414853)


    Generated by Claude Code

  14. objectstack-fleet commented on Oct 28, 2026

    @objectstack-fleet
    Contributor

    os-dev-report

    {
      "issue": 25921,
      "status": "done",
      "branch": "claude/project-thread-26wk5s",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/27042",
      "session": "session_01JQwxbYonqfPMAts3ErwZAK",
      "premise_still_valid": true,
      "summary": "Replacement for #26365 per dispatch order 6458637853: branch started from origin/claude/project-thread-vl2c07 at bde1e7222c, origin/main acc9c57d0a merged as a merge commit (no rebase), then the two changeset edits ruling 6439038287 assigns: the runtime-export-retired marker names exactly @object-ui/plugin-ai#* and the three per-export FROM lines are one line naming the package, TO text kept. Head 7040d92f78, draft, Part of #25921, Supersedes #26365, assignee os-warren, labels documentation/dependencies/tests/tooling, no reviewer requested. check-adr-0087-registration --base origin/main exits 0 with the package operand verified; pnpm changeset status exits 0.",
      "tests": "At 7040d92f78: pnpm --dir ui exec vitest run packages/types packages/i18n packages/cli -> 511 files passed, 12453 passed, 13 skipped (lock VERDICT command-exit 0). pnpm --dir ui exec vitest run scripts/ at 53dfa40886 -> 178 files, 1 failed (markdown-test-inputs.test.ts: stale notRead packages/cli/README.md that main added via the plugin-ai README path), 5017 passed; fixed in 7040d92f78, that file rerun 17/17. type-check of @object-ui/types, @object-ui/i18n, @object-ui/cli exit 0 (script names echoed); pnpm --dir ui run type-check:scripts exit 0. turbo build with the root script's filters 115/115. No new ablation: the new pin and the arms it tests are #26365's, unchanged here (its ablation reading is carried in the PR body).",
      "gates": "dispatch-gates --commands at 53dfa40886 and again at 7040d92f78: same 56-family list. --ran: 56 derived, 56 run, 0 NOT-MEASURED. Exit 1: check-empty-changeset --base origin/main (DELIBERATE CORRECTION of .changeset/26080-readme-contributing-links.md, red by design until a maintainer confirms on the PR); vitest run scripts/ first run (fixed above). check:dts-closure exit 1, check:dual-build-cjs-loads and check:lean-entry-closure exit 3 before the build, all three exit 0 after it. All others exit 0, check-adr-0087-registration --base origin/main and its --self-test included. Outside the derived set: check-platform-checklist --changed-from origin/main exit 0 (0 anchored files). check:doc-authoring is not derived for this diff and was not run. CI on 7040d92f78: 69 check runs, 47 success, 19 skipped, 1 cancelled, 2 failure, both Check Changeset (job logs unreachable from this container; local replay: the ADR-0087 gate exits 0 and check-empty-changeset exits 1, so the red reads as the by-design correction). All nine required contexts success. dispatch-gates --tier: no path-derived mandate, TIER_DEFAULT; changed lines 7568 (+439/-7129) over the 3000 threshold, so it lands by an authorized approval.",
      "dogfood_battery": "7040d92f78 · os-verify-lock: VERDICT command-exit 0 · held the lock 1323s · Test Files 346 passed | 3 skipped (349) · Tests 2794 passed | 20 skipped (2814) · no failures",
      "mcp_calls": "0 GitHub MCP calls (subscribe_pr_activity x1 on #27042 is the claude-code-remote tool, not GitHub MCP)",
      "api_writes": "3 — git push x2 to claude/project-thread-26wk5s (53dfa40886, 7040d92f78); relay pr_create objectstack#27042 via fleet-write run 40622939142, body 10214 bytes sent and stored identical; plus this os-dev-report comment on #25921 via scripts/pm/post-stamped.mjs",
      "deviations": [
        "Step 3 stop-and-report: ui/packages/types/src/zod/ai.zod.ts names @object-ui/plugin-ai in CODE twice at HEAD (the two refusal remedy strings of the retired node arms), classified with the gate's own maskComments + packageReference; every other mention in zod/*.zod.ts is a comment. Predicate 2 reads the merge base, where all four mentions are comments, so the gate is green. Seat ruled A (proceed); recorded in the PR body's Acceptance notes.",
        "Those strings carry (objectstack#25921); no derived gate refused it, so per the seat it is left and noted.",
        "Forced edit from the merge, seat-accepted: deleted the one line naming @object-ui/plugin-ai from the pending .changeset/26080-readme-contributing-links.md; check-empty-changeset exits 1 on it (confirmation owed by a maintainer).",
        "Forced edit from the merge, seat-accepted: removed the plugin-ai row from CONTRIBUTING.md (the ui/README.md table moved there on main).",
        "Merge resolution: ui/README.md and ui/QUICK_REFERENCE.md keep main's deletion; ui/scripts/__tests__/package-files-exist.test.ts takes main's UI_PUBLISHED_PACKAGE_FLOOR (#26576), dropping #26365's lowered floors; ui/scripts/markdown-test-inputs.mjs drops the plugin-ai README reads and main's now-stale notRead entry.",
        "PR body folds .github/PULL_REQUEST_TEMPLATE.md headings (What changes, Verification, Human Minimum) into the os-dev order; line 1 is the platform attribution comment."
      ],
      "files_changed": "61 files vs merge base acc9c57d0 (+439/-7129)",
      "open_questions": [
        {
          "question": "Confirm the one-line deletion of '@object-ui/plugin-ai': patch from the pending .changeset/26080-readme-contributing-links.md?",
          "options": ["A confirm: the package no longer exists and changeset version would refuse it", "B restore it: the release run fails at changeset version"],
          "recommendation": "A, because a pending note naming a deleted package breaks the release run; same class as the earlier 25831 correction"
        }
      ],
      "body_amendments": [],
      "out_of_scope_findings": [
        "follow-up, not a finding: skills/objectui/guides/project-setup.md and page-builder.md still name @object-ui/plugin-ai; Tier H governed, separate PR · carrier: PR body · noted, not filed",
        "info: ui/.changeset/ pre-merge notes (13464, 13465, 25685) still name @object-ui/plugin-ai; not read by the root config · noted, not filed"
      ]
    }

    Generated by Claude Code

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