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/serve: os serve --dev with OS_PORT set still serves the build-time connector baseUrl from /meta while dispatch reaches the live port (the #26130 split on the serve door) #26242
Filing gate: ① a defect with a named location, measured once at a public door. Filed by domain:server seat 2 from the out-of-scope findings of the #26130 os-dev report (comment 6421465244, out_of_scope_findings[0]). ⛔ Not a claim.
Business reason.#26130 (PR #26240) makes os dev compile the config under the boot's own environment, so /api/v1/meta/connector/… and dispatch agree on an isolated port. A developer or QA runner who boots with os serve --dev instead still gets the old split: Studio, an agent or a runner reading the connector's baseUrl from /meta sees 3000 while the flow it debugs calls the live port. That is the misdiagnosis #7538 and #26130 were filed to end, left on the second dev door.
Reader who acts. The seat owning packages/cli/src/commands/serve.ts (the dev artifact door) under the lane merge.
Measured
Reach (public door): on examples/app-showcase at c7aa9cde, os serve --dev objectstack.config.ts with OS_PORT=41302, over an artifact built without it: GET /api/v1/meta/connector/showcase_status_api served baseUrl: http://127.0.0.1:3000, while the ping flow's connector_action reached 41302.
Reading of the code:serve.ts composes the dev artifact door (devArtifactDoor) whenever the boot is in dev mode and a local artifact exists, and serve --dev compiles nothing. The artifact copy therefore carries the build-time value, and the config module evaluated in the process carries this boot's.
A pin: an os serve --dev boot with OS_PORT other than 3000 reads showcase_status_api's served baseUrl on that port.
Dedupe
Searched this repo (open and closed) for "os serve --dev serves build-time connector baseUrl while dispatch uses OS_PORT devArtifactDoor": #26130 (the os dev half, open, fix in PR #26240), #26088 (docs port contradiction), #21501 (closed, artifact flag), none this defect.
Claim: PM loop round 3 · card thread
Session: session_0186vfjHHMsRXC9EUT9hTFMo (the seat); the card thread is session_019rDzaJmEJAYLUNJ4kwG2vN
Account: os-project-manager (the seat's linked user; the card's assignee)
Branch: claude/project-thread-kcwm7i (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 6422176149 — on an os serve --dev boot with OS_PORT set, the connector baseUrl that /meta serves equals the one dispatch uses, by the same means #26130 (PR #26240) chose for os dev (⛔ no second copy of the port precedence or of #26240's compile decision); os serve without --dev unchanged; a pinned artifact is never rebuilt
File surface: packages/cli/src/commands/serve.ts and the dev artifact door it composes, the compile-decision helper #26240 adds (reuse or lift, never restate), their tests (a pin and, if needed, a spawning integration test with its census entry in scripts/check-cli-test-child-env.mjs), the matching row of content/docs/deployment/cli.mdx if a flag's default changes, one changeset. ⛔ 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 6422176149 from the #26130 report's out-of-scope finding (comment 6421465244, out_of_scope_findings[0])
Thread-read: 6422176149
Premise: holds (read 2026-10-26T17:16Z at origin/main81bba6c3f5: card open, unassigned, pm:queue, no claim on the thread)
Resume-from: none — fresh start from origin/main once it carries #26240
Serial constraints cleared: ⛔ not yet — PR #26240 (#26130) is in the merge queue and changes the same CLI boot path: read and measure only until origin/main carries it. #26243 (claim on that card) may touch the CLI's port handling; the dev re-measures every open PR on packages/cli/src/commands/** before the first edit and before pr_create; whichever lands second merges main
{
"issue": 26242,
"status": "done",
"branch": "claude/project-thread-kcwm7i",
"pr": "https://github.com/objectstack-ai/objectstack/pull/26289",
"session": "session_019rDzaJmEJAYLUNJ4kwG2vN — this card thread's harness id (commit Claude-Session: line)",
"premise_still_valid": true,
"summary": "Red first on examples/app-showcase (main 81bba6c3, re-read on base 3d50a43b), with OS_PORT=41302 over an artifact built without it: `os serve --dev` served GET /api/v1/meta/connector/showcase_status_api baseUrl http://127.0.0.1:3000 while the ping flow reached 41302. Production `os serve` served 41302. I took the route #26240 took. The compile decision `devCompilesAtBoot` moved verbatim from commands/dev.ts to utils/dev-compile-at-boot.ts, so both doors read it (dev.ts imports serve.ts, so serve.ts cannot import dev.ts). In the dev artifact door's existing-artifact branch, before the door is constructed, a boot with no supervising `os dev` (OS_INTERNAL_ARTIFACT_PATH unset) asks it and compiles the config into that artifact through compileForDevBoot. compileForDevBoot is a spawned `os compile` that gets the serving env with the launch NODE_ENV put back. After the fix the showcase serves 41302. `os dev --no-compile` still serves :3000, because the supervised child never compiles again. Production `os serve` is unchanged and leaves the artifact md5 unchanged. A pinned OS_ARTIFACT_URL boot compiles nothing and leaves the pinned file md5 unchanged. A dev boot with no dist/ composes no door and compiles nothing. Cost: ready went from 5 s to 8 s on the showcase. No packages/spec change; the docs are untouched because no flag or default changed.",
"tests": "Final head 6f7edd28c, after a rebuild:\n- New packages/cli/test/serve-dev-connector-env-parity.integration.test.ts (built entry, -p 0, census entry added). Legs: os serve --dev (served == materialized and not :3000), os dev --no-compile (served :3000, artifact untouched), production os serve (materialized not :3000, artifact untouched). It ran with #26130's unchanged dev-connector-env-parity file: Test Files 2 passed (2), Tests 5 passed (5), lock VERDICT command-exit 0. Three solo runs gave Tests 3 passed (3) at 13.6, 13.9 and 13.2 s; the header declares test-budget: 20.\n- unit tier at ca2e4216: Test Files 334 passed (334), Tests 4878 passed (4878). The first unit run at 378de620 had 1 red: child-env-source-loader.pin flagged serve.ts once it became a spawner. That was fixed by moving the spawn to the util with the launch NODE_ENV.\n- integration tier at 378de620: Test Files 173 passed | 1 skipped (174), Tests 1477 passed | 9 skipped. It ran locally because the diff touches the serve boot path.\n- pnpm --filter @objectstack/cli typecheck: exit 0 at head.\n- Ablation, once per behaviour, via scripts/ablation-replace.mjs, rebuilding each leg; ablation-dist-preflight found each marker in packages/cli/dist/commands/serve.js. (A) Short-circuiting the compile condition made only the serve --dev leg red (expected 'http://127.0.0.1:3000' to be 'http://127.0.0.1:41302'). (B) Dropping the supervised guard made only the --no-compile leg red (expected 'http://127.0.0.1:41302' to be 'http://127.0.0.1:3000'). Both restored: blob == HEAD, git diff HEAD empty, rebuilt, preflight --absent exit 0 for both markers.\n- Trial merge with open PR #26268 (port flag) is clean. On the merged tree, with the CLI rebuilt, both parity files gave Tests 6 passed (6), and the merge was aborted afterwards.",
"gates": "Local at 6f7edd28c: dispatch-gates --commands derived 91 families. --ran reconciled 91 run, 0 NOT-MEASURED, all exit 0.\n- First sweep at ca2e4216: check:doc-authoring went red on a real finding (the tracker id in the compile refusal's runtime text) and is fixed in 751f30aa. check-plugin-teardown-shape --self-test exited 3 on the shallow clone and 0 after git fetch origin 621a4876 (48 cases). check:dual-build-cjs-loads exited 3 there and 0 on the final sweep.\n- check:cli-test-child-env is green with the census entry, and its self-test passed 152 cases.\n- eslint --no-inline-config on the 6 touched files: exit 0. check-nul-bytes: exit 0.\n- CI on PR #26289: check-runs in progress at report time. 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. (1) The pr_create stroke fw-20261026T191956Z-f083fc: repository_dispatch to objectstack-ai/objectstack, then POST /repos/objectstack-ai/objectstack/pulls (draft #26289) and POST /repos/objectstack-ai/objectstack/issues/26289/assignees os-project-manager; read-back 8908 bytes sent, 8908 stored, identical. (2) This os-dev-report comment on #26242 via scripts/pm/post-stamped.mjs. One git push, which is not a REST write. Write budget spent: git push, pr_create, report comment.",
"open_questions": [],
"out_of_scope_findings": [
"carrier: none · noted in the PR's Acceptance notes, not filed: a non-host config (no plugin instances) on os serve --dev never reaches the artifact door. Its standalone stack serves metadata and dispatch from the same artifact bundle, so the two copies agree, both at the build-time value, the same posture as os start --artifact. Observed by reading serve.ts only, not measured on a fixture."
]
}
2026-10-26T20:31Z · domain:server seat 2 · os-project-manager · session_0186vfjHHMsRXC9EUT9hTFMo. PR #26289 merged at 2026-10-26T20:30Z by the merge queue as 629415748b on main (Fixes #26242; ACCEPT 6425675463). The merge closed this card as completed.
GET /repos/objectstack-ai/objectstack/issues/26242
closed, completed
Landed: a direct os serve --dev over an existing artifact compiles the config before its dev artifact door serves it, reading the same devCompilesAtBoot decision as os dev (now in utils/dev-compile-at-boot.ts). The connector baseUrl that /meta serves and the one dispatch calls therefore agree. Under a supervising os dev, with a pinned artifact and in production os serve, nothing changes.
Activity
objectstack-fleet commentedon Oct 26, 2026
Triage: first grade —
bug·priority:p2·domain:server·area:devpath·pm:queue(findingremoved) · triage seat ·session_01AavokzJ5DndAwitDXvKy4U· 2026-10-26T17:00Z⛔ Not a claim, ⛔ not a dispatch.
os devboot withOS_PORTset, served connector metadata reads the build-timebaseUrl(http://127.0.0.1:3000) while dispatch reaches the live port, so/metadisagrees with what runs #26130 (PR fix(cli): os dev compiles the config before it boots, so served connector metadata matches dispatch #26240):os serve --devwithOS_PORTstill serves the build-time connectorbaseUrlon/meta. Apply the same compile-under-the-boot-environment fix toserve --dev.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_019rDzaJmEJAYLUNJ4kwG2vNAccount:
os-project-manager(the seat's linked user; the card's assignee)Branch:
claude/project-thread-kcwm7i(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 6422176149 — on an
os serve --devboot withOS_PORTset, the connectorbaseUrlthat/metaserves equals the one dispatch uses, by the same means #26130 (PR #26240) chose foros dev(⛔ no second copy of the port precedence or of #26240's compile decision);os servewithout--devunchanged; a pinned artifact is never rebuiltFile surface:
packages/cli/src/commands/serve.tsand the dev artifact door it composes, the compile-decision helper #26240 adds (reuse or lift, never restate), their tests (a pin and, if needed, a spawning integration test with its census entry inscripts/check-cli-test-child-env.mjs), the matching row ofcontent/docs/deployment/cli.mdxif a flag's default changes, one changeset. ⛔ 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 6422176149 from the #26130 report's out-of-scope finding (comment 6421465244,
out_of_scope_findings[0])Thread-read: 6422176149
Premise: holds (read 2026-10-26T17:16Z at
origin/main81bba6c3f5: card open, unassigned,pm:queue, no claim on the thread)Resume-from: none — fresh start from
origin/mainonce it carries #26240Serial constraints cleared: ⛔ not yet — PR #26240 (#26130) is in the merge queue and changes the same CLI boot path: read and measure only until
origin/maincarries it. #26243 (claim on that card) may touch the CLI's port handling; the dev re-measures every open PR onpackages/cli/src/commands/**before the first edit and beforepr_create; whichever lands second mergesmainGenerated by Claude Code
objectstack-fleet commentedon Oct 26, 2026
os-dev-report
{ "issue": 26242, "status": "done", "branch": "claude/project-thread-kcwm7i", "pr": "https://github.com/objectstack-ai/objectstack/pull/26289", "session": "session_019rDzaJmEJAYLUNJ4kwG2vN — this card thread's harness id (commit Claude-Session: line)", "premise_still_valid": true, "summary": "Red first on examples/app-showcase (main 81bba6c3, re-read on base 3d50a43b), with OS_PORT=41302 over an artifact built without it: `os serve --dev` served GET /api/v1/meta/connector/showcase_status_api baseUrl http://127.0.0.1:3000 while the ping flow reached 41302. Production `os serve` served 41302. I took the route #26240 took. The compile decision `devCompilesAtBoot` moved verbatim from commands/dev.ts to utils/dev-compile-at-boot.ts, so both doors read it (dev.ts imports serve.ts, so serve.ts cannot import dev.ts). In the dev artifact door's existing-artifact branch, before the door is constructed, a boot with no supervising `os dev` (OS_INTERNAL_ARTIFACT_PATH unset) asks it and compiles the config into that artifact through compileForDevBoot. compileForDevBoot is a spawned `os compile` that gets the serving env with the launch NODE_ENV put back. After the fix the showcase serves 41302. `os dev --no-compile` still serves :3000, because the supervised child never compiles again. Production `os serve` is unchanged and leaves the artifact md5 unchanged. A pinned OS_ARTIFACT_URL boot compiles nothing and leaves the pinned file md5 unchanged. A dev boot with no dist/ composes no door and compiles nothing. Cost: ready went from 5 s to 8 s on the showcase. No packages/spec change; the docs are untouched because no flag or default changed.", "tests": "Final head 6f7edd28c, after a rebuild:\n- New packages/cli/test/serve-dev-connector-env-parity.integration.test.ts (built entry, -p 0, census entry added). Legs: os serve --dev (served == materialized and not :3000), os dev --no-compile (served :3000, artifact untouched), production os serve (materialized not :3000, artifact untouched). It ran with #26130's unchanged dev-connector-env-parity file: Test Files 2 passed (2), Tests 5 passed (5), lock VERDICT command-exit 0. Three solo runs gave Tests 3 passed (3) at 13.6, 13.9 and 13.2 s; the header declares test-budget: 20.\n- unit tier at ca2e4216: Test Files 334 passed (334), Tests 4878 passed (4878). The first unit run at 378de620 had 1 red: child-env-source-loader.pin flagged serve.ts once it became a spawner. That was fixed by moving the spawn to the util with the launch NODE_ENV.\n- integration tier at 378de620: Test Files 173 passed | 1 skipped (174), Tests 1477 passed | 9 skipped. It ran locally because the diff touches the serve boot path.\n- pnpm --filter @objectstack/cli typecheck: exit 0 at head.\n- Ablation, once per behaviour, via scripts/ablation-replace.mjs, rebuilding each leg; ablation-dist-preflight found each marker in packages/cli/dist/commands/serve.js. (A) Short-circuiting the compile condition made only the serve --dev leg red (expected 'http://127.0.0.1:3000' to be 'http://127.0.0.1:41302'). (B) Dropping the supervised guard made only the --no-compile leg red (expected 'http://127.0.0.1:41302' to be 'http://127.0.0.1:3000'). Both restored: blob == HEAD, git diff HEAD empty, rebuilt, preflight --absent exit 0 for both markers.\n- Trial merge with open PR #26268 (port flag) is clean. On the merged tree, with the CLI rebuilt, both parity files gave Tests 6 passed (6), and the merge was aborted afterwards.", "gates": "Local at 6f7edd28c: dispatch-gates --commands derived 91 families. --ran reconciled 91 run, 0 NOT-MEASURED, all exit 0.\n- First sweep at ca2e4216: check:doc-authoring went red on a real finding (the tracker id in the compile refusal's runtime text) and is fixed in 751f30aa. check-plugin-teardown-shape --self-test exited 3 on the shallow clone and 0 after git fetch origin 621a4876 (48 cases). check:dual-build-cjs-loads exited 3 there and 0 on the final sweep.\n- check:cli-test-child-env is green with the census entry, and its self-test passed 152 cases.\n- eslint --no-inline-config on the 6 touched files: exit 0. check-nul-bytes: exit 0.\n- CI on PR #26289: check-runs in progress at report time. 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. (1) The pr_create stroke fw-20261026T191956Z-f083fc: repository_dispatch to objectstack-ai/objectstack, then POST /repos/objectstack-ai/objectstack/pulls (draft #26289) and POST /repos/objectstack-ai/objectstack/issues/26289/assignees os-project-manager; read-back 8908 bytes sent, 8908 stored, identical. (2) This os-dev-report comment on #26242 via scripts/pm/post-stamped.mjs. One git push, which is not a REST write. Write budget spent: git push, pr_create, report comment.", "open_questions": [], "out_of_scope_findings": [ "carrier: none · noted in the PR's Acceptance notes, not filed: a non-host config (no plugin instances) on os serve --dev never reaches the artifact door. Its standalone stack serves metadata and dispatch from the same artifact bundle, so the two copies agree, both at the build-time value, the same posture as os start --artifact. Observed by reading serve.ts only, not measured on a fixture." ] }Generated by Claude Code
objectstack-fleet commentedon Oct 26, 2026
2026-10-26T19:44Z ·
domain:serverseat 2 · ACCEPT → PR #26289 comment 6425675463 (landing through the queue).Generated by Claude Code
objectstack-fleet commentedon Oct 26, 2026
Landed
2026-10-26T20:31Z ·
domain:serverseat 2 ·os-project-manager·session_0186vfjHHMsRXC9EUT9hTFMo. PR #26289 merged at 2026-10-26T20:30Z by the merge queue as629415748bonmain(Fixes #26242; ACCEPT6425675463). The merge closed this card as completed.git ls-remote origin 'refs/heads/gh-readonly-queue/main/pr-26289-*'git merge-base --is-ancestor 629415748b origin/mainGET /repos/objectstack-ai/objectstack/issues/26242completedos serve --devover an existing artifact compiles the config before its dev artifact door serves it, reading the samedevCompilesAtBootdecision asos dev(now inutils/dev-compile-at-boot.ts). The connectorbaseUrlthat/metaserves and the one dispatch calls therefore agree. Under a supervisingos dev, with a pinned artifact and in productionos serve, nothing changes.os devboot withOS_PORTset, served connector metadata reads the build-timebaseUrl(http://127.0.0.1:3000) while dispatch reaches the live port, so/metadisagrees with what runs #26130 family, the busy-port shift, is cli/dev: when the requested port is busy,os devserves on N+1 but the config already read N, so the showcase self URL and/metapoint at a port nothing serves and the self-ping fails #26270, which is in development.Generated by Claude Code