measure what a handoff actually survives
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -480,6 +480,39 @@ a human watches and steers a conversation that continues without it — which is
|
|||||||
§1.15 shows the chat system was rebuilt to support (durable event log, cursor replay, agent-as-writer,
|
§1.15 shows the chat system was rebuilt to support (durable event log, cursor replay, agent-as-writer,
|
||||||
session outliving the socket).
|
session outliving the socket).
|
||||||
|
|
||||||
|
**Measured, 2026-08-07 — the durability claim above is no longer an argument.** Six tests run live
|
||||||
|
against the running system, deliberately looking for the break. Method and raw evidence:
|
||||||
|
`COMMS/handoff-durability-2026-08-07.md`.
|
||||||
|
|
||||||
|
| what was done to it mid-handoff | turn completed | narration durable |
|
||||||
|
|---|---|---|
|
||||||
|
| nothing (control) | ✅ | ✅ |
|
||||||
|
| `pm2 restart officer` | ✅ | ✅ |
|
||||||
|
| **`officer` stopped for 25 s** | ✅ | ✅ **6 events written while the server was down** |
|
||||||
|
| target's `claude` process SIGKILLed | ❌ lost | ⚠️ partial, with an explicit error row |
|
||||||
|
| next handoff to that same agent | ✅ | ✅ same Claude session resumed |
|
||||||
|
| handoff POSTed while `officer` is down | ❌ lost | ❌ no queue, no retry |
|
||||||
|
|
||||||
|
Three things follow, and they change how the outstanding work should be read:
|
||||||
|
|
||||||
|
- **The "no browser open" requirement is satisfied, and so is the harder one.** Not one of these runs had
|
||||||
|
a page open, and the middle row is the proof that officer is genuinely off the delivery path: the agent
|
||||||
|
sidecar committed the model's own words to Postgres during a 25-second server outage.
|
||||||
|
- **A restart costs a *turn*, not an *agent*.** After being killed mid-turn, the receiver resumed the
|
||||||
|
identical Claude session on the next handoff and volunteered which work had been lost. Continuity —
|
||||||
|
`sessionKey` minted once, write-through map on disk — does the job it was built for. That makes the
|
||||||
|
outstanding claude **stage 5** a smaller problem than its position on the list suggests.
|
||||||
|
- **The remaining hole is on the *sending* side.** A handoff POSTed while officer is down is refused and
|
||||||
|
dropped, and nothing in the introduction text tells the agent to retry — so the sender can believe it
|
||||||
|
handed off when it did not. That, not the receiving side, is where store-and-forward would earn its
|
||||||
|
keep.
|
||||||
|
|
||||||
|
One topology fact found while setting this up, worth stating here because it is the practical limit on
|
||||||
|
working unattended: **`officer-agent` is `sidecar/claude/user-instance.ts`, and every `claude` process on
|
||||||
|
the machine is its direct child.** `pm2 restart officer-agent` therefore kills every agent on every
|
||||||
|
dashboard at once, mid-turn. `CLAUDE.md` reassures that restarting *officer* is safe — it is, and that is
|
||||||
|
verified above — but is silent on this one.
|
||||||
|
|
||||||
### 1.17 The restart payload is temporary — the protocol is not
|
### 1.17 The restart payload is temporary — the protocol is not
|
||||||
|
|
||||||
> The restart thing is giving me pain right now. Pretty soon that won't be a problem, because I won't
|
> The restart thing is giving me pain right now. Pretty soon that won't be a problem, because I won't
|
||||||
|
|||||||
Reference in New Issue
Block a user