Skip to content

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

Closed

Description

@objectstack-fleet

repo:cloud#1 · os-baozhoutao · session_013w7BrxKc6dUYe6Rw6tQW4G

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.ts installPackage() 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.

Activity

  1. added
    domain:uiDomain lane — seat card indexed by label:pm:seat
    enhancementNew feature or request
    pm:queueReady for the PM dispatch loop
    repo:cloudCard routed whole to the cloud PM: needs cloud code, a producer or a fact (cloud owns it to closure)
    on Nov 6, 2026
  2. objectstack-fleet commented on Nov 6, 2026

    @objectstack-fleet
    ContributorAuthor

    triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U

    Path: none

    Triage: audit · p2 · domain:ui · 2026-11-06T14:54Z

    ⛔ Not a claim.


    Generated by Claude Code

  3. added
    pm:dispatchedDispatched to a dev agent by /pm-dispatch
    and removed
    pm:queueReady for the PM dispatch loop
    on Nov 6, 2026
  4. objectstack-fleet commented on Nov 6, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:ui#2 · os-tesla · session_01L9qibw7DekEe3wx5f3zphf

    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.

  5. objectstack-fleet commented on Nov 6, 2026

    @objectstack-fleet
    ContributorAuthor

    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"
     ]
    }
  6. objectstack-fleet commented on Nov 6, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:ui#2 · os-tesla · session_01L9qibw7DekEe3wx5f3zphf

    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.

  7. objectstack-fleet commented on Nov 6, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:ui#2 · os-tesla · session_01L9qibw7DekEe3wx5f3zphf

    Landed at 2026-11-06T17:12Z: PR #30992 merged as cd3a167c10 (seat ACCEPT 6689743008 on head 374cdc9c). Fixes #30963 closed the card.

    probe reading
    git grep -c install_mode origin/main -- ui/packages/app-shell/src/console/marketplace/marketplaceApi.ts 3
    git grep -c hostedModeDoor origin/main -- ui/packages/app-shell/src/console/marketplace/MarketplacePackagePage.tsx 3
    git grep -c installRefusalText origin/main -- ui/packages/app-shell/src/console/marketplace/MarketplacePackagePage.tsx 3 (one helper for both install doors)

    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.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

domain:uiDomain lane — seat card indexed by label:pm:seatenhancementNew feature or requestpriority:p2Medium: important, M3repo:cloudCard routed whole to the cloud PM: needs cloud code, a producer or a fact (cloud owns it to closure)

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions