Repository navigation
Harden Dev MCP reliability across host binding, worker startup, and timeout reconciliation #15
Description
EXECUTION-PLANE DECISION GATES — 2026-09-20
Provider-runtime expansion remains on Owner hold. The concrete next evidence gate is #217 (Codeg external coding-agent execution-plane pilot). The parallel ChatGPT peer/browser-runtime decision is #218 (Chat On Steroids pilot). Do not resume Grok/Cline/OpenCode/Codex/Agy adapter expansion from the older gates until #217 is adjudicated. Do not treat #218 as provider-runtime evidence; it governs the separate ChatGPT worker-runtime lane.Generic gateway/reconnect/reconciliation work remains separately active where already authorized (#194, #163), and bounded secret-redaction safety remains valid (#90).
OWNER ARCHITECTURE HOLD — 2026-09-20
Do not auto-chain or start new provider-specific Grok/Cline/OpenCode/Codex/Agy runtime/adapter work from this Issue. Preserve evidence and existing safety invariants. The next gate is a bounded external execution-plane comparison/spike and an explicit keep/move/retire decision. See the latest Owner reconciliation comment for scope and exceptions.
Owner scope amendment — macOS only (2026-09-11)
依 Owner 最新裁決,本工作線相關功能設計、實作、交付與驗收 只處理 macOS。本裁決取代下文較早的跨平台/三平台要求。
- Windows、Linux 支援、移植、修復與平台驗證不在本次工作範圍;不再以三平台全綠作為本工作線的 acceptance criterion。
- 驗收保留 macOS 上必要的 source tests、獨立 package/install、真實呼叫入口、operation/副作用/讀回及適用的恢復與終態證據;ownership、lease、CAS、安全與獨立審查要求保持有效。
- 下方歷史測試、PR、平台結果與問題紀錄保留作為歷史證據,不代表目前仍有跨平台交付承諾。後續設計及驗收計畫以此 macOS-only 範圍為準。
- 本次更新僅修正 Issue 與規劃範圍;實作、部署與重啟仍依 Owner 的暫停指令保持暫停。
- 此文字更新不會自行修改 GitHub CI 設定或 branch protection;既有檢查設定如與新範圍不符,須另行明確調整,不得假稱已通過或繞過保護。
Goal
Make the ChatGPT → Dev MCP → worker execution path reliable enough for repeated single-worker engineering tasks before returning to batch autonomy / multi-worker use.
This is a new reliability work package, not a continuation of the completed codex-engineering-system-zh-tw adoption gates. It also should not be folded into #11, which is specifically about reconciling the live-verified Codex Goal 0.149 TUI compatibility Candidate.
The broader reliability problem was exposed while validating Codex Goal mode and while dispatching Agy/OpenCode workers. The failures span host binding, worker startup, timeout semantics, reconciliation, and adapter permission/runtime behavior, so the issue boundary is now Dev MCP reliability, not only "Dev MCP → Codex".
Current baseline
Current GitHub main has already moved beyond the original Goal-mode integration line:
dd534135adc2b6145829022eea7dbb845ddc18b2reconciled the earlier durable-dispatch /DEVSPACE_CODEX_GOALS=1reliability line onto main.8b61ae9b0cb240cde54c798dbc67856e7afac45badded post-main reliability fixes, including waiting for resolved Codex model + directory before typing/goal.99ebab77a1324543523da116e27334f2e565277dis the observedmainhead from 2026-08-26.- Reconcile Codex Goal 0.149 TUI compatibility Candidate into maintained source #11 remains the bounded Codex Goal 0.149 compatibility reconciliation issue and should stay separate.
The old adoption experiment that installed and validated the global Codex Engineering Profile is closed. Its G1–G7 gates do not need to be reopened.
Observed reliability failures
1. Host discovery / direct-recipient binding drift
Observed in ChatGPT after Dev MCP reload:
- MCP discovery reported 15 Dev tools and explicitly advertised
dev.open_workspace. - Immediate invocation of that just-discovered tool returned
Resource not found: dev.open_workspaceand requested rediscovery. - Rediscovery again reported the same 15 tools.
- A second invocation again returned
Resource not found.
This is stronger than "Goal tools are missing". It indicates a possible mismatch between the host-visible action catalog and the direct-recipient binding/runtime instance actually used for invocation.
Required classification must distinguish at least:
- host action binding/cache drift;
- stale discovery versus live manifest;
- MCP transport availability failure;
- server-side unknown action;
- runtime/source revision drift.
Do not treat one of these as another without physical evidence.
2. OpenCode isolated-server readiness is too brittle
Multiple OpenCode profiles reached failures of the form:
OpenCode server failed to start on an isolated port after 4 attempts: Timeout waiting for OpenCode server on port ...
This occurred across more than one model/profile (including DeepSeek and Hy3; Muse succeeded on another attempt), so model quality alone does not explain the failure.
Current source inspection showed the isolated opencode serve readiness wait using a short fixed timeout (approximately 5 seconds per attempt). Real cold-start behavior on the observed Mac can exceed that window.
The repair should make readiness bounded but robust enough for normal cold-start variance. It must still fail closed on a real dead server and must not leave orphaned OpenCode servers behind.
3. Provider cold-start budget is conflated with execution wall-time
Agy tasks repeatedly consumed a large fraction of maxWallMs in provider startup / transition from starting to running before task-local work began.
Observed examples included 90 s, 120 s, and 300 s contracts where the provider startup delay dominated the wall budget. Some attempts timed out before any task mutation occurred.
The control plane should distinguish at minimum:
- provider/startup budget;
- active execution budget;
- idle budget;
- total hard safety ceiling.
A probe-sized 120 s contract should not silently become the default contract for Goal-mode or other long-running engineering work.
4. MCP/tool-call failure does not reliably describe physical command state
During npm run build, the ChatGPT-facing MCP call returned 502 / tool failure while the local process continued running through Vite and TypeScript compilation and later produced the expected dist/codex-goal-sessions.js artifact.
Therefore:
MCP/tool response failed must not imply local command failed or stopped.
A controller needs a bounded way to reconcile the physical process/result after transport failure before deciding whether a retry is safe. Blind duplicate command execution is not acceptable.
5. Timeout/error classification is too coarse for orchestration
The observed failures include materially different classes:
- provider/model stall or long startup;
- isolated OpenCode server readiness timeout;
- execution-contract
maxWallMstimeout; - MCP/host transport or 502 response failure while the process continues;
- interactive permission block;
- revision-fence / stale workspace identity rejection.
These need distinct structured terminal/error classes so the controller can decide whether to retry, reconcile, continue the same session, or stop.
6. Durable reconciliation exists but needs real-path closure
agent_reconcile is already part of the reliability line and proved useful: after provider timeout/error it can show exact HEAD, dirty state, changed paths, and whether a Candidate exists.
The remaining requirement is to make this behavior the normal recovery path after ambiguous timeout/disconnect, not an exceptional manual debugging step.
Expected invariant:
timeout/disconnect → same agent/session → physical reconciliation → only then retry/continue/stop
Never infer "no mutation" from provider error alone.
7. External-directory permission has no bounded owner-grant seam
OpenCode successfully entered a session but blocked on:
permission 'external_directory' for /Users/jameschen/.local/opt/devspace-chatgpt/*
The adapter correctly fails closed and does not auto-approve interactive permission escalation. That safety property should remain.
However, the control plane currently lacks an obvious narrow mechanism for an owner-authorized exact external path grant scoped to one task/session, with expiry and a receipt.
Do not solve this with broad filesystem authority or global auto-approval.
8. Codex provider/model binding must be explicit
Earlier Dev MCP → Codex validation showed that an under-specified Codex profile could inherit an unintended/default model route and stall, while explicit binding to gpt-5.6-sol restored expected behavior.
Formal Codex worker profiles should bind the intended provider/model identity rather than relying on ambient/global defaults. Transport identity must be visible in receipts.
9. Proxy/rate-limit configuration warning
The Dev MCP stderr has shown:
ERR_ERL_UNEXPECTED_X_FORWARDED_FOR
with Express trust proxy false while receiving X-Forwarded-For.
This is not currently proven to be the main dispatch blocker, so keep it lower priority, but the proxy/rate-limit identity configuration should be made internally consistent and tested through the real tunnel path.
Proposed gate sequence
G1 — Bind current runtime identity
Establish one exact current-state snapshot before mutation:
- source checkout / branch / HEAD / dirty state;
- built artifact identity;
- LaunchAgent/service PID and start time;
- listen endpoint;
- tool manifest/schema identity if available;
- ChatGPT discovery observation and direct-recipient binding state.
PASS requires source, loaded runtime, and host-visible action identity to be attributable to the same intended deployment.
G2 — Host discovery/binding reliability
Reproduce and then eliminate the case where a just-discovered Dev tool cannot be invoked as a direct recipient.
Acceptance:
- fresh discovery returns the expected tool set;
- at least 10 consecutive read-only calls to a discovered stable tool succeed across one normal MCP reconnect/rebind cycle;
- after a Dev MCP reload, the host either refreshes to the new action surface or returns an explicit stale-binding/review-required condition — never
listed but uncallablewithout classification; - server unknown-action and host binding failures are distinguishable.
G3 — OpenCode readiness reliability
Acceptance:
- bounded adaptive/configurable readiness instead of a brittle fixed cold-start assumption;
- clean failure when server genuinely never becomes ready;
- no orphan process after failed attempts;
- 3 consecutive real OpenCode worker starts succeed for at least two representative profiles without changing the semantic task.
G4 — Worker timing contract
Acceptance:
- startup/cold-start time is observable separately from active execution;
- execution and idle timers have explicit semantics;
- total hard ceiling remains bounded;
- a deliberately slow startup does not consume the entire task execution allowance without a classified result;
- short probes and long-running/Goal tasks can use different contracts without hidden defaults.
G5 — Transport failure + physical reconciliation
Acceptance:
- deliberately interrupt or simulate the controller/tool-response path while a bounded local command/worker is active;
- physical process/Candidate state remains queryable through a stable reconciliation path;
- controller can determine
still running,completed,failed, orunknownwithout launching a duplicate; - retry requires a reconciled terminal/no-effect state or an explicit new-attempt fence.
G6 — Error taxonomy
Acceptance:
Expose structured, non-overlapping classifications for at least:
- provider startup timeout;
- provider execution timeout;
- idle timeout;
- isolated server readiness failure;
- host/MCP transport failure;
- permission block;
- revision/workspace fence rejection;
- verifier/semantic failure.
Human text may vary, but the machine-readable class must support safe routing/retry policy.
G7 — Bounded external-path permission
Either:
A. implement an exact-path, exact-task/session, expiring owner grant with an observable receipt, or
B. explicitly document that external-directory work remains unsupported and require callers to open/rebind the target as a workspace instead.
Broad auto-approval is not acceptable.
G8 — Explicit Codex identity
Acceptance:
- Codex worker/Goal execution receipts expose exact provider/model/effort identity;
- formal Codex profiles do not inherit an unrelated ambient model default;
- mismatch or unsupported effort fails before consequential mutation when possible.
G9 — Three real-task reliability trial
After G1–G8, run three representative real tasks rather than synthetic-only tests:
- short bounded worker task;
- medium task with verification/reconciliation;
- long-running Codex Goal task.
PASS requires no blind duplicate dispatch, no ambiguous terminal state, and independently verified physical results for all three.
Only after this gate should Dev MCP be treated as ready to resume batch-autonomy / multi-worker expansion.
Relationship to Codex Goal work
Codex Goal remains a high-value E2E canary, but it is not the boundary of this issue.
- Reconcile Codex Goal 0.149 TUI compatibility Candidate into maintained source #11 owns the bounded Codex Goal 0.149 TUI compatibility reconciliation.
- This issue owns the generic ChatGPT ↔ Dev MCP reliability/control-plane behavior needed to run Goal mode and other workers predictably.
- Once Reconcile Codex Goal 0.149 TUI compatibility Candidate into maintained source #11 and the relevant reliability gates are integrated, a real
codex_goal_start/ Goal-achieved E2E should be one of the G9 trials.
Do not create a second router, verifier, acceptance authority, or Nexus governance layer as part of this work.
Non-goals
- Reopening the completed Codex Engineering Profile adoption experiment.
- Changing Nexus authority, Task Card semantics, or acceptance ownership.
- Solving Reconcile Codex Goal 0.149 TUI compatibility Candidate into maintained source #11's two-file Codex Goal TUI state machine inside this issue.
- Broad shell/filesystem authority as a workaround for missing narrow actions.
- Batch autonomy or multi-worker scheduling before single-worker reliability passes G9.
Claim ceiling
Until the final real-task reliability gate passes, the strongest allowed claim is:
Dev MCP has reliability improvements / partial verified coverage; repeated unattended engineering reliability is not yet proven.
Activity
James3014 commentedon Aug 28, 2026
G3 source Candidate progress receipt
A bounded current-main reconciliation for the OpenCode startup-readiness portion of G3 has been implemented and independently reviewed.
Identity:
99ebab77a1324543523da116e27334f2e565277df01670c42ace59e3f96bb63d82e65b643bb017daa07623507179c5df1d50513e631bcaba4985ea1fcodex/issue-15-g3-opencode-readinessin an isolated worktree; the dirty canonical checkout was not consumedExact changed paths:
src/local-agent-opencode.tssrc/local-agent-opencode.test.tssrc/local-agent-adapters.tsBehavior:
DEVSPACE_OPENCODE_STARTUP_TIMEOUT_MS, hard-capped at 120 seconds;DEVSPACE_OPENCODE_TIMEOUT_MSand the existing execution/idle semantics;Independent coordinator verification on the exact Candidate:
npx tsx src/local-agent-opencode.test.ts: PASSnpx tsx src/local-agent-adapters.test.ts: PASSnpm run typecheck: PASSnpm run build: PASS (existing Vite chunk-size warning only)git diff --check 99ebab77..f01670c4: PASSClaim ceiling / remaining G3 gate:
James3014 commentedon Aug 28, 2026
Live Runtime Migration receipt for PR #16 / main
df23f4c1Integration and deployment identity
4a26cae8db9f4bdde19591f3d68a8be214e8b7f8df23f4c119207378f61c982e462c9e6281bd198c93891774a1a554c5e6a75c2ddf0314301f34f4c0(exactly the accepted Candidate tree)99ebab77a1324543523da116e27334f2e565277d+4a26cae8...npm ci, typecheck, and build PASS/Users/jameschen/Workspace/.devspace-chatgpt/deploy/devspace-main-df23f4c124909;/healthzreturns{"ok":true,"name":"devspace"}dist/cli.jsSHA-256:7247816704b914e86a11ff536acc3df2246121182fbb21b3ed7e8d91a06c82f9dist/codex-goal-sessions.jsSHA-256:5fe20984b8330a6d6272f6256c83f2d1b3fb2a4e4a37c7c74dcb46f80d901082devspace-main-99ebab77remains retainedPR #13 overlap reconciliation
GitHub update-branch merged current main into PR #13 without force-push. Its duplicate
src/cli.ts/src/cli.test.tsdelta disappeared; PR #13 now contains only:src/config.test.tssrc/local-agent-config.test.tssrc/local-agent-config.tsCanary 1:
candidate_promote— PASSReal authenticated 7677 MCP path:
0c02b5505714a75785b6cb3e789a8b4e5cefa7175bec3f92dc99b19add7bfbbb8fe6be138a054e8b753f37ff1eb8ecb6e40538adc153281a49dc4ba3mainread back at the Candidate head/tree with clean status and expected file contentCanary 2: Agy durable review — functional PASS, cleanup defect found
agt_60a35cc5agy/gemini-3.6-flash-medium25ab4db6-2189-4a71-b8e5-84388ae43463completedAGY_DURABLE_REVIEW_OKchangedPaths=[]; target repo remained cleanPhysical post-terminal reconciliation found worker PID
24044still alive withPPID=1. The deployed CLI advertisedagents cancelin help, but actual invocation returnedUnknown agents command: cancel; therefore the exact owned terminal worker was cleaned up by PID only after identity verification. PID/process absence was then confirmed. This is a real G5/G6 cleanup/error-surface defect, not a PASS for orphan-free reliability.Canary 3: real Codex Goal — FAIL / reconciled, no blind retry
The first production probe exposed stale deployment identity in
~/.devspace-chatgpt/env: later duplicate exports overrode the initially correctedDEVSPACE_CODEX_BIN, andCODEX_COMMAND/DEVSPACE_CODEX_EXECUTABLEalso pointed atdevspace-main-99ebab77. All effective values were aligned todevspace-main-df23f4c1, 7677 was restarted, health rechecked, and no old-path Goal process survived.Even after every effective executable identity key was bound to
df23f4c1, the real authenticatedcodex_goal_startforgpt-5.6-sol/lowstill exceeded the MCP client 60-second request deadline. Physical reconciliation proved the child used the exact new deployment path, remained active until the server-side activation fence elapsed, then exited; the target repo stayed clean. NogoalActiveObserved,Goal achieved, or completion marker receipt was obtained. After three materially distinct attempts (old pin, partially corrected pin, fully corrected effective pin), no further Goal dispatch was made.Disposition
LIVE_RUNTIME_MIGRATION_GATE_NOT_GREENThe new runtime remains serving and healthy at 7677; the prior deployment is retained for rollback. This does not establish batch-autonomy or unattended multi-worker readiness, and Issue #15 remains open.
James3014 commentedon Aug 28, 2026
Superseding public closure for PR #17
PR #17 is merged at main
63ca390d05b67cd8d6eeda8f7e1d9d71424eca15, containing reviewed Goal lifecycle commitc7e3d5696af5b280fcbe00f8231da2a7bd0b9a21and agent lifecycle commit5a84977023a7706f8ab732616496a8e523c54684.The prior degraded PR #16 live result is superseded:
agents cancel --jsonroute: PASSClosed root causes: compact trust-dialog detection, prompt return of durable Goal handles before activation, serialized per-session PTY lifecycle with cancellation/shutdown fences, previously unreachable cancel routing, and terminal worker retention through inherited provider pipes.
Claim boundary: the PR #16 Goal/Agy migration failure is closed by the PR #17 successor runtime. Issue #15 remains open for the other G1-G9 work; this receipt does not claim full batch-autonomy or multi-worker readiness.
James3014 commentedon Aug 28, 2026
Reliability closeout progress (post-PR #20)\n\nPR #20 merged at main
52a3a398f2fc60c72ceafb134b0c5ce16849e733after two independent reviews. The merged tree exactly matches the accepted PR head. Full repository tests, typecheck, build, and diff checks passed before merge; a clean build from the exact merged main also passed.\n\nThe exact main deployment is now serving on 7677 with bounded one-hop proxy trust. Local and public health checks pass, and no new permissive-proxy warning has been written by the new runtime.\n\nPost-deploy acceptance:\n- authenticated MCP discovery/reconnect: 10/10 stable read-only calls across a fresh OAuth/client reconnect; tool surface remained stable;\n- transport interruption: an active command survived controller disconnect, was reconciled after fresh authentication, exact replay reused the existing result, and conflicting replay failed closed;\n- G9 short OpenCode task: completed with provider session, exact marker, no changed paths;\n- G9 medium Agy task: completed, reconciled, exact marker, no changed paths;\n- G9 long Codex Goal: explicitgpt-5.6-sol/low, Goal Mode observed, Goal achieved, exact marker observed, clean cancellation;\n- durable records are terminal with no worker PID, and both test repositories remain clean.\n\nG7 uses the documented fail-closed option B: external-directory provider permission is not a workspace grant; callers must open/rebind the exact allowed workspace. PR #13 was closed because its remaining change would have implicitly enabled every provider.\n\nClaim boundary: local authenticated MCP, deployed runtime, transport reconciliation, provider execution, and G9 are green. The one remaining observation before closing #15 is a real ChatGPT-host direct-recipient call after reload; this is not being inferred from the local MCP client.James3014 commentedon Sep 3, 2026
2026-09-03 multi-session reliability reconciliation
Fresh audit shows #15 remains the correct umbrella, but four newly proven root causes now have focused execution homes:
1f626813...diverges from canonicalmain=458bb443...and no longer exposes the previously promoted G9authorityMode/nexusGrantseam.idleTimeoutMsschema/runtime mismatch. Host schema says non-enforced while runtime actively terminates silent workers; recent durable error sample contains 45idle_timeoutterminations.Execution frontier: fix #30 first before relying on the live runtime for the other changes; #32 can be implemented from canonical source in parallel as a bounded contract/test repair; #31 and #33 should coordinate because both touch multi-session/server integration surfaces. Do not close #15 until these focused children plus the remaining older provider/reconciliation reliability obligations are reconciled against a fresh live runtime.
James3014 commentedon Sep 4, 2026
2026-09-04 final host-binding gate remains open
Fresh reconciliation confirms the loaded Dev MCP backend itself is now current:
main:296a3066fc620169f23beeeb5c9c41d9c9370d75sourceCommit: same296a3066...devspace-1.0.7-296a3066b5a25a86-30d7-4bce-bd10-1c7e417cc025However, the final ChatGPT-host direct-recipient/tool-binding observation is still not green. Fresh ChatGPT-side Dev MCP discovery exposes an older
agent_start.executionContractschema than canonical source: the host-visible schema lacks current fields includingauthorityMode,nexusGrant, andidleTimeoutMode, and still presents the olderidleTimeoutMswording, while exact296a3066...source registers the newer contract.Therefore the historical statement that #15 had only one remaining ChatGPT-host observation remains accurate, and that observation currently fails freshness/equivalence, rather than being merely untested.
Current disposition
#15 = KEEP_OPEN / FINAL_CHATGPT_HOST_BINDING_GATE_NOT_GREENExact next gate
After #30's host schema refresh/binding closure:
listed but uncallableor stale-schema behavior;This does not block source-only Chat Swarm work (#46-#48), but it remains a hard prerequisite for the first live multi-worker canary (#49), consistent with #15's original batch/multi-worker reliability boundary.
James3014 commentedon Sep 4, 2026
2026-09-04 ChatGPT direct-recipient reliability witness
Fresh ChatGPT-host execution completed the remaining bounded direct-call probe on the currently loaded Dev MCP runtime.
Bound runtime
main:296a3066fc620169f23beeeb5c9c41d9c9370d75sourceCommit:296a3066fc620169f23beeeb5c9c41d9c9370d75devspace-1.0.7-296a3066b5a25a86-30d7-4bce-bd10-1c7e417cc025Direct-recipient probe
After fresh Dev tool discovery/rebind in this ChatGPT conversation,
dev.agent_preflightwas invoked consecutively more than the Issue-required 10 times against workspacews_c9e1d6e99band profileagy-medium-implement.Observed on every call:
Resource not found/ unknown action;agy/gemini-3.7-flash-medium, Agy runtime1.1.26);used=0,max=4,AVAILABLE);unknownrather than being promoted to PASS.This closes the narrow historical failure mode where ChatGPT could freshly list a Dev tool and immediately fail to invoke that same direct recipient.
Remaining blocker
Do not close #15 yet. The current ChatGPT host-visible
agent_startschema is still stale relative to the loaded296a3066...source: the host surface lacks current fields such asidleTimeoutModeand retains the older idle-timeout description. That unresolved host catalog/schema freshness is already tracked under #30 and prevents claiming the full post-reload host-binding surface is current.Disposition
#15 = KEEP_OPEN, now blocked only by the remaining P0: Prevent live Dev MCP runtime lineage drift and capability regression #30 host-schema/catalog closure plus any fresher evidence that invalidates this witness.No provider worker was started and no repository mutation occurred during this probe.
James3014 commentedon Sep 4, 2026
Reliability frontier reconciliation / Issue-first execution policy — 2026-09-04
Owner workflow decision for the remaining Dev MCP reliability campaign:
If fresh evidence exposes a same-contract defect, keep/reopen the owning Issue or record a bounded contract delta there. Create a focused follow-up Issue only when post-completion reconciliation proves the new gap is outside the completed original contract.
Current canonical source watermark
main:296a3066fc620169f23beeeb5c9c41d9c9370d754d47c8e5e58b8302c076c1b97c990c4005b11843Durable remaining reliability frontier
Downstream multi-worker work
#49 (Chat Swarm live canary) already treats #30 and #15 as hard runtime reliability prerequisites. #31 live acceptance is part of satisfying that reliability boundary and must not be bypassed by Swarm source readiness.
Execution rule
Before any future Dev MCP reliability mutation:
Chat conversation may coordinate, but GitHub Issues are the durable execution source of truth for unfinished reliability work.
James3014 commentedon Sep 8, 2026
Fresh dispatch audit and remaining execution frontier — 2026-09-08
Owner asked to reconcile real Dev MCP dispatch failures with model catalog claims and ChatGPT Web worker plans. Audit used the actual Dev connector, canonical GitHub source, native preflight/start/status/reconcile and an isolated worktree. No production restart, merge, global provider enablement or model substitution occurred.
Bound identity
e9942d2a598866e8f8c091304b1700065791091cdevspace-1.0.7-e9942d2a0e2be1ab-a4b3-482b-a78a-ade05f58b96d1.18.25Real canary: NOT PASS
Profile preflight for
opencode-mimo-free-implementcorrectly returned UNKNOWN: auth/provider reachability unknown; runtime configured and local capacity 0/4 available. A single actual nonce-bearing read-only package.json worker was then started under an OWNER_DIRECT bounded EVIDENCE_COLLECTOR contract. Two initial calls were rejected before spawn for caller contract errors (read-only ownership flag, then mismatched dispatchIntent.attemptId); corrected admission created only one durable agent.agt_42bfef8adevspace-dispatch-audit-20260908-mimo-readonly-1opencode/mimo-v2.5-free2026-09-08T10:08:38.793Z2026-09-08T10:08:56.483Z(~17.7 s)PROVIDER_PROTOCOL_ERROR,OpenCode did not return a final assistant response.No second worker was dispatched. This proves failure in the real result-return path, NOT authentication failure, quota exhaustion or poor model quality. Capture exact upstream session/result-envelope/finish-reason evidence before choosing a provider/adapter fix. G6 error attribution and G9 real task reliability remain owned here; do not create another umbrella issue for this symptom.
Durable work mapping
-32602). Existing dirty shared source has direct-dispatch work; reconcile its bounded slice instead of overwriting or deploying the mixed 15-file batch. Bind actual production schema and host discovery before live direct-route claims.#31 is already closed/completed; this audit does not reopen or negate that lifecycle acceptance. Source/build equality alone does not settle #30's currently reproduced host schema mismatch.
Correct claim contract
Separate: provider enum -> enabled config -> binary -> catalog membership -> exact model/effort -> auth/entitlement -> local/provider capacity -> successful bounded task -> task verification. Unknown stays unknown. Public free promotions or
Nexus model_workforce.yamlare not DevSpace live account/dispatch evidence. DeepSeek and LongCat were observed on this host as opencode-go routes, not independently verified free routes.Remaining acceptance order: #30 host/backend alignment; #58/#59 catalog/readiness integration; account/adapter/result-path diagnosis under #15 and repeat only reconciled, bounded exact-route canaries; final reliability trials; then #49. No unattended multi-worker or full provider-reliability claim is established.
James3014 commentedon Sep 8, 2026
Same-attempt OpenCode session readback (no resend)
After the failed
agt_42bfef8acanary, a read-onlyopencode exportof its exact returned provider session succeeded (exit 0). Export reports the bound isolated workspace, OpenCode 1.18.25, provider/modelopencode/mimo-v2.5-free,messages: [], and reported input/output/reasoning token counters 0. No model request was retried.This is evidence of an empty persisted session on that export surface, not proof of account quota/auth failure, no external effect, or a final-response parser bug. The next bounded diagnosis should correlate the actual prompt HTTP/SDK acknowledgment, v2 messages/prompt lifecycle and exported session view before changing adapter behavior. Do not turn empty output into success or automatically resend the original task. The original provider-protocol error remains the canonical terminal result.
James3014 commentedon Sep 8, 2026
2026-09-09 接手重規劃:保留候選,完成實際交付;選擇性借鏡 Open Dynamic Workflow
決策與工作邊界
Owner James 已授權原完整交付目標,不重新詢問相同授權。角色保持:主控規劃、審查、獨立驗收;Luna 實作。本次要求是先研究、重規劃、寫入 issue;本次沒有恢復 worker、修改本機候選、合併 PR 或部署。
不引入另一套 workflow engine,不把 ODW 安裝成必要 dependency,不重寫現有 DevSpace。 本 issue 繼續擁有派工可靠性與實際交付協調;#62 擁有跨對話 ownership/handoff/matrix;#46–#51 擁有 Swarm,避免建立重複總案。
本次重新取得的證據
e9942d2a598866e8f8c091304b1700065791091c489ad06ca009d8c3d407008e7c5308cde97c74ad,base main97fbefc041b7b60876d1dbbe45ae7c10617a61f0,base #60 分支total_count=0;PR-triggered workflow_runs 都為空dev及 registry 回傳名稱均未發現可呼叫工具 namespace本次無法讀取 Mac 的 objective、Matrix、dirty diff、測試 log、安裝套件或服務狀態。以下都仍是 HANDOFF_REPORTED / REBIND_REQUIRED:domain
51f57f0c的 17/17、transport45f52173的 40/40、installed runtime e994、fork Actions UI 尚未啟用、clean package 與 helper 證據。不可改寫成接手主控親自驗證。外部參考:採用 invariant,不移轉 authority
固定研究
travisliu/open-dynamic-workflow@164b313a75f1e05b0e294a2085b6e44721959762(memory-issues 分支)。本次是源碼/文件閱讀,未執行 ODW 測試,不主張它優於 DevSpace 或具備完整跨對話治理。requested → resolved → observed;resolved 配置不是 observed model attestation。別名等價不表示權限、價格、可用性相同。修正後執行順序(D* 是本次交付分段,不是附件 G0–G6)
D0 — 接手與凍結現況。 Dev 工具可用後先讀原 objective 與 AGENTS.md,核對全部 worktree、exact HEAD/base、scope、暫停 worker、dirty diff 與證據。保留共享 checkout 的 15 個 unrelated dirty files,不 reset/stash/clean/吸收。domain ownership.ts 的 renew/reconcile dirty diff 不是
51f57f0c的已驗收內容;先讀再接續,不能新派 worker 覆蓋。舊 agent handle 不直接復用。D1 — 並行清除交付環境缺口。 一條確認 native Dev 工具 discovery + invocation + runtime/schema 身分;另一條確認 fork Actions 啟用並產生真正 CI runs。CI 讀取/準備不必等待 #62 全功能完成。當前 ci.yml 支援 pull_request 及 main push,沒有 workflow_dispatch;不能對不存在的 run 做 rerun,也不能把空 checks 當通過。對 PR head、base 與 GitHub test merge subject 分別記錄。Fork UI 現況要重新觀測;不改 OAuth/secrets 或加入高權限 workflow 作捷徑。
D2 — 完成已開工作,而非擴大架構。 Luna 在同一六檔 domain scope 完成 #62 的 renew/reconcile、handoff、path/corrupt-state 與明確 consumer 接線;每一增量凍結後主控驗收。transport
45f52173保持獨立四檔候選,重新綁定其 diff/base/log,不重跑已 exit 的舊 process 等待迴圈。ODW 研究不授權增加簽章服務或另一個狀態庫。D3 — 依賴式 PR 與整合。 #60 exact CI/獨立 review → 合併;#61 對新的 main 重新核對/調整 base、內容及 CI → 合併;再處理獨立 transport delta 與 #62 reviewed slices。任何 base/head 或 material tree 改變,都重新計算必要驗證,不能只沿用 PR green 或歷史 full-test 數字。無關修改不得混入。讀 CONTRIBUTING.md 後才新增/更新 PR。
D4 — 最終套件與受控切換。 從選定且整合驗證通過的 final SHA 乾淨 build/pack;核對 package identity、必要檔案及安裝後入口,不直接使用 source09402 的舊 tgz。受控 deployment 遵守既有 #31 lease/drain/reconcile 機制,記錄 active work、前後 server identity、source/build/schema manifest、恢復材料與 reconnect 結果;unknown restart 先 reconcile,不能再踢一次。Swarm 在單 worker 驗收前保持未啟用。#62 尚未實際接線的操作不得宣稱受全域鎖保護;維持單一 coordinator 與現有受控 effect seam。
D5 — 原生單 worker 閉環。 ChatGPT → Dev MCP 的真實呼叫驗收 #30/#58/#59/#15/#5:profile/direct 選擇一致、catalog freshness、exact observed provider/model、Cline thinking 無可信 setter 時明確拒絕、當前 turn 回傳、scope/physical reconcile、terminal timing。保留所需短/中/長任務與錯誤反證;先前本機 MiMo/Cline smoke 不能代替。
D6 — Swarm 原生閉環。 D5 過後完成 #48 native tools/config/readback,再依 #49 使用兩個真實 ChatGPT conversations;凍結 20/20 task accounting 與 replay/conflict/wrong-worker/restart-unknown/drain 測項。不能用兩個 Node clients、SDK、mock 或 coding-agent processes 替代。測試 realm 隔離、最多 2 workers、零 repository mutation。
D7 — Continuity 真正交付。 #49 通過後才實作並獨立驗證 #51;受控整合/更新後實際 rollover,證明 stable workerId、epoch 遞增、task/attempt 不遺失、舊 carrier 被拒絕、沒有 unknown-effect replay。只寫 capsule 或本機測試不算完成。
防止再次偏離的執行規則
done=true掩蓋未完成層。本次完成上限
已完成外部來源研究、遠端 PR/CI/Issue 重新核對與 issue 重規劃。沒有主張 Mac objective/dirty state 已讀、沒有修改唯一 Matrix、沒有執行 CI 啟用/實作/merge/deploy/native canary。下一個實作前 gate 是 D0 本機 exact rebind + D1 原生工具/CI 真實可用性,不是重新收集相同 Owner 授權。
James3014 commentedon Sep 9, 2026
D2 scope 補正(同一重規劃,不新增工作線)
上方 D2 的「六檔 domain scope」只包含 ownership/handoff/matrix 的實作與測試。production consumer 接線不屬於這六檔,必須在 domain 凍結驗收後,以 #62 C3 的獨立切片明列額外 allowed paths、base、production entrypoints 與驗收條件,再交給 Luna。 不能要求 worker 一面遵守六檔上限,一面默默修改 server/cutover/durable-operation consumers。transport45f52173仍是另一个四檔候選,三者分別審查與整合。
James3014 commentedon Sep 11, 2026
Follow-up proposal: add a read-only control-plane health witness
This is a bounded sub-requirement of #15, not a new routing/governance layer.
Recent Nexus/DevSpace work still hits a recurring diagnostic ambiguity: tool discovery may be visible while actual invocation is unavailable, and this can be misclassified as a provider, workspace, or runtime defect. #15 already owns the broader host-binding/reliability problem; the missing productizable capability is a single read-only health witness that identifies which layer is healthy.
Goal
Expose a typed read-only diagnostic that distinguishes at least:
Example shape (names may differ):
{ "schema": "devspace.control_plane_health.v1", "server_instance_id": "...", "source_commit": "...", "build_id": "...", "tool_manifest_generation": "...", "mcp_surface": "READY|DEGRADED|UNAVAILABLE|UNKNOWN", "workspace_registry": "READY|DEGRADED|UNKNOWN", "read_only_workspace_probe": "PASS|FAIL|NOT_RUN", "provider_plane": "SEPARATE", "blocker_layer": "HOST|CONNECTOR|SERVER|WORKSPACE_REGISTRY|NONE|UNKNOWN", "next_action": "..." }Requirements
UNKNOWN, never fabricated PASS.Acceptance criteria
READY.Product/development impact
This should fit naturally under #15 G1/G2/G5/G6 rather than creating another generic reliability issue.
James3014 commentedon Sep 11, 2026
CONTRACT_DELTA — Session continuity / OpenAB SessionPool donor audit — current-state reconciliation (2026-09-11)
This comment supersedes its earlier wording that was bound to stale DevSpace
main@502b4f240200b5ca73ac504d6a2d719abc42c177. A fresh re-audit found current GitHubmainand the live Dev MCP runtime both at:James3014/devspace@3c9805c2193d82e662546af0ec5b34fedc9fbeb5devspace-1.0.7-3c9805c2closed, modenormal,reconciliationRequired=falseopenabdev/openab@843bb729380a2718ba4c5c009f311131f5ee5058The old
502b4f...watermark is 122 commits behind this re-audit and must be treated as historical evidence, not current state.Reconciled conclusion
OpenAB SessionPool remains a
PARTIAL_PATTERNdonor, not a component to transplant. DevSpace must retain its existingLocalAgentStore/ execution lifecycle / control-plane ownership as the authority; do not insert an OpenAB-style second create/resume/evict/session authority.The useful donor invariant is narrower: provider conversation identity is durable state distinct from the live provider process, and a continued/new semantic turn must not silently execute in a context whose continuity identity is unknown or has changed.
Findings superseded by current Dev MCP
The following are no longer active gaps for this OpenAB donor work because current source has materially added the required control-plane structure:
maxStartupMs,maxExecutionMs,maxWallMs, and idle policy;NEXUS_GOVERNED, immutablenexusGrant, durabledispatchIntent, direct provider/model selection and catalog receipts;REBIND_REQUIREDpaths for stale/inconsistent execution/catalog/generation evidence.These capabilities may still need their own independent acceptance elsewhere, but they are not residual SessionPool-donor gaps in this delta.
Residual gap A — Agy first-turn provider identity ordering (
CONFIRMED_CURRENT_SOURCE)Current
src/local-agent-adapters.tsstill executes this ordering for a new Agy turn:--new-project -> onExecutionStarted -> spawn agy --print <prompt> -> semantic execution -> final JSON -> parse conversation_idThere is still no pre-effect
onSessionIdon this path. Therefore a timeout/crash/scope fence can occur after semantic effects begin but before DevSpace durably knows the Agy conversation identity.Required contract: if the provider cannot expose an identity before semantic execution, DevSpace must persist an explicit continuity-unknown/lost fence (or equivalent) that prevents a later continuation from silently using
--new-projectas though it were the same provider conversation. A transport capable of pre-binding the provider conversation may also satisfy the invariant; do not assume parity until proven.Residual proof gap B — Claude first-turn ordering (
UNKNOWN / PROOF_GAP)Current
src/local-agent-claude.tsstill pushes the user prompt before a newsession_idis learned from the provider stream. Existing source does not prove that the firstsession_idis always observed/persisted before the first possible tool or workspace side effect.Do not classify this as a defect yet. Add a controlled macOS ordering witness for:
prompt accepted -> first session_id observed/persisted -> first possible tool/side effectResidual gap C — provider continuity readback is not provider truth (
CONFIRMED_CURRENT_SOURCE)Current
agent_reconcilestill projects:agentState: record.statusproviderState: record.statusTherefore
providerState=idle/running/...is local durable-record state, not evidence that the remote/provider conversation currently exists or is resumable.Required contract: separate local agent state from provider-continuity evidence. If no provider-safe probe exists, report continuity as unknown/known-unverified rather than presenting local status as provider-verified truth.
Residual gap D — provider-conversation loss semantics remain incomplete
Current DevSpace does have generic
REBIND_REQUIRED; the earlier statement that rebind semantics were absent is superseded.What remains missing from the observed durable agent record/lifecycle is a provider-conversation-specific state that distinguishes, or equivalently represents:
Names such as
KNOWN_UNVERIFIED,RESUME_VERIFIED, andLOSTare design examples, not mandated schema. The invariant is what matters: a permanently invalid provider conversation must not fall through to an automatic fresh conversation under the same logical continuation without an explicit rebind decision.Current proof obligations added to #15
terminationPending, workspace/HEAD/scope checks, and no-blind-retry behavior.conversation_id; prove the subsequent path cannot silently execute a continuation via a fresh--new-projectconversation.agent_reconcilemust not imply provider-verified state fromrecord.status; unprobed continuity is explicitly unverified/unknown.Non-goals / authority boundary
Evidence / claim boundary
This is a current-state contract reconciliation, not implementation or acceptance. Existing historical Candidates/receipts remain historical and should only be re-evaluated where these residual proof obligations materially intersect them.
Claim ceiling:
SESSION_CONTINUITY_CONTRACT_RECONCILED_CURRENT_SOURCE. #15 remains open; no new Issue is required for these same-contract residuals.feat(agent): provider session continuity fences and ordering witness (#…
26 remaining items
James3014 commentedon Sep 20, 2026
Local-only working-tree state preserved before local cleanup
Bounded preservation of uncommitted local state that existed only on this Mac. Each snapshot was created in a temporary worktree from the recorded source HEAD, so the original worktrees were not modified and remain dirty as before.
devspace-wave1-gate7-ce1fec40873c1ff37f4fb93b46b88028a5aebe63030c1preserve/20260920/issue-15-gate7-freshness-working-tree8ca061350435afd884c232ebf22d74e5cf77ecf1devspace-terminal-hygiene-0805e75b0805e75b654f95b0e43d30ddd59c579a3f040141preserve/20260920/issue-15-terminal-hygiene-contract-working-tree4dbbe4b8ede2f58dc1971e0a3ad00f0c41b0d782Details:
wave1-gate7-ce1fe: 3 modified tracked files (src/build-identity.ts,src/server.ts,src/server.test.ts), 36 insertions / 21 deletions, all divergent from main. No untracked.terminal-hygiene-0805e75b: the untracked fileissue15-cutover-0805-contract.json(1,694 bytes, generated 2026-09-20 10:57 local) is a cutover contract record forissue15-wave1-runtime-convergence-successor-0805e75b-20260920(base revision9565af84…, expected identity0805e75b…,cutover_start, expiry2026-09-20T04:10:00Z, finishws_ee84163821/agt_2b4b2e1c). It is controller-side reconciliation evidence rather than reproducible telemetry, so it was preserved instead of discarded.Scope of this comment: preservation only. These refs are not Candidates, not acceptance evidence, and grant no merge, release, or implementation-resumption authority. No Issue contract text was modified.
James3014 commentedon Sep 20, 2026
Local-only dangling commit objects preserved (no work resumed)
A repository-wide object sweep found local commits that were reachable from no ref, no remote branch, and were not patch-equivalent to current main. Two of them belong to this Issue's provider line and are now durable:
fix: restore OpenCode and Agy provider readinesspreserve/20260920/issue-15-provider-readiness-7c774478a7c774478a9c0d3f5208d6da892efe4815fd8d2aa(reaches976cd946d3b1dced2f252628ebdb54ceb0718c8d)fix: persist local-agent provider continuitypreserve/20260920/issue-15-provider-continuity-1970f79971970f79978cfcfcc2732b97e7acb41b449784706Exact remote readback verified by
git ls-remote.Scope: these refs are archival evidence only. They are not Candidates, not acceptance evidence, and they do not authorize resuming provider-specific Cline/OpenCode/Grok/Codex/Agy runtime work, which remains under the standing Owner architecture HOLD. No Issue contract text was modified, and no PR head was changed.
James3014 commentedon Sep 20, 2026
Reconciliation evidence — execution-context / credential-presence ambiguity (2026-09-21)
Fresh DevSpace source fence:
main@b8f638f72c8dc4198b29e008f864026f55f2f4b6src/process-sessions.ts,src/local-agent-adapters.tsThis is new evidence for #15's existing reliability scope, not a new provider-runtime expansion request and not a reason to lift the current #217/#220 execution-plane hold.
Observed incident
During a bounded Semantic Reflex V2 research run, the controller initially concluded:
The credential was in fact already configured by the Owner.
Physical reconciliation showed:
The key was intentionally scoped to the shell wrapper rather than exported globally.
A generic non-interactive Python/DevSpace process therefore saw
MISSING, while execution through the Owner-configured wrapper sawPRESENT.No secret value was printed or copied. The eventual research process reused the wrapper boundary and completed normally.
Current source seam
src/process-sessions.tscurrently models process environment as:and spawns either an exact executable/argv or a shell command with the resulting environment.
src/local-agent-adapters.tslikewise receives explicit/ambient process environment for provider adapters.Those are useful controls, but they do not distinguish:
Therefore a controller can misclassify an execution-context mismatch as a credential/account failure.
Bounded requirement to preserve
When #15/#217 execution-plane ownership permits work on this seam, include a reuse-before-extension check for an execution-context/launcher attestation equivalent to:
The host should be able to prove only the presence/availability required by the exact launcher. It should not expose credential values to the model.
A provider/account should not be classified as unconfigured solely because a generic child process cannot see a wrapper-scoped credential.
Acceptance direction
Future implementation, if still needed after the execution-plane decision, should falsify at least:
sanitizedpolicy still prevents incidental secret inheritance;This comment does not authorize new Agy/OpenCode/Codex adapter expansion. It records a concrete failure class for the existing #15 reliability contract and should be reconciled against #217/#220 before implementation.
James3014 commentedon Sep 20, 2026
#217 five-route dispatch gate closed
Fresh host evidence now closes the bounded five-provider dispatchability gate on Codeg v0.31.1:
mode_id=planandconfig_values.model=poolside/laguna-s-2.1:freeThe disposable baseline remained clean and no DevSpace provider adapter or production repo was mutated.
The provider-runtime hold therefore changes meaning: do not resume provider-by-provider DevSpace adapter hardening. The next architecture/implementation gate is now a separate bounded DevSpace -> Codeg thin bridge contract, preserving Nexus/Owner route, scope, acceptance, merge and release authority.
Residual evidence to carry forward:
No auto-chain, merge, cutover, adapter retirement, or production activation is authorized by this comment. #217 remains subject to independent adjudication; Wave 2 must have its own bounded implementation contract.
James3014 commentedon Sep 20, 2026
Cross-repo deterministic-first follow-up from Semantic Reflex V2
A fresh cross-repo audit confirms that this existing reliability issue already owns the relevant DevSpace-side seam; no duplicate DevSpace issue is needed.
Please preserve these measurements as part of G4/G6/G8 work when that line is active:
NOT_MEASURED;OUTCOME_UNKNOWNremains reconciliation-required and never implies retry permission.Cross-repo consumers:
nexus-runtime#31decides whether a model call is needed at all;nexus-learning#22evaluates cost only after required-quality/critical-failure gates;nexus-open-swe-runtime#64should expose equivalent physical model-invocation evidence for its own execution path.This is observability/reconciliation evidence only. It must not become model-selection, routing, verifier, or acceptance authority.
James3014 commentedon Sep 20, 2026
Wave 2 frontier — Candidate implemented, downstream auto-chain remains blocked
#224 now has a frozen local Candidate
efc197bf3e7fdc49d357dab91eafc9eb152b9451on exact baseb8f638f72c8dc4198b29e008f864026f55f2f4b6.Engineering evidence is strong: source/build verification passes; Codex/OpenCode/Agy/Cline have live DevSpace->Codeg bridge nonce witnesses; exact cancel and lost-ack/restart reconciliation are live-proven with no duplicate create.
Two independent blockers remain before Wave 2 can be called fully closed:
grok 1.0.34independently reports the current free Grok Build usage limit is exhausted. No blind retry/fallback is authorized.Therefore #15's provider-adapter hold still means do not resume DevSpace provider-specific adapter hardening, but it also does not authorize Wave 3, merge, cutover, adapter retirement, release, or production activation.
Next frontier stays at #224 until the legitimate Grok route can be re-witnessed and the required independent acceptance evidence path is physically available or superseded by an explicit later Owner-approved contract.
James3014 commentedon Sep 20, 2026
Superseding Wave 2 frontier note
This supersedes the earlier #15 comment that described two Wave 2 blockers.
Fresh #224 evidence establishes:
main@45ce06a51ab2af43f513ab49ad111be4cc8cc48c;510976/500000,modelCalls=0,stop_reason=rate_limit), not to a supported DevSpace/Codeg source defect;nexus.candidate_acceptance.v4is downstream independent acceptance and must remain separate from the Wave 2 engineering-completion predicate.Keep the existing provider-adapter hold. Do not auto-chain Wave 3, merge, cut over, retire adapters, or introduce a Grok bypass. Resume only the single Grok W2.6 witness when legitimate entitlement/headroom is freshly observable.
James3014 commentedon Sep 21, 2026
P0 reliability defect — 2s agent supervision synchronously scans the full durable agent history and stalls the MCP event loop
Causal watermark
James3014/devspace9c5ef999bbee93f59dfd8b9229a77679d4cd1bf32026-09-20T23:20:55Z@waishnav/devspaceserve PID 41246, intended endpoint127.0.0.1:7677Symptom reproduced
The current DevSpace process remained alive and eventually rebound
127.0.0.1:7677, but the control plane was not responsively usable:workspace_inspect/open_workspacetimed out or failed internally;/healthzrequest exceeded a 3s caller timeout;This is not explained by tunnel latency: the failing health probe was loopback.
Source + runtime causal evidence
A 1s sample of PID 41246 captured the Node MainThread primarily inside a timer callback:
Approximately 763/825 sampled MainThread frames were in
uv__run_timers; 730 samples were underbetter_sqlite3 ... .all().Current source provides the matching hot path:
Therefore every 2 seconds supervision synchronously reads/deserializes the entire historical durable agent table on the Node event loop even though only a small subset can need active supervision.
A second, lower-frequency amplification path also exists:
That complete-inventory walk is appropriate as a cutover reconciliation witness when explicitly required, but ordinary periodic metrics/cleanup should not silently turn it into a full historical reconciliation workload.
Diagnosis status
ROOT_CAUSE_SUPPORTED, not yetROOT_CAUSE_PROVEN.The source path and runtime stack/latency witness agree exactly. A repair has not yet been applied and A/B latency has not been rerun, so causal manipulation evidence is still outstanding.
The prior
CutoverStateError: Durable cutover record is malformedstderr history is not classified as the current latency root cause. After startup,cutover_startup_drivereportednoop / No unresolved cutover requires advancement, while the timer/SQLite stall remained observable.Required repair boundary
Preserve all current timeout, scope, pending-termination, restart/reconciliation and agent-ownership semantics. Do not fix this by weakening supervision or deleting history.
The smallest acceptable design should:
superviseActiveAgents()from calling unscoped full-historystore.list()every 2 seconds;Do not solve this with:
Required regression evidence
At minimum, bind tests/probes that prove:
git diff --checkpass.Prefer a deterministic query/row-count witness over a flaky timing-only assertion; retain one real runtime responsiveness canary after integration.
Current impact on #231 / #227
This finding does not authorize provider-specific adapter expansion under the existing #15 architecture hold. It is a generic control-plane reliability defect in already-authorized lifecycle/supervision mechanics.
Next gate
Create/execute one bounded reliability repair Candidate under #15 for the supervision/inventory hot path, independently verify it, integrate only with explicit authority, then rebind the loaded 7677 runtime and prove the health/MCP responsiveness canary before resuming #231 P1.
No merge, runtime restart/cutover, deployment, #231 implementation, #227 acceptance or #226/B authority is implied by this diagnosis receipt.
James3014 commentedon Sep 21, 2026
CONTRACT_DELTA — optimized supervision must preserve terminal terminationPending crash recovery
Fresh watermark:
Source inspection closes one critical negative control for the pending repair.
Why status IN (starting,running) alone is incorrect
Current beginTerminationCAS(...) intentionally:
superviseActiveAgents() then relies on seeing terminal rows with terminationPending so it can call drivePendingTermination(...) again after failure/restart.
Therefore a naive optimization that queries only starting/running rows would improve latency by silently breaking restart-safe termination reconciliation.
Required supervision candidate invariant
ACTIVE_TURN: status in {starting, running}
OR
PENDING_PHYSICAL_TERMINATION: durable lifecycleState.terminationPending is present even when status is already {error, stopped}.
Malformed/corrupt/blocked lifecycle evidence must retain current fail-closed behavior; it must not be promoted into runnable authority.
The implementation may choose an efficient database projection/query/index strategy, but the durable lifecycle object remains authority. Do not introduce an in-memory-only active set as the sole restart oracle.
Performance contract
A valid repair must not deserialize every historical terminal agent's large latest_response, execution contract, error details, etc. merely to decide whether that row needs supervision.
A deterministic regression should create a large terminal-history population plus:
It must prove:
Secondary periodic full-inventory path
The separate 5-minute mcp_metrics chain currently invokes full resolveDurableReconciliationWitnessFromInventory(), which can status/reconcile every durable agent. Preserve that complete walk for explicit cutover/recovery witnesses, but do not assume it belongs on the ordinary metrics hot path.
The repair Candidate should either:
Do not weaken cutover witness completeness to make metrics cheap.
Claim boundary
This delta specifies the correctness/performance contract only. It does not authorize direct database surgery, history deletion, provider-adapter expansion, merge, runtime replacement, deployment, or #231 execution.
A repair remains incomplete until an exact Candidate passes focused lifecycle tests, typecheck/build/diff-check, independent review, and a loaded-runtime canary showing responsive loopback health/MCP under representative durable history.
James3014 commentedon Sep 21, 2026
R1 BOOTSTRAP_REPAIR_CONTRACT — remove full-history agent scans from the hot execution/supervision path
Fresh fence:
9c5ef999bbee93f59dfd8b9229a77679d4cd1bf32026-09-21T23:20:01Z57688339845768861973Why this is a bootstrap lane
The current 7677 DevSpace control plane is the subject of the defect and is not responsively usable enough to provide reliable Dev MCP dispatch/readback. For this R1 only, the already Owner-selected worker is rebound to a direct local Codex CLI bootstrap execution:
gpt-5.6-lunaxhighCANDIDATE_READYThis does not change worker/model selection. It changes only the transport because the normal Dev MCP transport is the defect under repair.
Do not reuse this bootstrap exception for #231, #227, #226/B, provider expansion, production mutation, or unrelated DevSpace work.
Exact R1 mutation ceiling
Maximum allowed paths:
src/local-agent-store.tssrc/local-agent-store.test.tssrc/local-agent-sessions.tssrc/local-agent-execution-contract.test.tssrc/local-agent-sessions.test.tsNo deletion/rename. No migration. No server/cutover/config/provider adapter path.
Required behavior
Replace the unscoped full-history record materialization used by the hot supervisor/execution-slot ownership path with a narrow durable projection that still discovers every record that can require active lifecycle control.
The selected set MUST include:
lifecycleState.terminationPending;It MUST preserve existing fail-closed handling for:
Ordinary settled terminal history must not be fully materialized on every 2-second supervisor tick or ordinary capacity/ownership check.
Do not solve this by deleting/pruning history, weakening lifecycle checks, using an in-memory-only restart oracle, or changing provider behavior.
Required focused verification
git diff --check.Prefer deterministic selection/count assertions over timing-only unit tests.
Worker boundary
The Codex worker may inspect current source/tests and implement only R1. It must not commit, push, open/update a PR, merge, deploy, restart DevSpace, edit production state, or begin #231.
Controller responsibilities after worker terminal:
R2 (5-minute metrics full-inventory reconciliation) is explicitly deferred until R1 runtime readback shows whether a residual periodic stall remains.
AUTO_CHAIN=false.James3014 commentedon Sep 21, 2026
#15 supervision hot-path repair — direct Codex Luna a1 in progress; no terminal Candidate claim
Fresh watermark:
9c5ef999bbee93f59dfd8b9229a77679d4cd1bf3/Users/jameschen/Workspace/.codex-direct/issue15-supervision-a10.154.0/gpt-5.6-luna/ effortxhigh01a0c645-fc2c-71c2-a095-71cff9b14d90Exact scope
Write allowlist remains:
src/local-agent-store.tssrc/local-agent-store.test.tssrc/local-agent-sessions.tssrc/local-agent-sessions.test.tssrc/local-agent-execution-contract.test.tsExplicitly forbidden in this attempt:
src/server.ts/src/server.test.tsThis deliberately repairs only the 2-second supervision hot path and avoids the serialized #231 P2 server-composition-root overlap.
Verified execution progress
The worker followed a test-first path.
First implementation-facing regression reached a real RED result:
The earlier failed test launches were environment-only:
node_modules;npxattempted network package resolution;tsxCLI hit sandboxEPERMon its local IPC socket.An untracked worktree-only
node_modulessymlink was then bound to the existing canonical checkout dependencies; package manifests/lockfiles were not modified.Last physically observed source state before local inspection capability became unavailable:
Observed diff shape:
superviseActiveAgents()switched from fullstore.list()to a new supervision-candidate store query;list()/listAllAgentRecords()semantics remained unchanged;At this watermark the work was not yet independently verified and must not be called Candidate-ready.
Current observability blocker
During the same turn:
workspace_inspectstill times out because the running 7677 control plane remains affected by the diagnosed event-loop stall.Therefore controller-side terminal readback of the direct Codex process is currently unavailable. This is an observability limitation, not retry permission.
Do not start another implementer or re-run the same mutation while the direct Codex a1 outcome remains unobserved.
Current frontier
Exact next gate is reconcile the same direct Codex a1 outcome through a restored host read surface. If it is terminal with a bounded diff, run controller verification and independent source review on that exact diff. If it is still running, continue observing the same process only. If it failed after source mutation, reconcile the existing worktree before any fresh attempt.
No blind retry and no worker substitution.
Merge pull request #233 from James3014/codex/issue-15-supervision-rel…
James3014 commentedon Sep 22, 2026
OWNER ARCHITECTURE DECISION — externalize coding-agent runtime; qualify HerdR first
Fresh main:
3f8d6c12c4986c0af806944d9aaa7c3427fb0380.Owner decision after comparing the current DevSpace provider-runtime burden, Codeg, Orca and HerdR:
Target long-term boundary, conditional on #235 PASS:
Consequence for #15
#15 remains the parent reliability contract, but provider-specific runtime ownership is no longer the preferred long-term repair direction.
Do not start or extend new Codex/OpenCode/Agy/Cline PTY/output/session parsing work solely to make DevSpace a better terminal-agent runtime while #235 is unresolved.
Portable #15 invariants remain required regardless of runtime:
OUTCOME_UNKNOWN;Frontier
AUTO_CHAIN=false.Highest current claim: execution-runtime ownership direction is frozen; HerdR is candidate-only until #235 qualifies it.
James3014 commentedon Sep 29, 2026
Owner reconciliation — superseded by #300
Owner 已將日常 worker dispatch 移到 RDC;DevSpace 不再以 provider/worker startup/runtime adapter expansion 為主要責任。保留既有安全修正與歷史證據,但後續產品主線改由 #300 的 Direct Coding surface + Full-mode escalation boundary 承接。
Closure classification:
not_planned / superseded— 不是宣稱原 acceptance 已完成。歷史 evidence 保留;若未來重新把 worker runtime 收回 DevSpace,需用 fresh source/runtime evidence 重新開新 contract,不直接復活舊假設。