Install
curl -fsSL https://raw.githubusercontent.com/vshulcz/deja-vu/main/install.sh | sh
go install github.com/vshulcz/deja-vu/cmd/deja@v0.18.0
brew install vshulcz/tap/deja-vu
Changelog
Features
- feat(bench): compare the gate's inputs with and without the answer present (#1513)
- feat(bench): count answer words few sessions use, not any shared word (#1509)
- feat(bench): measure whether the injected block carries the gold answer's words (#1508)
- feat(bench): say where a recalled block lost the answer's words (#1510)
- feat(hook): stop repeating the block, not the session it came from (#1497)
- feat(log): record which agent session an injection went to (#1494)
- feat(rank): fuse the two ranking views with reciprocal rank fusion (#1491)
- feat(recall): quote what the session was about and what it settled (#1492)
- feat(recall): take the answer that follows the mention (#1493)
- feat(sync): a timer that keeps a machine in step without being asked (#1433)
- feat(sync): carry the machine a memory came from (#1430)
- feat(sync): one command for every machine, and a report that shows a sync going stale (#1432)
- feat(zed): deja install zed (#1428)
- feat(zed): index what a thread did, not only what it said (#1424)
- feat(zed): record the paths the remaining file tools name (#1429)
- feat: Zed reads the shared skill, and its skill is its command (#1526)
- feat: admit a one-word question when the session keeps returning to that word (#1515)
- feat: auto-recall for omp through an extension on its context event (#1525)
- feat: carry two lines past the match in a quote, not one (#1507)
- feat: deja resume reopens qwen sessions (#1528)
- feat: quote 320 characters of a recalled line instead of 220 (#1505)
- feat: quote the line after the match, not just the matched one (#1506)
- feat: quote three lines from a session that never concludes anything (#1511)
- feat: raise the per-prompt recall budget to 1536 bytes (#1504)
- feat: read DeepSeek Harness sessions (#1518)
- feat: read Grok's spawn tree instead of treating every session as unrelated (#1532)
- feat: read omp's profile and XDG session roots, and give it a skill and a command (#1523)
- feat: wire deja into DeepSeek Harness over MCP and give it the shared skill (#1524)
Fixes
- fix(bench): apply the hook's own gates before measuring what a block carries (#1512)
- fix(digest): "вывод" as a conclusion, not as program output (#1470)
- fix(digest): a plan is not a decision (#1501)
- fix(digest): decision markers for Russian too (#1465)
- fix(digest): mirror three English decision markers in Russian (#1468)
- fix(digest): read a stated outcome as a conclusion (#1478)
- fix(hook): a word rare enough to identify something earns the memory, not a pointer (#1453)
- fix(hook): don't recall a session that only a tool mentioned the subject in (#1487)
- fix(hook): forget what a session was shown when its context is compacted (#1498)
- fix(hook): lead with the session that concluded something (#1475)
- fix(install): --auto skipped auto-recall for omp and DeepSeek Harness (#1544)
- fix(opencode): send the session id with per-prompt recall (#1495)
- fix(pi,openclaw): send the session id with per-prompt recall (#1496)
- fix(prompt): a compound name with short halves is still a name (#1484)
- fix(prompt): a hyphen inside a Russian word no longer drops it (#1459)
- fix(prompt): an imperative names nothing to recall (#1480)
- fix(prompt): keep short Russian subjects (#1462)
- fix(prompt): keep three-letter acronyms, name the words that are work (#1460)
- fix(prompt): keep two-character subjects like v3 and pr (#1472)
- fix(recall): a full stop is not part of the word before it (#1441)
- fix(recall): a term is a mention where a word begins (#1444)
- fix(recall): catch the other wordings of an empty memory (#1502)
- fix(recall): cut a shown line around the match, not from its start (#1442)
- fix(recall): do not open the block with the message being typed (#1479)
- fix(recall): do not recall the harness checks run against the tool (#1500)
- fix(recall): filter Russian filler the way English filler is filtered (#1440)
- fix(recall): ignore the scripted tool checks too (#1503)
- fix(recall): lead with the session whose first shown line concluded something (#1467)
- fix(recall): lower the idf floors to the scale a real store has (#1451)
- fix(recall): narrow a long session by the same rule the block is built with (#1443)
- fix(recall): never quote a past session saying it had no memory (#1499)
- fix(recall): one bar for the hook and the benchmark (#1438)
- fix(recall): open the block on the line that answers, not the one that echoes a word (#1458)
- fix(recall): prefer the line that concluded something (#1463)
- fix(recall): quote the line that settled it, not the densest mention (#1488)
- fix(recall): stop framing a matched answer with the top of the transcript (#1439)
- fix(recall): three fixes to which words a recall trusts (#1449)
- fix(sync): a pull no longer shares a watermark with hand-run exports (#1431)
- fix: a Claude sidechain is the subagent's own session, not a copy of its parent (#1533)
- fix: read the answer and the tool output a dsh session actually holds (#1519)
Performance
- perf(hook): do not read sessions this session already saw (#1477)
- perf(hook): drop a candidate before narrowing it, not after (#1474)
- perf(hook): lowercase a candidate's messages once, not twice (#1490)
- perf(hook): lowercase a message once per prompt, not once per term (#1473)
- perf: CLI search answers from the index instead of waiting for a rewrite (#1531)
- perf: a growing Grok session appends instead of rewriting the index (#1530)
- perf: give a single-rare-word match half the block (#1514)
Documentation
- docs: bring the release surface up to what shipped since 0.17.3 (#1537)
- docs: changelog entries for the rarity rule and the benchmark corpus (#1543)
- docs: changelog entry for the --auto install fix (#1545)
- docs: changelog for 0.18.0 (#1546)
- docs: publish the session format registry as pages search engines can read (#1434)
- docs: say what a subagent's run is, and what resume does per harness (#1540)
- docs: the registry pages counted seventeen other formats (#1541)
- docs: the roadmap pointed at four closed issues (#1542)
- docs: the site still counted seventeen harnesses (#1539)
Other
- A /deja command and auto-recall for DeepSeek Harness (#1527)
- Add omp (Oh My Pi) harness (rebased #1455) (#1520)
- Close the last resume gaps, and aider's skill cell (#1529)
- Give the prompt benchmark a corpus big enough to judge rarity (#1535)
- Measure the bar the hook actually applies, and drop the rule it ignored (#1517)
- Rarity: the rarer of the two verdicts wins (#1536)
- Revert "fix(recall): lower the idf floors to the scale a real store has" (#1452)
- bench(prompt): ask the end-to-end arm from inside the answer's own session (#1486)
- bench(prompt): run the hook itself, not a copy of its loop (#1485)
- chore: pin scoop, winget and the codex plugin to 0.17.3 (#1426)
- ci: raise the test job cap to 45m (#1427)
- refactor: share the aboutness rule between the hook and the benchmark (#1516)
- test(bench): a Russian question whose subject is three letters (#1461)
- test(bench): a passing mention must not outrank the session that decided it (#1437)
- test(bench): an English mention-before-conclusion case (#1471)
- test(bench): an arm for the session that answers and also says an ordinary word (#1454)
- test(bench): ask about another project's topic, not an invented word (#1446)
- test(bench): count the questions this project was never going to answer (#1445)
- test(bench): give the Russian fact a word the arm can look for (#1469)
- test(bench): measure recall against a scope that cannot hold the answer (#1435)
- test(bench): read the arms the report only printed (#1457)
- test(bench): score the short-subject arm through the hook (#1489)
- test(bench): the negative controls were being answered by the fixture (#1538)
- test(bench): the words a long session is made of, not its subject (#1447)
- test(hook): hold the cheap discards ahead of narrowing (#1476)
- test(hook): hold the two guards nothing was holding (#1482)
- test(hook): put the session's line where rotation can drop it (#1481)