Repository navigation
Description
repo:cloud#3 · os-warren · session_01JQwxbZqfEd7pcckjz3pGqn
Filing gate: ① a product gap with a named location and a measured reproduction. It is a follow-up to #31801, which exported the planner, but its consumer still cannot reach it. Measured by the objectstack-ai/cloud#3862 card thread (session_01JQwxbadWGSGHtyrx8m5r94) before any build, on cloud f1405f5 at framework pin 2e9121ed. Not a security finding. ⛔ Not a claim.
Cloud consumer: objectstack-ai/cloud#3862. A hosted managed install must check a declared rename (renamedFrom) against the environment's columns before it writes desired state, and it must use the framework's planner with no planning logic in cloud. That card goes back to pm:blocked on this one.
维护者速读
- 问题:cloud-connection: expose the declared-rename install planner (planInstallDeclaredRenames) to a hosted control plane reading, through a kernel service #31801 已把"声明式重命名安装规划器"作为服务名(
marketplace-install-rename-planner)导出,但只有安装入口插件(MarketplaceInstallLocalPlugin)在init里注册它。不挂这个安装入口的内核拿不到规划器,托管环境内核就是这种情况。 - 影响:托管安装无法在写入前检查重命名,只能先接受、等环境重建时再被拒(cloud#3862 的问题)。为了拿到规划器而在每个租户内核上挂安装入口插件,又会把安装、卸载、重播、清除这些路由交给租户,正是 feat(cloud-connection): the install door's declared-rename planner is reachable read-only on a kernel service #31851 拆开的东西。
- 要做:提供一个不带安装入口的规划器挂载,例如一个只注册该服务的小插件,或者把规划器放到
manifest服务上。安装入口继续调用同一个实现。 - 需要你做的:无,分诊定车道。
Reproduction (cloud f1405f5, pin 2e9121ed)
| Kernel | getService('marketplace-install-rename-planner') |
|---|---|
A: cloud's ArtifactKernelFactory.create() (the hosted env kernel), requires: [] |
throws [Kernel] Service 'marketplace-install-rename-planner' not found |
| B: the same, with all 19 capability tokens | throws, same message |
C (control): bare ObjectKernel + ObjectQLPlugin + MarketplaceInstallLocalPlugin |
present; plan is a function |
Location (objectstack 2e9121ed)
packages/cloud-connection/src/marketplace-install-local-plugin.ts:1549: the planner is registered only insideMarketplaceInstallLocalPlugin.init(). The sameinitregisters the install door at:1528, andprovidesServices(:1473) declares both.:1552-1608: that plugin'sstart()rehydrates its file ledger and mounts the install-local HTTP routes (install, uninstall, reseed, purge) atkernel:ready.packages/cloud-connection/src/index.ts:37,43-51: the root exports the door plugin, the service name and the result types. There is no standalone planner plugin, and the planner body (planDeclaredRenames) is private to the door plugin.
Wanted
- A way to mount the planner with no door. For example, an exported plugin that registers only
marketplace-install-rename-plannerand needs only theobjectqlengine and its driver, or the planner offered on themanifestservice. The lane decides which. - The install door keeps calling the same planner entry, so there is one implementation.
- A test that a kernel with only that mount resolves the service and answers
plan(), and that it mounts no install route.
Done when
- On a kernel without
MarketplaceInstallLocalPlugin, the planner resolves and plans; no install-local route exists. - The door's existing declared-rename suites stay green.
Who acts
- Triage grades and routes it (cloud-connection: expose the declared-rename install planner (planInstallDeclaredRenames) to a hosted control plane reading, through a kernel service #31801 was cloud-connection). Cloud picks it up at its next pin round and then resumes cloud#3862.
Dedupe: repo:objectstack-ai/objectstack is:issue ""marketplace-install-rename-planner"": 1 hit, #31801 (closed, the export this follows up); "INSTALL_RENAME_PLANNER_SERVICE": 1 hit, #31801; "planDeclaredRenames": 1 hit, #31801; "planner without install door": 19 hits, none about a door-less mount (nearest #30885, closed, the rename carry itself).
Related: #31801, #31851, #31402, objectstack-ai/cloud#3862, objectstack-ai/cloud#3654.
Activity
objectstack-fleet commentedon Nov 9, 2026
triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U
Path: none
Triage:
domain:server· p2 ·pm:queue· 2026-11-09T10:54Z⛔ Not a claim.
domain:server,packages/cloud-connection. The declared-rename planner service is registered outside the install door's plugin, so a kernel without that door can still read it. Per [Decision]repo:cloudis used in two senses: 6 open cards are the cloud PM's whole (withdomain:cloud), 20 are objectstack-lane work that cloud asked for. Which one does the label mean? #31154 A, norepo:cloud. It follows cloud-connection: expose the declared-rename install planner (planInstallDeclaredRenames) to a hosted control plane reading, through a kernel service #31801.Generated by Claude Code
objectstack-fleet commentedon Nov 9, 2026
domain:server#3 · os-steve · session_01ADHkmQXLfvyB5R53VDm3Ka
Claim: PM loop round 12 · #31895 · 2026-11-09T11:42Z
Session:
session_01ADHkmQXLfvyB5R53VDm3Ka(seat); dev = card threadsession_01ADHkmRtcdMB6D762rioHpqAccount:
os-steveBranch:
claude/project-thread-pxdf8zWorktree: the card thread's checkout of
objectstack-ai/objectstackDomain:
domain:serverSeat:
domain:server#3File surface:
packages/cloud-connection/src/**: the planner moves to its own module, plus a new planner-only plugin and its root export;.changeset/31895-*.md.Stop on breach.
Container & model:
S–M,mode:thread,model: default tier,effort: mediumClause-②: no. This adds one export,
MarketplaceInstallRenamePlannerPlugin. The planner signature, its result types and the service name are unchanged. If step 0 shows that an existing export or service shape must change, the seat will re-state this line asyes.Metadata-protocol: none
Responsibility: n/a. This follows cloud-connection: expose the declared-rename install planner (planInstallDeclaredRenames) to a hosted control plane reading, through a kernel service #31801, and cloud#3862 is the consumer.
Thread-read: none
Premise: step 0 re-measures it on
mainwith a real kernel without the install door, wheregetServiceshould throw. Ifmainalready offers a mount without the door, the card goes back to the seat to be closed.Narrowing: no.
CONTROL:
Serial constraints cleared: cloud-connection: expose the declared-rename install planner (planInstallDeclaredRenames) to a hosted control plane reading, through a kernel service #31801's PR feat(cloud-connection): the install door's declared-rename planner is reachable read-only on a kernel service #31851 has merged. No open PR touches
marketplace-install-local-plugin.ts.Ruling: the seat's delta,
31895-delta.md:manifestservice.objectstack-fleet commentedon Nov 9, 2026
domain:server#3 · os-steve · session_01ADHkmRtcdMB6D762rioHpq
os-dev-report
{ "issue": 31895, "status": "done", "branch": "claude/project-thread-pxdf8z", "pr": "https://github.com/objectstack-ai/objectstack/pull/31929", "session": "session_01ADHkmRtcdMB6D762rioHpq", "premise_still_valid": true, "summary": "New MarketplaceInstallRenamePlannerPlugin (root export of @objectstack/cloud-connection) registers only marketplace-install-rename-planner: no route, no ledger, no rehydrate; objectql is read at plan() time. planDeclaredRenames, convertPackageBodyForward, packageUpgradeSideOf and the service object moved to marketplace-install-rename-planner.ts; the install door registers through the same registerInstallRenamePlanner, which skips when ctx.getServices() already holds the name, so both mounts work in either order. Planner signature, types, service name and the door's providesServices unchanged. Step 0 on origin/main 6a8f4151: door-less ObjectKernel+ObjectQLPlugin getService throws [Kernel] Service 'marketplace-install-rename-planner' not found; CONTROL with door: present; two init() registrations of one name: bootstrap rejects 'already registered', kernel stopped; no door-less mount on main. Cloud mount: await kernel.use(new ObjectQLPlugin()); await kernel.use(new MarketplaceInstallRenamePlannerPlugin());", "tests": "head f9562c4a. declared-rename harness: 27 passed (21 existing unedited + 6 new in one new top-level describe). pnpm --filter @objectstack/cloud-connection test: Test Files 80/80, Tests 1144/1144, VERDICT command-exit 0. typecheck (both programs, closure built with dts): VERDICT command-exit 0. Ablations via scripts/ablation-replace.mjs (src imports, no dist leg), each restored blob==HEAD, git diff HEAD empty: A plugin registers nothing -> 3 failed/24 passed; B presence check removed -> both-order pins red with 'already registered' (2 failed/25); C plugin also registers marketplace-install-local -> absence pins red (4 failed/23).", "gates": "dispatch-gates --commands at f9562c4a: 69 families, all exit 0 (check-plugin-teardown-shape --self-test first exited 3 on the shallow clone, 0 after fetching fixture commit 621a4876; check:dual-build-cjs-loads first exited 3 PREREQUISITE NOT MET, 0 after full packages build). --ran: 69 derived, 69 run, 0 NOT-MEASURED, 0 UNRUN (derived zero). pnpm lint: package has no lint script (ERR_PNPM_RECURSIVE_EXEC_FIRST_FAIL exit 254); eslint --no-inline-config on the 4 touched source files exit 0. CI check-runs: in_progress at report time.", "dogfood_battery": "n/a — no `!` in the PR title and no (narrowing) arm", "mcp_calls": "4 — issue_read get, issue_read get_comments x2, pull_request_read get; no write tool", "api_writes": "2 — relay pr_create (PR #31929, 8902 bytes sent == stored), post-stamped os-dev-report comment on #31895", "open_questions": [ { "question": "Clause-② on a new root export: claim says `no`; #31801 graded its new root exports `yes (widening)`.", "options": [ "A keep `no` as claimed", "B seat restates `yes (widening)` on the PR body and changeset" ], "recommendation": "B if the seat follows #31801's precedent; copied as claimed meanwhile." }, { "question": "New public names: plugin class MarketplaceInstallRenamePlannerPlugin (seat-named) and plugin name com.objectstack.runtime.marketplace-install-rename-planner (mirrors the door's com.objectstack.runtime.marketplace-install-local).", "options": [ "A keep", "B rename" ], "recommendation": "A" }, { "question": "The plugin declares no dependencies/optionalDependencies on ObjectQLPlugin, since init reads nothing and plan() resolves objectql lazily (no engine -> the door's own transport refusal).", "options": [ "A keep lazy, no declaration", "B hard dependency on com.objectstack.engine.objectql" ], "recommendation": "A: a hard dependency would refuse a boot the planner can still answer, and the door declares none either." } ], "security_findings": "none", "out_of_scope_findings": [], "files_changed": [ ".changeset/31895-install-rename-planner-plugin.md", "packages/cloud-connection/src/index.ts", "packages/cloud-connection/src/marketplace-install-rename-planner.ts", "packages/cloud-connection/src/marketplace-install-local-plugin.ts", "packages/cloud-connection/src/marketplace-install-local-declared-rename.test.ts" ], "line_budget": "+305 / -57 over 5 files (dispatch-gates count), under the 3000 human-merge threshold", "deviations": [ "changeset patch instead of the delta's minor: check-changeset-no-major refuses minor beside Metadata-protocol: none (AGENTS.md: level follows the metadata protocol alone)", "origin/main moved 6 commits after branch point (6a8f4151 -> 17606e46), none in cloud-connection or the planner's imports; not merged before the PR", "PR assignee/reviewer not set: the session's platform asked for MCP issue_write/update_pull_request, refused by standard order rule 3 and os-dev rule 2", "no PR-activity subscription: os-dev contract overrides the platform's subscribe posture; CI convergence is the seat's" ] }Stamped 2026-11-09T12:30Z.
Generated by Claude Code
objectstack-fleet commentedon Nov 9, 2026
domain:server#3 · os-steve · session_01ADHkmQXLfvyB5R53VDm3Ka
Claim amendment · #31895 · 2026-11-09T12:31Z · amends Claim 6739196106
Clause-②: yes (widening). The package root gains
MarketplaceInstallRenamePlannerPluginand theregisterInstallRenamePlannerseam. This matches how #31801 recorded its new root export. Nothing existing narrows: the planner signature, its result types, the service name and the door'sprovidesServicesare unchanged. Metadata-protocol staysnone, so the changeset stayspatch(maintainer ruling A on #25105).objectstack-fleet commentedon Nov 9, 2026
domain:server#3 · os-steve · session_01ADHkmQXLfvyB5R53VDm3Ka
Landed · #31895 · 2026-11-09T13:33Z
e0c2720c, from headd0545986(seat ACCEPT 6740577589).completedbyFixes #31895pm:dispatchedis removed in this stroke.MarketplaceInstallRenamePlannerPlugin, exported from the@objectstack/cloud-connectionroot, registers onlymarketplace-install-rename-planner, so a kernel without the install door can plan declared renames. The door and the plugin share one implementation, and mounting both, in either order, registers the service once.For cloud#3862, at its next framework pin:
await kernel.use(new ObjectQLPlugin()); await kernel.use(new MarketplaceInstallRenamePlannerPlugin());feat(cloud-connection): mount the declared-rename planner without the…