---
name: v0306-poison-log-churn
description: "v0.30.6 ambient CONN_WRITE_POISONED churn = failed dial-path writes to offline peers, benign; r4 field-acceptance PASSED 2026-07-10"
metadata: 
  node_type: memory
  type: project
  originSessionId: 6cf22920-8f60-4a09-9b8d-7d46280f9a8c
---

Update-wedge round-4 field-acceptance PASSED 2026-07-10 on v0.30.6 (counter 57): black-holed `rc --take` controllers get CONN_WRITE_POISONED at the 15000ms bound, conns retired, no broker freeze, fresh take recovers with no daemon restart. Saga CLOSED.

Two follow-ups registered from the field run, neither round-5 material:

1. **Ambient CONN_WRITE_POISONED log churn** on v0.30.6 — fires continuously, correlated 1:1 with `PUMP_PEER_FAIL:<node>: submit-dial exceeded the 10s bound` to offline subnet peers. Present before/after any rig activity. The r4 write primitive logs *failed* (not just timed-out) writes as poison — log noise, possible mislabel of the dial-failure path. Needs triage into a REQ.
2. **mobile-gw gateway does not come back after full daemon restart** (alive=false post `spt update apply --finish`) — live field case for [[m4-resume-state]] F-038 endpoint-autostart.

**Why:** poison lines in daemon.stderr.log look alarming post-r4; without this note the churn reads as the wedge recurring.

**How to apply:** when scanning daemon.stderr.log, treat CONN_WRITE_POISONED interleaved with PUMP_PEER_FAIL as dead-peer dial noise; only poison WITHOUT peer-fail correlation on local conns indicates a real stalled-consumer event (which is the fix working, not a freeze — freeze = status hangs/sessions stop).

**Post-v0.31.0 update (W6 F-039 shipped 2026-07-10):** the churn class is now token-split — dial-noise/organic conn deaths log `CONN_WRITE_RETIRED` (with error kind); `CONN_WRITE_POISONED` is RESERVED for the deadline/wedge class. Both carry `conn=<id>`, role/endpoint/session facts, and `wall_ms=/mono_ms=` stamps, plus `CONN_LIFECYCLE` write-start/transport-close records that make fresh-carrier churn directly visible. On a ≥v0.31.0 daemon, POISONED lines are ALWAYS the real wedge observable — no PUMP_PEER_FAIL correlation excuse anymore.
