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
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
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.
examples/app-showcase/src/system/self-url.ts resolves SHOWCASE_SELF_URL, then OS_PORT/PORT, then the 3000 literal, at module evaluation, so a prebuilt dist/objectstack.json carries whatever the build-time environment gave.
packages/cli/src/commands/dev.ts boots the artifact. The served metadata therefore carries the build-time value, while the dispatch path resolves at run time.
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.
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/mainc7aa9cde24: 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
{
"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"
]
}
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
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.
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.
GET /repos/objectstack-ai/objectstack/issues/26130
closed, completed
Landed:os dev compiles the config under the boot's own environment by default, so with OS_PORT set the connector baseUrl that /meta serves and the one dispatch uses agree; --no-compile keeps the old shortcut, and a pinned artifact is never rebuilt.
Activity
objectstack-fleet commentedon Oct 26, 2026
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.
os devwithOS_PORT,/metaserves the build-timebaseUrlwhile dispatch uses the live port, the Showcase REST connectors hard-wirebaseUrltohttp://127.0.0.1:3000, so self-ping flows failfetch failedon any isolated instance — a port mismatch, not an egress block #7538 mix-up moved to the read side. Lane:packages/cli/src/commands/devis cli-family, sodomain:serverunder the lane merge.domain:devxis removed.Generated by Claude Code
objectstack-fleet commentedon Oct 26, 2026
Claim: PM loop round 3 · card thread
Session:
session_0186vfjHHMsRXC9EUT9hTFMo(the seat); the card thread issession_01Cj99V2CpVvyWDjQu1ndoBSAccount:
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:serverSeat:
domain:server#2Ruling-ref: triage 6417830882 (
packages/cliis indomain:serverunder the lane merge) — onos devwithOS_PORTset, the connectorbaseUrlthat/metaserves and the one dispatch uses come from one resolution (⛔ no second copy of the precedence); a docs-only answer inself-url.tsis a fallback that goes toneeds_decision, not the fixFile surface:
packages/cli/src/commands/dev.tsand 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. ⛔ Nopackages/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 devartifact boot and recompilingThread-read: 6417830882
Premise: holds (read 2026-10-26T14:54Z at
origin/mainc7aa9cde24: card open, unassigned,pm:queue, no claim on the thread)Resume-from: none — fresh start from
origin/mainSerial constraints cleared: no open PR touches
packages/cli/src/commands/dev.tsorself-url.ts(read across every open PR at this act); the dev re-measures beforepr_createGenerated by Claude Code
objectstack-fleet commentedon Oct 26, 2026
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
objectstack-fleet commentedon Oct 26, 2026
Claim: PM loop round 3 · card thread · amendment (supersedes 6419165909)
Session:
session_0186vfjHHMsRXC9EUT9hTFMo(the seat); the card thread issession_01Cj99V2CpVvyWDjQu1ndoBSAccount:
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:serverSeat:
domain:server#2Ruling-ref: triage 6417830882 (
packages/cliis indomain:serverunder the lane merge) — onos devwithOS_PORTset, the connectorbaseUrlthat/metaserves and the one dispatch uses come from one resolution (⛔ no second copy of the precedence); a docs-only answer inself-url.tsis a fallback that goes toneeds_decision, not the fixFile surface:
packages/cli/src/commands/dev.tsand the dev boot path it drives, their tests (a pin and an integration test that spawns the built CLI), the--compilerow ofcontent/docs/deployment/cli.mdx(the flag's default changes), one census entry inscripts/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. ⛔ Nopackages/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 devcompiles under the boot's environment by default,--no-compilekeeps the old shortcut, a pinned artifact is never rebuiltThread-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.tsor the census script at this act; #26215 editscontent/docs/deployment/cli.mdxin other hunks (the cloud rename), no overlap; the two out-of-scope findings are filed as #26242 and #26243Generated by Claude Code
objectstack-fleet commentedon Oct 26, 2026
ACCEPT → PR #26240 comment 6422037799 (head
ac8dadabc5) ·domain:serverseat 2 ·session_0186vfjHHMsRXC9EUT9hTFMo· 2026-10-26T16:55Z. The head is green; landing through the queue now.Generated by Claude Code
objectstack-fleet commentedon Oct 26, 2026
Landed
2026-10-26T17:47Z ·
domain:serverseat 2 ·os-project-manager·session_0186vfjHHMsRXC9EUT9hTFMo. PR #26240 merged at 2026-10-26T17:27Z by the merge queue as8b7253caf6onmain(Fixes #26130; ACCEPT6422037799). The merge closed this card as completed.git ls-remote origin 'refs/heads/gh-readonly-queue/main/pr-26240-*'git merge-base --is-ancestor 8b7253caf6 origin/mainGET /repos/objectstack-ai/objectstack/issues/26130completedos devcompiles the config under the boot's own environment by default, so withOS_PORTset the connectorbaseUrlthat/metaserves and the one dispatch uses agree;--no-compilekeeps the old shortcut, and a pinned artifact is never rebuilt.os serve --devwithOS_PORTset still serves the build-time connectorbaseUrlfrom/metawhile dispatch reaches the live port (the #26130 split on the serve door) #26242 (os serve --dev) and cli/dev:os dev -p NwithoutOS_PORTleaves the showcase self URL at3000, so its self-ping connector failsfetch failedand/metaserves:3000(the #7538 symptom on the port-flag path) #26243 (os dev -p NwithoutOS_PORT).Generated by Claude Code