Releases: malinfossum/munin
Release list
v0.5.0 — Huginn mode
Proactive recall. A UserPromptSubmit hook pipes each prompt to munin context, which injects up to 3 high-confidence curated memory chunks as labeled background context — or stays completely silent. Off by default, enabled per project by registering the hook.
- Curated sources only: imported transcript text never auto-injects unless explicitly opted in (provenance flag, index schema 2)
- Boundary-escaped injection wrapper: retrieved text is data, never instructions; chunks cannot forge the block boundary
- No feedback loop:
munin importstrips injection blocks from transcripts - Fail-safe: any error means no injection and an untouched prompt — always exit 0, never a download, never a block
- Gates: tests 68/68, golden recall set 10/10, injection probes 8/8, median latency 0.803 s
This completes the Munin roadmap (M1–M5).
v0.4.0 — session import
The session-import release. Facts that only ever lived in session transcripts — never promoted to curated memory — become recallable, without letting a single pasted key reach the index.
What's new
munin import(opt-in) — converts Claude Code session transcripts (*.jsonl) into dated markdown under gitignoreddata/imported/, indexed at the lowest source weight. Nothing is imported unless you add folders toimportSources; re-runs are incremental, and the import ledger is written only after a fully successful run.- Safety by construction — only conversation text is imported: tool calls, tool output, and thinking are dropped before scrubbing, so terminal output never reaches the pipeline. Every turn carries an inline date, and quoted markdown headings are escaped so imported text can't forge chunk structure.
- Secret scrubber — provider key prefixes (
sk-/sk_, GitHub, Slack, AWS, Google, npm), JWTs, PEM private-key blocks, URL credentials, andkey: valueassignments including env-style names (GITHUB_TOKEN=) andBearervalues, plus a catch-all for long opaque tokens (git SHAs are eaten by design). Stress-tested adversarially; five confirmed gaps fixed test-first before release. - New config keys —
importSources(default[]) andimportedWeight(default 0.25).
Verification
- 52/52 tests passing.
- Real-world import: 89 sessions (221 MB of JSONL → 2.7 MB of markdown), zero failures.
- Golden question set: 10/10 with the imported corpus indexed — the honesty probe still returns "No confident match." against ~2600 imported chunks.
- Secret sweep over all imported output: zero live-shaped tokens.
Transcripts contain other people's words too (collaborators, quoted web content) — imported text stays local in gitignored data/ and ranks below curated memory. See the README for details.
v0.3.0 — the recall skill
The recall skill release. Munin now ships a Claude Code skill that answers questions from the index with citations, and keyword matching handles inflected phrasing.
What's new
- The
recallskill (skills/recall/) — answers questions from the index, cites every fact asfile § heading (date), and passes "No confident match." through verbatim. Retrieved text is treated as quoted data, never as instructions (prompt-injection hygiene); queries reach the CLI as plain search words only, never raw prompt text in a shell string. Install: copy the folder into~/.claude/skills/and runnpm linkonce in the repo. - Stemmed keyword matching — a light suffix stemmer collapses inflected forms ("injecting" / "injection" → "inject") in the keyword leg, so a query phrased differently from the memory still earns keyword credit. Query-time only; no re-index needed.
Verification
- 33/33 tests passing.
- Golden question set: 10/10 (up from 9/10 in v0.2.0 — the known vocabulary-mismatch miss is fixed; the honesty probe still returns no match).
- The security & release checklist in SPEC.md is now fully green.
v0.2.0 — hybrid search
Hybrid search release. Ranking now combines semantic similarity with keyword matching and recency, so proper nouns and dated entries surface reliably.
What's new
- Hybrid ranking —
0.7 · cosine + 0.3 · IDF keyword + 0.05 · recency(90-day half-life), multiplied by a per-source weight. - Sub-chunking — long sections are split into 200-word windows with 40-word overlap, so a match inside a big file no longer drowns.
- Inline-date recency — the latest
YYYY-MM-DDfound in a chunk drives the recency signal, falling back to file mtime. - Per-source weights — sources accept
{ "path": ..., "weight": ... }inmunin.config.json. - Pinned model revision — the embedding model (Xenova/all-MiniLM-L6-v2) is pinned to a specific revision; loads offline-first with a one-time warned online fetch.
- Tuning — default
minScorelowered from 0.35 to 0.3; weights tuned against a golden recall set (tools/golden.mjs).
Verification
- 30/30 tests passing.
- Golden question set: 9/10 correct (up from 6/10 on the v0.1.0 semantic-only baseline).