From b4e923c2e757a25bdc18b97db48e2c0157550673 Mon Sep 17 00:00:00 2001 From: Jason Stedwell Date: Wed, 29 Jul 2026 00:08:48 -0500 Subject: [PATCH] =?UTF-8?q?2.3.0=20=E2=80=94=20the=20index=20train:=20loca?= =?UTF-8?q?l-first=20recall=20index,=20incremental=20sweep,=20stemming=20+?= =?UTF-8?q?=20alias=20expansion?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit One schema-bump release (recall-index schema 3, entity-index schema 2; old recall indexes rebuild automatically, no vault migration): - Local-first recall index: the live BM25 index lives in the machine state dir (keyed by endpoint hash); capture's upkeep is a zero-network atomic file write, no advisory lock — replacing the O(vault) GET/PUT-whole-index round trip per write. The vault copy is a snapshot (sweep + session-end) used to seed fresh machines / catch up after another client swept (ECHO_RECALL_SYNC_HOURS, default 24). The read path never PUTs the vault. - Incremental sweep: entity + recall meta carry 16-char content hashes; `sweep --fast` fetches only new/gone/hash-missing notes plus a rotating weekday shard (--all-shards forces everything); deletions drop from both indexes; index-only so no --apply gate. `load` auto-runs it past ECHO_FAST_SWEEP_DAYS (7); doctor reports index freshness. Obsidian-side edits now reach the indexes without manual maintenance. - Stemming + alias expansion: echo_stem.py (conservative Porter-lite, unit- tested families + over-stemming guards) applied at index AND query time; a query fuzzy-matching an entity folds its title/alias vocabulary into the BM25 query at half weight — expansion can only boost docs containing the terms. capture hashes the note's FINAL content (auto-link reordered first). Eval gold set 8 -> 14 queries (6 paraphrases): recall@5/MRR 1.00/1.00 vs keyword baseline 0.75/0.79. +3 unit tests, +10 e2e; test harnesses now isolate ECHO_STATE_DIR. All seven suites green. Co-Authored-By: Claude Fable 5 --- CHANGELOG.md | 52 ++++++ README.md | 13 +- echo-memory.plugin | Bin 195895 -> 202666 bytes .../.claude-plugin/plugin.json | 2 +- .../skills/echo-memory/SKILL.md | 2 + .../skills/echo-memory/scripts/echo.py | 25 ++- .../skills/echo-memory/scripts/echo_doctor.py | 12 ++ .../skills/echo-memory/scripts/echo_index.py | 14 +- .../skills/echo-memory/scripts/echo_ops.py | 33 ++-- .../skills/echo-memory/scripts/echo_recall.py | 174 ++++++++++++++---- .../echo-memory/scripts/echo_session.py | 12 ++ .../skills/echo-memory/scripts/echo_stem.py | 78 ++++++++ .../skills/echo-memory/scripts/sweep.py | 138 +++++++++++++- .../echo-memory/scripts/test_echo_client.py | 36 ++++ eval/results/latest.json | 10 +- eval/run_eval.py | 10 + eval/test_features.py | 64 ++++++- eval/test_patch_semantics.py | 4 +- eval/test_reflect.py | 4 +- 19 files changed, 611 insertions(+), 72 deletions(-) create mode 100644 echo-memory.plugin.src/skills/echo-memory/scripts/echo_stem.py diff --git a/CHANGELOG.md b/CHANGELOG.md index f7a0295..245f274 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,57 @@ # Changelog +## 2.3.0 + +**The index train** (IMPROVEMENT-PLANS #2/#4/#8) — one schema-bump release: +recall-index schema 3, entity-index schema 2. Old recall indexes are discarded +and rebuilt automatically (sub-second); no vault migration. + +### Changed — the recall index is LOCAL-FIRST + +The live BM25 index moves out of the vault into the machine state dir +(`recall-index-.json` under `ECHO_STATE_DIR`). Capture's index +upkeep — previously GET-whole-index → PUT-whole-index against the vault under +the advisory lock, an O(vault) network round trip per write — is now a +zero-network atomic file write with no lock at all. The vault copy at +`_agent/index/recall-index.json` becomes a **snapshot**: written by +`sweep --apply` and best-effort at `session-end`, read only to seed a fresh +machine or to catch up after another client swept (checked at most every +`ECHO_RECALL_SYNC_HOURS`, default 24). The read path never PUTs the vault. + +### Added — incremental sweep (`sweep --fast`) + content hashes + +Entity-index entries and recall-index doc meta now carry a 16-char content +hash. `sweep --fast` walks the listing (cheap) and fetches only what is new, +gone, missing a hash, or in **today's rotating verification shard** +(`hash(path) % 7 == weekday` — the whole vault gets verified across a week of +fast sweeps while each run stays tiny; `--all-shards` forces everything). +Index-only and machine-owned, so no `--apply` gate; deletions are dropped from +both indexes. **`load` auto-runs it** when this machine's last sweep is older +than `ECHO_FAST_SWEEP_DAYS` (default 7) — edits made directly in Obsidian or by +other clients now reach the indexes without anyone remembering maintenance. +`doctor` reports index freshness. + +### Added — stemming + alias query expansion + +`echo_stem.py`: a conservative Porter-lite stemmer applied by `tokenize()` at +BOTH index and query time, so "deployed"/"deployment"/"deploys" meet at +"deploy" and "penalties" finds "penalty" (guards against over-stemming: "sing" +is not "s"; the -al/d~s irregulars are deliberately not conflated). At recall +time, a query that fuzzy-matches an entity (score ≥ 0.5) folds that entity's +title/alias vocabulary into the BM25 query at **half weight** — "turbokappa +tuning" finds the Kappa Engine note even though the alias appears in no body. +Expansion can only boost documents that actually contain the terms. + +### Eval + +Gold set grows 8 → **14 queries** (6 paraphrases the pre-2.3 lexical index +missed). v2.3.0: recall@5 / MRR **1.00 / 1.00**, 3/3 session-journal queries; +keyword baseline 0.75 / 0.79 and 0/3. Tests: +3 unit (stemmer families, +over-stemming guards, hash), +10 end-to-end (local-first no-snapshot-write, +local recallability, stemmed recall, alias expansion, fast-sweep pickup/ +deletion/hash backfill). All suites — including the offline-queue, ops-api, +and MCP server suites — green; test harnesses now isolate `ECHO_STATE_DIR`. + ## 2.2.0 ### Added — echo-mcp: the containerized MCP server diff --git a/README.md b/README.md index 4600b50..9ef4564 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# echo-memory — v2.2.0 +# echo-memory — v2.3.0 Persistent memory for Claude / CoWork sessions via the **ECHO** Obsidian vault, driven over the [Obsidian Local REST API](https://github.com/coddingtonbear/obsidian-local-rest-api). The skill makes direct REST calls through a bundled validated client (`scripts/echo.py`). The whole toolchain is **pure Python** (stdlib only), so it runs identically on Windows, macOS, and Linux — no bash, no platform-specific `date`. @@ -403,14 +403,14 @@ If the API returns a connection error, timeout, or `502` (usually Obsidian / the --- -## Eval metrics (v1.5.1, 2026-07-03) +## Eval metrics (v2.3.0, 2026-07-29) -From the credential-free harness (`eval/run_eval.py` against the deterministic mock — no live vault; full detail in `eval/results/latest.json`). Baseline = pre-1.5 behavior: keyword substring ranking over entity notes only, no gate. +From the credential-free harness (`eval/run_eval.py` against the deterministic mock — no live vault; full detail in `eval/results/latest.json`). Baseline = pre-1.5 behavior: keyword substring ranking over entity notes only, no gate. The gold set grew to **14 queries in 2.3** — six are paraphrases (morphological variants like "penalties in the SLA" vs a note saying "penalty clause") that a purely lexical index misses; the stemmed index answers all of them. -| Metric | v1.5.1 | pre-1.5 baseline | +| Metric | v2.3.0 | pre-1.5 baseline | |---|---|---| -| Retrieval recall@5 / MRR (8-query gold set) | **1.00 / 1.00** | 0.75 / 0.75 | -| Queries answerable only from sessions/journal | **2/2** | 0/2 (not in corpus) | +| Retrieval recall@5 / MRR (14-query gold set incl. 6 paraphrases) | **1.00 / 1.00** | 0.75 / 0.79 | +| Queries answerable only from sessions/journal | **3/3** | 0/3 (not in corpus) | | Freshness: live note outranks stale archived twin | **yes** | no | | Duplicate notes created (3 renamed-entity captures) | **0** (gate blocks) | 3 | | Legitimate captures wrongly blocked | **0** | 0 | @@ -421,6 +421,7 @@ From the credential-free harness (`eval/run_eval.py` against the deterministic m | Version | Highlights | |---------|-----------| +| **2.3.0** | **The index train (recall-index schema 3, entity-index schema 2).** (1) **Local-first recall index** — the live BM25 index moves to the machine state dir (keyed by endpoint); capture's index upkeep becomes a zero-network atomic file write instead of GET/PUT-whole-index under the vault lock; the vault copy is now a snapshot (written by sweep + session-end) that seeds fresh machines. (2) **Incremental sweep** — entity entries carry a content hash; `sweep --fast` fetches only new/gone/changed notes plus a rotating weekday shard (whole vault verified across a week); auto-runs at load when >`ECHO_FAST_SWEEP_DAYS` (7) — Obsidian-side edits now reach the indexes without manual maintenance. (3) **Stemming + alias expansion** — `echo_stem` (Porter-lite, conservative) applied at index+query time, and a query matching an entity's alias folds its title/alias vocabulary in at half weight. Eval gold set grows to 14 queries (6 paraphrases): recall@5 / MRR **1.00 / 1.00**. | | **2.2.0** | **echo-mcp — the containerized MCP server.** ECHO as 14 typed MCP tools from any connector-capable surface (Claude Code, CoWork, claude.ai): `mcp-server/` + Dockerfile in-repo, deployed on ALPHA as `echo-mcp` behind `https://echomcp.alwisp.com` (streamable HTTP, stateless JSON, bearer auth, open `/health`). Talks to the Obsidian REST API directly on the LAN (`10.2.0.35:27123`) — one client round trip per tool call, all vault chatter host-local. Duplicate gate & offline queueing surface as data; `ECHO_MCP_TOOLS=core` trims the surface to six tools; writes serialize server-side. New `eval/test_mcp_server.py` e2e suite. Full spec: `docs/MCP-SERVER-SPEC.md`. | | **2.1.1** | **MCP Phase 0 — return-not-print.** Every high-level op gains a core `*_op` function returning an envelope dict with a stdout-purity guarantee (helper chatter → stderr); CLI verbs become thin wrappers with identical output and exit codes. Duplicate gate and offline queueing become data (`action: duplicate-gate` / `queued: true`). New `eval/test_ops_api.py` contract suite. This is the seam the 2.2 containerized MCP server wraps. | | **2.1.0** | **Quick-wins train: cheaper sessions, durable capture, one-call session end.** (1) **`load --brief`** — a token-budgeted cold-start digest (Fact/Pattern in full, last ~10 Observations, scope+freshness, last session's key sections, Agent-Log lines, inbox *count*; `ECHO_LOAD_BUDGET` default ~8000 chars) now injected by the SessionStart hook, replacing the full six-file dump that grew unboundedly; all `load` reads are fetched in parallel. (2) **Offline capture durability** — `capture` on an unreachable vault queues the *whole operation* as one semantic record; `flush` replays it **through capture** so routing/gate/aliasing re-run against the current index; a gate stop on replay is kept + flagged, never landed blind; `ensure_daily_log`/update-path writes ride the queue too. (3) **`session-end`** — one call (one lock) writes session log → Agent-Log line → reflect proposals → optional scope switch → **heartbeat last as the commit marker**; dry-run by default; `ECHO_NOW` pins the HHMM. Also fixes the `__main__` twin-module trap so helper-module `EchoError`s exit with their intended codes. +19 end-to-end checks. | diff --git a/echo-memory.plugin b/echo-memory.plugin index 0abcaaa8c692a69abf586bd16eed0eac5cb9de84..fe15c350eb32b42e8f0d62fa445110367c3b94fd 100644 GIT binary patch delta 74142 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 #0!%pZ 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 str | None: + """Opportunistic index maintenance at load (2.3): when this machine's last fast + sweep is older than ECHO_FAST_SWEEP_DAYS (default 7), run `sweep --fast` so the + local recall + entity indexes true up against edits made by Obsidian or other + clients. Best-effort; skipped offline; never raises.""" + if offline: + return None + try: + import sweep as sweep_mod + days = float(os.environ.get("ECHO_FAST_SWEEP_DAYS", "7")) + age = sweep_mod.fast_sweep_age_days() + if age is not None and age < days: + return None + return sweep_mod.fast() + except Exception: # noqa: BLE001 — maintenance must never block a load + return None + + def _fetch_pointed_session(texts: dict) -> None: """Follow the heartbeat pointer and stash the pointed session log for the digest.""" hb = texts.get("heartbeat") @@ -818,9 +836,10 @@ def load_op(brief: bool = True) -> dict: targets = LOAD_TARGETS + [("today", f"journal/daily/{today()}.md"), ("inbox", "inbox/captures/inbox.md")] _, texts, listing_files, offline, marker_missing, _ = _load_gather(targets) + swept = _auto_fast_sweep(offline) data = {"ok": True, "action": "load", "offline": offline, "marker_missing": marker_missing, "synced": synced, - "needs_attention": flagged, + "needs_attention": flagged, "fast_sweep": swept, "sections": {k: v for k, v in texts.items() if not k.startswith("_")}, "recent_sessions": sorted((f for f in listing_files if f.endswith(".md")), reverse=True)[:5]} @@ -863,6 +882,10 @@ def cmd_load(brief: bool = False) -> int: results, texts, listing_files, offline, marker_missing, heartbeat_absent = \ _load_gather(targets) + swept = _auto_fast_sweep(offline) + if swept: + print(f"({swept})\n") + if brief: _fetch_pointed_session(texts) print(_render_brief(texts, listing_files, offline)) diff --git a/echo-memory.plugin.src/skills/echo-memory/scripts/echo_doctor.py b/echo-memory.plugin.src/skills/echo-memory/scripts/echo_doctor.py index e308768..093a76a 100644 --- a/echo-memory.plugin.src/skills/echo-memory/scripts/echo_doctor.py +++ b/echo-memory.plugin.src/skills/echo-memory/scripts/echo_doctor.py @@ -74,6 +74,18 @@ def run_op() -> dict: else: line(status < 400, "marker fetch", f"HTTP {status}") + # Index freshness (2.3) — informational, never red: how stale this machine's + # local indexes are (the fast sweep trues them up at load past 7 days). + if fatal is None: + try: + import sweep as sweep_mod + age = sweep_mod.fast_sweep_age_days() + line(True, "index freshness", + f"last local sweep {age:.1f}d ago" if age is not None + else "no local sweep yet — runs automatically at the next load") + except Exception: # noqa: BLE001 + pass + reds = sum(1 for c in checks if not c["ok"]) return {"ok": reds == 0 and fatal is None, "action": "doctor", "endpoint": cfg["endpoint"], "fatal": fatal, "reds": reds, "checks": checks} diff --git a/echo-memory.plugin.src/skills/echo-memory/scripts/echo_index.py b/echo-memory.plugin.src/skills/echo-memory/scripts/echo_index.py index 94e0f5e..4c95fa6 100644 --- a/echo-memory.plugin.src/skills/echo-memory/scripts/echo_index.py +++ b/echo-memory.plugin.src/skills/echo-memory/scripts/echo_index.py @@ -168,7 +168,10 @@ def kind_for_path(path: str) -> str | None: def empty_index() -> dict: - return {"schema": 1, "updated": echo.today(), "entities": {}} + # Schema 2 (2.3): entries may carry `h`, a short content hash of the note body — + # the incremental sweep's change detector. Tolerated-absent (schema-1 entries + # simply get fetched and hashed on their first fast sweep). + return {"schema": 2, "updated": echo.today(), "entities": {}} def load() -> dict: @@ -287,13 +290,20 @@ def gate_candidates(index: dict, mention: str, kind: str | None = None, return out +def content_hash(text: str) -> str: + import hashlib + return hashlib.sha1(str(text).encode("utf-8", "replace")).hexdigest()[:16] + + def upsert(index: dict, slug: str, path: str, kind: str, title: str | None = None, - aliases=None) -> dict: + aliases=None, h: str | None = None) -> dict: ents = index.setdefault("entities", {}) e = ents.get(slug, {}) e["path"] = path e["kind"] = kind e["title"] = title or e.get("title") or slug + if h: + e["h"] = h # Keep any prior + explicit aliases, and ALWAYS fold in the safe title variants so a # hyphen/space/case form of the name resolves even if no one passed --aliases. Drop any # alias that just equals the slug (resolve already checks the slug). diff --git a/echo-memory.plugin.src/skills/echo-memory/scripts/echo_ops.py b/echo-memory.plugin.src/skills/echo-memory/scripts/echo_ops.py index d63e7bc..3fedd92 100644 --- a/echo-memory.plugin.src/skills/echo-memory/scripts/echo_ops.py +++ b/echo-memory.plugin.src/skills/echo-memory/scripts/echo_ops.py @@ -333,15 +333,11 @@ def capture_op(kind: str | None, title: str, file_arg: str | None = None, status echo.cmd_put(path, echo.temp_file(note.encode())) action = "created" - # H3: the entity-index write is the race the review flagged — a bare load->save lets - # two concurrent captures clobber each other's entry. Route it through a lock-guarded, - # fresh-re-read transaction. Returns the fresh index (used by auto-link below). - import echo_concurrency - index = echo_concurrency.atomic_index_update( - lambda idx: idx_mod.upsert(idx, slug, path, kind, index_title, index_aliases)) - - # auto-link: any other known entity CONFIDENTLY named in the body (M2: is_confident_link - # rejects short/common tokens so a 3-char alias or a word like "API" can't link everywhere). + # auto-link FIRST (it mutates the note's ## Related section), so the content + # hash stored below reflects the note's final state. Uses the pre-update index + # — it only needs to find OTHER entities named in the body. (M2: is_confident_link + # rejects short/common tokens so a 3-char alias or a word like "API" can't link + # everywhere.) linked = 0 for s2, e2 in index.get("entities", {}).items(): if e2.get("path") in (None, path): @@ -351,11 +347,24 @@ def capture_op(kind: str | None, title: str, file_arg: str | None = None, status ca, cb = links.link_bidirectional(path, e2["path"]) linked += int(ca or cb) - # Keep the BM25 recall index current for this note (best-effort; lock-guarded inside - # update_note, so it can't clobber a concurrent writer either). + # The note's final content: hashed into the entity index (the incremental + # sweep's change detector, 2.3) and fed to the local recall index. + final_text = links.get_text(path) or "" + note_h = idx_mod.content_hash(final_text) if final_text else None + + # H3: the entity-index write is the race the review flagged — a bare load->save lets + # two concurrent captures clobber each other's entry. Route it through a lock-guarded, + # fresh-re-read transaction. + import echo_concurrency + index = echo_concurrency.atomic_index_update( + lambda idx: idx_mod.upsert(idx, slug, path, kind, index_title, index_aliases, + h=note_h)) + + # Keep the local BM25 recall index current for this note (best-effort; a + # zero-network atomic file write since 2.3). try: import echo_recall - echo_recall.update_note(path, links.get_text(path) or "") + echo_recall.update_note(path, final_text) except Exception as exc: # never let recall-index upkeep fail a capture print(f"echo_ops: recall-index update skipped ({exc})", file=sys.stderr) diff --git a/echo-memory.plugin.src/skills/echo-memory/scripts/echo_recall.py b/echo-memory.plugin.src/skills/echo-memory/scripts/echo_recall.py index bb172c3..44ba758 100644 --- a/echo-memory.plugin.src/skills/echo-memory/scripts/echo_recall.py +++ b/echo-memory.plugin.src/skills/echo-memory/scripts/echo_recall.py @@ -52,9 +52,17 @@ sys.path.insert(0, str(Path(__file__).resolve().parent)) import echo # noqa: E402 import echo_index as idx_mod # noqa: E402 import echo_links as links # noqa: E402 +import echo_stem # noqa: E402 RECALL_INDEX_PATH = "_agent/index/recall-index.json" -INDEX_SCHEMA = 2 # bumped: schema 2 adds per-doc meta (weight/updated/status) +# Schema 3 (2.3, the "index train"): postings are STEMMED (echo_stem), per-doc meta +# gains a content hash `h` (incremental sweep), and the index carries a `built` +# stamp + endpoint hash. The LIVE index is LOCAL-FIRST — it lives in the state dir +# and is updated with zero vault round-trips; the vault copy at RECALL_INDEX_PATH +# is a snapshot written by sweep/session-end, used to seed fresh machines. Older +# schemas are discarded and rebuilt (sub-second since the 1.1 network work). +INDEX_SCHEMA = 3 +SYNC_HOURS = float(os.environ.get("ECHO_RECALL_SYNC_HOURS", "24")) # Tuning knobs. Defaults are standard BM25 (k1/b) + a 0.6 hop decay over <=2 hops. K1 = 1.5 @@ -131,8 +139,11 @@ _SKIP_BASENAMES = {"README.md"} def tokenize(text: str) -> list[str]: - """Lowercase word tokens, stopworded. Frontmatter should be stripped by the caller.""" - return [t for t in _WORD.findall(text.lower()) if t not in _STOP and len(t) > 1] + """Lowercase word tokens, stopworded, STEMMED (2.3) — applied identically at + index and query time, so 'deployed'/'deployment' meet at 'deploy'. + Frontmatter should be stripped by the caller.""" + return [echo_stem.stem(t) for t in _WORD.findall(text.lower()) + if t not in _STOP and len(t) > 1] def strip_frontmatter(text: str) -> str: @@ -152,9 +163,10 @@ class Bm25Index: self.df: Counter[str] = Counter() # term -> #docs containing it self.postings: dict[str, dict[str, int]] = {} # term -> {doc_path: tf} self.length: dict[str, int] = {} # doc_path -> token count - self.meta: dict[str, dict] = {} # doc_path -> {w, u, s} priors + self.meta: dict[str, dict] = {} # doc_path -> {w, u, s, h} priors self.n_docs = 0 self.avg_len = 0.0 + self.built = "" # ISO stamp of last full (re)build def _recompute(self) -> None: self.n_docs = len(self.length) @@ -165,12 +177,19 @@ class Bm25Index: self.remove(path) toks = tokenize(strip_frontmatter(raw_text)) self.length[path] = len(toks) - self.meta[path] = doc_meta(path, raw_text) + meta = doc_meta(path, raw_text) + # Content hash: the incremental sweep's change detector (2.3). + import hashlib + meta["h"] = hashlib.sha1(raw_text.encode("utf-8", "replace")).hexdigest()[:16] + self.meta[path] = meta for term, tf in Counter(toks).items(): self.postings.setdefault(term, {})[path] = tf self.df[term] += 1 self._recompute() + def content_hash(self, path: str) -> str | None: + return (self.meta.get(path) or {}).get("h") + def remove(self, path: str) -> None: if path not in self.length: return @@ -192,11 +211,17 @@ class Bm25Index: * freshness(m.get("u"), today_s) * STATUS_FACTOR.get(m.get("s", ""), 1.0)) - def score(self, query: str, limit: int = 10, - today_s: str | None = None) -> list[tuple[str, float]]: + def score(self, query: str, limit: int = 10, today_s: str | None = None, + extra_terms: dict[str, float] | None = None) -> list[tuple[str, float]]: + """BM25 x priors. `extra_terms` (term -> weight) are alias-expansion terms + (2.3): they contribute at reduced weight and can only boost documents that + actually contain them — expansion never invents corpus-free hits.""" today_s = today_s or echo.today() + weighted: dict[str, float] = {t: 1.0 for t in set(tokenize(query))} + for t, w in (extra_terms or {}).items(): + weighted.setdefault(t, w) scores: Counter[str] = Counter() - for term in set(tokenize(query)): + for term, weight in weighted.items(): posting = self.postings.get(term) if not posting: continue @@ -204,26 +229,29 @@ class Bm25Index: for path, tf in posting.items(): dl = self.length.get(path, 0) denom = tf + K1 * (1 - B + B * (dl / self.avg_len if self.avg_len else 1)) - scores[path] += idf * (tf * (K1 + 1) / denom if denom else 0) + scores[path] += weight * idf * (tf * (K1 + 1) / denom if denom else 0) fused = {p: s * self._doc_factor(p, today_s) for p, s in scores.items()} ranked = sorted(fused.items(), key=lambda kv: -kv[1])[:limit] return [(p, s) for p, s in ranked if s > MIN_SCORE] # ---- serialization (compact; rebuildable, so the format can change freely) ---- def to_json(self) -> dict: - return {"schema": INDEX_SCHEMA, "n_docs": self.n_docs, "avg_len": self.avg_len, - "length": self.length, "postings": self.postings, "meta": self.meta} + return {"schema": INDEX_SCHEMA, "built": self.built, "n_docs": self.n_docs, + "avg_len": self.avg_len, "length": self.length, + "postings": self.postings, "meta": self.meta} @classmethod def from_json(cls, d: dict) -> "Bm25Index": if d.get("schema") != INDEX_SCHEMA: return cls() # older/newer format -> empty; recall's cold path rebuilds + # (a pre-stemming index MUST NOT be reused: its postings are unstemmed) ix = cls() ix.length = d.get("length", {}) ix.postings = d.get("postings", {}) ix.meta = d.get("meta", {}) ix.n_docs = d.get("n_docs", len(ix.length)) ix.avg_len = d.get("avg_len", 0.0) + ix.built = d.get("built", "") ix.df = Counter({term: len(posting) for term, posting in ix.postings.items()}) return ix @@ -271,27 +299,84 @@ def _indexable(path: str) -> bool: # ------------------------------------------------------------------- persistence -def load_index() -> Bm25Index: - status, body = echo.request("GET", echo.vault_url(RECALL_INDEX_PATH)) - if status == 404: - return Bm25Index() - echo.check(status, body, "recall-index load") +# LOCAL-FIRST (2.3). The live index is a machine-local file — updating it on capture +# is a zero-network atomic file write instead of GET-whole-index -> PUT-whole-index +# under the vault lock (the old per-write O(vault) round trip). The vault copy is a +# SNAPSHOT: written by sweep (and best-effort at session end), read only to seed a +# fresh machine or to catch up after another client swept (checked at most every +# ECHO_RECALL_SYNC_HOURS). Staleness across clients is tolerable — recall degrades +# gracefully and the fast sweep trues it up. + +def _local_path() -> Path: + import hashlib + import echo_queue + h = hashlib.sha1((echo.BASE or "").encode()).hexdigest()[:12] + return echo_queue.state_dir() / f"recall-index-{h}.json" + + +def _load_local() -> Bm25Index | None: + p = _local_path() + if not p.exists(): + return None try: + return Bm25Index.from_json(json.loads(p.read_text(encoding="utf-8"))) + except (json.JSONDecodeError, KeyError, TypeError, OSError): + return None + + +def save_local(ix: Bm25Index) -> None: + p = _local_path() + p.parent.mkdir(parents=True, exist_ok=True) + tmp = p.with_suffix(".json.tmp") + tmp.write_text(json.dumps(ix.to_json(), ensure_ascii=False), encoding="utf-8") + os.replace(tmp, p) # atomic: a crash mid-write can't corrupt the live index + + +def _fetch_snapshot() -> Bm25Index | None: + try: + status, body = echo.request("GET", echo.vault_url(RECALL_INDEX_PATH)) + if status != 200: + return None return Bm25Index.from_json(json.loads(body)) - except (json.JSONDecodeError, KeyError, TypeError): - return Bm25Index() + except Exception: # noqa: BLE001 — the snapshot is an optimization, never required + return None -def save_index(ix: Bm25Index) -> None: +def save_snapshot(ix: Bm25Index) -> None: + """PUT the vault snapshot — sweep + session-end only, never the per-capture path.""" body = json.dumps(ix.to_json(), ensure_ascii=False).encode("utf-8") status, b = echo.request("PUT", echo.vault_url(RECALL_INDEX_PATH), data=body, headers={"Content-Type": "application/json"}) - echo.check(status, b, "recall-index save") + echo.check(status, b, "recall-index snapshot save") -def rebuild(prefetched: dict | None = None) -> Bm25Index: - """Full rebuild from every indexable entity note. Called by sweep.py and as the - cold-cache path inside recall(). Saves and returns the index. +def load_index() -> Bm25Index: + """The live index: local file first; the vault snapshot only seeds a fresh + machine or replaces a local copy that a newer sweep elsewhere has superseded + (checked when the local build stamp is older than SYNC_HOURS).""" + local = _load_local() + if local and local.n_docs: + try: + age_ok = local.built and ( + _dt.datetime.now(_dt.timezone.utc) + - _dt.datetime.strptime(local.built, "%Y-%m-%dT%H:%M:%SZ").replace( + tzinfo=_dt.timezone.utc) + ).total_seconds() < SYNC_HOURS * 3600 + except ValueError: + age_ok = False + if age_ok: + return local + snap = _fetch_snapshot() + if snap and snap.n_docs and (not local or (snap.built or "") > (local.built or "")): + save_local(snap) + return snap + return local or Bm25Index() + + +def rebuild(prefetched: dict | None = None, snapshot: bool = False) -> Bm25Index: + """Full rebuild from every indexable note. Saves the LOCAL index always; writes + the vault snapshot only when `snapshot=True` (sweep) — the read path never + surprises the vault with a PUT. `prefetched` (a {path: text} map, e.g. from echo.read_many) lets sweep.py reuse the content it already pulled instead of walking and re-fetching the whole vault again.""" @@ -299,27 +384,30 @@ def rebuild(prefetched: dict | None = None) -> Bm25Index: if prefetched is not None: items = ((p, t) for p, t in prefetched.items() if _indexable(p)) else: - items = ((p, _get(p)) for p in _walk() if _indexable(p)) + items = echo.read_many([p for p in _walk() if _indexable(p)]).items() for path, text in items: if text is not None: ix.add(path, text) # add() strips frontmatter + extracts doc meta itself - save_index(ix) + ix.built = echo.now_iso() + save_local(ix) + if snapshot: + save_snapshot(ix) return ix def update_note(path: str, text: str) -> None: - """Best-effort incremental upkeep for a single note (mirrors how entities.json is - maintained on capture). Never raises into the caller. The load->save is wrapped in the - advisory lock with a fresh re-read (H3), so concurrent captures can't clobber the - recall index either.""" + """Best-effort incremental upkeep for a single note — a LOCAL atomic file write, + no vault round-trip, no advisory lock (2.3). Maintains an existing local index + only: with no local index yet, the next recall's cold path (or a sweep) builds + one, and a one-note index must never shadow the snapshot. Never raises.""" try: if not _indexable(path): - return # only entity notes are part of the recall corpus - import echo_concurrency - with echo_concurrency.vault_lock(): - ix = load_index() # fresh read inside the lock - ix.add(path, text) # raw text: add() strips + extracts meta - save_index(ix) + return # only corpus notes are part of the recall index + ix = _load_local() + if ix is None or not ix.n_docs: + return + ix.add(path, text) # raw text: add() strips + extracts meta + save_local(ix) except Exception as exc: # noqa: BLE001 — upkeep must never fail a capture print(f"echo_recall: index update skipped ({exc})", file=sys.stderr) @@ -405,13 +493,27 @@ def recall_op(query, limit: int = 8) -> dict: index = idx_mod.load() nmap = idx_mod.name_map(index) + # --- alias query expansion (2.3): a query phrased by an entity's alias or a + # partial name folds that entity's title/alias vocabulary into the BM25 query at + # half weight — "the ECHO plugin" also scores `echo-memory` terms. Expansion can + # only boost documents that actually contain the terms. + extra_terms: dict[str, float] = {} + q_toks = set(tokenize(q)) + for _slug, e, sc in idx_mod.fuzzy_candidates(index, q)[:2]: + if sc < 0.5: + continue + for name in (e.get("title", ""), _slug, *e.get("aliases", [])): + for tok in tokenize(str(name).replace("-", " ")): + if tok not in q_toks: + extra_terms[tok] = 0.5 + # --- lexical layer (BM25); rebuild the cache on a cold miss -------------- lexical: list[tuple[str, float]] = [] try: ix = load_index() if ix.n_docs == 0: ix = rebuild() - lexical = ix.score(q, limit=limit, today_s=today_s) + lexical = ix.score(q, limit=limit, today_s=today_s, extra_terms=extra_terms) except echo.EchoError as exc: print(f"recall: BM25 index unavailable ({exc}); falling back to server search", file=sys.stderr) diff --git a/echo-memory.plugin.src/skills/echo-memory/scripts/echo_session.py b/echo-memory.plugin.src/skills/echo-memory/scripts/echo_session.py index c650b90..8ff1e10 100644 --- a/echo-memory.plugin.src/skills/echo-memory/scripts/echo_session.py +++ b/echo-memory.plugin.src/skills/echo-memory/scripts/echo_session.py @@ -135,6 +135,18 @@ def session_end_op(bundle: dict, apply: bool = False) -> dict: echo.cmd_put("_agent/heartbeat/last-session.md", echo.temp_file(f"{path} @ {echo.now_iso()}\n".encode("utf-8"))) steps["heartbeat"] = "ok" + # Index maintenance (2.3), NOT part of the bundle contract: push this + # machine's local recall index to the vault snapshot so other machines + # can seed/catch up. Best-effort — a failure never taints the bundle. + try: + import echo_recall + rix = echo_recall._load_local() + if rix and rix.n_docs: + rix.built = rix.built or echo.now_iso() + echo_recall.save_snapshot(rix) + steps["recall_snapshot"] = "ok" + except Exception: # noqa: BLE001 + steps["recall_snapshot"] = "skipped" data["steps"] = steps return echo_output.envelope("session-end", data) diff --git a/echo-memory.plugin.src/skills/echo-memory/scripts/echo_stem.py b/echo-memory.plugin.src/skills/echo-memory/scripts/echo_stem.py new file mode 100644 index 0000000..7f5234e --- /dev/null +++ b/echo-memory.plugin.src/skills/echo-memory/scripts/echo_stem.py @@ -0,0 +1,78 @@ +#!/usr/bin/env python3 +"""echo_stem.py — a deliberately light, dependency-free English stemmer. [2.3] + +BM25 is purely lexical: "deploy", "deployed", and "deployment" are three unrelated +terms to it, so a paraphrased recall query misses notes stored with a different +inflection. This Porter-LITE stemmer conflates the common inflection families while +staying conservative — when in doubt it leaves the token alone, because an +over-stemmed index silently merges unrelated words (far worse than a missed match). + +Applied by echo_recall.tokenize() at BOTH index and query time (recall-index +schema 3; older indexes are discarded and rebuilt). Pure function, unit-tested in +test_echo_client.py. + +Design notes: + * plural / -ed / -ing families first (with the classic restore rules: doubled + consonant undoubling, at/bl/iz +e, cvc +e), then one derivational suffix pass, + then y->i and final-e normalization so "navigate"/"navigation"/"navigating" + all land on "navigat". + * every rule guards a minimum remaining stem length — "sing" is not "s". +""" +from __future__ import annotations + +import re + +_VOWEL = re.compile(r"[aeiouy]") +_DOUBLE = re.compile(r"([^aeiouylsz])\1$") +_CVC = re.compile(r"[^aeiou][aeiouy][^aeiouwxy]$") + +# One derivational pass, most-specific first. Replacements keep families together: +# navigational/navigation -> navigat · saturation/saturated -> saturat · +# deployment/deployed -> deploy · usefulness/useful -> use... (guarded by length). +_SUFFIXES = ( + ("ization", "ize"), ("ational", "ate"), ("fulness", "ful"), ("ousness", "ous"), + ("iveness", "ive"), ("tional", "t"), ("biliti", "ble"), ("ements", ""), + ("ment", ""), ("ness", ""), ("tion", "t"), ("sion", "s"), ("ance", ""), + ("ence", ""), ("able", ""), ("ible", ""), ("ally", "al"), ("ously", "ous"), + ("ively", "ive"), ("ly", ""), +) + + +def stem(t: str) -> str: + """Stem one lowercase token. Never raises; returns the token unchanged when no + rule applies safely.""" + if len(t) <= 3 or not t.isascii(): + return t + # --- plurals ------------------------------------------------------------- + if t.endswith("sses"): + t = t[:-2] + elif t.endswith("ies") and len(t) > 4: + t = t[:-3] + "i" + elif t.endswith("s") and not t.endswith(("ss", "us", "is")): + t = t[:-1] + # --- -ed / -ing (with restore rules) -------------------------------------- + for suf in ("ingly", "edly", "ing", "ed"): + if t.endswith(suf): + base = t[: -len(suf)] + if len(base) >= 3 and _VOWEL.search(base): + t = base + if t.endswith(("at", "bl", "iz")): + t += "e" + elif _DOUBLE.search(t): + t = t[:-1] + elif len(t) == 3 and _CVC.search(t): + t += "e" + break + # --- one derivational suffix pass ----------------------------------------- + for suf, rep in _SUFFIXES: + if t.endswith(suf): + base = t[: -len(suf)] + if len(base) >= 3 and len(base + rep) >= 3: + t = base + rep + break + # --- normalize: y->i (so penalty/penalties agree), then drop a final e ----- + if len(t) > 3 and t.endswith("y") and t[-2] not in "aeiou": + t = t[:-1] + "i" + if len(t) > 4 and t.endswith("e"): + t = t[:-1] + return t diff --git a/echo-memory.plugin.src/skills/echo-memory/scripts/sweep.py b/echo-memory.plugin.src/skills/echo-memory/scripts/sweep.py index a645790..a0a56db 100644 --- a/echo-memory.plugin.src/skills/echo-memory/scripts/sweep.py +++ b/echo-memory.plugin.src/skills/echo-memory/scripts/sweep.py @@ -18,9 +18,19 @@ backfill what older vaults don't have yet: 5. stamp the marker `schema_version` to the current schema (4). Dry-run by default; pass --apply to write. READ-ONLY without --apply. + +**--fast (2.3)** is the incremental mode: it walks the listing (cheap), then fetches +only what's new, gone, missing a content hash, or in today's rotating verification +shard (hash(path) % 7 == weekday — the whole vault gets verified over a week of +fast sweeps while each run stays tiny; --all-shards forces everything). It updates +the LOCAL recall index and the entity index (both machine-owned), so it needs no +--apply gate and writes no notes. `load` auto-runs it when the last fast sweep is +older than ECHO_FAST_SWEEP_DAYS (default 7). This is what keeps the indexes honest +against edits made directly in Obsidian or by other clients. + Cross-platform: pure Python via echo.py. -Usage: sweep.py [--apply] +Usage: sweep.py [--apply] | sweep.py --fast [--all-shards] """ from __future__ import annotations @@ -102,10 +112,128 @@ def walk(prefix: str = ""): yield from walk(f"{prefix}{d}/") +def _stamp_path() -> Path: + import echo_queue + return echo_queue.state_dir() / "fast-sweep.stamp" + + +def _stamp_fast_sweep() -> None: + try: + p = _stamp_path() + p.parent.mkdir(parents=True, exist_ok=True) + p.write_text(echo.now_iso() + "\n", encoding="utf-8") + except OSError: + pass + + +def fast_sweep_age_days() -> float | None: + """Days since the last fast/full sweep on THIS machine, or None if never.""" + import datetime as dt + try: + stamp = _stamp_path().read_text(encoding="utf-8").strip() + then = dt.datetime.strptime(stamp, "%Y-%m-%dT%H:%M:%SZ").replace(tzinfo=dt.timezone.utc) + return (dt.datetime.now(dt.timezone.utc) - then).total_seconds() / 86400 + except (OSError, ValueError): + return None + + +def fast(all_shards: bool = False) -> str: + """Incremental index maintenance (2.3): true up the LOCAL recall index and the + entity index against the vault, fetching only new / gone / hash-missing notes + plus today's rotating verification shard. Index-only — writes no notes; the + indexes are machine-owned, so no --apply gate. Returns a one-line summary.""" + import datetime as dt + import echo_recall + + if get("_agent/echo-vault.md") is None: + return "fast-sweep skipped: vault not bootstrapped" + + listing = [p for p in walk() + if p.endswith(".md") and p.rsplit("/", 1)[-1] not in SKIP_BASENAMES + and not TEMPLATE_RE.search(p)] + lset = set(listing) + + rix = echo_recall._load_local() + if rix is None or not rix.n_docs: + # Nothing to maintain incrementally — build the local index outright + # (sub-second on a few-hundred-note vault; no vault snapshot write). + rix = echo_recall.rebuild() + _stamp_fast_sweep() + return f"fast-sweep: no local index — built one ({rix.n_docs} docs)" + + index = idx_mod.load() + ents = index.get("entities", {}) + removed = 0 + for slug in [s for s, e in list(ents.items()) if e.get("path") not in lset]: + del ents[slug] + removed += 1 + for p in [p for p in list(rix.length) if p not in lset]: + rix.remove(p) + removed += 1 + + try: + weekday = dt.date.fromisoformat(echo.today()).weekday() + except ValueError: + weekday = dt.date.today().weekday() + + def in_shard(p: str) -> bool: + return int(idx_mod.content_hash(p), 16) % 7 == weekday + + cands: set[str] = set() + for p in listing: + if not echo_recall._indexable(p): + continue + if p not in rix.length: # new note (any client, any tool) + cands.add(p) + continue + kind = kind_for(p) + if kind: + slug = idx_mod.slugify(p.rsplit("/", 1)[-1][:-3]) + if not (ents.get(slug) or {}).get("h"): # pre-2.3 entry: hash it once + cands.add(p) + continue + if all_shards or in_shard(p): # rotating verification shard + cands.add(p) + + texts = echo.read_many(sorted(cands)) + changed = 0 + ents_dirty = removed > 0 + for p, t in texts.items(): + if t is None: + continue + h = idx_mod.content_hash(t) + if rix.content_hash(p) != h: + rix.add(p, t) + changed += 1 + kind = kind_for(p) + if kind: + slug = idx_mod.slugify(p.rsplit("/", 1)[-1][:-3]) + prev = ents.get(slug) or {} + if prev.get("h") != h or prev.get("path") != p: + title = links.first_h1(t) or p.rsplit("/", 1)[-1][:-3] + aliases = list(prev.get("aliases", [])) + idx_mod.aliases_in_frontmatter(t) + idx_mod.upsert(index, slug, p, kind, title, aliases, h=h) + ents_dirty = True + + echo_recall.save_local(rix) + if ents_dirty: + idx_mod.save(index) + _stamp_fast_sweep() + return (f"fast-sweep: {len(cands)} note(s) checked, {changed} reindexed, " + f"{removed} removed" + (" (all shards)" if all_shards else "")) + + def main(argv: list[str] | None = None) -> int: ap = argparse.ArgumentParser(description="Bring an ECHO vault up to the current feature spec") ap.add_argument("--apply", action="store_true") + ap.add_argument("--fast", action="store_true", + help="incremental index maintenance (local recall + entity index only)") + ap.add_argument("--all-shards", action="store_true", + help="with --fast: verify every indexed note, not just today's shard") args = ap.parse_args(argv) + if args.fast: + print(fast(all_shards=args.all_shards)) + return 0 apply = args.apply tag = "APPLY" if apply else "PLAN " @@ -151,7 +279,8 @@ def main(argv: list[str] | None = None) -> int: # aliases (e.g. mentions learned by capture) are preserved; upsert adds title variants. prev_aliases = prev.get("aliases", []) if prev else [] aliases = list(prev_aliases) + idx_mod.aliases_in_frontmatter(text) - idx_mod.upsert(rebuilt, slug, path, kind, title, aliases) + idx_mod.upsert(rebuilt, slug, path, kind, title, aliases, + h=idx_mod.content_hash(text)) if not prev: added += 1 elif prev.get("path") != path or prev.get("title") != title: @@ -163,8 +292,9 @@ def main(argv: list[str] | None = None) -> int: # ---- 2b. (re)build the recall (BM25) index ------------------------------- if apply: - rix = echo_recall.rebuild(prefetched=texts) - print(f"sweep: {tag} recall index — {rix.n_docs} docs (BM25)") + rix = echo_recall.rebuild(prefetched=texts, snapshot=True) + _stamp_fast_sweep() + print(f"sweep: {tag} recall index — {rix.n_docs} docs (BM25; local + vault snapshot)") else: n_idx = sum(1 for p in all_files if echo_recall._indexable(p)) print(f"sweep: {tag} recall index — would rebuild BM25 over {n_idx} corpus notes " diff --git a/echo-memory.plugin.src/skills/echo-memory/scripts/test_echo_client.py b/echo-memory.plugin.src/skills/echo-memory/scripts/test_echo_client.py index 7c7debd..12f19bd 100644 --- a/echo-memory.plugin.src/skills/echo-memory/scripts/test_echo_client.py +++ b/echo-memory.plugin.src/skills/echo-memory/scripts/test_echo_client.py @@ -215,6 +215,42 @@ def test_links_create_related_section_when_absent() -> None: assert changed and "## Related" in new and "[[resources/concepts/beta]]" in new +def test_stemmer_conflates_inflection_families() -> None: + import echo_stem + families = [ + ["deploy", "deploys", "deployed", "deploying", "deployment"], + ["navigate", "navigation", "navigating", "navigational"], + ["renew", "renews", "renewing"], + ["prefer", "prefers", "preferring", "preferred"], + ["penalty", "penalties"], + ["saturate", "saturation", "saturated"], + ["frequency", "frequencies"], + ["expand", "expanded", "expanding"], + ["meet", "meeting", "meetings"], + ["service", "services"], + ] + for fam in families: + stems = {echo_stem.stem(w) for w in fam} + assert len(stems) == 1, f"{fam} -> {stems}" + + +def test_stemmer_leaves_short_and_risky_tokens_alone() -> None: + import echo_stem + # over-stemming merges unrelated words — worse than a missed match + for w in ("sing", "thing", "was", "is", "bus", "this", "echo", "vault", "mpm"): + assert echo_stem.stem(w) == w, f"{w} mangled to {echo_stem.stem(w)}" + # documented non-conflations (the -al / d~s irregulars full Porter also skips) + assert echo_stem.stem("renewal") != echo_stem.stem("renew") + assert echo_stem.stem("expansion") != echo_stem.stem("expand") + + +def test_content_hash_stable_and_short() -> None: + import echo_index as ix + a = ix.content_hash("hello world") + assert a == ix.content_hash("hello world") and len(a) == 16 + assert a != ix.content_hash("hello world!") + + def _run_all() -> int: tests = [v for k, v in sorted(globals().items()) if k.startswith("test_") and callable(v)] failed = 0 diff --git a/eval/results/latest.json b/eval/results/latest.json index 75f3678..7d24487 100644 --- a/eval/results/latest.json +++ b/eval/results/latest.json @@ -3,17 +3,17 @@ "date": "2026-07-03", "retrieval": { "current (hybrid+priors, full corpus)": { - "precision_at_5": 0.25, + "precision_at_5": 0.243, "recall_at_5": 1.0, "mrr": 1.0, - "session_journal_queries_answered": "2/2", + "session_journal_queries_answered": "3/3", "freshness_top1_correct": true }, "baseline (keyword, entities only)": { - "precision_at_5": 0.2, + "precision_at_5": 0.186, "recall_at_5": 0.75, - "mrr": 0.75, - "session_journal_queries_answered": "0/2", + "mrr": 0.786, + "session_journal_queries_answered": "0/3", "freshness_top1_correct": false } }, diff --git a/eval/run_eval.py b/eval/run_eval.py index e068747..60c3430 100644 --- a/eval/run_eval.py +++ b/eval/run_eval.py @@ -135,6 +135,16 @@ QUERIES = [ ("contract renewal Q3", {"resources/companies/vantage-systems.md"}, False), ("renegotiation kickoff", {"journal/daily/2026-06-20.md"}, True), ("graph neighbourhood expansion", {"resources/concepts/graph-expansion.md"}, False), + # ---- paraphrase set (2.3): morphological variants + rephrasings the pre-2.3 + # purely-lexical index missed — the stemming gain is measured, not assumed. + ("renewing enterprise contracts", {"resources/companies/vantage-systems.md"}, False), + ("navigational cleanup", {"projects/active/website-redesign.md", + "projects/archived/old-website.md"}, False), + ("preferring uv for tooling", {"_agent/memory/semantic/tooling-preferences.md"}, False), + ("penalties in the SLA", + {"_agent/sessions/2026-06-20-1000-vantage-contract-review.md"}, True), + ("saturated term frequencies", {"resources/concepts/bm25-ranking.md"}, False), + ("expanded linked neighbourhoods", {"resources/concepts/graph-expansion.md"}, False), ] FRESHNESS_QUERY = "marketing site navigation" FRESHNESS_TOP1 = "projects/active/website-redesign.md" diff --git a/eval/test_features.py b/eval/test_features.py index 8c40610..ffbadd8 100644 --- a/eval/test_features.py +++ b/eval/test_features.py @@ -27,7 +27,9 @@ def check(name, cond, detail=""): class Harness: def __init__(self, base): + import tempfile self.base = base + self.state_dir = tempfile.mkdtemp() def http(self, method, url, body=None, headers=None): data = body.encode() if isinstance(body, str) else body @@ -52,8 +54,10 @@ class Harness: return None if body == "<>" else body def echo(self, *args): + # ECHO_STATE_DIR isolation matters since 2.3: the recall index is LOCAL-first, + # and without this the suite would write into the real ~/.echo-memory. env = dict(os.environ, ECHO_BASE=self.base, ECHO_KEY=KEY, ECHO_VERIFY="1", - ECHO_TODAY="2026-06-21") + ECHO_TODAY="2026-06-21", ECHO_STATE_DIR=self.state_dir) return subprocess.run([sys.executable, str(args[0]), *args[1:]], capture_output=True, text=True, env=env) @@ -230,8 +234,9 @@ def main(): check("v1.5 recall finds a session log by body term", "_agent/sessions/2026-06-15-1200-mpm-review.md" in r.stdout, r.stdout) rix2 = h.ground("_agent/index/recall-index.json") or "" - check("v1.5 recall index carries doc meta (schema 2)", - '"schema": 2' in rix2 or '"schema":2' in rix2, rix2[:200]) + check("v2.3 recall snapshot is schema 3 with build stamp + content hashes", + ('"schema": 3' in rix2 or '"schema":3' in rix2) + and '"built"' in rix2 and '"h"' in rix2, rix2[:200]) # 14. recency-aware ranking: same term, fresher note wins. h.seed("resources/concepts/old-idea.md", @@ -402,6 +407,59 @@ def main(): r.returncode == 2 and sess_path in (h.ground("_agent/heartbeat/last-session.md") or ""), r.stderr) + # ---------------- v2.3 index train -------------------------------------- + # 20. local-first recall index: capture updates the LOCAL index with ZERO + # vault snapshot writes — the vault copy only changes on sweep/session-end. + snap_before = h.ground("_agent/index/recall-index.json") or "" + r = h.echo(ECHO, "capture", "Quixotic Widget", "--kind", "concept", "-") + r = subprocess.run([sys.executable, str(ECHO), "capture", "Quixotic Widget2", "--kind", + "concept", "-"], input="A gadget for quixotry deployment.\n", + capture_output=True, text=True, + env=dict(os.environ, ECHO_BASE=base, ECHO_KEY=KEY, + ECHO_TODAY="2026-06-21", ECHO_STATE_DIR=h.state_dir)) + snap_after = h.ground("_agent/index/recall-index.json") or "" + check("v2.3 capture does NOT write the vault snapshot", snap_before == snap_after) + local_files = [p for p in Path(h.state_dir).glob("recall-index-*.json")] + check("v2.3 capture maintains the LOCAL index", len(local_files) == 1, + str(local_files)) + r = h.echo(ECHO, "recall", "quixotry") + check("v2.3 locally-indexed capture is recallable", + "resources/concepts/quixotic-widget2.md" in r.stdout, r.stdout[:400]) + + # 21. stemming: a morphologically different query still hits (deployment ~ deploying). + r = h.echo(ECHO, "recall", "deploying quixotry") + check("v2.3 stemmed recall bridges inflections", + "resources/concepts/quixotic-widget2.md" in r.stdout, r.stdout[:400]) + + # 22. alias query expansion: an alias-phrased query surfaces the entity even + # though the alias never appears in any note body. + r = subprocess.run([sys.executable, str(ECHO), "capture", "Kappa Engine", "--kind", + "concept", "-", "--aliases", "turbokappa"], + input="Compression tuning notes for the kappa engine core.\n", + capture_output=True, text=True, + env=dict(os.environ, ECHO_BASE=base, ECHO_KEY=KEY, + ECHO_TODAY="2026-06-21", ECHO_STATE_DIR=h.state_dir)) + r = h.echo(ECHO, "recall", "turbokappa compression") + check("v2.3 alias expansion surfaces the aliased entity", + "resources/concepts/kappa-engine.md" in r.stdout, r.stdout[:400]) + + # 23. incremental fast sweep: an out-of-band edit (seeded directly, as if by + # Obsidian) and a deletion are trued up without a full rebuild. + h.seed("resources/concepts/quixotic-widget.md", + "---\ntype: concept\nstatus: active\ncreated: 2026-06-21\nupdated: 2026-06-21\n" + "tags: [concept]\n---\n# Quixotic Widget\n\nNow mentions zanzibar explicitly.\n") + h.http("DELETE", f"{base}/vault/resources/concepts/quixotic-widget2.md") + r = h.echo(SWEEP, "--fast", "--all-shards") + check("v2.3 fast sweep reports its work", + "fast-sweep:" in r.stdout and "reindexed" in r.stdout, r.stdout + r.stderr) + r = h.echo(ECHO, "recall", "zanzibar") + check("v2.3 fast sweep picked up the out-of-band edit", + "resources/concepts/quixotic-widget.md" in r.stdout, r.stdout[:400]) + idx5 = h.ground("_agent/index/entities.json") or "" + check("v2.3 fast sweep drops deleted notes from the entity index", + "quixotic-widget2" not in idx5) + check("v2.3 entity index carries content hashes", '"h"' in idx5, idx5[:300]) + print(f"\n{len(failures)} failure(s)" if failures else "\nall feature tests passed") return 1 if failures else 0 finally: diff --git a/eval/test_patch_semantics.py b/eval/test_patch_semantics.py index e57d336..00b8b8e 100644 --- a/eval/test_patch_semantics.py +++ b/eval/test_patch_semantics.py @@ -59,7 +59,9 @@ def main(): stdout=subprocess.PIPE, stderr=subprocess.STDOUT, text=True) def echo(*args): - env = dict(os.environ, ECHO_BASE=base, ECHO_KEY=KEY, ECHO_VERIFY="0") + import tempfile + env = dict(os.environ, ECHO_BASE=base, ECHO_KEY=KEY, ECHO_VERIFY="0", + ECHO_STATE_DIR=globals().setdefault("_STATE_DIR", tempfile.mkdtemp())) return subprocess.run([sys.executable, str(ECHO), *args], capture_output=True, text=True, env=env) def ground(path): diff --git a/eval/test_reflect.py b/eval/test_reflect.py index 6362370..0a10c79 100644 --- a/eval/test_reflect.py +++ b/eval/test_reflect.py @@ -51,7 +51,9 @@ def main(): return getattr(e, "code", 0), "" def echo(*args, stdin=None): - env = dict(os.environ, ECHO_BASE=base, ECHO_KEY=KEY, ECHO_VERIFY="1", ECHO_TODAY="2026-06-22") + import tempfile + env = dict(os.environ, ECHO_BASE=base, ECHO_KEY=KEY, ECHO_VERIFY="1", + ECHO_TODAY="2026-06-22", ECHO_STATE_DIR=tempfile.mkdtemp()) return subprocess.run([sys.executable, str(ECHO), *args], input=stdin, capture_output=True, text=True, env=env)