Skip to content

v0.19.3

Latest

Choose a tag to compare

@github-actions github-actions released this 04 Sep 10:41
· 31 commits to main since this release
52c5bf3

A release about the moment memory is worth most: the turn a command fails, the
turn after a compaction, the first prompt of a session. Four harnesses were
wired for less than they can take, and the measurements that found it are in
each line.

Added

  • Codex takes recall on the prompt itself, not only at session start.
    UserPromptSubmit carries the same payload Claude sends, so hook-prompt
    reads it unchanged; measured on codex 0.149.0, the answer reached the model in
    every request with the event wired and in none without it. (#3041)
  • Codex clears what a compaction threw away, so recall can serve it again
    instead of treating it as already shown. (#3044)
  • Gemini gets the fix pair where a command fails: what an AfterTool hook
    returns is appended to the tool result, which is exactly where the repair
    belongs. Its shell tool is run_shell_command and its output arrives as
    llmContent inside a frame whose Output: marker stopped a build failure
    reading as an error — all three are handled. BeforeTool is deliberately not
    wired: it fires, and what it returns never reaches the model. (#3049)
  • Qwen takes the session digest again and the fix pair for the first time. On
    qwen-code 0.20.0 SessionStart is consumed, where an older build ignored it,
    and PostToolUse is too: measured against a stub endpoint, 0 of 2 requests
    carried a deja block before and 2 of 2 after. (#3050)
  • Cursor gets recall at the moment of the action. It maps Claude's event names
    onto its own and reads ~/.claude/settings.json, so it has been running
    deja's pre-tool, post-tool and pre-compact hooks for anyone who also has
    Claude Code and none of them for anyone who does not; its own hooks.json
    now carries the same three. (#3052)
  • A slash command for harnesses deja ships no command file into. Gemini and
    qwen both ask an MCP server for prompts/list on startup and put what comes
    back behind a slash; deja answered -32601. It now offers one command that
    runs the recall and hands back the result. (#3051)
  • opencode recalls the repair when a command fails, carries recall into a
    spawned agent, and its npm package ships the same channels the installed
    plugin has. (#3033, #3027, #3036)
  • deja sync export --include-imported hands over what arrived from other
    machines, under the names it had where the work happened, so a machine in the
    middle of a chain is no longer a dead end and a migration off it carries
    everything. Off by default; an export that holds work back now says so
    instead of reporting nothing changed. (#2962, #3053)
  • deja install hermes-auto writes a Hermes memory provider (deja-memory):
    hermes memory setup lists it beside mem0 and supermemory, and with
    memory.provider: deja-memory the model gets deja's recall before each turn
    plus deja_recall, deja_fix and deja_blame as tools. (#3035)
  • Amp (Sourcegraph) threads are indexed, from ~/.local/share/amp/threads or
    $XDG_DATA_HOME; DEJA_AMP_ROOT overrides. (#1714, #2986)
  • A transcript the client deleted stays in the index. Claude Code removes
    transcripts older than cleanupPeriodDays (30 by default), and the next
    incremental pass used to drop the session with the file. A file that is gone
    while its store is still there is now kept and stays searchable; deja forget remains the way to drop one on purpose. A store that vanishes whole
    is dropped as before, and a full deja index --rebuild still reads only what
    is on disk. (#2970)
  • The proof after deja install --auto opens with the error this machine keeps
    hitting — "this machine has hit command not found: timeout in 18 sessions"
    — above the recent-sessions list. The same rule and threshold as friction;
    nothing is claimed when nothing recurs. (#2966)
  • DEJA_TRACE=1 names where a slow search spent its time — the lock, the store
    walk, the ingest — on the path every CLI search takes, not only in the
    session-start hook. (#3021, #3054)
  • On a large store, a session is ranked by the turn that holds the fact rather
    than by the whole transcript. (#3017)
  • deja stats gives the card a way onto a social post. (#2959)
  • The DeepSeek Harness plugin carries a root manifest, so the catalogs see it
    inside the monorepo. (#2981)
  • The Claude plugin carries a plugin.json at the root the layout directories
    read, and the keywords the directory search needs. (#3011, #3005)

Changed

  • The index format moved: this release rebuilds the index once on first run.
    Arabic, Hebrew, Thai and the Indic scripts are tokenized as words rather than
    as single letters, Thai gets the bigrams the other unspaced scripts have,
    grammar-only CJK bigrams are no longer stored, and a posting's session id is
    written as a delta — measured at 5.9% to 16.1% smaller buckets/ across four
    stores.

    A read-only index directory needs its index replaced by hand. deja serves
    a directory it cannot lock without a version check, by design, so it cannot
    rebuild one in place: an index written by an earlier deja inside a read-only
    image will make deja search exit with index written by another version of deja until the directory is rebuilt somewhere writable and copied in. The
    alternative was reading old posting bytes under the new rule, which returns
    session ids that are wrong without saying so.

Fixed

  • A session start stops repeating the last one. Without changed files to match
    against, the candidate pool was three deep and a digest serves three, so
    every candidate had just been served and the novelty ordering had nothing to
    promote — and the builder sorted by recency again on the way past. Measured on
    a seeded store of 300 sessions, five consecutive starts named 3 distinct
    sessions before and 12 after, at 1 ms of a 22 ms session start. (#3048)
  • Codex fires SessionStart again with source compact after every
    compaction, which the matcher startup|resume never matched — one codex exec run compacted 12 times and the agent came out of each with nothing.
    2 of 13 requests carried a recall block before, 13 of 13 after. Install now
    rewrites the matcher on an entry it owns, so the fix reaches machines that
    already have one. (#3046)
  • Cursor's payload is read as cursor sends it: the shell tool is called Shell,
    the output arrives under tool_output as a JSON document inside a JSON
    string, and cwd is empty with the project named in workspace_roots. deja
    read none of the three, so the fix pair had no error to match and recall
    answered for whatever directory the hook was spawned in. (#3052)
  • opencode asks from the project rather than from wherever opencode was
    started, one failed call no longer costs the session its memory, and a query
    naming one of deja's own flags reaches the store. (#3028, #3024, #3014)
  • Every /deja runs a search instead of deja's first word, across the harnesses
    that ship the command. (#3020, #2988, #2958)
  • goose honours the recall kill switch, refreshes recall on every prompt rather
    than only under the wrapper, puts the session-start recall where goose reads
    it, and indexes the command it ran with what the command printed. (#2980,
    #2963, #2954, #2951)
  • OpenClaw 2026.8 keeps sessions in
    agents/<agent>/agent/openclaw-agent.sqlite; deja read only the JSONL files
    it left behind, so nothing written since the upgrade reached the index. The
    store is read now, including the sessions an earlier reset window kept.
    (#2994)
  • just, task and mise are recorded, so the pre-tool hook can speak about
    the commands a repo actually runs. (#2999)
  • The environment block stops blaming a missing tool for every wall it names.
    (#3012)
  • A duplicate DeepSeek Harness registration stands down instead of failing the
    whole profile. (#2990)
  • deja install ends the flags before the query for cline, pi and hermes too.
    (#3015)
  • doctor's subagent row names the variable as the remedy rather than as the
    cause. (#3008)
  • The release no longer takes plugin tags into goreleaser's version templates.
    (#3013)

Changelog

Features

  • feat(aider): install target and a deja aider wrapper (#396)
  • feat(assets): generate the SVG mark from the sprite, and wag the tail (#1243)
  • feat(assets): give the cat a cat's timing (#1253)
  • feat(assets): the cat breathes (#1254)
  • feat(bench): add the context readiness experiment (#168)
  • 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 the first minute after installing onto existing history (#1215)
  • 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(bench): score per-prompt recall, and lower the term floor to four (#424)
  • feat(bench): score what the block says, not what it chose (#2940)
  • feat(brand): a new mark, and every surface that carries it (#1240)
  • feat(brief): read the terminal width instead of assuming 80 (#1367)
  • feat(brief): say what the index covers instead of two zeros (#605)
  • feat(brief): show a question this store has been asked before (#590)
  • feat(cli): --json for fix and friction (#2895) (@vaibhav8a)
  • feat(cli): --json for how (#2919) (@vaibhav8a)
  • feat(cli): deja view — browse memory in one local HTML (#334)
  • feat(cline): bundle the skill in the plugin, the only channel cline has for one (#1203)
  • feat(cline): install a plugin that recalls at session start (#400)
  • feat(cline,qwen): turn tool calls and results into work records (#1237)
  • feat(codex): let recall serve again what compaction threw away (#3044)
  • feat(codex): read commands, output, files and edits from rollouts (#629)
  • feat(codex): recall the prompt itself, not just the session digest (#3041)
  • feat(codex): the listing metadata the plugin directory asks for (#1584)
  • feat(codex): the plugin brings its own recall, not just tools (#1583)
  • feat(compact): hand a compacted session back its own evidence (#588)
  • feat(completion): support PowerShell (#1803) (@jjj-n)
  • feat(copilot): turn tool calls and results into work records (#1231)
  • feat(cursor): give Cursor a skill, the one harness deja wrote nothing for (#1196)
  • feat(cursor): read files, commands and edits from Cursor transcripts (#628)
  • feat(cursor): recall at the moment of the action, not only at the start (#3052)
  • feat(doctor): --deep proves the index against the sources (#282)
  • feat(doctor): name the sessions stamped ahead of the clock (#2824)
  • feat(doctor): report the sync state in --json, not only on the screen (#1839)
  • feat(dsh): a root manifest so the catalogs see the plugin in the monorepo (#2981)
  • feat(embed): add optional semantic recall (#135)
  • feat(extensions): keep the opencode, dsh and Zed packages in this repository (#1562)
  • feat(files): which files a topic's work actually touched (#566)
  • feat(fix): answer a failing test with the file the session changed (#2914)
  • feat(fix): answer a failure with the single sighting, said as one (#2589)
  • feat(gemini): move guidance from GEMINI.md to a user skill (#1198)
  • feat(gemini): the repair arrives where the command failed (#3049)
  • feat(goose): a /deja command, and two harnesses that already had one (#1208)
  • feat(goose): add Goose CLI session history harness (#341) (@syf2211)
  • feat(grok): a Grok Build plugin, and a licence in every bundle (#1591)
  • feat(grok): give Grok Build the shared skill without taking away GROK.md (#1213)
  • feat(grok): wire auto-recall through the hooks grok actually reads (#1210)
  • feat(handoff): cursor as an exec target via cursor-agent chat (#203)
  • feat(handoff): paste mode without --to, cleaner digests, opencode TUI prompt (#202)
  • feat(handoff): source receipt and staleness warning (#214)
  • feat(handoff): start Antigravity through its CLI, as agy (#562)
  • feat(handoff): start cline, goose and kimi directly (#452)
  • feat(hermes): deja is a memory provider Hermes lists at memory setup (#3037)
  • feat(hermes): give Hermes a top-level skill, not one buried in its plugin (#1204)
  • feat(hermes): install a plugin and MCP, read the flat store layout (#389)
  • feat(hermes): resume sessions by id (#450)
  • feat(hook): say what this command broke here last time (#2941)
  • feat(hook): stop repeating the block, not the session it came from (#1497)
  • feat(hook): surface a project's accepted decisions at session start
  • feat(hooks): give a spawned agent the memory its parent has (#2143)
  • feat(hooks): rank session-start recall by files the repo is touching (#283)
  • feat(identity): worktrees of one repo resolve to one project (#286)
  • feat(index): a first build answers before it finishes (#2930)
  • feat(index): a transcript the client deleted stays searchable (#2972)
  • feat(index): ingestion health counters in the manifest and doctor (#213)
  • feat(index): read a failing test as friction, by its name (#2180)
  • feat(index): say how many lines an index run could not read (#1994)
  • feat(install): add user-level harness guidance (#127)
  • feat(install): extend user-level guidance targets (#133)
  • feat(install): give opencode, Cursor, Roo and Gemini a /deja command (#1207)
  • feat(install): open the proof with the error this machine keeps hitting (#2967)
  • feat(install): wire deja into Copilot CLI over MCP (#211)
  • feat(install): write one shared skill instead of one per harness (#1205)
  • feat(kimi): a Kimi Code plugin that recalls what the other agents wrote (#1573)
  • feat(kimi): turn tool calls and results into work records (#655) (#1221) (@AliceLJY)
  • feat(last): add --since and --role filters matching search (#207) (@syf2211)
  • feat(log): record which agent session an injection went to (#1494)
  • feat(log): record which sessions the session-start hook served (#2045)
  • feat(mark): the paws tuck in the air and spread on landing (#1259)
  • feat(mcp): a slash command for the harnesses deja ships no command file into (#3051)
  • feat(mcp): browsable sessions resource + recall offset (#289)
  • feat(mcp): move the agent manual into the skill that loads on demand (#1186)
  • feat(mcp): one tool with modes instead of six (#2934)
  • feat(mcp): recall_context says how many other sessions matched (#2894)
  • feat(mcp): trigger-phrase tool descriptions and annotations (#155)
  • feat(mcpb): add the cross-platform bundle registries take (#484)
  • feat(notes): tags and conflict surfacing for curated memory (#309)
  • feat(onboarding): build the index on install, and on a bare first run (#587)
  • feat(opencode): bring the npm package up to the installed plugin's channels (#3036)
  • feat(opencode): carry recall into a spawned agent (#2147)
  • feat(opencode): index file paths from read tool parts (#565)
  • feat(opencode): index the commands that ran and the spans patches replaced (#589)
  • feat(opencode): index the transcript before compaction (#390)
  • feat(opencode): index what commands printed, and whether they succeeded (#621)
  • feat(opencode): move guidance from an always-on block to a skill (#1197)
  • feat(opencode): recall on every prompt, not just at session start (#383)
  • feat(opencode): recall the repair when a command fails (#3033)
  • feat(opencode): toast the recall receipt, not just the build (#381)
  • feat(pi): add /deja and keep recall stats in the footer (#392)
  • feat(policy): trust scopes for what memory activates where (#284)
  • feat(privacy): add forget, ingest exclusions and redaction reports (#142)
  • feat(qwen): the digest and the repair both reach the model (#3050)
  • feat(qwen,kimi): move guidance to skills, and correct a source that named the wrong tool (#1200)
  • feat(rank): fuse the two ranking views with reciprocal rank fusion (#1491)
  • feat(recall): lead a session start with what the project has not been told (#2047)
  • feat(recall): quote what the session was about and what it settled (#1492)
  • feat(recall): reach a rephrased question's answer through the project's own words (#2484)
  • feat(recall): say when a hit is the other machine's copy of a session this one holds (#1776)
  • feat(recall): say when a session's date is later than this machine's clock (#1754)
  • feat(recall): say when the question itself was asked before (#2276)
  • feat(recall): take the answer that follows the mention (#1493)
  • feat(redact): gated entropy pass (#246)
  • feat(registry): say why a capability is missing, not just that it is (#1193)
  • feat(registry): track skills and commands in the capability matrix (#1189)
  • feat(restore): recover a span an agent replaced (#569)
  • feat(roo): install target and the CLI storage root
  • feat(roo): move guidance out of the always-on rules file into a skill (#1201)
  • feat(search): --session narrows a search to one session (#1362)
  • feat(search): CJK bigram indexing (#337) (#338)
  • feat(search): DEJA_TRACE names where a slow search spent its time (#3054)
  • feat(search): Russian conversational stopwords (#339)
  • feat(search): Russian inflection folds in relevance (#340)
  • feat(search): add confidence tiers (#160)
  • feat(search): co-occurrence rescue from the user's own corpus (#270)
  • feat(search): dev-synonym and russian suffix folds in the stem tier (#266)
  • feat(search): flag earlier attempts, show age in recall (#244)
  • feat(search): fold Traditional to Simplified so CJK recall is bidirectional (#369) (@ithiria894)
  • feat(search): fold stem forms for corpus-absent terms in relevance (#324)
  • feat(search): hand the ranking's own term weights down to the excerpt (#1267)
  • feat(search): index the inner words of compound identifiers (#265)
  • feat(search): make the reuse boost reach past dead ties
  • feat(search): name the command behind a mistyped subcommand (#616)
  • feat(search): natural queries fall through junk substring hits to relevance (#318)
  • feat(search): normalize natural language queries (#149)
  • feat(search): on a large store, rank a session by the turn that holds the fact (#3017)
  • feat(search): proximity and title signals in ranking (#268)
  • feat(search): rank a backed-out session below one that held
  • feat(search): rank a pasted log below an answer (#510)
  • feat(search): rank a session that concluded something above one that discussed it (#509)
  • feat(search): rank candidates with BM25 (#130)
  • feat(search): rank sessions by their best message (#317)
  • feat(search): rank the whole question and its rare part, and take the better (#1266)
  • feat(search): relevance tier when the exact ladder finds nothing (#298)
  • feat(search): resolve relative-time phrases into month tokens (#325)
  • feat(search): satisfying the AND is worth places, not everything (#1265)
  • feat(search): say when the files a session touched have moved since (#571)
  • feat(search): sessions agents keep recalling rank a little higher (#269)
  • feat(search): smarter relevance ranking — tf saturation, message co-occurrence, weak tail (#300)
  • feat(search): support quoted phrases and fuzzy fallback (#132)
  • feat(search): understand month names in time queries (#456)
  • feat(share): smarter selection for tool-heavy sessions (#290)
  • feat(site): CRT terminal redesign with live search demo (#235)
  • feat(site): give the home page a rhythm and somewhere to land (#1251)
  • feat(site): repaint the site in the brand's colours, and put the mark on it (#1249)
  • feat(sources): Cline harness — both store generations (#253) (#306)
  • feat(sources): Kimi Code is the twelfth harness (#250)
  • feat(sources): OpenClaw harness (#312)
  • feat(sources): Roo Code harness (#307)
  • feat(sources): add Amp thread parser (#2986) (@Tethys0)
  • feat(sources): index Hermes Agent sessions (#376)
  • feat(sources): index prime-agent sessions (#2623)
  • feat(sources): index the commands that say what happened (#561)
  • feat(sources): index the file paths tool calls name (#558)
  • feat(sources): name a session after the repository it worked in (#563)
  • feat(stats): activity-grid stats card (#199)
  • feat(stats): add interactive html timeline (#141)
  • feat(stats): draw the card in the terminal, keep the SVG for a path (#1247)
  • feat(stats): give the card a way onto a social post (#2959)
  • feat(stats): headline metrics and an embeddable card (#164)
  • feat(stats): measured impact report (#287)
  • feat(stats): say what restore could hand back, before anyone needs it (#644)
  • feat(statusline): what earlier sessions decided about the file in hand (#634)
  • feat(sync): a machine in the middle of a chain can hand over what it holds (#3053)
  • 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(usage): attribute deja vu moments to their sessions (#511)
  • feat(zed): deja install zed (#1428)
  • feat(zed): index the built-in agent's threads (#183) (#1281) (@css521)
  • 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: DEJA_AUTORECALL_LOCAL_ONLY keeps synced sessions out of auto-recall (#59)
  • feat: GitHub Copilot CLI as the eleventh harness (#204)
  • feat: Zed reads the shared skill, and its skill is its command (#1526)
  • feat: add bounded recall policy accounting (#112)
  • feat: add deja blame (#136)
  • feat: add deja doctor self-diagnosis command (#91)
  • feat: add deja friction, the errors that recur across sessions (#622)
  • feat: add durable notes via deja remember (#139)
  • feat: add qwen-code session support (#123)
  • feat: add reproducible recall benchmark (#145)
  • feat: add self-update command (#80) (@shgpavel)
  • feat: add semantic search fallback (#153)
  • feat: add session format registry (#116)
  • feat: add shareable stats card (#125)
  • feat: add shell completions (#195) (@floze-the-genius)
  • feat: admit a one-word question when the session keeps returning to that word (#1515)
  • feat: ask to record a dead end in the sentence that reports it (#1150)
  • feat: auto-recall SessionStart hook (#16)
  • feat: auto-recall for omp through an extension on its context event (#1525)
  • feat: auto-recall in every harness that can inject context (#362)
  • feat: capability matrix generated from the registry, copilot resume (#212)
  • feat: capture before compaction and re-inject after (#162)
  • feat: carry the Agent Plugins manifests at the root (#1769)
  • feat: carry two lines past the match in a quote, not one (#1507)
  • feat: close the handoff loop, honest recall metrics, parser panic guards (#208)
  • feat: credit for a recall names the session that earned it (#1148)
  • feat: deja handoff — continue a session in another agent (#201)
  • feat: deja index command, rebuild progress (#89)
  • feat: deja log — audit what was served to agents (#243)
  • feat: deja promote — curated note layer (#285)
  • feat: deja resume reopens qwen sessions (#1528)
  • feat: deja resume — reopen a found session in its native harness (#53)
  • feat: deja stats (#18)
  • feat: deja statusline — recalls served to agents, at a glance (#47)
  • feat: deja sync ssh — one-command sync between machines (#35)
  • feat: doctor --json and onboarding states (#111)
  • feat: dsh plugin, and auto-recall that actually reaches the model (#1552)
  • feat: exact-tier snippets show the strongest matches, not the first three (#1143)
  • feat: felt memory — déjà vu moments, the living brief, service receipts (#273)
  • feat: full install across all harnesses (#78)
  • feat: honor upstream config-relocation variables (#103)
  • feat: index Antigravity transcripts (#68)
  • feat: index Cursor chats and CLI transcripts (#62)
  • feat: index Gemini CLI chat history (#61)
  • feat: index Grok Build chat history (#71) (@shgpavel)
  • feat: index aider chat history (#60)
  • feat: install deja into Gemini CLI as an extension (#1725)
  • feat: install from the Claude Code and Codex marketplaces (#367)
  • feat: limit-aware handoff tip and one-time ssh sync tip (#219)
  • feat: make onboarding build memory on install (#151)
  • feat: name the memory agents keep coming back to (#638)
  • feat: name the wall the agents keep hitting on the first screen (#626)
  • feat: personal first-query greeting and the served-vs-replayed ratio (#258)
  • feat: point-of-action recall — carry the prior decision, wire hook-tool into PreToolUse
  • 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: recall narration protocol and install proof moment (#218)
  • feat: recall says what the best session concluded, not just where words matched (#1145)
  • feat: redact credentials at ingest (#14)
  • feat: relevance snippets show where the query terms meet (#1140)
  • feat: respect CLAUDE_CONFIG_DIR for read and install paths (#82) (@globalundo)
  • feat: say what makes memory arrive, at the two moments it is missed (#1277)
  • feat: security honesty in command output (#288)
  • feat: session-start auto-recall for Codex and opencode (#48)
  • feat: share and sync (#20)
  • feat: ship a CLI skill for installs without MCP (#1371)
  • feat: ship the MCP server in the plugin bundle (#394)
  • feat: show the first build as a moving bar, and in pi's footer (#384)
  • feat: size the unprompted recall to how strong the match is (#1146)
  • feat: skip subagent transcripts, never lose a torn tail line (#52)
  • feat: support authenticated embedding endpoints (#1919) (@chrisgeo)
  • feat: tell the agent what this machine is missing, before it trips (#632)
  • feat: the fix pair arrives when the command fails (#1550)
  • feat: visible recall receipt and weekly recall numbers (#205)
  • feat: widen the recall snippet window for more context (#1142)
  • feat: windows path audit, scoop and winget manifests (#114)
  • feat: wire deja into DeepSeek Harness over MCP and give it the shared skill (#1524)
  • feat: wordmark on install and first index build (#90)

Fixes

  • fix(aider): drop bytes that are not utf-8 at ingest, like every other parser (#1741)
  • fix(antigravity): tool steps are not speech, and sessions have a project (#651)
  • fix(antigravity): write the skill where antigravity reads it (#596)
  • fix(bench): apply the hook's own gates before measuring what a block carries (#1512)
  • fix(bench): give every instrument the whole firing bar (#2072)
  • fix(bench): make the context corpus able to fail (#2939)
  • fix(bench): recall says where the answer landed, not only that it came back (#2938)
  • fix(bench): score the two halves of the injection apart (#2936)
  • fix(bench): stop the cross-paired arm asking where the answer lives (#2550)
  • fix(blame): a path with a line number answers for the file (#1626)
  • fix(blame): a path with nothing said around it is not evidence (#2871)
  • fix(blame): color the human output like search results (#263)
  • fix(blame): name the file this one's history stops at (#2776)
  • fix(blame): order by how specifically a session names the file (#2849)
  • fix(blame): put a promoted note above the transcript it distils (#2832)
  • fix(blame): quote what was said about the file, not the first mention (#1330)
  • fix(blame): stop quoting deja's own output as a file's history (#2387)
  • fix(brief): a reader who turned colour off still gets the brief (#1597)
  • fix(brief): fit the wire line into a 60-column pane (#1554) (@Exberg)
  • fix(brief): keep the first screen inside a 60-column pane (#1589)
  • fix(brief): say a store was locked instead of no agent ran here (#1980)
  • fix(brief): shorten a wide project before the title floor absorbs it (#1593)
  • fix(brief): show a project name the same way at every terminal width (#1845)
  • fix(brief): suggest a phrase someone would actually type (#594)
  • fix(brief): the first screen named sessions the policy withholds (#1351)
  • fix(cjk): repeat questions, superseded and related notes were off in CJK (#1349)
  • fix(cli): give advice that leads somewhere on an empty store (#598)
  • fix(cli): openclaw install detection and resume guidance (#320)
  • fix(cli): say what to change when the index cannot be written (#602)
  • fix(cli): the rest of the printed commands quote what they hand over (#2797)
  • fix(cli): with no home directory, write nothing where deja happens to run (#2782)
  • fix(codex): adopt an existing hook entry instead of leaving it stale (#385)
  • fix(codex): do not panic on a tool result without a call_id (#631)
  • fix(codex): doctor called a working hook untrusted, and an unrunnable one wired (#1262)
  • fix(codex): duplicate turns with wrong roles; two documented flags that did nothing (#652)
  • fix(codex): the digest comes back after a compaction (#3046)
  • fix(codex): thread identity and injected preamble (#639)
  • fix(compact): strip control bytes from the evidence block (#2001)
  • fix(completion): complete --json and --from for deja last (#2148)
  • fix(completion): give deja show its own flag completions (#2021) (@vaibhav8a)
  • fix(completion): offer --all-matches for deja forget (#2027) (@vaibhav8a)
  • fix(completion): offer --tag for deja remember (#2028) (@vaibhav8a)
  • fix(completion): offer every harness, not the eleven of a year ago (#1368)
  • fix(completion): offer every role deja accepts, not the three it once had (#1659)
  • fix(completion): offer the commands that shipped without one (#599)
  • fix(completion): the bash function survives a shell with set -u (#1657)
  • fix(ctx): an id-prefix answer says when the decision was taken back (#1644)
  • fix(ctx): open the session a short id-prefix names instead of denying it exists (#1615)
  • fix(ctx): the digest skipped the exchange that answered the query (#1323)
  • fix(cursor): resolve the Windows IDE root through %APPDATA% (#1239) (@Sora-bluesky)
  • fix(digest): "вывод" as a conclusion, not as program output (#1470)
  • fix(digest): a code fence must not take the slot from the conclusion (#2913)
  • fix(digest): a conclusion cut to fit could arrive meaning the opposite (#1337)
  • fix(digest): a plan is not a decision (#1501)
  • fix(digest): a sentence that starts with a number is not a numbered dump (#2918)
  • fix(digest): a sentence with no stopword is not a listing dump (#2916)
  • fix(digest): a session written in Chinese, Japanese or Korean digested to nothing (#1341)
  • fix(digest): decision markers for Russian too (#1465)
  • fix(digest): mark an overlong conclusion instead of dropping it (#2922)
  • fix(digest): mirror three English decision markers in Russian (#1468)
  • fix(digest): quote the sentence that concludes, not only the opening (#2906)
  • fix(digest): read a stated outcome as a conclusion (#1478)
  • fix(digest): read the English shapes of a decision (#2907)
  • fix(digest): share and the handover tail said nothing when they cut (#1339)
  • fix(docs): dsh refuses plugin add without --profile (#1846)
  • fix(docs): the harness count said seventeen in five of the seven places it appears (#1290)
  • fix(doctor): count a machine's sessions whichever case it spells its name in (#1877)
  • fix(doctor): emit the stale_stores the JSON schema documents, and name the real policy file (#1711)
  • fix(doctor): find the MCP server whatever it was named (#433)
  • fix(doctor): have --deep say what it compared instead of promising no memory was lost (#1713)
  • fix(doctor): hook wiring check matched only bare commands (#291)
  • fix(doctor): learn what a peer calls itself, so its sessions are counted (#1888)
  • fix(doctor): line the Sync column up by what the terminal draws (#1822)
  • fix(doctor): name the transcript it may not open instead of blaming the harness format (#1749)
  • fix(doctor): name the zed, deepseek and omp stores it reads from (#1739)
  • fix(doctor): report the codex hook as untrusted when its hash no longer matches (#428)
  • fix(doctor): reported embedding coverage search would not use (#1360)
  • fix(doctor): say what the store said when it refused (#2626)
  • fix(doctor): say when a peer's stamp is ahead of this machine's clock (#1856)
  • fix(doctor): say when the peers file cannot be read instead of reporting no machines (#1841)
  • fix(doctor): say which codex hook events an older install lacks (#2565)
  • fix(doctor): say which hook events an older install lacks (#2553)
  • fix(doctor): stop --deep reporting drift on a healthy index (#613)
  • fix(doctor): stop reporting deliberate skips as files it could not read (#2345)
  • fix(doctor): tell a corrupt sidecar apart from no sidecar (#1961)
  • fix(doctor): the subagent row names the variable as the remedy, not the cause (#3008)
  • fix(doctor): two rows under "Hooks" were not hooks (#1275)
  • fix(doctor): warn when index is stale relative to source stores (#194) (@syf2211)
  • fix(dsh): /deja searches for a word instead of running the command it names (#2988)
  • fix(dsh): a duplicate registration stands down instead of failing the profile (#2990)
  • fix(embed): let a caller say there is no endpoint (#2932)
  • fix(embed): let the localhost probe be switched off (#2937)
  • fix(embed): refuse a vector sidecar built for an earlier index (#1356)
  • fix(extensions): carry the licence into the Zed extension directory (#1565)
  • fix(extensions): one rule for what a package adds next to deja install (#1570)
  • fix(extensions): stop recalling twice when both installs are present (#1567)
  • fix(files): a path synced from Windows was never trimmed (#1315)
  • fix(files): distinguish a filtered file from a file that was never recorded (#665)
  • fix(files): refuse a flag with no value, an unknown flag and an empty topic (#1629)
  • fix(files,restore): say the index is building instead of hanging silently (#617)
  • fix(fix): take an error line that starts with a dash (#2806)
  • fix(fix,how): keep a transcript from forging a row of the listing (#1864)
  • fix(forget): make --dry-run tell the truth about what it did and would do (#610)
  • fix(forget): say a deleted transcript is gone from this machine, not that it came from another (#1756)
  • fix(forget): take the id an imported session came with (#2846)
  • fix(friction): count the withheld sessions it would have reported (#2814)
  • fix(friction): one error stays one wall when pytest or a log stamps the line (#1638)
  • fix(friction): sanitise the recorded error line before printing it (#2910)
  • fix(friction): the trust note counts the sessions it hid, not their error lines (#1640)
  • fix(gemini): hook SessionStart so the receipt is visible (#382)
  • fix(goose): /deja takes a query (#2958)
  • fix(goose): honour GOOSE_PATH_ROOT and keep subagent runs out of recall (#410)
  • fix(goose): honour the recall kill switch (#2980)
  • fix(goose): index every way a person reaches goose (#2875)
  • fix(goose): index the command it ran and what the command printed (#2951)
  • fix(goose): keep a session unless goose wrote it for itself (#2908)
  • fix(goose): put the session-start recall where goose reads it (#2954)
  • fix(goose): refresh the recall on every prompt, not only under the wrapper (#2963)
  • fix(greeting): count in singular when there is one of something (#1599)
  • fix(grok): index the run, not just the talk (#1361)
  • fix(handoff): an empty --to is refused, not read as no target at all (#1648)
  • fix(handoff): mark where the quoted session starts and ends (#2891)
  • fix(handoff): sanitise the digest --exec hands to the next agent (#2867)
  • fix(handoff): say where deja stops speaking and the session starts (#2869)
  • fix(handoff,resume): correct commands verified against real installed CLIs (#222)
  • fix(harness): every /deja runs a search, not deja's first word (#3020)
  • fix(help): a hook command is documented or deliberately hidden, not skipped wholesale (#1655)
  • fix(help): fit the usage page to the terminal reading it (#2771)
  • fix(help): wrap the install target list to the terminal, not to a fixed 76 columns (#1662)
  • 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): forty copies of one complaint must not take the block (#2904)
  • fix(hook): keep salvage off the command, and heredocs out of fix pairs (#2817)
  • fix(hook): keep the projects a cached digest was built from (#2890)
  • fix(hook): lead with the session that concluded something (#1475)
  • fix(hook): project-scoped IDF ranking instead of query reconstruction (#221)
  • fix(hook): session-start must never index synchronously (#315)
  • fix(hook): stop one repository's error being told as a fact about the machine (#2580)
  • fix(hook): the environment block stops blaming a missing tool for every wall (#3012)
  • fix(hook): the lead says the match is on wording, not that it answers you (#2917)
  • fix(hook): the per-prompt recall stopped looking before it found anything (#1274)
  • fix(hooks): calibrate deja vu triggering (#293)
  • fix(hooks): close a truncated dedup line before appending (#1968)
  • fix(hooks): codex session-start hang + trust visibility (#294)
  • fix(hooks): deja vu needs real overlap and a human topic (#292)
  • fix(hooks): let auto-recall fire for CJK prompts (#370) (@ithiria894)
  • fix(hooks): recall the fix for an error even when the tool log runs past 1 MiB (#1718)
  • fix(hooks): say when the receiver was lost with an unreadable payload (#2769)
  • fix(hooks): stop the file-ranking test from depending on a 400 ms git budget (#520)
  • fix(hooks): the deja-vu hook says when it could not read the payload (#2791)
  • fix(hooks): the receipt counts what the statusline counts (#2770)
  • fix(how): count the hidden sessions that match the question, not the store (#2792)
  • fix(how): count the sessions the policy hid, not their commands (#2765)
  • fix(how): match the command as a word, and refuse a flag that does nothing (#1631)
  • fix(how,files): say when the list was cut at the limit (#1633)
  • fix(id): an id pasted in the other case opens the session it names (#1621)
  • fix(index): Ensure honors its harness scope (#319)
  • fix(index): Thai gets the bigrams the other unspaced scripts have (#2905)
  • fix(index): a command that failed is not a fix (#2172)
  • fix(index): a question in Chinese never counted as asked before (#1347)
  • fix(index): a rewritten records file kept the old generation (#1358)
  • fix(index): an id a session was synced under resolved to nothing (#1316)
  • fix(index): an incremental update deleted the mined sidecars (#1296)
  • fix(index): an incremental update wrote credentials into the mined pairs (#1300)
  • fix(index): bound a bucket's posting block by the file size (#432)
  • fix(index): clear the evicted-files counter per build, and catch the next one (#1862)
  • fix(index): count the empty transcripts of the last build, not of the process (#1851)
  • fix(index): crash-harden in-place writes (#181) (#206)
  • fix(index): do not append onto a rewritten prefix (#454)
  • fix(index): follow a store directory that is a symlink instead of calling it empty (#1745)
  • fix(index): hook-tool never saw a command that became a habit after the last full build (#1299)
  • fix(index): incremental updates never learned a new fix pair (#1297)
  • fix(index): keep the commands that repair a build, not only the ones that fail (#1636)
  • fix(index): keep untouched cursor sessions on incremental update (#177)
  • fix(index): let every kind with an offset parser append (#2872)
  • fix(index): missing bucket shard is no-postings, not an error (#323)
  • fix(index): pluralise file and message counts on the incremental line (#1585) (@SAY-5)
  • fix(index): re-indexing one transcript no longer erases another sharing its id (#699)
  • fix(index): re-read the stores that needed a CLI once that CLI is installed (#1761)
  • fix(index): read paths no longer wait out a rebuild (#380)
  • fix(index): read the exit marker as the suffix it is written as (#2822)
  • fix(index): reading something is not fixing it (#2174)
  • fix(index): record the files a session really worked on (#2706)
  • fix(index): reject corrupt record length prefixes instead of allocating gigabytes (#180)
  • fix(index): report build phases on the path that builds the first index (#517)
  • fix(index): resolve a shared session id the same way every time (#1998)
  • fix(index): say a format change is one, and say what it costs read-only (#2943)
  • fix(index): say a store went away instead of greeting the reader as new (#1764)
  • fix(index): say when only half a store could be read, in the run and in doctor --json (#1759)
  • fix(index): serve a read-only index instead of refusing (#472)
  • fix(index): serve speech before tool records in the per-session bound (#568)
  • fix(index): stamp every database-backed store, not three of six (#2802)
  • fix(index): stop deja fix's own output counting as a fresh error (#2169)
  • fix(index): stop indexing deja's own recall blocks (#488)
  • fix(index): stop indexing harness plumbing as if a person said it (#555)
  • fix(index): stop mining remedies that point at a scratch file (#2903)
  • fix(index): tell a run that waited for another build where the index stands (#1752)
  • fix(index): the one sidecar write that overwrites a good file was not atomic (#1302)
  • fix(index): touched files stopped meaning worked-on-most after a batch (#1334)
  • fix(index): treat a lost buckets directory as an index to rebuild (#601)
  • fix(index): wait out a rename another pass is holding open (#2836)
  • fix(index): withhold a fix the error outlived, however much later (#2166)
  • fix(install): --auto skipped auto-recall for omp and DeepSeek Harness (#1544)
  • fix(install): a comment in a config is not a refusal (#2739)
  • fix(install): adopt an existing deja hook instead of adding a second (#373)
  • fix(install): ask every Roo host before writing the first one (#2755)
  • fix(install): call a mistyped flag a flag, whether or not a target came with it (#1681)
  • fix(install): check every config a target touches before writing any (#2748)
  • fix(install): cline, pi and hermes end the flags before the query too (#3015)
  • fix(install): end deja's kimi hook block at the next comment, not the next table (#1700)
  • fix(install): gemini hooks live in an extension, not settings.json (#378)
  • fix(install): give back the openclaw switch on the parsed path too (#2845)
  • fix(install): ignore a relative XDG_CONFIG_HOME, as the spec requires (#1694)
  • fix(install): name the config a permission error stopped, not deja's scratch file (#1687)
  • fix(install): name what was probably meant on an unknown target (#612)
  • fix(install): opencode reads its config by content, and an inline block is opened (#2778)
  • fix(install): recall against the prompt in four more harnesses, and stop the wiring breaking itself (#1227)
  • fix(install): refuse a config deja cannot read instead of writing over it (#2753)
  • fix(install): refuse a cordis.patch.yml where one of deja's markers is missing (#1702)
  • fix(install): refuse a goose extensions: list rather than writing a mapping into it (#1698)
  • fix(install): refuse a guidance file whose block deja cannot bound, and repair a duplicated one (#1706)
  • fix(install): refuse when deja cannot find a home directory, instead of wiring the working directory (#1691)
  • fix(install): say the entry is off whichever way the host spells it (#2758)
  • fix(install): say when it replaced a skill file it has no record of writing (#1704)
  • fix(install): settings.json keeps the shape it was found in (#2737)
  • fix(install): spawn the MCP server through cmd on windows (#170)
  • fix(install): stop blaming file permissions for a config deja could not parse (#1666)
  • fix(install): stop replacing a skill someone has edited (#1285)
  • fix(install): stop writing a stray comma into an opencode.jsonc that uses trailing commas (#1696)
  • fix(install): take a commented config for copilot and openclaw (#2810)
  • fix(install): take a commented config for openclaw-auto too (#2825)
  • fix(install): the JSONC path decides like the parsed one (#2743)
  • fix(install): the PATH offer was behind a condition curl | sh can never meet (#1852)
  • fix(install): the switch writer edits only what it can read (#2747)
  • fix(install): the text writer writes the entry its caller would have written (#2780)
  • fix(install): update the entry that already runs deja instead of adding a second (#2648) (@Sora-bluesky)
  • fix(install): write a config back with the line endings it already had (#1669)
  • fix(json): a stemmed answer reports the stemmed tier, not close (#1617)
  • fix(json): drop a timestamp that was never set instead of writing year 1 (#1875)
  • fix(kimi): hook UserPromptSubmit and read prompts sent as parts (#388)
  • fix(last): a bare argument that is not a count is refused, not ignored (#1619)
  • fix(lifecycle): a promote note is clipped like every other line on the screen (#1646)
  • fix(log): answer --last --json in JSON when there is no digest (#1976)
  • fix(log): stop calling an injection that sent bytes an empty result (#1955)
  • fix(magic): ranked recalls, dedupe, pre-written citation, attribution metric (#220)
  • fix(mark): drop the lean, give it a hop instead (#1258)
  • fix(mark): squash and stretch, not a sliding slab (#1257)
  • fix(mark): the blink was sliding the eyes down the face (#1255)
  • fix(mark): the cat was hovering, not breathing (#1256)
  • fix(mcp): accept numeric arguments sent as strings (#423)
  • fix(mcp): an emptied store is a removal, not a first run (#2882)
  • fix(mcp): answer from the index while a refresh runs instead of sending the agent away (#1734)
  • fix(mcp): answer ping instead of method-not-found, so a host keepalive does not read the server as dead (#1722)
  • fix(mcp): blame says why it found nothing on an empty store (#2863)
  • fix(mcp): decide remember's index refresh with one lock attempt instead of a check and a wait (#1805)
  • fix(mcp): exit when the parent is gone and nobody has spoken for five minutes (#2649) (@Sora-bluesky)
  • fix(mcp): frame the command fix hands an agent (#2847)
  • fix(mcp): frame the commands how hands an agent (#2844)
  • fix(mcp): hold recall_context to the ~8KB it promises, and say when a digest is cut (#1798)
  • fix(mcp): how and fix reach the journal, without moving the stats ratios (#2892)
  • fix(mcp): how and fix say the store is empty rather than reporting an absence (#2865)
  • fix(mcp): how filtered by the CLI's trust policy, not the agent's (#1310)
  • fix(mcp): journal a remembered note even when the index is busy (#2855)
  • fix(mcp): journal what how and fix hand the agent (#2868)
  • fix(mcp): keep the offset line on a full recall page, so the rest of the matches stay reachable (#1727)
  • fix(mcp): let blame answer from the snapshot while a rebuild runs (#1785)
  • fix(mcp): mark the excerpt the recall page budget cut, like every other cut line (#1800)
  • fix(mcp): name the phase while a build starts instead of an empty parenthesis (#1732)
  • fix(mcp): recall_context opens the session an id names (#1623)
  • fix(mcp): recall_context says what a relevance session is, in a sentence (#2793)
  • fix(mcp): refuse a batch as an invalid request instead of claiming it did not parse (#1796)
  • fix(mcp): refuse a resource uri with no session id instead of serving whichever came first (#1730)
  • fix(mcp): say no session is about it when nothing matched (#2076)
  • fix(mcp): say the store is empty instead of blaming the query (#2862)
  • fix(mcp): stop blame from sending the whole transcript to the agent (#611)
  • fix(mcp): take the environment block out of recall's budget instead of adding it on top (#1807)
  • fix(mcp): tell an agent the session it was handed was forgotten (#2775)
  • fix(mcp): tell an agent which argument was wrong instead of handing back the JSON decoder's text (#1724)
  • fix(mcp): tell an unheld subject from a rephrased question (#2920)
  • fix(mcp): the how tool prints the CLI's answer instead of its own copy (#2767)
  • fix(mcp): the line above a relevance answer says what follows it (#2786)
  • fix(mcp): the server took the blocking index lock it had just avoided (#1305)
  • fix(mcpb): make the registry bundle's entry point a real server (#487)
  • fix(nfcfold): fold Arabic hamza and madda (#1914)
  • fix(nfcfold): fold letters that carry two marks (#1873)
  • fix(nfcfold): fold the three Greek marks written on a spacing diaeresis (#1895)
  • fix(notes): a hand-written project must not put a path in the session id (#2909)
  • fix(notes): count a note deja cannot read (#2006)
  • fix(npm): the dsh package page rendered in Chinese (#1837)
  • fix(openclaw): read the per-agent SQLite store the 2026.8 flip made canonical (#2995)
  • fix(opencode): a query that names one of deja's flags reaches the store (#3014)
  • fix(opencode): a spawned agent gets its memory, not a quoted string (#3027)
  • fix(opencode): one failed call no longer costs the session its memory (#3024)
  • fix(opencode): send the session id with per-prompt recall (#1495)
  • fix(opencode): the plugin asks from the project, not from wherever opencode started (#3028)
  • fix(output): stop counting one thing in the plural (#603)
  • fix(packaging): pin the winget version manifest too (#523)
  • fix(packaging): pin windows manifests to 0.17.0 (#1169)
  • fix(packaging): re-pin windows manifests to 0.16.9 (#1135)
  • fix(peers): keep the peer list nowhere rather than in the working directory (#2809)
  • fix(peers): stop two syncs at once from losing machines (#1884)
  • fix(peers): treat a host name the way ssh does, case and all (#1868)
  • fix(pi): keep the session header when a parse resumes past it (#2901)
  • fix(pi,openclaw): send the session id with per-prompt recall (#1496)
  • fix(plugin): ship the skill in the Claude bundle the docs already promised (#1190)
  • fix(policy): a trust policy is read from a home directory or from nowhere (#2788)
  • fix(policy): honour the ignore rule on every surface, not just deja search (#2323)
  • fix(policy): read an ignore rule against a Windows path too (#2856)
  • fix(privacy): atomic tombstone writes (#209)
  • fix(privacy): keep a second copy of tombstones beside the index (#442)
  • fix(privacy): recall kill switch and policy bind every path (#347)
  • 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(qwen): hook UserPromptSubmit with a millisecond timeout (#386)
  • fix(rank): score by sessions, gate by the rarer verdict (#1548)
  • fix(recall): Chinese sessions were skipped as having nothing to say (#1343)
  • fix(recall): a full stop is not part of the word before it (#1441)
  • fix(recall): a session start stops repeating the last one (#3048)
  • fix(recall): a term is a mention where a word begins (#1444)
  • fix(recall): answer from long and recent sessions (#438)
  • fix(recall): ask the store whether a word identifies, not just its shape (#2532)
  • fix(recall): carry the injection cooldown across agent sessions (#2041)
  • 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): let a repository root find the work done inside it (#2878)
  • fix(recall): lower the idf floors to the scale a real store has (#1451)
  • fix(recall): name the forgotten source of an imported note too (#2841)
  • 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): return the decision, not just the question (#491)
  • fix(recall): stop Japanese grammar bigrams from triggering auto-recall (#2262) (@Sora-bluesky)
  • fix(recall): stop a subject the store never saw from carrying a match (#2528)
  • fix(recall): stop framing a matched answer with the top of the transcript (#1439)
  • fix(recall): stop one rare word deciding which session answers (#2328)
  • fix(recall): stop two sessions saying one thing from taking both slots (#2527)
  • fix(recall): tell the user once per session, and quote the line that matched (#1228)
  • fix(recall): the session-start block opened with "let me look at that" (#1282)
  • fix(recall): three fixes to which words a recall trusts (#1449)
  • fix(redact): a filesystem path is not a secret whatever its case (#1233)
  • fix(redact): redact a secret whose json arrived with its quotes escaped (#1766)
  • fix(redact): remove a secret named in prose and quoted (#658)
  • fix(redact): stop xai- pattern matching kebab-case prose (#156) (@Sora-bluesky)
  • fix(redact): strip credentials from uppercase _KEY env assignments (#1958)
  • fix(registry): the MCP registry description was six characters too long (#1271)
  • fix(release): keep plugin tags out of goreleaser's version templates (#3013)
  • fix(release): ship the Gemini manifest in the archive (#1935)
  • fix(remember): bound and de-escape the project name the confirmation echoes back (#1793)
  • fix(remember): clean and bound a tag where it is written, and where it is echoed (#1811)
  • fix(remember): keep checking for duplicates past an oversized note (#1813)
  • fix(remember): keep one copy of a note instead of charging every later recall for the same fact (#1737)
  • fix(remember): quote the id in the tombstone hint the way a shell pastes it (#2763)
  • fix(roo): say why nothing was wired instead of "unchanged roo" (#609)
  • fix(roo): stop cline claiming roo task files
  • fix(search): --since refuses a window that is not positive (#1611)
  • fix(search): CJK questions reach the relevance tier (#345)
  • fix(search): a combining mark continues the word it sits on (#2883)
  • fix(search): a filter flag given an empty value is a mistake, not a wildcard (#1613)
  • fix(search): a long message hid the phrase that answered the query (#1319)
  • fix(search): a one-word query scores on the word, not on the punctuation around it (#1604)
  • fix(search): a project is its path segments, not any name containing it (#1276)
  • fix(search): a regex match with no width is not a match (#1607)
  • fix(search): a rerank puts a promoted note back above its own source (#2800)
  • fix(search): apply scope before truncation, keep session Ords unique (#348)
  • fix(search): bound the freshness decay (#2881)
  • fix(search): ctx and the prompt digest dated sessions in UTC, not the reader's zone (#1314)
  • fix(search): don't label an exact token match as a variant (#193)
  • fix(search): hang the relevance ranking under a thin AND (#1226)
  • fix(search): keep an agent's own scratch sessions out of recall (#2054)
  • fix(search): length normalisation did nothing for Chinese sessions (#1345)
  • fix(search): lift a note that arrived by sync (#2835)
  • fix(search): measure the tightest window, not the span between first mentions (#1268)
  • fix(search): multi-token terms match all sub-tokens, not the first (#313)
  • fix(search): name the user's pattern in an invalid --re error
  • fix(search): one date form per list, so the column reads vertically (#1232)
  • fix(search): one decisive word is a match, not a weak one (#1261)
  • fix(search): project scoping matched only one separator, and windows uses the other (#1287)
  • fix(search): put a note above its source in every tier (#2826)
  • fix(search): quote context messages per-term, never return a bare header (#158) (@Sora-bluesky)
  • fix(search): rank by how long the session is, not how much of it matched (#1155)
  • fix(search): reach a word's marked forms by lookup, not by walking every marked token (#2896)
  • fix(search): recover natural-language queries the AND used to kill (#245)
  • fix(search): refuse a bad --re pattern in deja's own voice (#2764)
  • fix(search): relevance results no longer render "0 matches" (#352)
  • fix(search): report the pool the relevance window was taken from (#554) (@AliceLJY)
  • fix(search): run the co-occurrence rescue when the words never appear together (#1787)
  • fix(search): score a cross-script CJK hit on the text that matched it (#2157)
  • fix(search): score fuzzy/stem hits and keep stop words out of retrieval (#179)
  • fix(search): show the message that earned the rank, not the wordiest one (#1264)
  • fix(search): stop matching the transcript's record of a deja call (#2068)
  • fix(search): stop telling a reader who typed --all to add --all (#1609)
  • fix(search): the excerpt slid off the match in text that lowercases shorter (#1332)
  • fix(search): the excerpt was cut around the first word, not the answer (#1328)
  • fix(search): the first excerpt showed repetition, not the answer (#1326)
  • fix(search): the neighbour rescue reads a sentence (#2929)
  • fix(search): the relevance tier served records exact search hides (#1263)
  • fix(search): the snippet path did not know what a listing is (#2925)
  • fix(search): total order on relevance ties; deterministic test (#302)
  • fix(search): treat Traditional and Cantonese function words as grammar (#368) (@ithiria894)
  • fix(share): count secrets redacted at index time too (#444)
  • fix(show): say when a prefix matched more than one session (#600)
  • fix(show): tell the two halves of the repeated hour apart (#1789)
  • fix(site): the phone layout, which I had never actually looked at (#1250)
  • fix(sources): a project is spelled the same on every platform (#1289)
  • fix(sources): include goose ACP sessions in the type allowlist (#2874) (@jelloeater-agent)
  • fix(sources): keep MCP tool results that arrive as content blocks (#959) (@DevMello)
  • fix(sources): label tool output as tool output, not as the user (#560)
  • fix(sources): list the four harnesses it had fallen behind on (#615)
  • fix(sources): parse Gemini CLI $set message snapshots (#316)
  • fix(sources): read a WAL store that nobody has open (#2702)
  • fix(sources): record just, task and mise so the pre-tool hook can speak about them (#2999)
  • fix(sources): report the files deja reads, not the tree around them (#1363)
  • fix(sources): resolve Claude project dirs encoded with a Windows drive letter (#217) (@tiendungdev)
  • fix(sources): stop reporting a failed query as an empty store (#474)
  • fix(stats): an empty top_projects is [] like its sibling, not null (#1650)
  • fix(stats): count the withheld sessions its filters would have shown (#2819)
  • fix(stats): keep the card's name honest, and cover log and view (#470)
  • fix(stats): replace an extension the card cannot honour instead of appending
  • fix(stats): say which window the impact numbers cover (#1890)
  • fix(stats): the card was printing a line out of the reader's own history (#1252)
  • fix(stats): the impact screen reads at one recall (#1653)
  • fix(statusline): let the filename give way so the memory half fits the bar (#1881)
  • fix(statusline): the quiet-day line counts one recall as one (#1601)
  • fix(statusline): use the count form on a bar too narrow for the title (#1904)
  • fix(suggest): the first-run phrase came from withheld sessions (#1353)
  • fix(sync): a bad import path came back as a raw syscall error on windows (#1288)
  • fix(sync): a pull no longer shares a watermark with hand-run exports (#1431)
  • fix(sync): acknowledged-delivery watermarks for ssh push (#215)
  • fix(sync): bound and de-escape peer names on the screens that report them (#1809)
  • fix(sync): bound the batch file name an import error reports (#1848)
  • fix(sync): bound the peer's output where the failure is turned into an error (#1820)
  • fix(sync): bound the ssh capture's error like the rest of the sync path (#1834)
  • fix(sync): give ssh a connect timeout so a sleeping machine costs seconds, not minutes (#1773)
  • fix(sync): index imported records the way ingestion does (#1223) (@Sora-bluesky)
  • fix(sync): one machine, one watermark, whichever case the name was typed in (#1879)
  • fix(sync): sanitise the directory in every sentence that names it (#1858)
  • fix(sync): send the export in batches scp can accept (#2629)
  • fix(sync): six defects in cross-machine sync (#346)
  • fix(sync): stop calling a push with nothing to send an exchange (#1781)
  • fix(sync): treat one machine named twice as one machine (#1854)
  • fix(sync): unstamped messages could never reach a peer (#349)
  • fix(termwidth): count the wide emoji blocks the table stopped short of (#1595)
  • fix(termwidth): measure a name the same however it was typed (#1825)
  • fix(uninstall): take a server's sub-tables with its block (#2717)
  • fix(uninstall): take the shared skill file with the last harness that read it (#1685)
  • fix(update): clear staging files an interrupted run left behind (#1364)
  • fix(usage): ask the snapshots file the same question as the log (#1947)
  • fix(usage): close a truncated line before appending the next event (#1902)
  • fix(usage): close a truncated snapshot line before appending (#1966)
  • fix(usage): count a blame and a resource read on both screens (#1908)
  • fix(usage): count an injection that carried no project session (#1963)
  • fix(usage): keep the injection log under its rotation threshold (#1970)
  • fix(usage): one rule for what counts as an event in the log (#1918)
  • fix(usage): one week for every counter that shows one (#1921)
  • fix(usage): record where a session-start digest went (#1950)
  • fix(usage): rotation keeps the newest events rather than emptying the log (#1923)
  • fix(view): name the redaction floor when the page holds a masked secret (#857)
  • fix(view): redact the page it writes instead of trusting what the index kept (#1770)
  • fix(zed): one server id for the extension and the installer (#1571)
  • fix(zed): read a cut-short sqlite3 answer as the rows it delivered (#1568)
  • fix: Describe skips policy keys deja never consults (#942)
  • fix: MCP recall robustness and index write durability (#223)
  • fix: OS-independent exclude match; defer two unix-fixture tests on windows
  • fix: a Claude sidechain is the subagent's own session, not a copy of its parent (#1533)
  • fix: a greeting does not name the session (#1383)
  • fix: a hook running during a rebuild no longer decides there is no index (#1390)
  • fix: a list marker needs a space after it (#2745)
  • fix: a listing emptied by the trust policy is not an unindexed store (#950)
  • fix: a misspelled search flag is an error, not part of the query (#756)
  • fix: a promoted note serves its latest correction first (#813)
  • fix: a recall payload does not pay twice for one answer (#1394)
  • fix: a rejected attempt ranks below the decision that replaced it (#685)
  • fix: a session that grows updates what is derived from its text (#1381)
  • fix: accept a session id the way it is pasted (#922)
  • fix: agent tools say when the index is being rebuilt, instead of rebuilding inline (#1377)
  • fix: align daily recall counts with weekly usage (#1569) (@mikemikimike)
  • fix: an ambiguous elided id is refused, not silently doubled (#860)
  • fix: an empty id prefix resolves to nothing, in both lookups (#1774)
  • fix: an empty postings directory counts as damage (#947)
  • fix: an empty result names the states the user created (#687)
  • fix: an excerpt near the end of a message spends its whole window (#1396)
  • fix: an unplugged index disk is not a permissions problem (#932)
  • fix: anchor the context digest on the query's identifying words (#2729)
  • fix: apply the exclude list where data leaves the machine (#1376)
  • fix: at equal rank the local session comes before an imported one (#712)
  • fix: blame and forget report the state the tool is in (#650)
  • fix: blame keeps a session that both mentions and edits the file (#724)
  • fix: blame sees the sessions that edited the file, not only those that named it (#689)
  • fix: bound a title the source authored like a derived one (#1406)
  • fix: bound the covering line by when the oldest work began (#787)
  • fix: bound the status line in columns, not runes (#1398)
  • fix: budget hits, files and restore against the terminal width (#1386)
  • fix: budget the brief title in columns, not runes (#1401)
  • fix: check for the swap before the open, not after (#1378)
  • fix: codex install honours CODEX_HOME instead of a raw ~/.codex (#850) (#1017) (@ousamabenyounes)
  • fix: count a promoted note that has no source session (#815)
  • fix: count a wall's length in characters, not bytes (#1395)
  • fix: count the same-fact floor in characters, not bytes (#1402)
  • fix: ctx rejects flags instead of searching for them (#722)
  • fix: ctx says when an elided id reached more than one session (#924)
  • fix: cut agent-facing text on rune boundaries (#1391)
  • fix: cut the answer line on a character, not on the byte cap (#1410)
  • fix: date note buckets in the reader's zone (#912)
  • fix: dedup search-path builds, safe forget ordering, unbounded aider reader (#175)
  • fix: default message time to session start when the harness omits per-message timestamps (#65)
  • fix: defer to the package manager that owns the binary in update (#776)
  • fix: deja help names search (#754)
  • fix: deja last and the first screen keep their order when timestamps tie (#714)
  • fix: derive a title for imported sessions (#671)
  • fix: deterministic tie-break in the greeting suggestion (#264)
  • fix: do not print a negative age on the handoff receipt (#1404)
  • fix: do not recall a bullet of a document as a session's decision (#2741)
  • fix: doctor calls an unplugged store unplugged (#934)
  • fix: doctor counts the transcripts it cannot place (#702)
  • fix: doctor lists git alongside sqlite3 (#797)
  • fix: doctor names a permission problem instead of blaming the store (#803)
  • fix: doctor names the missing sqlite3 CLI instead of blaming the store (#793)
  • fix: doctor reports a damaged index instead of calling it up to date (#736)
  • fix: doctor reports the policy in force, not the file on disk (#940)
  • fix: doctor says when a zone change regrouped the note days (#936)
  • fix: document the six flags deja help was missing (#758)
  • fix: dumb terminals, and a read-only cache that stopped answering (#905)
  • fix: embed and promote honour the trust policy (#1127)
  • fix: embed only what every trust activation allows (#1372)
  • fix: excerpt the part of a message that discusses the term (#1387)
  • fix: files names the project filter and marks truncated paths (#728)
  • fix: files, ctx and restore point at the stores on an empty index (#835)
  • fix: forget --before refuses an age of zero or less (#740)
  • fix: forget --list names the way back (#920)
  • fix: forget --project clears borrowed note titles and names what it dropped (#691)
  • fix: forget --unforget --dry-run must not restore (#1130)
  • fix: forget clears the title a promoted note borrowed from the session (#667)
  • fix: forget names the kind of notes it is dropping (#958)
  • fix: forget says when it could not clear a borrowed title (#805)
  • fix: forget says where the session was already pushed (#789)
  • fix: friction distinguishes an empty store from one with no tool output (#706)
  • fix: friction recognises the errors machines actually hit (#730)
  • fix: gemini-auto no longer refuses a commented config it has already edited (#2759)
  • fix: give every atomic write its own temp name (#1389)
  • fix: handoff no longer warns that a session is '11d old old' (#744)
  • fix: handoff with no id obeys the trust policy (#954)
  • fix: hide the nightly tag from goreleaser (#412)
  • fix: hooks ask for a rebuild when the index is damaged (#801)
  • fix: hooks ask for a rebuild when the index is from another format version (#778)
  • fix: hooks carry the rejection with the session it belongs to (#762)
  • fix: hooks use the cwd the harness sends (#760)
  • fix: how counts the withheld sessions the question matched, not the store's (#2795)
  • fix: impact credits honour the trust policy (#1380)
  • fix: impact stops calling a larger digest 'distilled (0x less)' (#732)
  • fix: import says how many sessions arrived and names a few (#930)
  • fix: index explains a denied write instead of passing the syscall through (#799)
  • fix: index reports a directory it could not read (#819)
  • fix: index says when there is nothing to do (#825)
  • fix: index says which harness it skipped for a missing sqlite3 (#795)
  • fix: index the end of a long tool output, not just its head (#643)
  • fix: install names the targets it found instead of just asking for one (#831)
  • fix: keep Japanese words whole across the marks written inside them (#1392)
  • fix: keep a promoted note's corrections newest-first after an incremental build (#945)
  • fix: keep an event from the future out of today and this week (#1409)
  • fix: keep harness envelopes out of the session-start block (#2736)
  • fix: keep notes without a project and promoted notes without a state (#772)
  • fix: keep result-line ids distinguishable and resolvable (#708)
  • fix: keep the digest headers on their own lines (#1408)
  • fix: keep the evidence a fix pair needs until a second session confirms it (#1382)
  • fix: keep the tombstone until unforget's rebuild succeeds (#811)
  • fix: keep work records and harness noise out of what people read (#592)
  • fix: last --role tool matches tool output (#718)
  • fix: last honours the trust policy (#938)
  • fix: last prints a dash instead of 0001-01-01 (#766)
  • fix: lift a note over its source when either arrived by sync (#2838)
  • fix: log --json returns [] on an empty log, and a number is not a flag (#734)
  • fix: markers fire on words, not on any substring (#2779)
  • fix: measure proximity against every place, not a sample of one word's (#1393)
  • fix: measure the files column in columns, not runes (#1399)
  • fix: merge deja's own entry on the jsonc path instead of replacing it (#2756)
  • fix: name a session after the assistant when no user turn can (#693)
  • fix: name the cause when a borrowed title cannot be cleared (#809)
  • fix: name the filter that emptied a search, and stop hinting on short words (#716)
  • fix: name the imported origin group honestly and flag rules that match nothing (#956)
  • fix: name the package each manager actually ships (#916)
  • fix: name the rebuild window instead of the missing manifest (#823)
  • fix: nine audit findings across privacy, dates, uninstall and the docs (#851)
  • fix: no trailing space where deja takes over an inline mcp brace (#2781)
  • fix: notes append starts a fresh line when the file has no trailing newline (#1132)
  • fix: point at --harness when two sessions share an id (#720)
  • fix: point at the command when an empty search looks like a typo (#675)
  • fix: point at the stores when a search finds an empty index (#833)
  • fix: preserve sync-imported records across rebuilds and index updates (#27)
  • fix: promote explains a locked notes file (#807)
  • fix: re-derive session titles left over from older rules (#785)
  • fix: re-import keeps a session's earlier touched files (#1133)
  • fix: read past an entry's key at what it runs on the opencode jsonc path (#2761)
  • fix: read the answer and the tool output a dsh session actually holds (#1519)
  • fix: readers wait out the index swap instead of reporting it (#1375)
  • fix: reattach the signalLines doc and pin the splice order (#646)
  • fix: rebuild automatically when a bucket file is corrupt (#33)
  • fix: recall_context names the query words the search could not use (#2837)
  • fix: recalled text cannot close the frame that quotes it (#656)
  • fix: recognise the sentence ends Chinese and Japanese write (#1405)
  • fix: record blame calls so deja log covers what the agent was given (#683)
  • fix: redact secrets named in languages other than English (#1144)
  • fix: redact session titles before they reach the index (#104)
  • fix: registry caps server.json description at 100 chars (#51)
  • fix: relative dates use the reader's zone (#768)
  • fix: repair wiring when the binary moved (#774)
  • fix: repair wiring written by an older deja on the next session start (#431)
  • fix: report a store that is only partly readable (#817)
  • fix: resolve claude project names against the filesystem (#34)
  • fix: restore refuses to overwrite, including the file the span came from (#726)
  • fix: resume Grok Build sessions (#1707)
  • fix: resume and handoff name a session that exists (#742)
  • fix: resume obeys the trust policy (#1131)
  • fix: sanitize the project and id in the context header (#1156)
  • fix: say something on an empty index instead of nothing (#448)
  • fix: say what period 'Recalls served' covers (#764)
  • fix: say when a query has nothing to look up (#829)
  • fix: say when a rejected session was moved below the rest (#695)
  • fix: say when a role search found nothing because the store records none of that kind (#1370)
  • fix: say when install left an mcp entry switched off, in either spelling (#2772)
  • fix: say when the index is being rebuilt, and stop treating future dates as now (#881)
  • fix: say when the trust policy is why an answer is empty (#681)
  • fix: say which words matched on their own when nothing matched together (#827)
  • fix: scrub the show header like the context one (#1407)
  • fix: sessions stamped in the future are not today's work (#697)
  • fix: seven places where deja said something other than what it did (#973)
  • fix: shell completion offers deja search (#750)
  • fix: shorten server.json description to the registry 100-char limit (#191)
  • fix: show honours --offset and --limit without --json (#710)
  • fix: show names the missing id before the missing flag (#821)
  • fix: singular counts in the lines a first run prints (#738)
  • fix: size the dedup map without summing two lengths (#2144)
  • fix: skip unreadable sources for a pass instead of failing the update (#70)
  • fix: sources rejects arguments instead of ignoring them (#748)
  • fix: split Grok config home from session root (#122)
  • fix: stats says what an old store covers instead of drawing twelve empty bars (#704)
  • fix: statusline names the same earlier session on every refresh (#669)
  • fix: stop disowning a recalled session that names what was asked (#2831)
  • fix: stop promoting CI status as what a session concluded (#2774)
  • fix: strip the harness preamble in cursor and gemini too (#649)
  • fix: strip what the terminal acts on from the files rows (#1400)
  • fix: sync export rejects an unknown flag instead of exporting nothing (#746)
  • fix: sync import fails on a path that is not a batch directory (#679)
  • fix: take out a hook line deja wrote for a subcommand it no longer has (#2749)
  • fix: tell the agent how many sessions matched, not just how many came back (#1379)
  • fix: the brief obeys one trust rule across the whole screen (#1373)
  • fix: the environment block arrives once, not once per path (#663)
  • fix: the environment block obeys the policy table (#660)
  • fix: the error and relevance tiers keep a note ahead of its own transcript (#2804)
  • fix: the fallback title takes the earliest turn, matching import (#770)
  • fix: the first build is not a quiet day or a missing index (#926)
  • fix: the greeting stops claiming an empty machine once history arrives (#1374)
  • fix: the hook names a store deja could not read (#918)
  • fix: the hook receipt says when the trust policy withheld a session (#948)
  • fix: the hook reports a running build on machines with environment facts (#928)
  • fix: the hook's background refresh reindexes before recomputing the digest (#914)
  • fix: the import proof obeys the trust policy (#952)
  • fix: the import proof says a session has no date instead of leaving the slot empty (#965)
  • fix: the log of a query no longer answers it (#2784)
  • fix: the per-prompt hook puts a note ahead of the transcript it distils (#2823)
  • fix: the recall header stops claiming the query it did not match (#2789)
  • fix: the recall page stops disowning a first session that names what was asked (#2834)
  • fix: the salvage scan finds a key where it is a key (#2796)
  • fix: the semantic tier serves a promoted note with the source it distils (#2821)
  • fix: three status messages report a state the tool is not in (#642)
  • fix: torn lines longer than the SafeSize window lost messages (#107)
  • fix: trim surrounding space from a search query (#1126)
  • fix: two transcripts sharing an id are attributed the same way every build (#700)
  • fix: unforget refuses a prefix that reaches several sessions (#962)
  • fix: unforget reports what it restored and rebuilds so the session comes back (#673)
  • fix: uninstall --all removes hooks and plugins too (#421)
  • fix: uninstall no longer creates configs it was asked to clean (#677)
  • fix: update leaves a source build alone unless forced (#752)
  • fix: version and security policy in the plugin bundles (#1719)
  • fix: warn in deja sources when sqlite3 CLI is missing (#32)
  • fix: write into an mcp block that opens and closes on one line (#2752)

Performance

  • perf(ctx): render a digest's turns across cores, 4.5s to 1.2s on a 30001-message session (#1791)
  • perf(ctx): stop handing every transcript line to a regexp engine — 22.6s to 4.6s on a 30000-turn session (#1743)
  • perf(doctor): probe the newest opencode session instead of the whole database (#460)
  • 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(hook): serve stale digest instantly, refresh detached (#330)
  • perf(hooks): skip-decode foreign records, overlap git probes (#295)
  • perf(index): carry derived file state forward, 650ms to 6ms (#458)
  • perf(index): count co-occurring pairs a shard at a time (#1366)
  • perf(index): cut the CJK bigram build overhead without changing the index (#1220) (@Sora-bluesky)
  • perf(index): grammar earns no posting (#2923)
  • perf(index): let omp, openclaw and prime append instead of re-reading (#2902)
  • perf(index): parallel harness parsing and redaction on cold builds (#303)
  • perf(index): read records in coalesced spans instead of one pread each (#512)
  • perf(index): skip the CJK scan on bodies that contain no CJK (#640) (@AliceLJY)
  • perf(index): stop re-reading a whole transcript to verify an append (#2154)
  • perf(index): stream a record's keys instead of collecting them (#2893)
  • perf(index): write a posting's session id as a delta, not in full (#2942)
  • perf(main): stop parsing every store to count its files (#1990)
  • perf(rank): pay coverage only on words that identify something (#2480)
  • perf(search): answer a short ASCII query without reading the catalog (#2899)
  • perf(search): bound how much of one session a query reads (#515)
  • perf(search): build the query side of the record check once (#1886)
  • perf(search): cache bucket directories within a query (#350)
  • perf(search): fetch postings for up to 8 query tokens (#267)
  • perf(search): shard non-ASCII tokens across buckets (#351)
  • perf(sources): decode claude transcripts into declared types (#502)
  • perf(usage): stop re-reading a log that has nothing to drop (#1973)
  • 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: a growing goose session appends, keeping the project its header names (#2877)
  • perf: a growing qwen session appends instead of rewriting the index (#2876)
  • perf: ask the grok store only for what is new (#2812)
  • perf: ask the hermes store only for what is new (#2813)
  • perf: ask the zed store only for the threads that changed (#2818)
  • perf: buffer record and bucket writes, batch token jobs, prefilter redaction (#88)
  • perf: cut the first screen from 3.2s to 0.6s (#627)
  • perf: give a single-rare-word match half the block (#1514)
  • perf: index size and search latency (#360)
  • perf: manifest cache for long-lived processes; 60s hook digest cache (#301)
  • perf: read friction in one pass over the record log (#624)
  • perf: spill postings to disk during a full build (#1084) (#1136)
  • perf: store co-occurrence pairs once, not both directions (#1137) (#1138)

Documentation

  • docs(architecture): say which machines deja treats as one (#1916)
  • docs(bench492): what the pass costs, on both corpora (#2690) (@AliceLJY)
  • docs(cli): list the search flags in --help (#493) (@AliceLJY)
  • docs(compare): add the four largest memory projects, and drop a claim that stopped being true (#525)
  • docs(extensions): the npm pages were still describing nineteen agents (#2957)
  • docs(grok): note the second CLI that shares ~/.grok
  • docs(guide): Claude Code deletes transcripts after 30 days, and how to stop it (#2971)
  • docs(guide): memory for Goose, Cline, pi and omp, and the ClawHub skill pack (#2974)
  • docs(guide): memory for Hermes, and one name for the tool (#2975)
  • docs(guide): memory for OpenClaw (#2973)
  • docs(index): the token counter is a lower bound, not the count (#2202) (@AliceLJY)
  • docs(json): correct the schema versions the examples show (#608)
  • docs(json): describe deja log --json and pin its keys (#1933)
  • docs(json): describe stats --impact --json and pin its keys (#1900)
  • docs(json): name the kind Claude sets, and pin the optional session keys (#1937)
  • docs(json): say that a peer stamped ahead gets a minute of slack (#1866)
  • docs(json): say what a week and a day mean in the stats numbers (#1940)
  • docs(json): the peer host is reported as written, not bounded (#1870)
  • docs(mcp): say why the parent pid is read once (#2711) (@Sora-bluesky)
  • docs(mcp): tell recall's caller what actually works (#2342)
  • docs(readme): answer where session history lives and why it disappeared (#2985)
  • docs(readme): the three ways to install deja as a skill (#3003)
  • docs(registry): close six more gaps, and record aider's as a limit not a backlog (#1195)
  • docs(registry): four more harnesses reach /deja through the skill they already have (#1211)
  • docs(registry): name why prime-agent has no resume (#2912)
  • docs(registry): resolve nine harnesses from unknown to buildable work (#1194)
  • docs(security): say that deja update does not check the release signature (#2879)
  • docs(security): say what deja update verifies, and what it does not (#446)
  • docs(site): a text sitemap, and a test that refuses AI trailers in commits (#2965)
  • docs(site): bare deja prints the brief on a terminal, not usage (#1105)
  • docs(site): bring the version and the benchmark numbers up to 0.19.1 (#2362)
  • docs(site): count the harnesses deja actually reads (#619)
  • docs(site): day zero — five memory tools on one machine with 19,195 sessions already on disk (#3019)
  • docs(site): list deja files and deja restore on the commands page
  • docs(site): reach every guide from the home page (#2964)
  • docs(site): the guide reads on a phone (#3023)
  • docs(site): wide tables scroll in place; compare page drops the broken nav strip (#333)
  • docs(sitemap): every entry carries a lastmod, from the registry's own dates (#1899)
  • docs(termwidth): say that a cut returns composed text, and pin the brief's splice (#1843)
  • docs(usage): write down the rotation window the append accepts (#1909)
  • docs(zh): Chinese guides for the questions people search (#2955)
  • docs(zh): point the dsh plugin link at extensions/dsh (#1566)
  • docs: 0.14.2 changelog and site notes (#247)
  • docs: 0.14.3 changelog, kimi in the install lists and demo corpus (#251)
  • docs: 0.15.1 surface — impact/promote/trust-scopes rows, hook latency number (#297)
  • docs: 0.15.2 surface — public benchmark numbers, 50ms hook (#304)
  • docs: Chinese README, and publish the dsh plugin to npm on release (#1553)
  • docs: a command that says what finishing a harness means (#3029)
  • docs: a page for the question people actually type (#1667)
  • docs: add security model and contributor guidance (#119)
  • docs: adding memory to opencode (#1688)
  • docs: agent strip on the site, current install targets in README (#74)
  • docs: bring README, site and roadmap up to v0.17.0
  • docs: bring the Chinese README level, and title pages for the query (#2947)
  • docs: bring the harness claims back in line with what ships (#1235)
  • docs: bring the release surface up to what shipped since 0.17.3 (#1537)
  • docs: changelog and site for 0.19.2 (#2944)
  • docs: changelog and site for 0.19.3 (#3055)
  • docs: changelog and site for 0.7.0 (#49)
  • docs: changelog and site for 0.9.1 (#69)
  • 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.13.1 (#169)
  • docs: changelog for 0.14.1 (#231)
  • docs: changelog for 0.14.4 (#271)
  • docs: changelog for 0.15.7 (#361)
  • docs: changelog for 0.16.0 (#477)
  • docs: changelog for 0.16.1 (#483)
  • docs: changelog for 0.16.2 (#518)
  • docs: changelog for 0.16.3 (#556)
  • docs: changelog for 0.16.6 (#836)
  • docs: changelog for 0.16.7 (#960)
  • docs: changelog for 0.16.9 (#1129)
  • docs: changelog for 0.17.1 (#1234)
  • docs: changelog for 0.17.2 (#1270)
  • docs: changelog for 0.17.3 (#1423)
  • docs: changelog for 0.18.0 (#1546)
  • docs: changelog for 0.19.0 (#2013)
  • docs: changelog for 0.19.1 (#2356)
  • docs: changelog for 0.5.1-0.6.0, warmup in CLI table, sync notes in architecture (#37)
  • docs: changelog for 0.8.0 (#55)
  • docs: changelog, README and site for 0.9.0 (#64)
  • docs: comparison page and 14-harness site refresh (#311)
  • docs: complete the network list, add rotation note, position vs engram (#242)
  • docs: deja view surfaces; changelog for 0.15.5 (#335)
  • docs: demo gif runs index before searching (#99)
  • docs: describe what deja now indexes, and what the first run does (#593)
  • docs: document JSON output schemas and add schema_version (#233) (@syf2211)
  • docs: déjà vu moments and the brief across site, readme, guides (#274)
  • docs: every listing leads with deja-vu and the word memory (#3026)
  • docs: finding an old session, and several agents on one repository (#1679)
  • docs: finish the move off the tap, including the demo GIF (#1767)
  • docs: fix doctor copilot row, stale exclusion FAQ, manifest name (#210)
  • docs: fix unbalanced div, 3-column feature grid (#24)
  • docs: guide pages for Claude Code, Codex, Cursor and Copilot (#1938)
  • docs: honest positioning vs cass and memory platforms
  • docs: install from homebrew-core, not the tap (#1763)
  • docs: let the hero make one claim, and say the same thing everywhere (#1184)
  • docs: link the guide from the README, which is the page Google crawls most (#1896)
  • docs: live badges, drop retired go report card
  • docs: measure the numbers instead of carrying them forward (#1549)
  • docs: memory pages for Gemini CLI and Qwen Code (#1757)
  • docs: memory pages for dsh, Kimi Code, Zed and Grok Build (#1689)
  • docs: mention sync ssh on the site (#36)
  • docs: name Goose in the agent lists (#344)
  • docs: name pages for what people search, and correct the compare table (#1178)
  • docs: name the one object-shaped answer that carries no schema_version (#1977)
  • docs: name the windows download and say the binary alone is enough (#1369)
  • docs: name where the harness packages publish from now (#1564)
  • docs: nine harnesses on the site, og image and tagline (#128)
  • docs: one bundle installs into five harnesses (#391)
  • docs: pages for exporting a session and for syncing across machines (#1673)
  • docs: pages for lost context, a full window, and resuming a session (#1771)
  • docs: pages for the repeated wall and for switching agents (#1672)
  • docs: paste-ready agent instructions block in README (#38)
  • docs: pi as the tenth harness, 0.13.1 changelog, refreshed site and og image (#182)
  • docs: prepare the 0.17.0 release
  • docs: publish llms.txt, the map an agent reads instead of crawling (#1871)
  • docs: publish the session format registry as pages search engines can read (#1434)
  • docs: put Install directly under the demo (#508)
  • docs: put automatic recall and redaction on the first screen (#1560)
  • docs: re-record the demo gif, contract home dir in progress paths (#97)
  • docs: real agent marks on the site (#76)
  • docs: record what the conclusions budget actually does (#1397)
  • docs: refresh benchmark numbers — hit@k naming, evidence-recall, LoCoMo 69.8 (#326)
  • docs: refresh copy before the release (#105)
  • docs: refresh the measured numbers and document six missing commands (#607)
  • docs: refresh the outside-contribution numbers (#1580)
  • docs: release prep for 0.13.0 (#146)
  • docs: reposition around retroactive cross-agent memory, honest bench baseline (#200)
  • docs: rework the README opening, and show the tool itself (#1242)
  • docs: say the words people search for, and guard the structured data (#1823)
  • docs: say what a subagent's run is, and what resume does per harness (#1540)
  • docs: scoop install deja-vu, now that the manifest is in the main bucket (#1906)
  • docs: search-by-time section and README mention (#329)
  • docs: show the four registry installs, count Hermes (#387)
  • docs: sixteen harnesses; changelog for 0.15.6 (#342)
  • docs: state the search latency we actually measure (#519)
  • docs: sync the site copy of the demo gif (#106)
  • docs: tell IndexNow when pages change (#1682)
  • docs: the README listed four MCP tools; the server serves six (#1244)
  • docs: the demo corpus generator lives at ./scripts/demo (#500)
  • docs: the home page had no robots meta, unlike every guide page (#1893)
  • docs: the no-hook harness count was stale and had inverted (#1293)
  • docs: the registry pages counted seventeen other formats (#1541)
  • docs: the rest of what 0.16.6 fixes (#858)
  • docs: the roadmap pointed at four closed issues (#1542)
  • docs: the site still counted seventeen harnesses (#1539)
  • docs: two guides for the questions people actually search (#2950)
  • docs: two more entries for 0.16.2 (#521)
  • docs: two more pages for questions people type, and a guard for the set (#1670)
  • docs: unify demo gif across readme and site, add full SEO pass (#197)
  • docs: update site performance numbers
  • docs: what memory costs in tokens (#1674)
  • docs: when the rules file grows, and auditing what an agent did (#1678)

Other

  • A /deja command and auto-recall for DeepSeek Harness (#1527)
  • A query that names a subcommand no longer runs it (#430)
  • A reverted decision comes back marked, not as current truth (#506)
  • Add MCP Toplist rank badge (#464) (@chrstphe)
  • Add filters to deja last (#121) (@leemeo3)
  • Add omp (Oh My Pi) harness (rebased #1455) (#1520)
  • Add pi session support (#173) (@maxandersen)
  • Add versioned session read contracts (#476) (@adamsitar)
  • Bring the bug hunt into main (#2733)
  • Close the last resume gaps, and aider's skill cell (#1529)
  • Fix ten memory-lifecycle and trust-policy holes (#984)
  • Give the prompt benchmark a corpus big enough to judge rarity (#1535)
  • Goose: MCP extension and session-start hints (#405)
  • Launch demo gif (#25)
  • Make doctor's two forms agree, and stop three lines from lying about provenance (#1003)
  • Make the empty answers and the first screen say what they mean (#998)
  • Measure the bar the hook actually applies, and drop the rule it ignored (#1517)
  • Merge pull request #1912 from vshulcz/merge/hunt-2026-08-23
  • Merge pull request #2011 from vshulcz/merge/hunt-2026-08-26
  • Merge pull request #2798 from vshulcz/merge/hunt-2026-08-30
  • Merge pull request #2801 from vshulcz/merge/hunt-tail
  • Merge pull request #2953 from vshulcz/hunt-merge
  • Merge remote-tracking branch 'origin/hunt/2026-08-23' into merge/hunt-2026-08-23
  • Merge remote-tracking branch 'origin/hunt/2026-08-23' into merge/hunt-2026-08-26
  • New hero demo: a real agent recalling on its own (#489)
  • Night audit: privacy, read-error paths, parsers, install, JSON contract (#1147)
  • Nightly snapshot build (#398)
  • Raise usage and sources coverage (#463)
  • Rarity: the rarer of the two verdicts wins (#1536)
  • Refresh site with new features (#21)
  • Revert "fix(recall): lower the idf floors to the scale a real store has" (#1452)
  • Roo: follow the customStoragePath setting (#426)
  • Say the same thing about an index that cannot be written, and explain two dates (#1008)
  • Say which tier answered, and what the cap hid (#495)
  • Ship .mcpb bundles for one-click desktop install (#482)
  • Stop a forgotten note and a shared folder from coming back around (#989)
  • Stop parsing what cannot match: 12% off a full rebuild (#498)
  • Stop three surfaces from hiding what a rule or a leftover directory did (#1015)
  • assets: square icon for directory listings (#56)
  • assets: the 400x400 icon the marketplace submissions link to (#2968)
  • audit batch: forget cost, advice that does not run, disk-gone messages (#1037)
  • audit batch: policy leaks, progress, import cost (#1028)
  • audit wave + hermes postgres store (#1018)
  • audit wave 5: harness validation + family sweeps (#1114)
  • audit wave 6: trust-policy leaks and imported-session parity (#1122)
  • audit wave 7: status-line trust-policy leak (#1123)
  • audit wave 8: index hangs, import hiding local sessions, semantic policy leak (#1128)
  • bench(locomo): real session dates and a JSONL miss report (#321)
  • bench(locomo): real session dates and a JSONL miss report (#322)
  • 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)
  • bench: LoCoMo harness + extended LongMemEval metrics (#299)
  • brand: neofetch-style rewind-loop mark (#94)
  • brand: per-agent breakdown in the first-index greeting (#95)
  • brand: quadrant-resolution mark, install results in the info column (#96)
  • brand: rewind-loop terminal mark, site og image (#93)
  • check: an off-by-default plan check, plus the harness to re-measure it (#1125) (@Sora-bluesky)
  • chore(ci): bump codeql-action to 4.37.4 across init, autobuild and analyze (#1157)
  • chore(deps): bump actions/checkout from 4.2.2 to 7.0.1 (#2884) (@dependabot[bot])
  • chore(deps): bump actions/checkout from 7.0.0 to 7.0.1 (#781) (@dependabot[bot])
  • chore(deps): bump actions/setup-go from 6.5.0 to 7.0.0 (#2887) (@dependabot[bot])
  • chore(deps): bump anchore/sbom-action/download-syft (#2885) (@dependabot[bot])
  • chore(deps): bump every codeql-action step to 4.37.9 together (#2928)
  • chore(deps): bump github/codeql-action/upload-sarif (#779) (@dependabot[bot])
  • chore(deps): bump ossf/scorecard-action from 2.4.0 to 2.4.4 (#783) (@dependabot[bot])
  • chore(dsh): 0.20.4, to republish with the English package page (#1849)
  • chore(dsh): 0.20.5, to republish with today's two fixes (#3004)
  • chore(packaging): generate the Windows manifests, and fail CI when they lag (#486)
  • chore(packaging): pin scoop and winget to 0.17.1 (#1238)
  • chore(packaging): pin scoop/winget manifests to 0.14.1 (#232)
  • chore(packaging): pin scoop/winget manifests to 0.14.2 (#249)
  • chore(packaging): pin scoop/winget manifests to 0.14.3 (#252)
  • chore(packaging): pin scoop/winget manifests to 0.14.4 (#272)
  • chore(packaging): pin scoop/winget manifests to 0.15.0 (#275)
  • chore(packaging): pin scoop/winget manifests to 0.15.1 (#296)
  • chore(packaging): pin scoop/winget manifests to 0.15.2 (#305)
  • chore(packaging): pin scoop/winget manifests to 0.15.3 (#328)
  • chore(packaging): pin scoop/winget manifests to 0.15.4 (#332)
  • chore(packaging): pin scoop/winget manifests to 0.15.5 (#336)
  • chore(packaging): pin scoop/winget manifests to 0.15.6 (#343)
  • chore(packaging): pin scoop/winget manifests to 0.16.0 (#478)
  • chore(packaging): pin scoop/winget manifests to 0.16.1 (#485)
  • chore(packaging): pin scoop/winget manifests to 0.16.3 (#557)
  • chore(packaging): pin scoop/winget manifests to 0.16.4 (#570)
  • chore(packaging): pin scoop/winget manifests to 0.16.5 (#620)
  • chore(packaging): say what the thing does where people search for it (#2960)
  • chore(packaging): the winget and scoop line says what people search for (#2969)
  • chore(packaging): the winget manifests carry the schema header (#2977)
  • chore(scoop): canonical key order and checksums-based autoupdate (#1814)
  • chore(sync): drop the export helper the push path stopped using in #215 (#1892)
  • chore: Dockerfile and richer MCP tool descriptions (#58)
  • chore: Search Console verification file (#1882)
  • chore: add a Dockerfile for the MCP server (#166)
  • chore: changelog for 0.15.3 (and backfill 0.15.1/0.15.2) (#327)
  • chore: changelog for 0.15.4 (#331)
  • chore: collapse a comment a merge left three times over (#2738)
  • chore: drop a compiled binary that reached main, and stop the next one (#597)
  • chore: drop a state file a test run left in cmd/deja, anchor the aider ignore (#3040)
  • chore: drop committed bench binary, ignore harness builds
  • chore: drop deja-stats.svg from the repo (#514)
  • chore: drop smithery.yaml (#1241)
  • chore: drop the grok entry in wholeStoresThisPass, which nothing needed (#2815)
  • chore: drop the switch readers the merged writer no longer needs
  • chore: ignore Python's pycache (#1279)
  • chore: manifests for MCP registry, Glama and Smithery (#50)
  • chore: name the homepage, repository and licence in the plugin manifest (#1555)
  • chore: open a discussion with every release (#1559)
  • chore: pin scoop and winget to 0.16.6 (#882)
  • chore: pin scoop and winget to 0.16.7 (#963)
  • chore: pin scoop, winget and the codex plugin to 0.17.3 (#1426)
  • chore: pin scoop, winget and the codex plugin to 0.18.0 (#1547)
  • chore: pin the codex plugin version, drop one orphan asset (#1246)
  • chore: pin the manifests to 0.19.1 (#2359)
  • chore: pin the manifests to 0.19.2 (#2946)
  • chore: pin the manifests to 0.19.2 (#2948)
  • chore: point windows manifests at v0.13.0 (#147)
  • chore: point windows manifests at v0.13.1 (#189)
  • chore: publish server.json to the MCP registry on release (#165)
  • chore: remove goose's own documentation from the repo root (#437)
  • chore: remove harness test artefacts from the repo (#435)
  • chore: repin the Windows manifests to the rebuilt 0.19.0 archives (#2019)
  • chore: the dsh plugin lives in its own repository now (#1558)
  • chore: things nothing was checking (#1245)
  • ci(extensions): say when a package is stranded ahead of the release line (#3006)
  • ci: ask for a rebase where the base moved on the same files (#2921)
  • ci: cache the Go build to cut windows compile time
  • ci: e2e smoke, coverage, govulncheck, goreleaser check, codeql, scorecard
  • ci: errcheck exclusions for print and cleanup calls
  • ci: give every package a coverage floor (#1956)
  • ci: give peers and stats a coverage floor, and say which floors are tight (#1944)
  • ci: install syft for the nightly build (#407)
  • ci: keep the embed redaction test out of the plugin scanner (#3032)
  • ci: let govulncheck use the newest Go patch (#1222)
  • ci: publish the harness packages from the release, at the release version (#1574)
  • ci: raise the test job cap to 45m (#1427)
  • ci: resolve registry publish version from the latest release on manual runs (#190)
  • ci: run the HOL plugin scanner on the Codex bundle (#1715)
  • ci: skip signing in the nightly build (#408)
  • ci: stop instrumenting coverage on the platforms that never read it (#1209)
  • ci: stop reinstalling shellcheck, cap the job at 10 minutes (#1324)
  • ci: take the windows leg off the per-commit path, and drop -race there (#1236)
  • ci: tell the plugin scanner which files are redaction fixtures (#1717)
  • ci: trigger MCP registry publish on tag push, not release event (#188)
  • ci: windows shell, govulncheck go version, scorecard pin, sc2155
  • ci: windows test env, bump actions, golangci v2 config
  • compare: the tools that read the same session files (#2008)
  • docs+plugin: wire point-of-action, document hooks & ranking; fix latency
  • doctor: report every auto-recall integration (#417)
  • doctor: stop warning about unused sessions (#440)
  • feat/error signature tier (#1149)
  • feat/fix pairs (#1151)
  • feat/hits say when something was reverted (#1152)
  • feat/hook tool (#1153)
  • feat/how command channel (#1154)
  • grant discussions:write to the release job (#2016)
  • grok: write the config both shipping CLIs read (#402)
  • let the policy file name the directories deja skips (#2060)
  • mcp: answer ping and resources/templates/list (#1746) (@MsfPablo)
  • mcp: refuse a session uri that carries no id (#1750) (@MsfPablo)
  • merge: take the bug-hunt branch into main
  • merge: take the bug-hunt branch into main
  • merge: the last bug-hunt commit, which landed during the integration
  • plugin(claude): a plugin.json at the plugin root, the layout directories read (#3011)
  • plugin(claude): keywords for the directory search (#3005)
  • put the flock helper behind a build tag (#2020)
  • redact: catch modern provider keys, env/JSON shapes, and more token families (#81) (@suthakamal2)
  • refactor(json): name the set-level field tier, matching the per-hit one (#496)
  • refactor(sources): rename sqlQuote to sqlEscape (#475)
  • refactor: dispatch subcommands via table (#226)
  • refactor: extract internal/query so index stops importing search (#230)
  • refactor: move relevance tokenisation into query (#2136)
  • refactor: move share/handoff digest building to internal/digest (#229)
  • refactor: move stats computation to internal/stats (#228)
  • refactor: resolve index dir once in run() (#225)
  • refactor: share the aboutness rule between the hook and the benchmark (#1516)
  • refactor: source registry for harness dispatch (#224)
  • refactor: split index.go into ingest, retrieval, manifest, store_io (#227)
  • refactor: the benchmark for the hook now runs the hook's own extraction (#1280)
  • release: name the outside contributor on their line of the notes (#2992)
  • release: open the page with what changed, not with the install command (#1581)
  • security: close redaction gaps for basic auth, empty-user urls, pgp keys, torn secrets (#172)
  • security: harden config modes, resume ids and recall framing (#143)
  • security: job-level codeql permissions, pin runtime alpine digest (#102)
  • security: owner-only permissions for the index and usage files (#108)
  • security: scorecard hardening (#100)
  • share: filter JSON, diff and CLI dumps from digests (#23)
  • site: documentation section, SEO and refreshed demo (#192)
  • site: sharper hero, metric chips, animated polish, denser demo gif (#196)
  • stats: make the impact screen agree with a count of one (#1675) (@MsfPablo)
  • style: check cleanup error returns
  • style: explicit close in defers
  • test(atomicfile): cover WriteStream, which had none (#1957)
  • 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): ask every question again in someone else's words (#2126)
  • test(bench): ask every question in someone else's project (#2542)
  • 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): make the tied arm measure the search rather than the fixture (#2338)
  • test(bench): measure recall against a scope that cannot hold the answer (#1435)
  • test(bench): measure the reworded question the store can actually answer (#2334)
  • 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(bench492): keep the rig that measured the real store (#2124) (@AliceLJY)
  • test(docs): end a doc section at the heading that ends it (#1952)
  • test(doctor): pin what a peer row with neither timestamp means (#1860)
  • test(e2e): walk the path a user actually takes (#1283)
  • test(goose): pin the legacy file reader on the parts the db reader gained (#2961)
  • test(goose): the parent of AGENTS.md is filepath.Dir, not a trimmed slash (#2983)
  • test(hook): hold the cheap discards ahead of narrowing (#1476)
  • test(hook): hold the two guards nothing was holding (#1482)
  • test(hook): measure the task-git budget against a repo that has changes (#1996)
  • test(hook): put the session's line where rotation can drop it (#1481)
  • test(hook): run the session-start hook tests on Windows again (#2807)
  • test(hooks): cover the pre-action hook in the framing property (#2852)
  • test(hooks): hold the session start to one project across worktrees (#1959)
  • test(hooks): pin that every injection says the text is untrusted (#2850)
  • test(hooks): pin the receiver both injection paths record (#1953)
  • test(index): cover the checkout guard on RecentProjectsUnder (#2880)
  • test(index): isolate the notes store from the developer's real one (#1141)
  • test(index): measure the early exit against a log worth scanning (#2004)
  • test(index): pin session metadata to be the same whichever way the index got there (#1303)
  • test(index): pin that the index keeps what the transcript brought (#1992)
  • test(index): pin what keeps the mark-guard asymmetry out of the index (#2131) (@Sora-bluesky)
  • test(index): stand where the swap-window wait is instead of racing a goroutine against it (#1783)
  • test(install): ask for the path and the command shape, not the Unix spelling (#2857)
  • test(json): catch a struct that embeds a type writing its own JSON (#1897)
  • test(json): pin the keys deja show and deja last emit to the document (#1911)
  • test(kimi): compare the two manifests whole instead of five keys of them (#1778)
  • test(kimi): pin record-less results and tear tool lines (#1224) (@AliceLJY)
  • test(longmemeval): add -precision mode (false-positive recall rate) (#1139)
  • test(mcp): cover the resources surface in the framing property (#2859)
  • test(mcp): pin that every answer carrying transcript text says it is untrusted (#2848)
  • test(mcp): pin the budgets the conclusions gate was measured at (#1802)
  • test(mcp): pin the tools/list payload to a token budget (#1291)
  • test(mkcorpus): the corpus could not exercise friction, fix or restore (#1294)
  • test(nfcfold): tie the composition table to the block the scan looks for (#1836)
  • test(notes): pin what re-promoting an old record does, and stop a flaky cap test (#1816)
  • test(peers): hold the shape that keeps the lock's fallback out of reach (#1905)
  • test(plugin): derive the hooked events from the installer instead of restating them (#1230)
  • test(recall): fixture for a small store's answer reaching the block (#2900)
  • test(recall): pin that only the agent's own refusals drop a session (#1335)
  • test(search): record what the close tier's length bucket still reaches (#1945)
  • test(search): record which tier joins a word to its marked form (#1942)
  • test(stats): hold the card and the page to the week the report carries (#1948)
  • test(statusline): stop reading the package's shared home (#2853)
  • test(sweep): a rig that drives every installed harness against a recording endpoint (#1225)
  • test(sync): a rejection still marks its transcript on the other machine (#2828)
  • test(sync): hold a synced index to what a local one answers (#1278)
  • test(usage): measure the shape that costs three bytes a character (#1987)
  • test(usage): measure what a record weighs instead of guessing (#1981)
  • test(usage): pin that a blank line in the log is read past (#1910)
  • test(usage): pin the record size this log can hold (#1974)
  • test(usage): pin why the environment block stays out of the impact ratio (#1964)
  • test(usage): state the room one event has, and hold the writers to it (#1986)
  • test(view): pin that a note's tag cannot close the page's script block (#1818)
  • test(windows): a test's HOME never reached windows, so the suite shared one home (#1292)
  • test(windows): fix the two tests that fail on every Windows checkout (#1677)
  • the bug hunt's six days, into main (#2351)
  • the bug hunt's week: 124 fixes, merged (#2616)
  • tools(blockcarry): #2243's instrument, as a script (#2915)
  • tools(filehookreach): attribute the per-action hook's silence (#2926)
  • tools(semanticgap): measure the sidecar where the lexical ladder cannot reach (#2935)
  • tools: add corpusprobe, which measures what the corpus can actually support (#548)
  • v0.9.2: field fixes and QA-sweep fixes (#73)
  • warmup: name the phase before it is written (#1748) (@MsfPablo)

Install

curl -fsSL https://raw.githubusercontent.com/vshulcz/deja-vu/main/install.sh | sh
go install github.com/vshulcz/deja-vu/cmd/deja@v0.19.3
brew install deja-vu