Reasonix is the thirty-fifth agent deja reads, and deja install reasonix-auto
brings recall into it through a plugin package and a runtime extension.
The line deja puts beside a failed command or before a risky one is now worth
reading. It no longer offers a merge, a force push or a deletion as the fix for
an error, keeps to this project's remedies, stops calling a program on PATH
missing, and stops blaming a chain's error on its first command: of the
warnings before a command, 90% now describe something that command does,
against 38%. The compaction packet keeps the open items a summary drops until
the transcript closes them, and a recall page that found one long session says
which session to open.
Added
- Reasonix, the thirty-fifth harness deja reads (#4053, requested by @TianQue6916). Its sessions were reachable only through
DEJA_COMMANDCODE_ROOT, filed undercommandcodewith no project and no date. deja now follows Reasonix's own root chain (REASONIX_STATE_HOME,REASONIX_HOME,[storage] stateinconfig.toml, then~/.reasonix, or%APPDATA%\reasonixon Windows) and reads the JSONL store, the legacy roots while they exist, and the 1.x session directories, whoseevents.framesit decodes through thezstdCLI.deja resumeprintsreasonix --resume <id>in the session's workspace. deja install reasonixandreasonix-auto. Both install one Reasonix plugin package,deja, carrying the MCP server, thedeja-historyskill and/deja.reasonix-autoadds a runtime extension,deja reasonix-ext, since on Reasonix 1.39.1 only SessionStart hook output reaches the model: it appends the session digest and per-prompt recall to the user turn, not the system prompt, so DeepSeek's prefix cache keeps hitting; adds the fix for a failed command to that tool result; and hands the compaction summarizer deja's record of the turns being folded. With a warm index the per-prompt step took a median of 131 ms over eight turns, against 120 ms for the hook run directly.deja doctorreports the package, a disabled record, and a runtime binary that is gone.- The compaction packet carries a short "keep until closed" list: questions waiting on the user, open #N items the agent named, verdicts, and rechecks promised for later. Each line stays across compactions until the transcript closes it (a
gh pr merge N, "#N merged", a user reply). On 189 real compactions the summaries dropped 35% of open #N items, 71% of verdict lines and 97% of deferred rechecks; the list holds 72% of the dropped #N that were still open, is 274 tokens median, and was right on 34 of 40 hand-checked lines. It takes at most 40% of the packet. Claude Code and Codex only, where the packet is captured. - A recall page whose answer is a fragment of one long session now says which session to open: "Session matched N times and only three of them fit here — call recall_context with that id to read the rest." A hit quotes at most three of its matches, and the only follow-up the page offered was
offset=— more sessions, never more of the one already found. Over eighteen questions on a live harness the line cut billed tokens 23% to 51% and gained two correct answers of twelve; it costs 149 bytes and appears only when a served session matched ten times or more. deja bench contextmeasures the same chains a second time with their history folded into one long session each, and prints it as its own table. Every corpus in the benchmark filed history as many short sessions with one fact each, which is not the shape a real store has: on this machine's own store every recall page's deepest hit matched between 24 and 23,278 times. Folded, the session-start block carries a quarter of a chain's facts instead of half, in 89 tokens instead of 360 — the same content, reached less often because it is filed in one place. The existing rows do not move; the second corpus is built and indexed on its own.
Fixed
- The Zed extension uses the
dejaalready on PATH instead of downloading its own copy. Its probe runsdeja --version, which Zed refuses unless the manifest lists it, and the manifest listed nothing (#4068). - The
deja-historyskill namesorientwith the other modes; the MCP tool had seven and the skill listed six. - The opencode npm plugin puts the session digest into opencode's first system message instead of adding a second one. vLLM and SGLang serving Qwen reject a request with two ("System message must be at the beginning."), so the title agent and subagents on those models failed every turn. The plugin
deja install --autowrites already did this (#4058, reported by @R-omk). deja fixand the MCPfixmode say when what ran after an error was withheld as irreversible. With only a merge, a force push or a deletion on file, the CLI answered that the line matched nothing and offered the same line back as the closest one it held, and MCP said no session ran a command after it. Both now say the remedy exists and is not handed over; MCP still adds what sessions said about the error.- An opencode 1.18.3 store read as having no sessions. Its
session_messagetable held only model-switch events whilemessageandpartheld every turn, and any row there made deja read the store the 2.x way. It now counts only the rows the 2.x reader can use (#4025, contributed by @aniruddhaadak80). - Appends to omp transcripts under a profile or
$XDG_DATA_HOME/ompare indexed as they happen. A full build read them, and the incremental pass matched them to no harness and skipped every later turn until the next rebuild: 3 of omp's 4 roots (#4041). - "X is not on this machine" is no longer said about a program that is on PATH. The sightings stay on file after the program is installed, and the line kept repeating them: on one machine every one of the 56 such lines shown for docker and shellcheck came after the binary was there. The check only silences — a program the hook cannot see may still be missing for the agent's shell, so not finding it changes nothing.
- The warning before a command ("Last time this machine ran X it ended with: …") no longer lays a chain's error at its first program. The error came from whichever part of the line failed, so
gh pr checkswas on file as ending in a failing Go test andgit fetchas ending in zsh's "== not found". A failure is now recorded against the first program only when everything after it just filters its output, and zsh's "no matches found" only against the part that held the glob. Over 835 warnings shown in real transcripts, 38% described something the command itself does; with the rule 90% do. It drops 486 of the 514 wrong ones and 75 of the 321 right ones, the errors of chains that did fail at their first program. - A command that cannot be taken back is no longer offered as the fix for an error: merging or deleting through
gh, deleting or force-pushing a branch,git reset --hard, dropping a stash,git clean, a recursiverm, and changing a cluster or touching a production namespace. The remedy is whatever a session ran next after the same error, and that is often just its next step. Over 396 real hints on one machine, 27 were such commands; 25 had nothing to do with the error they answered. A pair behind one of these still answers. - The compaction packet is captured for a session that moved between directories. A transcript whose tail named two working directories was refused as a different session, so the long sessions that switch worktrees got no packet: 9 of the 20 largest Claude transcripts on one machine. The session id still has to match; the directory is now the newest one (#4031).
- A session's conclusions no longer include deja's own recall echoed back or a bare "ok". The last message was always a candidate, so a session that answered from memory had "deja-vu recalled: …" served as what it settled, and a session that ended on "done" had that. On a 2,285-session store that was 132 and 104 of 2,804 served lines; now 0 and 3, and the 194 sessions left with nothing had nothing else to give. A reply that opens with the credit line keeps the work after it.
recallgiven a session id now keeps to a budget. It returned the whole digest before any cap applied, so on a 1,292-session store 7 of the 20 largest sessions came back over the 8192 bytesrecall_contextpromises for the same read. It now gets that budget and the same line saying the digest was cut (#4023).- An answer that had to drop one of the query's words no longer says its sessions hold every word of the query. The word forms line announces the drop — "zstd (ignored: no session matches it with the rest)" — and two lines below it the count, the lead and the per-session marks all claimed the whole question had matched. On this machine's store, eight questions about decisions that were never made came back that way, each with 1 to 5 sessions tagged as holding it; they now get "No session is about this" instead. Answers where every word is present are unchanged, and the three benches do not move. It did not change what a model does with them: over the same eight questions on a live harness, the invented decision was asserted 8 times of 8 with the false claim and 6 of 7 without it.
- On the one-tool MCP shape,
mode: "search"andmode: "digest"were accepted and then answered "query required", andmode: "recall_context"— the name every block deja injects tells an agent to call — was rejected outright. The field that carriesqis now keyed by the call a mode resolves to rather than by the mode, so all ten modes answer. An agent following deja's own instruction was spending a call on an error.
Changed
- The line a failing command gets no longer offers what another project ran after the same error. The lookup was machine-wide so an environment fact would answer everywhere, but a pair names the project it came from, and what that project did next was almost never about this failure. Over 396 of these lines on one machine, read against the error they answered, the ones from another project addressed it 6 times of 104 and were unrelated 90 times, and 9 of them were commands that could lose work (a stash drop, a force delete, a production namespace). Keeping to the current project raises the share that addresses the error from 29% to 38%. A pair recorded without a project still answers everywhere, and
deja fixis unchanged. - Blocks after a session's first no longer carry the "matched on wording, not meaning" caution. It was there so a wording match would not be taken for an answer, and measured against that on a local 9B over 40 cases where the recalled history is about a sibling subject and holds a value nothing else does: quoted unhedged as the answer 12 times of 40 with the line, 10 of 40 without it. Dropping it takes 100 tokens off a session over real prompts, with the payload byte-identical. The untrusted-data frame stays on every block — dropping its sentence doubled how often a directive planted in recalled text was obeyed, 8/48 against 19/48.
- Every surface that tells an agent when to recall — the MCP instructions, the guidance block, both skills and the Hermes provider — now names two triggers that are not questions: the user stating that something of theirs already exists ("I already have X", "we use Y for this"), and the agent being about to say that something on this machine does not exist (#4004, #4005). The trigger lists were all questions, so a statement matched none of them. Cost is 66 tokens in the guidance block and 67 in the MCP instructions; the longer version lives in the skills, which load only when they are used.
scripts/denialratecounts how often an agent denies something the index could have answered, and says the rate is not measurable lexically: over 2817 sessions, 457 denying turns hit 50.6% against a control of 50.8% when the denying sentence has to name what it denies, and the loose rules put the control ahead (#4006).
Changelog
Features
- feat: Reasonix — read its stores, and wire MCP, skill and a sidecar extension (#4053) (#4067)
- feat: a recall page says which long session to open, not only how to page on (#4018)
- feat: recall triggers cover statements, not only questions (#4007)
- feat: the compaction packet keeps open items until the transcript closes them (#4030)
Fixes
- fix(omp): the incremental index reads profile and XDG transcripts, not only the default root (#4042)
- fix(opencode): keep populated message tables in 1.x stores (#4027) (@aniruddhaadak80)
- fix(opencode): the npm plugin folds recall into the first system message (#4059)
- fix(zed): declare the PATH probe so an installed deja is used, and list orient in the skill (#4069)
- fix: a chain's error is not on file against its first command (#4035)
- fix: a failing command's line keeps to this project's remedies (#4033)
- fix: a program on PATH is not called missing (#4036)
- fix: an answer missing a query word stops claiming it holds them all (#4016)
- fix: compaction capture follows a session across directories (#4032)
- fix: conclusions skip deja's own recall echo and bare acknowledgements (#4029)
- fix: deja fix says a remedy was withheld instead of that nothing ran (#4052)
- fix: never offer an irreversible command as the remedy for an error (#4034)
- fix: recall by session id keeps to the deep-read budget (#4024)
- fix: the modes deja tells agents to call all answer (#4022)
Performance
- perf: drop the repeated caution from injected blocks (#4012)
Documentation
- docs(amp): name how to delete the account copy of a thread (#4054) (@vaibhav8a)
- docs(compare): ai-memory and basic-memory join the table (#4014)
- docs(guide): pages say what the hooks, blame and forget do on main (#4044)
- docs(readme): translations catch up with the English on modes, counts and blame (#4048)
- docs(registry): pages match what the readers do on main (#4046)
- docs: a guide page for deleting Amp thread history (part of #3797) (#4038) (@vaibhav8a)
- docs: a guide page for deleting Continue session history (#3797) (#4055) (@vaibhav8a)
- docs: a guide page for deleting Kiro session history (#3754) (#4037) (@vaibhav8a)
- docs: a page for deleting old sessions, with what it actually frees (#4063)
- docs: bring every page, README, translation and manifest in line with the code for the release (#4071)
- docs: bring the core pages and extension READMEs up to what main does (#4040)
- docs: cut 0.21.3 (#4050)
- docs: every extension page reads in Chinese, not only the dsh one (#4011)
- docs: the Chinese and Japanese READMEs join the other nine under docs/readme (#4009)
- docs: the README leads with the token bill, not only with hit@1 (#3998)
- docs: the README reads in twelve languages, not three (#4001)
- docs: the day-zero page leads with what it found and reads in paragraphs (#3995)
- docs: the delete page points at the wiring for the agent you use (#4065)
- docs: the delete page states the command in its description (#4061)
- docs: the nine translated READMEs move out of the repository root (#4003)
- docs: the task-cost saving is a range with its conditions, not one percentage (#3996)
- docs: the task-cost stand run again, 52,815 against 103,443 tokens (#4026)
Other
- chore: 0.21.3 carries Reasonix and the fixes since the cut (#4074)
- chore: the manifests and plugin versions say 0.21.2 (#3993)
- ci(release): identify the failed ClawHub OIDC phase (#4028) (@aniruddhaadak80)
- ci: the windows leg runs go test -count=1, a quarter of an hour instead of an hour and a half (#4057)
Install
curl -fsSL https://raw.githubusercontent.com/vshulcz/deja-vu/main/install.sh | sh
go install github.com/vshulcz/deja-vu/cmd/deja@v0.21.3
brew install deja-vu