#1045/#829 release candidate OpenCode stop correction — NOT PUBLISHED
OBSERVED_AT=2026-10-12 09:09+08

09:25+08 original-PR increment — still NOT PUBLISHED
- Exact23e195ae43e339f2b5725128581d466057bd866c real-client
  run38190840227/job114623065177 FAILED at identities-reaped (line238).
  Create, native TUI, actual model switching/answer and stop dispatch passed;
  post-stop process proof failed, so restart and wrong-model follow-up did
  not run. Do not count those later layers or blame the execution environment.
- Artifact11721472962 downloaded to owned temporary evidence directory.
  Redacted daemon.log records stale launcher pid348, then orphan SIGTERM
  to current bridge584 BEFORE full CLI stop. CLI subsequently said not running.
  The bridge log records attach TUI624 terminated; no /proc snapshot from the
  failed runner exists, so do not assert which remaining pid was a zombie.
- Corrected the mapped OpenCode path to delegate to full pinned CLI before
  any stale-launcher/group/orphan signals, preserving current ownership for
  the CLI drain. Codex still keeps original marker-gated launcher-first order.
- Docker routing suite now20 PASS /0 FAIL /51 expectations. Added stale-map
  first-delegation and no-signal/no-delete-on-failure cases. This remains
  mocked routing evidence with the noted pgrep limitation, not real reaping.
- Added read-only known-owned PID/state/parent/start-ticks diagnostics only on
  the existing E2E failure path. Original15s and all assertions unchanged;
  zombies still do not count as reaped. No credential/argv output added.
- Original estimated publication window's no-new-failure condition is false.
  Next09:35+08 evidence checkpoint; only if it passes, earliest backend
  09:50–10:10 / selected clients10:20–10:45, subject to package/runner gates.

09:38+08 diagnostic-guard correction (no product/oracle change)
- PR2636@d9bf1ac350fc06ed217ef91594f3aa1cfcb5bc27 mutation pins
  run38192340339/job114627577790 failed: the newly inline dynamic proc read
  in a harness that also writes fixtures was counted as an unchecked mutator.
- Moved that same read-only diagnostic to the existing process-generation.ts
  helper module, which contains no writes. generationGone, its zombie rule,
  all15s waits and actual stop/restart assertions remain unchanged.
- Full checker in Docker python3.12-slim, candidate read-only, network none,
  uid1000:377shell files+146script mutators /695anchors /8forms; unchecked4
  equals baseline4, GREEN. No baseline/guard/parser edit or raised allowance.
- This scanner result is not a real-client PASS; current behavioral gate
  and test571 legacy compatibility replay remain separate pending evidence.

Original evidence
- PR2636@335fa4d756551fc198fa37c81bdd5f746d7828c8 real-client
  run38186392245/job114609511816 failed: processes were gone but
  old TUI/bridge tmux sessions remained. No environment-only attribution.
- stop-daemon.ts copresenceTeardownFor only recognized Codex markers.
  OpenCode launcher exits normally; orphan process cleanup alone need not
  remove the detached terminal shell. The existing full CLI stop was skipped.

Narrow correction
- Matching managed local node_id + opencode-cli/copresence uses the same
  pinned CLI stop in the recorded child workdir. No raw tmux invocation added.
- Existing CLI process ownership/stop verification is unchanged. The Codex
  marker requirement is unchanged; foreign identity/headless do not route.
- Failure of CLI teardown yields stop_failed before delete/config relocation.
- Existing source launch/stop authority stays in agent-network/bin/cli.ts and
  agent-node/src/runtime/stop-daemon.ts; no production launcher/ports/proxy/
  secrets/backup schema change. Retain old CLI168/runtime134 for rollback.

Docker-only focused evidence
- Existing independently built anet:test1053-portable dependency image,
  network none, non-root runner, only the two changed source/test files
  mounted read-only at /candidate/agent-node/src/runtime/.
- stop-daemon-copresence.test.ts: 18 PASS /0 FAIL /44 expectations.
  Includes three added OpenCode routing/failure/identity-headless groups.
- First invocation used wrong image path /workspace: module resolution error,
  no tests ran; corrected to actual /candidate. Not a product regression.
- The dependency image lacks pgrep: existing mocked routing cases emit that
  warning. This proves routing/receipt ordering, NOT real process/session
  cleanup; unchanged test883 real-client is the next Docker E2E gate.
- Do not lower test883 assertions, label old failure PASS or publish this
  branch. CI exact source real-client success remains required before merge.

Cleanup
- Disposable --rm container, synthetic temp configs removed by afterEach.
- No host tmux, global npm, production identity, account or node changed.
- Source/recipe/reports retained in Git; no production recovery claim.
