A patch release about reach and honesty. Memory now arrives where an agent
actually works — inside the subagents that do the reviewing and the hunting —
and several surfaces stopped claiming more than they knew.
Added
- A spawned agent gets the memory its parent has. Subagents receive no session
start and send no user prompt, so nothing deja injected ever reached them:
289 of 328 sessions on the store this was measured against were subagents,
and 1% of them saw a recall.PreToolUserewrites the instructions the
parent wrote, which is the one place a subagent can still be reached. The
same for opencode, through its plugin'stool.execute.before. (#2143, #2147) - The block says so when the question itself was asked before, rather than
saying a session matched the subject. Matched on the question's terms rather
than its wording: the exact-wording counter saw a fifth of the repeats this
store holds, and 6.5% of substantial questions are asked again in a later
session. (#2276) - A session start leads with what the project has not been told yet. (#2047)
- A failing test is read as friction by its name.
--- FAIL: TestNameis the
most common failure in a Go repository — 2,318 of 6,744 error lines here —
and it was rejected with the summary lines that identify nothing. (#2180) - The policy file names the directories deja skips, so a scratch tree can be
kept out of recall by rule rather than by hand. (#2060)
Changed
recall's description says what works. It asked for a single specific token
and warned that several words are ANDed; measured over 760 real calls,
nothing matched zero times at any query length and the longer questions came
back with more. (#2342)doctorstops reporting deliberate skips as files it could not read. The row
said "1192 not recognised here" where 596 were subagent transcripts deja is
written to leave alone and 452 sat in a.tmpdirectory. (#2345)- The relevance tokenisation moved to the package both
indexandprompt
build on, which also took a cross-package dependency out. (#2136)
Fixed
- A directory the trust policy says is not to be recalled is now out of reach
everywhere. The rule was applied at one call site — the CLI's own search —
sodoctorprinted "not recalled" while the per-prompt hook injected those
sessions into every message. (#2323) - One rare word no longer decides which session answers. The gate that checks a
session says the subject was given a single term, the rarest by corpus IDF,
and a small corpus crowns ordinary nouns: the session that settled a question
was dropped for saying "orders worker" where the question said "service". The
block's two slots also stopped holding two copies of one answer. (#2328) - A cross-script CJK hit is scored on the text that matched it. It was counted
through the fold and then scored against the surface text, where the query's
words appear nowhere, so a record that matched twice ranked below one that
matched once. (#2157) - Japanese grammar bigrams stop triggering auto-recall. The fallback dropped
"pure grammar" through a Chinese closed class, while Japanese grammar lives in
hiragana — and the bigram slide crosses word boundaries, so ての in すべて|の
is not even a word. Contributed by
@Sora-bluesky. (#2262) - The fix pair is held to what a remedy is: the error must stay gone for the
rest of the session, the command must not have failed itself, and reading
something is not fixing it — agrepfor the symbol the compiler named
satisfies "the command names what the error named" by construction. And
deja fix's own output no longer counts as a fresh error, which had made
asking about an error record that it happened again. (#2166, #2169, #2172,
#2174) - An agent's own scratch sessions and the transcript's record of a deja call
stay out of recall, so the tool stops answering with itself. (#2054, #2068) - The injection cooldown carries across agent sessions in a project, so a
fleet of agents opened together does not re-serve one session to each.
(#2041) - A whole transcript is no longer re-read to verify an append. The rewind guard
hashed every byte before the append point on each search that saw the file
change, which for the session being written is every search: 1.70s per call
against a 250 MB transcript, now 0.36s. (#2154) deja last,show,forgetandremembercomplete their own flags.
Contributed by @vaibhav8a. (#2148, #2021,
#2027, #2028)- Six days of the bug hunt, 148 changes, went in behind these: the session
start and the file line stay inside the checkout's own project rather than
one whose name ends the same way,forgettakes what it forgot out of the
injection log, the usage log records which projects a digest was built from,
anddoctor,viewandfrictionname the rule when a trust policy empties
what they show. (#2351)
Changelog
Features
- feat(hooks): give a spawned agent the memory its parent has (#2143)
- feat(index): read a failing test as friction, by its name (#2180)
- feat(log): record which sessions the session-start hook served (#2045)
- feat(opencode): carry recall into a spawned agent (#2147)
- feat(recall): lead a session start with what the project has not been told (#2047)
- feat(recall): say when the question itself was asked before (#2276)
Fixes
- fix(bench): give every instrument the whole firing bar (#2072)
- fix(completion): complete --json and --from for deja last (#2148)
- fix(completion): give deja show its own flag completions (#2021)
- fix(completion): offer --all-matches for deja forget (#2027)
- fix(completion): offer --tag for deja remember (#2028)
- fix(doctor): stop reporting deliberate skips as files it could not read (#2345)
- fix(index): a command that failed is not a fix (#2172)
- fix(index): reading something is not fixing it (#2174)
- fix(index): stop deja fix's own output counting as a fresh error (#2169)
- fix(index): withhold a fix the error outlived, however much later (#2166)
- fix(mcp): say no session is about it when nothing matched (#2076)
- fix(policy): honour the ignore rule on every surface, not just deja search (#2323)
- fix(recall): carry the injection cooldown across agent sessions (#2041)
- fix(recall): stop Japanese grammar bigrams from triggering auto-recall (#2262)
- fix(recall): stop one rare word deciding which session answers (#2328)
- fix(search): keep an agent's own scratch sessions out of recall (#2054)
- fix(search): score a cross-script CJK hit on the text that matched it (#2157)
- fix(search): stop matching the transcript's record of a deja call (#2068)
- fix: size the dedup map without summing two lengths (#2144)
Performance
- perf(index): stop re-reading a whole transcript to verify an append (#2154)
Documentation
- docs(index): the token counter is a lower bound, not the count (#2202)
- docs(mcp): tell recall's caller what actually works (#2342)
- docs: changelog for 0.19.1 (#2356)
Other
- chore: repin the Windows manifests to the rebuilt 0.19.0 archives (#2019)
- let the policy file name the directories deja skips (#2060)
- put the flock helper behind a build tag (#2020)
- refactor: move relevance tokenisation into query (#2136)
- test(bench): ask every question again in someone else's words (#2126)
- test(bench): make the tied arm measure the search rather than the fixture (#2338)
- test(bench): measure the reworded question the store can actually answer (#2334)
- test(bench492): keep the rig that measured the real store (#2124)
- test(index): pin what keeps the mark-guard asymmetry out of the index (#2131)
- the bug hunt's six days, into main (#2351)
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.1
brew install deja-vu