From 174bdc05b2de9eec7027dfe90001edc2eff97a75 Mon Sep 17 00:00:00 2001 From: "K. Isom" Date: Thu, 24 Sep 2026 13:12:38 -0700 Subject: [PATCH] CLAUDE.md: memoryd and the M5 split Co-Authored-By: Claude Opus 5.5 (1M context) --- CLAUDE.md | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/CLAUDE.md b/CLAUDE.md index b186dd9..76cbe65 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -17,7 +17,9 @@ M4 is split: M4a (`gatewayd`, conversations over Mattermost, spec and checked end to end against the owner's Mattermost; no finding is open. M4b (approvals over Mattermost, spec `docs/specs/2026-09-24-m4b-approvals.md`, 18 tasks) is done and merged, reviewed in `docs/implementer-log.md` and checked end to end against the owner's Mattermost, including an -approval asked by a non-approver; no finding is open. Branches land on master by rebase and +approval asked by a non-approver; no finding is open. M5 (memory, then the scheduler) is split into +M5a, M5b and M5c by P17 to P20 (applied 2026-09-24); the M5a spec is next. The owner's Honcho client +`roncho` is on titan, not on this machine. Branches land on master by rebase and fast-forward, never a merge commit. The owner's Mattermost settings and the bot's token are in `mattermost.env` at the repository root: ignored by git, never committed, and the token is never printed. @@ -62,15 +64,18 @@ requests, check `GET /slots?model=ornith-1.5-35b-a3b` so you do not evict someon runs `brokerd`, `loopd` and an approval end to end against it. - `bxctl` is the owner CLI: `bxctl chat` talks to a running `loopd serve --config `; `bxctl approvals`, `approve`, `refuse`, `grants check` and `audit verify` talk to `brokerd serve` - (or read the audit log directly); `bxctl reindex` comes in M5. `gatewayd serve --config ` is the + (or read the audit log directly); `bxctl reindex` comes in M5a. `gatewayd serve --config ` is the Mattermost channel (M4a). ## Architecture in brief Separate binaries in one Cargo workspace. Each role holds as little authority as possible: -- `loopd` owns sessions, prompt assembly and memory. It has no credentials and no network. Its - only I/O is Unix sockets to `gatewayd`, `brokerd` and `inferproxy`. +- `loopd` owns sessions and prompt assembly. It has no credentials and no network. Its only I/O + is Unix sockets to `gatewayd`, `brokerd`, `inferproxy` and (from M5a) `memoryd`. +- `memoryd` (M5) owns memory: `memory/soul.md`, `memory.md`, `user.md`, `archive.md`, the FTS5 + index, and from M5b the sync to the fleet's Honcho. It runs memory tool calls `brokerd` has + decided, and reaches Honcho and nothing else. - `brokerd` is the only place authority lives. It reads owner-written grants (it cannot write them), runs each approved tool call in a fresh rootless container, and writes a hash-chained JSONL audit log. @@ -104,7 +109,7 @@ its KV cache, so any change to an earlier byte of the prompt forces an expensive found with `find_tool` and called through the `call_tool` meta-tool. Never prompt the model to call an undeclared tool: the server's grammar forces the call into a declared one. - Tool results are size-capped when first appended and never trimmed later. -- The baseline (system prompt, tool schemas, `memory/core.md`) stays at 3,000 tokens or less, +- The baseline (system prompt, tool schemas, the three memory files) stays at 3,000 tokens or less, measured with the server's tokenizer. - Compaction happens only when the session is idle, and starts a new epoch (`sessions//.jsonl`). Old logs are kept.