---
name: v0305-published
description: v0.30.5 counter 56 @0a306c9 PUBLISHED — update-wedge round-3 SharedSend deadlock fix (cursor-only daemon resume); field-verify = the apply itself
metadata: 
  node_type: memory
  type: project
  originSessionId: a54257af-8b81-456c-ba38-85739f7f10e9
---

v0.30.5 = **counter 56 @0a306c9 PUBLISHED** (Latest, isDraft=false, 10 assets; update-set version:56 product_version:0.30.5 channel:stable, 3 platforms). Published 2026-07-10 via `xtask release-publish --tag v0.30.5 --key-id rel-primary-2026 --version 56` (SPT_RELEASE_SEED already in profile env, 64-hex). Ties off the update-wedge saga — see [[update-wedge-2-resume-steal]] (round-2 v0.30.4 FIELD-BROKEN), [[update-wedge-rca-v53]] (round-1).

**Fix (round-3, Option A-split):** root = SharedSend brain-conn self-deadlock. Daemon resume subscribed N sessions onto its own req/reply conn with NO drainer → a subscriber writer holds the send-mutex across `write_frame` → heartbeat reply (`net_status`/`sessions`) can't acquire it → brain drains nothing → controller writers cross the 15s BRAIN_WRITE_DEADLINE → STALL_EVICT → all sessions wedge. Dead-peer-INDEPENDENT. v0.30.4's Viewer fix killed the controller-STEAL (Failure A) but not this backpressure deadlock (Failure B). Fix: daemon resume is CURSOR-ONLY (`resume_session_cursors()`, seeds cursors, no subscribe) → no subscriber backpressure → deadlock can't form. `resume_sessions()`+resume.rs UNCHANGED (D4-2 output-continuity coverage intact). REQ-BRAIN-RESUME-NO-CONN-DEADLOCK [doc,impl,int]. Option-C durable class fix (bounded/non-blocking subscriber write, broker-side, needs coordinated restart) deferred as REQ-HAZARD-SHAREDSEND-NO-BLOCKING-WRITE-UNDER-LOCK. Full ruling: docs/UPDATE-WEDGE-2-ROUND3-RULING.md.

**Cut mechanics:** worktree .worktrees/rel-0.30.5 off gated fix-tip 03c71093 + origin/main merged in; bump 0.30.4→0.30.5 @5502456; PR #74 → main @0a306c9; tag v0.30.5. Bundles round-2 viewer fix + round-3 cursor fix.

**CI saga (KEY lesson — [[ground-dont-assume-on-incidents]] reinforced):** first PR CI = 4 e2e-timeout fails NON-overlapping across OS. I read it as "shared-runner starvation flake." doyle GROUNDED the correction: the Windows CI runner (hfenduleam) was itself LIVE-WEDGED with the exact SharedSend deadlock under fix → the Win rc::attach_viewport_reconnects_across_a_broker_bounce 240s hang WAS the wedge, not load; the Linux 3 fails = separate kitsubito starvation. Rerun on the wedged box = confounded (re-failed, disregarded). Operator bounced hfenduleam to clean cold-start → re-rerun → ALL GREEN (both test legs clean 12m). Lesson: a CI box running the buggy version can manifest THE BUG as a test hang — don't call "flake" on an incident box; ground the read in live box state.

**Process:** operator ruled PUBLISH-then-verify (can't field-verify without a Latest to `fetch --apply` TO; brain-side fix means the apply IS the field-verify). So publish/flip FIRST, then operator applies v0.30.5 on the live box as the verify. At publish time the apply-verdict was still pending — if it FAILS, round-4 off a NEW fix branch (never reuse rel-0.30.5). Counter always from published update-set metadata (was 55 → 56).

Prior: [[v0304-published]] 55 @b0d7719 (FIELD-BROKEN), [[v0303-published]] 54, [[v0302-published]] 53, [[v0301-published]] 52.
