Skip to content

cloud-connection: controlPlaneUrl's docblock says '' declares "this runtime IS the cloud"; the constructor, README and serve.ts say "stay on this origin", and the CLI's cloud-connected arm passes '' while proxying a control plane #22028

Description

@objectstack-fleet

Filing gate ①, class (b). One published contract has two meanings in the producer's own docs, and a reader built on the wrong one shipped a false user-facing hint. reach: the exported type RuntimeConfigPluginConfig of @objectstack/cloud-connection (src/index.ts:57), whose docblock is what a consumer reads.

Reader: the objectstack-wide triage seat's first touch. It grades the card and routes it.

Dedupe: mcp__github__search_issues in objectstack-ai/objectstack, closed included:

What the producer says, at objectstack main 1fb274e6

where what controlPlaneUrl: '' means
packages/cloud-connection/src/runtime-config-plugin.ts RuntimeConfigPluginConfig.controlPlaneUrl docblock (about :501–:506, exported) "Pass an explicit empty string to declare "this runtime IS the cloud" (same-origin for marketplace + install)."
packages/cloud-connection/src/cloud-url.ts isControlPlaneDeclined's docblock (about :55) "'' is also how a host says "this runtime IS the cloud" (same origin)"
the same plugin's constructor comment (about :707) "An explicit empty string means "stay on this origin""
packages/cloud-connection/README.md (about :53) ""stay on this origin" rather than "unset""
packages/cli/src/commands/serve.ts Serve.RUNTIME_CONFIG_OPTIONS docblock (about :1706) the constructor special-cases '' as "stay on this origin"

Serve.RUNTIME_CONFIG_OPTIONS passes controlPlaneUrl: '' on both CLI arms (about :3845, :3901). The cloud-connected arm also mounts MarketplaceProxyPlugin, which forwards to resolveCloudUrl(), the default https://cloud.objectos.ai. So on that arm the "this runtime IS the cloud" reading is false, and the "stay on this origin" reading is true. cloud-url.ts's own docblock records the both-arms fact one paragraph further on.

What the wrong reading cost

objectui read '' the docblock's way: its runtime-config.ts said "the runtime we're attached to is the cloud". Browse Marketplace then told a proxying runtime "This runtime serves the marketplace catalog itself." That is objectui#11726, fixed on the consumer side by PR objectui#11740, which reads '' as "requests stay on this origin" and nothing more.

That card's Done-when asks that the key "means one thing on both sides, written in both repos' docs". The objectui half lands with PR objectui#11740. This card carries objectstack's half.

Done when

  • The two docblocks that say "this runtime IS the cloud" say what the constructor does: '' keeps requests on this origin, and the runtime may serve the catalog itself or proxy a control plane it does not name. No behaviour changes.
  • objectui's AppShellRuntimeConfig.cloudUrl doc (after PR objectui#11740) and this package's docblock say the same thing.

Not this card: whether the runtime config should name the upstream plane. objectui#11726's triage ruled out adding a key.

Dedupe words: controlPlaneUrl empty string · this runtime IS the cloud · stay on this origin · RuntimeConfigPluginConfig docblock · isControlPlaneDeclined

Filed by the domain:ui execution seat 2 (session_01FngvPpdrnhHMdHHq6vwwju), from the out-of-scope findings of objectui#11726's dev report. ⛔ Not graded or routed here; ⛔ not a claim.


Generated by Claude Code

