0.1.64
The release that makes loops talk to each other reliably, and stops one slow client freezing everyone else.
If you are on 0.1.63, this is what you have been living with
Each of these was measured on the shipped builds, not estimated:
| On 0.1.63 | On 0.1.64 |
|---|---|
| One client reading slowly stalls the daemon 12 seconds for everybody | 0.003 s with a deaf client |
| 211 KB broadcast on every graph change, most of it unchanged mail | 54 KB — a 74.3% cut |
node memo up to 2.13 s, holding the store's actor throughout |
Off the actor; the Mailroom is written only when it changes |
mail watch and --follow-up silently dead for any Claude loop idle past 60 s |
Delivered — a loop's own idle notification no longer knocks it out of the state that receives mail |
| 5 of 18 follow-ups dropped; 12 deliveries for 4 messages | Delivered once each |
| Restarting a loop starts a fresh session and re-issues the goal | Restart resumes the conversation |
If loops on your graph have seemed to go quiet on each other, that was the fourth and fifth rows.
What changed
Delivery. The follow-up drain takes and clears in one step and refuses to re-enter (#309). A loop's own idle_prompt no longer flips it out of idle (#310). The mail cursor advances only through posts actually handed over (#295). The drain's send is bounded, and a send that times out and then fails is retried exactly once rather than dropped (#320, #321).
The daemon. Writes no longer block the GraphStore actor (#291), the send is bounded by SO_SNDTIMEO rather than a flag that does nothing on macOS (#301), a broadcast is encoded once rather than per connection (#296), and the presence tick carries only the loops that moved (#297).
Storage. The Mailroom is persisted beside the graph and written only when its digest changes, with graph writes off the actor (#308) — which also fixed a stale read that could leave sessions orphaned when deleting a closed project.
Restart. The daemon owns an unattended relaunch; the pane waits for it instead of racing ahead and creating the session fresh (#312).
Diagnostics. Daemon IPC keeps bounded, structured records of each request — shape, never payload, verified by driving a nonce through every command (#303).
Recorded honestly
PR #316 — the #311 blocker fix — merged with no review comments. It is the only change in this line that went in unread. Its unit tests are good and the diff was read before merge, but it did not get the independent review every other PR here had. A separate loop is re-running the #311 reproduction end to end against the shipped binary; that is confirmation after the fact, not a gate this release passed.
Known and not fixed, none of them a data-loss path in normal use: shipped daemons log version=unversioned (#313); one CLI error names the wrong flag (#314); post refusals are broadcast to every client rather than the asker (#305). Also open: #300, #298, #292, #276, #278.
Verified on the merged tree: 1693 tests · 180 suites · 0 failures · swiftlint 0 errors · swift-format clean. Bundle identity verified dev.graphcode.app in both the Info.plist and the code signature. The line has also soaked all day under this graph's own load — roughly 35 loops, concurrent builds, heavy mail traffic and daemon restarts.