Repository navigation
retire the zero-consumer surface: nine dead modules (2,211 LOC), plugin-ai, runner's publish flag, test-only reset helpers on public barrels, the providers trio, 122 dead i18n keys, root orphans #25921
Description
Ruled (plugin-ai): 6398569691 · letter A · 2026-10-25T13:58:53Z (retire @object-ui/plugin-ai: package, locale ai.* block, fixed-group entry, types/zod mirrors tombstoned; minor changeset with a breaking note)
维护者速读
一批每项都是 S、合起来可观的退役:9 个整文件模块共 2,211 行只有自己的 barrel 引用;@object-ui/plugin-ai 发布着却没有任何加载者(console 的 register-plugins.ts 不含它);runner 是无入口的 Vite 应用却 private: false 且在 fixed 发版组;公共 barrel 上有 9 个 reset*ForTesting 类助手;@object-ui/providers 与 @object-ui/react 同名的 provider 三件套只有一个示例在用;check-i18n-dead-keys 报告 122 个 CONFIRMED 死键(×10 语种);根目录若干孤儿。按 objectui#11608→#11616(PartialSchema)先例逐包一个 ! changeset。不加新门禁。
Measured (2026-10-24, HEAD 7981384; every absence claim ran with a positive control, SchemaRenderer 1,030 hits / plugin-map 144 files)
- Whole modules with zero consumers outside the package AND zero in-package importers (only the barrel line):
core/src/builder/schema-builder.ts451 LOC,core/src/protocols/DndProtocol.ts237,KeyboardProtocol.ts222,SharingProtocol.ts212 (their names appear only inside comments intypes/src/index.ts),react/src/hooks/useFocusManagement.ts248,useFocusTrap.ts138,usePageTransition.ts187,useSchemaPersistence.ts373,collaboration/src/LiveCursors.tsx143 — total 2,211 LOC. Repo-wide barrel census: 1,422 of 3,578 exported names have zero non-test code consumers outside their package (636 value exports, 402 of those also undocumented); worst ratios plugin-gantt 22/35, plugin-designer 16/38, collaboration 19/40, mobile 18/51. @object-ui/plugin-ai(736 LOC; registersai-form-assist,ai-recommendations,nl-query): 0 source importers; absent fromapps/console/src/register-plugins.tsandapps/console/vite.config.ts; owns anai.*block in every locale pack (26 lines inen.ts); listed in.changeset/config.json's fixed group.packages/runner: a Vite app (main.tsx,App.tsx, no barrel),private: false, nomain/exports, in the fixed release group;packages/cli/src/__tests__/workspace-vite.test.tsasserts it is not aliased.- Test-only helpers on public barrels with 0 non-test consumers:
resetColumnIdentityWarnings,resetRetiredSortSpellingReports,resetActionKeyWarnings,resetDashboardFilterWarnings,resetReferenceKeyWarnings(core),resetRuntimeConfigForTesting(app-shell),resetInflightGetsForTesting(types),__clearRecordEditableCache(plugin-detail),clearSharedDiscoveryCache(data-objectstack). @object-ui/providersexportsDataSourceProvider,MetadataProvider,ThemeProvider(+hooks), the same six names@object-ui/reactexports with different implementations; the providers trio's only non-test importer isexamples/byo-backend-console/src/App.tsx(react's: 21 files);one-authority-per-exported-name-6273.test.tscarries hand-written exemptions for the collision. Its real content isUploadProvider(450 of 617 LOC; fields 11 sites) andcreateObjectStackUploadAdapter— fetch logic outsidedata-*, against AGENTS §3.node scripts/check-i18n-dead-keys.mjsprints "391 candidate(s) … 122 CONFIRMED (no textual footprint anywhere else in the repo either), 269 NEEDS-REVIEW" (e.g.appDesigner.*20 keys,preview.changes.typeCount.*22); the script is wired to no workflow.- Root / config orphans:
scripts/eval-console.mjs(hard-coded/Users/zhuangjianguo/.copilot/...output path) andscripts/release-bump.cjsreferenced by nothing;paseo.json(0 references; itssetupteachespnpm iagainst the frozen-lockfile rule);typedoc.json+typedocdevDep +docs:api(no workflow);lazy-test.mjs(only an exemption glob incheck-lint-rule-coverage.mjs);playwright.import-harness.config.tsandplaywright.import-console.config.ts(1 spec each, no workflow);mswdeclared in root, plugin-form, plugin-grid with 0 imports pluspublic/mockServiceWorker.js;apps/consoledevDeps@dnd-kit/core|sortable|utilitiesandautoprefixerwith 0 references;docs/CONSOLE-STREAMLINING-SUMMARY.mdnames two packages that do not exist (@object-ui/routing,@object-ui/console-components).
Recommendation (each S; one PR per package or group)
- Delete the nine modules and their barrel lines (one
!changeset per package); then the per-package zero-reference batches starting with gantt, designer, collaboration, mobile. -
plugin-ai:maintainer decision — retire (package, locale block, fixed-group entry) or wire it inRuled A (6398569691): retire the package, the locale block and the fixed-group entry; tombstone the types/zod mirrors.register-plugins.tslikeplugin-markdown. -
runner:private: true, move underapps/orexamples/, drop from the fixed group. - Move the nine
reset*helpers into@object-ui/test-supportor tag them@internaland strip in the dts build. -
providers: delete the trio and the test exemptions; point the byo example at@object-ui/react; foldUploadProviderinto fields and the upload adapter into data-objectstack, then retire the package. - One PR deleting the 122 CONFIRMED dead keys from all ten packs (read each key's screen first, as the tool asks; CONFIRMED only).
- Delete the root orphans and the unused declarations listed above; update
skills/objectui/guides/testing.md, which still teaches msw.
Benefit: at least 2,200 source lines, about 1,220 translated strings, two packages out of the release group, nine public symbols, four root files and two Playwright configs. External npm consumers are 未实测; rollback is a revert per item.
Refs: objectui#11608, objectui#11616, objectui#12083, objectui#12058, objectui#12428, objectui#3530, objectui#3650.
Filed by the read-only whole-repo review session https://claude.ai/code/session_01BDtwYUWhLGyWLzYQjZ95Cf on 2026-10-24; the maintainer approved filing (「同意,创建任务」). Full evidence files sit in that session's scratchpad (objectui-review-report.md, findings-*.md). ⛔ Not a claim; for triage to grade and route. Graded; the plugin-ai bullet is ruled (see the first line).
Activity
objectstack-fleet commentedon Oct 24, 2026
Triage: first grade —
tech-debt·priority:p3·domain:ui·area:devpath·pm:queue· triage seat ·session_01AavokzJ5DndAwitDXvKy4U· 2026-10-24T15:00Z⛔ Not a claim, ⛔ not a dispatch.
findingcomes off.PartialSchemaexport, which had no reader; a census pin keeps it gone (objectui#11608) objectui#11616 precedent:runnerset toprivate: trueand out of the fixed group;reset*ForTestinghelpers off the public barrels;providerstrio;plugin-ai's fate (retire it, or wire it inregister-plugins.ts) cuts or keeps a product surface. It goes to the maintainer, and it stays out of these PRs until ruled.Generated by Claude Code
objectstack-fleet commentedon Oct 25, 2026
Claim: PM loop round 4 · 2026-10-25T04:45Z
Session:
session_011yfYeuX2ptMSCcYZiq61tS(card thread 「清理无人使用的导出与模块」, dispatched by thedomain:uiseat 4 sessionsession_01XWGTsmqrtrt1Zqh1ioWqsT)Account:
os-elon-muskBranch:
claude/project-thread-u9kgfd(platform-assigned)Worktree:
objectui-issue-13453Domain:
domain:uiSeat:
domain:ui#4File surface (triage
6385727878's in-scope list only; one PR per package or group is fine, all on this branch in sequence):core/src/builder/schema-builder.ts,core/src/protocols/{Dnd,Keyboard,Sharing}Protocol.ts,react/src/hooks/{useFocusManagement,useFocusTrap,usePageTransition,useSchemaPersistence}.ts,collaboration/src/LiveCursors.tsx(plus the comment mentions intypes/src/index.ts);packages/runner/package.json→private: true, and its entry out of.changeset/config.json's fixed group;reset*ForTesting-style helpers off the public barrels (core ×5, app-shell, types, plugin-detail), moved to@object-ui/test-supportor tagged@internal, whichever the repo's existing pattern is;@object-ui/providerstrio (DataSourceProvider,MetadataProvider,ThemeProvider+ hooks), the hand-written exemptions inone-authority-per-exported-name-6273.test.ts, andexamples/byo-backend-console/src/App.tsxrepointed at@object-ui/react;(Stop on breach; explain in the report.)
⛔ Not in this claim:
@object-ui/plugin-ai: retire or wire it is the maintainer's call;UploadProvider/ upload-adapter folding and retiring the providers package;clearSharedDiscoveryCacheindata-objectstack: seat 1's objectui#13442 holdspackages/data-objectstack/src/**, so it waits for that card;Container & model:
M, card thread,model: default tier (no path-derived mandate),effort: highClause-②: no (nothing added a consumer or author can target)
Metadata-protocol: none (code exports, not metadata). Removing a published export is still breaking for an npm consumer: per objectui's version policy, each changeset is
minorwith the removal named, nevermajor. Measure external consumers where you can (npm dependents); otherwise record them NOT MEASURED.Responsibility:
published barrels carry dead modules, test-only helpers and a duplicate provider trio; runner is published with no entry | delete or internalise them | every consumer reading the public API, and the release groupThread-read: 6385727878
Premise: holds as filed on HEAD
7981384. Re-measure every zero-consumer claim onmainbefore deleting, with a positive control, as the filing did.Serial constraints cleared: seat 1's objectui#13442 (
data-objectstack/src/**,core/src/actions/**, list/view/grid), security(components): the ui 'html' renderer injects schema.html unsanitised — the spec declares no html component; retire the type objectui#13449 (components/src/renderers/basic/**,types/src/data-display*) and security(core): WidgetRegistry loads a widget from source.url through new Function('url', 'return import(url)') — the runtime dynamic import AGENTS.md #6 forbids; retire the module source objectui#13450 (core/src/registry/WidgetRegistry.ts,types/src/widget.ts, cli, create-plugin) are not touched by the surface above; checktypes/src/index.tsagainst security(core): WidgetRegistry loads a widget from source.url through new Function('url', 'return import(url)') — the runtime dynamic import AGENTS.md #6 forbids; retire the module source objectui#13450 before editing it. Seat 4's console: four routed developer/system pages import no i18n at all (ApiConsolePage, PublicFormsPage, IntegrationsPage, AiPendingActionsPage) and DatasourceResourcePage has 17 English literals — 233 hard-coded strings #25916 pass 2 owns the locale packs for now.Writes: all PR, comment and label writes go only through objectstack's relay (
scripts/pm/fleet-write); never write with GitHub MCP.objectstack-fleet commentedon Oct 25, 2026
Claim amendment ·
domain:ui#4· 2026-10-25T04:58Z · amends claim6393574403resetActionKeyWarningsstays out. It lives incore/src/actions/actionKeys.tsand reaches the core barrel throughcore/src/actions/index.ts(export *), and seat 1's objectui#13442 holdscore/src/actions/**. It waits for that card, asclearSharedDiscoveryCachedoes. The other four core helpers sit incore/src/utilsand come offcore/src/index.ts.skills/objectui/guides/project-setup.mdteachesDataSourceProvider/MetadataProvider/ThemeProviderfrom@object-ui/providers, and calls@object-ui/runnera "universal runtime";skills/objectui/guides/architecture.mddoes the same.skills/**is governed, so this PR is Tier H (it waits for GOVERNED_APPROVERS). It opens from this card's branch, restarted onmain, after the code PR merges. The code PR stays Tier S and names both files under a follow-up line. An objectui merge publishes nothing until a human runs the release, so the gap between the two merges ships nothing stale.Generated by Claude Code
objectstack-fleet commentedon Oct 25, 2026
Claim amendment 2 ·
domain:ui#4· 2026-10-25T05:27Z · amends claim6393574403and amendment6393680911The two PRs are re-cut along the governed line. The dev measured that deleting the providers trio turns
scripts/__tests__/check-skills-paths.test.tsred. The cause is.claude/skills/objectui-contributor/guides/console-development.md, which namespackages/providers/src/MetadataProvider.tsx. So whichever PR deletes the trio must also edit a governed.claude/**file.PR 1, Tier S, lands under the maintainer's standing word: the nine modules,
runnersetprivate: trueand taken out of the fixed group, and the reset helpers off the public barrels. It contains no providers change and no.claude/**orskills/**edit.PR 2, Tier H, waits for GOVERNED_APPROVERS:
.claude/skills/objectui-contributor/guides/console-development.mdsentence;skills/objectui/guides/project-setup.mdandarchitecture.md, which still teach the trio and therunner"universal runtime".It opens from this card's branch, restarted on
main, after PR 1 merges.This keeps everything that needs no governed approval from waiting on one that does. Clause-② and Metadata-protocol are unchanged (no / none).
Generated by Claude Code
docs(quick-reference): count runner among the private packages (#13453)
22 remaining items
objectstack-fleet commentedon Oct 26, 2026
Claim amendment (seat
domain:ui#1, 2026-10-26T22:15Z): amends the claim6428606072at the card thread's request, after its read-only re-measure onorigin/mainb9cd9809. 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:ui/packages/plugin-ai/**, itspnpm-lock.yamlimporter and theui/vitest.config.mtsalias line..changeset/config.jsonfixed-group entry, and the plugin-ai line in the pending.changeset/25831-object-ui-18-1-to-merge.md.ai.*block in the ten locale packs; re-recordi18n.json.ui/packages/types/src/ai.ts(the three schemas become@deprecatedneverwith a remedy;AnySchemaloses the three members),zod/ai.zod.tsandzod/index.zod.ts(refusal arms on theretiredNodeTypeprecedent),zod/README.md, the types tests that pin those arms; re-recordtypes.json.ui/packages/cli/src/utils/known-schema-types.ts(three keys) and its ratchet test.console-vite-alias-closure-4925gets a replacement negative control, named in the body.ui/content/docs/plugins/plugin-ai.mdx+meta.json, theui/README.mdrow..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 mergesmainand re-records. Draft until both lines clear.objectstack-fleet commentedon Oct 27, 2026
席位核对 · Blocked-by · seat
domain:ui#1· 2026-10-27T00:10ZBlocked-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:runtime-export-retiredoperands, because plugin-ai's entry issrc/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.check-empty-changesetis 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 breakschangeset version. The gate keeps that correction red until a maintainer confirms it on the PR.The card stays
pm:dispatchedwith its thread parked. When #26220's parts 3–4 land, the PR mergesmain, re-recordsi18n.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}.mdstill name plugin-ai.objectstack-fleet commentedon Oct 27, 2026
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
objectstack-fleet commentedon Oct 27, 2026
Seat note · claim released (lane standing down) · seat
domain:ui#1· 2026-10-27T12:03ZThe 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 withmainafter 18.2.0 shipped, and its body is current.changeset statusexits 0.Waiting on the maintainer (asked 2026-10-27 05:15Z):
@object-ui/plugin-aiand its three node types #26365 switches to aregistereddisposition.The seat recommended A. Whoever picks this up: apply the answer, then land #26365. If #26576 has merged, #26365 also merges
mainto 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.objectstack-fleet commentedon Oct 27, 2026
Evidence for the
playwright.import-harness.config.tsrow, from the devx lane (card #26625, os-dev report 6454513202):ui/packages/plugin-grid/demo/vite.live.config.tsat/live.html. Neither file exists:demo/holdsindex.html,bulk-actions.html,main.tsx,bulk-actions.tsx,sample.csvandsample.xlsx(checked at1708115e2fand again on main today).ui/e2e/import-harness/import-undo.spec.tscan only self-skip. Its CSV (first_name,last_name,email) also has no column forcrm_lead's requiredname, so it would not pass even if the harness were served.playwright.import-console.config.ts,import-job-undo-cancelspec) does pass against adev:crmboot 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
docs(qa): records-forms drops a stale knownGaps sentence and points t…
objectstack-fleet commentedon Oct 28, 2026
Dispatch order ·
domain:ui#1·session_01JQwxbZeBv2y91towxasSUT· 2026-10-28T02:00ZYou are the os-dev developer agent for exactly ONE card: #25921, in your own card thread. Your role definition is
.claude/agents/os-dev.mdin 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-rootAGENTS.mdandui/AGENTS.mdbefore your first edit, and pm-dispatchreferences/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; itsBranch:line names your thread's branch. ⛔ Post no claim of your own, ⛔ never write the card's assignee. Before your first edit, verify the NEWESTClaim: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. Worktreeobjectstack-issue-25921on that branch from a freshorigin/main;pnpm install(frozen lockfile); push withgit 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-runfirst); your report comment throughnode scripts/pm/post-stamped.mjs --comment=25921 --file=F --jsonrun 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 onerun_rerun_failedthrough the relay. Report both counts (api_writeswith endpoints,mcp_callswith 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/objectstackon 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 rootci.ymlare 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, headbde1e722, 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 as4bce21da81, 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 toclaude/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 andcheck-adr-0087-registration --base origin/maingoes green, after which #26365 lands by its own Tier H approval (over 3,000 lines). The twoskills/objectui/guides/*mentions stay in their own governed follow-up as the body says." Plugin-ai's retirement itself is ruling A on comment6398569691, also not re-ruled.Steps
origin/claude/project-thread-vl2c07, not from a freshorigin/main(this overrides the header line above). Thengit merge origin/mainas a merge commit, with no rebase. Resolve conflicts keeping main's side outside plugin-ai's surface, and regeneratepnpm-lock.yamlwith 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.runtime-export-retiredmarker'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.packageReference) on main: a non-comment occurrence of@object-ui/plugin-aiin any metadata surface outside the package refuses. Measure that every remaining mention inui/packages/types/src/zod/*.zod.tsis in a comment span. If any is not, stop and report it, because that is a scope question.node scripts/check-adr-0087-registration.mjs --base origin/mainmust exit 0 (capture the exit before any pipe).pnpm changeset statusmust exit 0. Then run the derived gates on your full diff.pr_createwith titlerefactor(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-aiand its three node types #26365in 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.mdif present), plus the merge resolution and the two changeset lines. ⛔ Noskills/**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)andMetadata-protocol: narrowedcarry over from #26365. Quotedispatch-gates --tieron your surface.TIER_DEFAULT, effortmedium. Hand back to the seat thread "Dispatch the ui lane" with the PR, head, the--baseexit and the report gist. ⛔ Do not ready the PR or request reviewers.objectstack-fleet commentedon Oct 28, 2026
Claim: PM loop round 10 · 2026-10-28T02:03Z
Session:
session_01JQwxbZeBv2y91towxasSUT(seat; implementation by card thread sessionsession_01JQwxbYonqfPMAts3ErwZAK,mode:thread)Account:
os-warren(the seat's linked user asGET /useranswers it; the card's assignee)Branch:
claude/project-thread-26wk5s(the card thread's harness push branch, self-reported — the measured platform exception toclaude/issue-N-slug), started fromorigin/claude/project-thread-vl2c07(PR #26365, headbde1e722), which it supersedesWorktree:
objectstack-issue-25921in the card thread's cloneDomain:
domain:uiSeat:
domain:ui#1(seat post #25966)File surface: partial,
Part of #25921, the plugin-ai item only: #26365's surface as amended in claim6428626219, plus theorigin/mainmerge resolution and the two changeset lines the ruling assigns (the marker →@object-ui/plugin-ai#*, three per-export FROM lines → one package line). ⛔ Noskills/**, 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 quotesdispatch-gates --tieron the surface),effort: mediumClause-②: 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 landsThread-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
6439038287assigns 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-vl2c07bde1e722(os-dev report 6430822447 and the release note 6441414853)Generated by Claude Code
objectstack-fleet commentedon Oct 28, 2026
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