You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Console marketplace: the hosted (cloud) install path sends installMode and shows the managed/unmanaged picker; today only the install-local page offers it (cloud#3624) #30963
Filing gate: ④ coordination, a framework half of objectstack-ai/cloud#3624. That card's ruling is A, maintainer 「A + 两边审计 + 转发安装人(推荐)」, record objectstack-ai/cloud#3624 comment 6686728844 (2026-11-06T14:06Z): one install door, with installMode as an optional parameter the control plane judges. Carrier split: the console installPackage() and the environment CloudConnectionPlugin are framework code, each filed as its own objectstack card.
Business reason. Starter templates built to be owned (unmanaged) arrive managed on hosted cloud, because the console's cloud install path cannot name the mode.
Reader who acts. The lane owning ui/packages/app-shell (triage sets lane and grade).
Dedupe:installPackage installMode → no card.
Measured (pin c50e0dfa, cloud dev reading relayed on objectstack-ai/cloud#3624 comment 6686030999)
ui/packages/app-shell/src/console/marketplace/marketplaceApi.tsinstallPackage() sends package_id and seed_sample_data only.
The picker (MarketplacePackagePage.tsx) exists only on the install-local path, gated on features.installLocal, which hosted sets to false.
Ask
installPackage() takes an optional installMode (the spec's INSTALL_MODES values) and sends it.
On the cloud path, show the picker when the package's installModes permits more than managed, read through the same resolver the install-local page uses.
Refusals come back as the framework's codes; render them as the install-local page does.
Acceptance note from the ruling: an unmanaged copy does not appear in the marketplace "Installed" list, which reads sys_package_installation. It appears as the environment's own base, and that is not a bug.
Claim: PM loop round 8 · 2026-11-06T15:01Z
Session: session_01L9qibvheaSFqtp67rMBRSE (card thread, dev) · seat session_01L9qibw7DekEe3wx5f3zphf
Account: os-tesla
Branch: claude/project-thread-zcqlte (a cloud card thread can push only its designated branch)
Worktree: objectstack-issue-30963
Domain: domain:ui
Seat: domain:ui#2
File surface: ui/packages/app-shell/src/console/marketplace/** and its tests, console i18n keys in ui/packages/i18n (all languages, whichever pack file names are on main), root .changeset/
Container & model: M, mode:thread, model: default tier (dispatch-gates --tier: no path-derived mandate), effort: high
Clause-②: no
Metadata-protocol: none
Responsibility: n/a — not a defect card (console half of objectstack-ai/cloud#3624 ruling A, comment 6686728844)
Thread-read: 6687773953
Premise: holds (on main hosted installPackage() sends only package_id and seed_sample_data; the picker is gated on features.installLocal) · measured by the dev first
Serial constraints: end to end needs #30964 (domain:server, pm:blocked), the environment's CloudConnectionPlugin forwarding the mode. The parameter is optional and ignored downstream until then; unit and harness readings are the proof. Split notice 6687863038 to domain:ui#3. #30902 (this seat) renames the zh/pt pack files; new keys follow the names on main at push.
{
"issue": 30963,
"status": "done",
"branch": "claude/project-thread-zcqlte",
"pr": "https://github.com/objectstack-ai/objectstack/pull/30992",
"session": "session_01L9qibvheaSFqtp67rMBRSE",
"premise_still_valid": true,
"summary": "installPackage() takes an optional installMode typed from the spec's INSTALL_MODES (LocalInstallMode = spec InstallMode) and sends it as install_mode only when set, on the hosted cloud-connection route (top-level body key) and the control-plane action (inside params). On the hosted path (cloud base, no install-local) the package page reads installModes through declaredInstallModesOf over the served manifest, draws the same choice, sends the resolved mode except when nothing beyond managed is permitted (byte-identical body, pinned), and reads the answer as install-local does (installMode unmanaged = copy success; requested copy without it = unmanagedIgnored). One installRefusalText helper serves both install doors; the hosted error now carries envelope details. Wire key used: install_mode.",
"tests": "head 374cdc9c. pnpm --dir ui exec vitest run --maxWorkers=2 packages/app-shell/src/console/marketplace/ (verify lock): Test Files 55 passed (55), Tests 485 passed (485). installMode-12288 file: base page code 14 failed / 18 passed (32), fix 32 passed. Before/after harness reading (probe not committed): before manifestRead=false radios=0 body={package_id,seed_sample_data:false} for both/managed-only/absent; after both: radios=2, Install disabled before pick, body adds install_mode:unmanaged; managed-only and absent bodies unchanged. Ablations via scripts/ablation-replace.mjs (source-resolved subject, no dist): A hostedInstallMode forced undefined -> 4 failed; B managed-only guard removed -> 1 failed; C hosted catch bypasses installRefusalText -> 1 failed; each restored, blob == HEAD, git diff HEAD empty.",
"gates": "dispatch-gates --commands --repo objectstack-ai/objectstack on 374cdc9c: 36 commands, all ':: exit 0' (record gates-ran-374cdc9c.list); --ran: 36 derived, 36 run, 0 NOT-MEASURED. Includes check-sdui-manifest.mjs + --self-test, check:nul-bytes, ui vitest scripts/. app-shell type-check (tsc --noEmit + tsconfig.test.json, after env -u OS_SKIP_DTS build of @object-ui/app-shell^...): VERDICT command-exit 0. ui check:new-line-citations: 0 new. eslint 3 files: 0 errors. CI check-runs: in_progress at report time.",
"line_budget": "321 changed lines (+278/-43), 4 files, under 3000",
"files_changed": [
".changeset/30963-hosted-install-mode.md",
"ui/packages/app-shell/src/console/marketplace/MarketplacePackagePage.tsx",
"ui/packages/app-shell/src/console/marketplace/marketplaceApi.ts",
"ui/packages/app-shell/src/console/marketplace/__tests__/MarketplacePackagePage.installMode-12288.test.tsx"
],
"deviations": [
"Added beyond the Ask's three items: the hosted answer is read like install-local's (unmanaged success / unmanagedIgnored), so a pick that #30964 does not yet forward is said out loud instead of reading as success; assumes the hosted answer names installMode like install-local's",
"Picker drawn only where getCloudBase() is set and install-local is off, not on the control plane's own console (copy text says this runtime); installPackage still sends a given mode on that branch",
"eslint warnings 52 -> 53 on the two source files: one no-explicit-any, (err as any).details, mirroring installLocal's existing spelling",
"test:repo not run locally (not named by the derivation); full farm is CI's"
],
"dogfood_battery": "n/a — no ! in the PR title and no (narrowing) arm",
"mcp_calls": "0 — no GitHub MCP calls",
"api_writes": "2 — relay pr_create (objectstack-ai/objectstack#30992, run 42248591918); post-stamped comment on #30963 (this report). Plus git push of the thread branch (not REST).",
"open_questions": [
{
"question": "Which answer shape does #30964 give the hosted unmanaged install?",
"options": [
"A answer installMode: 'unmanaged' with targetPackageId and version, as install-local does",
"B another shape, and this page is adjusted when #30964 lands"
],
"recommendation": "A, because the page then needs no change and one reader serves both doors"
}
],
"security_findings": "none",
"out_of_scope_findings": [
"carrier: #30964 · the hosted dialog still offers Include sample data on an unmanaged pick; what the control plane does with seed_sample_data on a copy is #30964's and cloud's · noted in Acceptance notes, not filed",
"carrier: #30964 · stripped-locks list not drawn on the hosted path until #30964 defines the hosted answer · noted, not filed"
]
}
ACCEPT → PR #30992 comment 6689743008 · 2026-11-06T16:23Z · head 374cdc9c (hosted install sends an optional install_mode, picker on the environment console; 321 lines, Tier S path, Fixes #30963). Landing through the merge queue. End to end rides on #30964.
pm:dispatched removed. End to end rides on #30964 (domain:server, pm:blocked): until the environment's CloudConnectionPlugin forwards the mode, a hosted request for a copy installs managed and says so.
Activity
objectstack-fleet commentedon Nov 6, 2026
triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U
Path: none
Triage: audit · p2 ·
domain:ui· 2026-11-06T14:54Z⛔ Not a claim.
installPackage()sends an optionalinstallMode, and the hosted install path shows the managed / unmanaged picker through the resolver the install-local page uses.domain:ui(ui/packages/app-shell), followed byrepo:cloud. p2, the same as CloudConnectionPlugin: forward installMode and the installing user to the control plane, run importUnmanagedPackage on an unmanaged grant, and audit the copy's result in the environment (cloud#3624) #30964.pm:queue.Generated by Claude Code
objectstack-fleet commentedon Nov 6, 2026
domain:ui#2 · os-tesla · session_01L9qibw7DekEe3wx5f3zphf
Claim: PM loop round 8 · 2026-11-06T15:01Z
Session:
session_01L9qibvheaSFqtp67rMBRSE(card thread, dev) · seatsession_01L9qibw7DekEe3wx5f3zphfAccount:
os-teslaBranch:
claude/project-thread-zcqlte(a cloud card thread can push only its designated branch)Worktree:
objectstack-issue-30963Domain:
domain:uiSeat:
domain:ui#2File surface:
ui/packages/app-shell/src/console/marketplace/**and its tests, console i18n keys inui/packages/i18n(all languages, whichever pack file names are onmain), root.changeset/Container & model: M,
mode:thread,model: default tier(dispatch-gates --tier: no path-derived mandate),effort: highClause-②: no
Metadata-protocol: none
Responsibility: n/a — not a defect card (console half of objectstack-ai/cloud#3624 ruling A, comment 6686728844)
Thread-read: 6687773953
Premise: holds (on
mainhostedinstallPackage()sends onlypackage_idandseed_sample_data; the picker is gated onfeatures.installLocal) · measured by the dev firstSerial constraints: end to end needs #30964 (
domain:server,pm:blocked), the environment'sCloudConnectionPluginforwarding the mode. The parameter is optional and ignored downstream until then; unit and harness readings are the proof. Split notice 6687863038 todomain:ui#3. #30902 (this seat) renames the zh/pt pack files; new keys follow the names onmainat push.objectstack-fleet commentedon Nov 6, 2026
domain:ui#2 · os-tesla · session_01L9qibvheaSFqtp67rMBRSE
os-dev-report
{ "issue": 30963, "status": "done", "branch": "claude/project-thread-zcqlte", "pr": "https://github.com/objectstack-ai/objectstack/pull/30992", "session": "session_01L9qibvheaSFqtp67rMBRSE", "premise_still_valid": true, "summary": "installPackage() takes an optional installMode typed from the spec's INSTALL_MODES (LocalInstallMode = spec InstallMode) and sends it as install_mode only when set, on the hosted cloud-connection route (top-level body key) and the control-plane action (inside params). On the hosted path (cloud base, no install-local) the package page reads installModes through declaredInstallModesOf over the served manifest, draws the same choice, sends the resolved mode except when nothing beyond managed is permitted (byte-identical body, pinned), and reads the answer as install-local does (installMode unmanaged = copy success; requested copy without it = unmanagedIgnored). One installRefusalText helper serves both install doors; the hosted error now carries envelope details. Wire key used: install_mode.", "tests": "head 374cdc9c. pnpm --dir ui exec vitest run --maxWorkers=2 packages/app-shell/src/console/marketplace/ (verify lock): Test Files 55 passed (55), Tests 485 passed (485). installMode-12288 file: base page code 14 failed / 18 passed (32), fix 32 passed. Before/after harness reading (probe not committed): before manifestRead=false radios=0 body={package_id,seed_sample_data:false} for both/managed-only/absent; after both: radios=2, Install disabled before pick, body adds install_mode:unmanaged; managed-only and absent bodies unchanged. Ablations via scripts/ablation-replace.mjs (source-resolved subject, no dist): A hostedInstallMode forced undefined -> 4 failed; B managed-only guard removed -> 1 failed; C hosted catch bypasses installRefusalText -> 1 failed; each restored, blob == HEAD, git diff HEAD empty.", "gates": "dispatch-gates --commands --repo objectstack-ai/objectstack on 374cdc9c: 36 commands, all ':: exit 0' (record gates-ran-374cdc9c.list); --ran: 36 derived, 36 run, 0 NOT-MEASURED. Includes check-sdui-manifest.mjs + --self-test, check:nul-bytes, ui vitest scripts/. app-shell type-check (tsc --noEmit + tsconfig.test.json, after env -u OS_SKIP_DTS build of @object-ui/app-shell^...): VERDICT command-exit 0. ui check:new-line-citations: 0 new. eslint 3 files: 0 errors. CI check-runs: in_progress at report time.", "line_budget": "321 changed lines (+278/-43), 4 files, under 3000", "files_changed": [ ".changeset/30963-hosted-install-mode.md", "ui/packages/app-shell/src/console/marketplace/MarketplacePackagePage.tsx", "ui/packages/app-shell/src/console/marketplace/marketplaceApi.ts", "ui/packages/app-shell/src/console/marketplace/__tests__/MarketplacePackagePage.installMode-12288.test.tsx" ], "deviations": [ "Added beyond the Ask's three items: the hosted answer is read like install-local's (unmanaged success / unmanagedIgnored), so a pick that #30964 does not yet forward is said out loud instead of reading as success; assumes the hosted answer names installMode like install-local's", "Picker drawn only where getCloudBase() is set and install-local is off, not on the control plane's own console (copy text says this runtime); installPackage still sends a given mode on that branch", "eslint warnings 52 -> 53 on the two source files: one no-explicit-any, (err as any).details, mirroring installLocal's existing spelling", "test:repo not run locally (not named by the derivation); full farm is CI's" ], "dogfood_battery": "n/a — no ! in the PR title and no (narrowing) arm", "mcp_calls": "0 — no GitHub MCP calls", "api_writes": "2 — relay pr_create (objectstack-ai/objectstack#30992, run 42248591918); post-stamped comment on #30963 (this report). Plus git push of the thread branch (not REST).", "open_questions": [ { "question": "Which answer shape does #30964 give the hosted unmanaged install?", "options": [ "A answer installMode: 'unmanaged' with targetPackageId and version, as install-local does", "B another shape, and this page is adjusted when #30964 lands" ], "recommendation": "A, because the page then needs no change and one reader serves both doors" } ], "security_findings": "none", "out_of_scope_findings": [ "carrier: #30964 · the hosted dialog still offers Include sample data on an unmanaged pick; what the control plane does with seed_sample_data on a copy is #30964's and cloud's · noted in Acceptance notes, not filed", "carrier: #30964 · stripped-locks list not drawn on the hosted path until #30964 defines the hosted answer · noted, not filed" ] }objectstack-fleet commentedon Nov 6, 2026
domain:ui#2 · os-tesla · session_01L9qibw7DekEe3wx5f3zphf
ACCEPT → PR #30992 comment 6689743008 · 2026-11-06T16:23Z · head
374cdc9c(hosted install sends an optionalinstall_mode, picker on the environment console; 321 lines, Tier S path,Fixes #30963). Landing through the merge queue. End to end rides on #30964.objectstack-fleet commentedon Nov 6, 2026
domain:ui#2 · os-tesla · session_01L9qibw7DekEe3wx5f3zphf
Landed at 2026-11-06T17:12Z: PR #30992 merged as
cd3a167c10(seat ACCEPT 6689743008 on head374cdc9c).Fixes #30963closed the card.git grep -c install_mode origin/main -- ui/packages/app-shell/src/console/marketplace/marketplaceApi.tsgit grep -c hostedModeDoor origin/main -- ui/packages/app-shell/src/console/marketplace/MarketplacePackagePage.tsxgit grep -c installRefusalText origin/main -- ui/packages/app-shell/src/console/marketplace/MarketplacePackagePage.tsxpm:dispatchedremoved. End to end rides on #30964 (domain:server,pm:blocked): until the environment'sCloudConnectionPluginforwards the mode, a hosted request for a copy installs managed and says so.