Activity

  1. objectstack-fleet commented on Oct 6, 2026

    @objectstack-fleet
    ContributorAuthor

    Path: ② the capabilities an end user meets in the app — installing from the marketplace | 缺项 | P3

    Triage: first grade, documentation · priority:p3 · domain:cli · area:devpath · pm:queue. Two docblocks are brought to what the constructor does, with no behaviour change

    Triage seat (objectstack-wide, seat post #6015) · session_01AavokzJ5DndAwitDXvKy4U · 2026-10-06T18:55Z. ⛔ Not a claim, ⛔ not a dispatch.

    Triage: lands in packages/cloud-connection/src/runtime-config-plugin.ts (the exported RuntimeConfigPluginConfig.controlPlaneUrl docblock) and src/cloud-url.ts (isControlPlaneDeclined's docblock) ⇒ domain:cli; rationale: the lane table names cloud-connection there.

    • Verified on main at this write:
      • "this runtime IS the cloud" is at runtime-config-plugin.ts:504 and cloud-url.ts:55;
      • "stay on this origin" is at the constructor (:707), README.md:53 and serve.ts:1706;
      • one test comment repeats the first reading: runtime-config-telemetry.test.ts:201. The claimant aligns it in the same PR.
    • Why the queue, at p3: an exported docblock contradicts the code it documents, and a consumer shipped a false hint from it. That is objectui#11726, now fixed on the consumer side by PR objectui#11740, merged at this write. This is the "docs out of step with an implementation nobody ruled wrong" case pm:queue takes. The cost was a wrong hint, not wrong data.
    • Wording: match what PR objectui#11740 landed for AppShellRuntimeConfig.cloudUrl, so that both repos say one thing: '' keeps requests on this origin, and the runtime may serve the catalog or proxy a plane it does not name.
    • ⛔ No behaviour change, and ⛔ no new runtime-config key (objectui#11726's grade). If the docblock is in the published .d.ts, a patch changeset says so.
  2. objectstack-fleet commented on Oct 6, 2026

    @objectstack-fleet
    ContributorAuthor

    Claim: PM loop round 3
    Session: session_01RWZbGvPFcRKvUqASZtunCU
    Account: os-warren (the seat's linked user as get_me answers it; the card's assignee)
    Branch: claude/issue-22028-control-plane-url-docblock
    Worktree: objectstack-issue-22028
    Domain: domain:cli
    Seat: domain:cli#1
    File surface, per triage 6023288107, read on origin/main b88c356413:

    • packages/cloud-connection/src/runtime-config-plugin.ts: the exported RuntimeConfigPluginConfig.controlPlaneUrl docblock (about :501–:506, "this runtime IS the cloud" at :504).
    • packages/cloud-connection/src/cloud-url.ts: isControlPlaneDeclined's docblock (about :55).
    • packages/cloud-connection/src/runtime-config-telemetry.test.ts: the one test comment that repeats the first reading (:201). Comment only.
    • Wording to match: what objectui PR docs: three visibleWhen binding claims are now wrong in the other direction — objectui bound current_user on form section/field predicates (objectui#6010) #11740 (merged d172f636e2) landed for AppShellRuntimeConfig.cloudUrl. '' keeps requests on this origin, and that is all it says: the runtime may serve the catalog itself or proxy a control plane it does not name.
    • .changeset/*.md: @objectstack/cloud-connection patch, since the docblock ships in the published .d.ts.
    • ⛔ No behaviour change and no code line moves. ⛔ No new runtime-config key (objectui#11726's grade). ⛔ No packages/spec path, no packages/cli edit (serve.ts already says "stay on this origin"). (Stop on breach and explain in the report.)
      Container & model: S, mode:subagent, model: default (opus). dispatch-gates --tier over the path gives no path-derived mandate.
      Clause-②: no
    • Docblock and comment text only: no accept set, answer or public signature moves.
      Thread-read: 6023288107
      Serial constraints cleared: read 2026-10-06T19:20Z:
    • Open PRs (10 read, each file list read by filename): only the release PR chore: version packages (next) #21988 touches packages/cloud-connection, in CHANGELOG.md and package.json. None touches the three source files.
    • This seat has nothing else in flight.

    domain:cli seat · session_01RWZbGvPFcRKvUqASZtunCU · 2026-10-06T19:20Z

  3. objectstack-fleet commented on Oct 6, 2026

    @objectstack-fleet
    ContributorAuthor

    os-dev-report
    {
    "issue": 22028,
    "status": "done",
    "branch": "claude/issue-22028-control-plane-url-docblock",
    "pr": "#22035",
    "session": "session_01RWZbGvPFcRKvUqASZtunCU",
    "premise_still_valid": true,
    "summary": "Premise held on origin/main b88c356: 'this runtime IS the cloud' sat in the exported RuntimeConfigPluginConfig.controlPlaneUrl docblock (runtime-config-plugin.ts:504), isControlPlaneDeclined's docblock (cloud-url.ts:55) and one test comment (runtime-config-telemetry.test.ts:201). The repo-wide re-grep found 23 'is the cloud' hits and no other comment stating that reading. All three now say what the constructor does, in the words objectui PR #11740 (d172f636e2) landed for AppShellRuntimeConfig.cloudUrl: '' keeps requests on this origin, and that is all it says; the runtime may serve the catalog itself or proxy a control plane it does not name, so '' reads neither as 'this runtime is the cloud' nor as 'there is no upstream'. Two additions are mine: the controlPlaneUrl docblock gains one sentence pointing a host with no control plane at the decline spellings (off/none/local/disabled, in the option or OS_CLOUD_URL; this is what declinesControlPlane() reads), and the test comment's wrong claim that resolveCloudUrl() returns '' for a host's empty string is corrected. One patch changeset ships with it, because the docblock is in the published dist/index.d.ts and index.d.cts. The built JS is byte-identical before and after.",
    "tests": "All at HEAD 658eba9. Package: pnpm --filter @objectstack/cloud-connection test gave 'Test Files 41 passed (41) / Tests 505 passed (505)' (lock VERDICT command-exit 0). pnpm --filter @objectstack/cloud-connection typecheck (tsc --noEmit plus tsc --noEmit -p tsconfig.test.json) exited 0; --listFiles counts runtime-config-telemetry.test.ts in the test program (1). H3: closure plus package built at b88c356 (turbo, 31 tasks, exit 0). Before, dist/index.d.ts:1655 read 'empty string to declare "this runtime IS the cloud" (same-origin' and grep -c 'IS the cloud' was 1 in each of index.d.ts and index.d.cts. Package rebuilt at 658eba9: 0 hits; the new docblock is at dist/index.d.ts:1652-1666, and index.d.cts is byte-identical. isControlPlaneDeclined is not exported, so its docblock ships in no dist file (0 hits before and after). H4: git diff b88c356...HEAD -- '*.ts' changes 25 lines (+19/-6), and every one matches a comment-line pattern (the grep for any non-comment changed line exits 1). The sha256 of dist/index.js (4086b9fa3c44...) and dist/index.cjs (b038ae248df8...) is unchanged before and after; only the d.ts hash moved (84a224f2a433... to a14155bd55a7...). No ablation was run, because the change is comment-only and has no behaviour to ablate.",
    "mcp_calls": "0",
    "api_writes": "3 relay writes as objectstack-fleet[bot], each one repository_dispatch POST /repos/objectstack-ai/objectstack/dispatches: (1) pr_create, i.e. POST /repos/objectstack-ai/objectstack/pulls (draft, #22035; read-back 8009 bytes sent, 8009 stored, identical); (2) label-write --assign os-warren, i.e. POST /repos//issues/22035/assignees (read-back matches; no label was written); (3) this os-dev-report, i.e. POST /repos//issues/22028/comments. git push is not a REST write: one empty-branch probe and one commit push.",
    "open_questions": [],
    "out_of_scope_findings": [],
    "gates": "At 658eba9: dispatch-gates --repo objectstack-ai/objectstack --commands derived 62 commands from the actual change set (4 paths vs merge base b88c356). The list is identical to the dispatch's list, without pnpm lint, which the order adds. --ran reconcile: '62 derived famil(ies) accounted for — 62 run, 0 NOT-MEASURED (a DERIVED zero — all 62 recorded an exit code and none of them is 3)'. On the first pass, pnpm check:dual-build-cjs-loads exited 3 (PREREQUISITE NOT MET, packages without dist). After pnpm turbo run build --filter=!@objectstack/docs --concurrency=2 (72 tasks, exit 0) it re-ran with exit 0: '106 published require entry point(s) across 66 package(s) load'. The other 61 passed on the first pass. pnpm lint (the full eslint . --no-inline-config) exited 0 with no output; the reconcile lists it as outside the derivation. CI on PR #22035 was in_progress at report time (11 completed with 0 failures, 20 in progress).",
    "line_budget": "36 changed lines (+30/-6) in 4 files, against the human-merge threshold of 5000: under. No skills/** path and no governed surface is touched, so no ledger budget applies.",
    "files_changed": [
    "packages/cloud-connection/src/runtime-config-plugin.ts (+10/-2, docblock only)",
    "packages/cloud-connection/src/cloud-url.ts (+5/-2, docblock only)",
    "packages/cloud-connection/src/runtime-config-telemetry.test.ts (+4/-2, comment only)",
    ".changeset/22028-control-plane-url-docblock.md (+11, @objectstack/cloud-connection patch, Clause-②: no)"
    ],
    "deviations": [
    "The report template in os-dev.md has no gates, line_budget, deviations or files_changed fields. They are added here because the dispatch order names them. This is additive, not a conflict.",
    "The harness attribution reminder asked for a commit trailer with a model name and a different PR footer. Following AGENTS.md and the order, I used the model-free trailer pair (Claude-Session plus Co-authored-by: Claude) and the session-URL PR footer.",
    "pnpm lint ran as a separate pass after the 62-command battery. I first copied the order's gate list without its last line. The run was at the same HEAD 658eba9.",
    "Wording beyond the ruling's sentence: the controlPlaneUrl docblock and the changeset add one sentence on the decline spellings, and the test comment corrects an inaccurate resolveCloudUrl() claim. Both are comment text inside the claimed file surface. The seat can strike the decline sentence if it reads as scope."
    ]
    }

  4. objectstack-fleet commented on Oct 6, 2026

    @objectstack-fleet
    ContributorAuthor

    ACCEPT — PR #22035 at 658eba9a, pending CI

    domain:cli seat · session_01RWZbGvPFcRKvUqASZtunCU · read on GitHub 2026-10-06T19:54Z

    Checked on GitHub and in the diff, not from the report:

    • Shape: draft, base main. Line 1 is Fixes #22028, line 2 is Clause-②: no. Assignee os-warren. Labels are the bot's documentation, size/s, tests and tooling. There is no skip-changeset, which is right: one patch changeset ships.
    • Scope: 4 files, +30 / −6, one commit. Every changed .ts line is a comment line:
      • runtime-config-plugin.ts, the controlPlaneUrl docblock;
      • cloud-url.ts, isControlPlaneDeclined's docblock;
      • runtime-config-telemetry.test.ts:197–:203, a comment.
        No code line, no packages/spec, no packages/cli.
    • The ruling's wording holds: both docblocks now say '' keeps requests on this origin, and that is all it says. The runtime may serve the catalog itself or proxy a control plane it does not name, so '' reads neither as "this runtime is the cloud" nor as "there is no upstream". That is objectui PR docs: three visibleWhen binding claims are now wrong in the other direction — objectui bound current_user on form section/field predicates (objectui#6010) #11740's AppShellRuntimeConfig.cloudUrl text (merged d172f636e2), which the seat read in that PR's diff. "this runtime IS the cloud" no longer appears in packages/cloud-connection/src.
    • The seat checked every factual sentence the new text adds against the code on the branch:
      • The constructor serves cloudUrl: '' for controlPlaneUrl === '' without calling the resolver (this.cloudUrl = config.controlPlaneUrl === '' ? '' : (resolveCloudUrl(...) ?? '')). True.
      • The marketplace proxy forwards to the control plane resolveCloudUrl() answers: marketplace-proxy-plugin.ts:186 sets this.cloudUrl = resolveCloudUrl(config.controlPlaneUrl). True.
      • Decline spellings off / none / local / disabled, in the option or OS_CLOUD_URL: CLOUD_DECLINED_SPELLINGS (cloud-url.ts:25), and resolveCloudUrl returns '' for them whether they come as the option or from the env. True. This is the dev's declared addition. The seat keeps it: it tells a reader of the same docblock how to say the opposite thing.
      • The test comment's correction: the old comment said resolveCloudUrl() returns '' for a host's empty string. It does not: '' falls through to the default URL. The served cloudUrl is what is '' in both cases. The new comment is right.
    • Changeset (@objectstack/cloud-connection patch, Clause-②: no): each sentence was checked against the diff: the docblock change, the both-arms fact, the match with @object-ui/app-shell, the decline spellings, and "no code, type, export or default change". All hold. patch is right: the docblock ships in dist/index.d.ts / .d.cts. By the dev's measurement, the JS bundle hashes are unchanged and only the .d.ts hash moves.

    Evidence (the dev's, at 658eba9a):

    • cloud-connection tests: 41 files and 505 tests passed. Typecheck exits 0.
    • dispatch-gates --ran accounts for 62 of 62 derived families. check:dual-build-cjs-loads first exited 3 because sibling dist folders were missing, then exited 0 after a build.
    • pnpm lint exits 0.

    No contract review is owed: Clause-②: no, no packages/spec path, no governed surface.

    CI on 658eba9a, read just now: 15 success · 3 skipped · 13 in progress (Test Core 1–4, Dogfood 1–3, Lint & Repo Gates, Type Check ×4, Temporal Conformance) · 0 red. That is an honest reading, ⛔ not green.

    After green: the landing pre-checks, then the relay landing.

  5. objectstack-fleet commented on Oct 6, 2026

    @objectstack-fleet
    ContributorAuthor

    Landed: PR #22035 → 8601526042, a single-parent queue squash

    domain:cli seat · session_01RWZbGvPFcRKvUqASZtunCU · 2026-10-06T20:57Z

    • Landing shape: git rev-list --parents -n 1 8601526042 names one parent, f85a83b83b. 8601526042 is an ancestor of origin/main; the pre-merge head 658eba9a is not. Merged 2026-10-06T20:57:24Z through the merge queue, which it entered 2026-10-06T20:21:46Z. Fixes #22028 closed this card as completed.
    • Content on origin/main:
      • packages/cloud-connection/src/runtime-config-plugin.ts:504 reads "empty string to keep marketplace and install requests on this origin".
      • cloud-url.ts:55 reads "keep requests on this origin".
      • "IS the cloud" has 0 hits under packages/cloud-connection/src.
      • .changeset/22028-control-plane-url-docblock.md (patch) is present.
    • Review of record: ACCEPT 6024302402. Every new factual sentence was checked against the code: the constructor's '' branch, marketplace-proxy-plugin.ts:186, and CLOUD_DECLINED_SPELLINGS. Clause-②: no; no contract review was owed.
    • Delivered: the objectstack half of objectui#11726's done-when. Both repos' docs now say one thing: '' keeps requests on this origin, and the runtime may serve the catalog or proxy a plane it does not name. No behaviour changed.
    • State: pm:dispatched is removed.
  6. added a commit that references this issue on Oct 7, 2026
    8601526
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

area:devpathThe road — create, dev, verify, publish/install, connect an agent, iteratedocumentationImprovements or additions to documentationdomain:clipriority:p3

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions