docs: M5c spec: sends are at least once, skip in decided lines, sync from when Honcho is on

The ledger cannot promise an item is never sent twice: a crash between a send and its sent line,
or an owner removing that line, sends it again. A decided line holds a skip and its reason, as
task 07's ledger does. Turns from before sync began are skipped (owner's decision, 2026-09-28).

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-09-28 07:59:30 -07:00
co-authored by Claude Opus 5.5
parent 47d846eb77
commit 2926031b4d
+9 -4
View File
@@ -138,10 +138,15 @@ rebuilt from them.
`honcho-send-refused`), and the worker moves on. `bxctl memory sync` lists failed entries. `honcho-send-refused`), and the worker moves on. `bxctl memory sync` lists failed entries.
**The ledger**, `memory/honcho.jsonl`, is append-only JSON lines, one per event: `decided` (the **The ledger**, `memory/honcho.jsonl`, is append-only JSON lines, one per event: `decided` (the
item, the workspace or `none` and why), `sent` (the item and Honcho's ids), `failed` (the item and item, and the workspace it goes to or `skip` and why), `sent` (the item and Honcho's ids), `failed`
the status). What is decided and not sent is the outbox; there is no separate queue. An item is (the item and the status). What is decided and not sent is the outbox; there is no separate queue.
never sent twice: the worker checks for its `sent` line first, and on start `memoryd` reads the The worker checks for an item's `sent` line before sending it, and on start `memoryd` reads the
ledger through. Items are a turn (`session`, `turn`) or an edit (its journal id). ledger through, so an item is sent at least once and a second time only if a crash falls between
the send and its `sent` line, or the owner removes that line (Honcho cannot delete a message).
Items are a turn (`session`, `turn`) or an edit (its journal id).
**Sync starts when Honcho is turned on.** The ledger records when sync began, and a turn that
started before then is skipped, so turning on `[honcho]` never sends earlier conversations.
Everything written to Honcho is neutralised (`sanitize::neutralise`); a reply is the model's own Everything written to Honcho is neutralised (`sanitize::neutralise`); a reply is the model's own
output and was logged as it came, so it is neutralised here, when it leaves. output and was logged as it came, so it is neutralised here, when it leaves.