diff --git a/docs/keel-architecture.md b/docs/keel-architecture.md index 15e3eea..f27b7e2 100644 --- a/docs/keel-architecture.md +++ b/docs/keel-architecture.md @@ -185,8 +185,9 @@ mode would just route a thought. The runtime state machine becomes the loop in Off-screen mode, from the phone, end to end — **this is what ships today**: 1. **Collect** — today's Marvin tasks (`am --json`) + the `~/owc/goals-2026.md` - goals + the life-domain `~/owc/resources/bug-*.md` notes, assembled into a - single budgeted brief. + goals + the life-domain `~/owc/resources/bug-*.md` notes — plus recent + proposals and their outcomes recalled from the `keel.events` AW bucket — + assembled into a single budgeted brief. 2. **Brain** — the chosen brain (`ai.Proposer`) returns one worthwhile off-screen action plus a short rationale. 3. **Surface** — the phone-first web UI renders a proposal card and asks Felix to @@ -196,10 +197,13 @@ Off-screen mode, from the phone, end to end — **this is what ships today**: No new store touched. The brain was rented for one call. Everything else was Keel. -**Next increment:** memory. Off-screen does not yet read or write Keel's AW -buckets, so it cannot remember what it proposed last time. Adding a *remember* -step (read `keel.state` for prior proposals) and an *act* event -(`proposal_made`/`action_taken` to `keel.events`) closes the loop per §7. +**Shipped:** memory. Off-screen now writes its decisions to the `keel.events` AW +bucket (`proposal_made` / `action_taken` / `proposal_dismissed`, correlated by a +random `proposal_id`) and reads its recent history back into the brief — so a +proposal can avoid repeating itself and follow up on what was dismissed or left +undone. Storage sits behind a thin `memory.Store` port (AW-backed, or a nop when +AW is down), the seam every later mode reuses; see §7. The `keel.state` bucket and +the trend/spiral detection that reads this data remain future increments. ---