Skip to content

Harden Dev MCP reliability across host binding, worker startup, and timeout reconciliation #15

Closed as not planned

Description

@James3014

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:

  • dd534135adc2b6145829022eea7dbb845ddc18b2 reconciled the earlier durable-dispatch / DEVSPACE_CODEX_GOALS=1 reliability line onto main.
  • 8b61ae9b0cb240cde54c798dbc67856e7afac45b added post-main reliability fixes, including waiting for resolved Codex model + directory before typing /goal.
  • 99ebab77a1324543523da116e27334f2e565277d is the observed main head 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:

  1. MCP discovery reported 15 Dev tools and explicitly advertised dev.open_workspace.
  2. Immediate invocation of that just-discovered tool returned Resource not found: dev.open_workspace and requested rediscovery.
  3. Rediscovery again reported the same 15 tools.
  4. 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 maxWallMs timeout;
  • 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 uncallable without 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, or unknown without 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:

  1. short bounded worker task;
  2. medium task with verification/reconciliation;
  3. 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.

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

  1. James3014 commented on Aug 28, 2026

    @James3014
    OwnerAuthor

    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:

    • base/parent: 99ebab77a1324543523da116e27334f2e565277d
    • Candidate: f01670c42ace59e3f96bb63d82e65b643bb017da
    • tree: a07623507179c5df1d50513e631bcaba4985ea1f
    • branch/worktree isolation: codex/issue-15-g3-opencode-readiness in an isolated worktree; the dirty canonical checkout was not consumed

    Exact changed paths:

    • src/local-agent-opencode.ts
    • src/local-agent-opencode.test.ts
    • src/local-agent-adapters.ts

    Behavior:

    • passes an explicit OpenCode SDK server startup timeout;
    • default 30 seconds, configurable via DEVSPACE_OPENCODE_STARTUP_TIMEOUT_MS, hard-capped at 120 seconds;
    • invalid, non-positive, non-integer, or non-finite values fail back to the bounded default;
    • keeps the server-startup timeout independent from DEVSPACE_OPENCODE_TIMEOUT_MS and the existing execution/idle semantics;
    • preserves the existing OpenCode agent configuration and threads the supplied environment through both driver construction paths.

    Independent coordinator verification on the exact Candidate:

    • npx tsx src/local-agent-opencode.test.ts: PASS
    • npx tsx src/local-agent-adapters.test.ts: PASS
    • npm run typecheck: PASS
    • npm run build: PASS (existing Vite chunk-size warning only)
    • git diff --check 99ebab77..f01670c4: PASS
    • exact parent/scope/no-deletion/clean-status checks: PASS
    • independent spec review: APPROVED
    • independent code-quality review: APPROVED

    Claim ceiling / remaining G3 gate:

  2. James3014 commented on Aug 28, 2026

    @James3014
    OwnerAuthor

    Live Runtime Migration receipt for PR #16 / main df23f4c1

    Integration and deployment identity

    • accepted Candidate: 4a26cae8db9f4bdde19591f3d68a8be214e8b7f8
    • PR: fix(codex-goals): harden Codex 0.149 TUI readiness #16, merged with exact head/base CAS
    • merged main: df23f4c119207378f61c982e462c9e6281bd198c
    • main tree: 93891774a1a554c5e6a75c2ddf0314301f34f4c0 (exactly the accepted Candidate tree)
    • merge parents: 99ebab77a1324543523da116e27334f2e565277d + 4a26cae8...
    • clean main build: npm ci, typecheck, and build PASS
    • production symlink: /Users/jameschen/Workspace/.devspace-chatgpt/deploy/devspace-main-df23f4c1
    • active LaunchAgent PID: 24909; /healthz returns {"ok":true,"name":"devspace"}
    • deployed dist/cli.js SHA-256: 7247816704b914e86a11ff536acc3df2246121182fbb21b3ed7e8d91a06c82f9
    • deployed dist/codex-goal-sessions.js SHA-256: 5fe20984b8330a6d6272f6256c83f2d1b3fb2a4e4a37c7c74dcb46f80d901082
    • rollback deployment devspace-main-99ebab77 remains retained

    PR #13 overlap reconciliation

    GitHub update-branch merged current main into PR #13 without force-push. Its duplicate src/cli.ts / src/cli.test.ts delta disappeared; PR #13 now contains only:

    • src/config.test.ts
    • src/local-agent-config.test.ts
    • src/local-agent-config.ts

    Canary 1: candidate_promote — PASS

    Real authenticated 7677 MCP path:

    • base: 0c02b5505714a75785b6cb3e789a8b4e5cefa717
    • promoted Candidate: 5bec3f92dc99b19add7bfbbb8fe6be138a054e8b
    • Candidate tree: 753f37ff1eb8ecb6e40538adc153281a49dc4ba3
    • initial promote succeeded; exact replay returned idempotent already-promoted success
    • destination main read back at the Candidate head/tree with clean status and expected file content

    Canary 2: Agy durable review — functional PASS, cleanup defect found

    • exact agent: agt_60a35cc5
    • provider/model: agy / gemini-3.6-flash-medium
    • provider session present: 25ab4db6-2189-4a71-b8e5-84388ae43463
    • durable terminal reason: completed
    • exact response: AGY_DURABLE_REVIEW_OK
    • changedPaths=[]; target repo remained clean

    Physical post-terminal reconciliation found worker PID 24044 still alive with PPID=1. The deployed CLI advertised agents cancel in help, but actual invocation returned Unknown 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 corrected DEVSPACE_CODEX_BIN, and CODEX_COMMAND / DEVSPACE_CODEX_EXECUTABLE also pointed at devspace-main-99ebab77. All effective values were aligned to devspace-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 authenticated codex_goal_start for gpt-5.6-sol / low still 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. No goalActiveObserved, 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

    • GitHub integration: PASS
    • exact deployment identity / health: PASS
    • candidate promotion canary: PASS
    • Agy semantic result: PASS, but orphan/CLI cleanup defect remains
    • Codex Goal production canary: FAIL
    • overall: LIVE_RUNTIME_MIGRATION_GATE_NOT_GREEN

    The 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.

  3. James3014 commented on Aug 28, 2026

    @James3014
    OwnerAuthor

    Superseding public closure for PR #17

    PR #17 is merged at main 63ca390d05b67cd8d6eeda8f7e1d9d71424eca15, containing reviewed Goal lifecycle commit c7e3d5696af5b280fcbe00f8231da2a7bd0b9a21 and agent lifecycle commit 5a84977023a7706f8ab732616496a8e523c54684.

    The prior degraded PR #16 live result is superseded:

    • full repository test command: PASS
    • Goal lifecycle suite: 93/93 PASS
    • server suite: 21/21 PASS
    • agent-session suite: 14/14 PASS
    • typecheck/build/diff check: PASS
    • production health: PASS
    • authenticated candidate promotion plus idempotent replay: PASS
    • authenticated Agy durable read-only canary: PASS, terminal with exact marker and no changed paths; physical worker cleanup verified
    • authenticated real Codex Goal canary using the explicit model/effort: PASS, Goal Mode observed, Goal achieved, exact marker observed, clean cancellation; target repository remained unchanged
    • formal agents cancel --json route: PASS

    Closed 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.

  4. James3014 commented on Aug 28, 2026

    @James3014
    OwnerAuthor

    Reliability closeout progress (post-PR #20)\n\nPR #20 merged at main 52a3a398f2fc60c72ceafb134b0c5ce16849e733 after 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: explicit gpt-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.

  5. James3014 commented on Sep 3, 2026

    @James3014
    OwnerAuthor

    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:

    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.

  6. James3014 commented on Sep 4, 2026

    @James3014
    OwnerAuthor

    2026-09-04 final host-binding gate remains open

    Fresh reconciliation confirms the loaded Dev MCP backend itself is now current:

    • canonical main: 296a3066fc620169f23beeeb5c9c41d9c9370d75
    • loaded Dev MCP sourceCommit: same 296a3066...
    • loaded build: devspace-1.0.7-296a3066
    • loaded server instance: b5a25a86-30d7-4bce-bd10-1c7e417cc025

    However, the final ChatGPT-host direct-recipient/tool-binding observation is still not green. Fresh ChatGPT-side Dev MCP discovery exposes an older agent_start.executionContract schema than canonical source: the host-visible schema lacks current fields including authorityMode, nexusGrant, and idleTimeoutMode, and still presents the older idleTimeoutMs wording, while exact 296a3066... 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_GREEN

    Exact next gate

    After #30's host schema refresh/binding closure:

    1. from a fresh ChatGPT conversation/binding, rediscover Dev MCP tools;
    2. confirm the host-visible action/schema matches the current loaded runtime/source;
    3. execute at least one stable read-only direct-recipient call through that refreshed binding;
    4. confirm no listed but uncallable or stale-schema behavior;
    5. then reassess Harden Dev MCP reliability across host binding, worker startup, and timeout reconciliation #15 closure.

    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.

  7. James3014 commented on Sep 4, 2026

    @James3014
    OwnerAuthor

    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

    • canonical main: 296a3066fc620169f23beeeb5c9c41d9c9370d75
    • loaded Dev MCP sourceCommit: 296a3066fc620169f23beeeb5c9c41d9c9370d75
    • loaded build: devspace-1.0.7-296a3066
    • server instance: b5a25a86-30d7-4bce-bd10-1c7e417cc025

    Direct-recipient probe

    After fresh Dev tool discovery/rebind in this ChatGPT conversation, dev.agent_preflight was invoked consecutively more than the Issue-required 10 times against workspace ws_c9e1d6e99b and profile agy-medium-implement.

    Observed on every call:

    • direct recipient resolved successfully;
    • no Resource not found / unknown action;
    • no 502/transport failure;
    • stable workspace identity;
    • stable runtime identity (agy / gemini-3.7-flash-medium, Agy runtime 1.1.26);
    • stable local capacity result (used=0, max=4, AVAILABLE);
    • provider auth/reachability correctly remained unknown rather 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_start schema is still stale relative to the loaded 296a3066... source: the host surface lacks current fields such as idleTimeoutMode and 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

    No provider worker was started and no repository mutation occurred during this probe.

  8. James3014 commented on Sep 4, 2026

    @James3014
    OwnerAuthor

    Reliability frontier reconciliation / Issue-first execution policy — 2026-09-04

    Owner workflow decision for the remaining Dev MCP reliability campaign:

    Future reliability repair/verification work must start from a GitHub Issue durable home. Do not dispatch or implement from chat-only gate notes.

    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: 296a3066fc620169f23beeeb5c9c41d9c9370d75
    • tree: 4d47c8e5e58b8302c076c1b97c990c4005b11843

    Durable remaining reliability frontier

    1. P0: R7 verify integrated Dev MCP reliability stack on canonical main #52 — R7 integrated-current-main verification
    2. P0: Prevent live Dev MCP runtime lineage drift and capability regression #30 — host-visible Dev MCP schema / backend identity closure
      • backend source/build was observed current, but ChatGPT host-visible tool schema remained stale;
      • close only when fresh host discovery and loaded runtime/schema identity agree.
    3. P0: Bound MCP session lifecycle and make Dev MCP cutovers multi-session safe #31 — live multi-session cutover acceptance
    4. Harden Dev MCP reliability across host binding, worker startup, and timeout reconciliation #15 — final real-task reliability / umbrella closure
      • after the above gates, reconcile the original G1-G9 contract against current main/runtime;
      • run only the still-material real-task reliability trials (short bounded worker, medium verification/reconciliation, long Codex Goal) required by the current contract;
      • do not replay obsolete historical gates when fresh evidence already supersedes them.

    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:

    • fetch/reconcile the owning Issue and fresh canonical main/runtime;
    • use isolated worktree/workspace for mutation;
    • bind exact attempt/scope/acceptance/evidence;
    • reconcile uncertain effects before retry;
    • independently verify before merge/closure;
    • write the result back to the Issue.

    Chat conversation may coordinate, but GitHub Issues are the durable execution source of truth for unfinished reliability work.

  9. James3014 commented on Sep 8, 2026

    @James3014
    OwnerAuthor

    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

    • main/source: e9942d2a598866e8f8c091304b1700065791091c
    • build: devspace-1.0.7-e9942d2a
    • observed server: 0e2be1ab-a4b3-482b-a78a-ade05f58b96d
    • OpenCode CLI: 1.18.25

    Real canary: NOT PASS

    Profile preflight for opencode-mimo-free-implement correctly 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.

    • agent: agt_42bfef8a
    • attempt: devspace-dispatch-audit-20260908-mimo-readonly-1
    • exact model: opencode/mimo-v2.5-free
    • started: 2026-09-08T10:08:38.793Z
    • terminated: 2026-09-08T10:08:56.483Z (~17.7 s)
    • result: PROVIDER_PROTOCOL_ERROR, OpenCode did not return a final assistant response.
    • retryable: false
    • same-agent physical reconciliation: exact HEAD preserved, dirty=false, candidate absent, changedPaths=[]

    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

    1. P0: Prevent live Dev MCP runtime lineage drift and capability regression #30 P0: fresh reproduction of advertised provider/model vs profile-required backend (-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.
    2. P1: Make OpenCode MCP catalog refresh and exact model/variant validation evidence-based #58 P1 (new): OpenCode live catalog is not refreshed by committed MCP paths; fallback, fabricated variants, partial-path/alias validation and freshness require evidence-based repair. Small exact-validator Candidate is separate from full live catalog completion.
    3. P1: Expose truthful Cline model discovery and exact-route readiness through Dev MCP #59 P1 (new): Cline is configured but no Cline profile is advertised, direct route currently hits P0: Prevent live Dev MCP runtime lineage drift and capability regression #30, and DevSpace has no observed upstream free-feed integration. Establish exact model/thinking/entitlement/readiness evidence, not a promotional free pool.
    4. Fix terminal agent wall/idle telemetry continuing after completion #5 reopened same contract: terminal status timing is frozen but reconcile timing still grows. Small helper reuse and production-manager regression are bounded under that issue.
    5. feat(chat-swarm): add durable core contract and SQLite store #46 -> feat(chat-swarm): add MCP peer-worker protocol and conversation identity binding #47 -> feat(chat-swarm): wire production MCP tools, cutover admission, config, and capability manifest #48 -> test(chat-swarm): run isolated 2-worker ChatGPT live canary #49, then optional exp(chat-swarm): add optional OpenCLI ChatGPT runtime adapter #50 / continuity feat(chat-swarm): add durable worker continuity and conversation rollover #51: existing ChatGPT Swarm implementation track; no duplicate campaign needed. Source work may proceed independently in its own scope, but test(chat-swarm): run isolated 2-worker ChatGPT live canary #49 keeps P0: Prevent live Dev MCP runtime lineage drift and capability regression #30/Harden Dev MCP reliability across host binding, worker startup, and timeout reconciliation #15 live reliability prerequisites.

    #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.yaml are 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.

  10. James3014 commented on Sep 8, 2026

    @James3014
    OwnerAuthor

    Same-attempt OpenCode session readback (no resend)

    After the failed agt_42bfef8a canary, a read-only opencode export of its exact returned provider session succeeded (exit 0). Export reports the bound isolated workspace, OpenCode 1.18.25, provider/model opencode/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.

  11. James3014 commented on Sep 8, 2026

    @James3014
    OwnerAuthor

    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,避免建立重複總案。

    本次重新取得的證據

    對象 本次觀測 證據界線
    DevSpace main e9942d2a598866e8f8c091304b1700065791091c GitHub branch readback
    PR #60 OPEN,head 489ad06ca009d8c3d407008e7c5308cde97c74ad,base main 未合併,不是部署證據
    PR #61 OPEN,head 97fbefc041b7b60876d1dbbe45ae7c10617a61f0,base #60 分支 未合併,不是 native Swarm 證據
    兩個 exact PR heads 的 CI check-runs 都是 total_count=0;PR-triggered workflow_runs 都為空 MISSING,不是 PASS
    ChatGPT dev App plugin registry 回報已安裝且 ENABLED 早先「未安裝」敘述不能繼續當現況
    本對話 Dev 工具 dev 及 registry 回傳名稱均未發現可呼叫工具 namespace INSTALLED_BUT_ACTION_SURFACE_UNAVAILABLE;根因未定,不能宣稱 endpoint 或模型故障

    本次無法讀取 Mac 的 objective、Matrix、dirty diff、測試 log、安裝套件或服務狀態。以下都仍是 HANDOFF_REPORTED / REBIND_REQUIRED:domain 51f57f0c 的 17/17、transport 45f52173 的 40/40、installed runtime e994、fork Actions UI 尚未啟用、clean package 與 helper 證據。不可改寫成接手主控親自驗證。

    外部參考:採用 invariant,不移轉 authority

    固定研究 travisliu/open-dynamic-workflow@164b313a75f1e05b0e294a2085b6e44721959762(memory-issues 分支)。本次是源碼/文件閱讀,未執行 ODW 測試,不主張它優於 DevSpace 或具備完整跨對話治理。

    1. 工作可重現:README 的 workflow、validate、call limits、run artifacts。DevSpace 借鏡為薄的、有版本的任務/驗收配方,仍呼叫現有 primitives,不建立 DSL interpreter 或隱藏自主 loop。
    2. 一次解析、各入口共用:resolve-provider-selection.ts 記錄 requested/resolved、設定來源與 override。DevSpace 應在 fix: bind dispatch to fresh catalogs and verified provider results #60/P1: Make OpenCode MCP catalog refresh and exact model/variant validation evidence-based #58/P1: Expose truthful Cline model discovery and exact-route readiness through Dev MCP #59 既有實作上核對 requested → resolved → observed;resolved 配置不是 observed model attestation。別名等價不表示權限、價格、可用性相同。
    3. 必要結果與即時顯示分離:output-coordinator.ts、process-runner.ts 的 bounded buffering、required sink/parser、best-effort observer、exit/EOF/settlement 分離。已建立 P1: Audit bounded provider output, artifact durability and observer isolation using ODW reference patterns #63:先查等價保護/反證,再修最小缺口,不是已重現 DevSpace memory bug。
    4. 完成不能靠摘要:Ultra Loop checkpoint 檢查 essential criteria 與 aggregate gate。借鏡「逐條需求有證據」;不搬其 JSON read-modify-write store,也不以 model PASS 取代主控驗收。
    5. 三種 resume 分開:run-scoped context、ODW cache replay、ChatGPT worker continuity 不是同一功能。feat(chat-swarm): add durable worker continuity and conversation rollover #51 仍依 Swarm worker/epoch/attempt 與原生 rollover 驗收。
    6. 不照搬權限與 retry:Ultra Loop 範例讓實作者 dangerously-full-access;ODW classifier 雖拒絕 timeout/unknown retry,部分 parse/schema/provider failures 可列為 retryable。DevSpace 在可能外部副作用後仍必須 reconcile exact attempt,不能由 error class 自動再派工或切付費模型。

    修正後執行順序(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 或本機測試不算完成。

    防止再次偏離的執行規則

    本次完成上限

    已完成外部來源研究、遠端 PR/CI/Issue 重新核對與 issue 重規劃。沒有主張 Mac objective/dirty state 已讀、沒有修改唯一 Matrix、沒有執行 CI 啟用/實作/merge/deploy/native canary。下一個實作前 gate 是 D0 本機 exact rebind + D1 原生工具/CI 真實可用性,不是重新收集相同 Owner 授權。

  12. James3014 commented on Sep 9, 2026

    @James3014
    OwnerAuthor

    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仍是另一个四檔候選,三者分別審查與整合。

  13. James3014 commented on Sep 11, 2026

    @James3014
    OwnerAuthor

    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:

    1. DevSpace server/build alive;
    2. MCP tool manifest loaded;
    3. host/connector tool surface callable vs unknown/unavailable;
    4. workspace registry able to service a bounded read-only workspace probe;
    5. provider plane explicitly separate from MCP/control-plane health.

    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

    • read-only only;
    • no worker/provider launch;
    • no dependency sync;
    • no Git mutation;
    • no service restart/reload;
    • no hidden fallback to another MCP tool;
    • provider/model health is not inferred from control-plane health;
    • host/tool-registry failure is not labeled provider failure;
    • return durable server/build/tool-manifest identity when observable;
    • any unobservable sub-check returns UNKNOWN, never fabricated PASS.

    Acceptance criteria

    1. Healthy server + healthy workspace registry returns typed READY.
    2. Server alive but workspace-open path unavailable identifies host/workspace/control-plane layer, not provider.
    3. Tool-manifest identity is included and stable for one server generation.
    4. Provider unavailable does not falsely fail MCP/control-plane health.
    5. Control-plane unavailable does not create/retry a worker.
    6. Safe to run before every delegated engineering task.
    7. Reconnect/restart produces a new server/tool generation rather than silently reusing stale identity.
    8. Docs include a triage matrix for host tool disabled, connector unavailable, DevSpace server unavailable, workspace registry failure, and provider failure.

    Product/development impact

    • fail fast before dispatch;
    • stop debugging the wrong layer;
    • reduce accidental reopening of already-fixed runtime bugs;
    • make DevSpace easier to support/productize across ChatGPT and other MCP hosts.

    This should fit naturally under #15 G1/G2/G5/G6 rather than creating another generic reliability issue.

  14. James3014 commented on Sep 11, 2026

    @James3014
    OwnerAuthor

    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 GitHub main and the live Dev MCP runtime both at:

    • source: James3014/devspace@3c9805c2193d82e662546af0ec5b34fedc9fbeb5
    • build: devspace-1.0.7-3c9805c2
    • live cutover state: closed, mode normal, reconciliationRequired=false
    • OpenAB donor reference: openabdev/openab@843bb729380a2718ba4c5c009f311131f5ee5058

    The 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_PATTERN donor, not a component to transplant. DevSpace must retain its existing LocalAgentStore / 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:

    • cross-chat resource ownership now has repository/goal/coordinator-thread grant evidence plus owner-thread resource leases, bounded scope/base revision/expiry, CAS versioning, handoff and reconciliation receipts;
    • execution timing can now distinguish maxStartupMs, maxExecutionMs, maxWallMs, and idle policy;
    • execution contracts now support NEXUS_GOVERNED, immutable nexusGrant, durable dispatchIntent, direct provider/model selection and catalog receipts;
    • generic continuation admission already has explicit REBIND_REQUIRED paths 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.ts still executes this ordering for a new Agy turn:

    --new-project -> onExecutionStarted -> spawn agy --print <prompt> -> semantic execution -> final JSON -> parse conversation_id

    There is still no pre-effect onSessionId on 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-project as 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.ts still pushes the user prompt before a new session_id is learned from the provider stream. Existing source does not prove that the first session_id is 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 effect

    Residual gap C — provider continuity readback is not provider truth (CONFIRMED_CURRENT_SOURCE)

    Current agent_reconcile still projects:

    agentState: record.status

    providerState: record.status

    Therefore 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:

    • known identity but resumability not freshly verified;
    • resume verified;
    • provider conversation confirmed missing/non-resumable/lost.

    Names such as KNOWN_UNVERIFIED, RESUME_VERIFIED, and LOST are 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

    1. Preserve existing agent generation CAS, worker token/PID fencing, terminationPending, workspace/HEAD/scope checks, and no-blind-retry behavior.
    2. Agy: fault after semantic execution can begin but before final conversation_id; prove the subsequent path cannot silently execute a continuation via a fresh --new-project conversation.
    3. Claude: controlled macOS first-turn ordering witness; repair only if the witness demonstrates an unsafe pre-identity side-effect window.
    4. Provider readback: agent_reconcile must not imply provider-verified state from record.status; unprobed continuity is explicitly unverified/unknown.
    5. Known provider identity + transient resume failure preserves identity and does not replay the prompt in a fresh context.
    6. Confirmed permanent provider-session loss requires an explicit provider-continuity loss/rebind-required outcome (or equivalent); no silent new conversation under the same logical continuation.
    7. Any implementation and verification under this delta follows the current Owner macOS-only scope of Harden Dev MCP reliability across host binding, worker startup, and timeout reconciliation #15.

    Non-goals / authority boundary

    • no OpenAB runtime dependency;
    • no OpenAB SessionPool transplant;
    • no second session/create/resume/evict authority;
    • no automatic fresh-session fallback after ambiguous or failed continuation;
    • no reopening of already-landed control-plane ownership, lease, timing-budget, or Nexus-grant work merely because those areas existed in the older audit;
    • no change to Nexus route, acceptance, merge, release, or production authority.

    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.

  15. 26 remaining items

  16. James3014 commented on Sep 20, 2026

    @James3014
    OwnerAuthor

    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.

    source worktree source HEAD preservation ref snapshot commit
    devspace-wave1-gate7-ce1fe c40873c1ff37f4fb93b46b88028a5aebe63030c1 preserve/20260920/issue-15-gate7-freshness-working-tree 8ca061350435afd884c232ebf22d74e5cf77ecf1
    devspace-terminal-hygiene-0805e75b 0805e75b654f95b0e43d30ddd59c579a3f040141 preserve/20260920/issue-15-terminal-hygiene-contract-working-tree 4dbbe4b8ede2f58dc1971e0a3ad00f0c41b0d782

    Details:

    • 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 file issue15-cutover-0805-contract.json (1,694 bytes, generated 2026-09-20 10:57 local) is a cutover contract record for issue15-wave1-runtime-convergence-successor-0805e75b-20260920 (base revision 9565af84…, expected identity 0805e75b…, cutover_start, expiry 2026-09-20T04:10:00Z, finish ws_ee84163821 / agt_2b4b2e1c). It is controller-side reconciliation evidence rather than reproducible telemetry, so it was preserved instead of discarded.
    • Secret review: no credential/token/private-key pattern found in the copied file; it contains commit/build/manifest hashes, launchd/service labels, and a workspace/agent id only.

    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.

  17. James3014 commented on Sep 20, 2026

    @James3014
    OwnerAuthor

    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:

    subject date preservation ref remote SHA
    fix: restore OpenCode and Agy provider readiness 2026-09-20 10:47 +0800 preserve/20260920/issue-15-provider-readiness-7c774478a 7c774478a9c0d3f5208d6da892efe4815fd8d2aa (reaches 976cd946d3b1dced2f252628ebdb54ceb0718c8d)
    fix: persist local-agent provider continuity 2026-09-19 00:48 +0800 preserve/20260920/issue-15-provider-continuity-1970f7997 1970f79978cfcfcc2732b97e7acb41b449784706

    Exact 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.

  18. James3014 commented on Sep 20, 2026

    @James3014
    OwnerAuthor

    Reconciliation evidence — execution-context / credential-presence ambiguity (2026-09-21)

    Fresh DevSpace source fence:

    • main@b8f638f72c8dc4198b29e008f864026f55f2f4b6
    • relevant source: src/process-sessions.ts, src/local-agent-adapters.ts

    This 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:

    TYPESAFE_API_KEY=MISSING
    

    The credential was in fact already configured by the Owner.

    Physical reconciliation showed:

    ~/.zshrc
    └─ agy-jev()
       └─ TYPESAFE_API_KEY=<redacted>
          └─ child command
    

    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 saw PRESENT.

    No secret value was printed or copied. The eventual research process reused the wrapper boundary and completed normally.

    Current source seam

    src/process-sessions.ts currently models process environment as:

    environmentPolicy = inherit | sanitized
    

    and spawns either an exact executable/argv or a shell command with the resulting environment.

    src/local-agent-adapters.ts likewise receives explicit/ambient process environment for provider adapters.

    Those are useful controls, but they do not distinguish:

    credential truly absent
    vs
    credential present only through an Owner-controlled launcher/wrapper
    vs
    credential available in another shell mode/session context
    

    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:

    launcher identity/profile
    shell/process mode
    environment policy
    required credential presence: PRESENT | MISSING | UNKNOWN
    credential source class: wrapper / inherited-env / host credential bridge / unknown
    secret value: NEVER_EXPOSED
    

    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:

    1. generic non-interactive child sees credential absent while an authorized wrapper child sees presence;
    2. presence attestation never returns the secret value;
    3. wrong/missing wrapper remains a typed execution-context blocker rather than a provider/model-quality failure;
    4. sanitized policy still prevents incidental secret inheritance;
    5. exact executable/argv execution remains available without forcing shell startup files;
    6. no provider-specific launcher becomes a second route/model-selection authority.

    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.

  19. James3014 commented on Sep 20, 2026

    @James3014
    OwnerAuthor

    #217 five-route dispatch gate closed

    Fresh host evidence now closes the bounded five-provider dispatchability gate on Codeg v0.31.1:

    • Codex direct Codeg work_task PASS
    • OpenCode direct Codeg work_task PASS
    • Grok direct Codeg work_task PASS
    • Agy / Antigravity direct Codeg work_task PASS
    • Cline stable 3.0.62 direct Codeg work_task PASS using mode_id=plan and config_values.model=poolside/laguna-s-2.1:free

    The 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:

    • Codeg generic create still lacks a caller-supplied DevSpace/Nexus idempotency key; bridge design must bind a durable operationKey -> Codeg taskId mapping and reconcile-before-resend.
    • A later mixed five-task run had one transient Grok cancel after Prompting/Error/Disconnected even though the same Grok route independently passed. Treat this as resilience/concurrency evidence for the bridge, not as a reason to rebuild the Grok adapter in DevSpace.
    • Codeg authenticated agent/config surfaces can expose credential-bearing provider config; a thin bridge must not proxy those raw responses outward.

    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.

  20. James3014 commented on Sep 20, 2026

    @James3014
    OwnerAuthor

    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:

    • explicit provider + model + effort identity;
    • provider startup/cold-start time separate from active execution;
    • active execution / idle / total hard ceiling;
    • invocation/attempt identity and retry lineage;
    • token usage when physically reported;
    • monetary cost only when trustworthy, otherwise NOT_MEASURED;
    • transport/provider failure distinct from semantic/task failure;
    • OUTCOME_UNKNOWN remains reconciliation-required and never implies retry permission.

    Cross-repo consumers:

    • nexus-runtime#31 decides whether a model call is needed at all;
    • nexus-learning#22 evaluates cost only after required-quality/critical-failure gates;
    • nexus-open-swe-runtime#64 should 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.

  21. James3014 commented on Sep 20, 2026

    @James3014
    OwnerAuthor

    Wave 2 frontier — Candidate implemented, downstream auto-chain remains blocked

    #224 now has a frozen local Candidate efc197bf3e7fdc49d357dab91eafc9eb152b9451 on exact base b8f638f72c8dc4198b29e008f864026f55f2f4b6.

    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:

    1. Grok entitlement: two new bridge attempts terminally canceled; native grok 1.0.34 independently reports the current free Grok Build usage limit is exhausted. No blind retry/fallback is authorized.
    2. Formal v4 acceptance evidence: current DevSpace main does not expose the required direct Candidate evidence producer / matching Core generic verification artifact for this Owner-inline Candidate; do not synthesize those artifacts.

    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.

  22. James3014 commented on Sep 20, 2026

    @James3014
    OwnerAuthor

    Superseding Wave 2 frontier note

    This supersedes the earlier #15 comment that described two Wave 2 blockers.

    Fresh #224 evidence establishes:

    • source/build/integration verification is green, including a conflict-free disposable application of the Wave 2: add durable DevSpace -> Codeg thin execution bridge #224 diff onto current main@45ce06a51ab2af43f513ab49ad111be4cc8cc48c;
    • Codex/OpenCode/Agy/Cline bridge witnesses, exact cancel, and lost-ack/restart no-duplicate reconciliation are already live-proven;
    • the only remaining Wave 2 engineering blocker is W2.6's fresh Grok bridge nonce witness;
    • the current Grok failure is physically bound to the grok.com rolling free quota (510976/500000, modelCalls=0, stop_reason=rate_limit), not to a supported DevSpace/Codeg source defect;
    • formal nexus.candidate_acceptance.v4 is 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.

  23. James3014 commented on Sep 21, 2026

    @James3014
    OwnerAuthor

    P0 reliability defect — 2s agent supervision synchronously scans the full durable agent history and stalls the MCP event loop

    Causal watermark

    Symptom 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_workspace timed out or failed internally;
    • a loopback /healthz request exceeded a 3s caller timeout;
    • server logging later showed that same class of health request returning HTTP 200 only after 14,418 ms;
    • the socket/listener therefore existed, but the event loop was sufficiently starved to make ordinary MCP control calls fail their caller deadlines.

    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:

    node::SpinEventLoopInternal
     -> uv_run
     -> uv__run_timers
     -> Environment::RunTimers
     -> V8 callback
     -> better_sqlite3 Statement::JS_all
     -> sqlite3_step / sqlite3VdbeExec
     -> accessPayload / unixRead / pread
    

    Approximately 763/825 sampled MainThread frames were in uv__run_timers; 730 samples were under better_sqlite3 ... .all().

    Current source provides the matching hot path:

    src/server.ts
    AGENT_SUPERVISION_INTERVAL_MS = 2_000
      -> setInterval(...)
      -> agentSessionManager.superviseActiveAgents()
    
    src/local-agent-sessions.ts
    superviseActiveAgents()
      -> for (const record of this.store.list())
    
    src/local-agent-store.ts
    list() with no scope
      -> SELECT * FROM local_agent_sessions ORDER BY updated_at DESC
      -> rowToLocalAgentRecord(...) for every row
    

    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:

    MCP_SESSION_CLEANUP_INTERVAL_MS = 5 min
     -> enumerateDurableReconciliationState()
     -> resolveDurableReconciliationWitnessFromInventory()
     -> list all workspaces + listAllAgentRecords()
     -> status/reconcile every durable agent
    

    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 yet ROOT_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 malformed stderr history is not classified as the current latency root cause. After startup, cutover_startup_drive reported noop / 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:

    1. stop superviseActiveAgents() from calling unscoped full-history store.list() every 2 seconds;
    2. query only durable records that can actually require supervision/recovery, while preserving restart-safe pending-termination handling;
    3. avoid deserializing large terminal-history rows merely to discover that they are terminal;
    4. keep complete durable-inventory reconciliation available for explicit cutover/recovery witnesses;
    5. remove the 5-minute metrics path's dependency on full reconcile-all when cheap counts/projections are sufficient, or otherwise prove it cannot starve the event loop;
    6. preserve exact external-effect identity and no-blind-retry semantics.

    Do not solve this with:

    Required regression evidence

    At minimum, bind tests/probes that prove:

    • a large terminal historical agent population does not cause the 2s supervisor to deserialize/scan all terminal rows;
    • starting/running agents remain supervised for wall/startup/execution/idle ceilings and scope violations;
    • durable pending termination after restart remains discoverable/retriable;
    • no unrelated terminal row is mutated;
    • health/MCP responsiveness remains bounded while supervision runs;
    • explicit full cutover witness still inspects the complete inventory when requested;
    • focused tests + typecheck + production build + git diff --check pass.

    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

    #15 GENERIC CONTROL-PLANE RELIABILITY DEFECT   ROOT_CAUSE_SUPPORTED
    CURRENT 7677 PROCESS                           ALIVE / NOT RESPONSIVELY READY
    #231 P1 SOURCE CONTRACT                        READY
    #231 P1 FRESH A3                               BLOCKED ON CONTROL-PLANE RESPONSIVENESS
    #227                                           BLOCKED ON #231
    #226 / B                                       DO NOT START
    

    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.

  24. James3014 commented on Sep 21, 2026

    @James3014
    OwnerAuthor

    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:

    1. fences an active starting/running generation;
    2. persists lifecycleState.terminationPending;
    3. changes the row status immediately to terminal error or stopped;
    4. retains the physical worker pid/token until completeTerminationCAS(...) proves cleanup.

    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:

    • one active starting/running agent;
    • one terminal row with durable terminationPending;
    • ordinary terminal rows with no pending work.

    It must prove:

    • both supervision-required rows are selected;
    • ordinary terminal history is excluded from full record materialization/supervision;
    • the pending terminal row is still driven/reconciled;
    • active timeout/scope behavior is unchanged;
    • unrelated terminal rows remain untouched.

    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:

    • replace periodic metrics inventory reconciliation with cheap count/projection evidence while retaining the explicit full witness API unchanged; or
    • provide bounded evidence that the metrics path cannot materially starve health/MCP after the primary supervision fix.

    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.

  25. James3014 commented on Sep 21, 2026

    @James3014
    OwnerAuthor

    R1 BOOTSTRAP_REPAIR_CONTRACT — remove full-history agent scans from the hot execution/supervision path

    Fresh fence:

    Why 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:

    • provider/runtime: Codex CLI
    • model: gpt-5.6-luna
    • effort: xhigh
    • isolated detached Git worktree from the exact source fence
    • claim ceiling: CANDIDATE_READY

    This 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:

    1. src/local-agent-store.ts
    2. src/local-agent-store.test.ts
    3. src/local-agent-sessions.ts
    4. src/local-agent-execution-contract.test.ts
    5. src/local-agent-sessions.test.ts

    No 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:

    • starting/running detached active turns;
    • terminal error/stopped rows with durable lifecycleState.terminationPending;
    • legacy active rows currently adopted/reconciled by supervision where current behavior requires it.

    It MUST preserve existing fail-closed handling for:

    • lifecycleCorrupt;
    • terminationBlocked;
    • terminal rows with unsettled activeTurn;
    • termination retry backoff;
    • startup/execution/idle/wall timeout fences;
    • scope violation termination;
    • execution-capacity and overlapping write-ownership checks.

    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

    • local-agent store regression proving large settled terminal history is excluded from the hot candidate projection while active + pending-termination rows are selected;
    • existing detached lifecycle / pending termination / legacy adoption tests;
    • supervisor timeout/scope/termination-retry tests;
    • capacity/ownership behavior remains equivalent;
    • TypeScript typecheck;
    • production build;
    • 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:

    • inspect exact diff and changed paths;
    • rerun focused tests/typecheck/build/diff-check independently;
    • obtain a distinct independent source review;
    • only then prepare a Candidate/integration decision;
    • loaded-runtime health/MCP canary remains a separate post-integration gate.

    R2 (5-minute metrics full-inventory reconciliation) is explicitly deferred until R1 runtime readback shows whether a residual periodic stall remains. AUTO_CHAIN=false.

  26. James3014 commented on Sep 21, 2026

    @James3014
    OwnerAuthor

    #15 supervision hot-path repair — direct Codex Luna a1 in progress; no terminal Candidate claim

    Fresh watermark:

    • DevSpace main remains 9c5ef999bbee93f59dfd8b9229a77679d4cd1bf3
    • direct isolated worktree: /Users/jameschen/Workspace/.codex-direct/issue15-supervision-a1
    • worker: Codex CLI 0.154.0 / gpt-5.6-luna / effort xhigh
    • Codex thread: 01a0c645-fc2c-71c2-a095-71cff9b14d90
    • execution lane: direct bounded implementer because the current Dev MCP control plane is itself the failing component
    • no second worker has been started

    Exact scope

    Write allowlist remains:

    • src/local-agent-store.ts
    • src/local-agent-store.test.ts
    • src/local-agent-sessions.ts
    • src/local-agent-sessions.test.ts
    • src/local-agent-execution-contract.test.ts

    Explicitly forbidden in this attempt:

    This 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:

    TypeError: supervisionStore.listSupervisionCandidates is not a function
    

    The earlier failed test launches were environment-only:

    • fresh worktree initially had no node_modules;
    • npx attempted network package resolution;
    • the tsx CLI hit sandbox EPERM on its local IPC socket.

    An untracked worktree-only node_modules symlink 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:

    M src/local-agent-sessions.ts
    M src/local-agent-store.test.ts
    M src/local-agent-store.ts
    

    Observed diff shape:

    • superviseActiveAgents() switched from full store.list() to a new supervision-candidate store query;
    • full list() / listAllAgentRecords() semantics remained unchanged;
    • store regression created 200 terminal historical rows plus starting/running/pending examples and verified pending durability after reopen;
    • no path outside the allowlist was observed modified.

    At this watermark the work was not yet independently verified and must not be called Candidate-ready.

    Current observability blocker

    During the same turn:

    • Desktop Commander monthly usage became exhausted and no further host reads are available through that connector;
    • Dev MCP workspace_inspect still 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

    #15 ROOT CAUSE                    SUPPORTED
    DIRECT CODEX A1                  STARTED / OUTCOME NOT YET TERMINALLY READ BACK
    LAST OBSERVED DIFF               3 ALLOWLIST FILES
    CANDIDATE_READY                  NOT CLAIMED
    INDEPENDENT VERIFICATION         NOT RUN
    MERGE / DEPLOY / RESTART         NOT AUTHORIZED
    #231 P1                          BLOCKED ON CONTROL-PLANE RESPONSIVENESS
    #227                             BLOCKED ON #231
    #226 / B                         DO NOT START
    

    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.

  27. added a commit that references this issue on Sep 22, 2026
  28. James3014 commented on Sep 22, 2026

    @James3014
    OwnerAuthor

    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:

    ChatGPT / Nexus
          |
          v
      DevSpace MCP
      - workspace authority
      - attemptKey / replay
      - ExecutionContract
      - tool/effect ceiling
      - physical reconciliation
      - Candidate/Core evidence
          |
          v
         HerdR
      - PTY/process
      - pane/session
      - agent launch/prompt/read/wait
      - detach/reconnect
      - native agent resume
          |
          v
     Codex / Claude / OpenCode / ...
    

    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:

    • exact workspace binding;
    • no blind duplicate dispatch after ambiguous outcomes;
    • truthful OUTCOME_UNKNOWN;
    • exact attempt/replay identity;
    • physical mutation reconciliation;
    • explicit provider/model/effort readback when available;
    • authority containment and no false completion.

    Frontier

    AUTO_CHAIN=false.

    Highest current claim: execution-runtime ownership direction is frozen; HerdR is candidate-only until #235 qualifies it.

  29. James3014 commented on Sep 29, 2026

    @James3014
    OwnerAuthor

    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,不直接復活舊假設。

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

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions