M5.2: agent memory #141

Merged
dev-agent merged 1 commits from memory into main 2026-10-08 23:12:58 +00:00
Collaborator

M5.2, agent memory (L6.4), as discussed: the model writes and forgets without asking, corrections may be paraphrased, and a pass at an item's close records what will matter.

Code

  • memory.py:
    • one note per fact at memory/nisse-dev/<name>.md, holding a one-line description, the fact, and provenance (work item, thread, time);
    • an index.md that the harness rebuilds after every change;
    • a snapshot of the index, with a hash, for the transcript;
    • vault.delete, for read-write folders only.
  • The tools remember(name, description, fact) and forget(name, why):
    • for the driver (before the go-ahead too) and for conversations;
    • each change posts a line in the thread ("Remembered: …", "Updated: …", "Forgot: …");
    • plain names only, and index is reserved.
    • Memory is on when the vault configuration gives memory/nisse-dev read-write.
  • The index is shown once per item and conversation: a fact in the transcript with its path and hash (L6). The prompt says memory is a cache, to be checked against the live system and fixed when wrong.
  • A memory pass at close (completed or abandoned):
    • it runs the driver's model under a new memory role, in its own transcript, seeing the item's narration the way the toolchain step does;
    • its tools are the note tools, remember, forget and memory_done;
    • it is bounded by tuning.memory.max_turns (10);
    • when it fails or runs out of turns, that's recorded as a fact, and the close still stands.

Docs

  • L6:
    • the model writes and forgets on its own, each change said in the thread;
    • the harness keeps the index and puts it into the transcript at start;
    • the closing pass;
    • corrections are recorded faithfully with attribution, and paraphrase is fine.
  • The Development Plan: the M5.2 entry, and M5.3 split out as its own line.
  • The Tuning Guide and example YAML: memory.max_turns.

Tests

  • test_memory.py:
    • notes and their provenance;
    • the same name replaces a note, and the index follows;
    • forgetting;
    • names are checked;
    • the snapshot's hash.
  • test_loop_memory.py:
    • the model remembers and forgets without asking, with thread lines;
    • the index is shown once;
    • the pass at close writes notes in its own transcript;
    • a pass that fails, or hits its turn limit, never holds the close up;
    • a conversation can remember.
  • The walk: its model now remembers and forgets, both in runs and in the closing pass (18 writes and 13 forgets across 16 seeds). A new check, memory_stays_home, confirms nothing lands outside memory/nisse-dev/ and your note is never touched.
  • Locally: the unit tier (739 tests) and the 48-seed walk pass.

🤖 Generated with Claude Code

https://claude.ai/code/session_01J5Utyfzw7gF7UhjRDEtjTk

M5.2, agent memory (L6.4), as discussed: the model writes and forgets without asking, corrections may be paraphrased, and a pass at an item's close records what will matter. ## Code - **`memory.py`:** - one note per fact at `memory/nisse-dev/<name>.md`, holding a one-line description, the fact, and provenance (work item, thread, time); - an `index.md` that the harness rebuilds after every change; - a snapshot of the index, with a hash, for the transcript; - `vault.delete`, for read-write folders only. - **The tools `remember(name, description, fact)` and `forget(name, why)`:** - for the driver (before the go-ahead too) and for conversations; - each change posts a line in the thread ("Remembered: …", "Updated: …", "Forgot: …"); - plain names only, and `index` is reserved. - Memory is on when the vault configuration gives `memory/nisse-dev` read-write. - **The index is shown once per item and conversation:** a fact in the transcript with its path and hash (L6). The prompt says memory is a cache, to be checked against the live system and fixed when wrong. - **A memory pass at close** (completed or abandoned): - it runs the driver's model under a new `memory` role, in its own transcript, seeing the item's narration the way the toolchain step does; - its tools are the note tools, `remember`, `forget` and `memory_done`; - it is bounded by `tuning.memory.max_turns` (10); - when it fails or runs out of turns, that's recorded as a fact, and the close still stands. ## Docs - **L6:** - the model writes and forgets on its own, each change said in the thread; - the harness keeps the index and puts it into the transcript at start; - the closing pass; - corrections are recorded faithfully with attribution, and paraphrase is fine. - **The Development Plan:** the M5.2 entry, and M5.3 split out as its own line. - **The Tuning Guide and example YAML:** `memory.max_turns`. ## Tests - `test_memory.py`: - notes and their provenance; - the same name replaces a note, and the index follows; - forgetting; - names are checked; - the snapshot's hash. - `test_loop_memory.py`: - the model remembers and forgets without asking, with thread lines; - the index is shown once; - the pass at close writes notes in its own transcript; - a pass that fails, or hits its turn limit, never holds the close up; - a conversation can remember. - **The walk:** its model now remembers and forgets, both in runs and in the closing pass (18 writes and 13 forgets across 16 seeds). A new check, `memory_stays_home`, confirms nothing lands outside `memory/nisse-dev/` and your note is never touched. - **Locally:** the unit tier (739 tests) and the 48-seed walk pass. 🤖 Generated with [Claude Code](https://claude.com/claude-code) https://claude.ai/code/session_01J5Utyfzw7gF7UhjRDEtjTk
dev-agent added 1 commit 2026-10-08 23:06:05 +00:00
M5.2: agent memory
CI / checks (push) Skipped
CI / checks (pull_request) Successful in 1m48s
CI / e2e (pull_request) Successful in 4m33s
2b26f0cff5
remember(name, description, fact) and forget(name, why): control tools for
the driver (before the go-ahead too) and conversations, writing only the
agent's own vault folder, one note per fact with its provenance. No one
agrees first; each change is a line in the thread. The harness keeps the
index and puts it into the transcript once per item, with a hash.

At an item's close, completed or abandoned, a bounded memory pass (the
driver's model, its own transcript and view) records what was decided and
learned; it never holds the close up (tuning.memory.max_turns).

With the operator: corrections may be paraphrased (L6 changed), the model
forgets on its own, and nothing limits what may prompt a note. The walk
remembers and forgets, and checks nothing lands outside the agent's folder.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01J5Utyfzw7gF7UhjRDEtjTk
dongar approved these changes 2026-10-08 23:07:28 +00:00
dev-agent merged commit 427278ac80 into main 2026-10-08 23:12:58 +00:00
dev-agent deleted branch memory 2026-10-08 23:12:58 +00:00
Sign in to join this conversation.
No Reviewers
2 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: dev/nisse#141