Handoff: where Remem stands and how to pick it up
Last verified against the code: 2026-11-13 (0.9.0)
Written at the end of 2026-10-25 so that the owner, or any agent, can pick up exactly here. Read this first, then
ROADMAP.md (north star, milestones) and GOALS.md (goals A1–A10).
The one command that says where things stand is remem goals; it reads the evidence, not this page.
State in one paragraph
Remem is memory for AI agents that learns from surprises (corrections, failed calls) and delivers each lesson at
the moment it applies. 0.8.1 is released (deployed to remem.acific.com; scripts/release-check.py passes): 0.8.0's
experiments, re-run on the final reminder, and 0.8.1's adapters at 7B on the GPU. 4 of 10 goals are met (A1, A2, A3, A10), A8 is not met, A5–A7 are collecting
evidence, and A4 and A9 wait on the owner.
What 0.8.0 found (paper §7.4; every run in results/runs/)
- Why memory up front hurts: one line. Pooled over Llama 3.2 3B, Gemma 3 4B, Qwen3-30B-A3B and Mistral 7B, the
delegation tally ("the agent offered to act instead of acting 17 times…") raised hand-backs from 20% to 34% of
replies (p < 0.0001), as much as the whole memory; length, position, the header, unrelated lessons and the person's
words did not. Agents no longer see the tally (
render.py); the owner still does, inmorning.md. - The Stop reminder was making agents reckless. Where asking is right, models asked 42% of the time with no
memory and 16% after 0.7.0's reminder (they published a post legal was reviewing, force-pushed before being told
to). Fixed and installed on the owner's machine the same day: a gate (
transcripts.needs_person: no reminder when the person's message says only they have what is needed) and the boundary in the reminder's words (prime.reminder, the one wording used by the hook, the proxy and the experiments). Re-run: 39% → 37% (A10 met), and it still cuts hand-backs where acting is right: 31% → 12% (p < 10⁻¹², four families; A1 met). The lesson in the reminder adds nothing over a bare nudge (12% vs 11%): memory's job is deciding whether and when to intervene. - It holds with tools. In agent loops (simulated shell and editor), the reminder cut final hand-backs from 32% to 14% (p = 0.001, three families; A2 met).
- Memory in the weights compiles a disposition, not a judgement. A LoRA adapter trained on reminder pairs
(
scripts/adapter.py, Qwen2.5-1.5B, CPU) handed back 5% with no reminder (base 37%), but stopped asking where asking was right (0 of 18). Adding boundary pairs made it ask more everywhere (63%); a 30% share gave 47% / 8 of 18. At 7B on the GPU (0.8.1), a 30% share gave 26 → 20 of 100 with asking kept (13 → 14 of 30), one short of the target; more "act" pairs tipped it to 0 of 100 and 2 of 30. Training moves how readily the model asks, not when. A8 is not met. - A stated preference up front helps ("the user prefers that you act": 12%, p < 0.001), but rewordings are model-dependent; nothing about delegation goes up front now.
Re-running the evidence
Every number above can be re-made on this machine (10–40 minutes per command; results land in
~/.remem/experiments/, and remem goals reads them):
export REMEM_LLM_URL=http://localhost:11434/v1
for m in llama3.2:3b gemma3:4b hf.co/unsloth/Qwen3-30B-A3B-Instruct-2507-GGUF:Q4_K_M mistral:7b; do
for kind in behaviour mechanism boundary; do REMEM_LLM_MODEL=$m remem experiment $kind -n 3; done
done
for m in llama3.2:3b hf.co/unsloth/Qwen3-30B-A3B-Instruct-2507-GGUF:Q4_K_M mistral:7b; do
REMEM_LLM_MODEL=$m remem experiment loop -n 2
done
remem experiment pairs && python scripts/adapter.py --model Qwen/Qwen2.5-7B-Instruct --n 5 --boundary-share 0.3 # in the GPU venv
cp ~/.remem/experiments/*.json results/runs/ # keep them in the repo
Next, in order
| # | What | Goal | Who | How |
|---|---|---|---|---|
| 1 | Frontier models | A4 | owner: an API key; agent: the runs | REMEM_LLM_URL=https://api.anthropic.com/v1 REMEM_LLM_MODEL=<model> REMEM_LLM_KEY=<key> remem experiment (then loop, boundary, mechanism); the most important missing evidence |
| 2 | Transfer between machines | A9 | owner: one paste | remem share invite in the owner's own terminal on the Linux box (it prints a token), the line pasted on the Mac |
| 3 | Memory in the weights: teach when, not how often | A8 | agent | the GPU path works (0.8.1, 7B in 20–30 min); next: contrast pairs that hold the situation fixed and vary only whether the person has what is needed, a judge of asking better than a question mark (asks phrased as statements are missed), and real pairs from ~/.remem/pairs.jsonl |
| 4 | Real use | A5, A6 | owner: daily work; agent: weekly | remem measure and remem goals weekly; 20 reminders in each arm |
| 5 | More repeated corrections for the comparison | A7 | time | remem compare -k 20; needs 10 cases |
Owner decisions still open
- The name is decided: Remem (the owner, 2026-11-13; it was Open Memory, which collided with mem0's "OpenMemory" MCP server). Still open under it: publishing
rememto PyPI to hold the name, renaming the Worker and the address (remem.acific.com), and a trademark look. - Launch: opening the repository and the commons (criteria in ROADMAP.md: A1–A4 met, A5 at 20 per arm).
Where things are
| Thing | Where |
|---|---|
| Code | remem/ (stdlib only); new in 0.8.0: goals.py, experiments in experiment.py, needs_person in transcripts.py, reminder and last_prompt in prime.py |
| Adapter training | scripts/adapter.py; needs a venv with torch, transformers, peft, trl. On the GPU (Radeon 8060S, gfx1151) take AMD's build, as the stock ROCm wheels crash: uv venv -p 3.12; uv pip install --index-strategy unsafe-best-match --index-url https://rocm.nightlies.amd.com/v2/gfx1151/ --extra-index-url https://pypi.org/simple "torch==2.12.0a0+rocm7.13.0a20260411"; uv pip install transformers==5.20.2 peft==0.21.2 trl==1.16.0 datasets accelerate. On CPU: torch from https://download.pytorch.org/whl/cpu |
| Every run | results/runs/ (copied from ~/.remem/experiments/), results/adapters/*/result.json, results/pairs-2026-10-25.jsonl |
| The owner's store | ~/.remem/ on the Linux box (memory.db, primed.jsonl, experiments/, adapters/) |
| Hooks | ~/.claude/settings.json (SessionEnd, UserPromptSubmit, Stop, PreToolUse), wired by remem setup; backup settings.json.before-remem |
| Release rules | AGENTS.md (rule 17: scripts/release-check.py must pass before anything is called released) |
| Lab log | ~/Strange/handbook/LOG.md |
Notes for whoever picks this up
- The holdout puts half of all sessions in the control arm by a hash of the session id. So far only two real sessions have hit a reminder, and both landed in the control arm by chance (one in four), which is why A5 shows 0 shown. Not a bug; it needs more sessions.
- Tests that call the hooks with
record=Truewrite to the realprimed.jsonlifREMEM_HOMEis not set; set it, or remove the rows (this happened once on 2026-10-25 and was cleaned). - The gate (
needs_person) was written with the boundary scenarios in view: a fit, not a test. It caught 5 of 6 held-out ones. Score it on real messages before trusting it further. - Mistral 7B through Ollama almost never calls tools, so its loop result is close to a single-reply test.