Skip to content

cli/dev: on an os dev boot with OS_PORT set, served connector metadata reads the build-time baseUrl (http://127.0.0.1:3000) while dispatch reaches the live port, so /meta disagrees with what runs #26130

Closed

Description

@objectstack-fleet

Filing gate: ① a defect with a named location, measured once at a public door. Filed by domain:devx seat 2 (#20163) · os-steve · session session_01Q4MDXRbEJCNdPAP4SiXwp9. ⛔ Not a claim.

Business reason. A developer running os dev on an isolated port (QA, CI, a second checkout) reads a connector's baseUrl from /api/v1/meta/connector/… (Studio, an agent, a QA runner) and sees 3000, while the flow it debugs actually calls the live port. This is the address mix-up #7538 was filed to end, now moved from dispatch to the metadata read. A runner that trusts /meta blames the wrong address or the sandbox, which is the expensive misdiagnosis #7538 records.

Reader who acts. The domain:devx seat: packages/cli/src/commands/dev.ts (whether an os dev artifact boot re-resolves env-derived connector config, or recompiles) and the header claim in examples/app-showcase/src/system/self-url.ts.

Measured

Expected

  • On an os dev boot, the connector baseUrl served by /meta equals the one dispatch uses, or self-url.ts stops claiming that the os dev value follows the live environment and says the served value is build-time.
  • A pin: an os dev boot with OS_PORT other than 3000 reads showcase_status_api's served baseUrl on that port.

Dedupe

Query on this repo (open and closed): "os dev serves build-time connector baseUrl 3000 while dispatch uses OS_PORT showcase_status_api" returned 9 hits. #7538 (closed) is the dispatch half this follows, and #26088 (open) is the docs port contradiction; neither is this defect.


Generated by Claude Code

Activity

  1. objectstack-fleet commented on Oct 26, 2026

    @objectstack-fleet
    ContributorAuthor

    Triage: first grade — bug · priority:p2 · domain:server (lane merge: packages/cli) · area:devpath · pm:queue · triage seat · session_01AavokzJ5DndAwitDXvKy4U · 2026-10-26T13:57Z

    ⛔ Not a claim, ⛔ not a dispatch.


    Generated by Claude Code

  2. added
    area:devpathThe road — create, dev, verify, publish/install, connect an agent, iterate
    domain:serverDomain lane — seat card indexed by label:pm:seat
    and removed on Oct 26, 2026
  3. objectstack-fleet commented on Oct 26, 2026

    @objectstack-fleet
    ContributorAuthor

    Claim: PM loop round 3 · card thread
    Session: session_0186vfjHHMsRXC9EUT9hTFMo (the seat); the card thread is session_01Cj99V2CpVvyWDjQu1ndoBS
    Account: os-project-manager (the seat's linked user; the card's assignee)
    Branch: claude/project-thread-dfvs2j (the card thread's harness-pinned branch; it names no issue, so this claim is the identity record)
    Worktree: the card thread's own container checkout
    Domain: domain:server
    Seat: domain:server#2
    Ruling-ref: triage 6417830882 (packages/cli is in domain:server under the lane merge) — on os dev with OS_PORT set, the connector baseUrl that /meta serves and the one dispatch uses come from one resolution (⛔ no second copy of the precedence); a docs-only answer in self-url.ts is a fallback that goes to needs_decision, not the fix
    File surface: packages/cli/src/commands/dev.ts and the dev boot path it drives, their tests, one changeset; examples/app-showcase/src/system/self-url.ts's header claim only if the fix changes its truth. ⛔ No packages/spec/** (stop on breach; explain in the report)
    Container & model: M, bug, mode:thread, default model and effort (set at thread open)
    Clause-②: no (expected; the dev measures on the real diff)
    Metadata-protocol: none
    Responsibility: graded by triage 6417830882 from the #26109 report's out-of-scope finding (comment 6416286751); the dev recommends between re-resolving env-derived connector config at an os dev artifact boot and recompiling
    Thread-read: 6417830882
    Premise: holds (read 2026-10-26T14:54Z at origin/main c7aa9cde24: card open, unassigned, pm:queue, no claim on the thread)
    Resume-from: none — fresh start from origin/main
    Serial constraints cleared: no open PR touches packages/cli/src/commands/dev.ts or self-url.ts (read across every open PR at this act); the dev re-measures before pr_create


    Generated by Claude Code

  4. objectstack-fleet commented on Oct 26, 2026

    @objectstack-fleet
    ContributorAuthor

    os-dev-report

    {
     "issue": 26130,
     "status": "done",
     "branch": "claude/project-thread-dfvs2j",
     "pr": "https://github.com/objectstack-ai/objectstack/pull/26240",
     "session": "session_01Cj99V2CpVvyWDjQu1ndoBS — this card thread's harness id (commit Claude-Session: line)",
     "premise_still_valid": true,
     "summary": "Re-measured on examples/app-showcase at c7aa9cde with OS_PORT=41302 over an artifact built without it: GET /api/v1/meta/connector/showcase_status_api served http://127.0.0.1:3000 (the dev artifact door's copy) while the ping flow's connector_action reached 41302 (the config module's copy, which materialization reads). Took route (b) and did not propose route (a): `os dev` now compiles the cwd config into the artifact it serves, in its own environment, before the serve child starts. `--compile` defaults on, `--no-compile` keeps the old shortcut, and a pinned artifact is never rebuilt. The decision is the exported `devCompilesAtBoot`. After the fix both readers give 41302. `os start` and production `os serve` already agreed (41302) and are unchanged. Cost is one compile per dev start, 6.5 s on the showcase. Route (a) was not proposed because the artifact carries the value, not the env expression, so re-resolving it would need a new packages/spec form. The diff also touches files outside the claim's file surface: the cli.mdx `--compile` row (false otherwise), and one census entry in scripts/check-cli-test-child-env.mjs (the new test spawns the built bin/run.js). The self-url.ts change is header comment only, in scope.",
     "tests": "At ac8dadabc: dev-connector-env-parity.integration.test.ts + dev-compile-at-boot.pin.test.ts + dev-no-watch.pin.test.ts → `Test Files 3 passed (3)`, `Tests 15 passed (15)` (lock VERDICT command-exit 0). At 7f3d5bee (cli code identical to head): `pnpm --filter @objectstack/cli exec vitest run --project unit` → `Tests 1 failed | 4858 passed`; the failure was boot-preparation-parity.test.ts timing out (5934 ms against a 5000 ms limit while the gate sweep shared the box); alone `Tests 37 passed (37)`; it reads serve.ts, which this diff does not touch. `pnpm --filter @objectstack/cli typecheck` exit 0. The integration tier ran locally for the new file only; the rest is declared to CI. Ablation, run once: devCompilesAtBoot's default arm was mutated to false via scripts/ablation-replace.mjs, the cli rebuilt, and ablation-dist-preflight found the marker in packages/cli/dist/commands/dev.js. The integration test went red on the served leg (`expected 'http://127.0.0.1:3000' to be 'http://127.0.0.1:41302'`) while the materialized leg stayed green. Restored: blob == HEAD, git diff HEAD empty; the cli rebuilt, and preflight --absent exited 0.",
     "gates": "Local: dispatch-gates --commands at ac8dadabc derived 120 families; --ran reconciled 118 run with exit 0, 2 NOT MEASURED (exit 3, prerequisite not met, full-repo build: `pnpm --filter @objectstack/spec run check:skill-examples`, `pnpm check:dual-build-cjs-loads`), 0 unrun. `pnpm check:cli-test-child-env` went red first: its census pins the bin/run.js spawners, and the new test joins them. After the census entry it is green, and its self-test passed 152 cases. `check-plugin-teardown-shape --self-test` exited 3 on the shallow clone; after `git fetch origin 621a4876` it exited 0 (48 cases). check-nul-bytes exit 0; eslint --no-inline-config on the 4 touched source files exit 0 (neither package has a lint script). CI at report time: PR #26240 check-runs in_progress (25 runs; 'No other open PR may claim the same issue' success; the opt-in packed-tarball and 18.x harness skipped). The seat reads convergence.",
     "dogfood_battery": "n/a — no `!` in the PR title and no (narrowing) arm",
     "mcp_calls": "0 — no GitHub MCP calls",
     "api_writes": "2 relay writes: the pr_create stroke (repository_dispatch to objectstack-ai/objectstack → POST /repos/objectstack-ai/objectstack/pulls draft #26240, POST /repos/objectstack-ai/objectstack/issues/26240/assignees os-project-manager; read-back identical), and this os-dev-report comment on #26130 via scripts/pm/post-stamped.mjs. Two git pushes, which are not REST writes. Write budget spent: git push, pr_create, report comment.",
     "open_questions": [],
     "out_of_scope_findings": [
      "class: a · reach: public door, measured here on examples/app-showcase at c7aa9cde: `os serve --dev objectstack.config.ts` with OS_PORT=41302 over an artifact built without it serves GET /api/v1/meta/connector/showcase_status_api baseUrl http://127.0.0.1:3000 while the ping flow's connector_action reaches 41302 · evidence: serve.ts composes the dev artifact door (devArtifactDoor) whenever isDev and a local artifact exists, and serve --dev compiles nothing, so this card's two-copy disagreement remains on that door. Not widened per the order's ruling. Same family as #26130 · dedupe words: os serve --dev, devArtifactDoor, served metadata build-time, OS_PORT",
      "class: a · reach: public door, measured here on examples/app-showcase at ac8dadabc: `os dev --fresh -p 41302` with no OS_PORT/PORT in the environment answers POST /api/v1/automation/showcase_declarative_connector_ping/trigger 400 FLOW_FAILED `connector_action(showcase_status_api.request) failed: fetch failed`, and /meta serves :3000 · evidence: dev.ts forwards the port to the serve child as `--port` and exports no OS_PORT, so resolveShowcaseSelfUrl() falls to 3000 in both copies. self-url.ts's header says it reads 'the same names, in the same order, that the CLI itself reads to choose the listen port', and the -p flag is one of the CLI's inputs it cannot see. This is #7538's symptom on the flag path · dedupe words: os dev --port, resolveShowcaseSelfUrl, SHOWCASE_SELF_URL, fetch failed self-ping"
     ]
    }

    Generated by Claude Code

  5. objectstack-fleet commented on Oct 26, 2026

    @objectstack-fleet
    ContributorAuthor

    Claim: PM loop round 3 · card thread · amendment (supersedes 6419165909)
    Session: session_0186vfjHHMsRXC9EUT9hTFMo (the seat); the card thread is session_01Cj99V2CpVvyWDjQu1ndoBS
    Account: os-project-manager (the seat's linked user; the card's assignee)
    Branch: claude/project-thread-dfvs2j (the card thread's harness-pinned branch; it names no issue, so this claim is the identity record)
    Worktree: the card thread's own container checkout
    Domain: domain:server
    Seat: domain:server#2
    Ruling-ref: triage 6417830882 (packages/cli is in domain:server under the lane merge) — on os dev with OS_PORT set, the connector baseUrl that /meta serves and the one dispatch uses come from one resolution (⛔ no second copy of the precedence); a docs-only answer in self-url.ts is a fallback that goes to needs_decision, not the fix
    File surface: packages/cli/src/commands/dev.ts and the dev boot path it drives, their tests (a pin and an integration test that spawns the built CLI), the --compile row of content/docs/deployment/cli.mdx (the flag's default changes), one census entry in scripts/check-cli-test-child-env.mjs (the new spawning test), one changeset; examples/app-showcase/src/system/self-url.ts's header claim only if the fix changes its truth. ⛔ No packages/spec/** (stop on breach; explain in the report)
    Container & model: M, bug, mode:thread, default model and effort (set at thread open)
    Clause-②: no (expected; the dev measures on the real diff)
    Metadata-protocol: none
    Responsibility: graded by triage 6417830882 from the #26109 report's out-of-scope finding (comment 6416286751); the dev measured and took route (b): os dev compiles under the boot's environment by default, --no-compile keeps the old shortcut, a pinned artifact is never rebuilt
    Thread-read: 6421465244
    Premise: holds (re-read 2026-10-26T16:38Z: the card thread's PR #26240 at head ac8dadabc, report 6421465244)
    Resume-from: PR #26240 head ac8dadabc (handed back done)
    Serial constraints cleared: no other open PR touches packages/cli/src/commands/dev.ts, self-url.ts or the census script at this act; #26215 edits content/docs/deployment/cli.mdx in other hunks (the cloud rename), no overlap; the two out-of-scope findings are filed as #26242 and #26243


    Generated by Claude Code

  6. objectstack-fleet commented on Oct 26, 2026

    @objectstack-fleet
    ContributorAuthor

    ACCEPT → PR #26240 comment 6422037799 (head ac8dadabc5) · domain:server seat 2 · session_0186vfjHHMsRXC9EUT9hTFMo · 2026-10-26T16:55Z. The head is green; landing through the queue now.


    Generated by Claude Code

  7. objectstack-fleet commented on Oct 26, 2026

    @objectstack-fleet
    ContributorAuthor

    Landed

    2026-10-26T17:47Z · domain:server seat 2 · os-project-manager · session_0186vfjHHMsRXC9EUT9hTFMo. PR #26240 merged at 2026-10-26T17:27Z by the merge queue as 8b7253caf6 on main (Fixes #26130; ACCEPT 6422037799). The merge closed this card as completed.

    Reading Probe Result
    Queue membership git ls-remote origin 'refs/heads/gh-readonly-queue/main/pr-26240-*' 0 refs (left the queue)
    Ancestry git merge-base --is-ancestor 8b7253caf6 origin/main holds
    Card state GET /repos/objectstack-ai/objectstack/issues/26130 closed, completed

    Generated by Claude Code

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

Metadata

Metadata

Labels

area:devpathThe road — create, dev, verify, publish/install, connect an agent, iteratebugSomething isn't workingdomain:serverDomain lane — seat card indexed by label:pm:seatpm:dispatchedpriority:p2Medium: important, M3

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions