v3.12.0
Changed
-
Rules-block diet + drift gate (ADR-0036). The managed memory-rules
block — paid every session in every project by every wired agent — trimmed
ES 9,746 → 7,979 chars (−18.1%) / EN 9,484 → 7,743 (−18.4%) (~440
tokens/session) with zero rules dropped (Trust section byte-identical)
and two rules rescued from a silently-diverged docs variant ("never
claim to have persisted" when no vault MCP responds; "memory://…is IDE
memory, not the vault"). The redundant long-form tool catalogue defers to
the tool descriptions (canonical since ADR-0035). Three new build gates in
memory-rules-budget.test.mjs: size budget, 13 load-bearing rule phrases
per language that must survive any trim, and a drift assertion pinning
AGENTS.md + both docs install pages to the canonical source (they had
drifted for months under a "keep in sync" comment). Re-run
create-obsidian-memory(or--rules) to refresh installed blocks. -
Fixed-cost diet: schema budget gate + compact KG defaults + compressed
session hook (ADR-0035). The per-session cost every wired agent pays
before calling anything: tool descriptions + server instructions trimmed
10,226 → 7,641 chars (−25%, ~−650 tokens/session/agent) — operator prose
cut, usage guidance and security semantics kept verbatim — and a new
schema-budget.test.mjsfails the build if schema text regrows past
8,000 chars (or any single description past 450).vault_relations/
vault_observationsMCP defaultlimitdrops 200→50 (filter by
category/tag/note instead). The SessionStart hook now compresses the
curated index (100 chars per bullet, word-boundary cut; over-cap prose
dropped whole) instead of blindly truncating at 4,000: measured on the
reference vault, −21% chars with +70% more pointers visible (23 → 39 of
63 — the old cut left 40 entries invisible). Re-runcreate-obsidian-memory
to refresh installed hooks. -
Compact search wire format + MCP default
limit20→10 (ADR-0034). The
mission "make Fable 5 cost like Sonnet 5" (~70% cut) on the memory path:
vault_hybrid_search/vault_fts_searchhits now carry only what an agent
acts on (path,heading/title,snippet, 5-decimalscore) — the
mostly-null ranking diagnostics (bm25_rank,vector_rank,graph_rank,
rerank_score, rawbm25, 19-digitmtime_ns, full-precision score) cost
~20 tokens/hit and ship only under the newexplain: trueparam /
--explainCLI flag. The MCP defaultlimitdrops 20→10 (resolves the
ADR-0032 deferral; tool descriptions now teach 3–5 for targeted recall).
Measured on real-vault recalls: −37.8% wire cost on the default call,
−60% on a broad query that hit the old cap.bench-tokensgains a wire
arm that counts the exact compact JSON response (overhead charged, not
hidden): median wire savings vs whole-note reads = 62% at k=3 / 37% at k=5,
100% answered — CI-gated via the new--assert-wire-savings 0.30. Breaking
only for consumers that parsed the diagnostic fields (none in-repo; pass
explain: trueto get them back). -
Managed rules block: "Keep it cheap (tokens)" grew from a one-liner into a
distilled token-discipline section (ES/EN, ADR-0032) — terse-output rules
from caveman (no filler/tool-call narration/log dumps; technical terms,
commands and exact errors always verbatim; plain prose returns for
security warnings, irreversible confirmations and order-sensitive sequences)
and the YAGNI ladder from ponytail (reuse → stdlib → platform → installed
dep → one line → minimal code; never simplify validation, data-loss error
handling or security; non-trivial logic leaves one runnable check). Plus the
measuredlimitguidance: pass a lowlimit(3–5) on targeted recalls.
Synced acrossmemory-rules.mjs,AGENTS.mdanddocs/{es,en}/install.md. -
Memory report notice now carries the compression-safety rule (from
caveman-compress's safety tests): when condensing notes, compress prose only —
never drop decisions, gotchas, commands, or exact error strings.
Added
vault_edit_filenow rejects self-paste frontmatter duplication (ADR-0033).
Found via a vault-hygiene pass: a past corrupt edit had triplicated a project
note by pasting its own YAML frontmatter (and the rest of the file) back into
its body, growing it to ~53K tokens undetected until a manual audit. The
guard is a targeted, deterministic check — if applying an edit'snewText
would increase how many times the note's own frontmatter block occurs, the
whole call is rejected and the file is left untouched. 3 new tests in
vault-fs.test.mjs.- Token-economy benchmark, measured and CI-gated (ADR-0032). The kit's token
claim ("passage-first reads beat whole-note reads") is now a number, not an
assertion:bench-tokens/json-bench-tokenscompare the top-k
heading + snippetpassagesvault_hybrid_searchreturns against every
ground-truth note read whole, over a new realistically-sized fixture
(evals/tokens/, 16 labelled queries). Methodology distilled from the two
tools evaluated in ADR-0032: caveman's honest control arm (the whole-note arm
pays zero discovery cost, so savings are a floor; median/min/max/stdev
reported, ~4 bytes/token estimator on both arms) and ponytail's completeness
gate (savings only count when every relevant note surfaces in the top-k).
Measured at k=5: 100% answered, median savings 47%, aggregate 56% — and the
per-kind breakdown keeps the honest counterpoint visible (small <2 KB notes
are cheaper read whole). CI gates at--assert-savings 0.40 --assert-answered 0.95; 6 new tests intest_bench_tokens.pyalso pin that
a lowerksaves strictly more without losing answers.