Plain old markdown with links is exactly what I use. But I split memory in 3 parts
1. a log of user comments, all of them collected in a chat_log.md file which is used to validate the agent still follows user intent
2. task level memory, a task.md file starts as intent, becomes plan, workbook with inlined results for each gate, and finally remains as documentation; same task.md is passed to judge agents and back; a project can have 100+ tasks logged in, the task is the natural unit of work
3. a project state mind map which tracks current known value of all decisions and intents, it is used to start the agent new sessions and updated after each task
This is it, a memory of user intent, one of agent work, and one of project state. I used this setup in over 100 projects. My harness uses hooks to constrain the agent
1. can't edit code files without an open task
2. the next current gate ("[ ] plan item") is displayed in the post tool use hook as an instruction pointer, auto-advances as current gate gets checked; this keeps the agent straight even in task.md files with 100s of gates
3. can't close a task until all gates are solved
4. a post user message hook appends to chat_log.md, which is cheap
The harness can be refined by optimizing task.md plan structure for various types of tasks, based on reflection. We can do reflection because we keep the 3 memory types.
Memory works for my harness because I don't split the place where memory sits from the place where work gets done and tracked. The plan items are this place. A single gate starts as intent and ends as a log like of work done. The task.md file is edited as it is solved.
https://github.com/horiacristescu/claude-playbook-plugin