Skip to content

cloud-connection: the server reports the plugin's hardcoded 0.3.0 as its runtime_version to the cloud (bind/start verification URI and bind body) when OS_RUNTIME_VERSION is unset #24150

Closed

Description

@objectstack-fleet

Filing gate: ① a product defect with a named landing and a measured reach. Filed by domain:devx seat 2 (#20163) · os-sales · session_016PVjjuVPte5XEJvaQx1E4t, from the out-of-scope findings of #24066 (PR #24147).

  • Reader: the domain:cli seat, in packages/cloud-connection/src/cloud-connection-plugin.ts, at the two process.env.OS_RUNTIME_VERSION ?? this.version fallbacks (the bind/start verification URI and the bind/poll bind body), where version = '0.3.0'.
  • Dedupe: search_issues on objectstack-ai/objectstack for "cloud-connection runtime_version 0.3.0 OS_RUNTIME_VERSION plugin version reported to cloud" gave 0 hits.

Reach

The #24066 dev measured this on a dev boot of examples/app-showcase at main 9ffe8af09:

  • POST /api/v1/cloud-connection/bind/start answered a verification_uri carrying runtime_version=0.3.0.
  • The bind body the stand-in control plane received carried runtime_version: "0.3.0".
  • GET /api/v1/discovery on the same boot reports 18.0.0-next.2.

Why

  • The fallback is the plugin's own constant. When OS_RUNTIME_VERSION is unset, the plugin sends its version field, '0.3.0'. That constant is not the server's release.
  • The value is what the approver is shown. The plugin's own comment says the version is there "so the approver sees WHAT they are authorizing".
  • Discovery already resolves the real release. packages/metadata-protocol/src/discovery-version.ts falls back to resolvePackageVersion() for the same stamp.

Done when


Generated by Claude Code

Activity

  1. objectstack-fleet commented on Oct 17, 2026

    @objectstack-fleet
    ContributorAuthor

    Triage: first grade, priority:p3 · area:devpath · pm:queue · the filer's domain:cli stands · triage seat · session_01AavokzJ5DndAwitDXvKy4U · 2026-10-17T05:05Z

    Triage seat (objectstack-wide, seat post #6015). ⛔ Not a claim, ⛔ not a dispatch.


    Generated by Claude Code

  2. objectstack-fleet commented on Oct 17, 2026

    @objectstack-fleet
    ContributorAuthor

    Claim: PM loop round 1, serial, S-size cards only, any priority (the maintainer to this seat, verbatim 「用中文,当前任务处理完,后续只派小卡」, confirmed as "S-size, any priority"). #23050 sub-slice 13a's PR #24224 waits only in the merge queue (added_to_merge_queue, read in this act). Label order read in this act: this lane's queued p1/p2 cards hold no S-size card for this seat, and #24150 is the first S-size p3. #24150: with OS_RUNTIME_VERSION unset, the cloud-connection plugin reports the server's real release (the one /api/v1/discovery reports) instead of its hardcoded 0.3.0, at both sites · 2026-10-17T22:49Z
    Session: session_01BVm1pAXVXQ3PjC42j1kPFf
    Account: os-sales (the seat's linked user as GET /user answers it; always the card's assignee)
    Branch: claude/issue-24150-runtime-version
    Worktree: objectstack-issue-24150
    Domain: domain:cli
    Seat: domain:cli#1 (seat post #6024)
    File surface (read on origin/main b9ac35cbf; line numbers move; stop on a breach and explain it in the report):

  3. objectstack-fleet commented on Oct 18, 2026

    @objectstack-fleet
    ContributorAuthor

    os-dev-report

    {
      "issue": 24150,
      "status": "done",
      "branch": "claude/issue-24150-runtime-version",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/24231",
      "session": "session_01BVm1pAXVXQ3PjC42j1kPFf (mode:subagent, the parent's harness-stamped id, as on the commits' Claude-Session line)",
      "premise_still_valid": true,
      "summary": "Both sites now send the release discovery reports. bind/start's verification_uri and verification_uri_complete, and the bind body bind/poll sends to /bind, go through one closure inside kernel:ready, reportedRuntimeVersion(). A set OS_RUNTIME_VERSION is sent verbatim, with the same ?? set-ness as before. Unset, the closure reads ctx.getService('protocol').getDiscovery().version when the handler runs. With no protocol service, or a read that throws, nothing is sent (assumption 4: option A, four-axis reasons in the PR body). The plugin's own version field stays, and no dependency, export or metadata-protocol path moved. Assumptions measured on a real pnpm dev --fresh boot of app-showcase at c90a9776d, with OS_RUNTIME_VERSION unset and a stand-in control plane on loopback: (1) GET /api/v1/discovery is served by @objectstack/rest over protocol.getDiscovery() (unenveloped, carries apiName); the dispatcher's getDiscoveryInfo(), read at /.well-known/objectstack, agrees at 18.0.0-next.3. (2) The service read holds, so no third resolver copy was made. (3) Not triggered. On the same boot, both approval links carried runtime_version=18.0.0-next.3 and the stand-in's one /bind request carried runtime_version 18.0.0-next.3. The before reading is the card's (0.3.0 vs discovery 18.0.0-next.2). The docs #rename paragraph now says the version is the release discovery reports, with OS_RUNTIME_VERSION as an override. Clause-② re-declared from the diff: 'Clause-②: no', no arm, patch. readClause2Line reads the changeset and the PR body as declared/no/arm null, and check-changeset-no-major plus check-adr-0087-registration exit 0. On assumption 4: the no-discovery case now omits an optional emitted field where it used to send a wrong constant. That changes no accept set, key, route or export, so it is not declared a narrowing. Labels: zero writes, because the dispatch named none and skip-changeset does not apply to a publishing diff; the PR's labels read [] after creation.",
      "tests": "Run on final head a217f4bc6 (this branch with origin/main d3d064447 merged): pnpm --filter @objectstack/cloud-connection exec vitest run --maxWorkers=2 → 52 files, 613 passed, exit 0. pnpm --filter @objectstack/cloud-connection run typecheck → exit 0; --listFiles shows the new pin in both tsc programs. test:repo (each exit 0): core 86 passed, types 11, objectql 5, rest 262 passed + 14 skipped, runtime 808. spec test:repo was run at c90a9776d, before the merge: 67 files, 1115 passed, exit 0, 14m16s under the lock. New pin src/cloud-connection-runtime-version.pin.test.ts has 12 cases in single and multi mode, all against the real ObjectStackProtocolImplementation.getDiscovery() on the same harness, never a literal: unset gives the discovery release on both links and on the bind claim; CONTROL, a stamp is sent verbatim with and without a discovery producer; with no protocol service or a throwing read, no runtime_version param and no body key. connection-credential-store.test.ts: its shared harness gained a protocol service, because two bind cases asserted that a version was present, which only the old constant satisfied. Ablation, one pass on committed c90a9776d via scripts/ablation-replace.mjs WRAP mode with a trap and an absolute path. Mutation: anchor 'if (stamped !== undefined) return stamped || undefined;' replaced by 'return (stamped ?? this.version) || undefined;', which is the old fallback. On disk, anchor 1→0 and replacement 0→1, read while mutated. RED: vitest run src/cloud-connection-runtime-version.pin.test.ts exit 1, 8 failed | 4 passed (12); the controls stayed green. Failures read 'expected [ 0.3.0, 0.3.0 ] to deeply equal [ 18.0.0-next.3, 18.0.0-next.3 ]' and 'expected 0.3.0 to be 18.0.0-next.3'. Restore proven: blob 1b75c89c5 equals HEAD and git diff HEAD is empty. GREEN: 12 passed, exit 0. Builds went through os-verify-lock (turbo, --concurrency=2), each VERDICT command-exit 0.",
      "gates": "Local, final head a217f4bc6: node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack derived 93 commands. Each ran with its exit captured before any pipe, and all 93 exited 0. --ran reconciliation: '93 derived, 93 run, 0 NOT-MEASURED, 0 UNRUN', exit 0; eslint is the 1 outside the derivation. pnpm exec eslint --no-inline-config on the 3 changed .ts files exits 0; the .mdx and .md files have no eslint config ('File ignored'). The dispatch's lane blind spot is covered by that eslint run. check-platform-checklist --changed-from was not run, because no exported symbol was renamed or deleted. CI check-runs on a217f4bc6 when this was written: 38 runs, 10 success (Auto Label, Check Documentation Links, Check PR Size, Dogfood Regression Gate, Spec property liveness, the claim and closing-target guards, filter, among others), 5 skipped, 23 in_progress. The in_progress set: Test Core 1/6 through 6/6, Build Core, Build Docs, Check Changeset, Governed Surface Queue Guard, every Lint · * lane, and every Type Check · * lane. in_progress is the honest value, since CI convergence is the PM's to read.",
      "mcp_calls": "0 — no MCP GitHub tool was called",
      "api_writes": "2 relay strokes (scripts/pm/fleet-write/dispatch.mjs, each one POST /repos/objectstack-ai/objectstack/dispatches executed as objectstack-fleet[bot]): ① pr_create → POST /repos/objectstack-ai/objectstack/pulls (draft, base main) + POST /repos/objectstack-ai/objectstack/issues/24231/assignees [os-sales]; read-back: 8615 bytes sent, 8615 stored, identical. ② this os-dev-report comment → POST /repos/objectstack-ai/objectstack/issues/24150/comments via scripts/pm/post-stamped.mjs. Plus 3 git pushes (empty branch, fix commit, merge commit), which are not REST. Zero label writes, and no PATCH of the PR body.",
      "deviations": [
        "File surface reading: the claim names 'a pin beside it under packages/cloud-connection/src/'. connection-credential-store.test.ts, in that same directory, was also edited, test-only: the shared harness gained a protocol service, because the fix falsified its two version-present asserts. I judged this inside the declared directory rather than a breach and am declaring it here and in the PR's Acceptance notes.",
        "spec test:repo was measured at c90a9776d, before merging origin/main, and not re-run on a217f4bc6: 14 minutes under the lock, and the merge brought no change to any file in this diff. The other five test:repo projects were re-run on a217f4bc6. CI's Test Core covers spec on the final head.",
        "origin/main moved one more commit (6e43b7bc3, runtime 405 Allow header) after the merge. It was not merged: there is no overlap and no conflict, and the PR is already open (§10).",
        "Commit trailers are model-free (Co-Authored-By: Claude plus Claude-Session) as the dispatch and AGENTS.md require. The harness reminder's model-named trailer was not used.",
        "Worktree cleanup (rm -rf node_modules, then git worktree remove without --force) runs after this comment, because the write tools run from the worktree."
      ],
      "open_questions": [],
      "out_of_scope_findings": [
        "none filed — no class a/b/c finding. Three observations are in PR #24231's Acceptance notes only, carrier: none (承接者:无): (1) a set-but-empty OS_RUNTIME_VERSION sends nothing from the plugin while discovery's resolver treats empty as unset (the old behaviour, kept per the ruling); (2) a multi-tenant host is read through the host kernel's protocol service, which is the same module-level resolver, but this was not measured on a multi-tenant composition; (3) cloud-connection.mdx's Reference paragraph says OS_RUNTIME_VERSION is listed on the environment-variables page, and that page's cloud-control-plane table has no row for it."
      ]
    }

    Generated by Claude Code

  4. objectstack-fleet commented on Oct 18, 2026

    @objectstack-fleet
    ContributorAuthor

    Landed: PR #24231 · domain:cli seat 1 · session session_01BVm1pAXVXQ3PjC42j1kPFf · 2026-10-18T00:54Z

    Reading Result
    origin/main 669296bb5 "fix(cloud-connection): report the release discovery reports as runtime_version when OS_RUNTIME_VERSION is unset (#24231)"; git rev-list --parents -n1 gives 1 parent (194a42d1f), a squash
    Content the squash's own diff is 5 files, +279 / −7. git diff a217f4bc6 669296bb5 over those 5 paths is empty: what landed is the reviewed head
    Merge queue git ls-remote origin 'refs/heads/gh-readonly-queue/main/pr-24231-*' gives 0 refs
    PR object merged: true at 2026-10-18T00:54:08Z
    Lane reconciliation the squash body's one closing keyword is Fixes #24150; this card closed completed at 2026-10-18T00:54:09Z

    State: closed completed by Fixes #24150; pm:dispatched stripped in this act. The review of record was the seat's ACCEPT 6243739158 on a217f4bc6; no contract face was touched (Clause-②: no, patch).

    • With OS_RUNTIME_VERSION unset, bind/start's approval links and the bind body bind/poll sends now carry the version the server's discovery document reports, read through the protocol service. A set stamp is still sent verbatim. With no discovery read, nothing is sent.
    • The three Acceptance notes in the PR body carry carrier: none: an empty-string stamp; a multi-tenant host, unmeasured; and the environment-variables page, which has no OS_RUNTIME_VERSION row.
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, iteratebugSomething isn't workingdomain:clipriority:p3

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions