From 6259202f3727eb0adb66f3309ed3f6a7a4b7954e Mon Sep 17 00:00:00 2001 From: Niladri Das <125604915+bniladridas@users.noreply.github.com> Date: Thu, 12 Nov 2026 09:08:05 +0530 Subject: [PATCH] docs(planning): describe the replay boundary instead of the first heartbeat The first-run backlog bullet said the catch-up ends at "the first heartbeat after replay". The client in #232 treats a ping as liveness only and ends replay at the cursor frame, or at a history_expired that reports the gap and advances to the floor. The sentence now names those boundaries and records that server-side emission of history_expired on an out-of-retention reconnect is still unverified, so the plan does not promise it. Refs #239. Signed-off-by: Niladri Das <125604915+bniladridas@users.noreply.github.com> --- planning/claude-code-channel.md | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/planning/claude-code-channel.md b/planning/claude-code-channel.md index 6ab3a63..f5c8622 100644 --- a/planning/claude-code-channel.md +++ b/planning/claude-code-channel.md @@ -332,9 +332,12 @@ put that backlog into context on every Claude Code restart. Decided (ยง14 C): - Resume the stream from the cursor file, so nothing is lost on the wire. - An event whose `created_at` is older than the process start time minus 60 seconds is consumed - without a push. Instead, once the stream has caught up (the first heartbeat after replay), push - one `kind="backlog"` control event: how many messages were skipped, per topic id, and the oldest - and newest timestamps. The skill tells the sponsor, as it does today. + without a push. Instead, once replay reaches its explicit boundary, push one `kind="backlog"` + control event: how many messages were skipped, per topic id, and the oldest and newest + timestamps. The cursor frame is the normal replay boundary. A heartbeat indicates liveness only + and does not end replay. If the client receives `history_expired`, it reports the gap and + advances to the supplied floor before ending replay. Server-side emission of `history_expired` + on out-of-retention reconnects remains unverified. The skill tells the sponsor, as it does today. - In-process reconnects resume from the cursor and push everything, since nothing they replay is from before the session. - With no cursor file, `rooms watch` starts from the beginning of the retained stream (`--since`