From 4bae34bca84492200ad92a80c475ab63eb84da92 Mon Sep 17 00:00:00 2001 From: plind-junior <138900956+dripsmvcp@users.noreply.github.com> Date: Wed, 20 May 2026 07:56:25 +0900 Subject: [PATCH 001/123] fix(server): block path traversal in register_source_from_path kb.register_source_from_path read the contents of any file the process could access, letting an agent register /etc/passwd, ~/.ssh/id_rsa, ~/.aws/credentials etc. as a "source" and then retrieve the bytes via kb.cite or kb.list_sources. Resolve the path (following symlinks) and require it to be inside the KB root before reading. Adds KBStore.resolve_under_root() so both the JSONL handler and the MCP tool share one containment check. Fixes #10 --- src/vouch/jsonl_server.py | 4 ++-- src/vouch/server.py | 11 ++++++----- src/vouch/storage.py | 12 ++++++++++++ tests/test_jsonl_server.py | 38 ++++++++++++++++++++++++++++++++++++++ 4 files changed, 58 insertions(+), 7 deletions(-) diff --git a/src/vouch/jsonl_server.py b/src/vouch/jsonl_server.py index c9cfcbfd..a5bfc183 100644 --- a/src/vouch/jsonl_server.py +++ b/src/vouch/jsonl_server.py @@ -174,14 +174,14 @@ def _h_register_source(p: dict) -> dict: def _h_register_source_from_path(p: dict) -> dict: s = _store() - path = Path(p["path"]) + path = s.resolve_under_root(p["path"]) if not path.is_file(): raise ValueError(f"not a file: {path}") src = s.put_source( path.read_bytes(), title=p.get("title") or path.name, url=p.get("url"), - locator=str(path.resolve()), + locator=str(path), source_type=p.get("source_type", "file"), ) audit.log_event(s.kb_dir, event="source.add", actor=_agent(), object_ids=[src.id]) diff --git a/src/vouch/server.py b/src/vouch/server.py index 3197523f..4c9eacd9 100644 --- a/src/vouch/server.py +++ b/src/vouch/server.py @@ -225,14 +225,15 @@ def kb_register_source( def kb_register_source_from_path(path: str, title: str | None = None, url: str | None = None, source_type: str = "file") -> dict[str, Any]: - p = Path(path) + s = _store() + p = s.resolve_under_root(path) if not p.is_file(): - raise ValueError(f"not a file: {path}") - src = _store().put_source( + raise ValueError(f"not a file: {p}") + src = s.put_source( p.read_bytes(), title=title or p.name, url=url, - locator=str(p.resolve()), source_type=source_type, + locator=str(p), source_type=source_type, ) - audit.log_event(_store().kb_dir, event="source.add", actor=_agent(), + audit.log_event(s.kb_dir, event="source.add", actor=_agent(), object_ids=[src.id]) return src.model_dump(mode="json") diff --git a/src/vouch/storage.py b/src/vouch/storage.py index 8249ea06..e3096c2d 100644 --- a/src/vouch/storage.py +++ b/src/vouch/storage.py @@ -111,6 +111,18 @@ def __init__(self, root: Path): self.root = root.resolve() self.kb_dir = self.root / KB_DIRNAME + def resolve_under_root(self, path: str | Path) -> Path: + # Guard against arbitrary-file-read primitives exposed by the MCP / + # JSONL `register_source_from_path` entrypoints. Symlinks are followed + # before the containment check so a symlink inside the project that + # points outside is rejected. + resolved = Path(path).resolve() + if not resolved.is_relative_to(self.root): + raise ValueError( + f"path must be inside project root ({self.root}): {resolved}" + ) + return resolved + # --- bootstrap --------------------------------------------------------- @classmethod diff --git a/tests/test_jsonl_server.py b/tests/test_jsonl_server.py index f053db4e..3afac4f7 100644 --- a/tests/test_jsonl_server.py +++ b/tests/test_jsonl_server.py @@ -65,6 +65,44 @@ def test_jsonl_full_flow(store: KBStore, monkeypatch) -> None: assert caps["result"]["review_gated"] is True +def test_register_source_from_path_rejects_outside_root( + tmp_path_factory: pytest.TempPathFactory, monkeypatch +) -> None: + # Regression for #10: kb.register_source_from_path must not read files + # outside the project root. Without the guard, an agent can name + # /etc/passwd, ~/.ssh/id_rsa, etc. and exfiltrate the contents via + # kb.cite / kb.list_sources. + kb_root = tmp_path_factory.mktemp("kb") + outside = tmp_path_factory.mktemp("outside") + secret = outside / "secret.txt" + secret.write_text("super-secret payload") + store = KBStore.init(kb_root) + monkeypatch.chdir(store.root) + resp = handle_request({ + "id": "r1", "method": "kb.register_source_from_path", + "params": {"path": str(secret)}, + }) + assert not resp["ok"] + assert resp["error"]["code"] == "invalid_request" + assert "project root" in resp["error"]["message"] + # The store should be empty — the secret must not have been ingested. + assert store.list_sources() == [] + + +def test_register_source_from_path_accepts_inside_root( + store: KBStore, monkeypatch +) -> None: + inside = store.root / "doc.txt" + inside.write_text("project content") + monkeypatch.chdir(store.root) + resp = handle_request({ + "id": "r1", "method": "kb.register_source_from_path", + "params": {"path": str(inside)}, + }) + assert resp["ok"] + assert len(store.list_sources()) == 1 + + def test_jsonl_session_lifecycle(store: KBStore, monkeypatch) -> None: src = store.put_source(b"e") monkeypatch.chdir(store.root) From b48b404edab67d8dbe855ced962256e6ab5eb2c6 Mon Sep 17 00:00:00 2001 From: plind-junior <138900956+dripsmvcp@users.noreply.github.com> Date: Wed, 20 May 2026 08:06:39 +0900 Subject: [PATCH 002/123] fix(cli): translate domain errors into clean ClickException output The CLI handlers for approve and reject caught only (ArtifactNotFoundError, ValueError) but proposals.approve() / proposals.reject() raise ProposalError -- a RuntimeError subclass. The four propose-* shortcuts caught nothing at all. Result: a double- approve, an empty rejection reason, an empty claim text, or an unknown source id surfaced a raw Python traceback instead of the one-line `Error: ...` the rest of the CLI emits. Add a small `_cli_errors` context manager that translates ArtifactNotFoundError / ValueError / ProposalError / LifecycleError into click.ClickException, and apply it to every command that calls into proposals, lifecycle, sessions, or storage. The MCP and JSONL servers already do the equivalent in their own envelopes; this brings the human-facing surface in line. Adds tests/test_cli.py with regressions for approve, reject, propose- claim, propose-entity, and show. --- src/vouch/cli.py | 114 ++++++++++++++++++++++++++++------------------ tests/test_cli.py | 80 ++++++++++++++++++++++++++++++++ 2 files changed, 149 insertions(+), 45 deletions(-) create mode 100644 tests/test_cli.py diff --git a/src/vouch/cli.py b/src/vouch/cli.py index a3d1559a..dd649a44 100644 --- a/src/vouch/cli.py +++ b/src/vouch/cli.py @@ -11,6 +11,8 @@ import json import os import sys +from collections.abc import Iterator +from contextlib import contextmanager from pathlib import Path import click @@ -23,8 +25,10 @@ from . import verify as verify_mod from .capabilities import capabilities as build_caps from .context import build_context_pack +from .lifecycle import LifecycleError from .models import ProposalStatus from .proposals import ( + ProposalError, approve as do_approve, ) from .proposals import ( @@ -44,6 +48,20 @@ ) +@contextmanager +def _cli_errors() -> Iterator[None]: + # Translate domain errors into click.ClickException so users see a + # one-line `Error: ...` instead of a Python traceback. Without this, + # ProposalError / LifecycleError (both RuntimeError subclasses) escape + # the narrower `(ArtifactNotFoundError, ValueError)` tuples previously + # used per-command. The MCP and JSONL servers do the equivalent in + # their own request envelopes. + try: + yield + except (ArtifactNotFoundError, ValueError, ProposalError, LifecycleError) as e: + raise click.ClickException(str(e)) from e + + def _load_store(start: Path | None = None) -> KBStore: try: return KBStore(discover_root(start)) @@ -176,10 +194,8 @@ def pending() -> None: def show(proposal_id: str) -> None: """Show full details of a proposal.""" store = _load_store() - try: + with _cli_errors(): pr = store.get_proposal(proposal_id) - except ArtifactNotFoundError as e: - raise click.ClickException(str(e)) from e click.echo(yaml.safe_dump(pr.model_dump(mode="json"), sort_keys=False)) @@ -189,10 +205,8 @@ def show(proposal_id: str) -> None: def approve(proposal_id: str, reason: str | None) -> None: """Approve a proposal — converts it into a durable artifact.""" store = _load_store() - try: + with _cli_errors(): artifact = do_approve(store, proposal_id, approved_by=_whoami(), reason=reason) - except (ArtifactNotFoundError, ValueError) as e: - raise click.ClickException(str(e)) from e click.echo(f"Approved → {type(artifact).__name__.lower()}/{artifact.id}") @@ -202,10 +216,8 @@ def approve(proposal_id: str, reason: str | None) -> None: def reject(proposal_id: str, reason: str) -> None: """Reject a proposal — recorded for audit and future agent context.""" store = _load_store() - try: + with _cli_errors(): do_reject(store, proposal_id, rejected_by=_whoami(), reason=reason) - except (ArtifactNotFoundError, ValueError) as e: - raise click.ClickException(str(e)) from e click.echo(f"Rejected {proposal_id}") @@ -224,11 +236,12 @@ def propose_claim_cmd(text: str, sources: tuple[str, ...], claim_type: str, confidence: float, rationale: str | None, tags: tuple[str, ...]) -> None: store = _load_store() - pr = propose_claim( - store, text=text, evidence=list(sources), - proposed_by=_whoami(), claim_type=claim_type, - confidence=confidence, tags=list(tags), rationale=rationale, - ) + with _cli_errors(): + pr = propose_claim( + store, text=text, evidence=list(sources), + proposed_by=_whoami(), claim_type=claim_type, + confidence=confidence, tags=list(tags), rationale=rationale, + ) click.echo(pr.id) @@ -243,11 +256,12 @@ def propose_page_cmd(title: str, body: str, page_type: str, store = _load_store() if body == "-": body = sys.stdin.read() - pr = propose_page( - store, title=title, body=body, page_type=page_type, - claim_ids=list(claims), entity_ids=list(entities), - proposed_by=_whoami(), - ) + with _cli_errors(): + pr = propose_page( + store, title=title, body=body, page_type=page_type, + claim_ids=list(claims), entity_ids=list(entities), + proposed_by=_whoami(), + ) click.echo(pr.id) @@ -259,10 +273,11 @@ def propose_page_cmd(title: str, body: str, page_type: str, def propose_entity_cmd(name: str, entity_type: str, aliases: tuple[str, ...], description: str | None) -> None: store = _load_store() - pr = propose_entity( - store, name=name, entity_type=entity_type, - aliases=list(aliases), description=description, proposed_by=_whoami(), - ) + with _cli_errors(): + pr = propose_entity( + store, name=name, entity_type=entity_type, + aliases=list(aliases), description=description, proposed_by=_whoami(), + ) click.echo(pr.id) @@ -273,10 +288,11 @@ def propose_entity_cmd(name: str, entity_type: str, aliases: tuple[str, ...], @click.option("--confidence", default=0.7, show_default=True, type=float) def propose_relation_cmd(src: str, relation: str, target: str, confidence: float) -> None: store = _load_store() - pr = propose_relation( - store, src=src, relation=relation, target=target, - confidence=confidence, proposed_by=_whoami(), - ) + with _cli_errors(): + pr = propose_relation( + store, src=src, relation=relation, target=target, + confidence=confidence, proposed_by=_whoami(), + ) click.echo(pr.id) @@ -298,13 +314,14 @@ def source_add(path: str, title: str | None, url: str | None, """Register a file as a Source; prints its sha256 id.""" store = _load_store() data = Path(path).read_bytes() - src = store.put_source( - data, - title=title or Path(path).name, - url=url, - locator=str(Path(path).resolve()), - source_type=source_type, - ) + with _cli_errors(): + src = store.put_source( + data, + title=title or Path(path).name, + url=url, + locator=str(Path(path).resolve()), + source_type=source_type, + ) audit_mod.log_event( store.kb_dir, event="source.add", actor=_whoami(), object_ids=[src.id], ) @@ -338,8 +355,9 @@ def source_verify(fail_on_issue: bool) -> None: def supersede(old_claim_id: str, new_claim_id: str) -> None: """Mark OLD as superseded by NEW.""" store = _load_store() - life.supersede(store, old_claim_id=old_claim_id, - new_claim_id=new_claim_id, actor=_whoami()) + with _cli_errors(): + life.supersede(store, old_claim_id=old_claim_id, + new_claim_id=new_claim_id, actor=_whoami()) click.echo(f"superseded {old_claim_id} -> {new_claim_id}") @@ -349,7 +367,8 @@ def supersede(old_claim_id: str, new_claim_id: str) -> None: def contradict(claim_a: str, claim_b: str) -> None: """Record that two claims contradict each other.""" store = _load_store() - life.contradict(store, claim_a=claim_a, claim_b=claim_b, actor=_whoami()) + with _cli_errors(): + life.contradict(store, claim_a=claim_a, claim_b=claim_b, actor=_whoami()) click.echo(f"contradiction recorded: {claim_a} <-> {claim_b}") @@ -358,7 +377,8 @@ def contradict(claim_a: str, claim_b: str) -> None: def archive(claim_id: str) -> None: """Archive a claim (kept for history, omitted from default retrieval).""" store = _load_store() - life.archive(store, claim_id=claim_id, actor=_whoami()) + with _cli_errors(): + life.archive(store, claim_id=claim_id, actor=_whoami()) click.echo(f"archived {claim_id}") @@ -367,7 +387,8 @@ def archive(claim_id: str) -> None: def confirm(claim_id: str) -> None: """Re-confirm a claim — bumps last_confirmed_at.""" store = _load_store() - life.confirm(store, claim_id=claim_id, actor=_whoami()) + with _cli_errors(): + life.confirm(store, claim_id=claim_id, actor=_whoami()) click.echo(f"confirmed {claim_id}") @@ -377,8 +398,9 @@ def cite(claim_id: str) -> None: """Resolve and print all citations backing a claim.""" store = _load_store() out = [] - for c in life.cite(store, claim_id): - out.append(c.model_dump(mode="json") if hasattr(c, "model_dump") else c) + with _cli_errors(): + for c in life.cite(store, claim_id): + out.append(c.model_dump(mode="json") if hasattr(c, "model_dump") else c) _emit_json(out) @@ -411,7 +433,8 @@ def session_start_cmd(agent: str | None, task: str | None, note: str | None) -> @click.option("--note", default=None) def session_end_cmd(session_id: str, note: str | None) -> None: store = _load_store() - sess = sess_mod.session_end(store, session_id, note=note) + with _cli_errors(): + sess = sess_mod.session_end(store, session_id, note=note) _emit_json({"session": sess.id, "proposals": sess.proposal_ids}) @@ -421,9 +444,10 @@ def session_end_cmd(session_id: str, note: str | None) -> None: def crystallize(session_id: str, no_page: bool) -> None: """Approve every pending proposal in a session (and write a summary page).""" store = _load_store() - result = sess_mod.crystallize( - store, session_id, approver=_whoami(), write_summary_page=not no_page, - ) + with _cli_errors(): + result = sess_mod.crystallize( + store, session_id, approver=_whoami(), write_summary_page=not no_page, + ) _emit_json(result) diff --git a/tests/test_cli.py b/tests/test_cli.py new file mode 100644 index 00000000..6fa10343 --- /dev/null +++ b/tests/test_cli.py @@ -0,0 +1,80 @@ +"""CLI surface — every command must turn domain errors into a clean +`Error: ...` line via click.ClickException, never a raw Python traceback. + +These regressions cover the bug class where CLI handlers caught +``(ArtifactNotFoundError, ValueError)`` but ``proposals.approve()`` / +``proposals.reject()`` (and the ``propose_*`` helpers) raise +``ProposalError`` (a ``RuntimeError`` subclass) for validation failures — +which slipped past the except and surfaced as a traceback. +""" + +from __future__ import annotations + +from pathlib import Path + +import pytest +from click.testing import CliRunner + +from vouch.cli import cli +from vouch.proposals import propose_claim +from vouch.storage import KBStore + + +@pytest.fixture +def store(tmp_path: Path, monkeypatch: pytest.MonkeyPatch) -> KBStore: + s = KBStore.init(tmp_path) + monkeypatch.chdir(s.root) + return s + + +def _assert_clean_error(result, needle: str) -> None: + assert result.exit_code != 0, result.output + # click.ClickException renders as ``Error: ``; a raw traceback would + # include the Python frame marker ``Traceback (most recent call last)``. + assert "Traceback" not in result.output, result.output + assert "Error:" in result.output, result.output + assert needle in result.output, result.output + + +def test_approve_already_decided_proposal_shows_clean_error(store: KBStore) -> None: + src = store.put_source(b"e") + pr = propose_claim(store, text="x", evidence=[src.id], proposed_by="agent") + runner = CliRunner() + first = runner.invoke(cli, ["approve", pr.id]) + assert first.exit_code == 0, first.output + second = runner.invoke(cli, ["approve", pr.id]) + _assert_clean_error(second, "not pending") + + +def test_reject_empty_reason_shows_clean_error(store: KBStore) -> None: + src = store.put_source(b"e") + pr = propose_claim(store, text="x", evidence=[src.id], proposed_by="agent") + result = CliRunner().invoke(cli, ["reject", pr.id, "--reason", " "]) + _assert_clean_error(result, "reason") + + +def test_propose_claim_empty_text_shows_clean_error(store: KBStore) -> None: + src = store.put_source(b"e") + result = CliRunner().invoke( + cli, ["propose-claim", "--text", " ", "--source", src.id] + ) + _assert_clean_error(result, "claim text") + + +def test_propose_claim_unknown_source_shows_clean_error(store: KBStore) -> None: + result = CliRunner().invoke( + cli, ["propose-claim", "--text", "ok", "--source", "deadbeef"] + ) + _assert_clean_error(result, "unknown source") + + +def test_propose_entity_empty_name_shows_clean_error(store: KBStore) -> None: + result = CliRunner().invoke( + cli, ["propose-entity", "--name", " ", "--type", "project"] + ) + _assert_clean_error(result, "entity name") + + +def test_show_missing_proposal_shows_clean_error(store: KBStore) -> None: + result = CliRunner().invoke(cli, ["show", "no-such-proposal"]) + _assert_clean_error(result, "proposal no-such-proposal") From 2a439a5c2cdb01a1533190d388fb6b0d70f691a5 Mon Sep 17 00:00:00 2001 From: plind-junior <138900956+dripsmvcp@users.noreply.github.com> Date: Wed, 20 May 2026 08:15:04 +0900 Subject: [PATCH 003/123] chore(lint): chain FileExistsError cause in storage put_ methods ruff B904 requires `raise ... from err` inside an except block so the original exception is preserved on the chained __cause__. Without it, the CI lint step rejects the file. The seven sites are pre-existing (put_claim, put_page, put_entity, put_relation, put_evidence, put_session, put_proposal); this PR inherited the failure from main rather than introducing it, but the path traversal fix cannot land until lint is green, so the cleanup happens here. No behavior change: the chained exception carries .__cause__ but the public ValueError message and type are unchanged. --- src/vouch/storage.py | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/src/vouch/storage.py b/src/vouch/storage.py index e3096c2d..9523de75 100644 --- a/src/vouch/storage.py +++ b/src/vouch/storage.py @@ -258,10 +258,10 @@ def put_claim(self, claim: Claim) -> Claim: try: with self._claim_path(claim.id).open("x") as f: f.write(_yaml_dump(claim.model_dump(mode="json"))) - except FileExistsError: + except FileExistsError as e: raise ValueError( f"claim {claim.id} already exists -- use update_claim()" - ) + ) from e return claim def get_claim(self, claim_id: str) -> Claim: @@ -294,10 +294,10 @@ def put_page(self, page: Page) -> Page: try: with self._page_path(page.id).open("x") as f: f.write(_serialize_page(page)) - except FileExistsError: + except FileExistsError as e: raise ValueError( f"page {page.id} already exists -- choose a different slug" - ) + ) from e return page def get_page(self, page_id: str) -> Page: @@ -318,10 +318,10 @@ def put_entity(self, entity: Entity) -> Entity: try: with self._entity_path(entity.id).open("x") as f: f.write(_yaml_dump(entity.model_dump(mode="json"))) - except FileExistsError: + except FileExistsError as e: raise ValueError( f"entity {entity.id} already exists -- choose a different slug" - ) + ) from e return entity def get_entity(self, eid: str) -> Entity: @@ -343,10 +343,10 @@ def put_relation(self, rel: Relation) -> Relation: try: with self._relation_path(rel.id).open("x") as f: f.write(_yaml_dump(rel.model_dump(mode="json"))) - except FileExistsError: + except FileExistsError as e: raise ValueError( f"relation {rel.id} already exists -- choose a different slug" - ) + ) from e return rel def get_relation(self, rid: str) -> Relation: @@ -376,10 +376,10 @@ def put_evidence(self, ev: Evidence) -> Evidence: try: with self._evidence_path(ev.id).open("x") as f: f.write(_yaml_dump(ev.model_dump(mode="json"))) - except FileExistsError: + except FileExistsError as e: raise ValueError( f"evidence {ev.id} already exists -- choose a different slug" - ) + ) from e return ev def get_evidence(self, eid: str) -> Evidence: @@ -401,10 +401,10 @@ def put_session(self, sess: Session) -> Session: try: with self._session_path(sess.id).open("x") as f: f.write(_yaml_dump(sess.model_dump(mode="json"))) - except FileExistsError: + except FileExistsError as e: raise ValueError( f"session {sess.id} already exists -- choose a different id" - ) + ) from e return sess def get_session(self, sid: str) -> Session: @@ -426,10 +426,10 @@ def put_proposal(self, proposal: Proposal) -> Proposal: try: with self._proposal_path(proposal.id).open("x") as f: f.write(_yaml_dump(proposal.model_dump(mode="json"))) - except FileExistsError: + except FileExistsError as e: raise ValueError( f"proposal {proposal.id} already exists -- choose a different id" - ) + ) from e return proposal def get_proposal(self, proposal_id: str) -> Proposal: From 1cb329f8cb7b6984e428bfd19113c4b5faf16cb6 Mon Sep 17 00:00:00 2001 From: plind-junior <138900956+dripsmvcp@users.noreply.github.com> Date: Wed, 20 May 2026 08:12:59 +0900 Subject: [PATCH 004/123] fix(verify): catch ArtifactNotFoundError and OSError on stored read verify_source() caught FileNotFoundError, but store.read_source_content() raises ArtifactNotFoundError (a KeyError subclass) when the content blob is missing -- so the "stored content missing" graceful path never ran and a single broken source crashed the entire verify_all() sweep, breaking `vouch source verify` and `vouch doctor`. The same call can also raise OSError (permission denied, TOCTOU race between exists() and read_bytes(), underlying I/O error) which was likewise unhandled. Catch both: the existing "missing" path keeps its note, and OSError surfaces as "stored content unreadable: ". Adds three regression tests: - missing-content blob -> graceful per-source failure - unreadable stored content (monkeypatched PermissionError) -> graceful per-source failure with the underlying reason in the note - mixed sweep with one good + one broken source -> verify_all returns both results instead of aborting at the first failure Fixes #30 --- src/vouch/verify.py | 11 ++++++-- tests/test_verify.py | 65 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 74 insertions(+), 2 deletions(-) diff --git a/src/vouch/verify.py b/src/vouch/verify.py index a4f10ee8..a6227252 100644 --- a/src/vouch/verify.py +++ b/src/vouch/verify.py @@ -13,7 +13,7 @@ from . import audit from .models import Source -from .storage import KBStore, sha256_hex +from .storage import ArtifactNotFoundError, KBStore, sha256_hex @dataclass @@ -27,9 +27,16 @@ class VerificationResult: def verify_source(store: KBStore, source: Source) -> VerificationResult: try: body = store.read_source_content(source.id) - except FileNotFoundError: + except ArtifactNotFoundError: return VerificationResult(source=source, stored_ok=False, external_status="n/a", note="stored content missing") + except OSError as e: + # Permission denied, TOCTOU race between exists() and read_bytes(), + # I/O error on the underlying filesystem — any of these should surface + # as a graceful per-source failure rather than aborting verify_all(). + return VerificationResult(source=source, stored_ok=False, + external_status="n/a", + note=f"stored content unreadable: {e}") stored_ok = sha256_hex(body) == source.id external_status = "n/a" diff --git a/tests/test_verify.py b/tests/test_verify.py index 287b395f..bd1c66ef 100644 --- a/tests/test_verify.py +++ b/tests/test_verify.py @@ -28,3 +28,68 @@ def test_verify_detects_external_drift(store: KBStore, tmp_path: Path) -> None: target = next(r for r in results if r.source.id == src.id) assert target.stored_ok # stored copy is still fine assert target.external_status == "drift" + + +def test_verify_handles_missing_stored_content(store: KBStore, tmp_path: Path) -> None: + # Regression for #30: verify_source caught FileNotFoundError, but + # store.read_source_content() raises ArtifactNotFoundError (a KeyError + # subclass) when the content file is missing. The mismatch crashed the + # entire verification sweep when even one source had missing content. + f = tmp_path / "doc.txt" + f.write_bytes(b"will-be-orphaned") + src = store.put_source(f.read_bytes(), title="doc", locator=str(f.resolve())) + # Simulate the on-disk state the bug report describes: meta.yaml present, + # content blob gone (e.g. partial clone, manual cleanup, disk error). + (store.kb_dir / "sources" / src.id / "content").unlink() + results = verify.verify_all(store) + target = next(r for r in results if r.source.id == src.id) + assert target.stored_ok is False + assert target.external_status == "n/a" + assert target.note == "stored content missing" + + +def test_verify_handles_unreadable_stored_content( + store: KBStore, tmp_path: Path, monkeypatch: pytest.MonkeyPatch +) -> None: + # Sibling regression for #30: read_source_content() can also raise OSError + # (permission denied, TOCTOU between exists() and read_bytes(), disk I/O + # error). Before the fix only ArtifactNotFoundError was caught, so any of + # those still aborted verify_all(). Monkeypatch to make read_source_content + # raise PermissionError so the test is portable across CI users / filesystems. + f = tmp_path / "doc.txt" + f.write_bytes(b"original") + src = store.put_source(f.read_bytes(), title="doc", locator=str(f.resolve())) + + def _boom(_sid: str) -> bytes: + raise PermissionError("simulated permission denied") + + monkeypatch.setattr(store, "read_source_content", _boom) + results = verify.verify_all(store) + target = next(r for r in results if r.source.id == src.id) + assert target.stored_ok is False + assert target.external_status == "n/a" + assert target.note is not None + assert "unreadable" in target.note + assert "simulated permission denied" in target.note + + +def test_verify_all_continues_after_one_failure( + store: KBStore, tmp_path: Path +) -> None: + # End-to-end check that one broken source no longer takes down the sweep: + # register two sources, break one, ensure verify_all returns both results. + good = tmp_path / "good.txt" + good.write_bytes(b"good") + good_src = store.put_source(good.read_bytes(), title="good", + locator=str(good.resolve())) + bad = tmp_path / "bad.txt" + bad.write_bytes(b"bad") + bad_src = store.put_source(bad.read_bytes(), title="bad", + locator=str(bad.resolve())) + (store.kb_dir / "sources" / bad_src.id / "content").unlink() + + results = verify.verify_all(store) + by_id = {r.source.id: r for r in results} + assert by_id[good_src.id].stored_ok is True + assert by_id[bad_src.id].stored_ok is False + assert by_id[bad_src.id].note == "stored content missing" From 129480f7026c737fdd3e0be985c5264313fd4f83 Mon Sep 17 00:00:00 2001 From: plind-junior <138900956+dripsmvcp@users.noreply.github.com> Date: Wed, 20 May 2026 10:15:57 +0900 Subject: [PATCH 005/123] chore(ci): unblock lint/type/test gates so the CLI fix can land MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The CI workflow runs `ruff check`, `mypy`, then `pytest`, and the fix/cli-clean-domain-errors branch was failing all three on pre-existing main-branch issues unrelated to the CLI change itself. * ruff: add `from e` to the seven `raise ValueError(...) from FileExistsError` re-raises added by the recent exclusive-create guards in storage.put_* (B904), and let ruff re-sort the cli.py import block (I001). * mypy: narrow the `kind` value flowing into `ContextItem(type=...)` with a `Literal` cast so the strict-typed field accepts what the search backends actually return. * pytest: `session_end()` mutates a session that `session_start()` has already written, but `put_session()` now uses exclusive create and rejects the second write. Add `KBStore.update_session()` mirroring `update_claim` and have `session_end` call it; existing test_sessions coverage now passes again. No behavior change for the CLI surface — these are infrastructure fixes so the existing test_sessions / lint / type assertions pass on this branch. --- src/vouch/cli.py | 6 +++--- src/vouch/context.py | 6 +++++- src/vouch/sessions.py | 2 +- src/vouch/storage.py | 37 +++++++++++++++++++++++-------------- 4 files changed, 32 insertions(+), 19 deletions(-) diff --git a/src/vouch/cli.py b/src/vouch/cli.py index dd649a44..1d38caf9 100644 --- a/src/vouch/cli.py +++ b/src/vouch/cli.py @@ -29,14 +29,14 @@ from .models import ProposalStatus from .proposals import ( ProposalError, - approve as do_approve, -) -from .proposals import ( propose_claim, propose_entity, propose_page, propose_relation, ) +from .proposals import ( + approve as do_approve, +) from .proposals import ( reject as do_reject, ) diff --git a/src/vouch/context.py b/src/vouch/context.py index 511517b6..532e7278 100644 --- a/src/vouch/context.py +++ b/src/vouch/context.py @@ -13,10 +13,14 @@ from __future__ import annotations +from typing import Literal, cast + from . import index_db from .models import ContextItem, ContextPack, ContextQuality from .storage import KBStore +ContextItemKind = Literal["claim", "page", "entity", "relation", "source"] + def _retrieve(store: KBStore, query: str, limit: int ) -> list[tuple[str, str, str, float, str]]: @@ -61,7 +65,7 @@ def build_context_pack( cites = _citations_for_claim(store, hid) items.append( ContextItem( - id=hid, type=kind, summary=summary, score=score, + id=hid, type=cast(ContextItemKind, kind), summary=summary, score=score, backend=backend, citations=cites, freshness="unknown", ) diff --git a/src/vouch/sessions.py b/src/vouch/sessions.py index 3e847c84..5a93134d 100644 --- a/src/vouch/sessions.py +++ b/src/vouch/sessions.py @@ -44,7 +44,7 @@ def session_end(store: KBStore, session_id: str, *, note: str | None = None) -> sess.proposal_ids = sorted({ p.id for p in store.list_proposals() if p.session_id == sess.id }) - store.put_session(sess) + store.update_session(sess) audit.log_event( store.kb_dir, event="session.end", actor=sess.agent, object_ids=[sess.id], data={"proposals": len(sess.proposal_ids)}, diff --git a/src/vouch/storage.py b/src/vouch/storage.py index 8249ea06..accd2332 100644 --- a/src/vouch/storage.py +++ b/src/vouch/storage.py @@ -246,10 +246,10 @@ def put_claim(self, claim: Claim) -> Claim: try: with self._claim_path(claim.id).open("x") as f: f.write(_yaml_dump(claim.model_dump(mode="json"))) - except FileExistsError: + except FileExistsError as e: raise ValueError( f"claim {claim.id} already exists -- use update_claim()" - ) + ) from e return claim def get_claim(self, claim_id: str) -> Claim: @@ -282,10 +282,10 @@ def put_page(self, page: Page) -> Page: try: with self._page_path(page.id).open("x") as f: f.write(_serialize_page(page)) - except FileExistsError: + except FileExistsError as e: raise ValueError( f"page {page.id} already exists -- choose a different slug" - ) + ) from e return page def get_page(self, page_id: str) -> Page: @@ -306,10 +306,10 @@ def put_entity(self, entity: Entity) -> Entity: try: with self._entity_path(entity.id).open("x") as f: f.write(_yaml_dump(entity.model_dump(mode="json"))) - except FileExistsError: + except FileExistsError as e: raise ValueError( f"entity {entity.id} already exists -- choose a different slug" - ) + ) from e return entity def get_entity(self, eid: str) -> Entity: @@ -331,10 +331,10 @@ def put_relation(self, rel: Relation) -> Relation: try: with self._relation_path(rel.id).open("x") as f: f.write(_yaml_dump(rel.model_dump(mode="json"))) - except FileExistsError: + except FileExistsError as e: raise ValueError( f"relation {rel.id} already exists -- choose a different slug" - ) + ) from e return rel def get_relation(self, rid: str) -> Relation: @@ -364,10 +364,10 @@ def put_evidence(self, ev: Evidence) -> Evidence: try: with self._evidence_path(ev.id).open("x") as f: f.write(_yaml_dump(ev.model_dump(mode="json"))) - except FileExistsError: + except FileExistsError as e: raise ValueError( f"evidence {ev.id} already exists -- choose a different slug" - ) + ) from e return ev def get_evidence(self, eid: str) -> Evidence: @@ -389,10 +389,19 @@ def put_session(self, sess: Session) -> Session: try: with self._session_path(sess.id).open("x") as f: f.write(_yaml_dump(sess.model_dump(mode="json"))) - except FileExistsError: + except FileExistsError as e: raise ValueError( f"session {sess.id} already exists -- choose a different id" - ) + ) from e + return sess + + def update_session(self, sess: Session) -> Session: + # session_end() mutates an already-on-disk session (sets ended_at / + # backfills proposal_ids). put_session() uses exclusive create as a + # guard against duplicate ids, so updates need a separate path. + if not self._session_path(sess.id).exists(): + raise ArtifactNotFoundError(f"session {sess.id}") + self._session_path(sess.id).write_text(_yaml_dump(sess.model_dump(mode="json"))) return sess def get_session(self, sid: str) -> Session: @@ -414,10 +423,10 @@ def put_proposal(self, proposal: Proposal) -> Proposal: try: with self._proposal_path(proposal.id).open("x") as f: f.write(_yaml_dump(proposal.model_dump(mode="json"))) - except FileExistsError: + except FileExistsError as e: raise ValueError( f"proposal {proposal.id} already exists -- choose a different id" - ) + ) from e return proposal def get_proposal(self, proposal_id: str) -> Proposal: From d3881ef03d4ec16f607b1f85d10655d8fc3be488 Mon Sep 17 00:00:00 2001 From: plind-junior <138900956+dripsmvcp@users.noreply.github.com> Date: Wed, 20 May 2026 10:21:11 +0900 Subject: [PATCH 006/123] chore(ci): unblock mypy + test gates for path-traversal PR The B904 lint failures were already addressed in 2a439a5, but the CI matrix still fails on two pre-existing main-branch issues: * mypy: context.py:64 passed `kind: str` into ContextItem.type, which is Literal["claim","page","entity","relation","source"]. Narrow it with a typing.cast so strict mode accepts the search-backend output. * pytest: session_end() mutates a session that session_start() already wrote, but put_session() switched to exclusive create and rejects the second write. Add KBStore.update_session() mirroring update_claim and have session_end call it; test_sessions coverage passes again. No behavior change for the path-traversal fix itself. --- src/vouch/context.py | 6 +++++- src/vouch/sessions.py | 2 +- src/vouch/storage.py | 9 +++++++++ 3 files changed, 15 insertions(+), 2 deletions(-) diff --git a/src/vouch/context.py b/src/vouch/context.py index 511517b6..532e7278 100644 --- a/src/vouch/context.py +++ b/src/vouch/context.py @@ -13,10 +13,14 @@ from __future__ import annotations +from typing import Literal, cast + from . import index_db from .models import ContextItem, ContextPack, ContextQuality from .storage import KBStore +ContextItemKind = Literal["claim", "page", "entity", "relation", "source"] + def _retrieve(store: KBStore, query: str, limit: int ) -> list[tuple[str, str, str, float, str]]: @@ -61,7 +65,7 @@ def build_context_pack( cites = _citations_for_claim(store, hid) items.append( ContextItem( - id=hid, type=kind, summary=summary, score=score, + id=hid, type=cast(ContextItemKind, kind), summary=summary, score=score, backend=backend, citations=cites, freshness="unknown", ) diff --git a/src/vouch/sessions.py b/src/vouch/sessions.py index 3e847c84..5a93134d 100644 --- a/src/vouch/sessions.py +++ b/src/vouch/sessions.py @@ -44,7 +44,7 @@ def session_end(store: KBStore, session_id: str, *, note: str | None = None) -> sess.proposal_ids = sorted({ p.id for p in store.list_proposals() if p.session_id == sess.id }) - store.put_session(sess) + store.update_session(sess) audit.log_event( store.kb_dir, event="session.end", actor=sess.agent, object_ids=[sess.id], data={"proposals": len(sess.proposal_ids)}, diff --git a/src/vouch/storage.py b/src/vouch/storage.py index 9523de75..d09a8f1f 100644 --- a/src/vouch/storage.py +++ b/src/vouch/storage.py @@ -407,6 +407,15 @@ def put_session(self, sess: Session) -> Session: ) from e return sess + def update_session(self, sess: Session) -> Session: + # session_end() mutates an already-on-disk session (sets ended_at / + # backfills proposal_ids). put_session() uses exclusive create as a + # guard against duplicate ids, so updates need a separate path. + if not self._session_path(sess.id).exists(): + raise ArtifactNotFoundError(f"session {sess.id}") + self._session_path(sess.id).write_text(_yaml_dump(sess.model_dump(mode="json"))) + return sess + def get_session(self, sid: str) -> Session: p = self._session_path(sid) if not p.exists(): From 8a092959b608729176ac98e98678192fde04a6ef Mon Sep 17 00:00:00 2001 From: plind-junior <138900956+dripsmvcp@users.noreply.github.com> Date: Wed, 20 May 2026 10:34:11 +0900 Subject: [PATCH 007/123] fix(server): close TOCTOU window between path check and read CodeRabbit on PR #28 noted that resolve_under_root() only validated a pathname snapshot. Callers then re-opened the same name with .is_file() and .read_bytes(), so an attacker who can swap the resolved path for a symlink between the containment check and the read can still exfiltrate an out-of-root file via kb.register_source_from_path. Collapse the validate-then-read into a single trusted helper `KBStore.read_under_root(path)` that returns `(resolved, bytes)`: 1. Path.resolve() chases pre-existing symlinks and the resulting target is checked for containment (existing behaviour -- legitimate in-root symlinks still work). 2. The read goes through `os.open(resolved, O_RDONLY | O_NOFOLLOW)` so a fresh symlink placed at the resolved name *after* the check fails with ELOOP rather than following the swap. 3. `fstat` + `S_ISREG` rejects directories / device nodes / pipes atomically on the same fd, replacing the racy `is_file()` test the callers used to do. Both register_source_from_path handlers (MCP + JSONL) switch to the new helper and drop their now-redundant follow-up checks. Adds tests: - symlink swapped into the resolved name -> rejected via ELOOP - directory at a valid path -> rejected via S_ISREG Existing "outside the root" and "inside the root" tests still pass. --- src/vouch/jsonl_server.py | 6 ++---- src/vouch/server.py | 6 ++---- src/vouch/storage.py | 31 ++++++++++++++++++++++++++----- tests/test_jsonl_server.py | 33 +++++++++++++++++++++++++++++++++ 4 files changed, 63 insertions(+), 13 deletions(-) diff --git a/src/vouch/jsonl_server.py b/src/vouch/jsonl_server.py index a5bfc183..a3ac7ec1 100644 --- a/src/vouch/jsonl_server.py +++ b/src/vouch/jsonl_server.py @@ -174,11 +174,9 @@ def _h_register_source(p: dict) -> dict: def _h_register_source_from_path(p: dict) -> dict: s = _store() - path = s.resolve_under_root(p["path"]) - if not path.is_file(): - raise ValueError(f"not a file: {path}") + path, body = s.read_under_root(p["path"]) src = s.put_source( - path.read_bytes(), + body, title=p.get("title") or path.name, url=p.get("url"), locator=str(path), diff --git a/src/vouch/server.py b/src/vouch/server.py index 4c9eacd9..a2984042 100644 --- a/src/vouch/server.py +++ b/src/vouch/server.py @@ -226,11 +226,9 @@ def kb_register_source_from_path(path: str, title: str | None = None, url: str | None = None, source_type: str = "file") -> dict[str, Any]: s = _store() - p = s.resolve_under_root(path) - if not p.is_file(): - raise ValueError(f"not a file: {p}") + p, body = s.read_under_root(path) src = s.put_source( - p.read_bytes(), title=title or p.name, url=url, + body, title=title or p.name, url=url, locator=str(p), source_type=source_type, ) audit.log_event(s.kb_dir, event="source.add", actor=_agent(), diff --git a/src/vouch/storage.py b/src/vouch/storage.py index d09a8f1f..51bc8cea 100644 --- a/src/vouch/storage.py +++ b/src/vouch/storage.py @@ -24,7 +24,9 @@ from __future__ import annotations import hashlib +import os import re +import stat from pathlib import Path from typing import Any @@ -111,17 +113,36 @@ def __init__(self, root: Path): self.root = root.resolve() self.kb_dir = self.root / KB_DIRNAME - def resolve_under_root(self, path: str | Path) -> Path: + def read_under_root(self, path: str | Path) -> tuple[Path, bytes]: # Guard against arbitrary-file-read primitives exposed by the MCP / - # JSONL `register_source_from_path` entrypoints. Symlinks are followed - # before the containment check so a symlink inside the project that - # points outside is rejected. + # JSONL `register_source_from_path` entrypoints, and against a TOCTOU + # race between the containment check and the read: an attacker who + # can swap the resolved name for a symlink after Path.resolve() has + # validated it could otherwise still exfiltrate an out-of-root file. + # + # Path.resolve() chases any pre-existing symlinks first (so legitimate + # in-root symlinks still work, then their target is the thing checked + # for containment). O_NOFOLLOW on the open then rejects a fresh + # symlink swapped into the resolved name after the containment check. + # fstat + S_ISREG rejects directories / special files atomically. resolved = Path(path).resolve() if not resolved.is_relative_to(self.root): raise ValueError( f"path must be inside project root ({self.root}): {resolved}" ) - return resolved + try: + fd = os.open(resolved, os.O_RDONLY | os.O_NOFOLLOW) + except OSError as e: + raise ValueError(f"cannot read {resolved}: {e}") from e + try: + if not stat.S_ISREG(os.fstat(fd).st_mode): + os.close(fd) + raise ValueError(f"not a regular file: {resolved}") + except OSError: + os.close(fd) + raise + with os.fdopen(fd, "rb") as f: + return resolved, f.read() # --- bootstrap --------------------------------------------------------- diff --git a/tests/test_jsonl_server.py b/tests/test_jsonl_server.py index 3afac4f7..791a029d 100644 --- a/tests/test_jsonl_server.py +++ b/tests/test_jsonl_server.py @@ -103,6 +103,39 @@ def test_register_source_from_path_accepts_inside_root( assert len(store.list_sources()) == 1 +def test_read_under_root_rejects_symlink_at_resolved_path( + store: KBStore, monkeypatch: pytest.MonkeyPatch +) -> None: + # CodeRabbit review on PR #28 flagged a TOCTOU between the containment + # check and the actual read: even after Path.resolve() lands inside the + # KB root, an attacker who can swap the resolved name for a symlink + # before the read could still exfiltrate an out-of-root file. Defence + # is O_NOFOLLOW at open time. + # + # Simulate the race by short-circuiting Path.resolve() so the symlink + # itself is the "resolved" path that read_under_root opens. + target = store.root / "real.txt" + target.write_bytes(b"real content") + swap_link = store.root / "swap.txt" + swap_link.symlink_to(target) + monkeypatch.setattr(Path, "resolve", lambda self, **_kw: self) + + with pytest.raises(ValueError, match="cannot read"): + store.read_under_root(swap_link) + + +def test_read_under_root_rejects_directory( + store: KBStore, tmp_path: Path +) -> None: + # Without the fstat/S_ISREG check, an attacker could ingest a directory + # listing or device node through register_source_from_path. read_under_root + # rejects anything that isn't a regular file even when it lives inside root. + subdir = store.root / "subdir" + subdir.mkdir() + with pytest.raises(ValueError, match="not a regular file"): + store.read_under_root(subdir) + + def test_jsonl_session_lifecycle(store: KBStore, monkeypatch) -> None: src = store.put_source(b"e") monkeypatch.chdir(store.root) From 784a7b533d83a6659e83306c8ac9279cbd0525c0 Mon Sep 17 00:00:00 2001 From: plind-junior <138900956+dripsmvcp@users.noreply.github.com> Date: Wed, 20 May 2026 08:15:04 +0900 Subject: [PATCH 008/123] chore(lint): chain FileExistsError cause in storage put_ methods ruff B904 requires `raise ... from err` inside an except block so the original exception is preserved on the chained __cause__. Without it, the CI lint step rejects the file. The seven sites are pre-existing (put_claim, put_page, put_entity, put_relation, put_evidence, put_session, put_proposal); this PR inherited the failure from main rather than introducing it, but the path traversal fix cannot land until lint is green, so the cleanup happens here. No behavior change: the chained exception carries .__cause__ but the public ValueError message and type are unchanged. --- src/vouch/storage.py | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/src/vouch/storage.py b/src/vouch/storage.py index 8249ea06..eb9c9f7f 100644 --- a/src/vouch/storage.py +++ b/src/vouch/storage.py @@ -246,10 +246,10 @@ def put_claim(self, claim: Claim) -> Claim: try: with self._claim_path(claim.id).open("x") as f: f.write(_yaml_dump(claim.model_dump(mode="json"))) - except FileExistsError: + except FileExistsError as e: raise ValueError( f"claim {claim.id} already exists -- use update_claim()" - ) + ) from e return claim def get_claim(self, claim_id: str) -> Claim: @@ -282,10 +282,10 @@ def put_page(self, page: Page) -> Page: try: with self._page_path(page.id).open("x") as f: f.write(_serialize_page(page)) - except FileExistsError: + except FileExistsError as e: raise ValueError( f"page {page.id} already exists -- choose a different slug" - ) + ) from e return page def get_page(self, page_id: str) -> Page: @@ -306,10 +306,10 @@ def put_entity(self, entity: Entity) -> Entity: try: with self._entity_path(entity.id).open("x") as f: f.write(_yaml_dump(entity.model_dump(mode="json"))) - except FileExistsError: + except FileExistsError as e: raise ValueError( f"entity {entity.id} already exists -- choose a different slug" - ) + ) from e return entity def get_entity(self, eid: str) -> Entity: @@ -331,10 +331,10 @@ def put_relation(self, rel: Relation) -> Relation: try: with self._relation_path(rel.id).open("x") as f: f.write(_yaml_dump(rel.model_dump(mode="json"))) - except FileExistsError: + except FileExistsError as e: raise ValueError( f"relation {rel.id} already exists -- choose a different slug" - ) + ) from e return rel def get_relation(self, rid: str) -> Relation: @@ -364,10 +364,10 @@ def put_evidence(self, ev: Evidence) -> Evidence: try: with self._evidence_path(ev.id).open("x") as f: f.write(_yaml_dump(ev.model_dump(mode="json"))) - except FileExistsError: + except FileExistsError as e: raise ValueError( f"evidence {ev.id} already exists -- choose a different slug" - ) + ) from e return ev def get_evidence(self, eid: str) -> Evidence: @@ -389,10 +389,10 @@ def put_session(self, sess: Session) -> Session: try: with self._session_path(sess.id).open("x") as f: f.write(_yaml_dump(sess.model_dump(mode="json"))) - except FileExistsError: + except FileExistsError as e: raise ValueError( f"session {sess.id} already exists -- choose a different id" - ) + ) from e return sess def get_session(self, sid: str) -> Session: @@ -414,10 +414,10 @@ def put_proposal(self, proposal: Proposal) -> Proposal: try: with self._proposal_path(proposal.id).open("x") as f: f.write(_yaml_dump(proposal.model_dump(mode="json"))) - except FileExistsError: + except FileExistsError as e: raise ValueError( f"proposal {proposal.id} already exists -- choose a different id" - ) + ) from e return proposal def get_proposal(self, proposal_id: str) -> Proposal: From df508a57fd580796c1632dd4ce1043853a56162b Mon Sep 17 00:00:00 2001 From: plind-junior <138900956+dripsmvcp@users.noreply.github.com> Date: Wed, 20 May 2026 10:21:11 +0900 Subject: [PATCH 009/123] chore(ci): unblock mypy + test gates for path-traversal PR The B904 lint failures were already addressed in 2a439a5, but the CI matrix still fails on two pre-existing main-branch issues: * mypy: context.py:64 passed `kind: str` into ContextItem.type, which is Literal["claim","page","entity","relation","source"]. Narrow it with a typing.cast so strict mode accepts the search-backend output. * pytest: session_end() mutates a session that session_start() already wrote, but put_session() switched to exclusive create and rejects the second write. Add KBStore.update_session() mirroring update_claim and have session_end call it; test_sessions coverage passes again. No behavior change for the path-traversal fix itself. --- src/vouch/context.py | 6 +++++- src/vouch/sessions.py | 2 +- src/vouch/storage.py | 9 +++++++++ 3 files changed, 15 insertions(+), 2 deletions(-) diff --git a/src/vouch/context.py b/src/vouch/context.py index 511517b6..532e7278 100644 --- a/src/vouch/context.py +++ b/src/vouch/context.py @@ -13,10 +13,14 @@ from __future__ import annotations +from typing import Literal, cast + from . import index_db from .models import ContextItem, ContextPack, ContextQuality from .storage import KBStore +ContextItemKind = Literal["claim", "page", "entity", "relation", "source"] + def _retrieve(store: KBStore, query: str, limit: int ) -> list[tuple[str, str, str, float, str]]: @@ -61,7 +65,7 @@ def build_context_pack( cites = _citations_for_claim(store, hid) items.append( ContextItem( - id=hid, type=kind, summary=summary, score=score, + id=hid, type=cast(ContextItemKind, kind), summary=summary, score=score, backend=backend, citations=cites, freshness="unknown", ) diff --git a/src/vouch/sessions.py b/src/vouch/sessions.py index 3e847c84..5a93134d 100644 --- a/src/vouch/sessions.py +++ b/src/vouch/sessions.py @@ -44,7 +44,7 @@ def session_end(store: KBStore, session_id: str, *, note: str | None = None) -> sess.proposal_ids = sorted({ p.id for p in store.list_proposals() if p.session_id == sess.id }) - store.put_session(sess) + store.update_session(sess) audit.log_event( store.kb_dir, event="session.end", actor=sess.agent, object_ids=[sess.id], data={"proposals": len(sess.proposal_ids)}, diff --git a/src/vouch/storage.py b/src/vouch/storage.py index eb9c9f7f..accd2332 100644 --- a/src/vouch/storage.py +++ b/src/vouch/storage.py @@ -395,6 +395,15 @@ def put_session(self, sess: Session) -> Session: ) from e return sess + def update_session(self, sess: Session) -> Session: + # session_end() mutates an already-on-disk session (sets ended_at / + # backfills proposal_ids). put_session() uses exclusive create as a + # guard against duplicate ids, so updates need a separate path. + if not self._session_path(sess.id).exists(): + raise ArtifactNotFoundError(f"session {sess.id}") + self._session_path(sess.id).write_text(_yaml_dump(sess.model_dump(mode="json"))) + return sess + def get_session(self, sid: str) -> Session: p = self._session_path(sid) if not p.exists(): From a3c24a4e1019e5662f0c391c337b494e3798e2b6 Mon Sep 17 00:00:00 2001 From: plind-junior <59729252+plind-junior@users.noreply.github.com> Date: Wed, 20 May 2026 21:54:22 +0900 Subject: [PATCH 010/123] docs: add banner diagram to README --- README.md | 5 ++ docs/banner.svg | 214 ++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 219 insertions(+) create mode 100644 docs/banner.svg diff --git a/README.md b/README.md index 67ff2ec0..662878ca 100644 --- a/README.md +++ b/README.md @@ -2,6 +2,11 @@ **Git-native, review-gated knowledge base for LLM agents. MCP server + JSONL tool server + CLI.** +

+ vouch — propose → review → commit → retrieve +

+ + > Agents should not start every session with amnesia — but they shouldn't get to write whatever they want either. `vouch` is a knowledge base for LLM agents with an explicit **review gate**: agents *propose* writes; humans *approve* them with `vouch approve`. Approved artifacts are plain files on disk — YAML for claims, markdown for pages — so the KB lives in your repo, is reviewed in PRs, diffs cleanly, and can be exported as a portable bundle. diff --git a/docs/banner.svg b/docs/banner.svg new file mode 100644 index 00000000..8dbd52f9 --- /dev/null +++ b/docs/banner.svg @@ -0,0 +1,214 @@ + + + + + + + + + + + + + + + + + + + vouch + Review-gated knowledge base for LLM agents + + + + + + + local-first + + + + + review-gated + + + + + cited + + + + + + auditable + + + + + + + + + 1 + Propose + + + + + register source + sha256 + meta + + + + + propose claim + must cite source + + + + + propose page + markdown + frontmatter + + + + + + propose entity / relation + graph edges + + + + + + + + + + + 2 + Review + the gate + + + + PENDING + prop-7f3c · claim · cites src-9b2e + + + + + + + + approve + + + + + reject + + + + + human or trusted agent + vouch approve <id> + + + + + + + + + + + 3 + Commit + + + + claims/<id>.yaml + durable, cited, signed-off + + + + pages/<id>.md + markdown + frontmatter + + + + audit.log.jsonl + append-only · actor · ts + + + + + git commit + PR is the review UI + + + + + + + + + + + 4 + Retrieve + + + + $ vouch serve + MCP · JSONL + + + + + kb.search · FTS5 + ranked snippets + + + + kb.context · task pack + quality-gated bundle + + + + vouch export + portable bundle · sha256 + + + + + + + + + .vouch/ — your KB lives in git + + + claim: + auth-uses-jwt — sessions are stateless JWT + cites: + src-9b2e (README.md #L42), src-4a1e (PR #214) + status: + stable + confidence: + 0.9 + audit: + proposed · approved by @alice · 2026-05-12 + proposed_by: + claude-code (session sess-2f81) + + + + + + + + + propose → review → commit → retrieve · agents write proposals · humans approve · git is the source of truth + From 23f504f9df6d3ebdb2d8724a0d299c54257a5406 Mon Sep 17 00:00:00 2001 From: dripsmvcp <138900956+dripsmvcp@users.noreply.github.com> Date: Wed, 20 May 2026 11:36:36 +0900 Subject: [PATCH 011/123] docs(spec): semantic search as primary retrieval backend Approved design for feat/semantic-search. Embedding (sentence- transformers all-mpnet-base-v2) becomes the primary search backend with FTS5 as fallback. Synchronous-at-write indexing across all six artifact types (claim, page, source, entity, relation, evidence). Maximally functional scope (~3000 LOC): pluggable model adapter registry, sqlite-vec ANN with NumPy fallback, cross-encoder rerank, HyDE query expansion, ingest-time duplicate detection, model-identity migration, recall/MRR/nDCG eval harness, and full CLI/MCP/JSONL parity. The writing-plans step will turn the rollout order in section 16 into concrete phased tasks. --- .../2026-05-20-semantic-search-design.md | 258 ++++++++++++++++++ 1 file changed, 258 insertions(+) create mode 100644 docs/superpowers/specs/2026-05-20-semantic-search-design.md diff --git a/docs/superpowers/specs/2026-05-20-semantic-search-design.md b/docs/superpowers/specs/2026-05-20-semantic-search-design.md new file mode 100644 index 00000000..e22aa37b --- /dev/null +++ b/docs/superpowers/specs/2026-05-20-semantic-search-design.md @@ -0,0 +1,258 @@ +# Semantic Search Design — vouch + +**Date:** 2026-05-20 +**Status:** Approved (design) +**Branch:** `feat/semantic-search` +**Tracks issue:** (to be filed) + +## 1. Goal + +Add embedding-based semantic retrieval as the **primary** search backend in vouch's MCP, JSONL, and CLI search surfaces, with FTS5 as the deterministic fallback. Cover every artifact type (claims, sources, pages, entities, relations, evidence) with reranking, query expansion, duplicate detection, eval harness, and pluggable model adapters. + +The existing search layer is FTS5 + substring (`src/vouch/index_db.py`, `src/vouch/storage.py:search_substring`). The current code even anticipates this addition — `index_db.py:8-9`: + +> *"Vector search can be layered later as a second `backend` in the ContextItem response."* + +This spec realizes that. + +## 2. Integration shape + +Decisions taken during brainstorming (all confirmed with the user): + +| Axis | Choice | +|---|---| +| Integration mode | **Embedding as primary, FTS5 as fallback** (was: opt-in / hybrid-default / primary) | +| Compute timing | **Synchronous at write** (mirrors FTS5 today) | +| Default model | **`sentence-transformers/all-mpnet-base-v2`** — 768-dim, ~420MB, best quality at its tier | +| Vector store | **`sqlite-vec`** ANN, with **NumPy brute-force** fallback if the extension is unavailable | +| Default behavior | Behavior change: `kb.search` returns embedding hits first, FTS5 only if embedding returns none. Documented in changelog. | +| Scope | Maximally functional — all artifact types, reranking, HyDE, dedup, eval harness, multiple model adapters | + +## 3. New package layout + +``` +src/vouch/embeddings/ + __init__.py # public API: encode, search, register + base.py # Embedder ABC + adapter registry + st_mpnet.py # default impl (sentence-transformers all-mpnet-base-v2) + st_minilm.py # alternative impl + fastembed_bge.py # alternative impl (no-torch path via fastembed) + cache.py # query embedding LRU + content-hash skip cache + rerank.py # cross-encoder reranker (ms-marco-MiniLM-L6-v2) + hyde.py # Hypothetical Document Embedding query expansion + dedup.py # cosine-threshold duplicate detection at ingest + fusion.py # RRF, weighted-sum, normalized-cosine fusion strategies + eval.py # recall@k / MRR / nDCG harness + migration.py # model-identity check + backfill orchestration +``` + +## 4. Storage layout (extends `.vouch/state.db`) + +```sql +-- per-artifact ANN tables (sqlite-vec vec0 virtual tables) +CREATE VIRTUAL TABLE claim_vecs USING vec0(embedding float[768]); +CREATE VIRTUAL TABLE page_vecs USING vec0(embedding float[768]); +CREATE VIRTUAL TABLE source_vecs USING vec0(embedding float[768]); +CREATE VIRTUAL TABLE entity_vecs USING vec0(embedding float[768]); +CREATE VIRTUAL TABLE relation_vecs USING vec0(embedding float[768]); +CREATE VIRTUAL TABLE evidence_vecs USING vec0(embedding float[768]); + +-- mapping vec0 rowid <-> artifact id (+ content hash for skip-if-unchanged) +CREATE TABLE embedding_index ( + kind TEXT NOT NULL, + id TEXT NOT NULL, + rowid INTEGER NOT NULL, + content_hash TEXT NOT NULL, + model TEXT NOT NULL, + model_version TEXT NOT NULL, + dim INTEGER NOT NULL, + created_at TEXT NOT NULL, + PRIMARY KEY (kind, id) +); + +-- model identity for mismatch detection +-- stored as rows in existing index_meta table: +-- ('embedding_model', 'sentence-transformers/all-mpnet-base-v2') +-- ('embedding_dim', '768') +-- ('embedding_lib', 'sentence-transformers') +-- ('embedding_lib_version', '') + +-- query embedding cache (content-addressed) +CREATE TABLE query_embedding_cache ( + query_hash TEXT PRIMARY KEY, + vec BLOB NOT NULL, + hit_count INTEGER NOT NULL DEFAULT 1, + last_used_at TEXT NOT NULL +); + +-- duplicate detection ledger (audit trail for ingest-time near-dupes) +CREATE TABLE embedding_dupes ( + kind TEXT NOT NULL, + id TEXT NOT NULL, + near_id TEXT NOT NULL, + cosine REAL NOT NULL, + detected_at TEXT NOT NULL +); +``` + +`state.db` is derived. Losing it is non-fatal — `vouch reindex --embeddings --backfill` regenerates from disk. Same invariant as FTS5 today. + +## 5. Touched modules and estimated LOC + +| Module | Change | Est. LOC | +|---|---|---| +| `embeddings/base.py` | `Embedder` ABC, `register`, content hashing, batched encode | 120 | +| `embeddings/st_mpnet.py` | Default adapter | 80 | +| `embeddings/st_minilm.py` | Alternative adapter | 60 | +| `embeddings/fastembed_bge.py` | Alternative adapter (no-torch) | 80 | +| `embeddings/cache.py` | LRU query cache + persistent backing | 100 | +| `embeddings/rerank.py` | Cross-encoder reranker | 110 | +| `embeddings/hyde.py` | Template HyDE + optional LLM hook | 80 | +| `embeddings/dedup.py` | Ingest-time duplicate detection | 90 | +| `embeddings/fusion.py` | RRF, weighted, normalized-cosine fusion | 100 | +| `embeddings/eval.py` | recall@k / MRR / nDCG eval runner | 150 | +| `embeddings/migration.py` | Model-identity check + backfill orchestration | 110 | +| `index_db.py` | Vector tables, search fns, hybrid path, schema migration | 250 | +| `storage.py` | Hook all 6 `put_*` + `update_*` paths | 80 | +| `server.py` | Extended `kb_search` + 5 new MCP tools | 180 | +| `jsonl_server.py` | Parity for all new MCP tools | 160 | +| `cli.py` | Flags on existing commands + new commands | 250 | +| `context.py` | Semantic-default + `--explain` breakdown | 80 | +| `lifecycle.py` | Re-embed on `update_claim` / `update_page` | 60 | +| `pyproject.toml` | Three optional-deps extras | 15 | +| **Tests** | 9 files, ~900 LOC | 900 | +| **Total** | | **~3055 lines** | + +## 6. Default behavior + +| Call | Behavior | +|---|---| +| `kb.search(query)` | Embedding primary; FTS5 only if embedding returns zero hits. | +| `kb.search(query, backend="hybrid")` | RRF fusion of embedding + FTS5 result lists. | +| `kb.search(query, backend="hybrid", rerank=True)` | Hybrid + cross-encoder rerank of top-50. | +| `kb.search(query, hyde=True)` | Query expanded via HyDE template before encoding. | +| `kb.search(query, backend="fts5")` | Force lexical-only (precision mode). | +| `build_context_pack(task)` | Semantic-default; `--explain` returns per-result score breakdown. | + +Every flag exposed identically across CLI / MCP / JSONL. + +## 7. Write path + +For every `put_*` and `update_*` in `KBStore`: + +1. Compute `content_hash = sha256(text)`. If `embedding_index` has the same `(kind, id, content_hash)`, **skip encode** (idempotent re-ingest is free). +2. Otherwise: `Embedder.encode(text)` synchronously; persist to `_vecs` and `embedding_index`. +3. Run `dedup.check()` — cosine vs top-1 nearest neighbor. If ≥ `dedup_threshold` (default 0.95), log to `embedding_dupes` and emit `embedding.duplicate_detected` audit event. Ingest still proceeds. +4. Invalidate any `query_embedding_cache` entries known to reference this artifact (cache invalidation: drop entries by `last_used_at` age cutoff; full LRU eviction on cap). + +## 8. Migration / backfill + +On `KBStore.__init__`: + +- Read `index_meta.embedding_model`. If absent (legacy KB) or mismatched with the current adapter: + - Emit `embedding.model_mismatch` audit event. + - `kb.search` still works via FTS5 fallback path; embedding results carry `embedding_stale: true` until reindex. + - Maintainer-visible warning surfaces in `vouch doctor` and `vouch embeddings stats`. +- `vouch reindex --embeddings --backfill` does a single-pass re-encode of all artifacts under the current adapter, updates `index_meta`, drops `embedding_stale` tagging. + +## 9. CLI surface + +```bash +# search +vouch search "query" +vouch search "query" --semantic --top-k 20 --min-score 0.4 +vouch search "query" --hybrid --rerank --hyde --explain +vouch search "query" --backend fts5 # force lexical + +# reindex +vouch reindex --embeddings [--model NAME] [--backfill] [--force] + +# eval +vouch eval embedding --queries eval/queries.jsonl --metric recall@10,mrr,ndcg + +# dedup +vouch dedup --threshold 0.95 --dry-run + +# stats +vouch embeddings stats # model identity, vector counts, cache hit rate +``` + +## 10. MCP / JSONL parity + +Every new flag/command exposed identically as a tool: + +- `kb.search` gains: `backend`, `top_k`, `min_score`, `rerank`, `hyde`, `explain` +- New tools: `kb.reindex_embeddings`, `kb.eval_embeddings`, `kb.dedup_scan`, `kb.embeddings_stats` + +JSONL handlers mirror the MCP tools 1:1 (same method names, same param names). + +## 11. Dependencies + +```toml +# pyproject.toml +[project.optional-dependencies] +embeddings = ["sentence-transformers>=2.7", "numpy>=1.26", "sqlite-vec>=0.1"] +embeddings-fast = ["fastembed>=0.3", "onnxruntime>=1.18", "sqlite-vec>=0.1"] +rerank = ["sentence-transformers>=2.7"] # shared base with embeddings +``` + +Base install stays lean. CI matrix exercises all three install modes (none / `[embeddings]` / `[embeddings-fast]`). + +## 12. Default values (tunable via config) + +| Knob | Default | Source | +|---|---|---| +| Model cache location | `~/.cache/vouch/models/` | env `VOUCH_MODEL_CACHE` override | +| Embedding dimension | 768 (matches mpnet) | derived from model | +| Dedup threshold | 0.95 cosine | `config.yaml` | +| Rerank top-K | 50 | CLI flag | +| HyDE template | template-only (no LLM) | CLI flag enables LLM hook | +| Query cache size | 1024 LRU entries | `config.yaml` | +| Backend ordering | `["embedding", "fts5"]` | `config.yaml` | + +## 13. Test plan (~900 LOC across 9 files) + +| File | Covers | +|---|---| +| `tests/test_embeddings_core.py` | Embedder ABC, registry, content-hash skip, batched encode, lazy load | +| `tests/test_embeddings_storage.py` | vec0 + sqlite-vec round trip + NumPy fallback parity | +| `tests/test_embeddings_search.py` | Semantic primary, FTS5 fallback, lexical-disjoint regression | +| `tests/test_embeddings_fusion.py` | RRF, weighted, normalized fusion strategies correctness | +| `tests/test_embeddings_rerank.py` | Cross-encoder rerank changes top-K order on a known pair | +| `tests/test_embeddings_hyde.py` | HyDE expansion improves recall on terse queries | +| `tests/test_embeddings_dedup.py` | Threshold ledger + audit event | +| `tests/test_embeddings_migration.py` | Model-version mismatch + backfill flow | +| `tests/test_embeddings_eval.py` | recall@k / MRR / nDCG correctness on synthetic ground truth | +| `tests/test_embeddings_cli.py` | CLI flag routing | + +## 14. Acceptance criteria + +- [ ] `vouch search --semantic "how do we authenticate users"` returns a claim that says *"login flow uses session cookies signed by the API"* in a KB with no lexical overlap. +- [ ] `pip install vouch` (no extras) still works and uses FTS5/substring without errors. +- [ ] `pip install vouch[embeddings]` enables the full embedding stack with no other code changes required. +- [ ] `vouch reindex --embeddings --backfill` is idempotent; running twice yields the same `embedding_index` row count. +- [ ] All 9 test files pass; `ruff` and `mypy` clean. +- [ ] CI matrix runs `(base, [embeddings], [embeddings-fast])` and all three modes pass. +- [ ] Model-identity mismatch (delete `state.db`, change `embedding_model` in `index_meta`) produces a clear warning, NOT a crash. + +## 15. Out of scope (genuinely orthogonal — separate spec) + +- Multi-language / cross-lingual models (deferred to a follow-up; current scope is English). +- Distributed embedding compute (everything stays in-process). +- Online learning / fine-tuning hooks (consumers can bring their own adapter via the registry). +- Replacement of FTS5 (FTS5 stays as fallback / precision-mode forever). + +## 16. Rollout order (suggested for implementation plan) + +The `writing-plans` step will turn this into concrete tasks. Suggested phases: + +1. **Foundation** — `embeddings/base.py`, default adapter, `pyproject.toml` extras +2. **Storage** — `index_db.py` vec tables, NumPy fallback, schema migration +3. **Write path** — `storage.py` hook on `put_claim` (first artifact type); extend to remaining 5 +4. **Read path** — `index_db.search_embedding`, integrate into `kb.search` (MCP + JSONL + CLI) +5. **Fusion + hybrid** — `embeddings/fusion.py`, hybrid backend +6. **Rerank, HyDE, dedup, eval, migration** — independent capability slices +7. **Context pack + explain** — `context.py` updates +8. **CLI + JSONL parity sweep** — `vouch search/reindex/eval/dedup/embeddings` + +Each phase ends with passing tests for its slice — no big-bang merge. From 2206cb3328765ae82a7b833174e4b1e077c93718 Mon Sep 17 00:00:00 2001 From: dripsmvcp <138900956+dripsmvcp@users.noreply.github.com> Date: Wed, 20 May 2026 11:36:36 +0900 Subject: [PATCH 012/123] docs(plan): semantic search implementation plan 32-task TDD plan for the semantic-search feature: foundation, storage, write hooks across all six artifact types, semantic-primary search integration in MCP/JSONL/CLI, RRF fusion + hybrid, cross-encoder rerank, HyDE expansion, ingest-time duplicate detection, model-identity migration, recall/MRR/nDCG scorer, end-to-end integration test, and user docs. Each task: failing test, minimal implementation, passing test, commit. MockEmbedder test double keeps the unit suite fast; the real model is exercised only under @pytest.mark.integration. The evaluation module is named scorer.py rather than eval.py to avoid shadowing the Python builtin and to keep static analysers quiet; the user-facing CLI subcommand remains `vouch eval embedding` (the Click group is registered under the name "eval", with the Python identifier eval_group). --- .../plans/2026-05-20-semantic-search.md | 3769 +++++++++++++++++ 1 file changed, 3769 insertions(+) create mode 100644 docs/superpowers/plans/2026-05-20-semantic-search.md diff --git a/docs/superpowers/plans/2026-05-20-semantic-search.md b/docs/superpowers/plans/2026-05-20-semantic-search.md new file mode 100644 index 00000000..94adfae1 --- /dev/null +++ b/docs/superpowers/plans/2026-05-20-semantic-search.md @@ -0,0 +1,3769 @@ +# Semantic Search Implementation Plan + +> **For agentic workers:** REQUIRED SUB-SKILL: Use `superpowers:subagent-driven-development` (recommended) or `superpowers:executing-plans` to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking. + +**Goal:** Add embedding-based semantic retrieval as the primary search backend in vouch (CLI, MCP, JSONL), with FTS5 as fallback. Cover all six artifact types, sqlite-vec ANN with NumPy fallback, cross-encoder rerank, HyDE expansion, ingest-time duplicate detection, model-version migration, and eval harness. + +**Architecture:** New `src/vouch/embeddings/` package with pluggable model adapters (registry pattern). Synchronous-at-write embedding via hooks in `KBStore.put_*` and `update_*`. Vectors stored in `sqlite-vec` virtual tables under `.vouch/state.db`, with a pure-NumPy brute-force fallback if the extension is unavailable. Default model: `sentence-transformers/all-mpnet-base-v2` (768-dim). + +**Tech Stack:** Python 3.11+, `sentence-transformers`, `sqlite-vec`, `numpy`, existing `sqlite3`/`pydantic`/`click` from base. Optional adapters: `fastembed` + `onnxruntime`. Tests use pytest + a `MockEmbedder` test double for speed; one integration test exercises the real model under `@pytest.mark.integration`. + +**Spec:** `docs/superpowers/specs/2026-05-20-semantic-search-design.md` + +--- + +## File Structure + +### New files + +``` +src/vouch/embeddings/__init__.py # public API re-exports +src/vouch/embeddings/base.py # Embedder ABC, registry, content_hash +src/vouch/embeddings/st_mpnet.py # default adapter +src/vouch/embeddings/st_minilm.py # alt adapter +src/vouch/embeddings/fastembed_bge.py # alt adapter (no-torch) +src/vouch/embeddings/cache.py # query cache LRU +src/vouch/embeddings/rerank.py # cross-encoder reranker +src/vouch/embeddings/hyde.py # HyDE query expansion +src/vouch/embeddings/dedup.py # ingest-time duplicate detection +src/vouch/embeddings/fusion.py # RRF/weighted/normalized fusion +src/vouch/embeddings/scorer.py # recall@k / MRR / nDCG harness +src/vouch/embeddings/migration.py # model identity check, backfill +tests/embeddings/__init__.py +tests/embeddings/_fakes.py # MockEmbedder test double +tests/embeddings/test_core.py +tests/embeddings/test_storage.py +tests/embeddings/test_search.py +tests/embeddings/test_fusion.py +tests/embeddings/test_rerank.py +tests/embeddings/test_hyde.py +tests/embeddings/test_dedup.py +tests/embeddings/test_migration.py +tests/embeddings/test_scorer.py +tests/embeddings/test_cli.py +tests/embeddings/test_integration.py # marked @pytest.mark.integration +``` + +> **Note:** the evaluation harness module is named `scorer.py` (not `eval.py`) to avoid shadowing Python's builtin and to keep static analysers happy. The CLI subcommand surface stays `vouch eval embedding` (a Click group; the Python function is named `eval_group`). + +### Modified files + +``` +pyproject.toml # extras; pytest markers +src/vouch/index_db.py # vec tables, search fns, hybrid +src/vouch/storage.py # hook put_* + update_* paths +src/vouch/server.py # kb.search extensions + 5 new tools +src/vouch/jsonl_server.py # parity with MCP +src/vouch/cli.py # flags + new commands +src/vouch/context.py # semantic-default + --explain +src/vouch/lifecycle.py # re-embed on updates +src/vouch/health.py # rebuild_index emits mismatch event +``` + +### Test infrastructure + +`tests/embeddings/_fakes.py` defines `MockEmbedder` returning deterministic vectors derived from `sha256` of the input. This makes 99% of tests run in milliseconds without loading any real model. The real model is exercised in `test_integration.py` only. + +--- + +## Phase 1 — Foundation + +### Task 1: Optional dependencies and pytest markers + +**Files:** +- Modify: `pyproject.toml` + +- [ ] **Step 1: Add embeddings extras and integration marker** + +Edit `pyproject.toml` to add new optional-dependencies groups and a pytest marker. Locate the `[project.optional-dependencies]` block (currently at lines 27-35) and add: + +```toml +[project.optional-dependencies] +dev = [ + "pytest>=9.0.3,<10", + "pytest-cov>=5,<6", + "mypy>=2.1.0", + "ruff>=0.15.13", + "mypy>=1.10", + "types-pyyaml", +] +embeddings = [ + "sentence-transformers>=2.7,<4", + "numpy>=1.26,<3", + "sqlite-vec>=0.1,<1", +] +embeddings-fast = [ + "fastembed>=0.3,<1", + "onnxruntime>=1.18,<2", + "numpy>=1.26,<3", + "sqlite-vec>=0.1,<1", +] +rerank = [ + "sentence-transformers>=2.7,<4", +] +``` + +And extend `[tool.pytest.ini_options]` (currently lines 58-60) to: + +```toml +[tool.pytest.ini_options] +testpaths = ["tests"] +addopts = "-q -m 'not integration'" +markers = [ + "integration: tests that load the real embedding model (slow, network on first run)", +] +``` + +- [ ] **Step 2: Install the new extras locally for development** + +Run: `.venv/bin/pip install -e '.[embeddings,dev]'` +Expected: pip resolves and installs sentence-transformers, numpy, sqlite-vec without errors. + +- [ ] **Step 3: Commit** + +```bash +git add pyproject.toml +git commit -m "feat(embeddings): add optional-deps extras and pytest markers" +``` + +--- + +### Task 2: Create the embeddings package skeleton + +**Files:** +- Create: `src/vouch/embeddings/__init__.py` +- Create: `tests/embeddings/__init__.py` + +- [ ] **Step 1: Create the package init** + +Write `src/vouch/embeddings/__init__.py`: + +```python +"""Embedding-based semantic retrieval for vouch. + +Pluggable model adapters via the `register` / `get_embedder` registry in +`base`. Default adapter is `st_mpnet` (sentence-transformers +all-mpnet-base-v2) when installed via `pip install vouch[embeddings]`. + +The base install of vouch has no hard dependency on this package -- the +modules are only imported when an embedding code path executes. +""" + +from .base import ( + DEFAULT_MODEL_NAME, + Embedder, + content_hash, + get_embedder, + register, +) + +__all__ = [ + "DEFAULT_MODEL_NAME", + "Embedder", + "content_hash", + "get_embedder", + "register", +] +``` + +- [ ] **Step 2: Create test package init** + +Write `tests/embeddings/__init__.py`: + +```python +"""Tests for the vouch.embeddings package.""" +``` + +- [ ] **Step 3: Commit** + +```bash +git add src/vouch/embeddings/__init__.py tests/embeddings/__init__.py +git commit -m "feat(embeddings): create package skeleton" +``` + +--- + +### Task 3: Embedder ABC and content hashing + +**Files:** +- Create: `src/vouch/embeddings/base.py` +- Create: `tests/embeddings/_fakes.py` +- Test: `tests/embeddings/test_core.py` + +- [ ] **Step 1: Write the failing test** + +Create `tests/embeddings/test_core.py`: + +```python +"""Core embedder ABC + registry + content hashing.""" + +from __future__ import annotations + +import numpy as np +import pytest + +from vouch.embeddings import ( + Embedder, + content_hash, + get_embedder, + register, +) +from tests.embeddings._fakes import MockEmbedder + + +def test_content_hash_is_stable() -> None: + h1 = content_hash("hello world") + h2 = content_hash("hello world") + assert h1 == h2 + assert len(h1) == 64 # sha256 hex + + +def test_content_hash_differs_on_text_change() -> None: + assert content_hash("a") != content_hash("b") + + +def test_embedder_abc_requires_encode() -> None: + class Incomplete(Embedder): + name = "incomplete" + version = "0" + dim = 1 + with pytest.raises(TypeError): + Incomplete() # type: ignore[abstract] + + +def test_mock_embedder_returns_correct_shape() -> None: + e = MockEmbedder(dim=8) + vec = e.encode("hello") + assert isinstance(vec, np.ndarray) + assert vec.shape == (8,) + assert vec.dtype == np.float32 + + +def test_mock_embedder_batched_encode() -> None: + e = MockEmbedder(dim=8) + mat = e.encode_batch(["a", "b", "c"]) + assert mat.shape == (3, 8) + + +def test_mock_embedder_is_deterministic() -> None: + e = MockEmbedder(dim=16) + assert np.array_equal(e.encode("same"), e.encode("same")) + + +def test_registry_round_trip() -> None: + register("test-adapter", lambda: MockEmbedder(dim=4)) + e = get_embedder("test-adapter") + assert e.dim == 4 + assert e.name == "mock" + + +def test_registry_unknown_name() -> None: + with pytest.raises(KeyError, match="unknown embedder"): + get_embedder("does-not-exist") +``` + +- [ ] **Step 2: Run the test, confirm it fails** + +Run: `.venv/bin/pytest tests/embeddings/test_core.py -v` +Expected: ImportError — `vouch.embeddings.base` / `tests.embeddings._fakes` don't exist yet. + +- [ ] **Step 3: Implement the base module** + +Create `src/vouch/embeddings/base.py`: + +```python +"""Embedder abstract base class + adapter registry. + +Adapters live in sibling modules (st_mpnet, st_minilm, fastembed_bge). +They register themselves at import time via `register(name, factory)`. + +The factory pattern (lambda over class instantiation) lets us defer +heavy imports (torch, onnxruntime) until the adapter is actually used. +""" + +from __future__ import annotations + +import hashlib +from abc import ABC, abstractmethod +from collections.abc import Callable, Sequence +from typing import ClassVar + +import numpy as np + +DEFAULT_MODEL_NAME = "sentence-transformers/all-mpnet-base-v2" + + +class Embedder(ABC): + """Abstract embedding model adapter.""" + + name: ClassVar[str] = "" + version: ClassVar[str] = "" + dim: ClassVar[int] = 0 + + @abstractmethod + def encode(self, text: str) -> np.ndarray: + """Return a unit-normalized embedding for `text`, shape (dim,) float32.""" + + def encode_batch(self, texts: Sequence[str]) -> np.ndarray: + """Default batched encode -- subclasses override for true batching.""" + if not texts: + return np.zeros((0, self.dim), dtype=np.float32) + return np.stack([self.encode(t) for t in texts]) + + +def content_hash(text: str) -> str: + """Stable sha256 hex of the embedded text. Used as the skip-if-unchanged key.""" + return hashlib.sha256(text.encode("utf-8")).hexdigest() + + +_REGISTRY: dict[str, Callable[[], Embedder]] = {} + + +def register(name: str, factory: Callable[[], Embedder]) -> None: + """Register an Embedder factory under `name`. Idempotent.""" + _REGISTRY[name] = factory + + +def get_embedder(name: str | None = None) -> Embedder: + """Resolve an Embedder by adapter name. None -> DEFAULT_MODEL_NAME.""" + key = name or DEFAULT_MODEL_NAME + if key not in _REGISTRY: + raise KeyError(f"unknown embedder: {key}. Registered: {sorted(_REGISTRY)}") + return _REGISTRY[key]() +``` + +- [ ] **Step 4: Create the MockEmbedder test double** + +Create `tests/embeddings/_fakes.py`: + +```python +"""Test doubles for the embeddings layer. + +MockEmbedder returns deterministic float32 vectors derived from sha256 +of the input. No network, no model, runs in microseconds. +""" + +from __future__ import annotations + +import hashlib +import struct +from collections.abc import Sequence + +import numpy as np + +from vouch.embeddings.base import Embedder + + +class MockEmbedder(Embedder): + """Deterministic embedder for tests.""" + + name = "mock" + version = "1" + + def __init__(self, dim: int = 8) -> None: + self.dim = dim + + def encode(self, text: str) -> np.ndarray: + out = np.zeros(self.dim, dtype=np.float32) + i = 0 + seed = text.encode("utf-8") + while i < self.dim: + h = hashlib.sha256(seed).digest() + for j in range(0, len(h) - 3, 4): + if i >= self.dim: + break + out[i] = struct.unpack(" 0: + out /= norm + return out + + def encode_batch(self, texts: Sequence[str]) -> np.ndarray: + if not texts: + return np.zeros((0, self.dim), dtype=np.float32) + return np.stack([self.encode(t) for t in texts]) +``` + +- [ ] **Step 5: Run the tests, confirm they pass** + +Run: `.venv/bin/pytest tests/embeddings/test_core.py -v` +Expected: 8 passed. + +- [ ] **Step 6: Run ruff to check lint cleanliness** + +Run: `.venv/bin/python -m ruff check src/vouch/embeddings tests/embeddings` +Expected: All checks passed. + +- [ ] **Step 7: Commit** + +```bash +git add src/vouch/embeddings/base.py tests/embeddings/_fakes.py tests/embeddings/test_core.py +git commit -m "feat(embeddings): Embedder ABC, registry, content_hash, MockEmbedder" +``` + +--- + +### Task 4: Default adapter (sentence-transformers all-mpnet-base-v2) + +**Files:** +- Create: `src/vouch/embeddings/st_mpnet.py` +- Modify: `src/vouch/embeddings/__init__.py` +- Test: `tests/embeddings/test_integration.py` + +- [ ] **Step 1: Write the failing integration test** + +Create `tests/embeddings/test_integration.py`: + +```python +"""End-to-end tests that load the REAL embedding model. + +Marked @pytest.mark.integration -- excluded from the default test run. +Run with: pytest -m integration +""" + +from __future__ import annotations + +import numpy as np +import pytest + + +@pytest.mark.integration +def test_st_mpnet_loads_and_encodes() -> None: + from vouch.embeddings.st_mpnet import STMpnetEmbedder + e = STMpnetEmbedder() + vec = e.encode("hello world") + assert isinstance(vec, np.ndarray) + assert vec.shape == (768,) + assert vec.dtype == np.float32 + assert abs(float(np.linalg.norm(vec)) - 1.0) < 1e-3 + + +@pytest.mark.integration +def test_st_mpnet_semantic_disjoint() -> None: + """Semantic similarity > lexical-only baseline.""" + from vouch.embeddings.st_mpnet import STMpnetEmbedder + e = STMpnetEmbedder() + q = e.encode("how do users authenticate") + a = e.encode("login flow uses session cookies signed by the API") + b = e.encode("the sun is large") + sim_a = float(q @ a) + sim_b = float(q @ b) + assert sim_a > sim_b +``` + +- [ ] **Step 2: Run integration test, confirm it fails** + +Run: `.venv/bin/pytest tests/embeddings/test_integration.py -v -m integration` +Expected: ImportError — `vouch.embeddings.st_mpnet` doesn't exist. + +- [ ] **Step 3: Implement the adapter** + +Create `src/vouch/embeddings/st_mpnet.py`: + +```python +"""sentence-transformers/all-mpnet-base-v2 adapter. + +768-dim, English, good quality at its tier. Default model for vouch. +Lazy-loaded: the import of sentence_transformers is deferred to __init__. +""" + +from __future__ import annotations + +from collections.abc import Sequence +from typing import Any + +import numpy as np + +from .base import DEFAULT_MODEL_NAME, Embedder, register + + +class STMpnetEmbedder(Embedder): + name = DEFAULT_MODEL_NAME + version = "v1" + dim = 768 + + def __init__(self, device: str | None = None) -> None: + from sentence_transformers import SentenceTransformer # type: ignore[import-not-found] + self._model: Any = SentenceTransformer( + self.name, device=device or "cpu", + ) + + def encode(self, text: str) -> np.ndarray: + vec = self._model.encode( + text, + convert_to_numpy=True, + normalize_embeddings=True, + ) + return np.asarray(vec, dtype=np.float32) + + def encode_batch(self, texts: Sequence[str]) -> np.ndarray: + if not texts: + return np.zeros((0, self.dim), dtype=np.float32) + mat = self._model.encode( + list(texts), + convert_to_numpy=True, + normalize_embeddings=True, + batch_size=32, + ) + return np.asarray(mat, dtype=np.float32) + + +register(DEFAULT_MODEL_NAME, STMpnetEmbedder) +``` + +- [ ] **Step 4: Modify `__init__.py` to auto-register adapter on import** + +Append to `src/vouch/embeddings/__init__.py` (above `__all__`): + +```python +# Auto-register the default adapter if sentence-transformers is installed. +try: + from . import st_mpnet # noqa: F401 +except ImportError: + pass +``` + +- [ ] **Step 5: Run integration test, confirm passes** + +Run: `.venv/bin/pytest tests/embeddings/test_integration.py -v -m integration` +Expected: 2 passed (slow on first run -- model download ~420MB). + +- [ ] **Step 6: Run unit tests to confirm no regression** + +Run: `.venv/bin/pytest tests/embeddings -v` +Expected: 8 passed (integration tests deselected by default). + +- [ ] **Step 7: Commit** + +```bash +git add src/vouch/embeddings/st_mpnet.py src/vouch/embeddings/__init__.py tests/embeddings/test_integration.py +git commit -m "feat(embeddings): sentence-transformers all-mpnet-base-v2 default adapter" +``` + +--- + +### Task 5: Alternative adapter -- MiniLM-L6 + +**Files:** +- Create: `src/vouch/embeddings/st_minilm.py` +- Modify: `src/vouch/embeddings/__init__.py` +- Test: extends `tests/embeddings/test_integration.py` + +- [ ] **Step 1: Add failing test** + +Append to `tests/embeddings/test_integration.py`: + +```python +@pytest.mark.integration +def test_st_minilm_loads_and_encodes() -> None: + from vouch.embeddings.st_minilm import STMinilmEmbedder + e = STMinilmEmbedder() + vec = e.encode("hello world") + assert vec.shape == (384,) + assert vec.dtype == np.float32 +``` + +- [ ] **Step 2: Run test, confirm fail** + +Run: `.venv/bin/pytest tests/embeddings/test_integration.py::test_st_minilm_loads_and_encodes -m integration -v` +Expected: ImportError. + +- [ ] **Step 3: Implement adapter** + +Create `src/vouch/embeddings/st_minilm.py`: + +```python +"""sentence-transformers/all-MiniLM-L6-v2 adapter. + +384-dim, smaller and faster than mpnet-base, slightly lower quality. +""" + +from __future__ import annotations + +from collections.abc import Sequence +from typing import Any + +import numpy as np + +from .base import Embedder, register + +MODEL_NAME = "sentence-transformers/all-MiniLM-L6-v2" + + +class STMinilmEmbedder(Embedder): + name = MODEL_NAME + version = "v1" + dim = 384 + + def __init__(self, device: str | None = None) -> None: + from sentence_transformers import SentenceTransformer # type: ignore[import-not-found] + self._model: Any = SentenceTransformer(self.name, device=device or "cpu") + + def encode(self, text: str) -> np.ndarray: + vec = self._model.encode(text, convert_to_numpy=True, normalize_embeddings=True) + return np.asarray(vec, dtype=np.float32) + + def encode_batch(self, texts: Sequence[str]) -> np.ndarray: + if not texts: + return np.zeros((0, self.dim), dtype=np.float32) + mat = self._model.encode( + list(texts), convert_to_numpy=True, + normalize_embeddings=True, batch_size=64, + ) + return np.asarray(mat, dtype=np.float32) + + +register(MODEL_NAME, STMinilmEmbedder) +``` + +- [ ] **Step 4: Add guarded import to `__init__.py`** + +Append a second try/except block: + +```python +try: + from . import st_minilm # noqa: F401 +except ImportError: + pass +``` + +- [ ] **Step 5: Run integration test, confirm passes** + +Run: `.venv/bin/pytest tests/embeddings/test_integration.py::test_st_minilm_loads_and_encodes -m integration -v` +Expected: PASS. + +- [ ] **Step 6: Commit** + +```bash +git add src/vouch/embeddings/st_minilm.py src/vouch/embeddings/__init__.py tests/embeddings/test_integration.py +git commit -m "feat(embeddings): sentence-transformers MiniLM-L6 alternative adapter" +``` + +--- + +### Task 6: Alternative adapter -- fastembed BGE + +**Files:** +- Create: `src/vouch/embeddings/fastembed_bge.py` +- Modify: `src/vouch/embeddings/__init__.py` +- Test: extends `tests/embeddings/test_integration.py` + +- [ ] **Step 1: Add failing test** + +Append to `tests/embeddings/test_integration.py`: + +```python +@pytest.mark.integration +def test_fastembed_bge_loads_and_encodes() -> None: + pytest.importorskip("fastembed") + from vouch.embeddings.fastembed_bge import FastembedBgeEmbedder + e = FastembedBgeEmbedder() + vec = e.encode("hello world") + assert vec.shape == (384,) + assert vec.dtype == np.float32 +``` + +- [ ] **Step 2: Run test, confirm fail** + +Run: `.venv/bin/pytest tests/embeddings/test_integration.py::test_fastembed_bge_loads_and_encodes -m integration -v` +Expected: ImportError or skip. + +- [ ] **Step 3: Implement adapter** + +Create `src/vouch/embeddings/fastembed_bge.py`: + +```python +"""fastembed BAAI/bge-small-en-v1.5 adapter (no-torch path). + +384-dim, ONNX-backed. Install via `pip install vouch[embeddings-fast]`. +""" + +from __future__ import annotations + +from collections.abc import Sequence +from typing import Any + +import numpy as np + +from .base import Embedder, register + +MODEL_NAME = "fastembed/bge-small-en-v1.5" + + +class FastembedBgeEmbedder(Embedder): + name = MODEL_NAME + version = "v1" + dim = 384 + + def __init__(self) -> None: + from fastembed import TextEmbedding # type: ignore[import-not-found] + self._model: Any = TextEmbedding(model_name="BAAI/bge-small-en-v1.5") + + def encode(self, text: str) -> np.ndarray: + vec = next(iter(self._model.embed([text]))) + arr = np.asarray(vec, dtype=np.float32) + norm = float(np.linalg.norm(arr)) + if norm > 0: + arr /= norm + return arr + + def encode_batch(self, texts: Sequence[str]) -> np.ndarray: + if not texts: + return np.zeros((0, self.dim), dtype=np.float32) + mat = np.stack([np.asarray(v, dtype=np.float32) + for v in self._model.embed(list(texts))]) + norms = np.linalg.norm(mat, axis=1, keepdims=True) + norms[norms == 0] = 1.0 + return (mat / norms).astype(np.float32) + + +register(MODEL_NAME, FastembedBgeEmbedder) +``` + +- [ ] **Step 4: Add guarded import to `__init__.py`** + +```python +try: + from . import fastembed_bge # noqa: F401 +except ImportError: + pass +``` + +- [ ] **Step 5: Run integration test (skipped if fastembed not installed)** + +Run: `.venv/bin/pytest tests/embeddings/test_integration.py::test_fastembed_bge_loads_and_encodes -m integration -v` +Expected: PASS or SKIPPED. + +- [ ] **Step 6: Commit** + +```bash +git add src/vouch/embeddings/fastembed_bge.py src/vouch/embeddings/__init__.py tests/embeddings/test_integration.py +git commit -m "feat(embeddings): fastembed BGE alternative (no-torch) adapter" +``` + +--- + +## Phase 2 — Storage + +### Task 7: Embedding storage schema in state.db + +**Files:** +- Modify: `src/vouch/index_db.py` +- Test: `tests/embeddings/test_storage.py` + +- [ ] **Step 1: Write the failing test** + +Create `tests/embeddings/test_storage.py`: + +```python +"""Embedding storage layer -- schema, put, get, search.""" + +from __future__ import annotations + +from pathlib import Path + +import numpy as np +import pytest + +from vouch import index_db +from vouch.embeddings.base import content_hash +from vouch.storage import KBStore + + +@pytest.fixture +def kb_dir(tmp_path: Path) -> Path: + store = KBStore.init(tmp_path) + return store.kb_dir + + +def test_embedding_schema_creates_tables(kb_dir: Path) -> None: + with index_db.open_db(kb_dir) as conn: + tables = {r[0] for r in conn.execute( + "SELECT name FROM sqlite_master WHERE type IN ('table','virtual table')" + )} + assert "embedding_index" in tables + assert "query_embedding_cache" in tables + assert "embedding_dupes" in tables + + +def test_embedding_meta_default_values(kb_dir: Path) -> None: + meta = index_db.get_embedding_meta(kb_dir) + assert meta.get("embedding_model") in (None, "") + + +def test_put_and_get_embedding(kb_dir: Path) -> None: + vec = np.zeros(8, dtype=np.float32) + vec[0] = 1.0 + h = content_hash("hello") + with index_db.open_db(kb_dir) as conn: + index_db.put_embedding( + conn, kind="claim", id="c1", vec=vec, + content_hash=h, model="mock", model_version="1", dim=8, + ) + got = index_db.get_embedding(kb_dir, kind="claim", id="c1") + assert got is not None + rec_vec, rec_hash, rec_model = got + assert np.allclose(rec_vec, vec) + assert rec_hash == h + assert rec_model == "mock" + + +def test_put_embedding_idempotent_on_same_hash(kb_dir: Path) -> None: + vec = np.ones(4, dtype=np.float32) + h = content_hash("same") + with index_db.open_db(kb_dir) as conn: + index_db.put_embedding( + conn, kind="claim", id="c1", vec=vec, content_hash=h, + model="mock", model_version="1", dim=4, + ) + index_db.put_embedding( + conn, kind="claim", id="c1", vec=vec, content_hash=h, + model="mock", model_version="1", dim=4, + ) + with index_db.open_db(kb_dir) as conn: + n = conn.execute("SELECT COUNT(*) FROM embedding_index WHERE id='c1'").fetchone()[0] + assert n == 1 + + +def test_set_embedding_meta_round_trip(kb_dir: Path) -> None: + index_db.set_embedding_meta( + kb_dir, + model="sentence-transformers/all-mpnet-base-v2", + version="v1", + dim=768, + ) + meta = index_db.get_embedding_meta(kb_dir) + assert meta["embedding_model"] == "sentence-transformers/all-mpnet-base-v2" + assert meta["embedding_dim"] == "768" +``` + +- [ ] **Step 2: Run test, confirm fails** + +Run: `.venv/bin/pytest tests/embeddings/test_storage.py -v` +Expected: AttributeError -- functions don't exist. + +- [ ] **Step 3: Extend `SCHEMA` in `index_db.py`** + +In `src/vouch/index_db.py`, replace the existing `SCHEMA` constant (lines 22-51) with: + +```python +SCHEMA = """ +CREATE VIRTUAL TABLE IF NOT EXISTS claims_fts USING fts5( + id UNINDEXED, text, type UNINDEXED, status UNINDEXED, tags +); + +CREATE VIRTUAL TABLE IF NOT EXISTS pages_fts USING fts5( + id UNINDEXED, title, body, type UNINDEXED, tags +); + +CREATE VIRTUAL TABLE IF NOT EXISTS entities_fts USING fts5( + id UNINDEXED, name, description, type UNINDEXED, aliases +); + +CREATE TABLE IF NOT EXISTS index_meta ( + key TEXT PRIMARY KEY, value TEXT NOT NULL +); + +CREATE TABLE IF NOT EXISTS embedding_index ( + kind TEXT NOT NULL, + id TEXT NOT NULL, + vec BLOB NOT NULL, + content_hash TEXT NOT NULL, + model TEXT NOT NULL, + model_version TEXT NOT NULL, + dim INTEGER NOT NULL, + created_at TEXT NOT NULL, + PRIMARY KEY (kind, id) +); + +CREATE INDEX IF NOT EXISTS embedding_index_kind ON embedding_index(kind); + +CREATE TABLE IF NOT EXISTS query_embedding_cache ( + query_hash TEXT PRIMARY KEY, + vec BLOB NOT NULL, + hit_count INTEGER NOT NULL DEFAULT 1, + last_used_at TEXT NOT NULL +); + +CREATE TABLE IF NOT EXISTS embedding_dupes ( + kind TEXT NOT NULL, + id TEXT NOT NULL, + near_id TEXT NOT NULL, + cosine REAL NOT NULL, + detected_at TEXT NOT NULL +); +""" +``` + +- [ ] **Step 4: Add helpers below `stats()`** + +Append to `src/vouch/index_db.py`: + +```python +# --- embeddings storage -------------------------------------------------- + +import datetime as _dt + + +def _vec_to_blob(vec): # type: ignore[no-untyped-def] + import numpy as np + return np.asarray(vec, dtype=np.float32).tobytes() + + +def _blob_to_vec(blob: bytes, dim: int): # type: ignore[no-untyped-def] + import numpy as np + return np.frombuffer(blob, dtype=np.float32, count=dim).copy() + + +def put_embedding( + conn: sqlite3.Connection, *, + kind: str, id: str, + vec, # type: ignore[no-untyped-def] + content_hash: str, + model: str, model_version: str, dim: int, +) -> None: + conn.execute( + "INSERT OR REPLACE INTO embedding_index " + "(kind, id, vec, content_hash, model, model_version, dim, created_at) " + "VALUES (?, ?, ?, ?, ?, ?, ?, ?)", + ( + kind, id, _vec_to_blob(vec), content_hash, + model, model_version, dim, + _dt.datetime.now(_dt.UTC).isoformat(timespec="seconds"), + ), + ) + + +def get_embedding(kb_dir: Path, *, kind: str, id: str): # type: ignore[no-untyped-def] + """Return (vec, content_hash, model) or None.""" + with open_db(kb_dir) as conn: + row = conn.execute( + "SELECT vec, content_hash, model, dim FROM embedding_index " + "WHERE kind = ? AND id = ?", + (kind, id), + ).fetchone() + if not row: + return None + blob, ch, model, dim = row + return _blob_to_vec(blob, dim), ch, model + + +def set_embedding_meta(kb_dir: Path, *, model: str, version: str, dim: int) -> None: + with open_db(kb_dir) as conn: + conn.executemany( + "INSERT OR REPLACE INTO index_meta (key, value) VALUES (?, ?)", + [ + ("embedding_model", model), + ("embedding_model_version", version), + ("embedding_dim", str(dim)), + ], + ) + + +def get_embedding_meta(kb_dir: Path) -> dict[str, str]: + with open_db(kb_dir) as conn: + rows = conn.execute( + "SELECT key, value FROM index_meta WHERE key LIKE 'embedding_%'" + ).fetchall() + return {k: v for k, v in rows} +``` + +- [ ] **Step 5: Run tests, confirm pass** + +Run: `.venv/bin/pytest tests/embeddings/test_storage.py -v` +Expected: 5 passed. + +- [ ] **Step 6: Run ruff** + +Run: `.venv/bin/python -m ruff check src/vouch tests` +Expected: clean. + +- [ ] **Step 7: Commit** + +```bash +git add src/vouch/index_db.py tests/embeddings/test_storage.py +git commit -m "feat(embeddings): state.db schema for embedding storage + put/get helpers" +``` + +--- + +### Task 8: Vector search (NumPy brute-force path) + +**Files:** +- Modify: `src/vouch/index_db.py` +- Modify: `tests/embeddings/test_storage.py` + +- [ ] **Step 1: Write the failing test** + +Append to `tests/embeddings/test_storage.py`: + +```python +def test_search_embedding_returns_topk(kb_dir: Path) -> None: + from vouch.embeddings.base import content_hash as ch + + query = np.zeros(8, dtype=np.float32); query[0] = 1.0 + near = np.zeros(8, dtype=np.float32); near[0] = 0.99; near[1] = 0.05 + far = np.zeros(8, dtype=np.float32); far[7] = 1.0 + near /= float(np.linalg.norm(near)) + with index_db.open_db(kb_dir) as conn: + for cid, vec in [("c-near", near), ("c-far", far)]: + index_db.put_embedding( + conn, kind="claim", id=cid, vec=vec, + content_hash=ch(cid), model="mock", model_version="1", dim=8, + ) + hits = index_db.search_embedding( + kb_dir, query_vec=query, kinds=("claim",), limit=2, + ) + assert hits[0][1] == "c-near" + assert hits[1][1] == "c-far" + + +def test_search_embedding_empty_db(kb_dir: Path) -> None: + q = np.zeros(8, dtype=np.float32); q[0] = 1.0 + hits = index_db.search_embedding(kb_dir, query_vec=q, kinds=("claim",), limit=5) + assert hits == [] + + +def test_search_embedding_filters_by_kind(kb_dir: Path) -> None: + from vouch.embeddings.base import content_hash as ch + v = np.zeros(4, dtype=np.float32); v[0] = 1.0 + with index_db.open_db(kb_dir) as conn: + index_db.put_embedding(conn, kind="claim", id="c1", vec=v, + content_hash=ch("c1"), model="mock", + model_version="1", dim=4) + index_db.put_embedding(conn, kind="page", id="p1", vec=v, + content_hash=ch("p1"), model="mock", + model_version="1", dim=4) + only_claims = index_db.search_embedding( + kb_dir, query_vec=v, kinds=("claim",), limit=10, + ) + assert {h[0] for h in only_claims} == {"claim"} +``` + +- [ ] **Step 2: Run test, confirm fails** + +Run: `.venv/bin/pytest tests/embeddings/test_storage.py::test_search_embedding_returns_topk -v` +Expected: AttributeError. + +- [ ] **Step 3: Implement `search_embedding`** + +Append to `src/vouch/index_db.py`: + +```python +def search_embedding( + kb_dir: Path, + *, + query_vec, # type: ignore[no-untyped-def] + kinds: tuple[str, ...] = ( + "claim", "page", "source", "entity", "relation", "evidence", + ), + limit: int = 10, + min_score: float = 0.0, +) -> list[tuple[str, str, str, float]]: + """NumPy brute-force cosine search. Returns (kind, id, snippet, score).""" + import numpy as np + q = np.asarray(query_vec, dtype=np.float32) + qnorm = float(np.linalg.norm(q)) + if qnorm > 0: + q = q / qnorm + placeholders = ",".join("?" for _ in kinds) + with open_db(kb_dir) as conn: + rows = conn.execute( + f"SELECT kind, id, vec, dim FROM embedding_index " + f"WHERE kind IN ({placeholders})", + kinds, + ).fetchall() + scored: list[tuple[str, str, str, float]] = [] + for kind, id_, blob, dim in rows: + vec = _blob_to_vec(blob, dim) + score = float(q @ vec) + if score >= min_score: + scored.append((kind, id_, "", score)) + scored.sort(key=lambda r: r[3], reverse=True) + return scored[:limit] +``` + +- [ ] **Step 4: Run tests, confirm pass** + +Run: `.venv/bin/pytest tests/embeddings/test_storage.py -v` +Expected: 8 passed. + +- [ ] **Step 5: Commit** + +```bash +git add src/vouch/index_db.py tests/embeddings/test_storage.py +git commit -m "feat(embeddings): NumPy brute-force cosine search over embedding_index" +``` + +--- + +### Task 9: sqlite-vec ANN path with fallback + +**Files:** +- Modify: `src/vouch/index_db.py` +- Modify: `tests/embeddings/test_storage.py` + +- [ ] **Step 1: Add test asserting ANN loader behavior** + +Append to `tests/embeddings/test_storage.py`: + +```python +def test_sqlite_vec_loader_is_idempotent(kb_dir: Path) -> None: + with index_db.open_db(kb_dir) as conn: + a = index_db._load_sqlite_vec(conn) + b = index_db._load_sqlite_vec(conn) + assert a == b + + +def test_search_works_under_both_backends(kb_dir: Path) -> None: + from vouch.embeddings.base import content_hash as ch + rng = np.random.default_rng(0) + vecs = rng.standard_normal((20, 8)).astype(np.float32) + vecs /= np.linalg.norm(vecs, axis=1, keepdims=True) + with index_db.open_db(kb_dir) as conn: + for i, v in enumerate(vecs): + index_db.put_embedding( + conn, kind="claim", id=f"c{i}", vec=v, + content_hash=ch(f"c{i}"), model="mock", + model_version="1", dim=8, + ) + hits = index_db.search_embedding( + kb_dir, query_vec=vecs[0], kinds=("claim",), limit=3, + ) + assert hits[0][1] == "c0" # exact self-match +``` + +- [ ] **Step 2: Run test, confirm fails** + +Run: `.venv/bin/pytest tests/embeddings/test_storage.py::test_sqlite_vec_loader_is_idempotent -v` +Expected: AttributeError. + +- [ ] **Step 3: Add the loader and ANN path** + +Insert into `src/vouch/index_db.py`, ABOVE the existing `search_embedding`: + +```python +_sqlite_vec_loaded: set[int] = set() + + +def _load_sqlite_vec(conn: sqlite3.Connection) -> bool: + """Best-effort load of the sqlite-vec extension.""" + if id(conn) in _sqlite_vec_loaded: + return True + try: + conn.enable_load_extension(True) + except (AttributeError, sqlite3.OperationalError): + return False + try: + import sqlite_vec # type: ignore[import-not-found] + except ImportError: + return False + try: + sqlite_vec.load(conn) + except sqlite3.OperationalError: + return False + finally: + try: + conn.enable_load_extension(False) + except sqlite3.OperationalError: + pass + _sqlite_vec_loaded.add(id(conn)) + return True +``` + +Replace `search_embedding` body with the ANN-then-NumPy version: + +```python +def search_embedding( + kb_dir: Path, + *, + query_vec, # type: ignore[no-untyped-def] + kinds: tuple[str, ...] = ( + "claim", "page", "source", "entity", "relation", "evidence", + ), + limit: int = 10, + min_score: float = 0.0, +) -> list[tuple[str, str, str, float]]: + import numpy as np + q = np.asarray(query_vec, dtype=np.float32) + qnorm = float(np.linalg.norm(q)) + if qnorm > 0: + q = q / qnorm + placeholders = ",".join("?" for _ in kinds) + with open_db(kb_dir) as conn: + have_vec = _load_sqlite_vec(conn) + if have_vec: + try: + rows = conn.execute( + f"SELECT kind, id, " + f" 1.0 - vec_distance_cosine(vec, ?) AS score " + f"FROM embedding_index " + f"WHERE kind IN ({placeholders}) AND score >= ? " + f"ORDER BY score DESC LIMIT ?", + (q.tobytes(), *kinds, min_score, limit), + ).fetchall() + return [(k, i, "", float(s)) for k, i, s in rows] + except sqlite3.OperationalError: + pass + rows = conn.execute( + f"SELECT kind, id, vec, dim FROM embedding_index " + f"WHERE kind IN ({placeholders})", + kinds, + ).fetchall() + scored: list[tuple[str, str, str, float]] = [] + for kind, id_, blob, dim in rows: + vec = _blob_to_vec(blob, dim) + score = float(q @ vec) + if score >= min_score: + scored.append((kind, id_, "", score)) + scored.sort(key=lambda r: r[3], reverse=True) + return scored[:limit] +``` + +- [ ] **Step 4: Run tests, confirm pass** + +Run: `.venv/bin/pytest tests/embeddings/test_storage.py -v` +Expected: 10 passed. + +- [ ] **Step 5: Commit** + +```bash +git add src/vouch/index_db.py tests/embeddings/test_storage.py +git commit -m "feat(embeddings): sqlite-vec ANN path with NumPy fallback" +``` + +--- + +### Task 10: Query embedding cache + +**Files:** +- Create: `src/vouch/embeddings/cache.py` +- Modify: `tests/embeddings/test_storage.py` + +- [ ] **Step 1: Write the failing test** + +Append to `tests/embeddings/test_storage.py`: + +```python +def test_query_cache_round_trip(kb_dir: Path) -> None: + from vouch.embeddings.cache import ( + cache_query_vec, lookup_query_vec, query_cache_size, + ) + v = np.ones(4, dtype=np.float32) + cache_query_vec(kb_dir, query="hello", vec=v) + got = lookup_query_vec(kb_dir, query="hello") + assert got is not None + assert np.allclose(got, v) + assert lookup_query_vec(kb_dir, query="other") is None + assert query_cache_size(kb_dir) == 1 + + +def test_query_cache_lru_eviction(kb_dir: Path) -> None: + from vouch.embeddings.cache import cache_query_vec, query_cache_size + v = np.ones(4, dtype=np.float32) + for i in range(5): + cache_query_vec(kb_dir, query=f"q{i}", vec=v, max_entries=3) + assert query_cache_size(kb_dir) <= 3 +``` + +- [ ] **Step 2: Run test, confirm fails** + +Run: `.venv/bin/pytest tests/embeddings/test_storage.py::test_query_cache_round_trip -v` +Expected: ImportError. + +- [ ] **Step 3: Create `cache.py`** + +Create `src/vouch/embeddings/cache.py`: + +```python +"""Query embedding LRU cache backed by `query_embedding_cache` table.""" + +from __future__ import annotations + +import datetime as dt +import hashlib +from pathlib import Path +from typing import Any + +import numpy as np + +from .. import index_db + + +def _query_key(query: str) -> str: + return hashlib.sha256(query.encode("utf-8")).hexdigest() + + +def cache_query_vec( + kb_dir: Path, *, query: str, vec: np.ndarray, max_entries: int = 1024, +) -> None: + h = _query_key(query) + blob = np.asarray(vec, dtype=np.float32).tobytes() + now = dt.datetime.now(dt.UTC).isoformat(timespec="seconds") + with index_db.open_db(kb_dir) as conn: + conn.execute( + "INSERT OR REPLACE INTO query_embedding_cache " + "(query_hash, vec, hit_count, last_used_at) " + "VALUES (?, ?, COALESCE(" + " (SELECT hit_count FROM query_embedding_cache WHERE query_hash=?), 0" + ") + 1, ?)", + (h, blob, h, now), + ) + n = conn.execute( + "SELECT COUNT(*) FROM query_embedding_cache" + ).fetchone()[0] + if n > max_entries: + conn.execute( + "DELETE FROM query_embedding_cache WHERE query_hash IN (" + " SELECT query_hash FROM query_embedding_cache " + " ORDER BY last_used_at ASC LIMIT ?)", + (n - max_entries,), + ) + + +def lookup_query_vec(kb_dir: Path, *, query: str) -> np.ndarray | None: + h = _query_key(query) + now = dt.datetime.now(dt.UTC).isoformat(timespec="seconds") + with index_db.open_db(kb_dir) as conn: + row = conn.execute( + "SELECT vec FROM query_embedding_cache WHERE query_hash = ?", + (h,), + ).fetchone() + if not row: + return None + conn.execute( + "UPDATE query_embedding_cache SET hit_count = hit_count + 1, " + "last_used_at = ? WHERE query_hash = ?", + (now, h), + ) + return np.frombuffer(row[0], dtype=np.float32).copy() + + +def query_cache_size(kb_dir: Path) -> int: + with index_db.open_db(kb_dir) as conn: + return int(conn.execute( + "SELECT COUNT(*) FROM query_embedding_cache" + ).fetchone()[0]) + + +def query_cache_clear(kb_dir: Path) -> None: + with index_db.open_db(kb_dir) as conn: + conn.execute("DELETE FROM query_embedding_cache") + + +def query_cache_stats(kb_dir: Path) -> dict[str, Any]: + with index_db.open_db(kb_dir) as conn: + row = conn.execute( + "SELECT COUNT(*), COALESCE(SUM(hit_count), 0), " + "COALESCE(MAX(hit_count), 0) FROM query_embedding_cache" + ).fetchone() + return {"entries": int(row[0]), "hits": int(row[1]), + "max_hits_per_entry": int(row[2])} +``` + +- [ ] **Step 4: Run tests, confirm pass** + +Run: `.venv/bin/pytest tests/embeddings/test_storage.py -v` +Expected: 12 passed. + +- [ ] **Step 5: Commit** + +```bash +git add src/vouch/embeddings/cache.py tests/embeddings/test_storage.py +git commit -m "feat(embeddings): query embedding LRU cache" +``` + +--- + +## Phase 3 — Write path + +### Task 11: Embedding hook helper in storage.py + +**Files:** +- Modify: `src/vouch/storage.py` +- Test: `tests/embeddings/test_search.py` + +- [ ] **Step 1: Write the failing test** + +Create `tests/embeddings/test_search.py`: + +```python +"""End-to-end semantic search through KBStore + index_db.""" + +from __future__ import annotations + +from pathlib import Path + +import pytest + +from vouch import index_db +from vouch.embeddings import register +from vouch.models import Claim, Entity, EntityType, Page +from vouch.storage import KBStore +from tests.embeddings._fakes import MockEmbedder + + +@pytest.fixture(autouse=True) +def _use_mock_embedder() -> None: + from vouch.embeddings.base import DEFAULT_MODEL_NAME + register(DEFAULT_MODEL_NAME, lambda: MockEmbedder(dim=8)) + + +@pytest.fixture +def store(tmp_path: Path) -> KBStore: + return KBStore.init(tmp_path) + + +def test_put_claim_writes_embedding(store: KBStore) -> None: + src = store.put_source(b"e") + store.put_claim(Claim(id="c1", text="claim text", evidence=[src.id])) + rec = index_db.get_embedding(store.kb_dir, kind="claim", id="c1") + assert rec is not None + vec, ch, model = rec + assert vec.shape == (8,) + assert model == "mock" +``` + +- [ ] **Step 2: Run test, confirm fails** + +Run: `.venv/bin/pytest tests/embeddings/test_search.py::test_put_claim_writes_embedding -v` +Expected: assertion fail. + +- [ ] **Step 3: Add the helper method to `KBStore`** + +In `src/vouch/storage.py`, add a private method to `KBStore` just before the `# --- proposals ---` section. The helper: + +```python + # --- embedding hook ------------------------------------------------------ + + def _embed_and_store(self, *, kind: str, id: str, text: str) -> None: + """Compute and persist an embedding for an artifact. + + Skipped if (kind, id) already exists with the same content hash. + Failures (e.g. embeddings extras not installed) are swallowed -- + embeddings are an enhancement, not a hard requirement. + """ + if not text or not text.strip(): + return + try: + from . import index_db as _index_db + from .embeddings import content_hash, get_embedder + except ImportError: + return + h = content_hash(text) + existing = _index_db.get_embedding(self.kb_dir, kind=kind, id=id) + if existing is not None and existing[1] == h: + return + try: + embedder = get_embedder() + except KeyError: + return + vec = embedder.encode(text) + with _index_db.open_db(self.kb_dir) as conn: + _index_db.put_embedding( + conn, kind=kind, id=id, vec=vec, content_hash=h, + model=embedder.name, model_version=embedder.version, + dim=embedder.dim, + ) + _index_db.set_embedding_meta( + self.kb_dir, model=embedder.name, + version=embedder.version, dim=embedder.dim, + ) + try: + from .embeddings.dedup import check_and_log + check_and_log(self.kb_dir, kind=kind, id=id, vec=vec) + except ImportError: + pass +``` + +- [ ] **Step 4: Wire into `put_claim`** + +In `src/vouch/storage.py`, locate `put_claim` (~line 250). Add the call just before `return claim`. The updated method: + +```python + def put_claim(self, claim: Claim) -> Claim: + for cid_or_sid in [*claim.evidence, *claim.cites_claims]: + if ( + not self._claim_path(cid_or_sid).exists() + and not (self._source_dir(cid_or_sid) / "meta.yaml").exists() + and not self._evidence_path(cid_or_sid).exists() + ): + raise ValueError( + f"claim {claim.id} cites unknown source/evidence {cid_or_sid}" + ) + try: + with self._claim_path(claim.id).open("x") as f: + f.write(_yaml_dump(claim.model_dump(mode="json"))) + except FileExistsError as e: + raise ValueError( + f"claim {claim.id} already exists -- use update_claim()" + ) from e + self._embed_and_store(kind="claim", id=claim.id, text=claim.text) + return claim +``` + +- [ ] **Step 5: Run test, confirm passes** + +Run: `.venv/bin/pytest tests/embeddings/test_search.py::test_put_claim_writes_embedding -v` +Expected: PASS. + +- [ ] **Step 6: Commit** + +```bash +git add src/vouch/storage.py tests/embeddings/test_search.py +git commit -m "feat(embeddings): write-time embedding hook + wire put_claim" +``` + +--- + +### Task 12: Hook put_page, put_source, put_entity, put_relation, put_evidence + +**Files:** +- Modify: `src/vouch/storage.py` +- Modify: `tests/embeddings/test_search.py` + +- [ ] **Step 1: Add failing tests** + +Append to `tests/embeddings/test_search.py`: + +```python +from vouch.models import Evidence, Relation, RelationType # noqa: E402 + + +def test_put_page_writes_embedding(store: KBStore) -> None: + store.put_page(Page(id="p1", title="Title", body="page body")) + rec = index_db.get_embedding(store.kb_dir, kind="page", id="p1") + assert rec is not None + assert rec[0].shape == (8,) + + +def test_put_source_writes_embedding(store: KBStore) -> None: + src = store.put_source(b"content bytes here", title="src1") + rec = index_db.get_embedding(store.kb_dir, kind="source", id=src.id) + assert rec is not None + + +def test_put_entity_writes_embedding(store: KBStore) -> None: + store.put_entity(Entity(id="e1", name="AuthN", type=EntityType.CONCEPT, + description="who you are")) + rec = index_db.get_embedding(store.kb_dir, kind="entity", id="e1") + assert rec is not None + + +def test_put_relation_writes_embedding(store: KBStore) -> None: + store.put_entity(Entity(id="e1", name="x", type=EntityType.CONCEPT)) + store.put_entity(Entity(id="e2", name="y", type=EntityType.CONCEPT)) + rel = Relation(id="r1", type=RelationType.RELATED_TO, + source="e1", target="e2", description="x relates to y") + store.put_relation(rel) + rec = index_db.get_embedding(store.kb_dir, kind="relation", id="r1") + assert rec is not None + + +def test_put_evidence_writes_embedding(store: KBStore) -> None: + src = store.put_source(b"abc") + ev = Evidence(id="ev1", source_id=src.id, locator="line 1", + excerpt="excerpt text body") + store.put_evidence(ev) + rec = index_db.get_embedding(store.kb_dir, kind="evidence", id="ev1") + assert rec is not None +``` + +- [ ] **Step 2: Run tests, confirm fail** + +Run: `.venv/bin/pytest tests/embeddings/test_search.py -v` +Expected: 5 new failures. + +- [ ] **Step 3: Wire helper into each remaining `put_*`** + +For each method, add `self._embed_and_store(...)` immediately before the existing `return `: + +- `put_page`: `self._embed_and_store(kind="page", id=page.id, text=f"{page.title}\n\n{page.body}")` +- `put_source`: `self._embed_and_store(kind="source", id=src.id, text=src.title or src.locator or "")` +- `put_entity`: `self._embed_and_store(kind="entity", id=entity.id, text=f"{entity.name}\n\n{entity.description or ''}")` +- `put_relation`: `self._embed_and_store(kind="relation", id=rel.id, text=f"{rel.source} {rel.type.value} {rel.target}\n{rel.description or ''}")` +- `put_evidence`: `self._embed_and_store(kind="evidence", id=ev.id, text=ev.excerpt or "")` + +The pattern: after the `f.write(...)` and `except FileExistsError` block, add the call before the existing `return`. + +- [ ] **Step 4: Run tests, confirm pass** + +Run: `.venv/bin/pytest tests/embeddings/test_search.py -v` +Expected: 6 passed. + +- [ ] **Step 5: Run full suite** + +Run: `.venv/bin/pytest --ignore=tests/test_sessions.py -q` +Expected: all pass. + +- [ ] **Step 6: Commit** + +```bash +git add src/vouch/storage.py tests/embeddings/test_search.py +git commit -m "feat(embeddings): hook all six artifact write paths" +``` + +--- + +### Task 13: Update path -- re-embed on update_claim + +**Files:** +- Modify: `src/vouch/storage.py` +- Modify: `tests/embeddings/test_search.py` + +- [ ] **Step 1: Add failing test** + +Append to `tests/embeddings/test_search.py`: + +```python +def test_update_claim_recomputes_embedding(store: KBStore) -> None: + src = store.put_source(b"e") + c = store.put_claim(Claim(id="c1", text="original", evidence=[src.id])) + rec_before = index_db.get_embedding(store.kb_dir, kind="claim", id="c1") + assert rec_before is not None + hash_before = rec_before[1] + + c2 = c.model_copy(update={"text": "updated"}) + store.update_claim(c2) + rec_after = index_db.get_embedding(store.kb_dir, kind="claim", id="c1") + assert rec_after is not None + assert rec_after[1] != hash_before +``` + +- [ ] **Step 2: Run test, confirm fails** + +Run: `.venv/bin/pytest tests/embeddings/test_search.py::test_update_claim_recomputes_embedding -v` +Expected: fail. + +- [ ] **Step 3: Add the hook to `update_claim`** + +Locate `update_claim` in `src/vouch/storage.py`. Just before the existing `return claim`, add: + +```python + self._embed_and_store(kind="claim", id=claim.id, text=claim.text) +``` + +If `update_page` exists in the codebase, add the same call to it with `text=f"{page.title}\n\n{page.body}"`. If it does not, omit -- mention "page update not yet implemented in storage" in the commit message. + +- [ ] **Step 4: Run test, confirm passes** + +Run: `.venv/bin/pytest tests/embeddings/test_search.py::test_update_claim_recomputes_embedding -v` +Expected: PASS. + +- [ ] **Step 5: Commit** + +```bash +git add src/vouch/storage.py tests/embeddings/test_search.py +git commit -m "feat(embeddings): re-embed on update_claim" +``` + +--- + +## Phase 4 — Read path / search integration + +### Task 14: `search_semantic` wrapper with query cache + +**Files:** +- Modify: `src/vouch/index_db.py` +- Modify: `tests/embeddings/test_search.py` + +- [ ] **Step 1: Write the failing test** + +Append to `tests/embeddings/test_search.py`: + +```python +def test_search_semantic_returns_top_hits(store: KBStore) -> None: + src = store.put_source(b"e") + store.put_claim(Claim(id="c1", text="alpha alpha alpha", evidence=[src.id])) + store.put_claim(Claim(id="c2", text="beta beta beta", evidence=[src.id])) + hits = index_db.search_semantic(store.kb_dir, query="alpha alpha alpha", limit=2) + assert hits[0][1] == "c1" +``` + +- [ ] **Step 2: Run test, confirm fails** + +Run: `.venv/bin/pytest tests/embeddings/test_search.py::test_search_semantic_returns_top_hits -v` +Expected: AttributeError. + +- [ ] **Step 3: Implement `search_semantic`** + +Append to `src/vouch/index_db.py`: + +```python +def search_semantic( + kb_dir: Path, + query: str, + *, + limit: int = 10, + kinds: tuple[str, ...] = ( + "claim", "page", "source", "entity", "relation", "evidence", + ), + min_score: float = 0.0, +) -> list[tuple[str, str, str, float]]: + """Encode query (cached) -> ANN/cosine search.""" + try: + from .embeddings import get_embedder + from .embeddings.cache import cache_query_vec, lookup_query_vec + except ImportError: + return [] + try: + embedder = get_embedder() + except KeyError: + return [] + qvec = lookup_query_vec(kb_dir, query=query) + if qvec is None: + qvec = embedder.encode(query) + cache_query_vec(kb_dir, query=query, vec=qvec) + return search_embedding( + kb_dir, query_vec=qvec, kinds=kinds, limit=limit, min_score=min_score, + ) +``` + +- [ ] **Step 4: Run test, confirm passes** + +Run: `.venv/bin/pytest tests/embeddings/test_search.py::test_search_semantic_returns_top_hits -v` +Expected: PASS. + +- [ ] **Step 5: Commit** + +```bash +git add src/vouch/index_db.py tests/embeddings/test_search.py +git commit -m "feat(embeddings): search_semantic wrapper with query cache" +``` + +--- + +### Task 15: Semantic-primary in MCP `kb_search` + +**Files:** +- Modify: `src/vouch/server.py` +- Modify: `tests/embeddings/test_search.py` + +- [ ] **Step 1: Write the failing test** + +Append to `tests/embeddings/test_search.py`: + +```python +def test_kb_search_defaults_to_semantic_then_fts5( + store: KBStore, monkeypatch: pytest.MonkeyPatch, +) -> None: + from vouch import server + monkeypatch.setattr(server, "_store", lambda: store) + src = store.put_source(b"e") + store.put_claim(Claim(id="c1", text="authentication design", evidence=[src.id])) + from vouch import health + health.rebuild_index(store) + result = server.kb_search("authentication design", limit=5) + assert result["hits"] + assert result["backend"] in ("embedding", "fts5", "substring") + assert result["hits"][0]["id"] == "c1" +``` + +- [ ] **Step 2: Run test, confirm fails** + +Run: `.venv/bin/pytest tests/embeddings/test_search.py::test_kb_search_defaults_to_semantic_then_fts5 -v` +Expected: fail. + +- [ ] **Step 3: Modify `kb_search` in `src/vouch/server.py`** + +Replace the body of `kb_search` with: + +```python +@mcp.tool() +def kb_search( + query: str, + *, + limit: int = 10, + backend: str = "auto", + min_score: float = 0.0, +) -> dict[str, Any]: + """Search the KB. + + backend: "auto" (default, embedding then fts5 then substring), + "embedding", "fts5", "substring", or "hybrid". + """ + from . import index_db + store = _store() + hits: list[tuple[str, str, str, float]] = [] + + def _to_dicts(h: list[tuple[str, str, str, float]], used: str) -> dict[str, Any]: + return { + "backend": used, + "hits": [ + {"kind": k, "id": i, "snippet": sn, "score": sc, "backend": used} + for k, i, sn, sc in h + ], + } + + if backend in ("auto", "embedding"): + hits = index_db.search_semantic( + store.kb_dir, query, limit=limit, min_score=min_score, + ) + if hits: + return _to_dicts(hits, "embedding") + if backend == "embedding": + return _to_dicts([], "embedding") + + if backend in ("auto", "fts5"): + try: + hits = index_db.search(store.kb_dir, query, limit=limit) + except Exception: + hits = [] + if hits: + return _to_dicts(hits, "fts5") + if backend == "fts5": + return _to_dicts([], "fts5") + + if backend in ("auto", "substring"): + hits = store.search_substring(query, limit=limit) + return _to_dicts(hits, "substring") + + if backend == "hybrid": + from .embeddings.fusion import rrf_fuse + emb = index_db.search_semantic(store.kb_dir, query, limit=limit * 2) + fts = index_db.search(store.kb_dir, query, limit=limit * 2) + hits = rrf_fuse(emb, fts, limit=limit) + return _to_dicts(hits, "hybrid") + + raise ValueError(f"unknown backend: {backend}") +``` + +- [ ] **Step 4: Run test, confirm passes** + +Run: `.venv/bin/pytest tests/embeddings/test_search.py::test_kb_search_defaults_to_semantic_then_fts5 -v` +Expected: PASS. + +- [ ] **Step 5: Run full suite to confirm no regression** + +Run: `.venv/bin/pytest --ignore=tests/test_sessions.py -q` +Expected: all green. + +- [ ] **Step 6: Commit** + +```bash +git add src/vouch/server.py tests/embeddings/test_search.py +git commit -m "feat(embeddings): kb_search defaults to embedding primary, fts5 fallback" +``` + +--- + +### Task 16: JSONL `_h_search` parity + +**Files:** +- Modify: `src/vouch/jsonl_server.py` +- Modify: `tests/embeddings/test_search.py` + +- [ ] **Step 1: Write the failing test** + +Append to `tests/embeddings/test_search.py`: + +```python +def test_jsonl_search_uses_embedding_backend( + store: KBStore, monkeypatch: pytest.MonkeyPatch, +) -> None: + from vouch import jsonl_server + monkeypatch.setattr(jsonl_server, "_store", lambda: store) + src = store.put_source(b"e") + store.put_claim(Claim(id="c1", text="claim about logins", evidence=[src.id])) + from vouch import health + health.rebuild_index(store) + resp = jsonl_server.handle_request({ + "id": "1", "method": "kb.search", + "params": {"query": "claim about logins"}, + }) + assert resp["ok"] is True + assert resp["result"] + assert resp["result"][0]["backend"] in ("embedding", "fts5", "substring") +``` + +- [ ] **Step 2: Run test, confirm fails** + +Run: `.venv/bin/pytest tests/embeddings/test_search.py::test_jsonl_search_uses_embedding_backend -v` +Expected: fail (no embedding path in JSONL handler). + +- [ ] **Step 3: Replace `_h_search` in `src/vouch/jsonl_server.py`** + +```python +def _h_search(p: dict) -> list[dict]: + from . import index_db + s = _store() + q = p["query"] + limit = int(p.get("limit", 10)) + backend_arg = p.get("backend", "auto") + min_score = float(p.get("min_score", 0.0)) + hits: list[tuple[str, str, str, float]] = [] + used = backend_arg + + if backend_arg in ("auto", "embedding"): + hits = index_db.search_semantic( + s.kb_dir, q, limit=limit, min_score=min_score, + ) + if hits: + used = "embedding" + if not hits and backend_arg in ("auto", "fts5"): + try: + hits = index_db.search(s.kb_dir, q, limit=limit) + used = "fts5" if hits else used + except Exception: + hits = [] + if not hits and backend_arg in ("auto", "substring"): + hits = s.search_substring(q, limit=limit) + used = "substring" + if backend_arg == "hybrid": + from .embeddings.fusion import rrf_fuse + emb = index_db.search_semantic(s.kb_dir, q, limit=limit * 2) + fts = index_db.search(s.kb_dir, q, limit=limit * 2) + hits = rrf_fuse(emb, fts, limit=limit) + used = "hybrid" + + return [ + {"kind": k, "id": i, "snippet": sn, "score": sc, "backend": used} + for k, i, sn, sc in hits + ] +``` + +- [ ] **Step 4: Run tests, confirm pass** + +Run: `.venv/bin/pytest tests/embeddings/test_search.py -v` +Expected: all pass. + +- [ ] **Step 5: Commit** + +```bash +git add src/vouch/jsonl_server.py tests/embeddings/test_search.py +git commit -m "feat(embeddings): JSONL _h_search parity with MCP semantic-primary dispatch" +``` + +--- + +## Phase 5 — Fusion + hybrid backend + +### Task 17: Fusion strategies (RRF, weighted, normalized) + +**Files:** +- Create: `src/vouch/embeddings/fusion.py` +- Test: `tests/embeddings/test_fusion.py` + +- [ ] **Step 1: Write the failing test** + +Create `tests/embeddings/test_fusion.py`: + +```python +"""Fusion strategies -- RRF, weighted, normalized-cosine.""" + +from __future__ import annotations + +from vouch.embeddings.fusion import ( + normalized_fuse, + rrf_fuse, + weighted_fuse, +) + + +def _hits(items: list[tuple[str, str, float]]) -> list[tuple[str, str, str, float]]: + return [(k, i, "", s) for k, i, s in items] + + +def test_rrf_fuse_prefers_top_of_both_lists() -> None: + a = _hits([("claim", "x", 0.9), ("claim", "y", 0.5)]) + b = _hits([("claim", "y", 0.9), ("claim", "z", 0.4)]) + fused = rrf_fuse(a, b, limit=3) + ids = [h[1] for h in fused] + assert ids[0] == "y" + + +def test_rrf_fuse_handles_empty_inputs() -> None: + assert rrf_fuse([], [], limit=5) == [] + + +def test_weighted_fuse_respects_weights() -> None: + a = _hits([("claim", "x", 1.0), ("claim", "y", 0.0)]) + b = _hits([("claim", "y", 1.0), ("claim", "x", 0.0)]) + only_a = weighted_fuse(a, b, w_a=1.0, w_b=0.0, limit=2) + assert only_a[0][1] == "x" + only_b = weighted_fuse(a, b, w_a=0.0, w_b=1.0, limit=2) + assert only_b[0][1] == "y" + + +def test_normalized_fuse_zero_score_inputs() -> None: + a = _hits([("claim", "x", 0.0)]) + b = _hits([("claim", "y", 0.0)]) + fused = normalized_fuse(a, b, limit=2) + assert len(fused) == 2 +``` + +- [ ] **Step 2: Run test, confirm fails** + +Run: `.venv/bin/pytest tests/embeddings/test_fusion.py -v` +Expected: ImportError. + +- [ ] **Step 3: Implement `fusion.py`** + +Create `src/vouch/embeddings/fusion.py`: + +```python +"""Result-list fusion strategies for hybrid retrieval.""" + +from __future__ import annotations + +Hit = tuple[str, str, str, float] +Hits = list[Hit] + + +def _key(h: Hit) -> tuple[str, str]: + return (h[0], h[1]) + + +def _coalesce_snippet(h: Hit, other: Hits) -> str: + if h[2]: + return h[2] + for o in other: + if _key(o) == _key(h) and o[2]: + return o[2] + return "" + + +def rrf_fuse(a: Hits, b: Hits, *, limit: int = 10, k: int = 60) -> Hits: + """Reciprocal Rank Fusion: score = sum(1 / (k + rank)) across lists.""" + scores: dict[tuple[str, str], float] = {} + for lst in (a, b): + for rank, h in enumerate(lst, start=1): + scores[_key(h)] = scores.get(_key(h), 0.0) + 1.0 / (k + rank) + out: Hits = [] + seen: set[tuple[str, str]] = set() + for h in a + b: + if _key(h) in seen: + continue + seen.add(_key(h)) + out.append((h[0], h[1], _coalesce_snippet(h, a + b), scores[_key(h)])) + out.sort(key=lambda h: h[3], reverse=True) + return out[:limit] + + +def _minmax(xs: list[float]) -> list[float]: + if not xs: + return xs + lo, hi = min(xs), max(xs) + if hi - lo < 1e-9: + return [0.5] * len(xs) + return [(x - lo) / (hi - lo) for x in xs] + + +def weighted_fuse( + a: Hits, b: Hits, *, w_a: float = 0.5, w_b: float = 0.5, limit: int = 10, +) -> Hits: + """Min-max normalize each list, then score = w_a * a_score + w_b * b_score.""" + a_norm = _minmax([h[3] for h in a]) + b_norm = _minmax([h[3] for h in b]) + a_score = {_key(h): a_norm[i] for i, h in enumerate(a)} + b_score = {_key(h): b_norm[i] for i, h in enumerate(b)} + merged: dict[tuple[str, str], float] = {} + for key in {*a_score, *b_score}: + merged[key] = w_a * a_score.get(key, 0.0) + w_b * b_score.get(key, 0.0) + out: Hits = [] + seen: set[tuple[str, str]] = set() + for h in a + b: + if _key(h) in seen: + continue + seen.add(_key(h)) + out.append((h[0], h[1], _coalesce_snippet(h, a + b), merged[_key(h)])) + out.sort(key=lambda h: h[3], reverse=True) + return out[:limit] + + +def normalized_fuse(a: Hits, b: Hits, *, limit: int = 10) -> Hits: + """Equal-weight weighted_fuse (0.5/0.5).""" + return weighted_fuse(a, b, w_a=0.5, w_b=0.5, limit=limit) +``` + +- [ ] **Step 4: Run tests, confirm pass** + +Run: `.venv/bin/pytest tests/embeddings/test_fusion.py -v` +Expected: 4 passed. + +- [ ] **Step 5: Commit** + +```bash +git add src/vouch/embeddings/fusion.py tests/embeddings/test_fusion.py +git commit -m "feat(embeddings): RRF/weighted/normalized fusion strategies" +``` + +--- + +## Phase 6 — Capabilities + +### Task 18: Cross-encoder reranker + +**Files:** +- Create: `src/vouch/embeddings/rerank.py` +- Test: `tests/embeddings/test_rerank.py` + +- [ ] **Step 1: Write the failing test** + +Create `tests/embeddings/test_rerank.py`: + +```python +"""Cross-encoder reranker over candidate top-K.""" + +from __future__ import annotations + +from collections.abc import Sequence + +from vouch.embeddings.rerank import Reranker, rerank + + +class MockReranker(Reranker): + name = "mock-reranker" + version = "1" + + def score(self, query: str, candidates: Sequence[str]) -> list[float]: + return [10.0 if "BOOST" in c else 0.0 for c in candidates] + + +def test_rerank_reorders_by_cross_encoder_score() -> None: + hits = [("claim", "a", "no marker here", 0.9), + ("claim", "b", "BOOST in this one", 0.1), + ("claim", "c", "also no marker", 0.5)] + out = rerank(query="anything", hits=hits, reranker=MockReranker(), top_k=3) + assert out[0][1] == "b" + + +def test_rerank_top_k_truncates() -> None: + hits = [("claim", "a", "x", 0.5), ("claim", "b", "y", 0.3)] + out = rerank(query="q", hits=hits, reranker=MockReranker(), top_k=1) + assert len(out) == 1 + + +def test_rerank_empty_hits() -> None: + out = rerank(query="q", hits=[], reranker=MockReranker(), top_k=5) + assert out == [] +``` + +- [ ] **Step 2: Run test, confirm fails** + +Run: `.venv/bin/pytest tests/embeddings/test_rerank.py -v` +Expected: ImportError. + +- [ ] **Step 3: Implement `rerank.py`** + +Create `src/vouch/embeddings/rerank.py`: + +```python +"""Cross-encoder reranking over candidate hits.""" + +from __future__ import annotations + +from abc import ABC, abstractmethod +from collections.abc import Sequence +from typing import Any, ClassVar + +Hit = tuple[str, str, str, float] + + +class Reranker(ABC): + name: ClassVar[str] = "" + version: ClassVar[str] = "" + + @abstractmethod + def score(self, query: str, candidates: Sequence[str]) -> list[float]: + """Return one score per candidate. Higher = more relevant.""" + + +class CrossEncoderReranker(Reranker): + name = "cross-encoder/ms-marco-MiniLM-L6-v2" + version = "v1" + + def __init__(self) -> None: + from sentence_transformers import CrossEncoder # type: ignore[import-not-found] + self._model: Any = CrossEncoder(self.name) + + def score(self, query: str, candidates: Sequence[str]) -> list[float]: + if not candidates: + return [] + pairs = [(query, c) for c in candidates] + scores = self._model.predict(pairs) + return [float(s) for s in scores] + + +def rerank( + *, query: str, hits: list[Hit], reranker: Reranker, top_k: int = 50, +) -> list[Hit]: + if not hits: + return [] + candidates = [h[2] or h[1] for h in hits] + scores = reranker.score(query, candidates) + reranked = [ + (kind, id_, snip, score) + for (kind, id_, snip, _orig), score in zip(hits, scores) + ] + reranked.sort(key=lambda h: h[3], reverse=True) + return reranked[:top_k] + + +def default_reranker() -> Reranker: + """Return a CrossEncoderReranker; raise ImportError if extras not installed.""" + return CrossEncoderReranker() +``` + +- [ ] **Step 4: Run tests, confirm pass** + +Run: `.venv/bin/pytest tests/embeddings/test_rerank.py -v` +Expected: 3 passed. + +- [ ] **Step 5: Commit** + +```bash +git add src/vouch/embeddings/rerank.py tests/embeddings/test_rerank.py +git commit -m "feat(embeddings): cross-encoder reranker (Reranker ABC + default impl)" +``` + +--- + +### Task 19: HyDE query expansion + +**Files:** +- Create: `src/vouch/embeddings/hyde.py` +- Test: `tests/embeddings/test_hyde.py` + +- [ ] **Step 1: Write the failing test** + +Create `tests/embeddings/test_hyde.py`: + +```python +"""HyDE -- Hypothetical Document Embedding query expansion.""" + +from __future__ import annotations + +from vouch.embeddings.hyde import expand_query_template + + +def test_template_expansion_adds_context() -> None: + expanded = expand_query_template("auth") + assert "auth" in expanded + assert len(expanded) > len("auth") + + +def test_template_expansion_idempotent_for_long_queries() -> None: + long_q = "this is a long descriptive query about something specific" + out = expand_query_template(long_q, min_chars=20) + assert out == long_q +``` + +- [ ] **Step 2: Run test, confirm fails** + +Run: `.venv/bin/pytest tests/embeddings/test_hyde.py -v` +Expected: ImportError. + +- [ ] **Step 3: Implement HyDE** + +Create `src/vouch/embeddings/hyde.py`: + +```python +"""HyDE -- Hypothetical Document Embedding expansion.""" + +from __future__ import annotations + +from collections.abc import Callable + +DEFAULT_TEMPLATE = ( + "The following is a document that answers the question: '{query}'. " + "It contains relevant facts, claims, and supporting evidence about {query}." +) + + +def expand_query_template(query: str, *, min_chars: int = 20) -> str: + """Pad short queries with HyDE template; pass through long ones.""" + if len(query.strip()) >= min_chars: + return query + return DEFAULT_TEMPLATE.format(query=query.strip()) + + +def expand_query_with_llm(query: str, *, llm: Callable[[str], str]) -> str: + """Use an LLM to draft a hypothetical answer; embed that instead.""" + prompt = ( + "Write a short, factual paragraph that would answer this question. " + "Stay neutral; don't ask follow-ups.\n\n" + f"Question: {query}\n\nAnswer:" + ) + return llm(prompt).strip() or query +``` + +- [ ] **Step 4: Run tests, confirm pass** + +Run: `.venv/bin/pytest tests/embeddings/test_hyde.py -v` +Expected: 2 passed. + +- [ ] **Step 5: Commit** + +```bash +git add src/vouch/embeddings/hyde.py tests/embeddings/test_hyde.py +git commit -m "feat(embeddings): HyDE query expansion (template + LLM hook)" +``` + +--- + +### Task 20: Ingest-time duplicate detection + +**Files:** +- Create: `src/vouch/embeddings/dedup.py` +- Test: `tests/embeddings/test_dedup.py` + +- [ ] **Step 1: Write the failing test** + +Create `tests/embeddings/test_dedup.py`: + +```python +"""Ingest-time duplicate detection.""" + +from __future__ import annotations + +from pathlib import Path + +import pytest + +from vouch import index_db +from vouch.embeddings import register +from vouch.embeddings.dedup import list_duplicates +from vouch.models import Claim +from vouch.storage import KBStore +from tests.embeddings._fakes import MockEmbedder + + +@pytest.fixture(autouse=True) +def _register_default() -> None: + from vouch.embeddings.base import DEFAULT_MODEL_NAME + register(DEFAULT_MODEL_NAME, lambda: MockEmbedder(dim=8)) + + +@pytest.fixture +def store(tmp_path: Path) -> KBStore: + return KBStore.init(tmp_path) + + +def test_identical_text_flagged_as_duplicate(store: KBStore) -> None: + src = store.put_source(b"e") + store.put_claim(Claim(id="c1", text="exact same text", evidence=[src.id])) + store.put_claim(Claim(id="c2", text="exact same text", evidence=[src.id])) + dupes = list_duplicates(store.kb_dir) + pairs = {(d["id"], d["near_id"]) for d in dupes} + assert ("c2", "c1") in pairs or ("c1", "c2") in pairs + + +def test_disjoint_text_not_flagged(store: KBStore) -> None: + src = store.put_source(b"e") + store.put_claim(Claim(id="c1", text="apples", evidence=[src.id])) + store.put_claim(Claim(id="c2", text="zebras", evidence=[src.id])) + dupes = list_duplicates(store.kb_dir) + assert dupes == [] +``` + +- [ ] **Step 2: Run test, confirm fails** + +Run: `.venv/bin/pytest tests/embeddings/test_dedup.py -v` +Expected: ImportError. + +- [ ] **Step 3: Implement `dedup.py`** + +Create `src/vouch/embeddings/dedup.py`: + +```python +"""Ingest-time duplicate detection via embedding cosine similarity.""" + +from __future__ import annotations + +import datetime as dt +from pathlib import Path +from typing import Any + +import numpy as np + +from .. import index_db + +DEFAULT_THRESHOLD = 0.95 + + +def check_and_log( + kb_dir: Path, *, + kind: str, id: str, vec: np.ndarray, + threshold: float = DEFAULT_THRESHOLD, +) -> tuple[str, float] | None: + """Find nearest-neighbor cosine >= threshold; log if found.""" + candidates = index_db.search_embedding( + kb_dir, query_vec=vec, kinds=(kind,), limit=2, + ) + for k, near_id, _snip, cos in candidates: + if k != kind or near_id == id: + continue + if cos >= threshold: + _log(kb_dir, kind=kind, id=id, near_id=near_id, cosine=cos) + return near_id, cos + return None + + +def _log(kb_dir: Path, *, kind: str, id: str, near_id: str, cosine: float) -> None: + with index_db.open_db(kb_dir) as conn: + conn.execute( + "INSERT INTO embedding_dupes (kind, id, near_id, cosine, detected_at) " + "VALUES (?, ?, ?, ?, ?)", + (kind, id, near_id, float(cosine), + dt.datetime.now(dt.UTC).isoformat(timespec="seconds")), + ) + + +def list_duplicates(kb_dir: Path) -> list[dict[str, Any]]: + with index_db.open_db(kb_dir) as conn: + rows = conn.execute( + "SELECT kind, id, near_id, cosine, detected_at FROM embedding_dupes " + "ORDER BY detected_at DESC" + ).fetchall() + return [ + {"kind": k, "id": i, "near_id": n, "cosine": float(c), "detected_at": d} + for k, i, n, c, d in rows + ] + + +def scan_all( + kb_dir: Path, *, threshold: float = DEFAULT_THRESHOLD, dry_run: bool = False, +) -> list[dict[str, Any]]: + """Cross-artifact scan within same kind. For ad-hoc audit.""" + found: list[dict[str, Any]] = [] + with index_db.open_db(kb_dir) as conn: + rows = conn.execute( + "SELECT kind, id, vec, dim FROM embedding_index" + ).fetchall() + if not rows: + return found + vecs: dict[tuple[str, str], np.ndarray] = {} + for kind, id_, blob, dim in rows: + vecs[(kind, id_)] = np.frombuffer(blob, dtype=np.float32, count=dim).copy() + seen: set[frozenset[tuple[str, str]]] = set() + keys = list(vecs.keys()) + for i, k1 in enumerate(keys): + for k2 in keys[i + 1:]: + if k1[0] != k2[0]: + continue + cos = float(vecs[k1] @ vecs[k2]) + if cos >= threshold: + pair = frozenset([k1, k2]) + if pair in seen: + continue + seen.add(pair) + if not dry_run: + _log(kb_dir, kind=k1[0], id=k2[1], near_id=k1[1], cosine=cos) + found.append({ + "kind": k1[0], "id": k2[1], "near_id": k1[1], "cosine": cos, + }) + return found +``` + +> Note: the dedup hook in `KBStore._embed_and_store` (added in Task 11) already references `check_and_log` via `from .embeddings.dedup import check_and_log`. Once this task lands, that branch resolves. + +- [ ] **Step 4: Run tests, confirm pass** + +Run: `.venv/bin/pytest tests/embeddings/test_dedup.py -v` +Expected: 2 passed. + +- [ ] **Step 5: Commit** + +```bash +git add src/vouch/embeddings/dedup.py tests/embeddings/test_dedup.py +git commit -m "feat(embeddings): ingest-time duplicate detection + audit ledger" +``` + +--- + +### Task 21: Evaluation harness (recall@k, MRR, nDCG) + +**Files:** +- Create: `src/vouch/embeddings/scorer.py` +- Test: `tests/embeddings/test_scorer.py` + +- [ ] **Step 1: Write the failing test** + +Create `tests/embeddings/test_scorer.py`: + +```python +"""Metrics for embedding retrieval.""" + +from __future__ import annotations + +from vouch.embeddings.scorer import mrr, ndcg, recall_at_k + + +def test_recall_at_k_full_hit() -> None: + relevant = {"claim:c1"} + hits = [("claim", "c1", "", 0.9), ("claim", "c2", "", 0.1)] + assert recall_at_k(hits, relevant, k=1) == 1.0 + + +def test_recall_at_k_miss() -> None: + relevant = {"claim:c1"} + hits = [("claim", "c2", "", 0.9)] + assert recall_at_k(hits, relevant, k=1) == 0.0 + + +def test_recall_at_k_partial_with_k_larger_than_hits() -> None: + relevant = {"claim:c1", "claim:c2"} + hits = [("claim", "c1", "", 0.9)] + assert recall_at_k(hits, relevant, k=5) == 0.5 + + +def test_mrr_first_position() -> None: + relevant = {"claim:c1"} + hits = [("claim", "c1", "", 0.9), ("claim", "c2", "", 0.5)] + assert mrr(hits, relevant) == 1.0 + + +def test_mrr_second_position() -> None: + relevant = {"claim:c1"} + hits = [("claim", "c2", "", 0.9), ("claim", "c1", "", 0.5)] + assert abs(mrr(hits, relevant) - 0.5) < 1e-9 + + +def test_ndcg_monotonic() -> None: + relevant = {"claim:c1"} + good = [("claim", "c1", "", 1.0), ("claim", "c2", "", 0.5)] + bad = [("claim", "c2", "", 1.0), ("claim", "c1", "", 0.5)] + assert ndcg(good, relevant, k=2) > ndcg(bad, relevant, k=2) +``` + +- [ ] **Step 2: Run test, confirm fails** + +Run: `.venv/bin/pytest tests/embeddings/test_scorer.py -v` +Expected: ImportError. + +- [ ] **Step 3: Implement `scorer.py`** + +Create `src/vouch/embeddings/scorer.py`: + +```python +"""Retrieval evaluation metrics: recall@k, MRR, nDCG. + +Ground truth format: a set of "kind:id" strings (e.g. {"claim:c1"}). +Hits format matches index_db: list of (kind, id, snippet, score). +""" + +from __future__ import annotations + +import json +import math +from pathlib import Path + +Hit = tuple[str, str, str, float] + + +def _key(h: Hit) -> str: + return f"{h[0]}:{h[1]}" + + +def recall_at_k(hits: list[Hit], relevant: set[str], *, k: int = 10) -> float: + if not relevant: + return 0.0 + top = {_key(h) for h in hits[:k]} + return len(top & relevant) / len(relevant) + + +def mrr(hits: list[Hit], relevant: set[str]) -> float: + for i, h in enumerate(hits, start=1): + if _key(h) in relevant: + return 1.0 / i + return 0.0 + + +def ndcg(hits: list[Hit], relevant: set[str], *, k: int = 10) -> float: + dcg = 0.0 + for i, h in enumerate(hits[:k], start=1): + if _key(h) in relevant: + dcg += 1.0 / math.log2(i + 1) + ideal = sum(1.0 / math.log2(i + 1) for i in range(1, min(len(relevant), k) + 1)) + if ideal <= 0: + return 0.0 + return dcg / ideal + + +def evaluate( + *, + kb_dir: Path, + queries_file: Path, + k: int = 10, + metrics: tuple[str, ...] = ("recall@k", "mrr", "ndcg"), +) -> dict[str, float]: + """Run a metric sweep over a JSONL queries file.""" + from .. import index_db + totals = {m: 0.0 for m in metrics} + n = 0 + with queries_file.open() as f: + for line in f: + row = json.loads(line) + q = row["query"] + rel = set(row["relevant"]) + hits = index_db.search_semantic(kb_dir, q, limit=k) + if "recall@k" in metrics: + totals["recall@k"] += recall_at_k(hits, rel, k=k) + if "mrr" in metrics: + totals["mrr"] += mrr(hits, rel) + if "ndcg" in metrics: + totals["ndcg"] += ndcg(hits, rel, k=k) + n += 1 + if n == 0: + return {m: 0.0 for m in metrics} + return {m: totals[m] / n for m in metrics} + + +def write_report(out: dict[str, float], path: Path) -> None: + path.write_text(json.dumps(out, indent=2)) +``` + +- [ ] **Step 4: Run tests, confirm pass** + +Run: `.venv/bin/pytest tests/embeddings/test_scorer.py -v` +Expected: 6 passed. + +- [ ] **Step 5: Commit** + +```bash +git add src/vouch/embeddings/scorer.py tests/embeddings/test_scorer.py +git commit -m "feat(embeddings): scorer harness (recall@k, MRR, nDCG)" +``` + +--- + +### Task 22: Model-identity migration + +**Files:** +- Create: `src/vouch/embeddings/migration.py` +- Test: `tests/embeddings/test_migration.py` + +- [ ] **Step 1: Write the failing test** + +Create `tests/embeddings/test_migration.py`: + +```python +"""Model-identity mismatch detection + backfill.""" + +from __future__ import annotations + +from pathlib import Path + +import pytest + +from vouch import index_db +from vouch.embeddings import register +from vouch.embeddings.migration import ( + backfill_embeddings, + detect_mismatch, +) +from vouch.models import Claim +from vouch.storage import KBStore +from tests.embeddings._fakes import MockEmbedder + + +@pytest.fixture(autouse=True) +def _register_default() -> None: + from vouch.embeddings.base import DEFAULT_MODEL_NAME + register(DEFAULT_MODEL_NAME, lambda: MockEmbedder(dim=8)) + + +@pytest.fixture +def store(tmp_path: Path) -> KBStore: + return KBStore.init(tmp_path) + + +def test_detect_mismatch_returns_none_for_empty_kb(store: KBStore) -> None: + assert detect_mismatch(store.kb_dir) is None + + +def test_detect_mismatch_reports_model_change(store: KBStore) -> None: + src = store.put_source(b"e") + store.put_claim(Claim(id="c1", text="x", evidence=[src.id])) + index_db.set_embedding_meta( + store.kb_dir, model="some-other-model", version="v2", dim=8, + ) + mismatch = detect_mismatch(store.kb_dir) + assert mismatch is not None + assert mismatch["stored_model"] == "some-other-model" + assert mismatch["current_model"] == "mock" + + +def test_backfill_re_encodes_all_artifacts(store: KBStore) -> None: + src = store.put_source(b"e") + store.put_claim(Claim(id="c1", text="alpha", evidence=[src.id])) + store.put_claim(Claim(id="c2", text="beta", evidence=[src.id])) + with index_db.open_db(store.kb_dir) as conn: + conn.execute("DELETE FROM embedding_index") + n = backfill_embeddings(store) + assert n >= 2 + assert index_db.get_embedding(store.kb_dir, kind="claim", id="c1") is not None +``` + +- [ ] **Step 2: Run test, confirm fails** + +Run: `.venv/bin/pytest tests/embeddings/test_migration.py -v` +Expected: ImportError. + +- [ ] **Step 3: Implement `migration.py`** + +Create `src/vouch/embeddings/migration.py`: + +```python +"""Model-identity migration and backfill.""" + +from __future__ import annotations + +from pathlib import Path +from typing import Any + +from .. import index_db +from .base import get_embedder + + +def detect_mismatch(kb_dir: Path) -> dict[str, Any] | None: + """Return mismatch info or None if no mismatch.""" + meta = index_db.get_embedding_meta(kb_dir) + stored = meta.get("embedding_model") + if not stored: + return None + try: + current = get_embedder() + except KeyError: + return None + if current.name == stored: + return None + return { + "stored_model": stored, + "stored_version": meta.get("embedding_model_version"), + "stored_dim": meta.get("embedding_dim"), + "current_model": current.name, + "current_version": current.version, + "current_dim": current.dim, + } + + +def backfill_embeddings(store: Any, *, force: bool = False) -> int: + """Re-encode every artifact under the current adapter. Returns count touched.""" + embedder = get_embedder() + touched = 0 + for c in store.list_claims(): + store._embed_and_store(kind="claim", id=c.id, text=c.text) + touched += 1 + for p in store.list_pages(): + store._embed_and_store(kind="page", id=p.id, text=f"{p.title}\n\n{p.body}") + touched += 1 + for s in store.list_sources(): + store._embed_and_store( + kind="source", id=s.id, text=s.title or s.locator or "", + ) + touched += 1 + for e in store.list_entities(): + store._embed_and_store( + kind="entity", id=e.id, text=f"{e.name}\n\n{e.description or ''}", + ) + touched += 1 + for r in store.list_relations(): + store._embed_and_store( + kind="relation", id=r.id, + text=f"{r.source} {r.type.value} {r.target}\n{r.description or ''}", + ) + touched += 1 + for ev in store.list_evidence(): + store._embed_and_store(kind="evidence", id=ev.id, text=ev.excerpt or "") + touched += 1 + index_db.set_embedding_meta( + store.kb_dir, model=embedder.name, version=embedder.version, dim=embedder.dim, + ) + return touched +``` + +- [ ] **Step 4: Run tests, confirm pass** + +Run: `.venv/bin/pytest tests/embeddings/test_migration.py -v` +Expected: 3 passed. + +- [ ] **Step 5: Commit** + +```bash +git add src/vouch/embeddings/migration.py tests/embeddings/test_migration.py +git commit -m "feat(embeddings): model-identity mismatch detection + backfill" +``` + +--- + +## Phase 7 — Context pack integration + +### Task 23: Semantic-default `build_context_pack` + `--explain` + +**Files:** +- Modify: `src/vouch/context.py` +- Modify: `tests/test_context.py` + +- [ ] **Step 1: Read the current `context.py` end-to-end** + +Open `src/vouch/context.py` and note the existing signature of `build_context_pack` and how it dispatches to `index_db.search`. The task is to insert `search_semantic` as the first attempt while preserving all existing item-assembly logic. + +- [ ] **Step 2: Write the failing test** + +Append to `tests/test_context.py`: + +```python +def test_build_context_pack_uses_semantic_default(tmp_path: Path) -> None: + from vouch.embeddings import register + from vouch.embeddings.base import DEFAULT_MODEL_NAME + from vouch.models import Claim + from vouch.storage import KBStore + from vouch.context import build_context_pack + from tests.embeddings._fakes import MockEmbedder + + register(DEFAULT_MODEL_NAME, lambda: MockEmbedder(dim=8)) + store = KBStore.init(tmp_path) + src = store.put_source(b"e") + store.put_claim(Claim(id="c1", text="exact query string", evidence=[src.id])) + pack = build_context_pack(store, query="exact query string", limit=5) + assert any(item["id"] == "c1" for item in pack.get("items", [])) + + +def test_build_context_pack_explain_flag_returns_score_breakdown( + tmp_path: Path, +) -> None: + from vouch.embeddings import register + from vouch.embeddings.base import DEFAULT_MODEL_NAME + from vouch.models import Claim + from vouch.storage import KBStore + from vouch.context import build_context_pack + from tests.embeddings._fakes import MockEmbedder + + register(DEFAULT_MODEL_NAME, lambda: MockEmbedder(dim=8)) + store = KBStore.init(tmp_path) + src = store.put_source(b"e") + store.put_claim(Claim(id="c1", text="hello", evidence=[src.id])) + pack = build_context_pack(store, query="hello", limit=5, explain=True) + assert "explain" in pack + assert any("backend" in row for row in pack["explain"]) +``` + +- [ ] **Step 3: Run tests, confirm fail** + +Run: `.venv/bin/pytest tests/test_context.py -v` +Expected: 2 failures. + +- [ ] **Step 4: Modify `build_context_pack` in `src/vouch/context.py`** + +Locate `build_context_pack`. Add an `explain: bool = False` parameter to the signature. At the top of the body (replacing the existing retrieval call), use: + +```python + from . import index_db + hits = index_db.search_semantic(store.kb_dir, query, limit=limit) + backend = "embedding" + if not hits: + hits = index_db.search(store.kb_dir, query, limit=limit) + backend = "fts5" + if not hits: + hits = store.search_substring(query, limit=limit) + backend = "substring" +``` + +Preserve all of the existing item-assembly logic that consumes `hits`. Finally, before returning, add the optional explain field: + +```python + if explain: + pack["explain"] = [ + {"kind": k, "id": i, "score": sc, "backend": backend} + for k, i, _sn, sc in hits + ] + pack["backend"] = backend +``` + +- [ ] **Step 5: Run tests, confirm pass** + +Run: `.venv/bin/pytest tests/test_context.py -v` +Expected: existing context tests pass + 2 new pass. + +- [ ] **Step 6: Commit** + +```bash +git add src/vouch/context.py tests/test_context.py +git commit -m "feat(embeddings): semantic-default build_context_pack + --explain support" +``` + +--- + +## Phase 8 — CLI + JSONL parity sweep + +### Task 24: `vouch search` flag surface + +**Files:** +- Modify: `src/vouch/cli.py` +- Create: `tests/embeddings/test_cli.py` + +- [ ] **Step 1: Write the failing test** + +Create `tests/embeddings/test_cli.py`: + +```python +"""CLI flag surface for embeddings commands.""" + +from __future__ import annotations + +from pathlib import Path + +import pytest +from click.testing import CliRunner + +from vouch.cli import cli +from vouch.embeddings import register +from vouch.embeddings.base import DEFAULT_MODEL_NAME +from vouch.models import Claim +from vouch.storage import KBStore +from tests.embeddings._fakes import MockEmbedder + + +@pytest.fixture(autouse=True) +def _register_default() -> None: + register(DEFAULT_MODEL_NAME, lambda: MockEmbedder(dim=8)) + + +@pytest.fixture +def kb(tmp_path: Path, monkeypatch: pytest.MonkeyPatch) -> Path: + store = KBStore.init(tmp_path) + src = store.put_source(b"e") + store.put_claim(Claim(id="c1", text="some text", evidence=[src.id])) + monkeypatch.chdir(tmp_path) + return tmp_path + + +def test_search_semantic_flag(kb: Path) -> None: + runner = CliRunner() + result = runner.invoke(cli, ["search", "some text", "--semantic"]) + assert result.exit_code == 0 + assert "c1" in result.output + + +def test_search_backend_flag(kb: Path) -> None: + runner = CliRunner() + result = runner.invoke(cli, ["search", "some text", "--backend", "embedding"]) + assert result.exit_code == 0 + + +def test_search_top_k_flag(kb: Path) -> None: + runner = CliRunner() + result = runner.invoke(cli, ["search", "x", "--top-k", "3"]) + assert result.exit_code == 0 +``` + +- [ ] **Step 2: Run test, confirm fails** + +Run: `.venv/bin/pytest tests/embeddings/test_cli.py::test_search_semantic_flag -v` +Expected: fail. + +- [ ] **Step 3: Extend `search` in `cli.py`** + +Find the existing `@cli.command()` for `search` in `src/vouch/cli.py`. Replace with: + +```python +@cli.command() +@click.argument("query") +@click.option("--limit", "-n", default=10, show_default=True, type=int) +@click.option("--top-k", default=None, type=int, help="Alias for --limit.") +@click.option("--semantic/--no-semantic", default=None, + help="Force semantic backend (alias for --backend embedding).") +@click.option( + "--backend", + type=click.Choice(["auto", "embedding", "fts5", "substring", "hybrid"]), + default="auto", show_default=True, +) +@click.option("--min-score", default=0.0, show_default=True, type=float) +@click.option("--rerank/--no-rerank", default=False) +@click.option("--hyde/--no-hyde", default=False) +@click.option("--explain/--no-explain", default=False) +def search( + query: str, + limit: int, + top_k: int | None, + semantic: bool | None, + backend: str, + min_score: float, + rerank: bool, + hyde: bool, + explain: bool, +) -> None: + """Search the KB.""" + from . import index_db + from .embeddings.fusion import rrf_fuse + store = _load_store() + if top_k is not None: + limit = top_k + if semantic is True: + backend = "embedding" + elif semantic is False: + backend = "fts5" + q = query + if hyde: + from .embeddings.hyde import expand_query_template + q = expand_query_template(query) + + hits: list[tuple[str, str, str, float]] = [] + used = backend + if backend in ("auto", "embedding"): + hits = index_db.search_semantic( + store.kb_dir, q, limit=limit, min_score=min_score, + ) + used = "embedding" if hits else used + if not hits and backend in ("auto", "fts5"): + hits = index_db.search(store.kb_dir, q, limit=limit) + used = "fts5" if hits else used + if not hits and backend in ("auto", "substring"): + hits = store.search_substring(q, limit=limit) + used = "substring" + if backend == "hybrid": + emb = index_db.search_semantic(store.kb_dir, q, limit=limit * 2) + fts = index_db.search(store.kb_dir, q, limit=limit * 2) + hits = rrf_fuse(emb, fts, limit=limit) + used = "hybrid" + + if rerank and hits: + try: + from .embeddings.rerank import default_reranker, rerank as do_rerank + hits = do_rerank(query=query, hits=hits, reranker=default_reranker(), + top_k=limit) + except ImportError: + click.echo("warning: rerank extras not installed; skipping rerank", + err=True) + + for k, i, snip, score in hits: + if explain: + click.echo(f"[{used}] {k}/{i}\tscore={score:.4f}\t{snip}") + else: + click.echo(f"{k}/{i}\t{snip}") +``` + +- [ ] **Step 4: Run tests, confirm pass** + +Run: `.venv/bin/pytest tests/embeddings/test_cli.py -v` +Expected: 3 passed. + +- [ ] **Step 5: Commit** + +```bash +git add src/vouch/cli.py tests/embeddings/test_cli.py +git commit -m "feat(embeddings): vouch search flags (--semantic, --backend, --top-k, --rerank, --hyde, --explain)" +``` + +--- + +### Task 25: `vouch reindex --embeddings` + +**Files:** +- Modify: `src/vouch/cli.py` +- Modify: `tests/embeddings/test_cli.py` + +- [ ] **Step 1: Write the failing test** + +Append to `tests/embeddings/test_cli.py`: + +```python +def test_reindex_embeddings_backfills(kb: Path) -> None: + from vouch import index_db + from vouch.storage import discover_root, KBStore + store = KBStore(discover_root(kb)) + with index_db.open_db(store.kb_dir) as conn: + conn.execute("DELETE FROM embedding_index") + runner = CliRunner() + result = runner.invoke(cli, ["reindex", "--embeddings", "--backfill"]) + assert result.exit_code == 0 + assert index_db.get_embedding(store.kb_dir, kind="claim", id="c1") is not None +``` + +- [ ] **Step 2: Run test, confirm fails** + +Run: `.venv/bin/pytest tests/embeddings/test_cli.py::test_reindex_embeddings_backfills -v` +Expected: fail (`reindex` not present or lacks flags). + +- [ ] **Step 3: Add the command** + +Append to `src/vouch/cli.py`: + +```python +@cli.command() +@click.option("--embeddings/--no-embeddings", default=False, + help="Rebuild the embedding index in addition to FTS5.") +@click.option("--backfill/--no-backfill", default=False, + help="Re-encode every artifact under the current model.") +@click.option("--force/--no-force", default=False, + help="Re-encode even if content hash unchanged.") +@click.option("--model", default=None, + help="Adapter name; defaults to the registered default.") +def reindex(embeddings: bool, backfill: bool, force: bool, model: str | None) -> None: + """Rebuild derived indexes from on-disk artifacts.""" + from . import health + store = _load_store() + health.rebuild_index(store) + if embeddings or backfill: + from .embeddings.migration import backfill_embeddings + if model: + from .embeddings import get_embedder + get_embedder(model) + n = backfill_embeddings(store, force=force) + click.echo(f"reindex: embeddings backfilled = {n}") + else: + click.echo("reindex: FTS5 rebuilt") +``` + +- [ ] **Step 4: Run test, confirm passes** + +Run: `.venv/bin/pytest tests/embeddings/test_cli.py::test_reindex_embeddings_backfills -v` +Expected: PASS. + +- [ ] **Step 5: Commit** + +```bash +git add src/vouch/cli.py tests/embeddings/test_cli.py +git commit -m "feat(embeddings): vouch reindex --embeddings --backfill --force --model" +``` + +--- + +### Task 26: `vouch dedup` command + +**Files:** +- Modify: `src/vouch/cli.py` +- Modify: `tests/embeddings/test_cli.py` + +- [ ] **Step 1: Add failing test** + +```python +def test_dedup_scan_lists_duplicates(kb: Path) -> None: + runner = CliRunner() + result = runner.invoke(cli, ["dedup", "--threshold", "0.5", "--dry-run"]) + assert result.exit_code == 0 +``` + +- [ ] **Step 2: Run test, confirm fails** + +Run: `.venv/bin/pytest tests/embeddings/test_cli.py::test_dedup_scan_lists_duplicates -v` +Expected: fail. + +- [ ] **Step 3: Add the command** + +Append to `src/vouch/cli.py`: + +```python +@cli.command() +@click.option("--threshold", default=0.95, show_default=True, type=float) +@click.option("--dry-run/--no-dry-run", default=False) +def dedup(threshold: float, dry_run: bool) -> None: + """Scan embeddings for cross-artifact near-duplicates.""" + from .embeddings.dedup import scan_all + store = _load_store() + rows = scan_all(store.kb_dir, threshold=threshold, dry_run=dry_run) + if not rows: + click.echo("dedup: no duplicates found") + return + for r in rows: + click.echo( + f"{r['kind']}/{r['id']} ~ {r['kind']}/{r['near_id']} " + f"cos={r['cosine']:.4f}" + ) +``` + +- [ ] **Step 4: Run test, confirm passes** + +Run: `.venv/bin/pytest tests/embeddings/test_cli.py::test_dedup_scan_lists_duplicates -v` +Expected: PASS. + +- [ ] **Step 5: Commit** + +```bash +git add src/vouch/cli.py tests/embeddings/test_cli.py +git commit -m "feat(embeddings): vouch dedup scan command" +``` + +--- + +### Task 27: `vouch eval embedding` command + +**Files:** +- Modify: `src/vouch/cli.py` +- Modify: `tests/embeddings/test_cli.py` + +- [ ] **Step 1: Add failing test** + +```python +def test_eval_embedding_outputs_metrics(kb: Path, tmp_path: Path) -> None: + import json as _json + qfile = tmp_path / "queries.jsonl" + qfile.write_text(_json.dumps({"query": "some text", "relevant": ["claim:c1"]}) + "\n") + runner = CliRunner() + result = runner.invoke(cli, [ + "eval", "embedding", + "--queries", str(qfile), + "--metric", "recall@10,mrr,ndcg", + ]) + assert result.exit_code == 0 + assert "recall" in result.output.lower() or "mrr" in result.output.lower() +``` + +- [ ] **Step 2: Run test, confirm fails** + +Run: `.venv/bin/pytest tests/embeddings/test_cli.py::test_eval_embedding_outputs_metrics -v` +Expected: fail. + +- [ ] **Step 3: Add the command (Python identifier `eval_group` to avoid shadowing)** + +Append to `src/vouch/cli.py`: + +```python +@cli.group(name="eval") +def eval_group() -> None: + """Evaluation harnesses.""" + + +@eval_group.command("embedding") +@click.option("--queries", required=True, type=click.Path(exists=True)) +@click.option("--metric", default="recall@10,mrr,ndcg") +def eval_embedding(queries: str, metric: str) -> None: + """Run retrieval-quality metrics over a JSONL query set.""" + from pathlib import Path + from .embeddings.scorer import evaluate + store = _load_store() + metrics = tuple(m.strip() for m in metric.split(",")) + canonical = tuple( + "recall@k" if m.startswith("recall@") else m for m in metrics + ) + k = 10 + for m in metrics: + if m.startswith("recall@"): + try: + k = int(m.split("@", 1)[1]) + except ValueError: + pass + out = evaluate( + kb_dir=store.kb_dir, + queries_file=Path(queries), + k=k, + metrics=canonical, + ) + for m_name, v in out.items(): + click.echo(f"{m_name}\t{v:.4f}") +``` + +- [ ] **Step 4: Run test, confirm passes** + +Run: `.venv/bin/pytest tests/embeddings/test_cli.py::test_eval_embedding_outputs_metrics -v` +Expected: PASS. + +- [ ] **Step 5: Commit** + +```bash +git add src/vouch/cli.py tests/embeddings/test_cli.py +git commit -m "feat(embeddings): vouch eval embedding command" +``` + +--- + +### Task 28: `vouch embeddings stats` command + +**Files:** +- Modify: `src/vouch/cli.py` +- Modify: `tests/embeddings/test_cli.py` + +- [ ] **Step 1: Add failing test** + +```python +def test_embeddings_stats(kb: Path) -> None: + runner = CliRunner() + result = runner.invoke(cli, ["embeddings", "stats"]) + assert result.exit_code == 0 + assert "model" in result.output.lower() or "claim" in result.output.lower() +``` + +- [ ] **Step 2: Run test, confirm fails** + +Run: `.venv/bin/pytest tests/embeddings/test_cli.py::test_embeddings_stats -v` +Expected: fail. + +- [ ] **Step 3: Add the command** + +Append to `src/vouch/cli.py`: + +```python +@cli.group() +def embeddings() -> None: + """Embedding maintenance commands.""" + + +@embeddings.command("stats") +def embeddings_stats() -> None: + """Print model identity, per-kind counts, and cache hit rate.""" + from . import index_db + from .embeddings.cache import query_cache_stats + store = _load_store() + meta = index_db.get_embedding_meta(store.kb_dir) + for k, v in sorted(meta.items()): + click.echo(f"{k}\t{v}") + with index_db.open_db(store.kb_dir) as conn: + rows = conn.execute( + "SELECT kind, COUNT(*) FROM embedding_index GROUP BY kind" + ).fetchall() + for k, n in rows: + click.echo(f"embedding_count_{k}\t{n}") + cs = query_cache_stats(store.kb_dir) + click.echo(f"query_cache_entries\t{cs['entries']}") + click.echo(f"query_cache_hits\t{cs['hits']}") +``` + +- [ ] **Step 4: Run test, confirm passes** + +Run: `.venv/bin/pytest tests/embeddings/test_cli.py::test_embeddings_stats -v` +Expected: PASS. + +- [ ] **Step 5: Commit** + +```bash +git add src/vouch/cli.py tests/embeddings/test_cli.py +git commit -m "feat(embeddings): vouch embeddings stats command" +``` + +--- + +### Task 29: MCP + JSONL parity for new commands + +**Files:** +- Modify: `src/vouch/server.py` +- Modify: `src/vouch/jsonl_server.py` +- Modify: `tests/embeddings/test_search.py` + +- [ ] **Step 1: Add failing tests** + +Append to `tests/embeddings/test_search.py`: + +```python +def test_mcp_kb_reindex_embeddings(store: KBStore, monkeypatch: pytest.MonkeyPatch) -> None: + from vouch import server + monkeypatch.setattr(server, "_store", lambda: store) + src = store.put_source(b"e") + store.put_claim(Claim(id="c1", text="x", evidence=[src.id])) + out = server.kb_reindex_embeddings(backfill=True) + assert out["touched"] >= 1 + + +def test_mcp_kb_dedup_scan(store: KBStore, monkeypatch: pytest.MonkeyPatch) -> None: + from vouch import server + monkeypatch.setattr(server, "_store", lambda: store) + out = server.kb_dedup_scan(threshold=0.95, dry_run=True) + assert "duplicates" in out + + +def test_mcp_kb_embeddings_stats(store: KBStore, monkeypatch: pytest.MonkeyPatch) -> None: + from vouch import server + monkeypatch.setattr(server, "_store", lambda: store) + out = server.kb_embeddings_stats() + assert "model" in out + + +def test_jsonl_kb_reindex_embeddings(store: KBStore, monkeypatch: pytest.MonkeyPatch) -> None: + from vouch import jsonl_server + monkeypatch.setattr(jsonl_server, "_store", lambda: store) + src = store.put_source(b"e") + store.put_claim(Claim(id="c1", text="x", evidence=[src.id])) + resp = jsonl_server.handle_request({ + "id": "1", "method": "kb.reindex_embeddings", + "params": {"backfill": True}, + }) + assert resp["ok"] is True +``` + +- [ ] **Step 2: Run tests, confirm fail** + +Run: `.venv/bin/pytest tests/embeddings/test_search.py -v` +Expected: 4 new failures. + +- [ ] **Step 3: Add MCP tools to `server.py`** + +Append: + +```python +@mcp.tool() +def kb_reindex_embeddings( + *, backfill: bool = False, force: bool = False, model: str | None = None, +) -> dict[str, Any]: + """Re-encode every artifact under the current embedding adapter.""" + from .embeddings.migration import backfill_embeddings + store = _store() + if model: + from .embeddings import get_embedder + get_embedder(model) + n = backfill_embeddings(store, force=force) + return {"touched": n, "model": _current_model_name()} + + +@mcp.tool() +def kb_dedup_scan( + *, threshold: float = 0.95, dry_run: bool = False, +) -> dict[str, Any]: + """Find near-duplicate artifacts via embedding cosine.""" + from .embeddings.dedup import scan_all + store = _store() + rows = scan_all(store.kb_dir, threshold=threshold, dry_run=dry_run) + return {"duplicates": rows, "threshold": threshold} + + +@mcp.tool() +def kb_eval_embeddings(*, queries_path: str, k: int = 10) -> dict[str, Any]: + """Run retrieval eval over a JSONL queries file.""" + from pathlib import Path + from .embeddings.scorer import evaluate + store = _store() + return evaluate( + kb_dir=store.kb_dir, + queries_file=Path(queries_path), + k=k, + ) + + +@mcp.tool() +def kb_embeddings_stats() -> dict[str, Any]: + """Model identity, per-kind counts, query cache stats.""" + from . import index_db + from .embeddings.cache import query_cache_stats + store = _store() + meta = index_db.get_embedding_meta(store.kb_dir) + counts: dict[str, int] = {} + with index_db.open_db(store.kb_dir) as conn: + for k, n in conn.execute( + "SELECT kind, COUNT(*) FROM embedding_index GROUP BY kind" + ): + counts[k] = int(n) + return { + "model": meta.get("embedding_model"), + "model_version": meta.get("embedding_model_version"), + "dim": meta.get("embedding_dim"), + "counts": counts, + "query_cache": query_cache_stats(store.kb_dir), + } + + +def _current_model_name() -> str: + try: + from .embeddings import get_embedder + return get_embedder().name + except Exception: + return "" +``` + +- [ ] **Step 4: Add JSONL handlers** + +In `src/vouch/jsonl_server.py`, add four handler functions and register them in the dispatch table. Find the existing `_HANDLERS` registration (or the equivalent `if method == "...":` cascade) and append: + +```python +def _h_reindex_embeddings(p: dict) -> dict: + from .embeddings.migration import backfill_embeddings + n = backfill_embeddings(_store(), force=bool(p.get("force", False))) + return {"touched": n} + + +def _h_dedup_scan(p: dict) -> dict: + from .embeddings.dedup import scan_all + return { + "duplicates": scan_all( + _store().kb_dir, + threshold=float(p.get("threshold", 0.95)), + dry_run=bool(p.get("dry_run", False)), + ), + } + + +def _h_eval_embeddings(p: dict) -> dict: + from pathlib import Path + from .embeddings.scorer import evaluate + return evaluate( + kb_dir=_store().kb_dir, + queries_file=Path(p["queries_path"]), + k=int(p.get("k", 10)), + ) + + +def _h_embeddings_stats(_: dict) -> dict: + from . import index_db + from .embeddings.cache import query_cache_stats + store = _store() + meta = index_db.get_embedding_meta(store.kb_dir) + with index_db.open_db(store.kb_dir) as conn: + counts = { + k: int(n) for k, n in conn.execute( + "SELECT kind, COUNT(*) FROM embedding_index GROUP BY kind" + ) + } + return { + "model": meta.get("embedding_model"), + "counts": counts, + "query_cache": query_cache_stats(store.kb_dir), + } +``` + +Then register them in the JSONL dispatch table. If the dispatch uses `_HANDLERS[name] = fn`, add: + +```python +_HANDLERS["kb.reindex_embeddings"] = _h_reindex_embeddings +_HANDLERS["kb.dedup_scan"] = _h_dedup_scan +_HANDLERS["kb.eval_embeddings"] = _h_eval_embeddings +_HANDLERS["kb.embeddings_stats"] = _h_embeddings_stats +``` + +If the project uses a single dispatch function with `if method == "...":` branches, add equivalent branches calling the new handlers. + +- [ ] **Step 5: Run tests, confirm pass** + +Run: `.venv/bin/pytest tests/embeddings -v` +Expected: all green. + +- [ ] **Step 6: Commit** + +```bash +git add src/vouch/server.py src/vouch/jsonl_server.py tests/embeddings/test_search.py +git commit -m "feat(embeddings): MCP + JSONL parity for reindex/dedup/eval/stats" +``` + +--- + +### Task 30: Wire migration warning into `health.rebuild_index` + +**Files:** +- Modify: `src/vouch/health.py` +- Modify: `tests/embeddings/test_migration.py` + +- [ ] **Step 1: Write the failing test** + +Append to `tests/embeddings/test_migration.py`: + +```python +def test_rebuild_index_emits_mismatch_audit_event(store: KBStore) -> None: + from vouch import audit, health, index_db + src = store.put_source(b"e") + store.put_claim(Claim(id="c1", text="x", evidence=[src.id])) + index_db.set_embedding_meta( + store.kb_dir, model="some-other-model", version="v9", dim=8, + ) + health.rebuild_index(store) + log_path = store.kb_dir / "audit.log.jsonl" + text = log_path.read_text() if log_path.exists() else "" + assert "embedding.model_mismatch" in text +``` + +- [ ] **Step 2: Run test, confirm fails** + +Run: `.venv/bin/pytest tests/embeddings/test_migration.py::test_rebuild_index_emits_mismatch_audit_event -v` +Expected: fail. + +- [ ] **Step 3: Wire into `health.rebuild_index`** + +In `src/vouch/health.py`, locate `rebuild_index(store)`. After the existing FTS5 rebuild logic, append: + +```python + try: + from .embeddings.migration import detect_mismatch + from . import audit + m = detect_mismatch(store.kb_dir) + if m is not None: + audit.log_event( + store.kb_dir, event="embedding.model_mismatch", + actor="vouch-health", + object_ids=[], data=m, + ) + except ImportError: + pass +``` + +- [ ] **Step 4: Run test, confirm passes** + +Run: `.venv/bin/pytest tests/embeddings/test_migration.py::test_rebuild_index_emits_mismatch_audit_event -v` +Expected: PASS. + +- [ ] **Step 5: Commit** + +```bash +git add src/vouch/health.py tests/embeddings/test_migration.py +git commit -m "feat(embeddings): rebuild_index emits embedding.model_mismatch audit event" +``` + +--- + +## Final integration + +### Task 31: End-to-end lexical-disjoint regression + +**Files:** +- Modify: `tests/embeddings/test_integration.py` + +- [ ] **Step 1: Add the integration acceptance test** + +Append to `tests/embeddings/test_integration.py`: + +```python +@pytest.mark.integration +def test_semantic_search_finds_lexically_disjoint_claim(tmp_path: Path) -> None: + """The headline acceptance criterion from the spec.""" + from vouch import index_db + from vouch.models import Claim + from vouch.storage import KBStore + + store = KBStore.init(tmp_path) + src = store.put_source(b"e") + store.put_claim(Claim( + id="auth-claim", + text="login flow uses session cookies signed by the API", + evidence=[src.id], + )) + store.put_claim(Claim( + id="unrelated", + text="the sun is large and hot", + evidence=[src.id], + )) + hits = index_db.search_semantic( + store.kb_dir, "how do we authenticate users", limit=5, + ) + assert hits[0][1] == "auth-claim" +``` + +- [ ] **Step 2: Run the integration test** + +Run: `.venv/bin/pytest tests/embeddings/test_integration.py -m integration -v` +Expected: 4 passed (3 prior + this new one). + +- [ ] **Step 3: Run the full unit suite** + +Run: `.venv/bin/pytest --ignore=tests/test_sessions.py -q` +Expected: all green. + +- [ ] **Step 4: Run ruff and mypy** + +Run: `.venv/bin/python -m ruff check src tests && .venv/bin/python -m mypy src/vouch` +Expected: both clean (or fix any issues before committing). + +- [ ] **Step 5: Commit** + +```bash +git add tests/embeddings/test_integration.py +git commit -m "test(embeddings): end-to-end lexical-disjoint regression" +``` + +--- + +### Task 32: Documentation + +**Files:** +- Create: `docs/embeddings.md` +- Modify: `docs/retrieval.md` +- Modify: `docs/README.md` + +- [ ] **Step 1: Write `docs/embeddings.md`** + +Create `docs/embeddings.md`: + +```markdown +# Embedding-based search + +vouch's primary search backend is embedding-based semantic retrieval, +backed by `sentence-transformers/all-mpnet-base-v2` (768-dim) by default. +FTS5 remains as the deterministic fallback when embeddings are unavailable +or return no hits. + +## Install + +```bash +pip install vouch[embeddings] +``` + +Alternative (no torch): + +```bash +pip install vouch[embeddings-fast] +``` + +## Usage + +```bash +# default: semantic primary, FTS5 fallback +vouch search "how do we authenticate users" + +# force a specific backend +vouch search "auth" --backend embedding +vouch search "auth" --backend fts5 +vouch search "auth" --backend hybrid --rerank --hyde --explain + +# maintenance +vouch reindex --embeddings --backfill +vouch dedup --threshold 0.95 +vouch embeddings stats +vouch eval embedding --queries eval/queries.jsonl +``` + +See `docs/superpowers/specs/2026-05-20-semantic-search-design.md` +for the full architecture. +``` + +- [ ] **Step 2: Cross-link in `docs/retrieval.md`** + +Append at the bottom: + +```markdown + +## Semantic retrieval + +See [embeddings.md](./embeddings.md). +``` + +- [ ] **Step 3: Update `docs/README.md`** + +Add a line under the existing entries: + +```markdown +- [embeddings.md](./embeddings.md) -- semantic retrieval (primary backend) +``` + +- [ ] **Step 4: Commit** + +```bash +git add docs/embeddings.md docs/retrieval.md docs/README.md +git commit -m "docs(embeddings): user guide + index cross-link" +``` + +--- + +## Self-Review + +**1. Spec coverage check.** Every section of the spec maps to a task: + +| Spec section | Tasks | +|---|---| +| §2 Integration shape | T15, T16 | +| §3 Package layout | T2, T3, T4, T5, T6, T17, T18, T19, T20, T21, T22 | +| §4 Storage layout | T7, T8, T9, T10 | +| §5 Touched modules + LOC | All tasks cumulatively | +| §6 Default behavior table | T15, T16, T23, T24 | +| §7 Write path (skip on hash; dedup) | T11, T12, T13, T20 | +| §8 Migration | T22, T30 | +| §9 CLI surface | T24, T25, T26, T27, T28 | +| §10 MCP / JSONL parity | T29 | +| §11 Dependencies | T1 | +| §12 Default values | T7 (schema), T10 (cache cap), T20 (threshold) | +| §13 Test plan (9 files) | T3, T7, T8, T9, T10, T11, T17, T18, T19, T20, T21, T22, T24, T31 | +| §14 Acceptance criteria | T31 (headline), T1 + T24 + T25 (install + reindex idempotent) | + +**2. Placeholder scan.** No "TBD", "TODO", "implement later" left in the plan. + +**3. Type consistency.** `Hit = tuple[str, str, str, float]` used consistently across `index_db`, `fusion`, `rerank`, `scorer`. `Embedder.name / version / dim` match across `base.py`, `st_mpnet.py`, `st_minilm.py`, `fastembed_bge.py`. `_embed_and_store(kind, id, text)` signature matches every call site. + +**4. Pre-existing flaky tests.** The full test suite has pre-existing flakiness in `tests/test_sessions.py` (timestamp-collision IDs). Plan steps that say "run full suite" use `--ignore=tests/test_sessions.py` -- this is documented as a separate issue, not introduced by this work. + +--- + +## Plan complete + +Plan saved to `docs/superpowers/plans/2026-05-20-semantic-search.md`. Two execution options: + +**1. Subagent-Driven (recommended)** — I dispatch a fresh subagent per task, review between tasks, fast iteration. Uses `superpowers:subagent-driven-development`. + +**2. Inline Execution** — Execute tasks in this session using `superpowers:executing-plans`, batch execution with checkpoints. + +Which approach? From b3795e5ecce2f4317071e0ee0678e25496ffb72f Mon Sep 17 00:00:00 2001 From: dripsmvcp <138900956+dripsmvcp@users.noreply.github.com> Date: Wed, 20 May 2026 11:36:36 +0900 Subject: [PATCH 013/123] feat(embeddings): add optional-deps extras and pytest markers --- pyproject.toml | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 4ed93fd0..e2899582 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -33,6 +33,20 @@ dev = [ "mypy>=1.10", "types-pyyaml", ] +embeddings = [ + "sentence-transformers>=2.7,<4", + "numpy>=1.26,<3", + "sqlite-vec>=0.1,<1", +] +embeddings-fast = [ + "fastembed>=0.3,<1", + "onnxruntime>=1.18,<2", + "numpy>=1.26,<3", + "sqlite-vec>=0.1,<1", +] +rerank = [ + "sentence-transformers>=2.7,<4", +] [project.scripts] vouch = "vouch.cli:cli" @@ -57,4 +71,7 @@ select = ["E", "F", "I", "B", "UP", "SIM", "RUF"] [tool.pytest.ini_options] testpaths = ["tests"] -addopts = "-q" +addopts = "-q -m 'not integration'" +markers = [ + "integration: tests that load the real embedding model (slow, network on first run)", +] From 8659b751450f5e6f2c05260c737aa97f578fb5f3 Mon Sep 17 00:00:00 2001 From: dripsmvcp <138900956+dripsmvcp@users.noreply.github.com> Date: Wed, 20 May 2026 11:36:36 +0900 Subject: [PATCH 014/123] feat(embeddings): create package skeleton --- src/vouch/embeddings/__init__.py | 25 +++++++++++++++++++++++++ tests/embeddings/__init__.py | 1 + 2 files changed, 26 insertions(+) create mode 100644 src/vouch/embeddings/__init__.py create mode 100644 tests/embeddings/__init__.py diff --git a/src/vouch/embeddings/__init__.py b/src/vouch/embeddings/__init__.py new file mode 100644 index 00000000..9ab18ae9 --- /dev/null +++ b/src/vouch/embeddings/__init__.py @@ -0,0 +1,25 @@ +"""Embedding-based semantic retrieval for vouch. + +Pluggable model adapters via the `register` / `get_embedder` registry in +`base`. Default adapter is `st_mpnet` (sentence-transformers +all-mpnet-base-v2) when installed via `pip install vouch[embeddings]`. + +The base install of vouch has no hard dependency on this package -- the +modules are only imported when an embedding code path executes. +""" + +from .base import ( + DEFAULT_MODEL_NAME, + Embedder, + content_hash, + get_embedder, + register, +) + +__all__ = [ + "DEFAULT_MODEL_NAME", + "Embedder", + "content_hash", + "get_embedder", + "register", +] diff --git a/tests/embeddings/__init__.py b/tests/embeddings/__init__.py new file mode 100644 index 00000000..330b3de6 --- /dev/null +++ b/tests/embeddings/__init__.py @@ -0,0 +1 @@ +"""Tests for the vouch.embeddings package.""" From 5a00683fbf787bcc5e0396cf6f6634bbe0cf00d6 Mon Sep 17 00:00:00 2001 From: dripsmvcp <138900956+dripsmvcp@users.noreply.github.com> Date: Wed, 20 May 2026 11:36:36 +0900 Subject: [PATCH 015/123] feat(embeddings): Embedder ABC, registry, content_hash, MockEmbedder --- src/vouch/embeddings/base.py | 58 +++++++++++++++++++++++++++++++ tests/embeddings/_fakes.py | 47 +++++++++++++++++++++++++ tests/embeddings/test_core.py | 65 +++++++++++++++++++++++++++++++++++ 3 files changed, 170 insertions(+) create mode 100644 src/vouch/embeddings/base.py create mode 100644 tests/embeddings/_fakes.py create mode 100644 tests/embeddings/test_core.py diff --git a/src/vouch/embeddings/base.py b/src/vouch/embeddings/base.py new file mode 100644 index 00000000..c5af06ed --- /dev/null +++ b/src/vouch/embeddings/base.py @@ -0,0 +1,58 @@ +"""Embedder abstract base class + adapter registry. + +Adapters live in sibling modules (st_mpnet, st_minilm, fastembed_bge). +They register themselves at import time via `register(name, factory)`. + +The factory pattern (lambda over class instantiation) lets us defer +heavy imports (torch, onnxruntime) until the adapter is actually used. +""" + +from __future__ import annotations + +import hashlib +from abc import ABC, abstractmethod +from collections.abc import Callable, Sequence +from typing import ClassVar + +import numpy as np + +DEFAULT_MODEL_NAME = "sentence-transformers/all-mpnet-base-v2" + + +class Embedder(ABC): + """Abstract embedding model adapter.""" + + name: ClassVar[str] = "" + version: ClassVar[str] = "" + dim: ClassVar[int] = 0 + + @abstractmethod + def encode(self, text: str) -> np.ndarray: + """Return a unit-normalized embedding for `text`, shape (dim,) float32.""" + + def encode_batch(self, texts: Sequence[str]) -> np.ndarray: + """Default batched encode -- subclasses override for true batching.""" + if not texts: + return np.zeros((0, self.dim), dtype=np.float32) + return np.stack([self.encode(t) for t in texts]) + + +def content_hash(text: str) -> str: + """Stable sha256 hex of the embedded text. Used as the skip-if-unchanged key.""" + return hashlib.sha256(text.encode("utf-8")).hexdigest() + + +_REGISTRY: dict[str, Callable[[], Embedder]] = {} + + +def register(name: str, factory: Callable[[], Embedder]) -> None: + """Register an Embedder factory under `name`. Idempotent.""" + _REGISTRY[name] = factory + + +def get_embedder(name: str | None = None) -> Embedder: + """Resolve an Embedder by adapter name. None -> DEFAULT_MODEL_NAME.""" + key = name or DEFAULT_MODEL_NAME + if key not in _REGISTRY: + raise KeyError(f"unknown embedder: {key}. Registered: {sorted(_REGISTRY)}") + return _REGISTRY[key]() diff --git a/tests/embeddings/_fakes.py b/tests/embeddings/_fakes.py new file mode 100644 index 00000000..96b5f01d --- /dev/null +++ b/tests/embeddings/_fakes.py @@ -0,0 +1,47 @@ +"""Test doubles for the embeddings layer. + +MockEmbedder returns deterministic float32 vectors derived from sha256 +of the input. No network, no model, runs in microseconds. +""" + +from __future__ import annotations + +import hashlib +import struct +from collections.abc import Sequence + +import numpy as np + +from vouch.embeddings.base import Embedder + + +class MockEmbedder(Embedder): + """Deterministic embedder for tests.""" + + name = "mock" + version = "1" + + def __init__(self, dim: int = 8) -> None: + self.dim = dim + + def encode(self, text: str) -> np.ndarray: + out = np.zeros(self.dim, dtype=np.float32) + i = 0 + seed = text.encode("utf-8") + while i < self.dim: + h = hashlib.sha256(seed).digest() + for j in range(0, len(h) - 3, 4): + if i >= self.dim: + break + out[i] = struct.unpack(" 0: + out /= norm + return out + + def encode_batch(self, texts: Sequence[str]) -> np.ndarray: + if not texts: + return np.zeros((0, self.dim), dtype=np.float32) + return np.stack([self.encode(t) for t in texts]) diff --git a/tests/embeddings/test_core.py b/tests/embeddings/test_core.py new file mode 100644 index 00000000..ce09fb08 --- /dev/null +++ b/tests/embeddings/test_core.py @@ -0,0 +1,65 @@ +"""Core embedder ABC + registry + content hashing.""" + +from __future__ import annotations + +import numpy as np +import pytest + +from tests.embeddings._fakes import MockEmbedder +from vouch.embeddings import ( + Embedder, + content_hash, + get_embedder, + register, +) + + +def test_content_hash_is_stable() -> None: + h1 = content_hash("hello world") + h2 = content_hash("hello world") + assert h1 == h2 + assert len(h1) == 64 # sha256 hex + + +def test_content_hash_differs_on_text_change() -> None: + assert content_hash("a") != content_hash("b") + + +def test_embedder_abc_requires_encode() -> None: + class Incomplete(Embedder): + name = "incomplete" + version = "0" + dim = 1 + with pytest.raises(TypeError): + Incomplete() # type: ignore[abstract] + + +def test_mock_embedder_returns_correct_shape() -> None: + e = MockEmbedder(dim=8) + vec = e.encode("hello") + assert isinstance(vec, np.ndarray) + assert vec.shape == (8,) + assert vec.dtype == np.float32 + + +def test_mock_embedder_batched_encode() -> None: + e = MockEmbedder(dim=8) + mat = e.encode_batch(["a", "b", "c"]) + assert mat.shape == (3, 8) + + +def test_mock_embedder_is_deterministic() -> None: + e = MockEmbedder(dim=16) + assert np.array_equal(e.encode("same"), e.encode("same")) + + +def test_registry_round_trip() -> None: + register("test-adapter", lambda: MockEmbedder(dim=4)) + e = get_embedder("test-adapter") + assert e.dim == 4 + assert e.name == "mock" + + +def test_registry_unknown_name() -> None: + with pytest.raises(KeyError, match="unknown embedder"): + get_embedder("does-not-exist") From 3536e0fec182a1f2e4eb31b020554d5d92054ec8 Mon Sep 17 00:00:00 2001 From: dripsmvcp <138900956+dripsmvcp@users.noreply.github.com> Date: Wed, 20 May 2026 11:36:36 +0900 Subject: [PATCH 016/123] feat(embeddings): sentence-transformers all-mpnet-base-v2 default adapter --- src/vouch/embeddings/__init__.py | 6 ++++ src/vouch/embeddings/st_mpnet.py | 48 ++++++++++++++++++++++++++++ tests/embeddings/test_integration.py | 34 ++++++++++++++++++++ 3 files changed, 88 insertions(+) create mode 100644 src/vouch/embeddings/st_mpnet.py create mode 100644 tests/embeddings/test_integration.py diff --git a/src/vouch/embeddings/__init__.py b/src/vouch/embeddings/__init__.py index 9ab18ae9..86521417 100644 --- a/src/vouch/embeddings/__init__.py +++ b/src/vouch/embeddings/__init__.py @@ -16,6 +16,12 @@ register, ) +# Auto-register the default adapter if sentence-transformers is installed. +try: + from . import st_mpnet # noqa: F401 +except ImportError: + pass + __all__ = [ "DEFAULT_MODEL_NAME", "Embedder", diff --git a/src/vouch/embeddings/st_mpnet.py b/src/vouch/embeddings/st_mpnet.py new file mode 100644 index 00000000..925231de --- /dev/null +++ b/src/vouch/embeddings/st_mpnet.py @@ -0,0 +1,48 @@ +"""sentence-transformers/all-mpnet-base-v2 adapter. + +768-dim, English, good quality at its tier. Default model for vouch. +Lazy-loaded: the import of sentence_transformers is deferred to __init__. +""" + +from __future__ import annotations + +from collections.abc import Sequence +from typing import Any + +import numpy as np + +from .base import DEFAULT_MODEL_NAME, Embedder, register + + +class STMpnetEmbedder(Embedder): + name = DEFAULT_MODEL_NAME + version = "v1" + dim = 768 + + def __init__(self, device: str | None = None) -> None: + from sentence_transformers import SentenceTransformer # type: ignore[import-not-found] + self._model: Any = SentenceTransformer( + self.name, device=device or "cpu", + ) + + def encode(self, text: str) -> np.ndarray: + vec = self._model.encode( + text, + convert_to_numpy=True, + normalize_embeddings=True, + ) + return np.asarray(vec, dtype=np.float32) + + def encode_batch(self, texts: Sequence[str]) -> np.ndarray: + if not texts: + return np.zeros((0, self.dim), dtype=np.float32) + mat = self._model.encode( + list(texts), + convert_to_numpy=True, + normalize_embeddings=True, + batch_size=32, + ) + return np.asarray(mat, dtype=np.float32) + + +register(DEFAULT_MODEL_NAME, STMpnetEmbedder) diff --git a/tests/embeddings/test_integration.py b/tests/embeddings/test_integration.py new file mode 100644 index 00000000..d7e9a8ba --- /dev/null +++ b/tests/embeddings/test_integration.py @@ -0,0 +1,34 @@ +"""End-to-end tests that load the REAL embedding model. + +Marked @pytest.mark.integration -- excluded from the default test run. +Run with: pytest -m integration +""" + +from __future__ import annotations + +import numpy as np +import pytest + + +@pytest.mark.integration +def test_st_mpnet_loads_and_encodes() -> None: + from vouch.embeddings.st_mpnet import STMpnetEmbedder + e = STMpnetEmbedder() + vec = e.encode("hello world") + assert isinstance(vec, np.ndarray) + assert vec.shape == (768,) + assert vec.dtype == np.float32 + assert abs(float(np.linalg.norm(vec)) - 1.0) < 1e-3 + + +@pytest.mark.integration +def test_st_mpnet_semantic_disjoint() -> None: + """Semantic similarity > lexical-only baseline.""" + from vouch.embeddings.st_mpnet import STMpnetEmbedder + e = STMpnetEmbedder() + q = e.encode("how do users authenticate") + a = e.encode("login flow uses session cookies signed by the API") + b = e.encode("the sun is large") + sim_a = float(q @ a) + sim_b = float(q @ b) + assert sim_a > sim_b From 9fb6f0c7e1fbe5c582a58ef446cdf324eb444712 Mon Sep 17 00:00:00 2001 From: dripsmvcp <138900956+dripsmvcp@users.noreply.github.com> Date: Wed, 20 May 2026 11:38:44 +0900 Subject: [PATCH 017/123] feat(embeddings): sentence-transformers MiniLM-L6 alternative adapter --- src/vouch/embeddings/__init__.py | 5 ++++ src/vouch/embeddings/st_minilm.py | 41 ++++++++++++++++++++++++++++ tests/embeddings/test_integration.py | 9 ++++++ 3 files changed, 55 insertions(+) create mode 100644 src/vouch/embeddings/st_minilm.py diff --git a/src/vouch/embeddings/__init__.py b/src/vouch/embeddings/__init__.py index 86521417..63920898 100644 --- a/src/vouch/embeddings/__init__.py +++ b/src/vouch/embeddings/__init__.py @@ -22,6 +22,11 @@ except ImportError: pass +try: + from . import st_minilm # noqa: F401 +except ImportError: + pass + __all__ = [ "DEFAULT_MODEL_NAME", "Embedder", diff --git a/src/vouch/embeddings/st_minilm.py b/src/vouch/embeddings/st_minilm.py new file mode 100644 index 00000000..f3b45f2f --- /dev/null +++ b/src/vouch/embeddings/st_minilm.py @@ -0,0 +1,41 @@ +"""sentence-transformers/all-MiniLM-L6-v2 adapter. + +384-dim, smaller and faster than mpnet-base, slightly lower quality. +""" + +from __future__ import annotations + +from collections.abc import Sequence +from typing import Any + +import numpy as np + +from .base import Embedder, register + +MODEL_NAME = "sentence-transformers/all-MiniLM-L6-v2" + + +class STMinilmEmbedder(Embedder): + name = MODEL_NAME + version = "v1" + dim = 384 + + def __init__(self, device: str | None = None) -> None: + from sentence_transformers import SentenceTransformer # type: ignore[import-not-found] + self._model: Any = SentenceTransformer(self.name, device=device or "cpu") + + def encode(self, text: str) -> np.ndarray: + vec = self._model.encode(text, convert_to_numpy=True, normalize_embeddings=True) + return np.asarray(vec, dtype=np.float32) + + def encode_batch(self, texts: Sequence[str]) -> np.ndarray: + if not texts: + return np.zeros((0, self.dim), dtype=np.float32) + mat = self._model.encode( + list(texts), convert_to_numpy=True, + normalize_embeddings=True, batch_size=64, + ) + return np.asarray(mat, dtype=np.float32) + + +register(MODEL_NAME, STMinilmEmbedder) diff --git a/tests/embeddings/test_integration.py b/tests/embeddings/test_integration.py index d7e9a8ba..e1383476 100644 --- a/tests/embeddings/test_integration.py +++ b/tests/embeddings/test_integration.py @@ -32,3 +32,12 @@ def test_st_mpnet_semantic_disjoint() -> None: sim_a = float(q @ a) sim_b = float(q @ b) assert sim_a > sim_b + + +@pytest.mark.integration +def test_st_minilm_loads_and_encodes() -> None: + from vouch.embeddings.st_minilm import STMinilmEmbedder + e = STMinilmEmbedder() + vec = e.encode("hello world") + assert vec.shape == (384,) + assert vec.dtype == np.float32 From 84ab0ac31911e8d523a39e9b44b0071146b4ff6c Mon Sep 17 00:00:00 2001 From: dripsmvcp <138900956+dripsmvcp@users.noreply.github.com> Date: Wed, 20 May 2026 12:44:02 +0900 Subject: [PATCH 018/123] feat(embeddings): fastembed BGE alternative (no-torch) adapter --- src/vouch/embeddings/__init__.py | 5 +++ src/vouch/embeddings/fastembed_bge.py | 45 +++++++++++++++++++++++++++ tests/embeddings/test_integration.py | 10 ++++++ 3 files changed, 60 insertions(+) create mode 100644 src/vouch/embeddings/fastembed_bge.py diff --git a/src/vouch/embeddings/__init__.py b/src/vouch/embeddings/__init__.py index 63920898..f6631955 100644 --- a/src/vouch/embeddings/__init__.py +++ b/src/vouch/embeddings/__init__.py @@ -27,6 +27,11 @@ except ImportError: pass +try: + from . import fastembed_bge # noqa: F401 +except ImportError: + pass + __all__ = [ "DEFAULT_MODEL_NAME", "Embedder", diff --git a/src/vouch/embeddings/fastembed_bge.py b/src/vouch/embeddings/fastembed_bge.py new file mode 100644 index 00000000..f2563b2d --- /dev/null +++ b/src/vouch/embeddings/fastembed_bge.py @@ -0,0 +1,45 @@ +"""fastembed BAAI/bge-small-en-v1.5 adapter (no-torch path). + +384-dim, ONNX-backed. Install via `pip install vouch[embeddings-fast]`. +""" + +from __future__ import annotations + +from collections.abc import Sequence +from typing import Any + +import numpy as np + +from .base import Embedder, register + +MODEL_NAME = "fastembed/bge-small-en-v1.5" + + +class FastembedBgeEmbedder(Embedder): + name = MODEL_NAME + version = "v1" + dim = 384 + + def __init__(self) -> None: + from fastembed import TextEmbedding # type: ignore[import-not-found] + self._model: Any = TextEmbedding(model_name="BAAI/bge-small-en-v1.5") + + def encode(self, text: str) -> np.ndarray: + vec = next(iter(self._model.embed([text]))) + arr = np.asarray(vec, dtype=np.float32) + norm = float(np.linalg.norm(arr)) + if norm > 0: + arr /= norm + return arr + + def encode_batch(self, texts: Sequence[str]) -> np.ndarray: + if not texts: + return np.zeros((0, self.dim), dtype=np.float32) + mat = np.stack([np.asarray(v, dtype=np.float32) + for v in self._model.embed(list(texts))]) + norms = np.linalg.norm(mat, axis=1, keepdims=True) + norms[norms == 0] = 1.0 + return (mat / norms).astype(np.float32) + + +register(MODEL_NAME, FastembedBgeEmbedder) diff --git a/tests/embeddings/test_integration.py b/tests/embeddings/test_integration.py index e1383476..77429236 100644 --- a/tests/embeddings/test_integration.py +++ b/tests/embeddings/test_integration.py @@ -41,3 +41,13 @@ def test_st_minilm_loads_and_encodes() -> None: vec = e.encode("hello world") assert vec.shape == (384,) assert vec.dtype == np.float32 + + +@pytest.mark.integration +def test_fastembed_bge_loads_and_encodes() -> None: + pytest.importorskip("fastembed") + from vouch.embeddings.fastembed_bge import FastembedBgeEmbedder + e = FastembedBgeEmbedder() + vec = e.encode("hello world") + assert vec.shape == (384,) + assert vec.dtype == np.float32 From 02ed5d1a9f9465e9d0b80c3523a3b354fd04cb78 Mon Sep 17 00:00:00 2001 From: dripsmvcp <138900956+dripsmvcp@users.noreply.github.com> Date: Wed, 20 May 2026 14:25:53 +0900 Subject: [PATCH 019/123] fix(ci): satisfy ruff SIM105 + add mypy overrides for optional deps CI ran ruff which flagged SIM105 on the three try/except ImportError guard blocks in src/vouch/embeddings/__init__.py. Replace each with `contextlib.suppress(ImportError)` -- same semantics, satisfies ruff. Also add mypy overrides for numpy / sqlite_vec / sentence_transformers / fastembed so the type check passes in the base [dev] CI install where those optional extras aren't present. The embedding code paths that import these libraries are only reached when the extras are installed at runtime; for the static type check the missing stubs are noise. --- pyproject.toml | 22 ++++++++++++++++++++++ src/vouch/embeddings/__init__.py | 16 +++++++--------- 2 files changed, 29 insertions(+), 9 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index e2899582..5f39c75b 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -75,3 +75,25 @@ addopts = "-q -m 'not integration'" markers = [ "integration: tests that load the real embedding model (slow, network on first run)", ] + +# numpy is an optional runtime dependency (pulled in by the [embeddings] or +# [embeddings-fast] extras); the base CI install only has [dev], so mypy can't +# resolve `import numpy as np` in the embedding-stack modules. Silence the +# missing-stub errors -- the embeddings code paths are only reached when the +# extras are installed, and the test suite for those paths runs in a separate +# job with the extras present. +[[tool.mypy.overrides]] +module = ["numpy", "numpy.*"] +ignore_missing_imports = true + +[[tool.mypy.overrides]] +module = ["sqlite_vec", "sqlite_vec.*"] +ignore_missing_imports = true + +[[tool.mypy.overrides]] +module = ["sentence_transformers", "sentence_transformers.*"] +ignore_missing_imports = true + +[[tool.mypy.overrides]] +module = ["fastembed", "fastembed.*"] +ignore_missing_imports = true diff --git a/src/vouch/embeddings/__init__.py b/src/vouch/embeddings/__init__.py index f6631955..62b58fcb 100644 --- a/src/vouch/embeddings/__init__.py +++ b/src/vouch/embeddings/__init__.py @@ -8,6 +8,8 @@ modules are only imported when an embedding code path executes. """ +import contextlib + from .base import ( DEFAULT_MODEL_NAME, Embedder, @@ -17,20 +19,16 @@ ) # Auto-register the default adapter if sentence-transformers is installed. -try: +# Each adapter import is best-effort -- failure means that adapter's optional +# dependency isn't installed, which is fine (a different adapter may be). +with contextlib.suppress(ImportError): from . import st_mpnet # noqa: F401 -except ImportError: - pass -try: +with contextlib.suppress(ImportError): from . import st_minilm # noqa: F401 -except ImportError: - pass -try: +with contextlib.suppress(ImportError): from . import fastembed_bge # noqa: F401 -except ImportError: - pass __all__ = [ "DEFAULT_MODEL_NAME", From dbe52cebc9214962c1eacbe205784b025ec12b56 Mon Sep 17 00:00:00 2001 From: dripsmvcp <138900956+dripsmvcp@users.noreply.github.com> Date: Wed, 20 May 2026 22:03:28 +0900 Subject: [PATCH 020/123] fix(ci): skip embeddings test suite when numpy isn't installed CI runs `pip install -e '.[dev]'` which deliberately excludes the optional `[embeddings]` extras. tests/embeddings/test_*.py modules import numpy at top level, so pytest collection fails with ModuleNotFoundError before any test can be deselected. Add tests/embeddings/conftest.py with `pytest.importorskip("numpy")` so the entire embeddings test directory skips gracefully when numpy is absent. Once `pip install vouch[embeddings]` (or numpy itself) is present, the skip is a no-op and the tests run normally. --- tests/embeddings/conftest.py | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 tests/embeddings/conftest.py diff --git a/tests/embeddings/conftest.py b/tests/embeddings/conftest.py new file mode 100644 index 00000000..3d9fec49 --- /dev/null +++ b/tests/embeddings/conftest.py @@ -0,0 +1,17 @@ +"""Conftest for the vouch.embeddings test suite. + +The embedding test modules import numpy at module-import time (via test +fixtures and the MockEmbedder test double). When CI runs the base +`pip install -e '.[dev]'` without the optional `[embeddings]` extras, +numpy isn't installed and collection of every test file in this +directory fails with ModuleNotFoundError. + +`pytest.importorskip("numpy")` at conftest scope tells pytest to skip +the entire directory if numpy isn't importable, which lets the rest of +the suite run cleanly. Once the embeddings extras (or numpy explicitly) +are installed, the skip is a no-op and the tests run normally. +""" + +import pytest + +pytest.importorskip("numpy") From 2e3ef76d0a3ab87282ea51467d8f096fad924b2c Mon Sep 17 00:00:00 2001 From: dripsmvcp <138900956+dripsmvcp@users.noreply.github.com> Date: Wed, 20 May 2026 22:10:32 +0900 Subject: [PATCH 021/123] fix(bundle): skip Pydantic validation for opaque source content files `_validate_content` in bundle.py uses the path's first directory component to look up a Pydantic validator. For sources, both `sources//meta.yaml` (the Source model) and `sources//content` (raw opaque bytes) hit the same "sources" key, so the validator was being run on the raw content bytes and failing with "1 validation error for Source". Add an early return for any non-meta.yaml path under `sources/` so opaque content bytes are not Pydantic-validated. Only the Source metadata file is checked, which matches the original intent of the PR #13 validation. Unblocks three pre-existing test_bundle.py failures inherited from upstream main. --- src/vouch/bundle.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/vouch/bundle.py b/src/vouch/bundle.py index 81ea53db..8573c42f 100644 --- a/src/vouch/bundle.py +++ b/src/vouch/bundle.py @@ -210,6 +210,13 @@ class ImportCheckResult: def _validate_content(path: str, data: bytes, issues: list[str]) -> None: subdir = path.split("/")[0] + # Source artifacts have two file kinds: + # sources//meta.yaml -- the Source pydantic model (validate) + # sources//content -- the raw source bytes (skip validation) + # The opaque content file isn't a pydantic model, so model_validate + # on raw bytes raises spuriously. + if subdir == "sources" and not path.endswith("/meta.yaml"): + return validator = VALIDATORS.get(subdir) if validator is None: return From 7a7951f3bff50d6caa2af0e029114f8a6bc5ffce Mon Sep 17 00:00:00 2001 From: dripsmvcp <138900956+dripsmvcp@users.noreply.github.com> Date: Wed, 20 May 2026 22:14:42 +0900 Subject: [PATCH 022/123] fix(embeddings): MockEmbedder uses uint32 scaling to avoid NaN/Inf Per CodeRabbit on PR #37: decoding sha256 chunks as raw float32 (via struct.unpack(" None: self.dim = dim def encode(self, text: str) -> np.ndarray: - out = np.zeros(self.dim, dtype=np.float32) + # Decode sha256 chunks as unsigned 32-bit integers and scale into + # [-1.0, 1.0]. Interpreting the same bytes as IEEE754 floats produced + # NaN / Inf for ~1 in 2^7 chunks, which made unit normalization + # unreliable and broke cosine-similarity tests downstream. + # Use float64 internally so the norm stays exact, then return float32. + out = np.zeros(self.dim, dtype=np.float64) i = 0 seed = text.encode("utf-8") while i < self.dim: @@ -33,13 +37,14 @@ def encode(self, text: str) -> np.ndarray: for j in range(0, len(h) - 3, 4): if i >= self.dim: break - out[i] = struct.unpack(" 0: out /= norm - return out + return out.astype(np.float32) def encode_batch(self, texts: Sequence[str]) -> np.ndarray: if not texts: From 2abce161ea73d1103cedd60af039720931507b2c Mon Sep 17 00:00:00 2001 From: dripsmvcp <138900956+dripsmvcp@users.noreply.github.com> Date: Wed, 20 May 2026 13:34:07 +0900 Subject: [PATCH 023/123] feat(embeddings): state.db schema for embedding storage + put/get helpers --- src/vouch/index_db.py | 118 ++++++++++++++++++++++++++----- tests/embeddings/test_storage.py | 79 +++++++++++++++++++++ 2 files changed, 180 insertions(+), 17 deletions(-) create mode 100644 tests/embeddings/test_storage.py diff --git a/src/vouch/index_db.py b/src/vouch/index_db.py index 62b0bbe4..75f04ad5 100644 --- a/src/vouch/index_db.py +++ b/src/vouch/index_db.py @@ -21,32 +21,48 @@ SCHEMA = """ CREATE VIRTUAL TABLE IF NOT EXISTS claims_fts USING fts5( - id UNINDEXED, - text, - type UNINDEXED, - status UNINDEXED, - tags + id UNINDEXED, text, type UNINDEXED, status UNINDEXED, tags ); CREATE VIRTUAL TABLE IF NOT EXISTS pages_fts USING fts5( - id UNINDEXED, - title, - body, - type UNINDEXED, - tags + id UNINDEXED, title, body, type UNINDEXED, tags ); CREATE VIRTUAL TABLE IF NOT EXISTS entities_fts USING fts5( - id UNINDEXED, - name, - description, - type UNINDEXED, - aliases + id UNINDEXED, name, description, type UNINDEXED, aliases ); CREATE TABLE IF NOT EXISTS index_meta ( - key TEXT PRIMARY KEY, - value TEXT NOT NULL + key TEXT PRIMARY KEY, value TEXT NOT NULL +); + +CREATE TABLE IF NOT EXISTS embedding_index ( + kind TEXT NOT NULL, + id TEXT NOT NULL, + vec BLOB NOT NULL, + content_hash TEXT NOT NULL, + model TEXT NOT NULL, + model_version TEXT NOT NULL, + dim INTEGER NOT NULL, + created_at TEXT NOT NULL, + PRIMARY KEY (kind, id) +); + +CREATE INDEX IF NOT EXISTS embedding_index_kind ON embedding_index(kind); + +CREATE TABLE IF NOT EXISTS query_embedding_cache ( + query_hash TEXT PRIMARY KEY, + vec BLOB NOT NULL, + hit_count INTEGER NOT NULL DEFAULT 1, + last_used_at TEXT NOT NULL +); + +CREATE TABLE IF NOT EXISTS embedding_dupes ( + kind TEXT NOT NULL, + id TEXT NOT NULL, + near_id TEXT NOT NULL, + cosine REAL NOT NULL, + detected_at TEXT NOT NULL ); """ @@ -160,3 +176,71 @@ def stats(kb_dir: Path) -> dict[str, int]: "pages": conn.execute("SELECT COUNT(*) FROM pages_fts").fetchone()[0], "entities": conn.execute("SELECT COUNT(*) FROM entities_fts").fetchone()[0], } + + +# --- embeddings storage -------------------------------------------------- + +import datetime as _dt + + +def _vec_to_blob(vec): # type: ignore[no-untyped-def] + import numpy as np + return np.asarray(vec, dtype=np.float32).tobytes() + + +def _blob_to_vec(blob: bytes, dim: int): # type: ignore[no-untyped-def] + import numpy as np + return np.frombuffer(blob, dtype=np.float32, count=dim).copy() + + +def put_embedding( + conn: sqlite3.Connection, *, + kind: str, id: str, + vec, # type: ignore[no-untyped-def] + content_hash: str, + model: str, model_version: str, dim: int, +) -> None: + conn.execute( + "INSERT OR REPLACE INTO embedding_index " + "(kind, id, vec, content_hash, model, model_version, dim, created_at) " + "VALUES (?, ?, ?, ?, ?, ?, ?, ?)", + ( + kind, id, _vec_to_blob(vec), content_hash, + model, model_version, dim, + _dt.datetime.now(_dt.UTC).isoformat(timespec="seconds"), + ), + ) + + +def get_embedding(kb_dir: Path, *, kind: str, id: str): # type: ignore[no-untyped-def] + """Return (vec, content_hash, model) or None.""" + with open_db(kb_dir) as conn: + row = conn.execute( + "SELECT vec, content_hash, model, dim FROM embedding_index " + "WHERE kind = ? AND id = ?", + (kind, id), + ).fetchone() + if not row: + return None + blob, ch, model, dim = row + return _blob_to_vec(blob, dim), ch, model + + +def set_embedding_meta(kb_dir: Path, *, model: str, version: str, dim: int) -> None: + with open_db(kb_dir) as conn: + conn.executemany( + "INSERT OR REPLACE INTO index_meta (key, value) VALUES (?, ?)", + [ + ("embedding_model", model), + ("embedding_model_version", version), + ("embedding_dim", str(dim)), + ], + ) + + +def get_embedding_meta(kb_dir: Path) -> dict[str, str]: + with open_db(kb_dir) as conn: + rows = conn.execute( + "SELECT key, value FROM index_meta WHERE key LIKE 'embedding_%'" + ).fetchall() + return {k: v for k, v in rows} diff --git a/tests/embeddings/test_storage.py b/tests/embeddings/test_storage.py new file mode 100644 index 00000000..2fc01a88 --- /dev/null +++ b/tests/embeddings/test_storage.py @@ -0,0 +1,79 @@ +"""Embedding storage layer -- schema, put, get, search.""" + +from __future__ import annotations + +from pathlib import Path + +import numpy as np +import pytest + +from vouch import index_db +from vouch.embeddings.base import content_hash +from vouch.storage import KBStore + + +@pytest.fixture +def kb_dir(tmp_path: Path) -> Path: + store = KBStore.init(tmp_path) + return store.kb_dir + + +def test_embedding_schema_creates_tables(kb_dir: Path) -> None: + with index_db.open_db(kb_dir) as conn: + tables = {r[0] for r in conn.execute( + "SELECT name FROM sqlite_master WHERE type IN ('table','virtual table')" + )} + assert "embedding_index" in tables + assert "query_embedding_cache" in tables + assert "embedding_dupes" in tables + + +def test_embedding_meta_default_values(kb_dir: Path) -> None: + meta = index_db.get_embedding_meta(kb_dir) + assert meta.get("embedding_model") in (None, "") + + +def test_put_and_get_embedding(kb_dir: Path) -> None: + vec = np.zeros(8, dtype=np.float32) + vec[0] = 1.0 + h = content_hash("hello") + with index_db.open_db(kb_dir) as conn: + index_db.put_embedding( + conn, kind="claim", id="c1", vec=vec, + content_hash=h, model="mock", model_version="1", dim=8, + ) + got = index_db.get_embedding(kb_dir, kind="claim", id="c1") + assert got is not None + rec_vec, rec_hash, rec_model = got + assert np.allclose(rec_vec, vec) + assert rec_hash == h + assert rec_model == "mock" + + +def test_put_embedding_idempotent_on_same_hash(kb_dir: Path) -> None: + vec = np.ones(4, dtype=np.float32) + h = content_hash("same") + with index_db.open_db(kb_dir) as conn: + index_db.put_embedding( + conn, kind="claim", id="c1", vec=vec, content_hash=h, + model="mock", model_version="1", dim=4, + ) + index_db.put_embedding( + conn, kind="claim", id="c1", vec=vec, content_hash=h, + model="mock", model_version="1", dim=4, + ) + with index_db.open_db(kb_dir) as conn: + n = conn.execute("SELECT COUNT(*) FROM embedding_index WHERE id='c1'").fetchone()[0] + assert n == 1 + + +def test_set_embedding_meta_round_trip(kb_dir: Path) -> None: + index_db.set_embedding_meta( + kb_dir, + model="sentence-transformers/all-mpnet-base-v2", + version="v1", + dim=768, + ) + meta = index_db.get_embedding_meta(kb_dir) + assert meta["embedding_model"] == "sentence-transformers/all-mpnet-base-v2" + assert meta["embedding_dim"] == "768" From d36b2e8b6faeb935c79f113163e8db4bee6ec293 Mon Sep 17 00:00:00 2001 From: dripsmvcp <138900956+dripsmvcp@users.noreply.github.com> Date: Wed, 20 May 2026 13:34:42 +0900 Subject: [PATCH 024/123] feat(embeddings): NumPy brute-force cosine search over embedding_index --- src/vouch/index_db.py | 33 +++++++++++++++++++++++++ tests/embeddings/test_storage.py | 42 ++++++++++++++++++++++++++++++++ 2 files changed, 75 insertions(+) diff --git a/src/vouch/index_db.py b/src/vouch/index_db.py index 75f04ad5..5ddf8a12 100644 --- a/src/vouch/index_db.py +++ b/src/vouch/index_db.py @@ -244,3 +244,36 @@ def get_embedding_meta(kb_dir: Path) -> dict[str, str]: "SELECT key, value FROM index_meta WHERE key LIKE 'embedding_%'" ).fetchall() return {k: v for k, v in rows} + + +def search_embedding( + kb_dir: Path, + *, + query_vec, # type: ignore[no-untyped-def] + kinds: tuple[str, ...] = ( + "claim", "page", "source", "entity", "relation", "evidence", + ), + limit: int = 10, + min_score: float = 0.0, +) -> list[tuple[str, str, str, float]]: + """NumPy brute-force cosine search. Returns (kind, id, snippet, score).""" + import numpy as np + q = np.asarray(query_vec, dtype=np.float32) + qnorm = float(np.linalg.norm(q)) + if qnorm > 0: + q = q / qnorm + placeholders = ",".join("?" for _ in kinds) + with open_db(kb_dir) as conn: + rows = conn.execute( + f"SELECT kind, id, vec, dim FROM embedding_index " + f"WHERE kind IN ({placeholders})", + kinds, + ).fetchall() + scored: list[tuple[str, str, str, float]] = [] + for kind, id_, blob, dim in rows: + vec = _blob_to_vec(blob, dim) + score = float(q @ vec) + if score >= min_score: + scored.append((kind, id_, "", score)) + scored.sort(key=lambda r: r[3], reverse=True) + return scored[:limit] diff --git a/tests/embeddings/test_storage.py b/tests/embeddings/test_storage.py index 2fc01a88..9ea8ce1d 100644 --- a/tests/embeddings/test_storage.py +++ b/tests/embeddings/test_storage.py @@ -77,3 +77,45 @@ def test_set_embedding_meta_round_trip(kb_dir: Path) -> None: meta = index_db.get_embedding_meta(kb_dir) assert meta["embedding_model"] == "sentence-transformers/all-mpnet-base-v2" assert meta["embedding_dim"] == "768" + + +def test_search_embedding_returns_topk(kb_dir: Path) -> None: + from vouch.embeddings.base import content_hash as ch + + query = np.zeros(8, dtype=np.float32); query[0] = 1.0 + near = np.zeros(8, dtype=np.float32); near[0] = 0.99; near[1] = 0.05 + far = np.zeros(8, dtype=np.float32); far[7] = 1.0 + near /= float(np.linalg.norm(near)) + with index_db.open_db(kb_dir) as conn: + for cid, vec in [("c-near", near), ("c-far", far)]: + index_db.put_embedding( + conn, kind="claim", id=cid, vec=vec, + content_hash=ch(cid), model="mock", model_version="1", dim=8, + ) + hits = index_db.search_embedding( + kb_dir, query_vec=query, kinds=("claim",), limit=2, + ) + assert hits[0][1] == "c-near" + assert hits[1][1] == "c-far" + + +def test_search_embedding_empty_db(kb_dir: Path) -> None: + q = np.zeros(8, dtype=np.float32); q[0] = 1.0 + hits = index_db.search_embedding(kb_dir, query_vec=q, kinds=("claim",), limit=5) + assert hits == [] + + +def test_search_embedding_filters_by_kind(kb_dir: Path) -> None: + from vouch.embeddings.base import content_hash as ch + v = np.zeros(4, dtype=np.float32); v[0] = 1.0 + with index_db.open_db(kb_dir) as conn: + index_db.put_embedding(conn, kind="claim", id="c1", vec=v, + content_hash=ch("c1"), model="mock", + model_version="1", dim=4) + index_db.put_embedding(conn, kind="page", id="p1", vec=v, + content_hash=ch("p1"), model="mock", + model_version="1", dim=4) + only_claims = index_db.search_embedding( + kb_dir, query_vec=v, kinds=("claim",), limit=10, + ) + assert {h[0] for h in only_claims} == {"claim"} From b769dabca4368028d9fa894f95ed959fc56cf1aa Mon Sep 17 00:00:00 2001 From: dripsmvcp <138900956+dripsmvcp@users.noreply.github.com> Date: Wed, 20 May 2026 13:35:17 +0900 Subject: [PATCH 025/123] feat(embeddings): sqlite-vec ANN path with NumPy fallback --- src/vouch/index_db.py | 43 +++++++++++++++++++++++++++++++- tests/embeddings/test_storage.py | 25 +++++++++++++++++++ 2 files changed, 67 insertions(+), 1 deletion(-) diff --git a/src/vouch/index_db.py b/src/vouch/index_db.py index 5ddf8a12..6c42660b 100644 --- a/src/vouch/index_db.py +++ b/src/vouch/index_db.py @@ -246,6 +246,34 @@ def get_embedding_meta(kb_dir: Path) -> dict[str, str]: return {k: v for k, v in rows} +_sqlite_vec_loaded: set[int] = set() + + +def _load_sqlite_vec(conn: sqlite3.Connection) -> bool: + """Best-effort load of the sqlite-vec extension.""" + if id(conn) in _sqlite_vec_loaded: + return True + try: + conn.enable_load_extension(True) + except (AttributeError, sqlite3.OperationalError): + return False + try: + import sqlite_vec # type: ignore[import-not-found] + except ImportError: + return False + try: + sqlite_vec.load(conn) + except sqlite3.OperationalError: + return False + finally: + try: + conn.enable_load_extension(False) + except sqlite3.OperationalError: + pass + _sqlite_vec_loaded.add(id(conn)) + return True + + def search_embedding( kb_dir: Path, *, @@ -256,7 +284,6 @@ def search_embedding( limit: int = 10, min_score: float = 0.0, ) -> list[tuple[str, str, str, float]]: - """NumPy brute-force cosine search. Returns (kind, id, snippet, score).""" import numpy as np q = np.asarray(query_vec, dtype=np.float32) qnorm = float(np.linalg.norm(q)) @@ -264,6 +291,20 @@ def search_embedding( q = q / qnorm placeholders = ",".join("?" for _ in kinds) with open_db(kb_dir) as conn: + have_vec = _load_sqlite_vec(conn) + if have_vec: + try: + rows = conn.execute( + f"SELECT kind, id, " + f" 1.0 - vec_distance_cosine(vec, ?) AS score " + f"FROM embedding_index " + f"WHERE kind IN ({placeholders}) AND score >= ? " + f"ORDER BY score DESC LIMIT ?", + (q.tobytes(), *kinds, min_score, limit), + ).fetchall() + return [(k, i, "", float(s)) for k, i, s in rows] + except sqlite3.OperationalError: + pass rows = conn.execute( f"SELECT kind, id, vec, dim FROM embedding_index " f"WHERE kind IN ({placeholders})", diff --git a/tests/embeddings/test_storage.py b/tests/embeddings/test_storage.py index 9ea8ce1d..48e2cddd 100644 --- a/tests/embeddings/test_storage.py +++ b/tests/embeddings/test_storage.py @@ -119,3 +119,28 @@ def test_search_embedding_filters_by_kind(kb_dir: Path) -> None: kb_dir, query_vec=v, kinds=("claim",), limit=10, ) assert {h[0] for h in only_claims} == {"claim"} + + +def test_sqlite_vec_loader_is_idempotent(kb_dir: Path) -> None: + with index_db.open_db(kb_dir) as conn: + a = index_db._load_sqlite_vec(conn) + b = index_db._load_sqlite_vec(conn) + assert a == b + + +def test_search_works_under_both_backends(kb_dir: Path) -> None: + from vouch.embeddings.base import content_hash as ch + rng = np.random.default_rng(0) + vecs = rng.standard_normal((20, 8)).astype(np.float32) + vecs /= np.linalg.norm(vecs, axis=1, keepdims=True) + with index_db.open_db(kb_dir) as conn: + for i, v in enumerate(vecs): + index_db.put_embedding( + conn, kind="claim", id=f"c{i}", vec=v, + content_hash=ch(f"c{i}"), model="mock", + model_version="1", dim=8, + ) + hits = index_db.search_embedding( + kb_dir, query_vec=vecs[0], kinds=("claim",), limit=3, + ) + assert hits[0][1] == "c0" # exact self-match From c6b0e8bc92fc538480ee779bbe9949824919758d Mon Sep 17 00:00:00 2001 From: dripsmvcp <138900956+dripsmvcp@users.noreply.github.com> Date: Wed, 20 May 2026 13:35:55 +0900 Subject: [PATCH 026/123] feat(embeddings): query embedding LRU cache --- src/vouch/embeddings/cache.py | 83 ++++++++++++++++++++++++++++++++ tests/embeddings/test_storage.py | 21 ++++++++ 2 files changed, 104 insertions(+) create mode 100644 src/vouch/embeddings/cache.py diff --git a/src/vouch/embeddings/cache.py b/src/vouch/embeddings/cache.py new file mode 100644 index 00000000..be4b37a2 --- /dev/null +++ b/src/vouch/embeddings/cache.py @@ -0,0 +1,83 @@ +"""Query embedding LRU cache backed by `query_embedding_cache` table.""" + +from __future__ import annotations + +import datetime as dt +import hashlib +from pathlib import Path +from typing import Any + +import numpy as np + +from .. import index_db + + +def _query_key(query: str) -> str: + return hashlib.sha256(query.encode("utf-8")).hexdigest() + + +def cache_query_vec( + kb_dir: Path, *, query: str, vec: np.ndarray, max_entries: int = 1024, +) -> None: + h = _query_key(query) + blob = np.asarray(vec, dtype=np.float32).tobytes() + now = dt.datetime.now(dt.UTC).isoformat(timespec="seconds") + with index_db.open_db(kb_dir) as conn: + conn.execute( + "INSERT OR REPLACE INTO query_embedding_cache " + "(query_hash, vec, hit_count, last_used_at) " + "VALUES (?, ?, COALESCE(" + " (SELECT hit_count FROM query_embedding_cache WHERE query_hash=?), 0" + ") + 1, ?)", + (h, blob, h, now), + ) + n = conn.execute( + "SELECT COUNT(*) FROM query_embedding_cache" + ).fetchone()[0] + if n > max_entries: + conn.execute( + "DELETE FROM query_embedding_cache WHERE query_hash IN (" + " SELECT query_hash FROM query_embedding_cache " + " ORDER BY last_used_at ASC LIMIT ?)", + (n - max_entries,), + ) + + +def lookup_query_vec(kb_dir: Path, *, query: str) -> np.ndarray | None: + h = _query_key(query) + now = dt.datetime.now(dt.UTC).isoformat(timespec="seconds") + with index_db.open_db(kb_dir) as conn: + row = conn.execute( + "SELECT vec FROM query_embedding_cache WHERE query_hash = ?", + (h,), + ).fetchone() + if not row: + return None + conn.execute( + "UPDATE query_embedding_cache SET hit_count = hit_count + 1, " + "last_used_at = ? WHERE query_hash = ?", + (now, h), + ) + return np.frombuffer(row[0], dtype=np.float32).copy() + + +def query_cache_size(kb_dir: Path) -> int: + with index_db.open_db(kb_dir) as conn: + return int(conn.execute( + "SELECT COUNT(*) FROM query_embedding_cache" + ).fetchone()[0]) + + +def query_cache_clear(kb_dir: Path) -> None: + with index_db.open_db(kb_dir) as conn: + conn.execute("DELETE FROM query_embedding_cache") + + +def query_cache_stats(kb_dir: Path) -> dict[str, Any]: + with index_db.open_db(kb_dir) as conn: + row = conn.execute( + "SELECT COUNT(*), COALESCE(SUM(hit_count), 0), " + "COALESCE(MAX(hit_count), 0) FROM query_embedding_cache" + ).fetchone() + return {"entries": int(row[0]), "hits": int(row[1]), + "max_hits_per_entry": int(row[2])} diff --git a/tests/embeddings/test_storage.py b/tests/embeddings/test_storage.py index 48e2cddd..53f39610 100644 --- a/tests/embeddings/test_storage.py +++ b/tests/embeddings/test_storage.py @@ -144,3 +144,24 @@ def test_search_works_under_both_backends(kb_dir: Path) -> None: kb_dir, query_vec=vecs[0], kinds=("claim",), limit=3, ) assert hits[0][1] == "c0" # exact self-match + + +def test_query_cache_round_trip(kb_dir: Path) -> None: + from vouch.embeddings.cache import ( + cache_query_vec, lookup_query_vec, query_cache_size, + ) + v = np.ones(4, dtype=np.float32) + cache_query_vec(kb_dir, query="hello", vec=v) + got = lookup_query_vec(kb_dir, query="hello") + assert got is not None + assert np.allclose(got, v) + assert lookup_query_vec(kb_dir, query="other") is None + assert query_cache_size(kb_dir) == 1 + + +def test_query_cache_lru_eviction(kb_dir: Path) -> None: + from vouch.embeddings.cache import cache_query_vec, query_cache_size + v = np.ones(4, dtype=np.float32) + for i in range(5): + cache_query_vec(kb_dir, query=f"q{i}", vec=v, max_entries=3) + assert query_cache_size(kb_dir) <= 3 From 3722ee454c0c8fef0d9fafc8dfce81cac79242db Mon Sep 17 00:00:00 2001 From: dripsmvcp <138900956+dripsmvcp@users.noreply.github.com> Date: Wed, 20 May 2026 13:37:11 +0900 Subject: [PATCH 027/123] style: fix ruff E402/SIM105/E702/I001 violations from Phase 2 storage tasks --- src/vouch/index_db.py | 9 +++------ tests/embeddings/test_storage.py | 21 +++++++++++++-------- 2 files changed, 16 insertions(+), 14 deletions(-) diff --git a/src/vouch/index_db.py b/src/vouch/index_db.py index 6c42660b..025b1d19 100644 --- a/src/vouch/index_db.py +++ b/src/vouch/index_db.py @@ -11,9 +11,10 @@ from __future__ import annotations +import datetime as _dt import sqlite3 from collections.abc import Iterable -from contextlib import contextmanager +from contextlib import contextmanager, suppress from pathlib import Path DB_FILENAME = "state.db" @@ -180,8 +181,6 @@ def stats(kb_dir: Path) -> dict[str, int]: # --- embeddings storage -------------------------------------------------- -import datetime as _dt - def _vec_to_blob(vec): # type: ignore[no-untyped-def] import numpy as np @@ -266,10 +265,8 @@ def _load_sqlite_vec(conn: sqlite3.Connection) -> bool: except sqlite3.OperationalError: return False finally: - try: + with suppress(sqlite3.OperationalError): conn.enable_load_extension(False) - except sqlite3.OperationalError: - pass _sqlite_vec_loaded.add(id(conn)) return True diff --git a/tests/embeddings/test_storage.py b/tests/embeddings/test_storage.py index 53f39610..d67f702c 100644 --- a/tests/embeddings/test_storage.py +++ b/tests/embeddings/test_storage.py @@ -82,9 +82,13 @@ def test_set_embedding_meta_round_trip(kb_dir: Path) -> None: def test_search_embedding_returns_topk(kb_dir: Path) -> None: from vouch.embeddings.base import content_hash as ch - query = np.zeros(8, dtype=np.float32); query[0] = 1.0 - near = np.zeros(8, dtype=np.float32); near[0] = 0.99; near[1] = 0.05 - far = np.zeros(8, dtype=np.float32); far[7] = 1.0 + query = np.zeros(8, dtype=np.float32) + query[0] = 1.0 + near = np.zeros(8, dtype=np.float32) + near[0] = 0.99 + near[1] = 0.05 + far = np.zeros(8, dtype=np.float32) + far[7] = 1.0 near /= float(np.linalg.norm(near)) with index_db.open_db(kb_dir) as conn: for cid, vec in [("c-near", near), ("c-far", far)]: @@ -100,14 +104,17 @@ def test_search_embedding_returns_topk(kb_dir: Path) -> None: def test_search_embedding_empty_db(kb_dir: Path) -> None: - q = np.zeros(8, dtype=np.float32); q[0] = 1.0 + q = np.zeros(8, dtype=np.float32) + q[0] = 1.0 hits = index_db.search_embedding(kb_dir, query_vec=q, kinds=("claim",), limit=5) assert hits == [] def test_search_embedding_filters_by_kind(kb_dir: Path) -> None: from vouch.embeddings.base import content_hash as ch - v = np.zeros(4, dtype=np.float32); v[0] = 1.0 + + v = np.zeros(4, dtype=np.float32) + v[0] = 1.0 with index_db.open_db(kb_dir) as conn: index_db.put_embedding(conn, kind="claim", id="c1", vec=v, content_hash=ch("c1"), model="mock", @@ -147,9 +154,7 @@ def test_search_works_under_both_backends(kb_dir: Path) -> None: def test_query_cache_round_trip(kb_dir: Path) -> None: - from vouch.embeddings.cache import ( - cache_query_vec, lookup_query_vec, query_cache_size, - ) + from vouch.embeddings.cache import cache_query_vec, lookup_query_vec, query_cache_size v = np.ones(4, dtype=np.float32) cache_query_vec(kb_dir, query="hello", vec=v) got = lookup_query_vec(kb_dir, query="hello") From d51474b9ba47594705c524ade8588b88319c6fb0 Mon Sep 17 00:00:00 2001 From: dripsmvcp <138900956+dripsmvcp@users.noreply.github.com> Date: Wed, 20 May 2026 22:42:17 +0900 Subject: [PATCH 028/123] fix(embeddings): use outer-query for WHERE on cosine alias in search_embedding Per CodeRabbit Critical on PR #39/40/43: SQLite does not allow a column alias defined in the SELECT list to be referenced in the WHERE clause of the same query. The old form SELECT ... 1.0 - vec_distance_cosine(vec, ?) AS score ... WHERE ... AND score >= ? raised `no such column: score` at runtime; the catch-all `except sqlite3.OperationalError` silently swallowed it and made every call fall through to the NumPy brute-force path, which works but defeats the whole point of installing sqlite-vec. Wrap the projection in a subquery so the WHERE clause sees the alias. No behavior change for callers that have already been using the fallback (NumPy still produces correct results); the ANN code path now actually runs when sqlite-vec is loaded. --- src/vouch/index_db.py | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/src/vouch/index_db.py b/src/vouch/index_db.py index 025b1d19..ce19602e 100644 --- a/src/vouch/index_db.py +++ b/src/vouch/index_db.py @@ -291,11 +291,15 @@ def search_embedding( have_vec = _load_sqlite_vec(conn) if have_vec: try: + # SQLite doesn't allow a column alias to be referenced in the + # WHERE clause of the same SELECT, so the min_score filter + # goes in an outer query against the inner alias. rows = conn.execute( - f"SELECT kind, id, " - f" 1.0 - vec_distance_cosine(vec, ?) AS score " - f"FROM embedding_index " - f"WHERE kind IN ({placeholders}) AND score >= ? " + f"SELECT kind, id, score FROM (" + f" SELECT kind, id, 1.0 - vec_distance_cosine(vec, ?) AS score " + f" FROM embedding_index " + f" WHERE kind IN ({placeholders})" + f") WHERE score >= ? " f"ORDER BY score DESC LIMIT ?", (q.tobytes(), *kinds, min_score, limit), ).fetchall() From 3612f0bc2a429f7b9f8b995544412020502236a5 Mon Sep 17 00:00:00 2001 From: dripsmvcp <138900956+dripsmvcp@users.noreply.github.com> Date: Wed, 20 May 2026 13:39:39 +0900 Subject: [PATCH 029/123] feat(embeddings): write-time embedding hook + wire put_claim --- src/vouch/storage.py | 42 +++++++++++++++++++++++++++++++++ tests/embeddings/test_search.py | 34 ++++++++++++++++++++++++++ 2 files changed, 76 insertions(+) create mode 100644 tests/embeddings/test_search.py diff --git a/src/vouch/storage.py b/src/vouch/storage.py index 51bc8cea..317d693b 100644 --- a/src/vouch/storage.py +++ b/src/vouch/storage.py @@ -283,6 +283,7 @@ def put_claim(self, claim: Claim) -> Claim: raise ValueError( f"claim {claim.id} already exists -- use update_claim()" ) from e + self._embed_and_store(kind="claim", id=claim.id, text=claim.text) return claim def get_claim(self, claim_id: str) -> Claim: @@ -450,6 +451,47 @@ def list_sessions(self) -> list[Session]: return [Session.model_validate(_yaml_load(p.read_text())) for p in sorted(d.glob("*.yaml"))] + # --- embedding hook ------------------------------------------------------ + + def _embed_and_store(self, *, kind: str, id: str, text: str) -> None: + """Compute and persist an embedding for an artifact. + + Skipped if (kind, id) already exists with the same content hash. + Failures (e.g. embeddings extras not installed) are swallowed -- + embeddings are an enhancement, not a hard requirement. + """ + if not text or not text.strip(): + return + try: + from . import index_db as _index_db + from .embeddings import content_hash, get_embedder + except ImportError: + return + h = content_hash(text) + existing = _index_db.get_embedding(self.kb_dir, kind=kind, id=id) + if existing is not None and existing[1] == h: + return + try: + embedder = get_embedder() + except KeyError: + return + vec = embedder.encode(text) + with _index_db.open_db(self.kb_dir) as conn: + _index_db.put_embedding( + conn, kind=kind, id=id, vec=vec, content_hash=h, + model=embedder.name, model_version=embedder.version, + dim=embedder.dim, + ) + _index_db.set_embedding_meta( + self.kb_dir, model=embedder.name, + version=embedder.version, dim=embedder.dim, + ) + try: + from .embeddings.dedup import check_and_log + check_and_log(self.kb_dir, kind=kind, id=id, vec=vec) + except ImportError: + pass + # --- proposals --------------------------------------------------------- def put_proposal(self, proposal: Proposal) -> Proposal: diff --git a/tests/embeddings/test_search.py b/tests/embeddings/test_search.py new file mode 100644 index 00000000..fc33e43b --- /dev/null +++ b/tests/embeddings/test_search.py @@ -0,0 +1,34 @@ +"""End-to-end semantic search through KBStore + index_db.""" + +from __future__ import annotations + +from pathlib import Path + +import pytest + +from vouch import index_db +from vouch.embeddings import register +from vouch.models import Claim, Entity, EntityType, Page +from vouch.storage import KBStore +from tests.embeddings._fakes import MockEmbedder + + +@pytest.fixture(autouse=True) +def _use_mock_embedder() -> None: + from vouch.embeddings.base import DEFAULT_MODEL_NAME + register(DEFAULT_MODEL_NAME, lambda: MockEmbedder(dim=8)) + + +@pytest.fixture +def store(tmp_path: Path) -> KBStore: + return KBStore.init(tmp_path) + + +def test_put_claim_writes_embedding(store: KBStore) -> None: + src = store.put_source(b"e") + store.put_claim(Claim(id="c1", text="claim text", evidence=[src.id])) + rec = index_db.get_embedding(store.kb_dir, kind="claim", id="c1") + assert rec is not None + vec, ch, model = rec + assert vec.shape == (8,) + assert model == "mock" From 807c326ef78cf4d574c9511c0754f287761d3018 Mon Sep 17 00:00:00 2001 From: dripsmvcp <138900956+dripsmvcp@users.noreply.github.com> Date: Wed, 20 May 2026 13:45:43 +0900 Subject: [PATCH 030/123] feat(embeddings): search_semantic wrapper with query cache --- src/vouch/index_db.py | 29 +++++++++++++++++++++++++++++ tests/embeddings/test_search.py | 8 ++++++++ 2 files changed, 37 insertions(+) diff --git a/src/vouch/index_db.py b/src/vouch/index_db.py index ce19602e..3152a8cb 100644 --- a/src/vouch/index_db.py +++ b/src/vouch/index_db.py @@ -319,3 +319,32 @@ def search_embedding( scored.append((kind, id_, "", score)) scored.sort(key=lambda r: r[3], reverse=True) return scored[:limit] + + +def search_semantic( + kb_dir: Path, + query: str, + *, + limit: int = 10, + kinds: tuple[str, ...] = ( + "claim", "page", "source", "entity", "relation", "evidence", + ), + min_score: float = 0.0, +) -> list[tuple[str, str, str, float]]: + """Encode query (cached) -> ANN/cosine search.""" + try: + from .embeddings import get_embedder + from .embeddings.cache import cache_query_vec, lookup_query_vec + except ImportError: + return [] + try: + embedder = get_embedder() + except KeyError: + return [] + qvec = lookup_query_vec(kb_dir, query=query) + if qvec is None: + qvec = embedder.encode(query) + cache_query_vec(kb_dir, query=query, vec=qvec) + return search_embedding( + kb_dir, query_vec=qvec, kinds=kinds, limit=limit, min_score=min_score, + ) diff --git a/tests/embeddings/test_search.py b/tests/embeddings/test_search.py index bb767e3c..93006121 100644 --- a/tests/embeddings/test_search.py +++ b/tests/embeddings/test_search.py @@ -93,3 +93,11 @@ def test_update_claim_recomputes_embedding(store: KBStore) -> None: rec_after = index_db.get_embedding(store.kb_dir, kind="claim", id="c1") assert rec_after is not None assert rec_after[1] != hash_before + + +def test_search_semantic_returns_top_hits(store: KBStore) -> None: + src = store.put_source(b"e") + store.put_claim(Claim(id="c1", text="alpha alpha alpha", evidence=[src.id])) + store.put_claim(Claim(id="c2", text="beta beta beta", evidence=[src.id])) + hits = index_db.search_semantic(store.kb_dir, query="alpha alpha alpha", limit=2) + assert hits[0][1] == "c1" From f7c3c89eda3467020c239fe1196abaae53717884 Mon Sep 17 00:00:00 2001 From: dripsmvcp <138900956+dripsmvcp@users.noreply.github.com> Date: Wed, 20 May 2026 13:42:01 +0900 Subject: [PATCH 031/123] feat(embeddings): hook all six artifact write paths --- src/vouch/storage.py | 5 ++++ tests/embeddings/test_search.py | 42 +++++++++++++++++++++++++++++++++ 2 files changed, 47 insertions(+) diff --git a/src/vouch/storage.py b/src/vouch/storage.py index 317d693b..963475cd 100644 --- a/src/vouch/storage.py +++ b/src/vouch/storage.py @@ -239,6 +239,7 @@ def put_source( metadata=metadata or {}, ) meta_path.write_text(_yaml_dump(src.model_dump(mode="json"))) + self._embed_and_store(kind="source", id=src.id, text=src.title or src.locator or "") return src def get_source(self, source_id: str) -> Source: @@ -320,6 +321,7 @@ def put_page(self, page: Page) -> Page: raise ValueError( f"page {page.id} already exists -- choose a different slug" ) from e + self._embed_and_store(kind="page", id=page.id, text=f"{page.title}\n\n{page.body}") return page def get_page(self, page_id: str) -> Page: @@ -344,6 +346,7 @@ def put_entity(self, entity: Entity) -> Entity: raise ValueError( f"entity {entity.id} already exists -- choose a different slug" ) from e + self._embed_and_store(kind="entity", id=entity.id, text=f"{entity.name}\n\n{entity.description or ''}") return entity def get_entity(self, eid: str) -> Entity: @@ -369,6 +372,7 @@ def put_relation(self, rel: Relation) -> Relation: raise ValueError( f"relation {rel.id} already exists -- choose a different slug" ) from e + self._embed_and_store(kind="relation", id=rel.id, text=f"{rel.source} {rel.relation.value} {rel.target}") return rel def get_relation(self, rid: str) -> Relation: @@ -402,6 +406,7 @@ def put_evidence(self, ev: Evidence) -> Evidence: raise ValueError( f"evidence {ev.id} already exists -- choose a different slug" ) from e + self._embed_and_store(kind="evidence", id=ev.id, text=ev.quote or "") return ev def get_evidence(self, eid: str) -> Evidence: diff --git a/tests/embeddings/test_search.py b/tests/embeddings/test_search.py index fc33e43b..e57790f7 100644 --- a/tests/embeddings/test_search.py +++ b/tests/embeddings/test_search.py @@ -32,3 +32,45 @@ def test_put_claim_writes_embedding(store: KBStore) -> None: vec, ch, model = rec assert vec.shape == (8,) assert model == "mock" + + +from vouch.models import Evidence, Relation, RelationType # noqa: E402 + + +def test_put_page_writes_embedding(store: KBStore) -> None: + store.put_page(Page(id="p1", title="Title", body="page body")) + rec = index_db.get_embedding(store.kb_dir, kind="page", id="p1") + assert rec is not None + assert rec[0].shape == (8,) + + +def test_put_source_writes_embedding(store: KBStore) -> None: + src = store.put_source(b"content bytes here", title="src1") + rec = index_db.get_embedding(store.kb_dir, kind="source", id=src.id) + assert rec is not None + + +def test_put_entity_writes_embedding(store: KBStore) -> None: + store.put_entity(Entity(id="e1", name="AuthN", type=EntityType.CONCEPT, + description="who you are")) + rec = index_db.get_embedding(store.kb_dir, kind="entity", id="e1") + assert rec is not None + + +def test_put_relation_writes_embedding(store: KBStore) -> None: + store.put_entity(Entity(id="e1", name="x", type=EntityType.CONCEPT)) + store.put_entity(Entity(id="e2", name="y", type=EntityType.CONCEPT)) + rel = Relation(id="r1", relation=RelationType.SIMILAR_TO, + source="e1", target="e2") + store.put_relation(rel) + rec = index_db.get_embedding(store.kb_dir, kind="relation", id="r1") + assert rec is not None + + +def test_put_evidence_writes_embedding(store: KBStore) -> None: + src = store.put_source(b"abc") + ev = Evidence(id="ev1", source_id=src.id, locator="line 1", + quote="excerpt text body") + store.put_evidence(ev) + rec = index_db.get_embedding(store.kb_dir, kind="evidence", id="ev1") + assert rec is not None From 062c149c955135b43c7da79f4057850b5ea7cf5b Mon Sep 17 00:00:00 2001 From: dripsmvcp <138900956+dripsmvcp@users.noreply.github.com> Date: Wed, 20 May 2026 13:46:37 +0900 Subject: [PATCH 032/123] feat(embeddings): kb_search defaults to embedding primary, fts5 fallback --- src/vouch/server.py | 67 ++++++++++++++++++++++++++------- tests/embeddings/test_search.py | 15 ++++++++ 2 files changed, 68 insertions(+), 14 deletions(-) diff --git a/src/vouch/server.py b/src/vouch/server.py index a2984042..f5b6a686 100644 --- a/src/vouch/server.py +++ b/src/vouch/server.py @@ -75,23 +75,62 @@ def kb_status() -> dict[str, Any]: @mcp.tool() -def kb_search(query: str, limit: int = 10) -> list[dict[str, Any]]: - """Search claims, pages and entities. FTS5 when available.""" +def kb_search( + query: str, + *, + limit: int = 10, + backend: str = "auto", + min_score: float = 0.0, +) -> dict[str, Any]: + """Search the KB. + + backend: "auto" (default, embedding then fts5 then substring), + "embedding", "fts5", "substring", or "hybrid". + """ from . import index_db store = _store() - try: - hits = index_db.search(store.kb_dir, query, limit=limit) - backend = "fts5" - if not hits: - hits = store.search_substring(query, limit=limit) - backend = "substring" - except Exception: + hits: list[tuple[str, str, str, float]] = [] + + def _to_dicts(h: list[tuple[str, str, str, float]], used: str) -> dict[str, Any]: + return { + "backend": used, + "hits": [ + {"kind": k, "id": i, "snippet": sn, "score": sc, "backend": used} + for k, i, sn, sc in h + ], + } + + if backend in ("auto", "embedding"): + hits = index_db.search_semantic( + store.kb_dir, query, limit=limit, min_score=min_score, + ) + if hits: + return _to_dicts(hits, "embedding") + if backend == "embedding": + return _to_dicts([], "embedding") + + if backend in ("auto", "fts5"): + try: + hits = index_db.search(store.kb_dir, query, limit=limit) + except Exception: + hits = [] + if hits: + return _to_dicts(hits, "fts5") + if backend == "fts5": + return _to_dicts([], "fts5") + + if backend in ("auto", "substring"): hits = store.search_substring(query, limit=limit) - backend = "substring" - return [ - {"kind": k, "id": i, "snippet": s, "score": sc, "backend": backend} - for k, i, s, sc in hits - ] + return _to_dicts(hits, "substring") + + if backend == "hybrid": + from .embeddings.fusion import rrf_fuse + emb = index_db.search_semantic(store.kb_dir, query, limit=limit * 2) + fts = index_db.search(store.kb_dir, query, limit=limit * 2) + hits = rrf_fuse(emb, fts, limit=limit) + return _to_dicts(hits, "hybrid") + + raise ValueError(f"unknown backend: {backend}") @mcp.tool() diff --git a/tests/embeddings/test_search.py b/tests/embeddings/test_search.py index 93006121..30640749 100644 --- a/tests/embeddings/test_search.py +++ b/tests/embeddings/test_search.py @@ -95,6 +95,21 @@ def test_update_claim_recomputes_embedding(store: KBStore) -> None: assert rec_after[1] != hash_before +def test_kb_search_defaults_to_semantic_then_fts5( + store: KBStore, monkeypatch: pytest.MonkeyPatch, +) -> None: + from vouch import server + monkeypatch.setattr(server, "_store", lambda: store) + src = store.put_source(b"e") + store.put_claim(Claim(id="c1", text="authentication design", evidence=[src.id])) + from vouch import health + health.rebuild_index(store) + result = server.kb_search("authentication design", limit=5) + assert result["hits"] + assert result["backend"] in ("embedding", "fts5", "substring") + assert result["hits"][0]["id"] == "c1" + + def test_search_semantic_returns_top_hits(store: KBStore) -> None: src = store.put_source(b"e") store.put_claim(Claim(id="c1", text="alpha alpha alpha", evidence=[src.id])) From d3bee3ba9a1dac1bd064fec5005a523777ef40b5 Mon Sep 17 00:00:00 2001 From: dripsmvcp <138900956+dripsmvcp@users.noreply.github.com> Date: Wed, 20 May 2026 13:42:29 +0900 Subject: [PATCH 033/123] feat(embeddings): re-embed on update_claim --- src/vouch/storage.py | 1 + tests/embeddings/test_search.py | 14 ++++++++++++++ 2 files changed, 15 insertions(+) diff --git a/src/vouch/storage.py b/src/vouch/storage.py index 963475cd..73afe070 100644 --- a/src/vouch/storage.py +++ b/src/vouch/storage.py @@ -306,6 +306,7 @@ def update_claim(self, claim: Claim) -> Claim: if not self._claim_path(claim.id).exists(): raise ArtifactNotFoundError(f"claim {claim.id}") self._claim_path(claim.id).write_text(_yaml_dump(claim.model_dump(mode="json"))) + self._embed_and_store(kind="claim", id=claim.id, text=claim.text) return claim # --- pages ------------------------------------------------------------- diff --git a/tests/embeddings/test_search.py b/tests/embeddings/test_search.py index e57790f7..97bc9542 100644 --- a/tests/embeddings/test_search.py +++ b/tests/embeddings/test_search.py @@ -74,3 +74,17 @@ def test_put_evidence_writes_embedding(store: KBStore) -> None: store.put_evidence(ev) rec = index_db.get_embedding(store.kb_dir, kind="evidence", id="ev1") assert rec is not None + + +def test_update_claim_recomputes_embedding(store: KBStore) -> None: + src = store.put_source(b"e") + c = store.put_claim(Claim(id="c1", text="original", evidence=[src.id])) + rec_before = index_db.get_embedding(store.kb_dir, kind="claim", id="c1") + assert rec_before is not None + hash_before = rec_before[1] + + c2 = c.model_copy(update={"text": "updated"}) + store.update_claim(c2) + rec_after = index_db.get_embedding(store.kb_dir, kind="claim", id="c1") + assert rec_after is not None + assert rec_after[1] != hash_before From f5c2a953445634095e6de652f08c2f706d07bab5 Mon Sep 17 00:00:00 2001 From: dripsmvcp <138900956+dripsmvcp@users.noreply.github.com> Date: Wed, 20 May 2026 13:47:22 +0900 Subject: [PATCH 034/123] feat(embeddings): JSONL _h_search parity with MCP semantic-primary dispatch --- src/vouch/jsonl_server.py | 36 ++++++++++++++++++++++++--------- tests/embeddings/test_search.py | 18 +++++++++++++++++ 2 files changed, 45 insertions(+), 9 deletions(-) diff --git a/src/vouch/jsonl_server.py b/src/vouch/jsonl_server.py index a3ac7ec1..5bc57eec 100644 --- a/src/vouch/jsonl_server.py +++ b/src/vouch/jsonl_server.py @@ -76,17 +76,35 @@ def _h_search(p: dict) -> list[dict]: s = _store() q = p["query"] limit = int(p.get("limit", 10)) - try: - hits = index_db.search(s.kb_dir, q, limit=limit) - backend = "fts5" - if not hits: - hits = s.search_substring(q, limit=limit) - backend = "substring" - except Exception: + backend_arg = p.get("backend", "auto") + min_score = float(p.get("min_score", 0.0)) + hits: list[tuple[str, str, str, float]] = [] + used = backend_arg + + if backend_arg in ("auto", "embedding"): + hits = index_db.search_semantic( + s.kb_dir, q, limit=limit, min_score=min_score, + ) + if hits: + used = "embedding" + if not hits and backend_arg in ("auto", "fts5"): + try: + hits = index_db.search(s.kb_dir, q, limit=limit) + used = "fts5" if hits else used + except Exception: + hits = [] + if not hits and backend_arg in ("auto", "substring"): hits = s.search_substring(q, limit=limit) - backend = "substring" + used = "substring" + if backend_arg == "hybrid": + from .embeddings.fusion import rrf_fuse + emb = index_db.search_semantic(s.kb_dir, q, limit=limit * 2) + fts = index_db.search(s.kb_dir, q, limit=limit * 2) + hits = rrf_fuse(emb, fts, limit=limit) + used = "hybrid" + return [ - {"kind": k, "id": i, "snippet": sn, "score": sc, "backend": backend} + {"kind": k, "id": i, "snippet": sn, "score": sc, "backend": used} for k, i, sn, sc in hits ] diff --git a/tests/embeddings/test_search.py b/tests/embeddings/test_search.py index 30640749..a25d4ed0 100644 --- a/tests/embeddings/test_search.py +++ b/tests/embeddings/test_search.py @@ -95,6 +95,24 @@ def test_update_claim_recomputes_embedding(store: KBStore) -> None: assert rec_after[1] != hash_before +def test_jsonl_search_uses_embedding_backend( + store: KBStore, monkeypatch: pytest.MonkeyPatch, +) -> None: + from vouch import jsonl_server + monkeypatch.setattr(jsonl_server, "_store", lambda: store) + src = store.put_source(b"e") + store.put_claim(Claim(id="c1", text="claim about logins", evidence=[src.id])) + from vouch import health + health.rebuild_index(store) + resp = jsonl_server.handle_request({ + "id": "1", "method": "kb.search", + "params": {"query": "claim about logins"}, + }) + assert resp["ok"] is True + assert resp["result"] + assert resp["result"][0]["backend"] in ("embedding", "fts5", "substring") + + def test_kb_search_defaults_to_semantic_then_fts5( store: KBStore, monkeypatch: pytest.MonkeyPatch, ) -> None: From b7e333ae703767b2d309825d5635561538278b1d Mon Sep 17 00:00:00 2001 From: dripsmvcp <138900956+dripsmvcp@users.noreply.github.com> Date: Wed, 20 May 2026 13:43:36 +0900 Subject: [PATCH 035/123] style: fix ruff SIM105/E501/I001/RUF059 violations from Phase 3 --- src/vouch/embeddings/__init__.py | 8 ++++---- src/vouch/storage.py | 10 ++++++++-- tests/embeddings/test_search.py | 17 +++++++++++------ 3 files changed, 23 insertions(+), 12 deletions(-) diff --git a/src/vouch/embeddings/__init__.py b/src/vouch/embeddings/__init__.py index 62b58fcb..8444ebca 100644 --- a/src/vouch/embeddings/__init__.py +++ b/src/vouch/embeddings/__init__.py @@ -8,7 +8,7 @@ modules are only imported when an embedding code path executes. """ -import contextlib +from contextlib import suppress from .base import ( DEFAULT_MODEL_NAME, @@ -21,13 +21,13 @@ # Auto-register the default adapter if sentence-transformers is installed. # Each adapter import is best-effort -- failure means that adapter's optional # dependency isn't installed, which is fine (a different adapter may be). -with contextlib.suppress(ImportError): +with suppress(ImportError): from . import st_mpnet # noqa: F401 -with contextlib.suppress(ImportError): +with suppress(ImportError): from . import st_minilm # noqa: F401 -with contextlib.suppress(ImportError): +with suppress(ImportError): from . import fastembed_bge # noqa: F401 __all__ = [ diff --git a/src/vouch/storage.py b/src/vouch/storage.py index 73afe070..8153ef68 100644 --- a/src/vouch/storage.py +++ b/src/vouch/storage.py @@ -347,7 +347,10 @@ def put_entity(self, entity: Entity) -> Entity: raise ValueError( f"entity {entity.id} already exists -- choose a different slug" ) from e - self._embed_and_store(kind="entity", id=entity.id, text=f"{entity.name}\n\n{entity.description or ''}") + self._embed_and_store( + kind="entity", id=entity.id, + text=f"{entity.name}\n\n{entity.description or ''}", + ) return entity def get_entity(self, eid: str) -> Entity: @@ -373,7 +376,10 @@ def put_relation(self, rel: Relation) -> Relation: raise ValueError( f"relation {rel.id} already exists -- choose a different slug" ) from e - self._embed_and_store(kind="relation", id=rel.id, text=f"{rel.source} {rel.relation.value} {rel.target}") + self._embed_and_store( + kind="relation", id=rel.id, + text=f"{rel.source} {rel.relation.value} {rel.target}", + ) return rel def get_relation(self, rid: str) -> Relation: diff --git a/tests/embeddings/test_search.py b/tests/embeddings/test_search.py index 97bc9542..bb767e3c 100644 --- a/tests/embeddings/test_search.py +++ b/tests/embeddings/test_search.py @@ -6,11 +6,19 @@ import pytest +from tests.embeddings._fakes import MockEmbedder from vouch import index_db from vouch.embeddings import register -from vouch.models import Claim, Entity, EntityType, Page +from vouch.models import ( + Claim, + Entity, + EntityType, + Evidence, + Page, + Relation, + RelationType, +) from vouch.storage import KBStore -from tests.embeddings._fakes import MockEmbedder @pytest.fixture(autouse=True) @@ -29,14 +37,11 @@ def test_put_claim_writes_embedding(store: KBStore) -> None: store.put_claim(Claim(id="c1", text="claim text", evidence=[src.id])) rec = index_db.get_embedding(store.kb_dir, kind="claim", id="c1") assert rec is not None - vec, ch, model = rec + vec, _ch, model = rec assert vec.shape == (8,) assert model == "mock" -from vouch.models import Evidence, Relation, RelationType # noqa: E402 - - def test_put_page_writes_embedding(store: KBStore) -> None: store.put_page(Page(id="p1", title="Title", body="page body")) rec = index_db.get_embedding(store.kb_dir, kind="page", id="p1") From 9cfdf782c12294e4e30207fb426c38fc8afb94a5 Mon Sep 17 00:00:00 2001 From: dripsmvcp <138900956+dripsmvcp@users.noreply.github.com> Date: Wed, 20 May 2026 14:30:47 +0900 Subject: [PATCH 036/123] fix(ci): silence mypy import-untyped for forward-ref fusion import The hybrid backend branch in kb_search (server.py) and _h_search (jsonl_server.py) lazily imports vouch.embeddings.fusion (added in Phase 5). On Phase 4's branch that module doesn't exist yet, so mypy emits import-untyped. Mark each import with `# type: ignore` and let ruff auto-format the line. --- src/vouch/jsonl_server.py | 4 +++- src/vouch/server.py | 4 +++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/src/vouch/jsonl_server.py b/src/vouch/jsonl_server.py index 5bc57eec..5bdc6a99 100644 --- a/src/vouch/jsonl_server.py +++ b/src/vouch/jsonl_server.py @@ -97,7 +97,9 @@ def _h_search(p: dict) -> list[dict]: hits = s.search_substring(q, limit=limit) used = "substring" if backend_arg == "hybrid": - from .embeddings.fusion import rrf_fuse + from .embeddings.fusion import ( + rrf_fuse, # type: ignore[import-not-found,import-untyped,unused-ignore] + ) emb = index_db.search_semantic(s.kb_dir, q, limit=limit * 2) fts = index_db.search(s.kb_dir, q, limit=limit * 2) hits = rrf_fuse(emb, fts, limit=limit) diff --git a/src/vouch/server.py b/src/vouch/server.py index f5b6a686..49a2fd27 100644 --- a/src/vouch/server.py +++ b/src/vouch/server.py @@ -124,7 +124,9 @@ def _to_dicts(h: list[tuple[str, str, str, float]], used: str) -> dict[str, Any] return _to_dicts(hits, "substring") if backend == "hybrid": - from .embeddings.fusion import rrf_fuse + from .embeddings.fusion import ( + rrf_fuse, # type: ignore[import-not-found,import-untyped,unused-ignore] + ) emb = index_db.search_semantic(store.kb_dir, query, limit=limit * 2) fts = index_db.search(store.kb_dir, query, limit=limit * 2) hits = rrf_fuse(emb, fts, limit=limit) From 1c2dc2111103aeea678404b1e37078961a202758 Mon Sep 17 00:00:00 2001 From: dripsmvcp <138900956+dripsmvcp@users.noreply.github.com> Date: Wed, 20 May 2026 14:28:50 +0900 Subject: [PATCH 037/123] fix(ci): silence mypy import-untyped for forward-ref dedup import The KBStore._embed_and_store helper lazily imports vouch.embeddings.dedup (added in Phase 6). On Phase 3's branch that module does not yet exist, so mypy treats it as untyped and errors out. Mark the import with `# type: ignore[import-not-found,import-untyped, unused-ignore]` so the type check passes here and stays silent once Phase 6 lands. --- src/vouch/storage.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/vouch/storage.py b/src/vouch/storage.py index 8153ef68..4c5e0892 100644 --- a/src/vouch/storage.py +++ b/src/vouch/storage.py @@ -499,7 +499,11 @@ def _embed_and_store(self, *, kind: str, id: str, text: str) -> None: version=embedder.version, dim=embedder.dim, ) try: - from .embeddings.dedup import check_and_log + # NB: dedup module is added in a later phase; ignore missing-stub + # / missing-module noise in CI's [dev]-only mypy run. + from .embeddings.dedup import ( # type: ignore[import-not-found,import-untyped,unused-ignore] + check_and_log, + ) check_and_log(self.kb_dir, kind=kind, id=id, vec=vec) except ImportError: pass From 7ab35e9d102dca8d01b7fe6e510a5b999c83016f Mon Sep 17 00:00:00 2001 From: plind-junior <59729252+plind-junior@users.noreply.github.com> Date: Thu, 21 May 2026 00:23:24 +0900 Subject: [PATCH 038/123] spec: cut dated 2026-05-21 snapshot; promote schema generator to script --- SPEC.md | 7 +- schemas/README.md | 28 +- scripts/gen_schemas.py | 71 +++++ spec/2026-05-21/README.md | 19 ++ spec/2026-05-21/SPEC.md | 426 ++++++++++++++++++++++++++++ spec/2026-05-21/audit-vocabulary.md | 116 ++++++++ spec/2026-05-21/methods.md | 265 +++++++++++++++++ spec/2026-05-21/retrieval.md | 134 +++++++++ spec/2026-05-21/review-gate.md | 147 ++++++++++ spec/2026-05-21/transports.md | 143 ++++++++++ spec/README.md | 12 + 11 files changed, 1345 insertions(+), 23 deletions(-) create mode 100644 scripts/gen_schemas.py create mode 100644 spec/2026-05-21/README.md create mode 100644 spec/2026-05-21/SPEC.md create mode 100644 spec/2026-05-21/audit-vocabulary.md create mode 100644 spec/2026-05-21/methods.md create mode 100644 spec/2026-05-21/retrieval.md create mode 100644 spec/2026-05-21/review-gate.md create mode 100644 spec/2026-05-21/transports.md diff --git a/SPEC.md b/SPEC.md index b193f447..df028a31 100644 --- a/SPEC.md +++ b/SPEC.md @@ -1,9 +1,14 @@ # vouch specification (draft) -**Status:** draft for 0.x. Pinned format expected at 1.0. +**Version:** 2026-05-21 · **Status:** draft for 0.x. Pinned format expected at 1.0. **Audience:** people writing alternative implementations of the `kb.*` surface, people building adapters, people auditing what lands on disk. +Dated snapshots of this document live under [spec/](spec/) — e.g. +[spec/2026-05-21/SPEC.md](spec/2026-05-21/SPEC.md) — so the protocol can +evolve while older versions stay readable. The file you are reading is +the *latest*; treat dated copies as immutable history. + This is the canonical written description of: 1. The on-disk layout of a `.vouch/` repository. diff --git a/schemas/README.md b/schemas/README.md index a44e3fe2..3d2b44f8 100644 --- a/schemas/README.md +++ b/schemas/README.md @@ -8,30 +8,14 @@ These are **generated** from the pydantic models in the pydantic models are the source of truth — regenerate with: ```bash -python3 -c " -import json, sys -sys.path.insert(0, 'src') -from vouch.models import ( - Source, Evidence, Claim, Entity, Relation, Page, Session, - AuditEvent, Proposal, ContextItem, ContextQuality, - ContextPack, Capabilities, -) -models = { - 'source': Source, 'evidence': Evidence, 'claim': Claim, - 'entity': Entity, 'relation': Relation, 'page': Page, - 'session': Session, 'audit-event': AuditEvent, - 'proposal': Proposal, 'context-item': ContextItem, - 'context-quality': ContextQuality, 'context-pack': ContextPack, - 'capabilities': Capabilities, -} -for slug, m in models.items(): - s = m.model_json_schema() - s['\$schema'] = 'https://json-schema.org/draft/2020-12/schema' - s['\$id'] = f'https://vouch.dev/schemas/{slug}.schema.json' - open(f'schemas/{slug}.schema.json', 'w').write(json.dumps(s, indent=2, sort_keys=True)) -" +python scripts/gen_schemas.py ``` +The generator is [../scripts/gen_schemas.py](../scripts/gen_schemas.py); +it writes `*.schema.json` for every model in `MODELS` and is +deterministic (sorted keys, stable `$id`s) so re-runs produce no diff +unless a model actually changed. + (`bundle.manifest.schema.json` and `jsonl-envelope.schema.json` are hand-maintained — they don't have pydantic counterparts.) diff --git a/scripts/gen_schemas.py b/scripts/gen_schemas.py new file mode 100644 index 00000000..3d6917c5 --- /dev/null +++ b/scripts/gen_schemas.py @@ -0,0 +1,71 @@ +"""Regenerate JSON Schema files in `schemas/` from the pydantic models. + +The pydantic models in `src/vouch/models.py` are the source of truth. +The JSON Schemas under `schemas/` are the **interop contract**: any +AKBP-compatible tool can validate vouch artifacts without reading +vouch's Python source. This script keeps the two in sync. + +Run from the repo root: + + python scripts/gen_schemas.py + +`bundle.manifest.schema.json` and `jsonl-envelope.schema.json` have no +pydantic counterpart and are hand-maintained — this script leaves them +alone. +""" + +from __future__ import annotations + +import json +from pathlib import Path + +from vouch.models import ( + AuditEvent, + Capabilities, + Claim, + ContextItem, + ContextPack, + ContextQuality, + Entity, + Evidence, + Page, + Proposal, + Relation, + Session, + Source, +) + +# slug → pydantic model. Slug is the on-disk filename stem and the +# stable identifier in the schema $id. +MODELS = { + "source": Source, + "evidence": Evidence, + "claim": Claim, + "entity": Entity, + "relation": Relation, + "page": Page, + "session": Session, + "audit-event": AuditEvent, + "proposal": Proposal, + "context-item": ContextItem, + "context-quality": ContextQuality, + "context-pack": ContextPack, + "capabilities": Capabilities, +} + +SCHEMAS_DIR = Path(__file__).resolve().parent.parent / "schemas" + + +def main() -> None: + SCHEMAS_DIR.mkdir(exist_ok=True) + for slug, model in MODELS.items(): + schema = model.model_json_schema() + schema["$schema"] = "https://json-schema.org/draft/2020-12/schema" + schema["$id"] = f"https://vouch.dev/schemas/{slug}.schema.json" + out = SCHEMAS_DIR / f"{slug}.schema.json" + out.write_text(json.dumps(schema, indent=2, sort_keys=True)) + print(f"regenerated {len(MODELS)} schemas in {SCHEMAS_DIR}") + + +if __name__ == "__main__": + main() diff --git a/spec/2026-05-21/README.md b/spec/2026-05-21/README.md new file mode 100644 index 00000000..37ed5da4 --- /dev/null +++ b/spec/2026-05-21/README.md @@ -0,0 +1,19 @@ +# spec — snapshot 2026-05-21 + +Frozen copy of the vouch specification at version `2026-05-21`. Files +here MUST NOT be edited; if the spec needs to change, edit the +top-level [../../SPEC.md](../../SPEC.md) and the chapter files under +[../](../), then cut a new dated snapshot. + +| File | Topic | +|---|---| +| [SPEC.md](SPEC.md) | Top-level specification | +| [methods.md](methods.md) | Per-method parameter + result shapes | +| [review-gate.md](review-gate.md) | Proposal / decision state machine | +| [transports.md](transports.md) | MCP and JSONL framing + errors | +| [audit-vocabulary.md](audit-vocabulary.md) | Canonical event names | +| [retrieval.md](retrieval.md) | FTS5 schema and scoring | + +JSON Schemas corresponding to this snapshot live in +[../../schemas/](../../schemas/) and can be regenerated from the pydantic +models with `python scripts/gen_schemas.py`. diff --git a/spec/2026-05-21/SPEC.md b/spec/2026-05-21/SPEC.md new file mode 100644 index 00000000..df028a31 --- /dev/null +++ b/spec/2026-05-21/SPEC.md @@ -0,0 +1,426 @@ +# vouch specification (draft) + +**Version:** 2026-05-21 · **Status:** draft for 0.x. Pinned format expected at 1.0. +**Audience:** people writing alternative implementations of the `kb.*` +surface, people building adapters, people auditing what lands on disk. + +Dated snapshots of this document live under [spec/](spec/) — e.g. +[spec/2026-05-21/SPEC.md](spec/2026-05-21/SPEC.md) — so the protocol can +evolve while older versions stay readable. The file you are reading is +the *latest*; treat dated copies as immutable history. + +This is the canonical written description of: + +1. The on-disk layout of a `.vouch/` repository. +2. The object model (Source, Evidence, Claim, Entity, Relation, Page, + Session, Proposal, AuditEvent). +3. The `kb.*` method surface, with parameter and result shapes. +4. The review-gate state machine (proposal → decision → durable artifact). +5. The audit log, bundle format, and capabilities descriptor. + +For implementation-level documentation see [docs/](docs/). For the +pydantic source of truth see [src/vouch/models.py](src/vouch/models.py). +For JSON Schema versions see [schemas/](schemas/). + +This document uses RFC 2119 keywords (MUST / SHOULD / MAY). + +--- + +## 1. On-disk layout + +A vouch knowledge base is a directory named `.vouch/` at any path the +host chooses (typically the repo root). Every file inside is plain text +(YAML, markdown, or JSONL) except `state.db`. + +``` +.vouch/ +├── config.yaml # KB settings +├── .gitignore # ignores proposed/, state.db +├── audit.log.jsonl # append-only audit log (committed) +├── state.db # SQLite FTS5 index (derived; not committed) +├── claims/.yaml # durable, reviewed claims +├── pages/.md # markdown with YAML frontmatter +├── sources//meta.yaml # source metadata +├── sources//content # captured bytes (optional) +├── entities/.yaml # graph nodes +├── relations/.yaml # graph edges +├── evidence/.yaml # span pointers into sources +├── sessions/.yaml # agent session records +├── proposed/.yaml # pending proposals (gitignored, local) +└── decided/.yaml # accepted/rejected (committed for audit) +``` + +Implementations MUST treat files on disk as the source of truth. +`state.db` is a derivable cache; any operation MUST be reproducible by +deleting `state.db` and rebuilding it from the files. + +### 1.1 `config.yaml` + +```yaml +version: "0.1" +kb_name: my-project +agent: claude-code # default actor if VOUCH_AGENT is unset +retrieval: + backend: fts5 # fts5 | substring + fts5_porter: true +review: + require_citations: true # claims without citations fail validation + approver_role: human # human | trusted-agent +``` + +### 1.2 ID rules + +- **Source ids** MUST be the lowercase hex sha256 of the captured bytes + (64 hex chars). Re-registering identical bytes MUST be idempotent. +- **Claim / Page / Entity / Relation / Evidence ids** are kebab-case + slugs unique within their kind. Implementations MAY derive them from + user-provided titles but MUST guarantee uniqueness. +- **Session ids** SHOULD be ULIDs or timestamp-prefixed slugs so that + sort order matches chronology. +- **Proposal ids** MUST be unique across `proposed/` and `decided/` + combined — a proposal keeps its id when it moves between directories. + +--- + +## 2. Object model + +The authoritative pydantic definitions are in +[src/vouch/models.py](src/vouch/models.py). The shapes below are +informative. + +### 2.1 Source + +Immutable input material. Content-addressed by sha256. + +| field | type | required | notes | +|--------------|---------------------|----------|---------------------------------| +| `id` | hex sha256 | yes | 64 lowercase hex chars | +| `type` | enum (see §2.1.1) | yes | default `file` | +| `locator` | string | yes | path/URL/commit/etc. | +| `title` | string | no | | +| `hash` | hex sha256 | no | mirrors `id` | +| `immutable` | bool | no | default `true` | +| `scope` | enum | no | `private`/`project`/`team`/`public` | +| `byte_size` | int | no | | +| `media_type` | string | no | default `text/plain` | +| `created_at` | ISO-8601 datetime | yes | UTC | +| `metadata` | object | no | implementation-defined | +| `tags` | array of string | no | | + +#### 2.1.1 SourceType + +`file`, `url`, `transcript`, `message`, `commit`, `issue`, `screenshot`, +`pdf`, `audio`, `video`, `folder`. + +### 2.2 Evidence + +A span pointer into a Source. Claims cite Evidence ids *or* Source ids; +both are valid citations. + +| field | type | required | notes | +|---------------|----------|----------|------------------------------------| +| `id` | slug | yes | | +| `source_id` | sha256 | yes | must reference an existing source | +| `source_type` | enum | no | mirrored from source for fast filter | +| `locator` | string | yes | `L10-L20`, `t=00:14:23`, `#sec-3` | +| `quote` | string | no | extracted span text | +| `hash` | sha256 | no | hash of the quoted span | +| `created_at` | datetime | yes | UTC | + +### 2.3 Claim + +The smallest assertion that can be cited, contradicted, superseded, or +archived. + +| field | type | required | notes | +|----------------------|----------------|----------|-------------------------------| +| `id` | slug | yes | | +| `text` | string | yes | one-sentence assertion | +| `type` | enum (§2.3.1) | yes | | +| `status` | enum (§2.3.2) | yes | | +| `confidence` | float `0..1` | yes | default `0.7` | +| `evidence` | array of id | yes | MUST be non-empty (see §3) | +| `entities` | array of id | no | | +| `supersedes` | array of id | no | | +| `superseded_by` | id | no | set when superseded | +| `contradicts` | array of id | no | | +| `scope` | enum | no | | +| `tags` | array of str | no | | +| `created_at` | datetime | yes | | +| `updated_at` | datetime | yes | | +| `last_confirmed_at` | datetime | no | | +| `approved_by` | string | no | actor who ran `kb.approve` | + +#### 2.3.1 ClaimType + +`fact`, `decision`, `preference`, `workflow`, `observation`, `question`, +`warning`. + +#### 2.3.2 ClaimStatus + +`working`, `actionable`, `stable`, `contested`, `superseded`, `archived`, +`redacted`. + +### 2.4 Entity / Relation + +Entities are typed named things; Relations are typed edges. + +EntityType: `person`, `project`, `repo`, `company`, `concept`, +`decision`, `workflow`, `file`, `api`, `incident`, `source`, `agent`, +`tool`, `team`, `system`. + +RelationType: `uses`, `depends_on`, `contradicts`, `supersedes`, +`supports`, `caused_by`, `owned_by`, `derived_from`, `similar_to`, +`blocks`, `implements`, `references`. + +### 2.5 Page + +Maintained markdown with YAML frontmatter on disk. Body is GFM markdown. + +PageType: `entity`, `concept`, `decision`, `workflow`, `session`, +`index`, `log`, `report`, `source-summary`. + +PageStatus: `draft`, `active`, `stale`, `archived`. + +### 2.6 Session + +A work block. Bundles the proposals an agent produced within one session +so `kb.crystallize` can promote the durable parts. + +### 2.7 Proposal + +vouch's review-gate primitive. See §4. + +### 2.8 AuditEvent + +One line in `audit.log.jsonl` per mutation. `event` is a dotted verb: +`source.register`, `proposal.create`, `proposal.approve`, +`proposal.reject`, `claim.supersede`, `claim.archive`, `bundle.import`, +etc. The complete vocabulary is defined in +[spec/audit-vocabulary.md](spec/audit-vocabulary.md). + +--- + +## 3. Validation rules + +These rules MUST be enforced server-side before a proposal can be +created and before any approved artifact is written to disk: + +1. **Every Claim MUST carry at least one citation** (Source id or + Evidence id). Claims without citations are a validation error, not + a warning. Implementations MAY relax this for `working`-status + claims if `review.require_citations: false` in `config.yaml`. +2. **Every Evidence MUST reference an existing Source.** Dangling + evidence is rejected. +3. **Source ids MUST be the sha256 of their content.** If the captured + bytes don't hash to the id, the source is rejected. +4. **Supersession is directional.** If A `supersedes` B then B's status + becomes `superseded` and `B.superseded_by` is set to A. Cycles are + rejected. +5. **Contradiction is symmetric.** If A `contradicts` B then B also + gains A in its `contradicts` list. +6. **Approval is once-only.** A proposal in `decided/` cannot be moved + back to `proposed/`. Re-proposing creates a new proposal id. + +--- + +## 4. Review gate state machine + +``` + kb.propose_* kb.approve + agent ────────────────────────► proposed/ ──────────► durable artifact + │ (claims/, pages/, …) + │ kb.reject + └───────────────► decided/.yaml + (status: rejected) +``` + +- `kb.propose_*` writes the proposal to `proposed/.yaml` and emits + an audit event `proposal.create`. +- `kb.approve ` moves `proposed/.yaml` to `decided/.yaml` + (status: `approved`) and writes the corresponding durable artifact + to its kind-specific directory. +- `kb.reject ` moves the proposal to `decided/.yaml` + (status: `rejected`) and does *not* write a durable artifact. +- `proposed/` MUST be gitignored. `decided/` MUST be committed. +- Proposals cannot mutate existing durable artifacts; they can only + *create*. Mutating durable artifacts uses the lifecycle methods + (`kb.supersede`, `kb.contradict`, `kb.archive`, `kb.confirm`, + `kb.cite`), each of which is directly audited. + +The full state diagram and edge cases are in +[spec/review-gate.md](spec/review-gate.md). + +--- + +## 5. `kb.*` method surface + +A conforming implementation MUST expose the following methods. The +canonical names appear in `kb.capabilities`. Parameter and result +shapes are defined in [spec/methods.md](spec/methods.md). + +### 5.1 Read (unrestricted) + +`kb.capabilities`, `kb.status`, `kb.search`, `kb.context`, +`kb.read_page`, `kb.read_claim`, `kb.read_entity`, `kb.read_relation`, +`kb.list_pages`, `kb.list_claims`, `kb.list_entities`, +`kb.list_relations`, `kb.list_sources`, `kb.list_pending`. + +### 5.2 Source intake (not gated) + +`kb.register_source`, `kb.register_source_from_path`, `kb.source_verify`. + +Evidence is harmless and de-duplicates by content hash; gating it would +just slow agents down without protecting anything. + +### 5.3 Write (gated) + +`kb.propose_claim`, `kb.propose_page`, `kb.propose_entity`, +`kb.propose_relation`. All accept `dry_run: true` for validation-only. + +### 5.4 Decisions (host-trusted) + +`kb.approve`, `kb.reject`. Implementations MUST require an approver +identity distinct from `proposed_by` unless explicitly configured for +trusted-agent self-approval. + +### 5.5 Lifecycle (direct, audited) + +`kb.supersede`, `kb.contradict`, `kb.archive`, `kb.confirm`, `kb.cite`. +These mutate already-reviewed knowledge — they're metadata about +durable artifacts, not new assertions, so they don't need the gate. + +### 5.6 Sessions + +`kb.session_start`, `kb.session_end`, `kb.crystallize`. + +### 5.7 Maintenance + +`kb.index_rebuild`, `kb.lint`, `kb.doctor`, `kb.audit`, `kb.export`, +`kb.export_check`, `kb.import_check`, `kb.import_apply`. + +--- + +## 6. Transports + +A conforming server MUST speak one of: + +- **MCP over stdio.** JSON-RPC 2.0 framed per the MCP spec. Methods + appear as MCP tools named `kb_` (underscore for tool-naming + compatibility); the canonical name in capabilities is still + `kb.`. +- **JSONL over stdin/stdout.** One JSON object per line. Request shape: + `{"id": str, "method": str, "params": object}`. Response shape: + `{"id": str, "ok": bool, "result"?: any, "error"?: {"code": str, "message": str}}`. + Error codes: `method_not_found`, `missing_param`, `invalid_request`, + `internal_error`. + +Servers MAY support both. See [spec/transports.md](spec/transports.md). + +--- + +## 7. Audit log + +`audit.log.jsonl` is one `AuditEvent` per line, appended on every +mutation. The log is committed and is the durable history of the KB. + +- Events MUST include `id`, `event`, `actor`, `created_at`, + `object_ids`. +- Events MAY include `dry_run`, `reversible`, and an `data` object for + event-specific payload. +- Events MUST NOT be deleted or rewritten. Rotation (compressing old + segments into separate files) is permitted; in-place edits are not. + +Full event vocabulary: [spec/audit-vocabulary.md](spec/audit-vocabulary.md). + +--- + +## 8. Bundle format + +`vouch export` produces a tar.gz containing: + +``` +manifest.json # version, generated_at, files: [{path, sha256, bytes}] +claims/... +pages/... +sources/.../meta.yaml +sources/.../content +entities/... +relations/... +evidence/... +sessions/... +decided/... +config.yaml +``` + +Excluded from bundles: `proposed/`, `state.db`, `audit.log.jsonl`. +Proposals are draft-state; the audit log is local to one KB instance; +the index is derivable. + +`manifest.json` carries a sha256 for every file. Import is gated by +`vouch import-check`, which produces a diff (`new` / `conflict` / +`identical`) before any destructive action. `vouch import-apply` +defaults to `--on-conflict skip`; overwriting requires explicit opt-in. + +Bundle schema: [schemas/bundle.manifest.schema.json](schemas/bundle.manifest.schema.json). + +--- + +## 9. Capabilities descriptor + +Returned by `kb.capabilities`: + +```json +{ + "name": "vouch", + "version": "0.0.1", + "spec": "vouch-0.1", + "methods": ["kb.capabilities", "kb.status", ...], + "retrieval": ["fts5", "substring"], + "review_gated": true, + "transports": ["mcp", "jsonl"], + "knowledge_capability": { + "kind": "local-cited-review-gated-kb", + "stores_evidence": true, + "audit_log": true + } +} +``` + +Implementations claiming to speak this spec MUST set +`"review_gated": true`. Implementations without a review gate are not +conforming vouch servers — they're something else. + +--- + +## 10. Versioning + +This spec follows the project version. Pre-1.0: + +- The on-disk layout may change between minor versions; a migration + tool is provided. +- The `kb.*` surface may add methods at any time. Removing or + reshaping a method is a breaking change and must appear in + `CHANGELOG.md`. + +At 1.0: + +- The on-disk layout is frozen. Breaking changes require a major bump + and a migration. +- The `kb.*` surface is frozen for removal/reshape. Additions are + always permitted. + +--- + +## 11. Conformance + +A conforming implementation: + +1. Implements every method in §5 with the documented shapes. +2. Enforces every validation rule in §3. +3. Implements the review-gate state machine in §4. +4. Writes audit events for every mutation per §7. +5. Produces and consumes bundles matching §8. +6. Returns a capabilities descriptor matching §9. + +A test pack measuring this is planned for 0.2 — see [ROADMAP.md](ROADMAP.md). diff --git a/spec/2026-05-21/audit-vocabulary.md b/spec/2026-05-21/audit-vocabulary.md new file mode 100644 index 00000000..71acaa75 --- /dev/null +++ b/spec/2026-05-21/audit-vocabulary.md @@ -0,0 +1,116 @@ +# Audit event vocabulary + +Every mutation in a vouch KB MUST emit exactly one `AuditEvent` to +`.vouch/audit.log.jsonl`. This document is the canonical list of event +names. + +Event names are **dotted**: `.`. Implementations MUST use +the names below; adding new mutations means adding a new entry to this +document, not making one up. + +--- + +## Schema + +Each line is a JSON object: + +```json +{ + "id": "01HM3K…", + "event": "claim.create", + "actor": "claude-code", + "created_at": "2026-05-17T10:00:00Z", + "object_ids": ["auth-uses-jwt"], + "dry_run": false, + "reversible": true, + "data": {"proposal_id": "p-…", "session_id": "s-…"} +} +``` + +- `actor` — value of `VOUCH_AGENT` at the time of the call (or + `unknown` if unset). +- `object_ids` — primary objects affected; usually one entry. +- `reversible` — `true` if a corresponding reverse exists + (`claim.archive` is reversible by re-creating; `claim.redact` is + not). + +--- + +## Source events + +| event | fired by | object_ids | notes | +|---|---|---|---| +| `source.register` | `kb.register_source*` | source sha256 | `data.deduplicated: bool` | +| `source.verify` | `kb.source_verify` | source sha256(s) | not strictly a mutation; logged anyway for traceability | + +## Evidence events + +| event | fired by | object_ids | +|---|---|---| +| `evidence.create` | implicit during claim proposal that includes new evidence | evidence id | + +## Proposal events + +| event | fired by | object_ids | notes | +|---|---|---|---| +| `proposal.create` | `kb.propose_*` | proposal id | `data.kind, data.payload_summary` | +| `proposal.approve` | `kb.approve` | proposal id | `data.object_id` (the durable artifact) | +| `proposal.reject` | `kb.reject` | proposal id | `data.reason` (required) | +| `proposal.expire` | GC | proposal id | implementations that GC pending | + +## Claim events + +| event | fired by | object_ids | notes | +|---|---|---|---| +| `claim.create` | `kb.approve` of a claim proposal | claim id | follows `proposal.approve` | +| `claim.supersede` | `kb.supersede` | `[old, new]` | both ids in `object_ids` | +| `claim.contradict` | `kb.contradict` | `[a, b]` | symmetric | +| `claim.archive` | `kb.archive` | claim id | `reversible: true` | +| `claim.confirm` | `kb.confirm` | claim id | updates `last_confirmed_at` | +| `claim.cite` | `kb.cite` | claim id | `data.evidence_added` | +| `claim.redact` | (admin) | claim id | `reversible: false` | + +## Page events + +| event | fired by | object_ids | +|---|---|---| +| `page.create` | `kb.approve` of a page proposal | page id | +| `page.update` | (direct edit; not via proposal) | page id | +| `page.archive` | `kb.archive` on a page | page id | + +`page.update` is intentionally direct: pages are *maintained* artifacts. +The change is still audited. + +## Entity / Relation events + +| event | fired by | object_ids | +|---|---|---| +| `entity.create` | `kb.approve` of an entity proposal | entity id | +| `relation.create` | `kb.approve` of a relation proposal | relation id | +| `relation.delete` | (admin) | relation id | + +## Session events + +| event | fired by | object_ids | +|---|---|---| +| `session.start` | `kb.session_start` | session id | +| `session.end` | `kb.session_end` | session id | +| `session.crystallize` | `kb.crystallize` | session id, page id (if produced) | + +## Maintenance events + +| event | fired by | object_ids | notes | +|---|---|---|---| +| `index.rebuild` | `kb.index_rebuild` | — | `data.indexed: int` | +| `bundle.export` | `kb.export` | — | `data.path, data.files` | +| `bundle.import` | `kb.import_apply` | bundle file path | `data.imported, data.skipped, data.overwritten` | + +--- + +## Forward compatibility + +- Consumers MUST tolerate unknown event names — log them, don't crash. +- New events SHOULD be added in `.` form using nouns from + the object model. +- Once an event name appears in a stable release, it MUST NOT be + renamed or reshaped within the same major version. diff --git a/spec/2026-05-21/methods.md b/spec/2026-05-21/methods.md new file mode 100644 index 00000000..6e6daf4e --- /dev/null +++ b/spec/2026-05-21/methods.md @@ -0,0 +1,265 @@ +# `kb.*` method reference + +This is the per-method reference for the surface declared in +[SPEC.md §5](../SPEC.md#5-kb-method-surface). Shapes are JSON; field +types follow JSON Schema conventions. + +Implementations expose these methods on every transport listed by +`kb.capabilities.transports`. MCP exposes them as tools named with an +underscore (`kb_search`, `kb_propose_claim`, …); the JSONL transport +uses the dotted form (`kb.search`). + +--- + +## Read methods + +### `kb.capabilities` + +**Params:** none. +**Result:** [Capabilities](../schemas/capabilities.schema.json). + +### `kb.status` + +**Params:** none. +**Result:** +```json +{ + "root": "/abs/path/.vouch", + "counts": {"claims": 12, "pages": 3, "sources": 9, "entities": 5, "relations": 4}, + "pending": 2, + "last_audit_at": "2026-05-17T10:00:00Z" +} +``` + +### `kb.search` + +**Params:** +- `query` *(string, required)* +- `limit` *(int, default 10)* +- `kinds` *(array of `claim`/`page`/`entity`/`source`, optional)* + +**Result:** array of `{kind, id, snippet, score, backend}`. + +### `kb.context` + +**Params:** +- `task` *(string, required)* — natural-language task description +- `max_chars` *(int, default 4000)* +- `min_items` *(int, default 0)* +- `require_citations` *(bool, default false)* + +**Result:** [ContextPack](../schemas/context-pack.schema.json). + +### `kb.read_{page,claim,entity,relation}` + +**Params:** `{ "id": str }`. +**Result:** the matching object, or `null` if not found. + +### `kb.list_{pages,claims,entities,relations,sources,pending}` + +**Params:** `{ "limit": int?, "offset": int?, "filter": object? }`. +**Result:** array of objects of the requested kind. + +--- + +## Source intake + +### `kb.register_source` + +**Params:** +- `content` *(string, required)* — UTF-8 text content +- `type` *(SourceType, default `file`)* +- `locator` *(string, required)* +- `title` *(string, optional)* +- `media_type` *(string, optional)* +- `tags` *(array of string, optional)* + +**Result:** `{ "id": "", "deduplicated": bool }`. + +### `kb.register_source_from_path` + +**Params:** +- `path` *(string, required)* — absolute or repo-relative path +- `type` *(SourceType, optional)* +- `title` *(string, optional)* + +**Result:** same as `register_source`. + +### `kb.source_verify` + +**Params:** `{ "id": str? }` — omit to verify all. +**Result:** `{ "ok": bool, "issues": [{"id": str, "kind": str, "detail": str}] }`. + +--- + +## Write (gated) + +### `kb.propose_claim` + +**Params:** +- `text` *(string, required)* +- `evidence` *(array of source/evidence ids, required, non-empty)* +- `type` *(ClaimType, default `observation`)* +- `confidence` *(float `0..1`, default 0.7)* +- `entities` *(array of entity ids, optional)* +- `scope` *(Scope, optional)* +- `tags` *(array of string, optional)* +- `session_id` *(string, optional)* +- `rationale` *(string, optional)* — *why* this claim, recorded on the proposal +- `dry_run` *(bool, default false)* + +**Result:** `{ "proposal_id": str, "claim_id": str, "valid": bool, "errors": [str] }`. + +When `dry_run`, no file is written; only validation runs. + +### `kb.propose_page` + +**Params:** +- `title` *(string, required)* +- `body` *(string, optional, markdown)* +- `type` *(PageType, default `concept`)* +- `claims` *(array of claim ids, optional)* +- `entities` *(array of entity ids, optional)* +- `sources` *(array of source ids, optional)* +- `tags` *(array of string, optional)* +- `dry_run` *(bool, default false)* + +**Result:** `{ "proposal_id": str, "page_id": str, "valid": bool, "errors": [str] }`. + +### `kb.propose_entity` + +**Params:** +- `name` *(string, required)* +- `type` *(EntityType, required)* +- `aliases` *(array of string, optional)* +- `description` *(string, optional)* +- `dry_run` *(bool, default false)* + +**Result:** `{ "proposal_id": str, "entity_id": str, "valid": bool, "errors": [str] }`. + +### `kb.propose_relation` + +**Params:** +- `source` *(id, required)* +- `relation` *(RelationType, required)* +- `target` *(id, required)* +- `confidence` *(float, default 0.7)* +- `evidence` *(array, optional)* +- `dry_run` *(bool, default false)* + +**Result:** `{ "proposal_id": str, "relation_id": str, "valid": bool, "errors": [str] }`. + +--- + +## Decisions + +### `kb.approve` + +**Params:** +- `proposal_id` *(string, required)* +- `reason` *(string, optional)* +- `approver` *(string, optional)* — overrides the env-derived actor + +**Result:** `{ "ok": bool, "object_id": str, "object_kind": str }`. + +### `kb.reject` + +**Params:** +- `proposal_id` *(string, required)* +- `reason` *(string, required)* + +**Result:** `{ "ok": bool }`. + +--- + +## Lifecycle + +| method | params | effect | +|---|---|---| +| `kb.supersede` | `{old_id, new_id, reason?}` | `old.status = superseded`; `old.superseded_by = new` | +| `kb.contradict` | `{a_id, b_id, reason?}` | adds A↔B to each other's `contradicts` | +| `kb.archive` | `{id, reason?}` | `status = archived` | +| `kb.confirm` | `{id}` | sets `last_confirmed_at = now` | +| `kb.cite` | `{id, evidence}` | appends an evidence/source id to the claim | + +All emit a corresponding audit event. + +--- + +## Sessions + +### `kb.session_start` + +**Params:** `{ "task": str?, "note": str? }`. +**Result:** `{ "session_id": str }`. + +### `kb.session_end` + +**Params:** `{ "session_id": str }`. +**Result:** `{ "ok": bool, "proposals": int }`. + +### `kb.crystallize` + +**Params:** `{ "session_id": str, "no_page": bool? }`. +**Result:** `{ "page_id": str?, "claims_promoted": int }`. + +Promotes the durable parts of a session into a session-summary page and +flags promotable claims for review. + +--- + +## Maintenance + +### `kb.index_rebuild` + +**Params:** none. +**Result:** `{ "ok": bool, "indexed": int }`. + +### `kb.lint` + +**Params:** `{ "stale_days": int? }`. +**Result:** `{ "issues": [{"id": str, "kind": str, "severity": "warn"|"error", "message": str}] }`. + +### `kb.doctor` + +**Params:** none. +**Result:** like `lint` plus source-hash verification, dangling-reference checks, and config-drift. + +### `kb.audit` + +**Params:** `{ "tail": int?, "filter": {"event": str?, "actor": str?}? }`. +**Result:** array of `AuditEvent`. + +### `kb.export` + +**Params:** `{ "out": str }`. +**Result:** `{ "path": str, "files": int, "bytes": int }`. + +### `kb.export_check` + +**Params:** `{ "path": str }`. +**Result:** `{ "ok": bool, "issues": [str] }`. + +### `kb.import_check` + +**Params:** `{ "path": str }`. +**Result:** `{ "new": [str], "conflict": [str], "identical": [str] }`. + +### `kb.import_apply` + +**Params:** `{ "path": str, "on_conflict": "skip"|"overwrite"|"fail" }`. +**Result:** `{ "imported": int, "skipped": int, "overwritten": int }`. + +--- + +## Error codes (JSONL transport) + +| code | meaning | +|---|---| +| `method_not_found` | unknown `method` | +| `missing_param` | required param absent or null | +| `invalid_request` | malformed envelope or invalid params | +| `internal_error` | unexpected server-side failure | + +MCP transports use MCP-native error semantics; the dotted-name mapping +is documented in [transports.md](transports.md). diff --git a/spec/2026-05-21/retrieval.md b/spec/2026-05-21/retrieval.md new file mode 100644 index 00000000..2569de4d --- /dev/null +++ b/spec/2026-05-21/retrieval.md @@ -0,0 +1,134 @@ +# Retrieval + +How `kb.search` and `kb.context` find things. + +vouch ships with FTS5 (SQLite full-text) as the only retrieval backend +in 0.x. Vector embeddings are on the roadmap as an *additional*, +optional backend — they don't replace FTS5. + +--- + +## 1. Storage + +`.vouch/state.db` is a SQLite database with FTS5 enabled. It contains: + +- `fts_claim(claim_id, text, tags, entities)` — content indexed, + metadata columns prefixed `+` so they don't participate in ranking +- `fts_page(page_id, title, body, tags)` — title weighted higher +- `fts_entity(entity_id, name, aliases, description)` +- `fts_source(source_id, title, locator, content_preview)` + +A `meta` table holds the schema version and the last full-rebuild +timestamp. + +The database is **derived state**: deleting it loses no information. +`kb.index_rebuild` reproduces it from the YAML/markdown files on disk. +`vouch doctor` checks rebuild parity (counts must match files). + +--- + +## 2. `kb.search` + +```json +{ + "method": "kb.search", + "params": {"query": "jwt", "limit": 10, "kinds": ["claim", "page"]} +} +``` + +### Tokenization + +vouch uses FTS5 with the `porter` tokenizer when +`retrieval.fts5_porter: true` (default) and `unicode61` otherwise. + +### Ranking + +FTS5 BM25, weighted per kind: + +- **Claim**: text=3.0, tags=1.5, entities=1.0 +- **Page**: title=4.0, body=1.0, tags=2.0 +- **Entity**: name=4.0, aliases=2.0, description=1.0 +- **Source**: title=3.0, locator=1.0, content_preview=0.5 + +Scores from different kinds are normalized so they're comparable. + +### Substring fallback + +When `retrieval.backend: substring`, vouch skips FTS5 entirely and does +case-insensitive substring scoring. Slower, but useful for repos where +the SQLite extension isn't available or for testing without the index. + +### Result shape + +```json +[ + {"kind": "claim", "id": "auth-uses-jwt", "snippet": "…jwt…", "score": 1.42, "backend": "fts5"}, + ... +] +``` + +Snippets use FTS5 `snippet()` with ``/`` highlighting. + +--- + +## 3. `kb.context` + +Higher-level retrieval for filling an agent's working set. Builds a +`ContextPack` with quality metadata. + +```json +{ + "method": "kb.context", + "params": { + "task": "implement password reset flow", + "max_chars": 4000, + "min_items": 3, + "require_citations": true + } +} +``` + +### How it works (0.x) + +1. Extract a small set of keywords from `task` (stopword removal + + noun-ish heuristic; no embedding call). +2. Run `kb.search` for the keywords across all kinds. +3. Sort by score, dedupe by id. +4. Walk down the result list, adding each item to the pack until + `max_chars` budget is exhausted. +5. Each kept item carries `freshness` (`fresh` if confirmed within 30 + days; `stale` if `updated_at` > 180 days; `unknown` otherwise). +6. Build `ContextQuality`: how many items, how many uncited claims, + whether the budget truncated, whether minimums were met. + +### Quality gate + +If `require_citations: true`, uncited claims are excluded from +`items` and listed in `quality.uncited_items`. If `min_items` isn't +met after filtering, `quality.ok: false` — the caller is expected to +back off and either widen the search or proceed with a documented +warning. + +### Why not embeddings (yet) + +- FTS5 is good enough for KBs in the 0-10k claim range, which is + where vouch is positioned. +- Embeddings add a model dependency, a cold-start cost, and a vendor + decision. Making this opt-in in 0.1 (see [ROADMAP.md](../ROADMAP.md)) + is the right ordering. +- When embeddings land, they'll be a *parallel* backend — the result + shape stays the same, only `backend` shifts from `fts5` to + `embedding`. Callers don't have to care. + +--- + +## 4. Indexing semantics + +- On every approved write, the corresponding FTS row is upserted + synchronously in the same transaction as the file write. If the file + write succeeds but the index update fails, the transaction is logged + as a `data.index_dirty: true` flag on the audit event and `vouch + doctor` will surface it. +- `kb.index_rebuild` truncates `fts_*` tables and re-walks the files. +- Pages with `status: archived` are still indexed but ranked lower + (factor 0.5 by default). diff --git a/spec/2026-05-21/review-gate.md b/spec/2026-05-21/review-gate.md new file mode 100644 index 00000000..33dd1078 --- /dev/null +++ b/spec/2026-05-21/review-gate.md @@ -0,0 +1,147 @@ +# Review gate — state machine + +The review gate is vouch's defining feature: agents never write durable +artifacts directly. Every write is a *proposal* that a human (or +trusted approver) must explicitly accept. + +This document specifies the state machine, the file moves, and the +audit events. + +--- + +## States and transitions + +``` + kb.propose_* + ┌──────────────────────┐ + │ ▼ + ┌───┴────┐ ┌─────────────┐ + (nothing)──┤ create ├────────►│ PENDING │ + └────────┘ │ proposed/ │ + └──────┬──────┘ + │ + ┌────────────────┼────────────────┐ + │ │ │ + kb.approve kb.reject (timeout) + │ │ │ + ▼ ▼ ▼ + ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ + │ APPROVED │ │ REJECTED │ │ STALE │ + │ + durable │ │ decided/ │ │ (gc target) │ + │ artifact │ │ │ │ │ + └─────────────┘ └─────────────┘ └─────────────┘ +``` + +### PENDING + +- File location: `.vouch/proposed/.yaml` +- Gitignored: yes +- The proposal's `payload` carries the unbuilt object (claim/page/entity/relation). +- The proposal MUST validate at creation time. If it doesn't, no file + is written and the call returns `valid: false` with errors. + +### APPROVED + +`kb.approve ` does *all* of the following, atomically (best-effort, +with rollback on failure): + +1. Validates the payload again (claims may have become invalid if their + cited sources were removed since proposal). +2. Writes the durable artifact to its kind-specific directory: + - claim → `.vouch/claims/.yaml` + - page → `.vouch/pages/.md` (frontmatter + body) + - entity → `.vouch/entities/.yaml` + - relation → `.vouch/relations/.yaml` +3. Stamps `approved_by` on the artifact (claims only — entities/relations don't carry an approver field). +4. Moves the proposal from `proposed/` to `decided/` with + `status: approved`, `decided_at`, `decided_by`, `decision_reason`. +5. Emits `proposal.approve` + the kind-specific create event + (`claim.create`, `page.create`, etc.) to `audit.log.jsonl`. +6. Updates `state.db` index entries for the new artifact. + +### REJECTED + +`kb.reject --reason "..."` does: + +1. Moves the proposal from `proposed/` to `decided/` with + `status: rejected`, `decided_at`, `decided_by`, `decision_reason`. +2. Emits `proposal.reject` to `audit.log.jsonl`. +3. **Does not write a durable artifact.** + +The `--reason` MUST be non-empty. Rejections without reasons are bad +review hygiene. + +### STALE (informative) + +Implementations MAY garbage-collect `proposed/.yaml` files older +than a configurable threshold. The default threshold is 90 days. GC +emits `proposal.expire` and moves the file to `decided/` with +`status: rejected`, `decision_reason: "expired"`. + +`decided/` is never GCed — it's the audit record. + +--- + +## Idempotency + +- `kb.propose_*` is **not** idempotent. Two identical proposals get two + distinct ids. (Agents do retry, but the reviewer should see retry + noise.) +- `kb.approve` and `kb.reject` are idempotent on a terminal proposal — + re-calling with the same id returns the existing decision rather + than erroring. They MUST error if the proposal is in the *other* + terminal state (you can't approve a rejected proposal). + +--- + +## Authorization + +The `approver_role` setting in `config.yaml` controls who may run +`kb.approve` / `kb.reject`: + +- `human` (default) — `decided_by` MUST be a non-agent actor. The + server inspects `VOUCH_AGENT`; if set and matches `proposed_by`, the + call is rejected with `forbidden_self_approval`. +- `trusted-agent` — any actor may approve, including the proposing + agent. This is for fully autonomous setups; the audit log still + records the actor. + +Implementations MAY add other roles. The spec only mandates the two +above. + +--- + +## Lifecycle methods are not gated + +The lifecycle methods (`kb.supersede`, `kb.contradict`, `kb.archive`, +`kb.confirm`, `kb.cite`) mutate **already-reviewed** artifacts. They +don't introduce new assertions — they're metadata about how reviewed +assertions relate. Gating them would be a security-theatre tax: the +agent could just propose a contradicting claim instead. + +So lifecycle methods are direct + audited. The audit event names are: + +- `claim.supersede`, `claim.contradict`, `claim.archive`, + `claim.confirm`, `claim.cite`. + +These appear in `audit.log.jsonl` exactly like create events. + +--- + +## Crash semantics + +If a process crashes mid-`approve`: + +- If the durable artifact was written but the proposal not yet moved + to `decided/`: re-running `kb.approve` MUST detect the existing + artifact, complete the move to `decided/`, and not duplicate the + durable write. +- If the proposal was moved to `decided/` but the artifact write + failed: the inconsistency is detectable by `vouch doctor`, which + surfaces "decided/X.yaml says approved but claims/X.yaml is missing". + Recovery is re-running `vouch approve --force-rewrite` (CLI + detail; not part of the `kb.*` surface). + +Implementations SHOULD write the durable artifact first, then move the +proposal. That ordering keeps `decided/` honest: if it says +`approved`, the artifact exists. diff --git a/spec/2026-05-21/transports.md b/spec/2026-05-21/transports.md new file mode 100644 index 00000000..286cfdc4 --- /dev/null +++ b/spec/2026-05-21/transports.md @@ -0,0 +1,143 @@ +# Transports + +A vouch server speaks one or more of the transports listed in its +`kb.capabilities.transports` array. This document defines both. + +The *method surface* is identical across transports — only framing +differs. Whichever transport you implement, the parameter and result +shapes are those in [methods.md](methods.md). + +--- + +## 1. MCP over stdio + +The default transport. The server is invoked as a subprocess by an MCP +host (Claude Code, Cursor, Codex, …) over stdin/stdout following the +[Model Context Protocol][mcp] specification. + +[mcp]: https://modelcontextprotocol.io + +### Tool naming + +MCP tool names cannot contain dots, so `kb.search` is exposed as the +MCP tool **`kb_search`**. The mapping is mechanical: replace `.` with +`_`. The dotted name remains canonical in `kb.capabilities.methods`. + +### Resources + +A vouch MCP server SHOULD expose the KB's read-only views as MCP +resources under the `vouch://` scheme: + +- `vouch://status` — JSON, same shape as `kb.status` +- `vouch://capabilities` — JSON +- `vouch://pending` — JSON list of pending proposals +- `vouch://claims/` — claim YAML +- `vouch://pages/` — page markdown + +Hosts that prefer resource browsing over tool calling can read those +directly. + +### Prompts + +A vouch MCP server MAY expose a small set of named prompts to make +common agent tasks one-click: + +- `vouch.cite_this` — "register the current selection as evidence and + propose a claim citing it" +- `vouch.crystallize_session` — "summarize this session's proposals + into a session page" + +Prompts are sugar; they all decompose into the `kb.*` tool calls. + +--- + +## 2. JSONL over stdin/stdout + +A simpler transport for setups without MCP. One JSON object per line, +newline-delimited. + +### Request envelope + +```json +{"id": "r1", "method": "kb.search", "params": {"query": "jwt", "limit": 5}} +``` + +- `id` *(string, required)* — opaque correlation id; echoed in the + response. +- `method` *(string, required)* — dotted name. +- `params` *(object, optional)* — method-specific. + +Extra keys are ignored. Requests without `id` or `method` get an +`invalid_request` error. + +### Response envelope (success) + +```json +{"id": "r1", "ok": true, "result": [...]} +``` + +### Response envelope (error) + +```json +{"id": "r1", "ok": false, "error": {"code": "missing_param", "message": "query is required"}} +``` + +### Error codes + +| code | meaning | +|---|---| +| `method_not_found` | unknown `method` | +| `missing_param` | required param absent or `null` | +| `invalid_request` | malformed envelope (no `id` / no `method`, non-object `params`, etc.) | +| `internal_error` | unexpected server-side failure; include `message` | + +Implementations MAY add other codes prefixed with their name +(e.g. `vouch_forbidden_self_approval`). Standard clients SHOULD treat +unknown codes as errors. + +### Framing rules + +- One request per line. Trailing newline is required. +- Server response order MUST match the request `id`, but requests MAY + be pipelined: a client can send N requests before reading any + responses. A conforming server processes them in order. +- `\r\n` and `\n` are both accepted as line terminators on input. + Responses MUST use `\n`. + +### Capability discovery + +The first thing a JSONL client SHOULD send is: + +```json +{"id": "boot", "method": "kb.capabilities"} +``` + +… and use the returned `methods` array to decide what's available +before issuing other calls. + +--- + +## 3. Choosing a transport + +| | MCP stdio | JSONL | +|---|---|---| +| Wired by an LLM host | yes (Claude Code, Cursor, Codex) | no — bring your own client | +| Resources / prompts | yes | no | +| Spec dependency | full MCP | none | +| Pipelining | per MCP semantics | yes | +| Test ergonomics | requires MCP host | trivial — `echo` + `jq` | + +Use MCP when the consumer is an LLM agent inside a host. Use JSONL +when the consumer is a script, a CI job, or another server. + +--- + +## 4. Future transports (non-normative) + +HTTP is on the roadmap (see [ROADMAP.md](../ROADMAP.md), 0.1). The +intended shape is one POST per call against `/rpc` with the JSONL +envelope as request body and response body. Localhost-bound by default; +auth story is `Authorization: Bearer ` from `config.yaml`. + +This isn't part of the current spec — it's a heads-up so implementers +don't accidentally choose conflicting conventions in the meantime. diff --git a/spec/README.md b/spec/README.md index 136b8008..7aeab4cd 100644 --- a/spec/README.md +++ b/spec/README.md @@ -13,3 +13,15 @@ is the entry point; this directory holds the longer reference material. These are *informative* where they elaborate on SPEC.md and *normative* where they define vocabulary (event names, error codes, JSON shapes). + +## Versioning + +The files at the top of this directory and `../SPEC.md` are the **latest** +working draft. Dated subdirectories (`2026-05-21/`, …) are immutable +snapshots — useful when implementations need to pin to a specific +protocol version. Cut a new snapshot whenever you ship a breaking +change to method shapes, on-disk layout, or vocabulary. + +| Version | Status | Notes | +|---|---|---| +| [2026-05-21](2026-05-21/) | current | initial dated snapshot | From 9e77d517658d2aa8622a87e7d84da354a02826ac Mon Sep 17 00:00:00 2001 From: dripsmvcp <138900956+dripsmvcp@users.noreply.github.com> Date: Thu, 21 May 2026 14:33:44 +0900 Subject: [PATCH 039/123] ci(mypy): collapse fusion import to single line for type-ignore --- src/vouch/jsonl_server.py | 4 ++-- src/vouch/server.py | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/vouch/jsonl_server.py b/src/vouch/jsonl_server.py index 5bdc6a99..bb4b9226 100644 --- a/src/vouch/jsonl_server.py +++ b/src/vouch/jsonl_server.py @@ -97,8 +97,8 @@ def _h_search(p: dict) -> list[dict]: hits = s.search_substring(q, limit=limit) used = "substring" if backend_arg == "hybrid": - from .embeddings.fusion import ( - rrf_fuse, # type: ignore[import-not-found,import-untyped,unused-ignore] + from .embeddings.fusion import ( # type: ignore[import-not-found,import-untyped,unused-ignore] + rrf_fuse, ) emb = index_db.search_semantic(s.kb_dir, q, limit=limit * 2) fts = index_db.search(s.kb_dir, q, limit=limit * 2) diff --git a/src/vouch/server.py b/src/vouch/server.py index 49a2fd27..75dff925 100644 --- a/src/vouch/server.py +++ b/src/vouch/server.py @@ -124,8 +124,8 @@ def _to_dicts(h: list[tuple[str, str, str, float]], used: str) -> dict[str, Any] return _to_dicts(hits, "substring") if backend == "hybrid": - from .embeddings.fusion import ( - rrf_fuse, # type: ignore[import-not-found,import-untyped,unused-ignore] + from .embeddings.fusion import ( # type: ignore[import-not-found,import-untyped,unused-ignore] + rrf_fuse, ) emb = index_db.search_semantic(store.kb_dir, query, limit=limit * 2) fts = index_db.search(store.kb_dir, query, limit=limit * 2) From f6b842781b14aa113b86dc4864b0562ed4ecda80 Mon Sep 17 00:00:00 2001 From: dripsmvcp <138900956+dripsmvcp@users.noreply.github.com> Date: Wed, 20 May 2026 13:49:09 +0900 Subject: [PATCH 040/123] feat(embeddings): RRF/weighted/normalized fusion strategies --- src/vouch/embeddings/fusion.py | 77 +++++++++++++++++++++++++++++++++ tests/embeddings/test_fusion.py | 41 ++++++++++++++++++ 2 files changed, 118 insertions(+) create mode 100644 src/vouch/embeddings/fusion.py create mode 100644 tests/embeddings/test_fusion.py diff --git a/src/vouch/embeddings/fusion.py b/src/vouch/embeddings/fusion.py new file mode 100644 index 00000000..84a2656b --- /dev/null +++ b/src/vouch/embeddings/fusion.py @@ -0,0 +1,77 @@ +"""Result-list fusion strategies for hybrid retrieval.""" + +from __future__ import annotations + +Hit = tuple[str, str, str, float] +Hits = list[Hit] + + +def _key(h: Hit) -> tuple[str, str]: + return (h[0], h[1]) + + +def _coalesce_snippet(h: Hit, other: Hits) -> str: + if h[2]: + return h[2] + for o in other: + if _key(o) == _key(h) and o[2]: + return o[2] + return "" + + +def rrf_fuse(a: Hits, b: Hits, *, limit: int = 10, k: int = 60) -> Hits: + """Reciprocal Rank Fusion: score = sum(1 / (k + rank)) across lists.""" + scores: dict[tuple[str, str], float] = {} + for lst in (a, b): + for rank, h in enumerate(lst, start=1): + scores[_key(h)] = scores.get(_key(h), 0.0) + 1.0 / (k + rank) + out: Hits = [] + seen: set[tuple[str, str]] = set() + for h in a + b: + if _key(h) in seen: + continue + seen.add(_key(h)) + out.append((h[0], h[1], _coalesce_snippet(h, a + b), scores[_key(h)])) + out.sort(key=lambda h: h[3], reverse=True) + return out[:limit] + + +def _minmax(xs: list[float]) -> list[float]: + if not xs: + return xs + lo, hi = min(xs), max(xs) + if hi - lo < 1e-9: + return [0.5] * len(xs) + return [(x - lo) / (hi - lo) for x in xs] + + +def weighted_fuse( + a: Hits, + b: Hits, + *, + w_a: float = 0.5, + w_b: float = 0.5, + limit: int = 10, +) -> Hits: + """Min-max normalize each list, then score = w_a * a_score + w_b * b_score.""" + a_norm = _minmax([h[3] for h in a]) + b_norm = _minmax([h[3] for h in b]) + a_score = {_key(h): a_norm[i] for i, h in enumerate(a)} + b_score = {_key(h): b_norm[i] for i, h in enumerate(b)} + merged: dict[tuple[str, str], float] = {} + for key in {*a_score, *b_score}: + merged[key] = w_a * a_score.get(key, 0.0) + w_b * b_score.get(key, 0.0) + out: Hits = [] + seen: set[tuple[str, str]] = set() + for h in a + b: + if _key(h) in seen: + continue + seen.add(_key(h)) + out.append((h[0], h[1], _coalesce_snippet(h, a + b), merged[_key(h)])) + out.sort(key=lambda h: h[3], reverse=True) + return out[:limit] + + +def normalized_fuse(a: Hits, b: Hits, *, limit: int = 10) -> Hits: + """Equal-weight weighted_fuse (0.5/0.5).""" + return weighted_fuse(a, b, w_a=0.5, w_b=0.5, limit=limit) diff --git a/tests/embeddings/test_fusion.py b/tests/embeddings/test_fusion.py new file mode 100644 index 00000000..322179c9 --- /dev/null +++ b/tests/embeddings/test_fusion.py @@ -0,0 +1,41 @@ +"""Fusion strategies -- RRF, weighted, normalized-cosine.""" + +from __future__ import annotations + +from vouch.embeddings.fusion import ( + normalized_fuse, + rrf_fuse, + weighted_fuse, +) + + +def _hits(items: list[tuple[str, str, float]]) -> list[tuple[str, str, str, float]]: + return [(k, i, "", s) for k, i, s in items] + + +def test_rrf_fuse_prefers_top_of_both_lists() -> None: + a = _hits([("claim", "x", 0.9), ("claim", "y", 0.5)]) + b = _hits([("claim", "y", 0.9), ("claim", "z", 0.4)]) + fused = rrf_fuse(a, b, limit=3) + ids = [h[1] for h in fused] + assert ids[0] == "y" + + +def test_rrf_fuse_handles_empty_inputs() -> None: + assert rrf_fuse([], [], limit=5) == [] + + +def test_weighted_fuse_respects_weights() -> None: + a = _hits([("claim", "x", 1.0), ("claim", "y", 0.0)]) + b = _hits([("claim", "y", 1.0), ("claim", "x", 0.0)]) + only_a = weighted_fuse(a, b, w_a=1.0, w_b=0.0, limit=2) + assert only_a[0][1] == "x" + only_b = weighted_fuse(a, b, w_a=0.0, w_b=1.0, limit=2) + assert only_b[0][1] == "y" + + +def test_normalized_fuse_zero_score_inputs() -> None: + a = _hits([("claim", "x", 0.0)]) + b = _hits([("claim", "y", 0.0)]) + fused = normalized_fuse(a, b, limit=2) + assert len(fused) == 2 From 45dd293fc59103211c1dd71fe12278088195bfcb Mon Sep 17 00:00:00 2001 From: plind-junior <59729252+plind-junior@users.noreply.github.com> Date: Thu, 21 May 2026 15:02:20 +0900 Subject: [PATCH 041/123] docs: add 'What ships today' table to README --- README.md | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/README.md b/README.md index 662878ca..4176395c 100644 --- a/README.md +++ b/README.md @@ -210,6 +210,23 @@ vouch import-apply kb.tar.gz --on-conflict skip # apply (default skip; never de | Portable bundle | no | no | **yes** | | Transports | SDK / HTTP | none | **MCP + JSONL** | +## What ships today + +| Area | Current support | +|------|-----------------| +| Knowledge base | `.vouch/` folder, YAML claims/entities/relations/evidence/sessions, markdown pages with frontmatter, JSONL audit log, content-addressed sources | +| CLI | `init`, `discover`, `capabilities`, `status`, `lint`, `doctor`, `pending`, `show`, `approve`, `reject`, `propose-{claim,page,entity,relation}`, `source add`, `source verify`, `supersede`, `contradict`, `archive`, `confirm`, `cite`, `session {start,end}`, `crystallize`, `search`, `context`, `index`, `audit`, `export`, `export-check`, `import-check`, `import-apply`, `serve` | +| Tool servers | MCP over stdio + JSONL over stdin/stdout, same `kb.*` surface across both transports, capabilities + knowledge-capability descriptor | +| Schemas | 13 JSON Schemas (Draft 2020-12) generated from pydantic in [schemas/](schemas/), plus hand-maintained `bundle.manifest` and `jsonl-envelope` schemas | +| Write safety | review-gated writes via [proposed/](spec/review-gate.md), `dry_run:true` previews, host trust required for `approve`/`reject`, atomic exclusive-create storage, path-traversal blocked on source intake and bundle import | +| Retrieval | SQLite FTS5 + substring fallback; optional semantic backends (`all-mpnet-base-v2`, `MiniLM-L6`, fastembed-BGE) behind install extras; context packs with citations + quality gate | +| Lifecycle | `supersede`, `contradict`, `archive`, `confirm`, `cite` — direct mutations, all audited | +| Portability | tar.gz bundles with per-file sha256 `manifest.json`, `export-check`, `import-check`, `import-apply` with skip/overwrite/fail conflict modes | +| Audit | append-only `audit.log.jsonl`, per-event actor (`VOUCH_AGENT`), object ids, dry-run flag, reversible flag | +| Adapters | Claude Code wiring documented via `.mcp.json` + `VOUCH_AGENT` env; per-runtime adapter templates not yet shipped | +| Validation | pytest suite (storage, FTS5, audit, source-verify, review-gate, bundle, JSONL), ruff + mypy gates, GitHub CI | +| Specification | dated snapshots under [spec/](spec/), JSON Schemas in [schemas/](schemas/), generator script at [scripts/gen_schemas.py](scripts/gen_schemas.py) | + ## Status Pre-1.0. What's *not* in this implementation: vector embeddings (BM25/FTS5 only), per-runtime adapter templates, benchmark fixtures, multi-agent sync, scopes beyond a single field on Claim/Source. If a hole matters to you, file an issue. From 86808bd53b3cf21e15567a8ec3f07b03b2411070 Mon Sep 17 00:00:00 2001 From: plind-junior <59729252+plind-junior@users.noreply.github.com> Date: Thu, 21 May 2026 15:08:34 +0900 Subject: [PATCH 042/123] kb: approve review-gate fact --- .vouch/.gitignore | 3 + .vouch/audit.log.jsonl | 9 + ...ed-proposal-workflow-agents-propose-c.yaml | 22 ++ .vouch/config.yaml | 7 + .vouch/decided/20260521-055206-7d6d92d6.yaml | 25 ++ .../content | 6 + .../meta.yaml | 12 + .../content | 236 ++++++++++++++++++ .../meta.yaml | 12 + 9 files changed, 332 insertions(+) create mode 100644 .vouch/.gitignore create mode 100644 .vouch/audit.log.jsonl create mode 100644 .vouch/claims/vouch-uses-a-review-gated-proposal-workflow-agents-propose-c.yaml create mode 100644 .vouch/config.yaml create mode 100644 .vouch/decided/20260521-055206-7d6d92d6.yaml create mode 100644 .vouch/sources/06d8519f8dcf4149d23c8a48984541b2e9365ec364e7e58192e28ed149a2c47c/content create mode 100644 .vouch/sources/06d8519f8dcf4149d23c8a48984541b2e9365ec364e7e58192e28ed149a2c47c/meta.yaml create mode 100644 .vouch/sources/67478e72acfb8fac3a059143e95c95f5cc6f7e8d4dccc05fbcea8dbccb8a4eba/content create mode 100644 .vouch/sources/67478e72acfb8fac3a059143e95c95f5cc6f7e8d4dccc05fbcea8dbccb8a4eba/meta.yaml diff --git a/.vouch/.gitignore b/.vouch/.gitignore new file mode 100644 index 00000000..d8df5b67 --- /dev/null +++ b/.vouch/.gitignore @@ -0,0 +1,3 @@ +proposed/ +state.db +state.db-* diff --git a/.vouch/audit.log.jsonl b/.vouch/audit.log.jsonl new file mode 100644 index 00000000..3306eae3 --- /dev/null +++ b/.vouch/audit.log.jsonl @@ -0,0 +1,9 @@ +{"actor":"a","created_at":"2026-05-20T12:34:59.663398Z","data":{},"dry_run":false,"event":"kb.init","id":"0dfce4809698401cbbc490bf8e71f953","object_ids":[],"reversible":true} +{"actor":"a","created_at":"2026-05-21T05:51:53.568471Z","data":{},"dry_run":false,"event":"source.add","id":"f38a5315877047b09155df4cef62fdfb","object_ids":["06d8519f8dcf4149d23c8a48984541b2e9365ec364e7e58192e28ed149a2c47c"],"reversible":true} +{"actor":"a","created_at":"2026-05-21T05:52:06.487422Z","data":{"slug_hint":"vouch-uses-a-review-gated-proposal-workflow-agents-propose-c"},"dry_run":false,"event":"proposal.claim.create","id":"bc066c732d9d45a5a8038aebdf737a02","object_ids":["20260521-055206-7d6d92d6"],"reversible":true} +{"actor":"a","created_at":"2026-05-21T05:52:34.380239Z","data":{"reason":"Verified by source code inspection"},"dry_run":false,"event":"proposal.claim.approve","id":"119f617462cd4c1d9427148d7986d96c","object_ids":["20260521-055206-7d6d92d6","vouch-uses-a-review-gated-proposal-workflow-agents-propose-c"],"reversible":true} +{"actor":"vouch-verify","created_at":"2026-05-21T06:04:28.109538Z","data":{"checked":1,"failed":0},"dry_run":false,"event":"source.verify","id":"0f0aaac0a9d741edb7782a4b01b44f8e","object_ids":[],"reversible":true} +{"actor":"a","created_at":"2026-05-21T06:05:28.018745Z","data":{},"dry_run":false,"event":"kb.init","id":"803be831d1114cdc8466e85fa0b9e9b6","object_ids":[],"reversible":true} +{"actor":"a","created_at":"2026-05-21T06:05:54.067884Z","data":{},"dry_run":false,"event":"source.add","id":"0b451622d85246089a1d04c45d56c007","object_ids":["67478e72acfb8fac3a059143e95c95f5cc6f7e8d4dccc05fbcea8dbccb8a4eba"],"reversible":true} +{"actor":"a","created_at":"2026-05-21T06:06:58.649209Z","data":{},"dry_run":false,"event":"source.add","id":"b72feb84d842486490bb7616c616a08c","object_ids":["67478e72acfb8fac3a059143e95c95f5cc6f7e8d4dccc05fbcea8dbccb8a4eba"],"reversible":true} +{"actor":"a","created_at":"2026-05-21T06:07:08.973490Z","data":{"slug_hint":"vouch-enforces-a-review-gate-on-agent-writes"},"dry_run":false,"event":"proposal.claim.create","id":"9ef38f6a9d8c4e02ad3fd196c49bcc6f","object_ids":["20260521-060708-2b81cdab"],"reversible":true} diff --git a/.vouch/claims/vouch-uses-a-review-gated-proposal-workflow-agents-propose-c.yaml b/.vouch/claims/vouch-uses-a-review-gated-proposal-workflow-agents-propose-c.yaml new file mode 100644 index 00000000..3463f7b2 --- /dev/null +++ b/.vouch/claims/vouch-uses-a-review-gated-proposal-workflow-agents-propose-c.yaml @@ -0,0 +1,22 @@ +id: vouch-uses-a-review-gated-proposal-workflow-agents-propose-c +text: 'Vouch uses a review-gated proposal workflow: agents propose claims citing evidence + sources, and proposals must be explicitly approved (kb_approve) before becoming + durable artifacts in the knowledge base. This prevents hallucinated or low-quality + knowledge from persisting without human oversight.' +type: observation +status: working +confidence: 0.9 +evidence: +- 06d8519f8dcf4149d23c8a48984541b2e9365ec364e7e58192e28ed149a2c47c +entities: [] +supersedes: [] +superseded_by: null +contradicts: [] +scope: project +tags: +- architecture +- review-gate +created_at: '2026-05-21T05:52:34.267699Z' +updated_at: '2026-05-21T05:52:34.267705Z' +last_confirmed_at: null +approved_by: a diff --git a/.vouch/config.yaml b/.vouch/config.yaml new file mode 100644 index 00000000..108d471b --- /dev/null +++ b/.vouch/config.yaml @@ -0,0 +1,7 @@ +version: 1 +review: + require_human_approval: true +retrieval: + backends: + - fts5 + - substring diff --git a/.vouch/decided/20260521-055206-7d6d92d6.yaml b/.vouch/decided/20260521-055206-7d6d92d6.yaml new file mode 100644 index 00000000..a789088b --- /dev/null +++ b/.vouch/decided/20260521-055206-7d6d92d6.yaml @@ -0,0 +1,25 @@ +id: 20260521-055206-7d6d92d6 +kind: claim +proposed_by: a +session_id: null +proposed_at: '2026-05-21T05:52:06.481764Z' +payload: + id: vouch-uses-a-review-gated-proposal-workflow-agents-propose-c + text: 'Vouch uses a review-gated proposal workflow: agents propose claims citing + evidence sources, and proposals must be explicitly approved (kb_approve) before + becoming durable artifacts in the knowledge base. This prevents hallucinated or + low-quality knowledge from persisting without human oversight.' + type: observation + confidence: 0.9 + evidence: + - 06d8519f8dcf4149d23c8a48984541b2e9365ec364e7e58192e28ed149a2c47c + entities: [] + tags: + - architecture + - review-gate +rationale: Verified by reading the source code in src/vouch/proposals.py and src/vouch/server.py + — the propose/approve separation is a core architectural decision. +status: approved +decided_at: '2026-05-21T05:52:34.378311Z' +decided_by: a +decision_reason: Verified by source code inspection diff --git a/.vouch/sources/06d8519f8dcf4149d23c8a48984541b2e9365ec364e7e58192e28ed149a2c47c/content b/.vouch/sources/06d8519f8dcf4149d23c8a48984541b2e9365ec364e7e58192e28ed149a2c47c/content new file mode 100644 index 00000000..843271b7 --- /dev/null +++ b/.vouch/sources/06d8519f8dcf4149d23c8a48984541b2e9365ec364e7e58192e28ed149a2c47c/content @@ -0,0 +1,6 @@ +This conversation explored the vouch project source code to understand how the MCP server works. +Key findings: vouch exposes 40 MCP tools via FastMCP stdio transport, organized into read tools, +write/proposal tools (review-gated), lifecycle management, session management, and maintenance tools. +Sources are de-duplicated by SHA256 content hash. Claims require at least one evidence citation and +go through a proposal → approve/reject workflow before becoming durable artifacts. All mutations are +audit-logged to .vouch/audit.log.jsonl. diff --git a/.vouch/sources/06d8519f8dcf4149d23c8a48984541b2e9365ec364e7e58192e28ed149a2c47c/meta.yaml b/.vouch/sources/06d8519f8dcf4149d23c8a48984541b2e9365ec364e7e58192e28ed149a2c47c/meta.yaml new file mode 100644 index 00000000..5c4878e0 --- /dev/null +++ b/.vouch/sources/06d8519f8dcf4149d23c8a48984541b2e9365ec364e7e58192e28ed149a2c47c/meta.yaml @@ -0,0 +1,12 @@ +id: 06d8519f8dcf4149d23c8a48984541b2e9365ec364e7e58192e28ed149a2c47c +type: transcript +locator: /tmp/vouch-conversation-source.txt +title: Claude Code conversation — vouch exploration +hash: 06d8519f8dcf4149d23c8a48984541b2e9365ec364e7e58192e28ed149a2c47c +immutable: true +scope: project +byte_size: 539 +media_type: text/plain +created_at: '2026-05-21T05:51:53.562157Z' +metadata: {} +tags: [] diff --git a/.vouch/sources/67478e72acfb8fac3a059143e95c95f5cc6f7e8d4dccc05fbcea8dbccb8a4eba/content b/.vouch/sources/67478e72acfb8fac3a059143e95c95f5cc6f7e8d4dccc05fbcea8dbccb8a4eba/content new file mode 100644 index 00000000..4176395c --- /dev/null +++ b/.vouch/sources/67478e72acfb8fac3a059143e95c95f5cc6f7e8d4dccc05fbcea8dbccb8a4eba/content @@ -0,0 +1,236 @@ +# vouch + +**Git-native, review-gated knowledge base for LLM agents. MCP server + JSONL tool server + CLI.** + +

+ vouch — propose → review → commit → retrieve +

+ + +> Agents should not start every session with amnesia — but they shouldn't get to write whatever they want either. + +`vouch` is a knowledge base for LLM agents with an explicit **review gate**: agents *propose* writes; humans *approve* them with `vouch approve`. Approved artifacts are plain files on disk — YAML for claims, markdown for pages — so the KB lives in your repo, is reviewed in PRs, diffs cleanly, and can be exported as a portable bundle. + +Still alpha — surface is small on purpose; expect breaking changes pre-1.0. + +## Why this exists + +Three opinionated choices distinguish vouch from the neighbours: + +1. **The KB is a folder in your repo.** Git is your audit log, your backup, and your sync mechanism. PRs are your review UI. +2. **Writes require approval.** Agents file *proposals*; a human (or trusted approving agent) explicitly accepts them. `proposed/` is gitignored, so rejected drafts never pollute history. +3. **Claims must cite sources.** A claim without at least one Source / Evidence id is a validation error, not a warning. Sources are content-hashed; the same evidence registered twice de-duplicates. + +## Install + +```bash +# from the cloned repo, in a venv +pip install -e '.[dev]' +``` + +## Quick start + +```bash +# 1. set up a KB at your project root +vouch init + +# 2. as agent, register evidence + propose claims (via MCP/JSONL server) +vouch serve # MCP over stdio (Claude Code, Cursor, Codex) +vouch serve --transport jsonl # newline-delimited JSON over stdin/stdout + +# 3. as human, review and decide +vouch status # one-line summary +vouch pending # list pending proposals +vouch show # full details +vouch approve # → durable artifact +vouch reject --reason "..." + +# 4. commit +git add .vouch/ && git commit -m "kb: approve auth-uses-jwt" +``` + +## Object model + +``` +Source immutable input material (file, URL, transcript, commit, …) + content-addressed by sha256 + +Evidence span pointer into a Source (line range, timestamp, quote) + +Claim atomic durable assertion + type: fact | decision | preference | workflow | observation | question | warning + status: working | actionable | stable | contested | superseded | archived | redacted + confidence: 0.0–1.0 + cites: list of Source / Evidence ids + +Entity typed thing (person | project | repo | concept | decision | system | …) +Relation typed edge (uses | depends_on | supersedes | contradicts | implements | …) + +Page maintained markdown — entity write-up, decision record, session summary + +Session work block opened by an agent; bundles its proposals +AuditEvent append-only log record for every mutation +``` + +## File layout + +After `vouch init`, your repo contains: + +``` +.vouch/ +├── config.yaml # KB settings +├── .gitignore # ignores proposed/, state.db +├── audit.log.jsonl # append-only audit (committed) +├── state.db # SQLite FTS5 index (derived; not committed) +├── claims/.yaml # durable, reviewed claims +├── pages/.md # markdown pages with YAML frontmatter +├── sources//{meta.yaml,content} +├── entities/.yaml # graph nodes +├── relations/.yaml # graph edges +├── evidence/.yaml # span pointers into sources +├── sessions/.yaml # agent session records +├── proposed/.yaml # pending (gitignored, local-only) +└── decided/.yaml # approved/rejected (committed for audit) +``` + +The files are the source of truth; `state.db` is a derivable cache (`vouch index` rebuilds it). + +## CLI surface + +``` +vouch init # set up .vouch/ at PATH +vouch discover [--path P] # find the nearest .vouch/ root +vouch capabilities # emit the JSON capabilities descriptor +vouch status [--json] # KB counts + pending proposals +vouch lint [--stale-days N] # user-actionable problems +vouch doctor # full sweep incl. source verification + +vouch pending # list pending proposals +vouch show +vouch approve [--reason ...] +vouch reject --reason "..." + +vouch propose-claim --text ... --source ... [--type ...] [--confidence X] +vouch propose-page --title ... [--body -] [--claim ID ...] +vouch propose-entity --name ... --type ... +vouch propose-relation --from ID --rel uses --to ID + +vouch source add PATH [--title ...] [--url ...] +vouch source verify [--fail-on-issue] + +vouch supersede OLD_ID NEW_ID +vouch contradict CLAIM_A CLAIM_B +vouch archive CLAIM_ID +vouch confirm CLAIM_ID +vouch cite CLAIM_ID + +vouch session start [--task ...] [--note ...] +vouch session end SESSION_ID +vouch crystallize SESSION_ID [--no-page] + +vouch search QUERY [--limit N] +vouch context TASK [--max-chars N] [--min-items N] [--require-citations] +vouch index +vouch audit [--tail N] [--json] + +vouch export --out path.tar.gz +vouch export-check path.tar.gz +vouch import-check path.tar.gz +vouch import-apply path.tar.gz [--on-conflict skip|overwrite|fail] + +vouch serve [--transport stdio|jsonl] +``` + +## MCP tools / JSONL methods (same surface, two transports) + +Read (unrestricted): `kb.capabilities`, `kb.status`, `kb.search`, `kb.context`, `kb.read_{page,claim,entity,relation}`, `kb.list_{pages,claims,entities,relations,sources,pending}` + +Source intake (not gated — evidence is harmless and de-duplicates): `kb.register_source`, `kb.register_source_from_path`, `kb.source_verify` + +Write (gated → produce proposals): `kb.propose_{claim,page,entity,relation}` (with `dry_run:true` for preview-only) + +Decisions: `kb.approve`, `kb.reject` (host trust required) + +Lifecycle (metadata about reviewed knowledge — direct mutation, audited): `kb.supersede`, `kb.contradict`, `kb.archive`, `kb.confirm`, `kb.cite` + +Sessions: `kb.session_start`, `kb.session_end`, `kb.crystallize` + +Maintenance: `kb.index_rebuild`, `kb.lint`, `kb.doctor`, `kb.audit`, `kb.export`, `kb.export_check`, `kb.import_check`, `kb.import_apply` + +## Wiring into Claude Code + +In your project's `.mcp.json`: + +```json +{ + "mcpServers": { + "vouch": { + "command": "vouch", + "args": ["serve"], + "env": { "VOUCH_AGENT": "claude-code" } + } + } +} +``` + +`VOUCH_AGENT` is recorded as `proposed_by` and as the actor on every audit event, so multi-agent setups can attribute writes correctly. + +## JSONL request/response shape + +The JSONL transport reads one envelope per line on stdin, writes one per line on stdout: + +```jsonl +{"id":"r1","method":"kb.search","params":{"query":"jwt","limit":5}} +{"id":"r1","ok":true,"result":[{"kind":"claim","id":"auth-uses-jwt","snippet":"…","score":1.2,"backend":"fts5"}]} +``` + +Errors come back with `ok:false` and a structured `error.code` (`method_not_found`, `missing_param`, `invalid_request`, `internal_error`). + +## Portable bundles + +```bash +vouch export --out kb.tar.gz # tar.gz + manifest.json with per-file sha256 +vouch export-check kb.tar.gz # verify every file against the manifest +vouch import-check kb.tar.gz # diff against destination — new / conflict / identical +vouch import-apply kb.tar.gz --on-conflict skip # apply (default skip; never destructive without overwrite) +``` + +`proposed/`, `state.db`, and `audit.log.jsonl` are excluded from bundles — only committable artifacts travel. + +## Compared to neighbours + +| | mem0 / Letta | LLM-Wiki tools | **vouch** | +|---|---|---|---| +| Knowledge lives in | a service | filesystem | your **repo** | +| Review of writes | none | none | **explicit `approve`** | +| Evidence required | no | optional | **enforced** | +| Per-agent attribution | partial | none | **yes** (audit log) | +| Graph (entities + relations) | no | no | **yes** | +| FTS5 search | no | varies | **yes** | +| Portable bundle | no | no | **yes** | +| Transports | SDK / HTTP | none | **MCP + JSONL** | + +## What ships today + +| Area | Current support | +|------|-----------------| +| Knowledge base | `.vouch/` folder, YAML claims/entities/relations/evidence/sessions, markdown pages with frontmatter, JSONL audit log, content-addressed sources | +| CLI | `init`, `discover`, `capabilities`, `status`, `lint`, `doctor`, `pending`, `show`, `approve`, `reject`, `propose-{claim,page,entity,relation}`, `source add`, `source verify`, `supersede`, `contradict`, `archive`, `confirm`, `cite`, `session {start,end}`, `crystallize`, `search`, `context`, `index`, `audit`, `export`, `export-check`, `import-check`, `import-apply`, `serve` | +| Tool servers | MCP over stdio + JSONL over stdin/stdout, same `kb.*` surface across both transports, capabilities + knowledge-capability descriptor | +| Schemas | 13 JSON Schemas (Draft 2020-12) generated from pydantic in [schemas/](schemas/), plus hand-maintained `bundle.manifest` and `jsonl-envelope` schemas | +| Write safety | review-gated writes via [proposed/](spec/review-gate.md), `dry_run:true` previews, host trust required for `approve`/`reject`, atomic exclusive-create storage, path-traversal blocked on source intake and bundle import | +| Retrieval | SQLite FTS5 + substring fallback; optional semantic backends (`all-mpnet-base-v2`, `MiniLM-L6`, fastembed-BGE) behind install extras; context packs with citations + quality gate | +| Lifecycle | `supersede`, `contradict`, `archive`, `confirm`, `cite` — direct mutations, all audited | +| Portability | tar.gz bundles with per-file sha256 `manifest.json`, `export-check`, `import-check`, `import-apply` with skip/overwrite/fail conflict modes | +| Audit | append-only `audit.log.jsonl`, per-event actor (`VOUCH_AGENT`), object ids, dry-run flag, reversible flag | +| Adapters | Claude Code wiring documented via `.mcp.json` + `VOUCH_AGENT` env; per-runtime adapter templates not yet shipped | +| Validation | pytest suite (storage, FTS5, audit, source-verify, review-gate, bundle, JSONL), ruff + mypy gates, GitHub CI | +| Specification | dated snapshots under [spec/](spec/), JSON Schemas in [schemas/](schemas/), generator script at [scripts/gen_schemas.py](scripts/gen_schemas.py) | + +## Status + +Pre-1.0. What's *not* in this implementation: vector embeddings (BM25/FTS5 only), per-runtime adapter templates, benchmark fixtures, multi-agent sync, scopes beyond a single field on Claim/Source. If a hole matters to you, file an issue. + +## License + +MIT. diff --git a/.vouch/sources/67478e72acfb8fac3a059143e95c95f5cc6f7e8d4dccc05fbcea8dbccb8a4eba/meta.yaml b/.vouch/sources/67478e72acfb8fac3a059143e95c95f5cc6f7e8d4dccc05fbcea8dbccb8a4eba/meta.yaml new file mode 100644 index 00000000..6a5974c5 --- /dev/null +++ b/.vouch/sources/67478e72acfb8fac3a059143e95c95f5cc6f7e8d4dccc05fbcea8dbccb8a4eba/meta.yaml @@ -0,0 +1,12 @@ +id: 67478e72acfb8fac3a059143e95c95f5cc6f7e8d4dccc05fbcea8dbccb8a4eba +type: file +locator: /home/a/Dev/vouch/README.md +title: vouch readme +hash: 67478e72acfb8fac3a059143e95c95f5cc6f7e8d4dccc05fbcea8dbccb8a4eba +immutable: true +scope: project +byte_size: 10846 +media_type: text/plain +created_at: '2026-05-21T06:05:54.066529Z' +metadata: {} +tags: [] From 75406c6cd244d181ee399805e26f145ee4346f10 Mon Sep 17 00:00:00 2001 From: plind-junior <59729252+plind-junior@users.noreply.github.com> Date: Thu, 21 May 2026 15:56:07 +0900 Subject: [PATCH 043/123] docs: add 'When to use vouch' section --- README.md | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/README.md b/README.md index 4176395c..11c0d0e0 100644 --- a/README.md +++ b/README.md @@ -21,6 +21,22 @@ Three opinionated choices distinguish vouch from the neighbours: 2. **Writes require approval.** Agents file *proposals*; a human (or trusted approving agent) explicitly accepts them. `proposed/` is gitignored, so rejected drafts never pollute history. 3. **Claims must cite sources.** A claim without at least one Source / Evidence id is a validation error, not a warning. Sources are content-hashed; the same evidence registered twice de-duplicates. +## When to use vouch + +Worth it when: + +- **Multiple agents share a repo** (Claude Code + Cursor + a CI bot). Per-agent attribution in the audit log makes "which agent claimed what" answerable. +- **Sessions keep re-explaining the same context.** Curated, cited claims let new sessions start from your team's agreed answer instead of re-grepping. +- **You want decision records without the ADR ceremony.** `vouch crystallize` promotes a session's durable parts into proposals; one approve and they're permanent. +- **You'd review agent-stated facts the way you review agent-written code.** Vouch is a PR queue for claimed knowledge. +- **Compliance / audit trails matter.** Required citations + append-only audit log give you "who decided X, citing what, when" for free. + +Skip it if: + +- Solo hobby project where context fits in your head. +- Short-lived branches with no compounding context. +- Your team won't actually review proposals — without the gate, vouch is a worse note app. + ## Install ```bash From 3ba908804e7a68f37389f67530264e6b387c85d4 Mon Sep 17 00:00:00 2001 From: plind-junior <59729252+plind-junior@users.noreply.github.com> Date: Thu, 21 May 2026 16:40:48 +0900 Subject: [PATCH 044/123] fix(cli): honor VOUCH_AGENT in _whoami for consistent actor attribution MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The CLI propose-* commands and most actor sites called _whoami(), which only checked VOUCH_USER and the OS user — VOUCH_AGENT was silently ignored. The MCP and JSONL servers (server.py, jsonl_server.py) and session_start already honour VOUCH_AGENT, so multi-agent attribution broke as soon as you used the CLI to propose. Prefer VOUCH_AGENT over VOUCH_USER over the OS user so the recorded proposed_by / audit actor matches across all three transports. --- src/vouch/cli.py | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/vouch/cli.py b/src/vouch/cli.py index 1d38caf9..4f1078cc 100644 --- a/src/vouch/cli.py +++ b/src/vouch/cli.py @@ -72,7 +72,15 @@ def _load_store(start: Path | None = None) -> KBStore: def _whoami() -> str: - return os.environ.get("VOUCH_USER") or getpass.getuser() + # Match MCP/JSONL server behaviour (server.py, jsonl_server.py): when an + # agent invokes the CLI it sets VOUCH_AGENT; honour it as the actor so + # multi-agent attribution stays consistent across transports. VOUCH_USER + # remains an escape hatch; OS user is the friendly default for humans. + return ( + os.environ.get("VOUCH_AGENT") + or os.environ.get("VOUCH_USER") + or getpass.getuser() + ) def _emit_json(obj) -> None: From c1cadc66c90103eca705ba3804011a0969bffd57 Mon Sep 17 00:00:00 2001 From: plind-junior <59729252+plind-junior@users.noreply.github.com> Date: Thu, 21 May 2026 16:40:48 +0900 Subject: [PATCH 045/123] docs: add captured example session walkthrough Real propose -> review -> commit -> retrieve loop captured from a sandbox run on 2026-05-21. Includes on-disk YAML, audit log lines, and an honest note about the literal substring backend limitation pre-embeddings. --- docs/example-session.md | 175 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 175 insertions(+) create mode 100644 docs/example-session.md diff --git a/docs/example-session.md b/docs/example-session.md new file mode 100644 index 00000000..5f7e9370 --- /dev/null +++ b/docs/example-session.md @@ -0,0 +1,175 @@ +# Example session + +A full propose → review → commit → retrieve loop, captured from a real +run on 2026-05-21. Reproduce by following along in any git repo. + +## Setup + +```bash +$ mkdir demo && cd demo && git init -q +$ echo "Authentication uses stateless JWTs signed with RS256." > auth.md +$ git add -A && git commit -q -m "init" +$ vouch init +Initialised KB at /tmp/demo/.vouch +Next: `vouch serve` to expose the MCP server to your agent. +``` + +`vouch init` creates the `.vouch/` directory with empty subfolders for +claims, pages, entities, relations, sources, sessions, proposed, +decided, plus `audit.log.jsonl` and `state.db`. + +## 1. Register a source + +The agent (or you) registers the file as evidence material. Sources +are content-addressed — the id is the sha256 of the file content, so +the same file registered twice de-duplicates. + +```bash +$ vouch source add auth.md --title "auth notes" +816fec5eb02e8965df3197cdd622c394c8845364c584fe0fe0023dd0459e8982 +``` + +## 2. Propose a claim + +Agents call `kb.propose_claim` (over MCP/JSONL); from the CLI it looks +like this. The `VOUCH_AGENT` env var records *which* agent proposed, +so multi-agent setups stay attributable. + +```bash +$ VOUCH_AGENT=claude-code vouch propose-claim \ + --text "Authentication uses stateless JWTs signed with RS256" \ + --source 816fec5e... \ + --type fact \ + --confidence 0.9 +20260521-065702-44a92aa8 +``` + +The proposal lands in `.vouch/proposed/.yaml` (gitignored — it +shouldn't pollute history until you approve it). + +## 3. Review the queue + +```bash +$ vouch pending +• 20260521-065702-44a92aa8 [claim] by claude-code + Authentication uses stateless JWTs signed with RS256 + +$ vouch show 20260521-065702-44a92aa8 +id: 20260521-065702-44a92aa8 +kind: claim +proposed_by: claude-code +proposed_at: '2026-05-21T06:57:02.910715Z' +payload: + id: authentication-uses-stateless-jwts-signed-with-rs256 + text: Authentication uses stateless JWTs signed with RS256 + type: fact + confidence: 0.9 + evidence: + - 816fec5eb02e8965df3197cdd622c394c8845364c584fe0fe0023dd0459e8982 +status: pending +``` + +## 4. Approve + +```bash +$ vouch approve 20260521-065702-44a92aa8 --reason "matches the code" +Approved → claim/authentication-uses-stateless-jwts-signed-with-rs256 +``` + +What just happened (see [the approve flow](../spec/review-gate.md) for the +formal version): + +1. A durable artifact is written to `.vouch/claims/.yaml` with + `approved_by` stamped on it. +2. The FTS5 index in `state.db` is updated so the claim is searchable + immediately. +3. The proposal file moves from `proposed/` → `decided/` with + `status=approved`, `decided_by`, `decision_reason`. +4. An `audit.log.jsonl` line records the decision. + +```bash +$ vouch status +KB at /tmp/demo/.vouch + durable: 1 claims • 0 pages • 1 sources • 0 entities • 0 relations + pending: 0 proposals + audit: 4 events • index: present +``` + +The on-disk claim: + +```bash +$ cat .vouch/claims/authentication-uses-stateless-jwts-signed-with-rs256.yaml +id: authentication-uses-stateless-jwts-signed-with-rs256 +text: Authentication uses stateless JWTs signed with RS256 +type: fact +status: working +confidence: 0.9 +evidence: +- 816fec5eb02e8965df3197cdd622c394c8845364c584fe0fe0023dd0459e8982 +scope: project +created_at: '2026-05-21T06:57:13.947450Z' +updated_at: '2026-05-21T06:57:13.947477Z' +approved_by: claude-code +``` + +## 5. Retrieve + +`vouch search` is for ranked snippets; `vouch context` builds a +prompt-ready bundle with a quality gate. + +```bash +$ vouch search "JWT" +[claim] authentication-uses-stateless-jwts-signed-with-rs256 score=1.000 (substring) + Authentication uses stateless JWTs signed with RS256 + +$ vouch context "JWT" +{ + "query": "JWT", + "items": [ + { + "id": "authentication-uses-stateless-jwts-signed-with-rs256", + "type": "claim", + "summary": "Authentication uses stateless JWTs signed with RS256", + "score": 1.0, + "backend": "substring", + "citations": ["816fec5eb02e8965df3197cdd622c394c8845364c584fe0fe0023dd0459e8982"], + "freshness": "unknown" + } + ], + "quality": { "ok": true, "items": 1, "warnings": 0, "uncited_items": [] } +} +``` + +> **Note.** The default search backend is literal (FTS5 + substring), +> so a query like `"how does auth work"` won't match `"Authentication +> uses..."`. Install the embeddings extra (`pip install -e +> '.[embeddings-mpnet]'`) for semantic matching. + +## 6. Audit trail + +```bash +$ vouch audit --tail 5 +2026-05-21T06:56:54Z kb.init by claude-code objects=[] +2026-05-21T06:56:58Z source.add by claude-code objects=['816fec5e...'] +2026-05-21T06:57:02Z proposal.claim.create by claude-code objects=['20260521-065702-44a92aa8'] +2026-05-21T06:57:14Z proposal.claim.approve by claude-code objects=['20260521-065702-44a92aa8', 'authentication-uses-stateless-jwts-signed-with-rs256'] +``` + +Every mutation is on the record, with actor and object ids. + +## 7. Commit + +```bash +$ git add .vouch/ && git commit -m "kb: approve auth-uses-jwt" +``` + +What lands in git: the durable artifact, the decision record, the +audit line. What doesn't: the `proposed/` draft (gitignored, since +unreviewed agent output shouldn't pollute history) and `state.db` (a +derivable cache — `vouch index` rebuilds it). + +## Next steps + +- Wire vouch into Claude Code via `.mcp.json` (see [README](../README.md#wiring-into-claude-code)). +- Open a session for a longer task: `vouch session start --task "build the deploy pipeline"`, then `vouch crystallize ` at the end to promote the session's work into proposals. +- Export the KB as a portable bundle: `vouch export --out kb.tar.gz`. From cbe911bbef222e54e3ee83ecd6b900c820db6e9a Mon Sep 17 00:00:00 2001 From: plind-junior <59729252+plind-junior@users.noreply.github.com> Date: Thu, 21 May 2026 16:51:28 +0900 Subject: [PATCH 046/123] docs: add screen recording of full vouch loop (VHS tape + GIF) --- docs/demo.gif | Bin 0 -> 1524943 bytes docs/demo.tape | 86 ++++++++++++++++++++++++++++++++++++++++ docs/example-session.md | 5 ++- 3 files changed, 90 insertions(+), 1 deletion(-) create mode 100644 docs/demo.gif create mode 100644 docs/demo.tape diff --git a/docs/demo.gif b/docs/demo.gif new file mode 100644 index 0000000000000000000000000000000000000000..617ea1cf4d2e4671424b720952c0fe7b888831f4 GIT binary patch literal 1524943 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ÎN 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 hxSMNGvomaUa;2n!m}}KQP;i1| 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≊y@LTk8=J!20SR22S#Y&H? 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�cHcBRxM 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 YJW7MIq+nOG@yq?eRB;3^fdM;r2?5+3C*Y_^% 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

^1`TLep|-}rksr?lPcN1x=m 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�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

  • 1KID{_Dr@@VnigjHH+?63GbqT^H95XRbZ?BHFnk?wn6qOKydmQw^_Xdeut; zk4?lmm=Z`xN+(~B$7cVNK<5&$XZm1In_pdnzrEXCJ?4>JE&}Nfrm4cNgLprsWy0Vz z+yahl`oM#0XTwt)*=ns%(b*bmm0NtW*Lc>?jNP(Zteu@xkygf&SDo5nl%X_#&PV$Y zM&r@Oq8l&!`$wbqXEX%b!Nc6uDJc1{C^TZE)2`;LHz8T!Infc{f03}D>dDona{mQj zuAp&dhL8}-6T8G&ke2B$Tdmacarb!ji-$XHF2Pt!IUrx8PP1tS#8wG2RPv>*4MAGV zB+rETi+*->K1(&nNBvotR$TB`YhW$kJZ5--ZWrC91tGwGhN0e9|VRu*PJ#PhP!qJ#@O2Yma?Is1^&J4MX63}MG{i?Yt_Po6daO|cd6~5$87cOV%+B?JM=A(ooYB( z*bI;|g}W-Q>ygS7vcw^EQ(pkE)z_bFRST6@vHap9^wQN=1Ez&?j+MoSEq$~CgP|4q ziuQ)x@*0OJN9hW`MWHoN&t>P2Ky28PUeYWsKpSRUoAX7ytpEv&Q|c9AcU);@aghX$ z_pO!Ync5`oVO!nv#E+ySPvjTDK{j~O*X<8-e{Yz+nP|C8U^T`M-5{CerW zkLLrOO)SWwN=NSWns$VWvRXOnQGbi8OQO=D5<2Z!%dK6tf0fifpVq?Z5 zS>G)_8S<~2-;c6c+08#Qd#pa?2S}Rpuh_Z!7%|3FjcoPv-EVv(Tyo}PT}?wb?*iCe znVT$s706f`x-2L3Di%3>%2cy|m!A z<$5>kJbeY!!z#_-yd(!`P=T!@_;l4vY6hnceNS1p$eh2Kkd!f-!5Skjj=N0B{rM|& zPg9>c>~4QXb;YS&0A%M6S#>e4xS!O}acMbk2k%5$81NXDiiPnXJwN@K$R5WzXH&i& z_4`5qN>=7t-x0;Q95;w<$P(-E2y~oEjdE1xI&P*9QERJLzMj53KTr_m`oRPRm9B#l zYf16uX41Oom#DE)h0jvN_$cghe8IlvHz267jvI1Z&f_D6>W0^sg_gJ2ijaX`5;sF@ z@su4q``yU4B{1rBb%Tr{j?eH}Q>a)ufOahemZ}tMO;8mb$y|}3c>`4@NW@bt(H=z@ zy%i$d@>;0O2n7ixvkM`S0jlE4&7oCdF9U?+81FX75FpZ$CrP2tU1O3j(M$3OD2iIP z+JMfXV@}T(V{2t)N(>nfAVlOc4d8-UsY zCt0kLS0FwdUa^dewuZqFynL;n|2sSBTsA|FA%-Zq%~wp>m@fHYEob{4{H^~EzHGCBiOrjns+#Y@?W@QMBsx*~K6%v9qNM?qE`R5B%@ z8YHU_Oi>x4=)?HvYod8*5=&ZPf)*I1MI2lxThddnwlLN3GeEQ&QzgXu6~Y-+iUJWj za8$m;8i)fpAsR`pKoL7284iFpPGJ#AGrAi#Q$+H0aZ*=6wm~HG=fW8Vc{BiW1yG)- z#x_H`YC`7E5-;K@1X{5V&s~pJ#AiT$8o<6=TTMkSa#MJ0UYuW;z*`(YdrvHGXvrpQPHrN!h*_#7jz5!4xG=H2gbp+0tr42 zwH!HwrK?dvN(_$+dc*Q6k&I`=ZmN~qWPqWG7^)t z1PpM{h=WUDi>;<``lE_$Jm$Z4?Vz#KJHYydbSdA>^QS}3g)$siy29B>+I+V%Jq+PJ|m+3~>1nW}X_eVN^C#4VxD;aEUAlN{wARfkBBd72Ps4 z8(1JvEEy1A2*=H0qpErUUp6iW@hxh_B`O`7fhd+(s#01~h-IoJi>II^T4{VCwu&LQ zoVu0z1f;N}q0zW=p%QB~oW{UqDW&OC&}uG*sZ0t~LaSNGDt*%P*GV%FycK`PiE-!K z5GI9=s|XMd z1QcS|Y7JC&O|(dAPT-DK1_KtnhheaUogqPK(5pBQQwiF0L3_Qp|CAie$lSogTE*3@ z6+m4{m=d8PiVjClK-sm@Fs|n}6USi`m{W*L8I^cz@p^B?Og!vCS1g~BOy|jqU~D2w znmHkmcDe^+<>eXYm|C%0H|&BS(>xS4LtLnphqAx|r96}l&|4vHtz=;w0`rch73v(d zC_5OWW&rMSM-nzKpL#?0)CWOAAb9k_%v#AGYa84-68tEz%mjtUVb;P}kULPx!@ALz zRj{FLoEyuMB&YwAO!HCjxywE25(g1%+AFiH5>(V;n0oK&opqE9Oo>2YUNs7BHq9s3 zV%OA49ffc@N0Ewv&>Y2*41iXM5sk_m4X|Gvw1zF%GjV(Jm4rPCtiUV6jDQCZ67tYX zj8J?A;Gq&!32`Def)dGWYY78-vGoA3AW>1l!Ob59>0E4ix1vgbD^+5A3Q;UoQjzAi zxAt}=jCE52zJ-c>{GF{!YaLkKic&>m;viLpE{MZzsDfg{@BzWN03ppzE#|Ut8;rRk zx&m>NsmP^9qREv@nHog#MqpVvqJH98;GzQA+()P%)hO#YX!Qj0RZ?V{Kdlf|cgjMp z0&Pd7!*H)F4NFoygGhoH@o#2OK^4UB|VTL?RAD+j9xI)Qdjly?wZixuX z6doO_U%vNZ(Pak8ap3n>AB=OYgszYNIY&aI50%!+GLWqq7$)kImL7+<@^CrE+FWiz z=XYGzD%p%HAn1`teFV`~fT?Vph38n&h-8f(ipK-CLfoZNU>O@XUkjqEuxs&H6pUFn zAVb4|+2x{)<(ykG05+{a@#KnZqr|NiEL5JMPQd9fv`{V2g=?x0%ZlI{48oIF0VI8) zZ=g3?2rO4gvu<5#Op=8oDs`cFI6d>pt;=&JFIQF-hjrt!Mp4rRNAOF@lqoQXCqXW| zpxnqQdd=Dv8G^v_>lhMgh^qaiV@a zf1t*DV#OSjJP!a_6BZ0Z?@Hdv*%@z>!W773f?)hWU`sjzADR&n7eR`*6)dvalC^+d zBleq!V8b3Jd3HwO3cNh93cyU1GVvenGNQ^vD3(Z4vIBPJDe~AMmOQAW3hhw{RZpS{ z3gtVg_rv30m%mF5E4*}w8YsNjnpR_PSpMJhnhou{ zgQ<*P87R+PYhksX}MnsUg6pk~Q}Zc8VR8z-%Q{q6(!U zOJ8TivrO0x8tJ1~2boo3=Zdf3qE6AU#S0>{Scp@oESr zNfGbO^lr&?JYd0vDj4A*6G#UeWeH2?EEi|KD6sBcBittWv89`0jFUNm1p_sfY}6HO%?bm=10=36`di@Jm0WSfE(BQzJ-X$^0I~uD*1VP2 zWfWS`;aPfleqoI_EPl1oqOBXqHe=jasHGAh&j^KT%9v&pTP<59Fdn{u_T$>JgyQr< zoH>3kI7@`4)Pf~?`E0y+Hd~Pgqwyx}wF;Q9T^_+kB~Qth)}p9YsFmBdDLvNS`SVBh zrRBl3Fq^(vy(J!%Uu!o7FC4%<_W@m1p!!2Z@)WLY0FAtd!~tb|6L#aMEJS-@D?@?E z-AfFza4irgs<2?ZKS}M{WC`YK<#Dy>KbZ1BEu3D3D-*~{p38yuDtUdPoJJ+zl|9AzMe6Cl<<)r?tOuwFMyG#43SRkzHtpaAL(+k?gh=)iZ3}kA|t4 zaZ2lBr3I0@NZGzYwo6ZwD)VBMwQOTr=b_~1$5Wl-65FQxE;?=AFjyZ{^jY9`cYoN% zm}lVYF`DpM%%q`XNb6R07s_b~`49`W9e#Jd+U^d$HvDw%#|_g~Gpy|W3$Gu<DS9 z8!Yg6^$085xq9#!yROrky`Vm5g@%PaPVHV@kh=4`8;TJ!zr5-XtC+X-3Vd(h?a&HE zJw#Dz7@bQ-UmRIXB(ghzk6_l^Lvv3!> zsc-hH{15y4!lGMBJsMcQX1Ein^M4HQmXHEQ)itz8Mu*fYHN)H?v&&U=$Q{c^I}|Pw zMrW;iOGc+OP^#ryd&l@kH6-5BVgv!Uyjt#^A1T8Yu@%U4;w$}*#BH1jVU*9?p8F)E zTGosvI^f5tp~u^E_-@x#sS>DNh^{5i2j-373oz*9*}bAbk|kxhyeZJAKSgrlBC~5D zkMi%|3D{~BM&r`Iq~0P##lO~0e=?A_&0`7BF+|2SrY6sN45S@ZqIw}Q$sanXv zFZU^nmXJb=qdc!`bLs;MRWEN@IaQ=I?&%l0ld{9qCW!Ot!P-X00KFP?9T`C1^%v;{ z^ZYNgt1mMjS4Cd2#ChCn411SfbAv&>Wsw;ArFJ3FX7-P@GZ%!Co3C>}>GS@NqI-{P z>Hp&Ze$MXqt@~}Ot$V4gRMw5Nts7D+NeEk#5QZeTud}V2B$E)5bwNlbA@t>}lH7+7 zl8umDzH{$OU;CZk-}`6hv2)JO`FvjQ=WDAKW4M*ZX6G3b#x0Isg*fTHjokKMp+RP` z!Wz{W`yTGr>Fx;v9^_g2=tH#CZ1L*pkx!&YhZbAg8uW!J zZUTcD0GlQnqbYVZ@@@(-9f0qpFzwi+y9%R61Q8T1x1j}JUuz@fg z5V0cD!>KjE$`B2QmCC|UHeDzG7{?{ex5rx*YKrLaJjpkLxytCL$Iy}MIO1W9(`ta4 zj@FQs$AhlHb?%zgAT0>Gh|lFyrfCoTL`BN}3lN@~0b}R)b~v^h(Dy`irRu1-TM<-M z&-U<{w&cc)`k>vGl{HNFx9#>TB4pTmP4Of+>^h}T_C|1>%q7^6RU%gAh3uDdp zNvjBD3E=!H*Ko<=i3)OIsbQCE(9^?1-u04+<{Pc^bYc>rrb&C}B<`xTYOwQTBwX#n{aBQwHp}17{pXl!)29h7 z&KKtdY^;2^`qPI~K{Jm6#v9WXdZucbj!iL6Cua5BsXSfsd|BM}4Z>rUsjC^uO{$=2 zGq{GJ6XO@T}RSp(w*9orq1wqpQM6LyC(JQSNV_k zM2b%rzT7yU`hI#(Qu=uHy8KLR*ZE%DL*3RA#K?K`SU9?tMK9(r4B%c^8JEUy!rkI| zPL`4S-0xMqo5edE{6ts&d{OnZU>Vk}?`Bf%goE#IJ$seQrKa|`$gll=+Tz-`$8-6T zLt8R$KK6ZmYg=l)F(Bv<}v*Kez2Y{l+?nkHHFMQA@XfeKQ1!coMU4<)) zR8ZwdIW_ZRCiMo+s#;1COY)=hv#vzfU~M9999ULzFrAQW+xwX_tlg9w^7Iq5x-dgW zY1L15OqhG!FeGBEqehR%6MpQZy>~LmT#Qa@-8%8XMQlFpzw|wAzUBadGOMw@299Uef&^{ zV8v&=%eM>Lt0%SHP;r;m0Yx95$Fwo5Pfm-Spu4C3)ZO^LC3D)WoR1>p94^{Gm$iX? zFYqT9WSdko*srKl`O5nt3`JO#*mkjIQ`W-eE5PtMmLE-pmNi-&)3eKQar}#1*?<4e zG%v(&RhM|xYr?Z#c$nPk?X6!={#g1RTHRy&x0hD`(M@B)yp0w%z|acr%?;Pt6W4$H z=jx}ii%zMtce81=YKlBsN$UC>756~DeO{aKz`uXC5+k{a7%kQ&nvdyxb=*|6_mMGJ zi{YmSuJU*`gTxgE8AzX{FM9lYv)9+y7|fz^<-#5gHz^WVw8R!@Wiy8`q1^+w&d!S_ zEg*I%f(n&)Vss0*LcUb&jG|`1L6HDTgSdXxt_~DOlnEJ#jQL8ugbfgLRzs2x&~k3|4&pPesUrh|Q2&GxkNYV}--x zqU1uft$`QUNM^zEiFug?|toS7bm!+xCOpBQOPbEm)XIDnw`qLhS&)4(|p# zlwtOwhj|3wO!J+xYM3&FJ9iuM`lG_d1H5vTmo;de3%WRngEb&=l-qMvP0T`Q13Yeh z@}s<$Uirm1lOmj7=#VM=efE&^qCL*5Gsne(Gz9v+h;9vm^kIO{KygVW4FYkLOs`C# zb?z+s2OzlhrAur#N%PYFoGVv(gR|TD+}|*xxs*V1ce;}lEy#Lgs5_7LOcx^5QKKcF zJ$wvsuawPaZ3S}ypFFYq0QAnM$a}Ev;Y7l}0QH~y8d763 zr+sm#3Tw0vSTrh~`x^vphTNFj;mMZ)XV2I6gPG*}&|~Rt~$czRWszUONJ`I4`NumtD1)#D~z<^H~lWX16yyv zGXJQs3ChqMRrnY-v}u}k`wV_+mv@b7QfU__8cfo5O^yU9jf&7QjN>SPZ&FSy=%gd% zfgR%LF~#UTz=^AhY7r?U&wxLrn zERLj!T{O_K*QzLq*r|OUty~!aiz7(lFciKND58hZelB;;C_vGI0X1Dw`Y!%}&_V#Y zHEsp^p-n*|hM$u46l-x`<{SQ4u~B`U4&FLj4@_{MIEsdSm;t$_ibG)4q%4&O z3nW9zsA?aJmnx5FA&I7p=*Lc~5@oN22AajkZgo0vr~Br0?cQ)3PZRE}JvK>?eupyW zcGaXl)$I>%_=L`otl@wJ8j&Un$-xTxu)!9>gthQ^DSDwnb_HVpcA-T9(tis($q&n| zK_=HgjwZ|@XVJ%M$YInh3Lh4SA(%K{`x8 z&9m0M86DY8c~6EGB_Rll))~<+jvD9;bQOjUV;%@7WP25#gb8H7XMO6LfKF8)unSil zX)W{C05M=uO2@K}JMSw*kRx9_X}F6oS6B+l$h6LoesP#JHk^$<(+MYJh(r5Sk%+SO z9)g!E8+y79-heG~uZQ(_1?T>Vm3qypnJ#LjZaVtDDQsh@^Y0*Z1VoV7TxUl)RioNl32-O8wRmAkrAFeY*$ zq38-WQr_uapbF9JtW#kdZ&j33<<9N&!@Zo`E%u8pj4Vs$r(?OS_p_WagnlqsuJQ^N zO^|oFaJL85U_D1~MVJmUN1vB|&LFy{50DiNxe&Ll>o`g2C&jeRM40hSay>wF7mZ86 zIQ4h#E7jRl!*p18^Q_S6FTkf=?8onlXcGlTVjEJELB#x?mwJOt!;HPu`IdM2H|sza zCe(P>8&*}XK$xhJtL;QZ65HW9{99ci8L^R7q6a9HY>#!T#w@!pB$FD#OOQ@{&(8(^vpsq8vPv~2Yamwx7UZ};%wM3P6d!UZc z4Y?H_coZZ&SR)P!)`lB8?R!lEJ>MM?3*whpckAV)X*Qr(kPyer5s$9{EqZmq)?GZV zavUGSu!kMuRTC3Lt^(D>F`c2dGptm^DOHZMuAYuRlw$)sXNdW1kvlr;P16zFb-sDn z7hxrgNS${Z#@QVcl&9h~n{^bf!fsR7_-{G~Ij9$QhDKuD#y$k;g%+dkV-5qBtQ6Xi zGQ3IYqQ^uQDyeyZd%4PQ2=r{nTtn+FQ&oYRR{LtFHt-!*S@*Z79bU&X7wYPA{-)cUGzfj0RBvRkTW(iSI>x^rD|6J1 zeuPnSiZBL;kZw>Rm~0T*?}BLVodRvAeRJV0^q`~KffUJ ziY}+>FHZd;ff}?~gfMfk0Xaso-f2Bib)N#^?}`AmIfr1SAf`gDy$dadlNaMu;T;OX zs4gt$J;hrU*r-E?4ZO3&K9K;gACDhHeEm)^hhSXkDK8Y-#(hpPfyDUKP03y zBlZ$dc{vtHg?%;R(U}OLd!diPXc?b~k4CsPVxKIqJO^Is-ic3D1ZIid6W~%+0SuTM|x7tzLbhBjd=%O^VBm*{p`C z)i>cGYrs8E?3=4THzkpvhNr}KTGNWIZ9u?0z^NJQ+YGua(S@R7wskhC85qy)av2Nt zDpckCM%oD;K}-cFPvu)<25^Nys9zV-*eT#*C}_^ z{}s@z2tMB#GN$k#b+N|+$2AKe||LoE`wpo_s4a?8a&%^)>FJbsf7cr&$bPg83q9fzIhC z_}~t7dI3ZY7XI=jI~FL%r|R6{7ZXLWOCHuQ3k;a*Ilhr=0ipH|>6WK(y z?Sn3CTkjT*_^8E4*BzpL)CKn{4|Ik7_g|M~umaZ$-a1!6%N6;mMM2#vzgXBduPZXu ztn!b?M%@xIc35R@`>#LA*nV8>OagqWu_XcU*=P|p9`Y;3fC-q0TS{yp(EFk@XPq#p zpvxhveuF|09j#bo?&1g_#|*5$A2_b}ErtvF4`3%5x^~w#qvv+;%4Sz}*Z1sGED0{@ z65Z(BX$9&N9?{4o5Rm3gq7W+PhnAz{C`-ry9<%2cz%exbQi#G_ec;v2rTe{gyN-8 zP$|~31DZFCu^a<}hr5nF>YCJz9Y;epe^BCq?&9gg_C}0L=ZhP#hn5%S-u~Tqy_gdwIp z-6$gap|&Mq{w7zS)ds`&OP^)9}{lBaUpr>jRSRUL&3((PJDo)*tiO zVYvsukm$}?#Rn&6>18EewSrgJsV3QBrMp2G$MQtr9xwKOx%Z`nkmpqo5~KdJ?vuoD zcK4-BkFt4~I&1(y?fx*T0K~;t}WXthYM~Xc6_sfW-zN0!P@~I{so-TLrsum8a zV;x7O!uj1zA`*CETHlL3^Iz?fzN{mum^mQPN-#M3lRA(K$<4Ik)Emk3e;|Kl{YT(75}_ua~VKRXHuyU@eDb*0+(8iGN@$U9!VUms9erb^^wI z7__XF;%v1IoKFQM1ird6IKHlYb-$|vZ*CH;{B!N-*h0LoR_TV;@@=4XVdD5YO21l| zP_82fqkp?r?TEN^n8Y+MEgt`rUqnf7a@x_3p+a>Gp|z3vNJ2Q&X`)*lGdgt%q8-1e zOCoYKl-vB`@&f7MN!C1)pH}7NDckCg25pEhyF=RUQF8rW(Iib%c1dLxK5I2o`+Kn# z=d>6SN#u04T}MFNJ^gZE`eEu-`};%i%;;5=2#tb~Edl-eS~wr2SO08=v`>%9*+svf+bd|fc*ezk5x;^xP{JE`>vy(Dqf-ls1v` zHAsd3t9a`cd)W4kw)?ccj!J?Ms}cArJy=?_B#=b9iB%o>%d}(B7#0m}bO+0KZeP$` zhaES1%^dnCP=Qu6Vc2@a{psheRGQ4{pQgQ*ro*Q;J=9RvS7W(@EK+vq48k;h>g7C> z(w)`7PEso@5@BT%{gh)uhms;flT+?)Okxuzs9r{bMVhPuf!N~DXD}rP%NTz~G)}(? z7bnVO*Kt)$B}?IwiajbYfPtMdQo|~-Ev8iH-)G@K?*~>-LOMNo=#W_I$E9aSF_!hb z?ZH(L!7d%9B|@RIx{EB?7e!W~(8Q!@vMXa}X?Wz$qT&pV<%{YV3yB_OLm}KLX`B~L zt4L)hV#l>__0nhyJ>vZ^YA3AKCM}qmg=JCsit%l-t+)5lm*Zsa^rdDAwlw)+@C8F` z+AT?9IApBxgfP68)8!$2sm%z2!+f~_u-QU9N3+8=QMf}aNZ##Nst{$QkK^=7Nx|4oS~Xv^IQtfypPd=*{h(uCx|rZ9CFID_7I%AVT8aVqIJMCEj8;M4pS(Rl zAjRK?&K)jun7(q0(}2 z7?V464zEYCMFUIdQ~|Hnu|L&s(73=+4pDB&b$ zyn7*%zIwaoAjNm1A_z9uTj3|6&Bu}yTY;*);E3+eM$|0DW_zm`bJhKX{W7}19bL#99>Me@^rhAaWzhS* zbsGQTs@|8N2e-4Y8GO7V?={en9v9dy1(Um7nRIUSlRJCP=@$txt0lz2&m%b$9G7NN zqlsY?hVcz{81}{!O-NY;-(WpVx(akkD)O7UagIorU_~Ih-WEs#(aFJYX&4H>4rnZm z8?WYXT_aF2Jh*e;rW;0|-{%s;G)q}98YJlLvcz!llQtL$t_GgfA{g=P`J9C9)j648 z_F^$O*|x-9gs>|onutKOf-xQ?ot61baY@A>xsC51hj#rD&+ppv9f>PTfY@kxwr1KEJq_zwLQe=~8U2a5wTEhl6l6pxqG-j*WO; z)HxUsMvvmohlFjglpNnUp}5F7OYu5`XJe3p@kS?ezLDl_9UG~0)`K?no^$r=oD$)r z)l$NIXvVP2?h{1L&;qM@F5Nm-sljTN)bcow(`RIN8d(x4i7Rt@spI^)H@#3wOhJ86 z1NpLsu$oH>k0Gs=;?4g@{pvV(glrLSY3np*3vahXK@CTkRdr5?&Y@4?M61KIjgI$q z&OhonXs$U}V{@a9F~`U@aBcgHBzq~-z~e`cxa1h{V}QdAp;ML7-9>?gEro3gC+#Ux zHbndjvHK?D^z$s20{9vs`y!0JVPF^Q(7swSWORIFWDm(4MgXj59eb$`6L0wCu1iVL zP;y@p~WMWk?LkiqUB;-HL0p@R6zAyagm|fSn~amN+Tjn-`RkSSBZYIjkx?ea-$(3wbnZ_S zHpLn&*T{aP7b$picoDgrOGuQtNOgoZh4VQN{Ay#u zSJ36D!V&kH#6`T{@D7~YYH>q1EzMx{611vzjhuLxFdE2lHsX{!vGcEcto+I<1>|3N zE^kojQTVkUpta}{%2uCMA_O@&J@5=8+}rt-&D=9H=bqm^ccKSr5MlO6siG#z7{GuK z+ZLYH7-abeIZX=aT)MrH-Yca>``~jm4em15 zA1Mu(KtLr;OBsVzN7n+GIhCGXmhO=r3o?5NCTS+qNUOMy4>r)nRtXVj!9{7WO=p z^UN|U$nglpQfL`&q-DT_F92&POc4EGG{NNgTtal3!Of^ zmhL?I6qxSFvzQ-h%~DX&N#Gz2?Hern&86lyQRhEmwuBZm)gN@Pvk2GGbEKqxm_?Yi z$W2Dehp~Ub^N2=9E8zYnG;|h1LH*VGBWWQX#rF+sz5*7g_q>TqxW%>L>lXOeH^v+2 zo_j19GFs!2W&hf;TDg?&zPT#RKL_;Nj-THBNHtg6#sKCYm=;+?R!XtWh~*s! z{{~{!AovtyjnK}@)krHhkRp-I6MnM(!jf@yj4UbsjV-+jh};o8qp*oKW}ubl5wp3O zN&S|3=}E^$toe_Y$pjSFH2KLrs?o#LZB2r;P0bNlQC(M65(4Y*tf{CuQ7|H9t7e_aYM97a{ztRUk4u&Og+g2`vT z?-Syet%PR8?!%FV6Bg|~z3;VzOKei^+vsrM!M`q}H})t_93DGz_)lGS;gfylx|O~T znWIa|XRrqjJRz>29aw&$(%<1){*!&L@UFHO53|D~l)!ndYPEy=mwgQv!cMFUB60U)V=u1Eb;yi7RV`dZ#LZc-s(HWS>Csiql@7mf z{f-SWv_0$TXBR#_;Y zoCy_I=FV6eV!zhWH8srsZN!xWPFEJsy4>*lQk>J@|2kA0jJW*q(v|mf5u1S%KO<)R znR~^p=E^&#b655w!i`trE_LzELs^MA6p<`j}3)3SJCv>AILpN~~a_w2G zA~196;mc3voRB@c9@267jF>Ysta~>5{LO(|ciFdZpM(IRrQUF$?l=AhWI1Bkv*c6t ztfE^pi>@E4xkBG`Y2T8)@19h1Gtb4mZly-uwmLX>v4PB&S(_zwj7`$Q7dxwJ0cL{G z2A!a^oOAE{+?x@cKJmQ1xOulNzGAY%iJD8$9B%u^$k(ZO{G{A#-`N*dcHI4a;KHsa z)t77fHa>qm#iQF+gHQ8?eC81wKVZB8Tq3YR%(=IP^R!{!)1y(HRU0n-{rkfA7*F=g z%QGEZvoM+Mn;*SBkks`1kqLd2SXh-C6;Y8-UyFLb5Z(_JIHcs3!vl}!UX%X6D55bZ z<$6rUvUyRD*KU5wbT(cKzH3!$bQ(0eIKNCj{B-Bsg)>$>d!2n%1q@71UQrPFV*ChZ z|J7Xf_UC5ZbB=OyE@YEn-1d3ivF``Tl@pkGAZrg`a3fqX-@DX*YTjdi-fHaPsC21H+0q)6Ln<4cYR&qn+__han4bD1!JYTB32od2W4jIO;DB?n0woZJx3 zGdfCnpriD?@!543EcoN9PZ*Oml&~5$8Ft$pX1RLHh(2S-VsX-U0 zsXXhnO9W5QZiCPUmDF!NvT9vOsEiUA|841AHt3Z8zww<>sqJIjl^f{n9$C z{g&i-h25h%cCFA}Vnl&@GNI0Du-vBBpo;0$ZT1tE4)mUGxVD2UE@Mw= zZM?qAd&cpM>#c`x?seGLMtIm$9bSlEN9Tls_#qRejDK|3$Exbfe*;~ZD&0{-eA8Xt$i z6FTLeA?oy7dc5mAoT)4DkQf%gj^i5Q8kFLv^KNO$hT zmz(@+eqV0|KfZOJ7uluOpB4vwSNLmR8(WCZ27BRRA+ciXs$$_S_$V;Ux*k>f& z^7PSHh4%}a9IY4LJ|@jOGtEg<11N0vdC%D4H!C+##TfVO!@qAeB>}&N8~1*?Pt!fD z(hXey<0sK`a&$KZ57}$3k~|F{BV<9hmK@cLb`YeJ4;m4)pLxwh$CaC8ic4pzxEPOb zzt)Fd7FJ7Q9oRT6DXJ;Uq6p_I*maBJQ6nuRwUvG?0ixU=R2VFoL5y+EzJbU6UsnkM z_fMl&9kO5ozW@RXOvU`C@}k>o@8q${H8`($9c7LwZhY?(I}xjh@yl;^6j{l1mzSA0 zw_&$TGb!?W6x7*OSf_Pd{p8ZUY6gvG`#iqKYs2Sl;ZnfTP&%KMSXU8Wg9s=VRm4fM z^3=9^$9{hII64EQiES5Dc zOQ!Zo9;E#dmZ{oax)dse#9)NHtV-o{M1Um`jN4KMq}Yn|Sm!dh8^Y_bs+`z~ ze~jBEOJ(FZmZN=PeZ@>6gsoNggcR_oGBh?341?sL&pTF^nqQ$R3`mZxqsx0;9n2$; z^XhxsR|~|J()cb&v$N~1*V-7fZ@bHLN|1A%f(i`QD zyC)e*j^gh?OBQ@JZY-xYUZk8ckCxcIa79j7U&qN}j;@;UC5 ztIPkYz8R*1ew-5tp3Tj%8Q|2|1$13)-cmI3Vnnp(%AJ#^qU*;Q-?fx4vb?Z@)#_yV zDfCgqfv<}SuANYQa~1@|jec6z@paJl(&$zGU)w1udYo4if=6eYld@}+4&E{{a@eBi z%q6R{8@&Fub1tQ3==Th+uq8o*W)mZ4?ZDkn(N`8fyPmzKX8u2>wC;kU54*7mk9TkX zH`ki+k1zpQ=n-seLH=tg*)nb5-0^L7ai2~uTnrZm)EIBKJ=A6Y-SFC)yQXJF+6ijT zrkS6Egy@+psnCAYFIE_v@+MJG*4RE=oza z-e6dLyO&2TWM24ln7?P8G<)e=uiNJV zB@%Py)*sB#62oG*wqJK?AHUk09sk~C!`0E_fPm_Eo7B@MU%Isaa_~`)<^bY)v{sUP zmXYxHNacaCp-&-Q5q}AbDeelV;haKZ)v6tv2NpVC?ZE8bhk3fD3wulYe6Du6@Av|CI8qai2E{mo2x`e8xr(5O0Uquvox5ik~ps# zB+U+$Uwh%Yay{FO&PYH3dv7Z;_KXd=SwCrs7#{sx^0%`2E_B~#SQK2o3gZFQ4tX=L zj9xpH)Ia$Xv3E4iJ<OE(wLdB#PNuY?ujWU5fLu%#V`*`3U`Q7@VdBC(Hfo<%A3f zZ|0*}OlO<)`DPdwZ^AD?@IUsZ^~5R!@pw#KKq#b0lB3D1B`8*P5+I(_GcIZI;{jDD ztnzP~?`x1dH*HCjV1ohG0=a5|LCG+o_#S00upxrGq0x&Pq*mRi+wcV`P6o^yuV@Jb zi1G!dIP=LPT+F>0XP z`AT^uVSF|*drZV=Llz&woZvEIyYbuPZ^GkD%(r^_XASeZ zgczd^=niFFIZA(Sp#Rb{jK`ci#-)sKX^R0oBb7B?LU?RoG^mL^dPa{mc)n@IZFB(b+ zj5%juoKzG3W--mJz)7TXvjeS{RV@x?wo8ag4W(R;nJ1_Jqoy5`Fh0u7q*S+-nhsbt5Wh$$b*|`Wdhv3oioTDX zfJji?@ui;Z&rh151r=Oo9XDxKFYyITtdTIvp+r~@thr8+Xu%6y#vVhZjTUSH7<*vs zhVv&5De)0?8(v6>M*xOOLmA`~iFJ%4tRj@B-NVYr_gFOYW#dCV%}ZW0q$e-q;-8^1 zrWDx7WrFXpQ*tO=4QU8KWk8@1U|!?<9+5M&dW@&`l&1#FXC2Fg@xLixYKiMqIUqbn z5x-j!7sj}TPD>g{BL)hKPfET%O>mJgO=HH=AnGp-b?<)c((f2ogqmE4S$@_kFVt_c z{6r2i#iS-Wo3JkD?b77*txLdG1HBU9bm&n;75i)}eT4yAIh;OILVv73`P?2o(^3l@ z&!$A24X;0%uAqK1QDbI-wZ{sNXlu`|bHOFUC{@EgzH1br>^hFOx(R*jvx?~fvtim@ z2+v7f+30wz=^{p9qUR#kN;UZ@K%%gym!Dz?CdwNL1zp0<=F+cA&+GQ*+lZUXzBzB9 zG8FI8=O6WJ6LWPd(67tER4#D{rYuvJX|)8J0dJC1lVD6y9P_u9 z{!Gd^$g2BbVmqtNB!iafuf?!O7}rXfS{Q$MD?hA|@FlodwDnl*6VhWj)mGE+T1q8C zfuZ|P$Et-7w9ElLaRw_r!G`oePMvGwSe$F+Yr$~pJA0M*R)ORdOCa~@4 z|Djmm7{X|hfQqu% zBzg8N>jD@!i!%K%<^;evY+_EcNv!fX;Qo& zi}prJ{u17SQG;HysdfgUg%8CQA(~7br+P6hc|?gOfHb#wU&HK%qxAo5!40VBX#lJr zP-e{Dy-bV2Ybmc-)VF-~;*;W0!nhJZqt(WM4sS22$3 z!N-;42@XG*i{F#W8l1eNm_Aaiw&){iArlZiN&3r?0WuAA^)CT!y>A{}Y2hJbk* z8ax|Q0MPsSWutb(DSw!#)r~gK`)_PO&v|Yk#HOx)Vxc9C@@auA%%{Z^C7=9M zdfX1c?JtYiDrcP30FzmCw9ja96F6B<*THxXE;eF#PJ(u}4a!g=6n{jGsRK8_gZ6q% zst~Q$=zA^c%NPJom>Bof#O-p%*;)Dq1HBpDto8Kv)O5U(Q0c7Wo_f-A196wuuup5i zNvQwmY3ohQ5ebc!ie(#!kGY!?&{JFn40`fLkX5(P;(oS*ZUQcN)gfrAvk=DvDIWI+|WPuMh?9* zkhiL7-wkc92<;4-l_wt)&!>!N7|#Kk+0-$Y?|aO^7*(IkP#>F9?2AC? z?biNV6*w8D{)CxdV3L@R9@tgXd#>R#l&l99>(w_*q*)SRj)aEJn8xrWPZ}_yu&3$!)APdJn|F5Sh(-iA_M)z#{a{|r!V{8QSa14 zOw=_OAcTif=D&Kz5jkEW0SYzr*L=ngm~mJSZu&u<;_&esKuv%#7g!%Yt3S5L3DCa` zU2XYy0|kIcZ=0%M_EfQks8^T2HBhnu{3#QoPV$kZr+fye6U*S`uqP4pU}=a}7l*G8 zfpZ|nZvYj|@i!}Q?OMhUh}mi&q@#I!DfOL%`9#8agj5U-Qr^N$v?&ipz#I+zj$z~< z*87H>_cbs6ODl4?@uGx*#9?tXfJBku9Fa-?3fqE|Gf_23$+351l*-+!j^0du#*?-=wE0! z{nBz#%)ZE#pXA``A;5j*S^bcr>uNm9CiMQ$G1ZYf4vyg$8`tmhVse8MbGSacf)>?I z2$Jsc`RdhR$qCNQTmMRai)Qb2E%@F}?3DfEedJ5t7rOOMKAxa#EWi*MyWLXP4yUJ= z+}!CVY;isIHQRl*UBI5qLKVT4e#qr(@9pFU+I~(%ZdKTs!Vzg_5#1%WCjE0}&vwq_ zVzznqm#iDR{TKAq%>J5v=U~(p0%y**oco8TZ%n)=yk2>E{QMzlrQ_Af9?&M7MdjRe zpSFme{&~-zTWryq7l(`E75w~U9Xjdk$b`fHe7elz_Npx`+ADbG)wiIXnL@wirQW?w zba#T+>~&cJV^n$!#d>_}md%0Kv2wPNqyE{YblneNO1Z!4b(dR}qh-h0!qOh^`cW^^>7d#;(S3X8Q>; zpG@V=d-M#YH*I4)Ne^U%Gp)BPeOr|PX7=(O`dKsV($v(`+~JRVAFsZ0pZ8?ylf!3H z3f2ntKH#u#)s1i6<8j+>tHtZ~!0qOHcERO#6UGfyctq@#-ATy*uy9XOaai`g#YfPC zh~b_4Han8OD{q!`)u8ndXG2f${Qhe1nWZy!#Gf@zbNR282HojhS29OtGTxiFar)@J zLo?L-mp+=RcZRXcL?9@ba1R^qfw=N&UflZ?^n9bT>vE5!fyMSs=@wMfmUZ zz2uUp{3na|&c6Tr{`?h7Y*O1bpvyqW!;~9q9({auBss@`8!fbN#bQVZr z*3l_$=rIbam38 zx%v@dhW7UEk88hSt(Cn5s8V3dDXAL22}kB{TV$zcpZf^iTWFQzX{H=gSQ z7y?BIom$uJ_cQ$I%zI_Cn(II2sUk)kn!}E;2<$Al-f;D8MrBYfD<1))zja!DSy;eK*^%l$e}vc}A1THwzCqTxcT%m-^tIP9B9h5OiIC z6KDaP)PRHfW#D3ah%jF(rH##4kgbIYTm&acdH>@8{{4P;Ut6tOYpqpV*LAfnDiwX#bx5tNq_VD(u#)8d-PYDr zC_={xD`65Rbo@ext&$LiFm#-iI32eWI!?!le&6#4^r%PQefRl(-}htk};-48BrQmwQChw1zW!gMsYRfjreT}pC6Kp z;f`ZftW3b-*QV=KiM-XSJjeXB`i6H6qKMznS$EL!Sxy-Yh3REB!#u^_t9wPY4*>LV zJF1^}U_G092HK3o@_HU6SB(yNSzlkKMw*CuMaP)vB&{ib856hNrRcX~Iu|+c=)-%l zrpt?!6|>34cEMd7U)by3Y(Bed8TQ2b>OcOV=-PuT+!qrL$UUY5u46k-40YtZU!Jq; zl$*80NI0d5ncH;=dz$_F)Ni3nvvI*PtAJkX9o^7a9Evv9y)<7waeM1_*d(QEH1NzD zfT=2__~q}C&z&Ye8TQaF`0EuQ)YMrk8U8_mW3_0~`VdMYsigjCGZ8=m`d~VL5B?4xQ?uw-8 z2pjrlHM0Xls*^dMh{P+oXy~(dc(Gp7n22qF#b-lFp}BC|1&(LbLU#;+cA;) zKF>p3Y8E?!ls*aAtE6>#Y)6ws6>O2)P%G|gwYrWD)rK`H(}MeKex9A~`;+tX2`yNS z=c!g6rGB=;PeS$$Dy`!Lnv48>KR;ipW#{IYtO&@nmS}YrLL*^0O+HzTL{N*=(l}NrYUy7Qi>Rp*}WiDf^kuW zUf!q7p2qMHkf}QGVmUrh&AK^JYn5(p%LCm+bFahZ7$XKnldL+SoM3{!W}mF(zeIz~ zB4z%hkBbC}LIE`%ex(E#6fAX1#}*ls8)x~bN_WkgDT87B$_d<>V<58=%0`qMk!pz% zpJ;?^I%P}$6RmK5{Q80OV7v(bTO`I&1yNPfI8A8I1a@)8HM?RH;sk=;i5}f^pNy(Z z4OQz53P&Oa)%_OmWRcAluFNwD6Z0~)_#AW-kOqWxDmaZ*UYu(-8f2*vAH#vXLOvf)qS4f*cRxlEvQgG-BuWp$sJdh6bt{9Zl z9{?8m$SZwSUX{9rmji33Vy4_LjlkvvAtnzXprdJ9Y1LuV)d7>re6&?5#42vfToE9% zsk&$acXBqgYKOQgb5N13Q69Suk~vlDP*9AA-`MW$ssTcIgww~mO^dK=itw2#rDU2A zISiUItFmEj_=DDtw*ZESxwt-*xv!Bf0h1<_rkTnwJlU@~R<{2@NoX0Ih%c|i2f;ml z9GqB-?!#eRct9YNutu-kFo<76BrHxxJUSJtY0B(id}1)DU1fvc1Ud_G-aT@hrSo-R zlf6NiKL~--Kt+A{r`2}nB?xMzRq~aG!|*;L8B?fe_EMHjER6W7DV$W47^<^^BdiILI;a$DClxs~d|JJqXQV7qq|DLC9U}WHcOp=ybagsDWR|%1tL`NV>8TclUEhvB1m zGOKCq8WBFH6JIhdM-i~_Zv0BEB5wlsH>|Tumj)5>d18g5A*R2Rj8|hTML2+nEL0IT zULe~~4Wclc$+!}QWpP5>#tD2*y|VpZyLpwkd|`E7H!dBPTkFBVblgf!wU8$FnE^$W zI25AIGT@@rkj*qGoK$Q`R|Xb!nQCMx54nO?oi_+uG+`w~d=^caWt8PSTV$;P+dc4c zMbg6y57R`_OoLJ=1TfnAcvVQ>EZnf0sNB>&n5V`E2TKLUgcVw43Fp>KaCE6CIxR}- zQ-oeRMLx=+4MHe_nLLQwDETk{EL<(4O+cbS+*Z9SkJ(*@t#-y%FEc;{6rGb)iw!qd z3W*jRtOUh0e^tye-e1=>y!h}>l963(Bmt!diJh2rh=w7Qmjo*U2_qoSP1{+1&0U3f!la zIXp#jr@Ta^oJfEC++PL}v73y_02P=OT#dTMR!wq0nxC+~I$j&O8bu1zrD>Jb3l%`d zpfX16nAM42%me+!_?1S$M4X-_rO@4hShZo>G|o>1J@Tw`Nrx<%QU|^ANZYluKm0h5 zEBAVbScuadGyq?(ES6w=3{@M&in$1oO(cZy5qrHdTP;WFyy&9p5?V|EEQf?L6i`il z1;IQy4Un&*Dc#`U_0u@p2_PxGT2KUd0N6!`GhAm?*5-qXn*G(Wn%J{T7!EXPGLMix zSd}tZRccVU!{*z#wP@x_VUaRSgt&>6E2l9KYS3wLwv}?!<_&3*K|Ca3LK&+%YHd)V zi$pM|IyPO-)`QG+z`RLW8;w}00%z6=4Yh;WpLL?1iUWwa)V7}w9C7?L&udz7??3O&DJ~^&9XaX>h{b8I( zB{Zd_0SFa6`ZM=I1&rk(kf~Zatd*w?;#L$9R!+;af5k8BJ_n;Ydfi}NblOgeU=F8x zN3b$eiz><0;XKHHxi+4IS+bBvpZB<;Ug3$D?H}ItQ!tVeTpia9@+v`7loJpy?JXJ& z>&LC&pf~38_c_1pDv4TU0?^KrXv5w3ioB(KlG$AV(APTV?x)lr&=-hv3#xaSVt z`14j47k)kHy$})u1uJ6^r{MMtMGEF8L!Nf|FYo2ha(Ek!VlobUkF=_gcO6!t=NV>4HypN1gC#p z(Ior)DC@vu*?NG0exGNG2%A(`NbHt?2I)>JicoM{6C;|yFK&W7DjV--RK3r_#BK6) zHz-%2B#6M=KY0xGq#e^`PtH`EPAT$L)hnB1)L`7kSzsXy1DJEgeVkfIk0~3h-lnb= zHbHUAj7$+ezZ+L-RHTXtX+_{7HpRqMYWa)&S-q63ha|+|ZlCJrxeoO2L5vrBJ&f2) zqoT0BI!VYSiRBf1oG(p&t;Sl7C!{jR&^@v2Ze?sYh({S_7zZ(b%H|-KLaXDuAv{O1 ziTQqMaRUF#pR-DvC38)fFleq{9?3(PDn%J`(odgCx=M_JZVg~av4tw8RZo|pqB=TzIyqh3S%}O-~B=1GJe2P6VNc#sGF|I!#(lT z%Km3!pS)I4HeGFDkj2gJe5IQNJW(d8s{p06=OQu=ADNF35(XjO z_4rj2RkoZz20Ck?;6dnx!pV@aJLbL9B+}_}CzO{q97o=?b;G*)4JlOYhpU(Eo0Kb? z{=ftx&Xf4%#F6%BLVB>&soPQ=^PlE>UILkMz}QN{s$lehRIU)=woBs*yOm`cT+poe z-VN;=rdm;>AVeBZ@BAV?mqtj_%j24=)^}%Z`TE{TjPQ%9i+M`cpNeG&<_d$5fTU$2 z%Gf5ztP>Og)$zjB&C8_0Gx!hQhphRxv(y;(bN+M0J-1A!m#PTGk|jBMMUobz0+uT1+uhfnr3Nq{S{MT9?9nu;NDKb2i2;L$+c8VIBNecDEuF z29vicN|?!JdLU33r0ZInK>HMwR-KS8r(8d~19($L%k`xZ^Thbwf2O31fG`xFmH?KW z&qPg-?G&z1bZgll^d6WTJUFx4{3Up=I72+MRGFY8OMT#FfLC&?5!E zH)9DCKwdrG;%L>{ZUx;8yLpau2kMKf22)E+Vq;2!wjcyv>j>=nS-^8R3X*~sF5}4B z+zPIhAu0ON)B*b&PeXf~+#@7}3G4@_&>xLg~E(7lcFH6XU7c0jFasnV>OHsi8NSbjd=Vs#MM51eqU%#et zb=pzO#0pVV@n3`HX0+VQ<*)IvmUbaT{4B|lA;YN8Yj++?5+sB!_3jk@Q&B>#${d+s z>XXh|+xgvLcPQKXX@<5K*k^1Ou*Uf&z<=FL23G-s7?>Vjee&h=aL@6W5Hn9(}f zrjg@no#zPO4_)YJvox8tfM|{h?$Kg2=Iwoxqmmh*=hWxEs*6xEZAxfEbN9sQwC?ZJ z5rF;c8ApV=yUy|!iyN#4nMVU6?{P^P!ET2)Jlo`UWYe2VZb!F${l`r$C0{;CQ?NGk zS|j-8Rp5_}FBjozTlNvm)0q2~kZA_l9$tEsugv?E8jP~^shW(Odo#=ziM_*2g1CPO z*T+)2w3fHR7Z=sX1nKCBGBbe+p@gV1^`MhVQi`SWjJ`E4dDtI|S_+QWM_5R^j@8=c zt7Fd4Xwx6}_#s_-1!pbX5+Ptr!!oD$Do9J~>cQM*#RSt3_JlAZ$^_rku*+jRA5-IC z=spk6T5VFB!xqD;mr4uhX4*+JI!6qWQ&J1uFqgXILTvM(zlnA7wwXQAIBe_gxnfR> zN!ZRF{a{FI7)R$ht@XoN+^_VnCY%|%aNEYtP!{izD5{TjTsw&Lvr}ne9RHnu6k}Dh&SzI1T<>cijGL{MSlhC8IyfYgJ>oSw6>^Q{F%(L=Lt0@N?XJICeqPXsM zXS@?f(P-u7L%~huUPSf+q?8)8$*WW5ESvF z16EW%q>$3Qj@@+-jT>LU>8s!fKcg6e2rB+39C$Cf8teTiy_)OxviuV=du75-0yw{9 zmSKo5?r?eoHlkm0(RMU6*`+U23YuDAlj40>1R!|V9fO^{>{VVgo%=-2PF_??M8z$T z5Qvwt>W;@3NYQoLkGry_wUme2n5cTkFbnkrF|>1VQdVl3kjdFp7mRtrfosZ|TCqVy zLB(Az37A2wrzZQYE~>#m{w|_RJ!l!H2SEg6pP1y5MUtA*kyc^`tej_m4hYN7W9Glf zc01823+fq#a2(wHkkKj^N_$;lm=o)vW?=65bGxLFb+;@}nX8st4{8WurXTk(kqEn9 zAm<5S&U%;*XMS&)aFi& znMH}03a-|JeCJ43dl4?+o%AQCd>Oq*AM005f8d^1$pQ<$Jh;E1c8$1?mMF@K_W9(uf$7AY2v$;IYszZP7+tTwaWABv zBnjxVex$$QebwKaW`+|>J+%##rRqV;=uUx0YfEir;~rCNfEsfEbQ*^Yi_AY z&6Fq48`jR6HQwK~e5BPhg(+|nHq>rH>s%VR52pnvrCxI8^Cn#O3}<&9QH-mX#JZmV zvQ`;nmv5;1n7{H~+C1zY2)ydM`yXs-SPJZ2g#5?Ez?G+Wt}%T!Ir z(u(UzSzAFOJSe3lb;=T$eKw~I3XiX1Fs$E^(cAQP>GUex^0p~j&Lz}g%b~8M^jT!` zp{*=)N{XZ1)FAl6vesqzjKhYkyHMZH@%@g%3bWq}@6~ zL?y<%Igye$)oX#S&3iZ9r{oFcwtX6iov%{`4LX`{sK>c71IhX6PBzEY&=bjQkKBX; zF-Ot|99sDeIFJieO}_nMV`;S|I|sXJLg5!PpR!OrfZYe+{YqMPFYA($IJ`)-zPPJE z)q5b78SU?}i|nDP8;IUtBhHF>hv!=HCR`Z{EgS1+F*R^yNA6@>8J`!Pd0#+wh(yboKkF{X~p5hKGijrO^a_+P+Tm02?y)HJPQ zKJJWhK3^{_59+fy!x(U=kw^pj(S8LS&B#Y&0mBh=H;vRmQcC1?s6THp^RQX(_3e-3 zYhNE<``%p9tZ97!K-lT4xJ8p@Zp1_Yx}*({2VSwzV>ShhXvsu9Y8nh$cLKylNtLOW zdX@-C8z%Q9aL{pL0i#**k2f&mCEbV?-@Ray5zB636~1!CH*+l(0cwL;t?F2!-T~C! z3lET{5~Zdv0`Oo=CV-!bq!$6RL=OOe05Q=5IEmK83m^<3xMslVz5~QT8$xtT;&W3q z2hy4`C}{-(?ST2)(6nkiT}NpalY8&d?ZLY^DIN>#XoTtX$Ej?=KaYO<2M|z$$3CL)p%>y( zqaaV`Sa?WHwFt1a6@|;F0br^I`6?Eh%wR0(0N(;8(ZDp#D7u`67s2KM0^IiBX0hq8 zIVWY;euW9e+|Q3=>6cAyM*jUZvmkZUxt(Jg1*Y-$Vu;$nKmnck^6$9-5!FcQ5?^vh zv6*@H7I2vu!NJlub}zAAu%&j)#JJ++sXYxsM|@e{RE|STVOz{v=h!bhzu45kDT`@h z1!s)jIQrly6&r37-7?d6r)7N05D@)NyPpIS800iVP79z@QTkh^noPT#)zWde5%)a* z*{1QmTZoR6{1!0hdW$MLKJe8Icc)^tGVy?-ncuPt)R}h^mU`sT*l^6d-W;YV%_5c7 z0h1>L{)S#Rais4EXiCH;*t?|09ls77VeMD!A1w&~$0hm0@!5<*msFsc)Bft;O?8RH zYCHQAMim; zb#Al#LE*DCc-^1xT*80RuKVCBu4r4oz^y#S z?aQ_{QB7Mj?e#)(fshOySaULid>s51-!jrhgO4xypp9>TS-~I|tD-lY$bZg$wF&F8 zC%SMwqpDbT(zMPs|G|ljT-U$AiB$o+?b(s;BHIksaWoNyY!vvT85AQ+-#mRK9<$u> zslfQuEj2?Sez7uREO{BWdeQgSB_V|c+fUe4Ozh0nut=KOCGNZh*H;#_Yi?A&D&G5g zVejjrc31Jm69uoEa=vR))0dexYIclS=0h&)lNk9mnskcW-tVqr*6$_HxQ)u=<%OpX ztaU&5{btL=O{|9yy*L&*iu3>z^0YI1zgT^rlz-VZR_Pv-be$B|+HgqumZJ^41t0u! z>gacOHNIVK>e0d|ZnkhaGI(kg{T78HKplf00*md&rMoBvKc4^N;NyiBy2Gm$oNUcK zdV{y}upU_QxX_&C(SD-6{jA67i|wbc7Vmn`6wEjmtZ~S_g`d%#JkF|FnS$|~($V!W zAsw94B=?SXSdx3vF85@GsY^9pN^U}|j8e|HfDxdZ{oll!4#)OI?Jp}A{ZV6o{Je)| z^O5oF2gRq(zG~LGcU(Mu<*H}T!0Dd5p1*8%-tfK6Y{+#ntHx{)p^SS*XD(}KU)3@W zkYTM^KqMbH-8lfbjr214EI|)&H1I@)OM@=(^`U3&4cjSC^BrjNSv21k%tK`tv z@$hN*YVNz7FQ+N=KW;Nl-L{BYHMuJByw^bPGF@-URS1;d#ouYwY9F7zZ}0uU^~?hw z?}ur>{W3QGnk%qr)P;{rZAH48CWJJj4Ic*C5|9y)Z5_A9ZdhldQJH99N}GUXlm^f- zov-iOHtK9jq$+!y%@0~~IrzLnXV?7xw|@+?T{AYV=|7O#5UcTsFkyrZ9}_mLV~B{` zwtMbfvW7LRdvszq*#KLogBDe$Ed7u8$@jJ+0tWG(;egJz$(zv_P2}jp8$V2ci=+-9 zR>L~mZqQn-#B-!p9X{+jT}|e=%J0Fm1MeT<7eDlw^EvRR&kN>EvEDyC@H;BzuIrG8 z807P+WE7s1R8Jpl@9Q~}?cXd99L6jl_7P9ORz_LqP-IXSCMr%a_9AjYRitf?_7u4) z$RH1!L6PeW7OyX~KhodW=Pl0c-3GF^f{R>hMh_wOb#lHJjHf~KwX*z6CtF0_|JhAbCme-2TY za$jIIIT$d}M+7$u%%cQ^Hr?D5yr2WbOv+G#bnCl5uR2iS1$&HOwgKjwa-(r6z}@a% z+KhJLR4=0hq{f{k?T+>mF*)Mid032HoU}WxFLWltVO-$EMy#UxLWB^ThM5=D%VGkv zz9_4k4l?h^s9u13TOVI5aH;PL@6v@g3H*(BtSe=1%>Yf9<(dN8PC{Wb(tN9aE11MB z$M|&X?3!epx^pbE0D*Ovz+p;|ux?X!zhh$`pNx`0|;4sXo19S_C z*0vdQs~>*<&pmcgpHl)zfnkeD2)`lEb*bDhKzpj9H+=Xyzg`NylZL_X+~pA=D4N^p zx0zMrxejpdkbBYlg8Lu&1%p0s&!-b%ujWYC9xcV#8=h~DRWtm%badu1Jf%0-01^38 zyEYWGmEviU^F0|sqDY$|#1EEp5G|g*+PNtzKywS#LuaqOM@+imm{~1n5XGoLh7b^p ze-8go*2K7L?ofJ=ZpVPal@|-w1+Ki(9^m3uaW zbFNZHtTwcE`(>Vydv-&91~81+$H*6$PWVxWwS-!^b0$FU=nZe|r50tjkJG3_0LDue z*4Z1nNEhgZ$p$dri(y=67OP*|{1<4>*LrrMwNt>t&>M>N_XyCTE;$7o;XfpwZ;&tO zg!c0o}<0P;s<5#Qs?z&KK+geBGCd{fW0P|u5ULvEE!WK8t zM}-$x4kK$wDk#5CFl;E~5h(|##jBDIG9W<|kl(cjF;*0ru| zcIig1qcE;X>iMf5#%|H(Ik1;H^2RS4gJ$~ZsN9*3@oCgD-T@RLkZ>Ww+)I!(g2U1x zgY}>^G;+wGZT?j!yC$302oc3-Y8z$&8-vp#c6IW=09me99=ArSvc@j|j@Wnb7c|LK zL%|(4E_d7uIpgMG`&+Y*NmDQVcdeEv7yb1ko{s4z06Z z&YNKqo{xelf4TK&Y16X6^oS#G1%XrlFxn8)x(&;Y0hSZejF*b#7#Y43&b+rFi4@_- zcX*uI+QA-OkzPI0IU{m@g5X5v6_>m+ zR(j;uZ*n%J3OgXoQX-4`N;IGnza#%equN3Q_0BLe^Yz#d|xeZ4HJOGiRQ zXR(Z!A`2Gv(VDazMDEiJTVO3b`8Q8lV#y~V`xHUy?OyLt(mk{AkJi^d`oBLz08sln zu(NY_=6O=N^xtQZVX8)ZKfZo+<>0y%*LI-Kv0+V;oW5#vx3nI^yQmwMd)Opk;qrF7*}I~h=kpb0+hq+i zwGr}xeRD#yJ5;)YowZzFc=ly))h(q%%Pe=Ef8h<&k%M{l|E%n-DmLG0Y#DnHRc&f3 z96$}5$IIOPp76K7S`({P^-#K}5{v zdUMZu{hCWWRqbf?oFmf&lc_j8N4q2L7*y-}y>!&eZ8lT%Ui-ck-gC}OKtc1J7JA+9 zw@i#nyl%CuM9Sh(|*4Y?REAZ8E@h!TU6W;>vjPeTf~v6_lC&7x3nm0dve-vZrOT) zr^iOXaUlocI}#i5-awP&*(A66HIdag)Uo;YErRow5s>R@ddTO&&-RM)ht>jW>Tu#h z??=PQiAz!+rM^7$@y^a7Y_4Bq*tS_c6bnGz4x; zeLGSzU$J`Ws%7t={I&x$O*cwOJ_hkMS>-4xIR5kJv)e9w-SDFFy;ZNm?SbZ)X|P7y zb;JKv#Jy*mA8sD4^@|%@dX}98V|MSWy7Tw-gqN-V7=M1Pn0|eD(}$e({YA;Y#m{JB_ueNF+z=>TG+<|T14H7~?^ofOxp zjhNIq`U?~$3~kQNhIMy9eS;h0$-{@2Ug(I`vloibem3WIt9SAaeSSWA)~2=tn%~h7 z%8Iea#IgX!bx+zYWAlYc!vC$OUQ$MvHSZL6we z{ne-Ie*5S#>B#vl z)byU+*~K|_AK%>2zQ~j;y~a9!d*MZ9XRP1*oXKi|Geh0`=42OB1sq>FaW2VOoZo2%oPtEu56uOi+ACzRduq({^g`CJ3c#Ay+-b2?p_e zZ5u#V*OY}tNd2eBuq+W4y6>}gR;Yv87B1}88+Su$1T`2jQvtu19gIXE6{4^zhXF{d zbv@a18&lPAu&!JeWQ+DkhsE*toVDS*BvoYbKIYBo2nc8wdarFfX7|@bEMZ?gJ%wv| zi&q`Ay|jAPvIn64BDqe=XD!m*hU8QtF9 zb;5<~r0tt~S-MN;^%?rXusWc>)FfySIlP`Y5LiD-DP@n5Q7P1|HF5V!pq1zZ%lO3~ zt1LM>>+=!}Ev^j0p|Lrue*jq$^Ex!elhrT?T9zZSgy~$1tv_QK46R|cYBrCNsnyZ4 z0sQjdFH9M)*F0$w8rke*Q_YK@W~-N;FOyqk2J6hqe0Oi`kF%}H{%m~V?Se+dPi1YaocGpDEwyV}vw*;`+eN~M2phxYij$GRo zo&d)I&C-I6q|-n(KmUGRQCI|p#lbJol#&b8eHIHUWo%wzT4Go(1uukrdblP_Cwl3e zrgzI7kICpNPQ8xbPZwHSGt~m~pVS18fD30*dm`EBiYR`zUj%qNW9&{3Mu%~du(k&x znP-adL1+hoTbIlJfhhI5l}L7rBS2M>7>{QXg`FPuMt8%5UVNl1gI}_u&Vqz&-5)Eu zTbY$=#I9aPC9lY{UV|W3kC&S)o#~~s^#Y1eSG=_PCGB2d%>2gDH)Z7!N9Bh8%B;j1 zVHj9p_T}$upuOa8?m@he*GI!@kt~&ynHx_&_W%fy3@vs?^dReOOPybb+Uj%qIkQ3< zz|ZevtTxEdPyi{VqxETWr*^+g{BG@dpGEGZuHoZejK$V5*3QbveMft$c+V3tx+0|m ztrN*emz%o~u>ne7977+$-Z(Lfa4wtIS_Y_1o=sn8y*p+qNa4^vA=j;2MF2kd7;~)_ zUSPr@tY%`cbP0y7rXP$76`PL_#xB^d8zV0Y881U(-TjtGlk57d{KOdlBZ6wE1nm#- z5t}y9?8R7%?avbc*e>3^f|7%G)<(}wN;F+sC#{dG%CcHFOC7|z9A65}2DG$gI+m?b2R4A_g}5%&;$$;1o=p7YgB!ePE)_7m~u2Yla z);yzD<*9fiHl4n83eS42p&< z7Qxs`(Do|~W$W0E0w7(Dnw!)ZvBirPcAJiM2z2P@nw-}H+Y#o2QRY{eByqd)2L8_( ztRZ;U?J};j=yxt1noEvOLxVD`wHp8HU7z90Q`3 zx_cBGh>W@B5NFir+qOx*mNH#UY2uJM2(?|uD6ISHF==%c#QY$}Y8LLbk{X1Z{P^VylY|$uw0b(&WdIr11DndXq zJ5Hs*XgSIHnb_onh*iVo9Y8fe7&C=1$`-R1>Gb2de||CA&Wze`P9V`1>V_S;6kuMM zR8x#feF9rA9kf7fMwNm^IyMD_(q^e#$o&=|45E9HqAg z4nFQRoafqPs7af}EKLs8Ys~7hbWqg~bRkbq>~c!vdM$;`BrP^t9eWWM$km#c-?s|3 zU_|5`t&!T^LQucZ=2z{-T!h(HNz0ee|fdw9*7Sx z5G+ezAM=j-ti?)+VBR5rTPR3mz+rJbg`t7wNXS)p_ZAv|h&f074VoX8XR%kxRDtNf z&tAzT`}yWJ!S}ZVti2$~9>C(oKn6nAP*{}$>!DGyi`M)x*OIspz>A?~G3hxBwHZmP z{UA*z^8>o>uR$oGMo7t_cnH}2(!Y{4-pEZnk!ux|!}{6Mdo#xL72l-O*xcJ^u@)hq z1_IM)=FJ775E{rOLtMM4Q4sB}+5;HTSpXhow}N(j?)vks_{W14hv0@fD(jE{->9bV z(fzGHgMN|?G7cseu|bb73o(c{f)Zfi9CY?Pg*`M%QW|5HjV`w3fP4;?Bet28+bm4R zml*>NlgXW&sGQFU;9Sv##K0irjUx!OacqZkf>IrAE6^vG7W=RqVm*h|GfF*zFj7jW z-$$`n4ynDx>Vz5_FD8C}Nx!VKApU`~$i-h3({s_g?}qzJS?HYE6DA!T5}s?P9Hk8T zXLtMK{ESw^0!AxHPKH?E|aqRN0};E`V zpqAN|Q!fFCbyV}q9H0%b?blHo;pC!6UWc4ea2+%ZkY0F>{f#E)W$52yjc!FWA`7n= zSr1w)HEN3&Qme;ef=@2{gP6Rz55o~#4dhsN!oZB0-eF2bdDW5qtbUMM$njmd7z{jM zo+6IF)ME0koSAl;fWo>REv6Q;M*OWP(ann`cfPO)E|@8;&7o1Whh{h4Vktqe!K3U$ zI_oxpLpnI$wZ*nwYI7^cVJ+$di!F)-Hm_UGR+&bF|sxHh+>R-FKJ zNXK?IqoCUKU1XmKK(839N>CbNq@wn79T%;uTGhd#$%rklWms5e-6U{m&#@^4sdNtG z7HH`OV^v)CcP)4su)Zs`X$Kv~byw5W=3U^%T~a%-4s(lR+ru^EY0d8HPPG+*;(M&S zuz@~X(uQKm9XcDmlr^Cx9idte=$tAG2>I%5I)P1<&i2SCjlrQFdBSYvvcCk9-~7FO z8+S*J4i~Jo=>bjI@NOlj`(EwVKFUOSzKo06_X1UlO4Vr|H%yC3VpwPBEK^Ya7shNC zU)h{vv6lO|3BeLU>#YK-Vy=aTgLUOvm$g_+a%@mBTLqW+Br|J98571uVl9#@HTAJp zz3Od3Pv;DQMKh=T=U$v)BmGM|gU=1|vY@2pFeU)Yr|uZMj)7W!hk{K40E_fdN&te( z6j%(XNyCF=xP^H@y6H4v(R!N^!X=}sVpJ7YsIx8u_a4+)>1T~tJl86v7{eIdo6N!9 z;#h4RwG!*BMgWr-4%Yq>b2G?58TlV;u~iSG_*W0F&%dOya4EC3U4TyzM7V`-shuAYTRTk4@T&&DAy zM3}9Gg0-AkU0pA6o5B5rukqNH*+afXa66xMME^VS;_i|ngwvA0=Frzy+s9j%u})n$ z4f?>Mas>V1)Sct4bHv{sv4Ud_a^Kvw@Jg2yj~A{Zj$hwfBwjC+2fRy7C#c;S^imCpwC=Bv-T zzWsX*oLLcQvgNm4)!p2=ma}s0>4HhUzp9)dIfM}%I>vE4#sRKhG;!=XC2xvYv{fIm zwrizI6Q%ntH#yVAv&?9cFR+T|6m-erLZUtI;*wk6x&Qm4w~+099=9T?>c$3k8Wc9D zV2cPd15acp{mZusor&@4pVl-NUK~iCIC;q>lfauHdd>9ii|X_5SsM~|W9b&%w+;Qf zn!V%L@r)nwUPh>Xap<4X#NrvRyRSCi${e_dU7-()LV9xJw+?=rxd;AIh%{}Ovh^X$ z0-T2|^Z@Y?=W^EZ+c`{Jp;&WpCmxO5yc=8Yl~nH7UMoWWYdiQDq4T-Jr5tj+3?l+g z+=Pby$h~o&{dnJOzpv(1>gAXBKW7$SJ{FYQ{CLeb-@Y6G zIltV)e0$pR?di|^^iTiwHr=*-v%t=IG@d>G@n{&~h}I01XXx90CwJO5U0?*4W2#5Y^+5Nx)~A2Y80B_PEVmovhrR3UmiJ^C zth1lmTs63F9}~npasNJg^7zY!`OgFk#ur|h7yLIAb(v)0jf?o^P@_!{oy830mOq1D zeb<5U$b&!n&Cu?BRIDMfkF4HEn`jZnzPyO_axmy<6vSp|)I9DgAXGDZS{Ua??at>q zj7jbLbGEIReayt8iZ7S!D4!E}_1&H9u~#$i9&LaB2fp4=v$emnB0nOYEMtu)6}$u>oZd*M3A`^F7Bz zq^6XB><7|^VWZ^lI?S*Pk6d6qLj`vM{VD?Fw%B%od;3B2>GEDMLIq1hv&&aKUQG*` zU6|PV&fqIYHxEWBIL@nG=BKvkCWDt(D22$52j3HQT=~Kpk2_ocajzz!3-)HSPkUA+ zbM7`rNK9u)0UCWvR4wDLRRO0S9FN=cVdhEW9}hJtyCSyL%su`1Oy-r%-^hU-hI9G1 z56!O)JoD`5lINGVnFO63xm5o4*&PpQN?3ybCv}8n>7(up;p_B&R}Kme#clU6{BvX1 z-EeC9s@W+zI`hxe+vnHz>?o<{SP2iW#@?_DhPj~0{eV89U21=Cyt`?BXN0x5DRJ?< zhPXss{F1m6Qt!9yu_`k^HNP+XoW_3;5b}=2IV9_0xhQm|Pe%$B)nhELvwWo3sWzbkrWH-L?ZSjjy(>b?}M~ zeD-GHk87`-o^d~_3Q(P zfv+z&?2FI__Z3IHt3F*KB(9p(MLI!fZ+T{TPQ`UHX5|h~-pwIy@NO(IJxhJ&JO~P!hJ@M_thT^+I6b z)Pq0ivorNW;X!O}C*HnoES{G+KG|;>5a6|2W04$o-SpIhl6}RVoR9sq`Ej!sD0X)F z@a@o>?DMxm4a|tB+b+81&vyivZ!VjfKZp7M9KPdh@`DpccW-{v{?pyd-Ga*cgCIy+8c-NxA)*4&t@ZQA! zfyp%=e-65@j^sQv?A_`8ap=K-iAi(rJ>PW6C)2sxXy>B965;2vp|n-0mmhqratm-e zJRPFEDb+K3*{6DcrA--EZ}rzT-X{C^fgOFE!mZ z6v|&6{Y}RZsf~3nnv7b0#5<7f6f^PNOCPa(cNJTFcvIk^*38Uy-CIPX*j9 zpY{k(aBy=5br$J=)!U83gd^wgngSawcU{sZ=Qt0B7fs53sJ9@-=oeBgY_P7*1>T)i zFX7A3iTs~SJtqX5-@g#=6fIhRXqa9Lmtzk`L8v!rkbWL$>|@{Ucm4O2fLhjlD7l!j zFT`*!P8@KIow;gjfU)q8q)V7b+QI!HH}9fD^v7Jhq?}OAtTbp3;ABVYZ#I*@V95_K zf|P52$XxaKjy>7+jJmg8ZwxZ zfm@aI6uMt@JhA=9=S49`FF*86+z?}(RSeu|kK1v}>ui$UTlfnmc~|c6vWg9hz&)e` z?I+H8CER(Ng=|hOgC4oYWO;cstV;XRv!OHhTXlru*5fmr1LsP9eV6AQ`mk$vbZqO- zx3@1^{b2aS*?PMRBui1v{sVzYL}ga{>XpUG)gQ(eMR3*>&RS2W-u+J3U^lpVELSY= zz*@Q2Y-o?X@+RbP&x3Zeo9*Wcp{#TZ|MP2KeaQBFyL3nEU;q1k*<02RCfVK4mmb!) zx69ui%03*BO8AZHx#c&{1%KlYddkjte2)bC zPeKA)49~T%S(!s_H2G~WKIEBMU6B^0VfT_UqD#(){qLSrQR-aYZiw;Vvbb%6*Wz#Y zfgB=%xZP#ihuhvHe679T@~OXPe!=OK)0d5-2bhg_?{wyRQf41j;P>4e$oNptl^~YQ zYSPK6TgeOG8U8gL=laz9lCd6{r;`}F-hX@3GV8mK>9#EP=BtiF>ylF4^1fVjWum*0 zdfK76X&2FLchdL4Rm@)>yIu>^neg^M`9DYZ;ull?{{j45=6-9sPc_w4Q%(2jqNWSx zl9~t;Nr;`2jD(30TFzV>gh42hktBqPko#Pc*p`V98#{>2W!JEFH@4O9e1CsIk9l;? z`FuX_&-?v+g^RL?@ZIo3HLZDN>&#owjTn%UiM%Z?6S#ST!N5Jhkx#i0Et-Cp^{yy%d zjisQwx*%TRBf}qMP1PTiQ_1yK%DyQSonXg$W6|;}eqvg#ehYu|5!X;o;>@i+>Nz16 zpE?6{><{LtYB}Qk%!p4iK3a5mY?NoZ&*_AIzH@8YuYt7rw>&1Gons|J^<>Z{~e{=$9` z<4`4~3pCQk@q6~|O+2u=Uy+b6@>uNn!IpPTRo^Cc83r)NP-OS=((nGBBkFN%1spVV zd6?rlIU*(qr=SzwOWFiDqn?iemChAe|OKDl3z?)G_6g!XW+`Cx4+6T+7}hxO%NA z+cM5=>{~_gna8EEcCrP)2d-H%{pM7*0ndI+-?w_&+1Ftc4cOaK>P|T<4BixfUftx8 zki&yEqvc)%&S7mnchuYaNP+tC!u0kHPg+2f*nA=(l8 z;9eWZvzli?AZ*rc<0`paA*5!}Hkr_jgdlGz_K}@*^q({uO553qQ8vt~y^BO1i;jvW zB!V#0gzJ>k{*bRLmSgD-+#Lt)6W!^vgB)tY>=hE8(w)BODFu?M+`_DA!;ijmP(FUA zkR`!jgI*@MX3D4i`DRAk#Z~bJY==aD%ZC3eZyvc7rc1Eb^|VhC%5nfZRzC!ulG8rv zsR)A2mqK_h@v+3|wVgP}n8nn&#|MDpS+pB=b~g^@D)Su}%mOdWI2%}L_#b2#7Pcq_ z(DpiGPW=t{Ai^zfWuZhk(=pYL4xf-xm(vxaJ?af5WznpqhH-1z4$^%VVb8+le#3Po zhhcxz7Ukm9+S$(S0F@8&Vg9LTm*Ws;H5+mvI7x%Y(9$~=5TVe z0iFOvm2cek$o~UNL_54@a%BZozyC~&cPJl>qhqiPB;1bnGLs7a0fM=3j2`!pMIj(y zFaq@{i`|TXha4I=X``pZi7FReCXCyl!r;8m2hT47lZIwpC`A4(->*>B@As;>xpr00VvwhY z`3}0T)Rk(3{4f5v9N+lzYi1A&2ry74eg$~aVCQmImeh4 zjYWVni}J{*&E4!C@9rG6f7R7-ZbL8kXL2!9>DYK9aPsR6^tzA9KQO&8II$gwo8@+) zyeZ{r(W!M{q8*dtm?kc9?L2;DOuj#Af5UT+qc7%Q_GN8^^qA)o@-l~@8`>Uud4Gl$ zdNUj5&;hIoo6C}nb-Dqu653fh)|FoIrIotb0Wc)NnLDSy$=c{91%0wMp0A$~V$i*4BB9;WW4T;RgPnGnOMGdku0^oE zcKjqf5(}HsEz=)#YQb#7Z4I zjez;Kx*b^^(idU7)=`#8F~{9Nww~nimWm4E6X@7=0sCWQK8al79V6{`RH(FJkY@Z_ zBki?a;I~@cm+Xr{B=3)y`0+0$6@P8w^@WJ6V$<_ zR7l}=JqOi|ztCxNIr!L%YBtaw*@!4*f~Qx%M`(?9%w#)o1l_MnXzvVUxefY(p8Qej zw8MwC)&x%HPu!PU9fAWV(og=5P$LS@PER#bM`IOBwoOW!WPztbz0P5d9luZt& zL>pnqLHkqU^qJ+fmyQi#p?PZ5_W-SxkBvP5I@`&8z}6|SN2|l>Z3}47Q;Ct}<;I=& zTP7!RNq^{RgLKjvExrdK&9;YmOR#tKq*VYd{{@Vr6Yfe~ujx_9S*@D{O{A0UET=(a zU1u@=nT__EPMSd!Gb*U>rIdR%@^TyWa#Qx%SjV{ zAcdP7W{2txsL!-#C7(KWlnd4CX>X;pO?>R#1Goo#+TV2Z7cRMgd-C8vA>nKSXVevB0XA?Wl38J2^JhAh;Rekj4l zvEW?#1xvG=`3<P<=XNmO@4p!p`sV+S_d zPIwEDm$FbClcof~7zMdPj!pHf{4@A}j^#3zWUv`*KyIygkDFiz>K&9iJ1{ow0A-yN ztdvt9BDa3n3cp~$C+*bVmy!xtuoR$fRyut_{s(GLw%^SRy!Y8a&URpqIZ&IK!ap9w z)|2nrDL1x|=GnRo0PQyx<-VMJ^tXt)Qp#;Pt~;k=!+4Jux{hT)Loyw{B&S`o6Hjx= zYaIp(eSb7T6(hkOcaZA!q$hORa_O9jCfsql(_t2F$b$RDM!93B-QiQ87~^)NUtB|O z_{jsar-oc_BK|B*MZ*=&8>o8$D3VVZu;J+vG=S@Vi=0sHz=U$gN9R(0-+)g+pd(z` zbv@C7&}Li#4(Cu0*~kvPBHMti(vzQ=NIT?&0xmozl494`$iF-AMJ#%d1lwz)p5+p6 zNJ&2+u*%_doJ+jva5B=de-NI(mXdZl@CAHs9+z-|<+Mq}rp4Hm$Q^wis|ooo0gYJFV|&^i&~2_sqVfIRsG6m>pi8h?Y2$4jx-<Z{ZYP`vXg~3BArkCLKKggb zJLQDM+@eDO&CDWonrN=aFn$s+_Nw;!G551}^!S{gfW&{j?a)oB_;~G&uuc0_ez7zb7oGU!v_qsQwZ_2oSbWbl|SQ7 z*#0N+rmO_qk5dlW$={^ta|o%pwD&gBX#?uW;$j?_b}nsrCMCHJO9xP-liUDM|8*ce+*Ku+g@Ig<74Pq96jX8!gfhp$_&(h474X)vPAxTfrHv< zBfoZ>&!J~8`pdPZ6nh4s9YKg^0dgp-tc*YYgq?Vqbv}7K&Fmm{15S}O57iR=*fl-z zoRs7S;4cBRGYaaU1fQ!X{k?(K13MMm!uT14Ha*&rH81`J7=Mj+0s!!OlrSf8^!T@Y zG7AB-xU?U-pa*t}j0>>o)cX!XiB&g0N1266&n#S~9W&H~e{3gbEg)}7y8O~af~4>T zJ5`CY;5I56;MXFhDl4BiaA{{H@0#(LSQBo8k$TTY)XDLgl4~g+X=xw-bg9QE_|Mh? z*j@qDD{->ui5))@L~^k9Bl(b>@{gRdoK=Lv;yQm~*qz5W$J{rLudgs*etrR{<$qV8 z>HvajsApYJlvhF;Ap}K8u!$_7J=zIn)QjweW0(JUGUS5$#T4^cPHLi4+vM=Mj;DiL zFXkNuCnBgy56m#p&H?lvyoc|55Y>dD{%<|}fWkeUqF`O`u;k7Di*fVCeG7}5wj>rz zcawAf{%}{B_ijRYrS*gV!AC+#2g~)7_`cEHk z-Pjas_#UBDn#0O>Om@57F3Q9=IX;(}0|n~yWvffx0=Xa20SFzpf0r2IVqDsFYA-YSWs?ZZv^i@C!5e!f?T>NU z9IVZh7Bb%7+DhvGMSxRDT84Xx)N+Z(H+3w3bDl28w}Lx$@KD-{dQ zdJqho$K-6n|YNn*Wbj_2#mi3dkEPHfF#g$NfJ%m6`FaEEcAr^!tEv zY;aQ@2T|u;ek-c^oX^+#rZ5IXez}PQz=5(icGJ#^?d2-nS+)$@Fk>z^Fn=dGX;j|j zI=ia8+h^@)c~8*3s?R-zw!?Q8KGg*h+?n~W4@j2Rz0d?Boim{sUBs(IZyDooP5x=G z#muU7XHm^Zf>&tmxQt;|&62o6jQ2FgX53zvQUqMRCej?R#dnQk7U5uqv9MNl;cLdB zA23^P`eaNVLFzVn+!3g&X#s&G@9$Yh_7{7gI`g`8FK|c2VA$eK8|+^fDn3$+KrvSv z_YFPTa8HKJq$_DB7OSR?vN@?-esq61-i!MJ8&fBsrP1Sbm}HIyR>AG8$Zp z0=8nB4cp_<#kbeg?Q4fj}jb^zl~xi*|@RexuJp8vYu@-Ns83WukAHt9jycBzuq1$f1zr%$#{u@8SXQtOaeEDX&ey#nAFQ?H*4o`^z!~44 zB-jUO70M)r$oDm?$*G2=oID)leO|A|Djk8;v2-c@6(8$Wf++o2R@p(u zq_V)!elvlQVDWp)uV#NN+@6T$MPJF!X529cN6J~weLQ^Hnon3ac7W$?2MUH2;^#_V zk#e{Y%!xe~Sr$z|9gc~m0z8KcN{$1!*aWG{@x=(QCTQsgU*LlIlV`j`R4xX+5*-?G zdaG~Z?3F8BKK%x)@5D8gBI@wm7x>D2ZJL9NnQ&F*v(6|C8gAbj%PCyH(A{z)#R1P9 zuzH=QcVTKZn4)YIWj12oRw8X*Xaga4Nye?quXQU2EJR5UNJ^KJe#~}dj@hc?=js&@ zkAIdXL!l`*tjh&XtZ(oSxFVv2hOEP}5nLk3HJx zq89b{W)|@Q1LwPi&s(8@J?F86H8B%n%HdhY;~wZxn^BVq`|}P!{YWNVc+)+ zISUS(5AAgq7%FZ8CTV8mY8Q;vS@Dz8r_aP648r!v8PHrwX4G}Nipo{_Y?2|7rr!W| zen!jup7hAloGn3^7IGh_w{U+Q#4d(BZF2m$VF|*Psl3``=Rza#(y7Q6|+id7PE1$6Wswsk|ypds{j| z5BgVXrVM7%=XFmku(>Uq9D{easiO9`)0T}M!DKkVUCAMH@Y9N(KWOpSDgSvQ3*;Q6SuI`K^e_eQ&Y|O5%c%?#QPSAinm9 z$1*xRKg0ZC8X&;=^RV$V`lzx_q4$kCXj8g@u+A1n`gbSN*oo0>eAerV;afU3)G5Pj z=X$gmgwuldkXJc=BlNFQP@8?XRrGUJUOYalt+|0!X2Vb50`Pd1klPl`!E3}&v9QKsy7N6RCczR(_Kj783Ua6WPsoEKzurK*ykQg zb#qHOAcJftQ2d?6Jjew-rK%O3*tp70FP0*!5?f04L=DO5bbJmSaIt&6y`x=V z1e^eP1qT;6p!6TW2uiDqSgI(A!fjXqrJfn?+rRpfA{Ze_ZzGI+tbAA%HB!yA1(mX3 z;=q|X13(nNy80y$Wiwt&Hj<>rXRw?s?cB&-Vbq{7`h&2$9fiQ*U^^2ppP1LFuw^H}4fwpygM-P{J~I_GE{X+e{9dX3S7}^Ejs!%U4LZ=c zF&17qtV!hnerT4R70I*V(oKjT3vI_$MTz{EOAZyE)RofXQFk%^Pb4Y7dbUjA(TRX2 zz^xOJ7O7LNoO4DAvjb4jaD2c>JnVUrt%RBxj;@KaVs)u&mkKMPFe|a`q?z{wTzIx^A5#_ab<@E^s zoZ(#?%aL4eEM5m%r)2gOD1rtQAu{OT9c;NAnzMiG+TBaHl6WXjsG0V8?@~ZJp;JM* z54xdOOB{g6z^*l^Ie=<~Y&_1kdl65ysc!t!SMI<3qG%QLWJqvp*6VVV3Ua#LbywHJ5XYXW<0F!0-EC8U%5YUJO$S^;&+DPMZ^W~}#(-CUVJ`etl zj3%%}qLkbR#60{Q0HN2ZE4doaR#iCxM+X%4r`R|tAhY9==qMV7TQnR1=Qdy}z$hba zPgbxug1|a3QLb52r-?*$R+E?C@0!N1Udt+RCB^V+hsHG$AhbehMopy=v;6}o8^OjF zE4?EnvrRxKzr(k7Ean{1;>iMw4cc)$VWrr@rdKcG!&qDFwM$T>4j>w_D|DE^%9xm{ zT=BNttb@5Xot5?;WAA1tfX5T`;xeS0C5S2zfPkFpe2&6}pm48KujXO_9Vj*7XR@{e zjvA*31aANviOh>-78T4^Zajl6z(?E5qmQepTI$f=VvX-AFIyD2WRQ3 z=Z)Z#kDQY%)%v~jWH}Vf5r!{6E$=Ht?!j)5)X*I8@vXpb>DUlE(rv?rvygN|vuPNK z7OPVTK)fBNtx!`H8lnjaq(j6W%^I!-%LjAl*oKt~@(456gt$ncTXRGWKW@vDReQ&7V@aPdhe-!p zPtFa;Z}|msYK4kf)r*Ykaxq@?RPlu$?p3KuZ&hOJ)XRC=aU;7w_b6JQDQ=!u2ppya{xvRAscn zTtvO`oeFKEULeC~uzaedS3|^){%USyaqQt@but}Ekl`+@Q~1i&YlpE3b|mSD60&Q) z%~53Qs}~sHKn@`0O2}N_^mFhs@m6pIKU=EiR6=Y%%pOsO^Hni*;|WG6u@kpkib;`o z1|f(*jB1Oj2wV}^sR%=V?sBLOyWXJ=dD@N{Ta)nS};nsuBr%i|HY z7`IdfP5!-P#rG0<3wO#xF#BP{)T0WL9J7>PU1rl3npi;`AZi%9np<5stlT2$FJ@^= zZ1{W~6o&%J!`doowcMzQk*bzSuqct4>)1Ju@n}*P3dO!yK%~ug!Iv7x;(xUHFvZY^ z*SI2iwH&y~kSnI=YUeCn_R4Nj<+LcD!lGYC11MC}LLkWUw?V+aD z;ntb73;8NfjtW&A%X{#vOt|)bCvv?mnJwA zaSp6(MEj!yciitrvJ5A;Y1a_66J-!2k6M)uEpq%CHXOO9)UfZoB5MHW5NS7{*zYis z&8aS{(=H#;Oy~iRp=2W+e|e*Jq8v%!psS2_i3vB|1RcYABuj@fyphqglmzlQedd@3t$0@->R<_)5EW?F1yL_4x8u?F;Izbbw19K&I;O*&O92BV5AA zmq|JK1|`9$D&tfyAJ+cJiQy2GzKn+97f!o&Y1fM}X}ad+C!q^#maZUF&(rVt$SWwf zqrY}LYDnhN0pEApiH-&TeRqYPgPp=^dx70|7|F6hH@tQ10> z`uPFhr6%>H6F?$&=@YLpT#`WlDctF6-mCVRXan<_LVAT^6@K-oIJad0>H+8 z?J7A=FaU7~fVlE#Xriy;(&y86wf{va`(7COyv7IgfDtn7iq7gE_4vDc6+tG`#k?YS z2}s0LuR>Pm>XZQpn26xkIdIhhS4bm@BHdpo+nq+Zy|J)Cx)aEhR!_7$dGgW!_8*V` zz?Lt`SbrL~BpiR}ld4>Y|6^u#p&be`C@-GGZCk2I%!e6r1%ZWKO<0*X0(k-X?dOmn z;|H%gcmbkaJrY`qXk2xQQbKjq0Kzp?&*MWhZtW`hvWEDWNG`(f!OgMzq>~qKy-`_n zZ*1gG)(47@Ho~L`wrzG3gJ}#+iK{xc^30>GDRa2k4gXe0b2YgVY&u<&M(@j(Y4Rl4 zIeJayBvn=qoM2KXGuHEYif;sDvdnKw%c@W(rCX&ki=nB`z^3bWIM>0NrSVxj)rFdG z0-0uRs_b5^3KUt#5 zLo}%Xy1$w@9f4`44cRqGJ?4hd+jG*cFW0=^32S{o9s*5`|d~I!fa0dG+$?4|iV8n3v2qkpRDaj@0qI7~)OHpCUUj$m&E1GoD<2eiO zhNevM{x5YUyXVHPkg@WepBB!DnA7$h^QnDdwMd&?*H*Xt#KXw!g-xvz^Vx@-+2`pk z!+fqgr|j+^{q4&v+vb23>1ObLv$Y}TRKdE-uhI?vGtQ>{=h_u~C%c+HKdo@+E!k!I zF5alfa(q_AtW#?WU!G0BwKe)s@xv`$8kjYGHLstczP)X1*M92aNBS#p&vurup!RFO z%R}E_ZUzN{-D-)gB1hyD3TC8C1PZkh(aa$+9Msft zz-86zUo}b9v;I3C$)4mj9hpY)w4`^F#s|-ux*Y0@tMQtZer!hYlv*FJ%-a3C*gV2+ z+H{vsYNA&Tng@@+bl!5uE1TJFB`!e%w}#*U*I~&V_ubh=cdC}Vy%17Y)C6vgINXpkFU$ApHk)jVH zWH8#Tko_pS>Ew)_>mvCw9ZtCB=yn+IImEY~q@@c`B#I}w-|{<=1z`V~e4>%=$26Lt zC^vJL%UIVHV0F~!!me}CT}u^MQnl?P!gv8beresR*{%q4=8RN_~UrjL_V1+&oT-66%e*fNef~uX>NC!iiF?SK(+My z&ZDQx+AX0;6*C7GUNm639p8LP;mya;YyXLWNz1!j5c>>kUw8R;m*rmcLX0heqaDFLC<$)=MRDwHMyLtXtCkpOSl- z9NzGK$BiUuq44Ju)4olodyhYHoH7l#wT2!ad!0|*9sL_*ytX^#*+fB-RN%bl$1&mk z1AP^{@t+m|7~Ys_84DoIbU4o11Wq zrQz--x8GqW7V4wcW<^c)XysRr-iq<5zq5+ReNW7T=V{oN`iYG;m)Ju4>kyFAnCbuYf0@w#=_R0BkLuG zpxl!OmLym->z~}6KR1J&1Rl+*p{pMXn%VS9IJN_YBO_l;%|KVtzrNm0Xo)>^zA7|1 z>C#V|xOa}8xY{DFtIPHs#2k436S#O<-0sFXEyrRAJLrg{ckP?_LpDrt?14)&RzRT* zrz2i}<=@sPKsyg?tB@s~Tz_Z3WZdx^hnH|KeSIJfaS3!i+WKqulk7EX&P{J&Dp{pt zj?5D&?gWqd#fshgo=8 ztJSk})~$QW#EvH4s3qV{I+b6#_^0DXS@UN9wBSD#@%>kP*beEmj5Tpb##%v=2On|4 zMAl7yc66?4-SmTx9@WkmpEVcze(#*K*!fPgm~R_q1y9`a*J_w#K#b?A5504HxdVbU$QA?KxIZ|1PgeyY|q39h#UKpYVaq z`@8QH3*(P(*!5oM-gaS;d}Gd?R&j|Pf5f5T7K6I&z7LxRJB*X-@67mG8h7*IspC_x zOz9ol-5a+H`KxzDV)~3~UfqErP5b8aC#J94d++Gp8i)y@;01xKfNg~n8K6iU0w5Vch$|eQ)@QNj!YWqDbb3vrhe|<4ZXl7^a$8X z^-x5I#q)aIP2c`}gQwi^^HJY~!{lYdqCbz{7Hi_xeXO`!FAur#cH5^^?Ahe+gINs^ z7p>6h#R_Ke`DvH8#b`$Av(g5_?Ik9oN9380Eoo?ZaTHkiP-&M&R>h*f|eH_wze)R!3C-x`kpDnrf z<;%+??=C!NCf559s z<=@wGkN&giD(MGLY3{g{^Q}rxo++E8u-<8wd+W@EC2H36Yi6WuW>J=r2veqv;e)R43 z;wbkEZpH>&ETBpIOxJ`AU%d3;SxJ^OX2a9?bKeqyNhy?eP08d#2fE%|-GPmEv@M)( zY`^~C+n8c~_HZaE^i4Z4&-Pa;?|m1)SApXnu31|rV%zzywgb(Z4;ga~?dW5MzcxAX zg=jZmWSS6{ui!A1-lq@}OMnKKhvl$*tIV5{?M7GwYpO)E$=GkNov6ZDdi+?(pb*ig&L>J6g9F^EZn=L!~UB4=x z`+Y9-|MtQkD)P5HmQQVX`><=O%;Y2!O<;C%+p$NH-w2f}aul>68KhGXSM9Eg0j=dj>v;D8i~h559l=YtyBI1OJSw zK8&hPG^m5SEy<%`)ZYGM2pDQpFcN0EY`**J(U;h^CjW<7MYZx{l4}+Zv zgG|nUfdpnFX@5FzGPUQm36vq@(r#i5i2rMT_;d0z0R}UM4n+2=Le))olKr}}re?|b z00D@Wir8g$2)AkHYzMQ_ht4aivxbBE2~T-@a-wTgsUNIdCgN`s#pKt(%_e52D(Z_c z39+UPiPBo(G?Q=__ottqWlfq)9lOd0x{$~9y)^#I^UG)xih{b@U#6}rxNk5eel-#K zJ5eYurosG-Qs}a%fc@HpEgn2p5#U<}X666l)Mky5DzFBVTZ?5}g$2Xjmbjp29t8{- zw5BzvQd+Gso!~^OFuuW>tb-F-mb_xixHb_=A&TCah<0=0pf%Y5rwm%CZcYq`GPMm( zb5oJt7P8jAS*$FPZFwULnR{esW5C$l3`H*DTLH(at-gG7Uax{}5a1~ae+uL&Q84vT zT#Yr_C=8REf1d?&xyr4zILY91c9oJNA&`2(0Jbp1XnEo;`1Dsx$}kk6ws>+tqC*^# zZ<*dXg;1LrVyLcY23$rILA6~0H6V!suK4yQ2J@R2N~ak?jt&Z{QH&Dq`S6ut6km^_ zg%#6|J=vysQt_0MW@e=;on(CXN{ERZ#PyolHOf$?l1RGe#I}U?bT^Gob*CtGla)R_ z{s-$!gyPn4`7k3PlhvS1lv$%%g={o>^(we(qcXU`+%GeSppqn06>by`CiA_yq0g5I zTupq^n2aBdh9ODSM=MOEhSso=#m>V3r3~>mgocbNa?ZCR`<2)x--DD}^jw9T1Qif1 z5F$u)v(i`)yH1wM!Z7j$k)7}w6X@P-I_Rtnt9#~Un{#c>Q)f65r5hj1Icy*B5-oWT`dMXbGSwunm@kP9>Yu>XMf0y@-z;7Nk%_z5{}2yC|#; zAtt~)Bg7g~gb^UuW`0PQg*^RUW|p=ktB6V#;>^lkv@W0ic$RVcZ~;%@?39FHa5 zAIyPemhcb1?U^3X6mn;nk7Oahf2ZSkzD$%Cmi6Qjv`}VH?A*gpO0%u+TuMM7H zJbYyUl{Devm2gC)*56?nhYFo?Rj}OTs&Bj9^dW8#B&8{Wn3Knknq4O3q1Y#{R+P%L z`lk6Bl&U05REV27V=u;Kk0ME8CCW@JyNL1~X0Tvht%^s1y~`%KcL|efRVh+Y=m&&S z=Fh8uQ+RNACG}tp-#bB+G*+ofqNtYU3ZlzYshx1DPSm!N?=>JChlo;*aAc2(?l33R zSW`_Zo?65nRXH^axSi~@NNWK9c4kbt|=4nb>oRXRYmK)xV0A7&PdCeSVH4mb#vAu%RS8yvzhH`f3zSCwBU zz(HKUBP%~9aM6&~|a-&jxVBliFBKbF5(6xCp^ z=u#$el`tw?&{YB10szC0;Hv`A5`M4g_xYlf4k&~rayf0DNLQgJciae=lC~V~vZQ{2 zyfK!}_X4&G4^&x#oUr$ZHr@Y9bdeqGSx!T{l`9~<%%Q3WdBj^*LK zLUcLwaIk=VLXVCqAO_+M2;Jlgc2!;95>}Mn>OaW$%NCCRv>Q-^DRn{*sd?5J3$GXb zv|Cc8ssIAwH`c1+As~Y-N;WB+^1*~+m{noo}Y&_yXIj*OK9H6cOq zm8w*pfDOQih8mIKjZk-wV)E{h9_1YGEFEXq88c^^?=4a!ys!fuXZ!GHk> zXclqW1Pr}3wnE6VgGoA(AImfp2;oM7*ff!UkBOo)h3l+k#Xo-;GXfl5e8QLrW4ELX zDO`GJ&n^L^QNWJ^1>~v{bSrP17H*jizW;#W2TUR8;%`0YM)=d4VZ!U+aV8MgCQRa@ zn-+j8fvcA`W>G2H^E=cpPct(yLe?;pmJc}_76i75!qP#HbOBao zPG+dsY$YoJPEE65dri5b80RtpPHzgYQbn*Vn=RJZ1R#Ht%5M{R++P72E{6{ZYV-*Q zBhfYQd_#)q?`<%gKouqN&*}=3gX0IoK)mb;Ij&7pcn~jg#*(CtY%RR7Yd*#lhrV>R*?KfNkxg( z8h92uHT&~DABKoKWRB&Cystv>ZGwc|K&T#GmHN+?FQ&wPZtGhURBJs@S!N%czMpY-aTA`G&lwIf*o<87ZJk9r2t#TuC3M}H}lH=aB`V4<->V~ z9>HNm$u$C3X8pgpfZwQ<*Je!~P}NNr5DGSIIio*78@) z4_D4ahhn$+jA4m!fz)&5Pit4-fri8w=li?<3b6byE%cP>sE_CL`NzV%#q7DWNmFV$ zl%cj&_!WmQFJ3J%+4Nfvumb1B84Zi3Kew!US#WTmaPcpfN-dwIONzzrEEv4Dcq4H&ZqHy0=riG3@Rs8Z-@MJV| zDj}}WC9pf9xZb4r=}X(dwy2=I$iRPOQ)#~367iD@C#TkKO7UpE>~W$CKlcUYw$$QG zpf|3+PjpSVQ!h5=7ZKfX!^+*VM~X!h|2iES$7`y`lKswLrK?Y!wRzsk9rv8Z8ZxA(HE&bOGW2Y24``*GB{hou=~?h*%TcrLfuy9dR$ zLk_0BBsA*REpA-*^3rb}(FvcmJFzENT85~F5ulyb0Xkv5Q^eN&MOU||8fJ7MGxxZ- zp+jR7Sw71nI%))Alz!8j(WIx?-}He^$dqcY`~gg3+JymO&=38Gj}Tc^2&iS~lSAE| zn4A``*i2U8o~3^EN}_k#46}CX_1I$Sw4)<$_KiDnHe-KkWa}iKjF$_4*1K*ulm&T~ z3!T^VfG_Cn~wRd3tmmUm3Yzx}E z%CR|JTbnO$Il8Y(Z?CPaY8L`IEB9MejT=d&t=varSy&9kjRB|vOXcC7WzA2Ulnhz@ zn;jT}M5^@IPOu>U-k&sntMBrrELi{hd5oqeZ!iEae5+i%k6fUCb)fyjFz#UCSwS{Wf-=(fV~vs~g{rA9KQ+UGM`n#Ka{WL_ed7KxNqf&9*T(!t9XI_Cjeh=lqW^!6gSoqo{Pp;s zVKH?;lF3L1K8aX756L7Sp?A+K@1KXQ-YG`q%+^v;+<*XoN58EIu@kCv54_iNsbzzQ zVJ;u`)*6wy@~{bAl^On93>aL4#b>8X;gYsXNh>qBylaJ>Pdl8PY65+mDwR&x5v|*( zG*V{k8P_B@2{jgZ?-Wbv-h0qKpF8x~4)erx?l$?C!%)dE)thb$ol=Y7uT~!TG5m-M zHTfC$^=K7A;FK#N6U7K0@NQ>C$`H@zrY>TYL=&CRgA*Ig&_+FZ4dva0!3RAjU+R>= z2Z5ilN9YzvhZi!&UO6Q>1a9dLQh8b+kY$>bT2Z8QA4VNBj?np!5qMep5n3D~@Eqi0 zxA9FLPsCl+(+0@BtcZD5BE&ZW)iDeOah6U23%R7VNG7)Y10NUxobu&`Ia@~Ycg0dH zFHL}+xbfj~DJH&5c&B(9mlIQUDi>IUTUsqsy#3-KR=k6MNukejurgaVze+4Rjp@soo=sq?#NY zA=~16Mbfac?oTI9y#ZF#X%nkrN%A`QhnyY+&+NMt#?z&_k52NDo6<@8mlb25a(pu! z3o%YIDgAAyhA|ZCG>1}1nBS_TmPs`w@>g__GsG)Fg#j*zOW<4bmjUQFL6D0t0w>gc z!iEe4_+H6}T}$^*u=;tlZ=Us`$m^Hcn@ZxZ!Y5cNu2Ih#RBHFis+sU z%=BOFq_qS&Da-+cUMSx>!E_k6bfx`3k7CO>2IBHLznjT;L78t*OlM(om&&=dlMP2a z)^=KNmq~E(SDSq6xESB>hiAxYMea)5q;Q)aoLg*lov*u@x`n6lDn`y<8MgYaF{nbD z71WdB%utE~7s5c?J~J{{I&jB~egoKU(*{SfASrL*>P1y!0?M?*wCTN|*SE?eE^!L7 zkly4K)&*fQ4p6g)4tw6Fr<0%4x8|aa_z!s9-pq>g+c5#y`r%1|kb+{s9fjPD=!I-K zK8dLSx75vZLEC3%OfzFbDy`%8ey)y{8G!oyTX7f#VeuCWm6ig8-U+D5v=w4~0adL1 zFo{Css9i_c5gS;s)LL0Y>wap&pt(i~P zvr;D;AjTW{7M>SGQy&Cjy)$h}KS)h5ARFvK&;na^&8Y`Y#Iu)YQPa^SaM*91_8bj#H;Zq@wgRvZV)4CZQj1OJ8gFf64h49A?a5lO za`zR@*~}B!cXoF$J?()$tLc;R-U?a{r4WB)IAeT6z_x{h3Ietrihg%^$ELv-kX)>d z<{9BpO%XZ16P>)dPg_;_lFX885-{aT#?Z^(zP>{X53x>Fa#h$0v^RaQZ~J=ND@JC% zkZ{7jb#?zM|5iIh(o4s-uIf0#xXaT9==d;=a?S5AE*|%AdGN(suNd>>W-PybRfXC@ zobhW);MHkc7Yzzq#X*Emf7-c1b%wTJU9cF+#^R5khhZp?`3EZiK(H51lsy_Ggx zNW7FPb$M7>op$x`+90L?8^O5A`_f($?`8&PnI@&Y%-OzZ6vQ_216^MJS!*H)S${c#qN4X;L-{Nr$}kFFMJ&W zX1;>-v}tVQdm*k7s3RDi8bojnIKq+mcfN3v^U*UZ^9|_TB9KIy?vxaQc`Vnn0WMnr zT!G>98-cIU?9u?wdQ|Aw4EmNR$a8Bpq$zO{18F7k|2Vo2zoZubf8gh^H@I=2xN&5t zXlSN5Q?tTtrgczD+gO^m58z&5saaX!Dl028D{r3$sFj%+WtuHRTh^@`ZM(PPcfP-W z0Oi5qoWuLP-p?0JE3l|gqY@O9)03>JW|pqmxZ zDqw3D7!|F>Aa-Vqg0=q>#@KPqpGm+2MhmoE20&t=p1*e2NM zB&{2@%X|B(f*Z92#8%8>qew8y112D+ped|lZCq@`M*Dyk)TMi1??xi8g>`ZzCRnA% z58ub0h{J6*{1XS6yJ#_DmG^~m(^-9XXtu|jI6PSeZr|f}whOtsV*FvCTVS5F7Qb4> zPFG=1Us&| ztL+tRg3I#+uRiy!H02TaywF3ZyaJ@bdXTwh&>ojZnScLLbe&fMPmkv&geCX;!E6E( z8y=MqUOl@OR~NSKXyA{}^EcF)F2Q^3><+QKIVU+UYS-Q{pQ%Xm2Z#*2tx82uJea?n zvLGE3{ly|K%O5 znjN0l?G=@<*sU*OL3j8%V>;*)zEMSxb}wAe?U$D)IMnCY%Zm=b8}+0vXik0n+|l?T zpO?S(h64%qb_>FzM#JcN^LPma?R)}(7jbBD$dYeCOMOBU7cGd-j|}ZrmUM+J<}JL! zOYY;PoQX*Ceh}W&C*1UPvA4y%RU$67(9jc8}kL20Qi}i8)RZ9x;QYBwgkDrfo z`4XqDUvPFbYBD2jUuMh><8=Jjv{7E_vjlSEr1jTeo)REOe~o=Uy7)*w?&pK#bw|S; zM?;K!2tDV$D!--rwWN>M$IbFdyYp@7MdO6orkUPJnRAlnA81R6HwoU*pSip!T?QnB z#>x5pk5X$AZ+=^xZ5+AMCkxDr*e4sYI2N?dWI?>IU_oNS7SqJLrP;F^a4P|<5c2d( zTD7lX)xohBxmUqmJeu*)EvG$Z8Ph4nke zviF9e10WOUuc882fN-%})fOHZe(zzcf10gVPLht+C7v7eOBr#fhdqf2uXdi@_^Kh~ z`FFF-Dul^)$ySQ)L{~m6;HfKI+-z(g{4Dydu`j72K1rrP?EQhV5V_f@Q>M(ex;>2Aeow#kT=LfCOi8QR_BG=r8(DTpDaIZNaV9=Im=_RcZRegB+wo2Dwz za+TSiW^3gn<4-d#hpi(WqjanFCc|2+kd1qH-FiIOWLSk_Pg)@2?z>=%gvjD~c^I6U z`OhL2^Ci|)VA=^9q_T0_C%^CkoS}|&L1Ov3@nOWIwbv)wcP4#cl2w#!Q{{nvmYqP| zf*WVECe+qnL7S=?a+a2wGif#O(F|d=?G64(NZJy;971oD znBis_CM+ounU|pJj_tB&*|4Oe^gu`D2i&Mcc8_As3?{6qNK4ND`PJ z_N|B3Mk-<@G#mT@S#5s!CbdQMAZhporQs3thRDoLZH%a`?l9vjs4KK(p;`kHXA-?^ zO}P>}EYY*vMFiB4C1Gt3#TIxETlT08lA5hGlMFe9sL~qSy;?gpn-~&mMro!W7F0dN z&$oON`A-tQ=|$vP1$hQYrcBbV0)#~nqvj4>EV8<=+Buv}+0$HLvZ8(IzwM!0j@9;K ztN`OiwNX*9)#f{Jsb$Bhv13P;URwU6h3c#2rGvOR&1aRW)VtJ{}vgfLOuVoQH#{CfAP&9s2K`Gd{=DIPU`7j>wWA2 z$^*5@fR?1wBy7^6EELEUShPFrUEWjFc5U8V0oim5HQ;{4Itcr;7E>iE>KNzse6;)C z)BeB7y~Rs+{st^kL1Nv(zmm6HGD<1wYdUuB$gzY0_#!`8Tw*ju{PE&eEH2*R7QZwV*w=( z#@XElb+Gw_#99f;a$n=6YSvQ;>yOIM_+8R^k#aM8?i{v0__4a>tVE|diq~x)L>u*N zK<=(C5ATMsacp84XqEwi5RDNHkyQah6`r>FgD;CFZP{czaO zYsW~aWmF2x9Bwvy&t_;v+CR;vycTTSZ(0}>XgvuaVk*+?% zpVbwoAQ2=+DH4MNu*oKEYT%?%w1{$;g{w$={8u8vV3^!cGcDA#!G$pgRKOm%;M$?~ zPb%5Xc}K$w-RG)kSJl>Ilda!^ty7xyn3w67(o?p6_+9^#^~q@YCo`MvMcO;+|1lmw zm)~q3u5~c*6VMvf%)npPi>7D-Rt#ilj9ude$tmy8Jd##asUDHWx43KH|XQrJm~ZR@7ffUuV_!*Vw6ea&U{5*O*65 zA{w*}hWARs@x8^|w(XX_?JBn&*EHQQk2Z!5e5o`yR1zk*1~rfC&+$WpCE@Qhbv?D2 z^NSs{MZsIdQ)h3=yjQ;L_|1HwW6zZm?s>M}ypXx3FnL@vWMKhR3>15Zg+&0k3vJfVlcdwRFT9!uf@`>WodUzY8}wyU4(Y3!?zQQwZGSs!VLQ(iS_#3a1Br6`PHSb1 z2+m}Y@n=jZ#YSwP4>w+to?oA2>G^+M_3w=qJBMYR?`1#k9HIH2tMWusHzjz}__v_V zH^{T6B~|`!R3o=p%&d*WvyA%16#-RsHw}_4wofhe(J))@a@T92aE}u{BQ-f@3HJv1 z|5Sz214^|3&MWJ6D{b!o!tV8NIos1p^Y0MXq9qpCMnHR)=nmUA4*N}6ZR|JrxDJD1aPuIk=QQ_zuVMRVKf~y*F@LDI z=ku^K8G87_K?e+5C1ZX3V!ojQ^sj|T3dYT*J}1gr;cBq{bUEFIrIegw~bsZta5y5IB(KLyZ>H5*|3pl$f5 zqm!H&Z(C`M1%%r+$Bb zTJZ7r4{hnSI>r*u+eJTZe#;CZ(@yn|(gaqRxZ{Nn&&&jUd~qo5{vi3&58Bp`Y)R`hp z{IZx6bFS0}?B4Rn=m;e{vd`kNu7uyDIbNl*{UR!M8&F#&M-;2*cC&W=SaXZ9TYgQ} zw3_cXv;6a-@GuvWC?QQvh=?c-*ZihCL_PtjIjZ{3EbPv2M$Px(vfB9bbVtjW(06ExSUBVxOIEs z;pp{myfYpCzSu8kcoXI~wMRGf+zd)RyEP#Ig)+JyKIHCgbI~{D!EeXobh?DQOb@)SBwJ7Wzu;mw{`Jhp|zg zZR(5>hFt(M!aN-*SkT&rd8uUVC5BqaiRS-YY~Hnz)ADsMCN{G7)VxJFDhuVh?!G>t zaeG~nL4X7+R2fz&preIt?EwW{GBO7M+43hr$fh)o4IRA_b0Tg{mlU~+0!(v|@J2tz zh+hvdRcb>d&TGsU0Ms0S*1~l)>p_~lg)nN_D^+z?ES`}9qbvkPP7nr#Dm;O3MHpv? zh4!w~FrZj1Iqtd$o$Dwd)*+z>Lj|}y(G8~%pqbmh*_aALjAIy5b;Jd5R!%Q3lfTGf z2m;Aa6;X2_>AWk{xeGf%v#K2JwGOsFbY8Hf?Uv!`Mg#|&C80Dai#(@%I`glrSvC@# zd~IR_2Cq^PtCU5Hq!_Z3Pz_?Vsn|LN!NVApyjmdppwCb!7XY_5$d(qxUaz(HiByA1 zl2mFHhE*lH8xNcBjXgeOd=#0M4@IF_Y>{z?Foe;_y)o|O;KrKn%yp5t5Y7PUpuaG}k??a$(>s1{Y+iH*V5qTV339G9FIf@||X zyEglM($0Tklh)NgC;pOG%x6fX#Z`ALlMINQwJX|-16qyfQz#l{^hyt=C1jsDW+X{v za3wOrWk7h4Mv$7S8pCZW;8*RBe-1ykz-JCNSg;u#nG@z-WLp_Y znIU*6V%@jiBggWaPbH73vG?U9(e#v_k%FYJ`PJm*h5p8ik6J))6xo6QZQ+|A)fFFisjir9^^fP^3ld4Ls7PsBh26wC z&lTSzr$_eopAH4BQ$?#qzfcUmaG*OVwlWm>OF>hGcI}`RIccDgLu26%bvl%Boyd65 zG-7s$1pV_BgsIl~nmoO=$9Npj-u?&c{tp{1p8>F5oOPt4h3~!Fe%O3E{DV~k6#ZC_ z!7iS`oSs*Ub$q$*MGph#KCG4bU&})Fp=7+VR;|}H1$jbogIJ@2EclJvW2RM>Et8cS z()lIkG%2k_Ri0;+LAKTVq736i<(?02+;B8z)S9>X>{Idgx<+h!w0vtO_EjU1p+ozZ zh$L*ck8kalWCe{39CL81K^+J1ZtH+iHfBn#2SA-eDZi z?JvJqla(jEGk02LmE=j=>>klku;|L6OnK$Tx)+vjQzC3kf1shdPz!BNghQD|5{1;H zy@yR@~m${+L zaR8vGnDYaNK9ybk8Eif>9x?B|EiIRTraG`O{LA;MHocdUV_@8%keU!j`^lxOQ$kU# znMWPLdM^E&9w5hSQH26{R6%_sr*|rGQRjGO0@6o>m16&&eaGgyng~!$I@%0Co+C_W zVI$@%KwCNPo`QNuLAx%-$7;Ytgto)e?yCr+W`xiCsE=T3rv`-=nQl~4e{m_XFxF5< zA7j%P*D+_sRLnT_2Sh7TBw9o06+*lZ9*yM7Bw8wedRH13<5MX6olMyUU`1b{@jWO{ zfb>dEy>^qNMV=vOs8d?X8;G36#*LXQBc8=9fPj@c%6%P%qXLZ~K7znqS0?w?FZ`8( z`iuq30KyU&oB1*U$#@telYR{*1`UEbY$F%96gIGC1MULaMLhyPDwoc8-kh^9I_X?A zZ!DTy?~~ZNnO9l1CK#zX+%Ryp-703hK%?G$RZ5(pQj@x&-&c-5MhCd*fV8SR+Y zUn^O;jGN)$j&OvQC5>o_L@N4pLJ~I98cJmLy|&x6-@6`VXP4T zOiuFV65og^>i|$DCzY#k3Z!TO!0RFGWif597MBCy?{-BL)RTPnqxLFjy<(grgD@f_ z3v`&}Ds21<1GjSgR^6UXJs0N%VT%L=jgI5Y!1xNWQ4B(4BR)rmaU#LcL~c0Z)EFrzJ`|HPG?)bdn9e45F=}#hut9rpkudoy zgXqS^^vG$|5b6?f{BoH5j~*gcFlANa zWxJW><2uZ2m~dK-cb1pm*AcIA$@$udUxuheF6oSxRHnopo!+n?BDL!1JHFFBxR|v9 za+fB1DZ?sBL;6d>>f=)MO7S~Rrbm(yqA6YXZXRf?>guh!le76Q6LY_jdP_&Vgp{vq zz)($Qz7`X9op3_o{A&*?QnU9Go7}9zo``R=ycfTLOS+^b?b2fW8M_~9$mfLQ!(tp? zDcY$co!1fb3I044xDz%kP-0H*N4anbrxfH9Y*z<>*sY-^{3LfGSfK(H$tBjVMqUJ6 zW|VaFF<`1iQwfv@0529WT-OJjf%aUk-*cfN)LX9+IzvFNfPN0fm}n`F0X(1t`&AA9 z8$n@p;1z(b*MOUq)E+M3w3c||LSg~W_0b9>5QYOF6nch`{F8oA5}~k;O?`jO9U8mIk=TeyQBj^2!FK#i`*L^HyKzhWl(^R z7c6TzMv}?Pc;cj0h$ku_y-|_km9-R0Fo;d-6JnOitt=FHr5ulZVG+aZIfFuYjr;Fx z>IyAcB__R>yKHuCUSbROG*h@RkOY2?}bV;%7*KzO@4)l)!v z2oMolG=+hkrw0rZl!kt6G*%3pl2Z=}QRHkORYfHXSJ`EELmvV89r{y;LF$Wq!;F6KD%MFTicbv!YdO?H+$u7j<&E179x@^^@9L@ry-l%z`a$H zmvUL`*jZM&u2wL<2Pq5}l(hiZcd3ROihBlyv}?{(DU5X#5})hnPxXvl=XCTyE~Z>S zdCaAs<6@bypah~$FsMaq2tGQxgOXU8K^;TXQwV(=raTwW#{|@iFb-*uZvtrdxK~cV zC^s$sl&0@In|z8(UeCpNv%!7=wM601`Go3PO{CVmjG3`XcctOw$EGN=#P^bcH0w#wEYDyKT4T^Xn#fI7@3R>SxMtB8(l zd_Tf2YI_^RSf(esfq-H|7^1`=MtD8hinQW3k0S2;@Pj@d!pL)w*PLZ8K<$;&T;CD4 z0`y*0i$8!yousu2aLIyYC=KbSUQ01tibmk$Qz}Y1K(w*!ir9y?R1rU@2w2e~tbp=I zxR(1jP|0=qM?k-;!!Ko^E?ZG0T7t41y&2mb!v-PvFPWC;V@DN3=pi<>T6gonqYFh8 zTItY*WUhURA88dpzr?^+eWPE|Wncl^*#CE@W5p;?haODYjhF8_T1BXV@H#QYO^$o{ zp14*>9oOL}+=1hA`hE6UYXRz{l6n*(7O9Buv?P|C@Q<8S#wBj%(ljEBVRTjv6I>~$ z+>sOSAULW96)4AO81zPs%dAN3h5tp=I|4y$>J<$x8D5Tfm19C&I)kE9$;8gUUM_7& zPd2j^0Cq~M*^p(RrtbNgswZw&J+5DQ{^ZJmbsSMyI9XgJkcfVLCHoM+J6VYH>3 z{91!Ef$*P&YomqN1Ul3TE+L%_tkqI%sffk5$nH~;waRfngxbrdU(w>2LSl0+K2<=` z>j+*7G?op#ag#95-n=iw<6-=J9eKGJwOLLZW)l!q^1=NjSOKyfk0XlFEhRfAV9YEX zzDm*8s-bFyw2^e$Q>|C{(21z3Xg^K=hab6dRuhvlDOQ2^dxXPk(2sXol#8wUUrU1`j&+*fNGmm!$b1$s~1~bLjky_&4TGDkn4dIz@ zE3r!kuhZfw9(tl`!R~2B_iE>Y}o9#?b=|npKBYunu)ZNU4H@ z{@ag}>Tp%MR*eX#U{jAWfOZLq$=IV;tYF)MYmtk&DgB6$I;J{&PfqzzO-7)Zb}@Rn z7H_hX^qfswF9$aWDBVcfNlZI0!2Fq^Ut_nq1Y=q=fI7{&a4kAWM?WYgnQ=%;4FN%% zKd{Mj4!^jqqi+zGU189h^vL(^4zsL_avg^;htOxZ)Qc*rMsfeV2CUZ5P6;U=w1j6m z${KcR^OLgq3{Ag)R**q3C|3-rsGt5rzd{Z?V#v(|V6BGIqrqip6W!y;bR~FDl`= zBR(pdzDIEXz3|v_mt|xpOj#nfT18Z_sS`Rvyw+xkniqsP`x@K{DP@#>`k=;qju5B= z=p|<{t`I7MBk@px8+EkXKgpI?g&`Ixzr&V~}tmnut zg0mXr6o@rfg8R92tfeNTx5b)Ks8!J#Gzr_@Qx3~XMY`d5m6D|e40WWGfTSRp{03|^zCHmA5PqOdzvT;ilD0?~X8JDtLgE<=ce-UG< zaCxlYuu4Zgt|eZU({Abrdj`!M<&B(FqauG6 zQ_2JwHdwv<2YssQuSOx+g#W~sK?Np-;$XPMYQIh=AOzxZ+LWV&Kt4lL@_?K$3Lv) zfmQ?e8akUtc0Rrlo!}bzE-OFs!D*ADDVuMwmcGEeoNv40PD6TE8*G~KW2&C)<2X?1 zF?9HuT-AG^+jF6maH}@+rj`{fHHJop9$I+1SUKFkaJv_`=pEDGQAP&#*oNI>mleS; ziW}DbZ_NEsZqm2aW2e%07gO(_e>Z+Ud*n~S(jWgk`)kXO)2yWhy0ho@V~ca|fX0Ku`r&YR_5*X-ziSshj6d)r5IPIqu8qigG?u zBo+-}hg@u<}xZ zv1~ZUjzrwUx!Guf>u5Q+LaP((U;P?TpqF=-XH}T_!+Ek&fAgumn}%zXk8JI=eQ{*N zpIcJ<+&^z$*wAV0wu9*dI@?lPjYdk(KJZs-jVq+FXQguqFm=mj+h&ru>Ss3KaC*zp z-F7waV6<_Isuyh(`Lm=RL(+y>Cs{GGSWCHpx+;I?l0E`!ZTzfR=x$+z<)RjYH*~A* zN;`|SDaeD^>;bs49F&$n8<*JL#%lp3fkF_~fG z>oLYmt%R5$RyE`@)N0yxHkz%1aMnm|3fJg>v6zi3(p~rO4=%Rtuw(t5gU3CQ)C5r` zBmDlAQ5to%Rv4FseEx8KLQjb41x@knA`vB#1J2EBwb;V!Ggldd`YkBz($okWE2ucR zs?{_>+spLQg1!ka^fuXS&|#{%BJemH>pcw{HfRnLIzw3dwSaZEh~i(?Oj;p88BW2J z&CC#@UML|ggHbj>v%6)7Esv%yo*kyf2g7QkLdbOiZ<4TnjmdJaOq8#n&th>I=rS!K zdai9oS>{CeJO+xdQJk=1D9pNsQ5>{nl6ou+>lgC^vql11sT+GuH)>C@+q4MjA6kOU z0r(2r>WcA*kq}LBe2K^;bZ)58+HPrB*%am09s#8atnnLyow~Fr%;lMK?&?tUyhfCT zrmTp|Mzcz%Rc4EB;lhzzTgiBDP@&oYjgi_POxr)}(!Fxa8Pz5hM_^b{TZJD`pt*Vg z&FlJ99C_c~Sg#D`4twI6F&V6je3@a3TQ(1ygzQ$}l3?6iAQ&}Q(`vee8B4-^Dxb?-gy#@o(*x=rm#}q= z+Wj$(u6V3FA3)X2l-M4HrRLMBc_TC7mZ`9G zY?p$KE2u_QLLi{d-ZGtua=xF-Hp^kto^$a2|H9Zl-i8Ej8OUt|@gRq0_4eN3^*tBC z42lc7*Db;(T1nhU$)wsTuyaH1N$n|wo$(zKa`*p5l_h8opkL2Q(twdoRI0N8ZPf#{ zQZ-Ubm;)ND{aWPFuLXRS2(`&YJ2ZW!ZkhRq)xnj~-$fQV@Ft@g*rDGqJiPL;c*FM0 zaoMV;q0CEV*Jsnz7-L?S#c?stKRUM<1y8ZwbcF8|eJZvahm7Cqid`?OtB+bY&)xNQ z5q?6qTaRO!a3GX(p$HinzOcHe=v@luqN5widP! z=Fi;DWdoF*JyP-lp@f=IOJ1rCv3kY98gJKY(Rt>uk&YWqY|yp3=49Gb!6Bxd{IX4) zOyeoWOK#<8Z2Tr~2fL~qC`^{7zR23Mh1J=T^PGytG4 zvN68Q^|nEc(tXK5FDjUyMhO&UB|1E!dKaqMf10Zn3;t!a8}*{%YU$Z)KW|D@UH8jq zu0%c~vUlWK|02(djmU?P(z9=QvEuK3KeVNpgMMZZ>u6c$lA;A(5A&Fqr5l#zrcM`H?7Wni6gM$8$pzGUJ>(pvJ+I)Y!<7%ky)r zmv6v3UTSF1@2jmIToJfQ|Hvnba8=~DMhajET9MT!Rk$k>oAl>N(gFlG0!usxN0~Pw z%-P|-sglx^wK{_^!iNq1T%wrouj=IYt{xGY?6A(H6mNPSN$!|tP1O}da^oGJUMq-8h|H^TjO9Q;qTu!ci+El z|8w)imm~Nc({Cy%>zYDY@8mb#uj+OK)4>*oJgjL28x-cXS{~bnp94(SB~^v8ZV{SK z=P#3CrzPfZg0V)+R7CwCXm7l#^O-786mL^Br6Y_4M=-Bbe^6d|En&6Gz8N_qw)<~c@=UqG@E z%4aDymw@#Eq(M=|YsMS17?@W6A@dF(Tu~Co2c4A$4!YtukEKp!t-nV~@-_3^RZkRv* z-`+>&OIXTQwho|1VxKQ4nX8g^`NL5uYSW?%zi*eM&Rh%0g*{ZoyEvuG2z&!bj6SumtTfkAe8R(1_@&91`gJPfYKut-fYB2 z1@K$A_$Vb1#K9%Xd!i8R3+W_+O7ei9LV2l(DN}QRdCHQ_a(s$hRoD90)dPn6Mp%vZ zmCGC=_E(-6<5CEPGKf&Jl3$t)V60N4FBi)41i+SkVkJ_d8^g z0!QSOWbyhGyjWfw{If<==EWK}8@z2WTYdT1fjZmTha%V& ztc^nc98P`KVOwuNVaWi;iZ%=Q|M=l&7UR%~okzTo^R13hG9N4H# z+O<`(O9=1cNQ^okSlhQUFNm{T;rO3CbfPiJb$Y@kad<;;|_$`&A_HbbFQE#AW_1W5q$ zz5!t zH7<(2^f};4h9!2zAQpQgqw}xK?bV}gz`*5&H5!0E17@g7W&zT^dy=&eBnXH~5|Tc@ zG`{!_dBgaJVbv@#pooe7G891Q02Zsf{~}1$THs{Nf)@8^OVqRbU3p+1w`wBKI^#H4(|F@Sp2VWZ%qc~BDoyBn$IAjBMqDvV-*oA~R9O_O zN&iuEes|{suRE6ytR8&OCi$4N$YOlo!MT;{$&p=U@n!>;KXeS8Zv(XtBx+ra3za%& zN4$Vl)txdL>C-gcc|7oUnLYD{23|<4PfU0f-^a8{dp5|iys^#GEGFDfNTnv{@6l+> zYT6|10dO!zvi^6CW{Qxy0gN!J;~HaSxVy^Bs9IwJ$AG)VfO>c1%Gl7>#7B_>fU=(CU-1%RN@Sv z=W%fxrqPT3jXgaSz$_fGV>PW~J=}UqvSQutnt4g0XAj&?!O6nXtxP^*;Kz)Y=nD!< z=BvO(i6gDykK5)w?&gmHPr-Df#NL!g8$X!J-J4d=qT$-_Z=+KCBFQI4$3&fnjwdG0 zKXr3e)BVsDsHoA~+YFL)Pg8kwm-L)Ev<Uj2TyV@352keK=n^eo4RVNj~{iO1Mw&lXPnGx}K6H1c>72%aw40t>GFBI~D8 zl5YAerb?cCXFatC7n)Gj?fp^Y97&KxlKS`3zVi#B+wXT2R|m$VKfqpaX@4@#*Pi7k z_58lQH+)ZOdnzyyO-O?3<|X}jmhj_u&66F^JK9I@ok~J4(&`sNBCP1UPwHs+l7ak3 zLRexrcA0)0 zxS<+|7{e~FcUU%+GSRqnLbxpJjpH(}KM1zCjIGH^#YzqM0J#S~GixIJ^|I$auVN!6 zI-i+|jsx8dhJ%is8Zhi0y4=Xqph1iqFX6=iKsaq!$1;*-&LYnI#A-rE~NlX34QvUrQKRu!k| z&}pe*WEUix0YL1ZMU7hQ@^TN?jEwXMP%$4e}Jy(74CL-`_u;sR{B!d+?`DyYjheIf(TAt9oNCrpfk=|p1AcwC34HsTV8jGJ zd#$P|YyCcMw#|2+ainA(8ZzQa9z~!L>oY7o$Is)n?;-GSr`g-K-_~cmCj2z0t3MqB zT7g}@QsB>9bMfCBtwsCBa%{ATyOY2-7v2LGR(&mLHRjZ*l=E+_+x;lQHGKr23Zx!l z^v(b92RHxyePCL}Py2m1=fctKC7ZHNAPZc4*_}Y?{aF@m7L?b48!|>ERZeHxX>0Zz zUDfNc^6H-r|6RCgmnfMT2A#!H1CJDY=w0$?M%}Y^p1*ANxXwbj(UnYO@{ zzfr;)taHElF5G&xMP#cxAI1B)X`k!HtEa?)X2!07^uy~-uFv1=PY=a-+Mr!^tHtCx zbGLoA+D$%3VtFDq2D7rdj0f(PtK@E_CTPNp&Z!EDDw8UqDB@KHiiuS_kP`v_aDVT z5TjJ21UeVK7<~WwLDK8dVJ%AuYz!?noNh4iI2p#rZ*4^|u2fOG#CZm_`}YTX`akAO zFjG^yeZ1I{@n%SKaS6ZFjhI^qMK7Y zvcJwAK%K5zUNa2{pv!>yq#B;_9*}eQeOX{OR%~rjwM(l1NUJWrTjxy>AEa+pr|0`W zzkX~UipiA5i176%r=dE@vUNUFH)DuT@8 zwHUFuGF^bSQAuhC@jJ%xhl>lsmsMMgAjMIos|i>yF3LPoT0cmj_u0QZ9Vvj z`FH^gyTVjvhb+JG&)d7DD->vhsq0bU6ur0upVWvl%E3&X+4=5Tu@6Uo<1)N3vh>+= z{1#o2AzP9Hlx_R(J+UpBgqO2JOi7~NtniA(4_`m}QnG5uwA6wmh`u>|zud}#uw-P; z;w5c%{wtO2(M3nDX47oDHx}GId_kD`=MMYq@ut9no`2FjH-;5gu;xlJ_nJfdc0*sj zuBtR%F;K-gHTGfSnb9&FCg9%t(fBd^?LnK%@7|(I3FI_Z){oC0D!;z3 zRm~qB6N`$XwCCo+oO!nsR#o?UGEFv&SQrb^zvN}+LdWc5v_#ViLj1AF{kYAA-?u?Vj11jW10HWm`wNhfU8_tQ zd2L5^>!SCe7@18e?{4zDQmN@K7XcJf*+Fm?IhAZTFC;IFW%)wX=XcB2oJ#Py#<}Hlq zRbwUF_tN)%8j6#~MOG_O4u9)Yx^PsVNM(h86$iW?WQJr-=l!T_9b^jggx6hO^2`UR z9&LgU`^U=qJGRj(AkrUWP2<8xNkpg@*aa6{v&IXfw6glgq-}TXCrPI|8eZ1 zfR312StaI#z_C{U3y$$>?eC(^JH%Ckwl6T=^Jje+l7{1tBxK&^3}{2CX5syU!GJrB zQ$(i)T!;Q3ipwj3oy8l2%789+FoZqgU|;S~^|ZMt&in4KQ12UUUY_%sf7zp%-J1Ig z`MaC6p(a}~s0!a#`a-*Mwlh1})cR4C4~DXp7ecUQwT6_0MtK|CkWw`ni|67>p-{VO z!atR3GRCjSmzcp_)gF5wL!w1s5frYKi0!KR1&p%~hLFCzBCkQ%aKYS9b%qK9#@8*o z{c4-UQtM|qeUbJL8#m!ei{a0Uc(WJW2_v+2c$E*tdV4POzpnKh^uOJ0+h^dyo-B8E z=K1u|FZ6u5Wi_hYbTj%$kI@2)+ucSa(?G=qh{00;C0?&E%V@q?mv#MaAIqdG{0i1i z))gdii)^hbxo!$n1};>F`M{2EE{_r6Qrd45GA(9V# z*^4waG{A(maExQlY>HGOYx;yI{+5N9_976!u4HvntAT8w#Q%>NYe+#cyA?Mp4rryc znMuo6W#KLXNO@IOh5cwwIJu1AFy}NJDRD7$GZ^SYcehxc5~n!~D*{P&I>PZjLl0FX zb~aXmY3nF;ozPGU12T%Q3L@N6V`HL?m_XZI2E#$wQf~l2^pWWEelnneTi+3#K*M zn`~j==A{`ZFTd)we#dQ$!_{41=G!TtiD0{FPqJm9%53vr0z*YGHB>CX$1qUntx8HB z68;|HmY^FM#mMm7g-oQxxys36?i8@1EW-O=p;U2Rp8>Avugt7>DqQZwazW5g{WZk0q!C4JYm*K@BJx?HniQ#~ zEN_yT#4~!cAfbdA8EVm+UWVfd&0Bl4sJ6xkdk;j5bWg%lMN;r3qefJxBDSOtEHRCf zpm=tyi#dJdl-^1x%-*V@2d4O*r6#+>KDy~JaDq#PnzS}+vd(0W87<%Pbc)OwxbDjY zr8bw7jxH#JO^aeFWGiIj9txea$5uw=ORYP(pkYgMwQC+seS>VG?@T!GdMg{#G#)Vv zQMVHL$I+XnOFV_hr0lZHM8AgPAVwKY1c$X+f73>A_(*#iTWx0iDZ*JPl+oN}mgxeC z$!YMVc^cd3A)|yl9am{DP~rAZmjq77R?Wrmalh{0^b0s!JS#1CHm49hD>896#FP@O zH3B2E9%41V6FmKL#{fQ!A*v`3@TS2tqlH$(4SRM$dosLdYw~V)%?`HQ>N&u3y zA8i`Oti(kM{I_*xuIG%xCfg0@J33@0X=M`6&%q2Q5t?SD0WABA>A7VgIBcAn5a=&6 z&m-cz<$A#LyDQo$rX!?Z&_)-NXlVo$?l32X1iD}gI|(F1`Fo$&8p(B!3&U?YCVR&v z1e!oWzA7#ayeuM`D~_Vp%5mvkwnPsBWb#af#y4uxj?FNpzY8PU&*W7j%E?-P$^D+DgX=Z(!{S%agrW+=!VMCXynan{k2;w7i;I>B(f9Jrw*K zq%%Ab9+PQoJmYTa@u76}(@fSqe(Cu*4Q1On+UdWU>tA*=$3k>1Af z9RShGleTz(z4WsVV|;-dLKUdYMinw<-8Xbvcc#rd;dQeLB^X(kIWj^(TC@DQm>@yx zr`;cmn1QOQ9JUC@Q{A4gKZ}0+q}lSweDDO7U7Vo^-DAxTw(D-*y;X>2{PdKZF^XO9 zp;R0eiv?x}CL3I`V9c?c2revBN8Z9=LSjc{-c}*T@*BMv5dB^fpz3Ax11n#F*tNjy z?qTAL2}Eq*KTuORB#*E@Ra6Mf4bBNpBK51jzLKCj1>78&V+?G)7Tww{bLZ7>d-kx7 z&&Krj2Js}s4wwL-*HUi>F$K)0rYXPB#HtdHGIfwj)wm?sZ#={@EqLQB6{kOR_T_R? zu)v<%=aLnYzYtvY78$d_*4;7}crZi&cxYu;KnaCBXpt zvNYhUEf%rQI(ms(kS9+!;0I%1$?Q%hqfr&vCUb96%^K|E7Q!Y?p{z*-IRPP33*FJ3-P)^COaAid_h+5#=ft(87x6 zHX?pDI>4%zp%8fXm^admW1-<-!nLB`T;`S2d0@ofSv4*ni>22N)&aRTV4oN&Z zLS2|OIbX4)>0mcruVtG)#E*hDN2snGna?=L>6fiB2FZZT|MDGQE!wr|z{zJ0i(a=a z`h)A7RP($0I5VJ6N2oOiB**ocs4V@bd(9m%%Ndr|-MtQ%)f|P4i$Gxm@(uiAw0qmE zl&q9o2{xg3ZegfPOs@}wX2HuZ`JfOe(RezX!WiZZ1-q-zt^vV8C;FUK5>AKIG7H9+ z0kc#3Y$5f2)uSxOURD{(9Wf)idlycJzIrPQAoNB@s$|UG{=_D8UGJ=?u;EvRWlpH~ zI82=m@w4hR;bYNNR#Cpem@Cu*LGT+D$>mI4I7@YMeY`A$bEe)_ulkq4acE?zisivO3)_ zQtP7Dh0a125DOHDCuwP9w__t4T3YYGYewK%tbB|VeRC_Hvu@{CaP18$kShH0>ev!u;QO0F#vM*PL`bb8fBaKk&#|6Ug z`}C1&!O-T)AqUB8A77tVt0aP!Selb)cdm|+gu-78yT|IeJpDkx)Vp$CsI}z*mR8x(=rn z<43;9xo&da6?|d-9lB7Q-|c9}c$AO|&C?kZisgKJ8d(j+rzq@-^_jtFP`4!PoY-cd z+PUYolguE>n3>p8K{FAJSh=LFA@rS+;A?H)>F7R&fRxneR%39M*sgd1RmY90v4Xsc z`*eI)RhNzRLPGdcx)V0__6WRP5f9|F^HLA^16NM+Wb5y3_mmcCE~ z(+ly(i_j1Pd*lPYT2hcb?m&~onL)cDz383dk8M_HOqpWRho;YCLcbhyX?Y9Aii~zF z`N^jS`(j<7&gjwK5?=~A3@ zqK6F*LS4{MNFu>Q5MZay*M5&ax>aF|;v^|)RJtA(a*y@vwiVk7evCW2$aXl=$gl_P z0@@i@Kp!;GuPo6|mFQoiHx&7eil1n#NoL239m0~!PCp&ptt2c?2TW`y(l6ZZHdY95 z?Wd3GHtc`*bSoL~$y1J~)j1Bi_>>Y>Ch%*iQ3!O8Xp;Eki8(B=y#e(`{yzPOG9b%t zB&tMeall6rql3WP^5_h!(M~EC5JF#oUU170T5NnYRq2X~@BJ)_Nr4DzU}Of#D_94m zC`819E$P%~ZDlM5IqFcS&RNb`Ku8ZMN~70svVsF7@!b$%S-RtffOCdXt%QRMX6Z@6 zrGRaVVfRTns~>&7$LQRTa(MeZib=DFAb~wNH$_KjgSOa;li%uNL?l+}u`yp1glNhb z7&oGMhaDlq$`a$6ps_49^{OGV)IhAK3Ck)Xm%k6zpd*h+_O1eB%%rG#DAH_Pgy}Pe zTtdtNob;+qr-S0(L9os_R3j18h1ed|`CKu^-Bt$GiwVS0*lhF(K>b=tq6~w5g%u2= z8J&s^G5l0&saRNQ^bkD)(&`V}3P(0c#*Rgs9VI~-q`-a!A(x(9x5>RwAow!R?}{Ys zHqK^2)eiRL9z%RLX-xIvxucaMgvNlL>8Bq8^gJ8Bg_vT2II_**Ex*P0ixbHmv@+eq zM|l`c%qhoh7O*dc$S+MG&DfIcS5swwlL5y{esAeISFX3KPop9F5r{+(iR)ZySTy;x zI(-zD!W-Vnv;65SlZS55vWaL+mT|7L7ifJP+zWVYYnj$`gO#ou(dy~ci8~;qkYT`o zlM=}QI2kE%LyFKA<*XSxuWm`WP;WP&k8LaD_2UjA!^HL0q-MS>WCV0sa0=T~18ah4hQ#wRc?#eKQAi%r?NkkfiD-eL9r$w;NG=SH$v8J=~?R6#^c0 zd(S3^s;QUMq;XSL8->Bd@J~-z@hNAGG5AWJi0u61%)RFXM=bq5S|w@hs9MsWW?M{p zEY>mjl2P#na*ZKMV_;iC;^J@Gv{Zve>nmOh;BiGc#;hEDo3vS@hprf62r%fK)IHzg z!4rQtVGisiiQGtjxbB-6Xj+Mrh+c8zUxrH$nNDJsRl;tpLyf_y5=2Epm?a#0d}61;iQv7$8OiTRW4aB*b>}jf z6w*vE=i=6O+8opUlll#CvnNpZQE(Em!U4GB%&9+8`qX0qkS+) z0&CPFUGkLOqz1(;jh)j{V z_n>>;_S#39#%%z0EQePArE`lUVC6(dp9)G1PVOg;6SOIq!ovSvSY(~FQ}@+&g7T8c z)3c_du?QuXc?Z|XxqSIlDRp%z>dcdjxowP>MvrkbvWIZ0C_a7@Xb4WqyX`ow+@9By zP5pvy5X;wmLqk=@v+-(XKh8rP(dK3;_$Velw^XM4{QlXMmH+#8e_DQDcU1a>3|w)8 zk?6JZf(qMqX3^ulf{>~fo=w$LZIEAWn8ZGr9J*{*6|1py!oKL~%@ln~?PSLt9+;W! zo%Xu^R8Y#XbmNL6DYY)6O8PU-__S@D{(M5%25|g=5u6PV&#zXDz15n#aPPoS^zOw^ zFN<+qO4=ct6N`q{jm(hmaFD~8cImYcl?q2Q@UjS;zBm#0qP zTeiK~z;YCnyf1ikZU35;|9h^lc1k!xn>h4}MI75^JZ5>R77@#`0DuA zoPewWWb=ah(`K6g$=^AL*in|;`Z-T5;%fdgz_>B*OiUX)@6+i|``1`vDDvYwW70AD zn@>8*+-vm84PJYjQ3Y03Y^D}y!zzd^RF4nyBUQLT$)GsT=QD$_gMv91dJJT{8O_-X z`IzObTfAd)Vwhun$B!fO%WVU#z&za#5(B9l+B%0JDm18gYBR}x`dIMw{`|#MFOpB)(Xp&B z$T3mnA~NB2G#bSktJc$F%|IaP?Z#M`2=*gea(XrNyeDF|+5+46j)enz(2%=f^e}rd zRXC*gK|j)^SrT_6uH+4SZLm$!*;q{Num#}Et3~PALmi>1pG5Zd#9T+&SSPiVUC`SA z8?&iFAzFozY~+tL8yFZ~z1W^awxN+nV`;xFNPo#BR!zR{)sT;CfVGn{6x49th9#{p zKp&(sUf95sSs?NltuYP*o!*s?Lqk$Pa-tR#x+w*7aCy(Vr6j^*cfXziQdfI!2@zo& zrv)Td2tZ$?O++T4^{s%?ZPN^Le}kq-*H8PtdYlqgRsNKK7`1BD8%6jAz;1D$#TY#qsm6`V4J zlCOi~KS-4^H80j4l(tW~iz4*0x7=`PA^y)FWDg;3KXMLAv#7WH=-dE~Zq9RLd4ok| z2RTR&5N23P^NIu^wWVqVCtnm}fJlMFRF8GCHZH5_C3j}0JWi<#v1g?*&B6{rqk7XK zq>&t9MwuHmK}$rr)G=yfbk)*I_f(Q=h7jdPeuF)d%nol-U}u#^=_Ev)%qW@GD1&$? zPCl4X9T30+qjVC!v;@<9^nh2&+7|B#3mduDME?H`CeOq7ZCV;a+Ai*;TEW zzc2v0Ue#Uo@;*S>dP@gZIM=KBICvspoc{#N#QljHz#DDNPpea?AtqhdoV+^jlh!JKvRoBc@kjpOg-K2u#oV!21O3<8 zv%C;^!+P@zkCW=^5G@Z*ltJ8es^r+_vky)g-;|>z+~`VM6)8y1k!@7 z7!l9bB*&KORqK(&$znd?-XcCrQ(ll`MD20g!RnYurF*j(a4FfwnUbz|`Z`d-Z$URE zAvt!Yo*SWRfRuClpyNDRn~10$`Jw>pj}!_8m+klH_j2D%Z20Z}SUvJkj{Cvp#LyRM z8-u%FKYV3sKe_y7RbgQ+XPsrN=&nT(+W$g8#J(e*WUEGHG2)>?)Hz(QVvr4Py&@&6 z#Zsbio^B%yiJHrPGjw z@R(()oNn(7dDt;fMGjE7y%x5Clr+x#486@K=?zZ}1{dHGE3defGG>CfGC=yY{=~|k ze`kCAON)uCeqWd5TycNPUvEo%zUn%hg9@FXyZ;4RiCG|2wW9W=%}oBiF-tp3yr*dc(11_TD}>z8L(3^5Z?J3s7#C*yR%d zr|Rumb(ArEPbgyN0lh;rK>cQRZ3Q`2M~zLDr!B|KzN{C7gX{`V_uxK86y`7}wqK`v z7px~In(aHqd>_v{cabwL4Q|Ku4BrMPegny`PY|MIDa0NHdTO(d>nG-BOb~nkmY<@v~1oOu`9u0%P@L5`*}*XTShips-s9{B?~b7SdjVp z#r#iVk3rCbW=of%q{$6}mL&c^0E3S?eDd`9DE2Ukc_Q=bM!owl&EYiP6h0H^}}<`)H1pIFAcqJ z5w(j1DdZkRYuT@ZBGU`rWxIEKIt&1eIs$7&vIfw@6=#I!vpx7Aqh}=DdSA`AtUV=|YWeEFbB?D4wKZ34)w0w@8?CcF?k`lJzKXbvAdorlgS;}M&4eeQz| zE?#{MDV3#&aDSM+FSvc*W#iyY4d2a6aG;NO(vH8cVM5g+)|W8+y zfR2NUsnT(z79it=*qt&67XYj>u{%MPvtC#TjVKAcNrS8qnP&cfQadip5Cj zeQxhO1>ItIp1zPGb{*^!To!u}b1av~e`_k8U_E+n!mWd0Ujes=pqubd`wKccl2D?lJhR6`qw5E`JHa1L)-YFWOFZOh>r+9W zio!IXX;I3=%VcONGP?C3v<`L9HB8Xy9Xc@P42;*Q|8LjY7rBcGfg{oXH7D`g=F@}N zwk0RX^$0vwN4Dskdm9AZ+0RRGN{a48_;f*%Cw*=9gx7Na>*m-IDCKRo;Gx`wBL+$e z-EM*rbF!cMn5i4VKr8huo5yn5=-`o3;`{-C_WHVpPj|1+=7=;5w85=x`smF#{YtU> zhXyyGfv!cOIVap-H1I!Zf>JyM#3)U11Gfz$7h|@UJ*VvJ?@LT0;c~%*ZAZ%W;qN`& zD~RI>z`O1ef1VKyk<}W9cb-Lu`dGU(Im-{a`!q}?SFx9#6Abh%>ot=zG{*)#1zmCh ztAR8Fvu%x>^QK|G7d~%ysemx#pcNQ#ZDu_L=6d>#o9fX9+7L$bI?O))wBXw!iWzr4 z+~$7Q)3NCciJa~7%+sTbORL4`;lAWl+`d=t(B%uS!|Y1V3eGinzfq81qdc;n%M;(R zHe>Xu0R1(_>m7S+hK6YYxI8`A3*=?V@^9+6WKXW6cx^6y z+CfF~sJPR;QnYmZqtXYrQ;RhNWciAv7o)Pwge|~Pps7>QxRXkX8Q~H>WQ{pt*dI0l zyqgHKQIlF{jy;BO2T=O2T)4~3-GY=UQTV3W!(@&kk6mHY=kd$Ts{bCVM!06|e#Iw6 zm)WDk9EC69Sdcr8d``go*niU2?tcWU&Fr#^oK_w6wE~~`o!fzh4DVjC<~xhvkLxh< zG0gy{kJGdu1P5qy5qqnr3O>v#e6-TjhxV35FE`0j+e+j3@ih@~~>(JM6s(b*_df zb>@2YaasXvg>E$kj5v({mOioWqnUS2N8f@|762P;K%NO_;69rcJz6O@Z!6+g$gvP| zQ%J`|s(NAiM4k8V5^6ERF1#pTmDZ3)5Tn1g!r%FPo;!q*V438g6Nz$JUC z{>F>8An*duT?(`tqfnAuaEZOE%a3R2}@Hft|1cI@t|NvkW@ znh!8fR9`|E>E_zck71ZXFC60R(nO_i(#*@H6lxfSkGQ{d?D~}lct5}2I>*Dw;_XCsy{^7M3)f0EGnj<9+&ze7PudLP`^c~67^w6f7kFHtCDmN#P z`(rO7+$TEv8AVQT%ns|D95RBF(tjt(kP`n6N{oh9izd#{oyLAgey8oi%GpI)&AyP; zztbN6h+Tld|C~6{Fq3x86+Zdrx>H6>fxEOtK_e{h{y>%;Y z*yC8-VNtKT>59R)ruO~t-H*NTmKQ-|+}hrF!EPw`S|9&{CTISt5T7KhSf-8YrLB&M z&v4UC0pRWbCK%!`M(0wc1k}33%~ZK}IYLGN7|qJ*&+7DcN;%d6HV@Ml>}$)d-~XmG zq~kcM5_=3}J9g;0FB{upb+@Qjb}rdRnyjH+IIK*`qA&JF@BT|3s@uG#cfSwswwy`r z{fkz5?2qODCQKl;HjQQ!V$^j{TbCk?(zmfm0&44;!^a9%=H2xXrGpp3o<4XV)NYf3 z%?02R^y(?^JLBUS7aA!URo5T)?sz_ouX~%2^z-6Q9sS+UM<-@)jxAhq*sWv66slYA zExmwpWo_s8{6zKe#fyrw^j^xOVGp&S;{i?eo?1h!8DJqk2(9V_IzE2sEVHc zwk`&(Ik0sZ_O5|3w8omCD6{;e)BZX5!FS%nqnvM3th?98d|sAt@6z>uuU-!+F_*b4 zqAGOMcS`p$_vknI{|es6*Ixf%e7D5EjAFoa|Kq_#C28iho`#PeiQ5pSA1hpo zOsXfZJje11KQcubQxcq1)~}Lk#@mFzj3z(H(Uj@#?Ct3Tx|Y$*#nb;WjSwR_$EQ{@ zzVuti`=!>X^DmtaezG(6AmiN+hZlcb8GYwdaOXpnO+(Zh$AXDv)Y(UQ^P$K8E;;gW z{iIc0nlxeHUzK|who>F)E}D9}lFG30`u674p9xduy)OHwG{53hpmO=<%+qhWd24^g zU0rqKkDkP!Q;y-hkJoohUUTNxoMGChF7Cqh@c#PoQ#%jriA>1k_bt1RE!3w@x)BVy{=1<eCP;oc>Fr5YW;w?7>;_jL9@f1>qW=GP~7Ee-nn=x)7MM<3HU2wij{ zGPC1PG%~iG|Fdi8-nmjvN^jBYF07xkdw=)iD{tSgJXvxiE!qT<;{k(hSNlSj5)(Ys zyUaEAip9FYc1r5fcE@=&OFLX9-U4afw0hYoq|CvU!H$#}&vPb^DXbYs)yKkXus<>GM(f>B!kuPqn3@KqW3;TeVbl+LdG$zvQ%%4Lt3mt=Fw zYG99G?fY(Kreql+f7`n5pTSce$4cHUsmnh7zj6G*;cw5kuK)EEeoYRhU?it7cC=_W<|e%$rw!=?Ywxp)v6qg?%^=&)rlufL;wZx*$1Pt;QXiws z4PH_o1Co2R8JxD&LE_gt_cLT(6^s6C7~`B$j|~sDfqj$2GiP-s$1Koq98*U2$_kT{C?Gm-7-T+=)wvbhY|cr6 zn8YD*2=CieFyv*QX3^WK0S3!Y;xJ#DD2r6fV`_4pHs=}g3HZ&%`YoFgmYN({{ zl}AOG`ofdsl>vo18zRgkn5tH=co2RIOR^gqGvf8T$)vE(im<&6o8s&}vwX~Lq1D@{ zzV$NI1$9+eyg$i#7*OBgQT&oN@CYy6=7PxRNc&2FM39F;V|1wcbM(hU%l5y^dh_cU z{a)G4We2{r92xz;4fnnj;dW+TQ)I8qdn_8fF?sZ*qt;?RRpI24X0 z!X;tcB9YPgcfgDKMaNo1CN(fdWk~W}?mH&Qt+Q>+$&oZQZrik-GWsljQDKsY1iW-H zG*^jY(<%Z=F#yBIh5~BbRSE`kGqY$G+2#d9jc(mT68k(1#tIMeABz^+Ai@m``@gzb z>R^XF6AT1-yS@@txuUz3Od{Aa1Gq6VXjKH5uH)bA$z$b!oLtdCx3hTS;{ucvSFZH9 znvze!T{h>5UOFu<6H{$n+4EEqw}t@2!c~XxX1XUetgu~Fo5qq!Uvi%Kz@pkdW*KHY z#j!{tPNuPnG$hAVwb=V)!{!Ce62ZmJ#K&2dis|@4?sL|3VwJ%bj|0=FA1WrtS()Z? zMwyNrqLp)N%;XUnWRn%U;lbC^R=<0}P8k1jnO_8Ge&9eS9|e2AvxL+X_hm*0{W<@3dhEFpRSo-nnQ^d;U2}= zHQ7j`8WttTjSW+Zac@3>JJ>XABLvM{el;-_`|I?k^=7k&M<*QbWdlwyksPCl2FAk% zhOZ^t^%jw&eT^`ZQnGDc1l$m4EaZ4x&nVWwql3k;Um<3D$(%g0XHAuJDat)ZtFn$f zvyByP#=8H|7&bg!N)4NV(A)5;_;qqPn2$R?!6lq3A;mulBi%Gn_&Y9(QH>QEnhOC2SS zwQYu7kJXwZmmN9SkTSY+F1UIvG~%hd7RI6x5{5L3#vqS5g@elrQ^I- zJhVej1BL+?w_SSrZJ;Kr{)LCnFDhSsnv*pQ+2zC^D1g=Ul{$#&fKVdFcy5|U#Q#QD z>Rh)U*yuGyza0a{#?*M$m{*;|{SSl`mswiS z@SQdirySR?Z)#Yt2|WylFfF?a10fUbi*5-9VGYe--!;?g)ieSw+b@IzgupT#>vuIU zcRI-ZNFJ%9m@VAd2>jf{w4#h+gwun;VHjK6%qUkg-57fE)V`KjI2=8C-EGbPm`iDIHJ~hqX%lO`4wq_ zJEx7`IlXA-|8jv6fb&tv`Aj&27Koj~`Y7XkHM1`Sfb|Hw4gvOMFo)_mhGCRk=!xU7yZFGBm^g!q3q-h;ac)!DOjxKJkT&N^O%ED z&MF@9#P^>>7eVF_uw0xOSS@2;mqK&`@z~fp8Oc0Ec6dX)9Wzf2ItDODn1M1O=Zp@XuAVJJfP53{ri}WJhy+Na0zIjA)(X41e2}ZM6wzcIv8< zDH{>DEic%|mkr56v4q6o){a2&WmLHW5}PPX0*aoIz+?wArQTqQ5cbah&x9nZITk zL^!<^E$yR*K|cybsmUvF=6j5h&LcfSIO{cl0A)I?q7cH|1%%mY=5(9r=q&afX@dqN z`^$(sIWQIB8l|uRV?H$>mfg%wKw0lG<`LPEZXS_cC51}in+V$<6S5HM2O0aGI;}ku z4kPGDoW4g$Yn5)gwJQCAg&B=Qfe1v(X1ivSAI4Z&y8uQ3w(6NP`{n}13Y6*l1QKJw zc#QckkWS|4RUqu^-~}6&A)9 z9piBUX%EV3Gclgw?Bz0ZFyrMDMBLO;K z4bDBRRtroZj97svDd!eWaX}9!Y=q9q*t=wu<3cuJE%sYDpR`OzDdoPJouq|Bbzp#o zR6c^V?)TG1oV@7o^>)0A4^u8a!7i2^zZ8v<0+AU#GHARW$kuX>Vjv#}xI#d9e${dz z;EA!GA*kGs@vUjHb#G_>=dU(mP`#A>1mL{X za6h8#*qCEYLGYk-@=P@dnE?O+bp$&t-~YD1EB5RsI87uZDG-`qFzYu9S4B9u(!x=eE54{Bsex_9 zDX!bD4I(rfo$f4wX3H2aHC9G|hHAF3N~OTyrQfn-6xIMV2d7Rq!RyeqXE7*6xT;7C zoj`t@ZvxNt(5@fi97-l1yuga(WpMmR^MF5Q@o4X*thG2CrK8Aj@^~5J3vWp{PR_?* zf<-1E*M%5RudSV;1qyYvddo}Iwz~|zm2z^nLK^X`AJ3XnNQj$z3-mFelYnCY1akTDIKdm1#(xf=+ZC=9P#>p zKqskUA)#KbbJUTa<+D6XIhTbL2|&Gx5mUbG59<0n6If(oJvA}!0-R%n*NI%^0akFI zmNV)r5%laq8OL=SoL$3tsNLFw(Ncw^ z@#x{JYSngUFnlNH2Ew|fWzNx%lqOaO#(HGo^vP&KLI#y_Cek=REL*5*+5;)ucMtcj ziJGLY9+a~5Cid?#xLDk3qocgnF#WpWD{5A|`N7%;V{Dtrqf7W4y z)hnb607{#MYp^gL;hgO#JV8zCAV_Tu_e9}F<^n7Gf|T_JXWkr3|DT!Q+*!ATf93x< zd0O$I*w*g%O(nBj9waaBAGf7HxsK$Ckq&BzGkIlYEy*27e1fyJ7Fc8oNW`GcGS+q- z7;B-N%V78D7}CGN6fNU{ns9?z3KMyPl;ng{^=5XLl#ykcHY1$80b%Vz$+vbw`8c!q z8FL-H-sU#@qS^cI`vg7qDq{=jKwtE_5IVaeHU(jxmqFtK$xG~6VY6BLb#R1*y9|3% zHhEmL99pJfHp?L4QYW>BMG9jPICO*zMEp4SWHhle%)tj|%w=R~$OMjk$9(CD>2DQ6 zDl)g^hcHh?@kUtams+gMd+Ik47N|mdMf4$Wf<{gV^_wQcX}Dc+Hk2>xn~0Gu^Vv^y z?B8)pGCnQ!IQyB5wH^Z#d1Qa$zIBk@EqtHMgXWkR_YsbPM<0ojVs(@bHT$uJnQ8G3 z)Ib$F=1LB8z7CWC^iGUz7b@Cj@rLh@hO+@zgp=UjKeN6+EcA24l+Qy=P@oKeGyvNK zrM&>DT7Zm$Be9g$9EfKgAwiPv?~a&yp6n-tVzvT*RFWoY$#oD233*fDU|Lwv?+Q|; zc85Uob=Sc?(7|9wbBd@Bgi(Mj1hbyI-B5rDCFEEwX_OXlG$W}pmsH!ee3KPO;=!)> zf%iW`@BcOOpO1yb{aqfFl6SI0uPBzl=mf9%n;=XyjNe*-D&S>Ig^m4F3iYH2v^J$r3fsSq508 z{}vQNo~B_t>BbD%_}J$oCaLYCLx03`;lAx(_n!h7Qb;5X4*ZQ&Af>;@GAI1}G$r%% z$589%Db~nk?n`qVC}OuAw$3X-UL5%YZK_bk^R(KBkV}#p&`KJcLX6dW@(`O!T3d#t zk5f5ri@h7I#Pbh1V_84iGgYN`vzF45dcryl>k~`fb=FzKvQsKk*Le+7$)1xu`C*B} z{@dwx^|tI?!G&ji?jd6rGg?HaeI{?U*1gCINb;Gm+j+@?ib08L%Wt0JC=Cmw%{oQu z!|hM|x?XYYPh4(LeodxNZH)POxx2OJWA61l-zkT)9)HTey=T;t*S(KF&o?zBZ}pq= z_3;^(`z+mW{Z zRr=w7$|$b@)e#@b?NB*_V31pF#tU7?r)j~4_JE3(xX0n$G6}~T_r)UNN$i&<*-nfM zi#lAF`1YW@{NTN)f#Bnl8#cHf+kEC!vG?Q~JIi8Z zDk${jAZ*|5v+$bmr`tA)K&mP_zcEW|2YcM~-dyFJmohaOJ#S(Swi^k>ej_teo^`_{5jwQ4az$1p!ov zZ=6G{(_Ay2Hg4vbWrrfxX4rSQm8-L#IBnY>6|v}f@Awwk#r#^$P3sEvL(|gsPb++P z_C|i6b-?g7+kd&!PN#Xp{}{(VS>bTz^Rs3*(%Z=%TfX)^uL$|F>*;!@SJAYEm!3YD z?O_{L^mN7N<n%t(OD!b>Jy3RDysO13?9%?Sj>58dtCT-n2&XD@l z)71R(H_6X0g}%G8XH2X1H=_p&yMq#m(A=jXgQ}~fnW(I_;;~UK*P354rJ2V;j!5RH zqMZ9p6>-ijFU2L&v>0s&|A8XRKvE&3Li>%+qghj6c)u z)T-;FH!RUPSJPg#QxjIv&RJLOE6m&Ux^CW9>x`KL{?`r25|KZTX+8_1b!&nB-D!6x=lMveLW)RP%~A7xd%sq#(g^S0Pd{c=om<$L@8 zJX}x%<&yM@@F)iN-y*r3!7Dcs?N`?(gYB0tXQ^OZN^7{S_4M4TV-fk(&=Li)B1*ia zT;pwwMT8XR<+xp+2cIt&=pJ! zkB^i!c zqRc+rQC>3Ach$zgTfL?rFvnnz(vce+*qMq z_v>JyeU@(Y;B?+*=5)=Es%qFlr(O5ZsBj%+6($IW`&LghH!+I{(5LRyDj_arz1CiL z9SbrKe?c9}-c*dNL*X##v+wm7*-y2tW^p00)LYoG{bs3Xr_Batth%Bo-pEeQP%x$f z_v83ut0()Io!>Tr|FF}1I663%e;@KsPeMG4JzSbi6^bSdmJd%3M^22ZC9>s`uS?e>y8MrNR0)-rB9eCa#}oBT~7J(5;KjH-7Q zr_#cyhQJl+jSs5dn=E6pUq zE{%fTCFHCj7M1?sEsXg0fvr_uit*mmjS~_pO5zc3_iq?As9EcCUCM$^UwtR+7{tZq zhwlGqZiJwgL!TFf!pCJd@cVj(u|mVTmU3fpwYa+YC*tsTCv~(`uJko&D8*<;{A)dD zhD=ZMdfgWFWhr;rxd>_)0*l^>x8?(lG>=sVyFz=iL#>|wc;q<$5C3v)dvXNd)Z?zv4x(c2D ztD2c5#eo5X%eGdr=f9b1kz~|rScs3>)mJsLGc0$>u6|~Ydc$14-;Vin>3bv>3K!fD zxLZPj4u5Q~7hShvl?T34=)$ED+8JqP#bD(elpo?A?giJ)i}|7c^u}ob?cEk@YtqC=ihQkeFs!IcV?d_M&>rp-Ni0}-2 zp6g*ftMegB*wDOwqw^v>k*3x%9(PF2jS(vTJSBdWH{3uIq)0}6TFPB(&UFr#(Pqlk z5cLc0Tiy8tw&8lTXjjW@E->CQaqG9+&&u`rA$W{sHrep*oR5MkeK`DM>OC7JPi> zIcVPSh_&VCAE?f|w!sbqP;95d83(6*5iDxCabnPx5M%uklcR?e8wa%1*w#qMD{-Yj|P@QpwI1Q&l9huNPiIHw37 zB9~#r)+{K*>NPf`P~itejGB;4D4X5@RJwz*=A9t0YeIGTjR4uf>cr&frHU7QH&_bN z^miey1K^m#>KOy1STp3WJQfEsPhU*UNmKqxhf%}Vu_||lqN2(mGa5DsUmL3 zs01BwE5RYHK=avVm66rN=V=8dQM zv;Pb@R6U!o46xu(Gk|Fmh9yTJ8mUN42?ADaOw<83NY(ruMhH;mq*TqC7#P)4l>^8bDdg37<=3NC z3kdY0j3jFnI+q>s#~yU0%X#LCB{GU3AtyFPGL(3VI_oQB?1t#gGskY2D(CxdWcV1v( zcPW+{+vl?aT!rA?*3!a8e34qwQYpP;p8dG>&*2|q@gHcY_eZpa@e)qy8jd=&R%&P9 z50eR7XN6m{6^j~6kJ?~4WwONU3SbLi5rDN}DOMGgnslX|2W8f3DLQ6-X8>^CC5bJ3b{CtEuF(DP1Z;)&UDjB8z?fAL<@n>D@w+2q@!!`Glr*ni^p0Kr9oo{)5}UHGv!Po2pPd5 z;%$Ah)kP&Tl|u;H0?zIYbVsCiT>x=dCKi@hi7}^hru0zBs@l?7QL`wGie=(rH z(-ezEv+}4iTCdy}!iEWOL7QY3oUaz76X_;-x&iVtDhinR5aVQGnRGgnaI*qq(TGLU z9^a+m78=n5$rs{zXDdr*G|G5Lahy_WMTEqf(s{%C$HSm48^6M&2uYriZp7G&73m_# z4}q`l1qr>t97#zmN9soei6Z&pF8sJ6Xs-IWAJNspF#Dll6GkInE-pK7qEFdf_ zl8@&Q&UYZu?aO(_(Q9CZQxRqki!c?D)8x1iA?s!lnSK+$f`yGMD_Ji5NWJ18AS~{j zc*DYo5Yf$_i=_nsNu1IgZYp{X$7!T20C(&XI&6;{2lQjO&l4Zyuuf| zX|U)nka4JZiBjR-3#4h{C& z(*+V?%t8qsRqV%IE2nfzU06rPa1hU~lI%vDM2MUJMj?AZ!8c+H(I^Ntn4~6vlW@ya zrPZ5c@7@O^#)8ho3Qt4D{WlMMYuhGAYSPWJ&haxl7A`IvRs|1Tv+_+*5VPDvt`fw3 zzq%y#^R5v79|I+7$tedzA2d`+)3WppD_RsQmSd;X)&_)$;HX1e?${m-qgPgx9=~aA z=iJM*`mVSaoiTMmlQMM4{!2ymon?5EMYi2Bp2OrVW5N&q z$V;(Ome9<IK4b}swY zu-UzYVQXjam~r{W*`PAe52Rkm(A|oD)0Su6ysh*5$3gR|&SWV(T(Q|G^?B1BQjGV< zZlkj&0bn97UObp$N%x4280sZv6Fy45x7MK5*=nbBp+O))FFxpIqfi56pV{=%u1jsnlae6n{F z%%|#v^SZ3PVUyl(pxxpHz6SY%AN6$TPDS)Wz#?%&Y^JI!@`4hCsHymTnVq35A*qzx zB)S^eoS5Yl(L+r4AUPKH-{ck+8hBKVXez-%s8C}#Peq?~E4)5!Nlllm5CH}*q^=cRLW5Btx=iWU|C3y!A-um<*~2S<4t=3 zLh90n6cf8t@)GQ5)tBz=-nD8lxaUu*!qRcblIHGKh?Ga276JHR)T>Rjp7iga9G}-3 zdfg$rX;Dy=GDliWk46Wv9TjMZnCD*Wr&y>!6*_U{qTIzY!kC_OpHpm%?VzicSKGj0kqlSi$1m<8r3 zr?}c8r3;KQtcq6*Wpbl)RsDo6LsC#7QX)nYm}6AMqt*R*OmDW+E?7%lCp|xR8sGV6 zdugOgFwT3J4P~HTAd`()HrFkfU4;-U4s4lRmbK~;x5T&ZRC#8t-ff~1!8VQE9ARxX zy6&pI8oX2h#x@?bopc8Xc!}P1)MOK#xyixl2P#vEOG86?L0XJKo~iK&o}k7Af5>O7 z{?ku%wZJfn4{Q-cxe;RxS_%uU+}WAq9e!^7WPnh%{PtD3?=sx5gJZn0d%zsJ`93T4uZE98X?{ z?#N#UoT?BRnyDjidaX(3Av_z*DYB&Lpp_5?9rF6OtSi(zJ|kZKFAj3JBXUEpHV*k8 zuG*5ME^+EtLD*{cmK+U;RgRQIGDt z*teyMxS*Com?W-dj4V(vdyO{tkg-8URpnos7CN7h6oLuOD5+fmaV4aIE$7_-;8ksV=t-)SjpI+ZO%bfA)-rd*jcfZ z73TU#;zk`O@(vq29=jb#au_!aKdoqx63f-Ce>VXXtb=Sit%pLRMfe3GXvRdK&f}d_ zuzp>zQ!-i)6`!K7?elQGs?t*ys7KYWUo_!(m-*`AAE{gC)rm-n^)}1*yzP5+>3Rm! zAm8GklHVIy4CQf>e9_t}`dvg!(sZr=wFX&xv>yBI4o}W~RJODT=iwj(9g+SmYmMJ+ z7fXNQtJk-oRe`;{yYT@8E`5yypFvzGV{;nr5SD6fR{0~!fF_%KWAOBRwC5A zCTTfJ^*YvY752#@@kSUVCj!&~_d?gNXfw%6)#jWUBQf|df!cZ{e3}Y}U$Rag_N`{#DA6{&?7-Lw4vu87alIdjUkK!aa}h`d}Tb!^hRhFSHi>f zYH0a=AfF5+=~a8lIvgn=HL0VPELJ2lqN2r{+~-}_XH zR)GpNc<E?a6@|H(7;{&DTDdKFax|GEbb*yyd z+J)n3Fv5H-!r6U4FV~AHm|Qk~NB*X*3;hx1+vLlX5=}||pKMygQy!hq@1Z4nI3UJY zOYWk+_zA}ZoNvSO6{8x;LW?5%4SS@+JmXouuV16KX7o7 zoJPBU>)m6!Ui{SP?fzwQAAb#{qkP)U>Wutp0hJ}#S}iA0KBf$^@dqieKDq%z5lW+4 zx3e_cGw)2R>b*}X1jjuUSeb0B{@6qkZLPydcIV_lh?Itq=0!i))iB;#jUr%rM~N;> z!}G1t+x3iJNV~gmvs`?iR8?ym>Mvh&!j=?;iC%Y$N#)t*Xo+kvv=X%y;Y05-mMxiZ zBonkv1SlQ4h(x|clZM$uc?NR0(UMK~3xQGldB^yO9SS+K58E4^`__C*P1?d#+}D_>c|(Gr4QONz> zGv+(kHi}1UM{LxfJHUUGCoBc|7G?H4HBi0+Ci?HGkY;%@c~prmhN~lb@?#`?TLI|o z!egIEIf2y@z6wVf5qhsSg1M_IOU}weOI$OyX*E>h%}|z((t#WwFZZQ^HcmX61lc)S zjw_pyUGwNctKMhb=G`X{vZvGo^|TBLK1{$RGlBP7J{TZBa&yvC;mv~FO)6(Cu~Orw zpxFOOpeMtDHIN64kQ!t$Wf?RLV0KKAhijyk;@$SGa_%2GB@+r)@u(?Kcn|M^eL{G< z!RMxivQFctk#8C+C3I`U;RM$*>E5Bo&3mPmU1eXprLImo`yo%rpu6k@kYESDK6rAA zW>l-34NDJC<8MBt8gk!ZZP>SwSL4}aJ0I|udcC&`DsC~Cy zdLOuH9wI`xKak5GxowvAnA0)n{rlc3gpyq+bJHur)rG7&-;W;7b-DB|I);b0`eHBU>0x9w1A zC}E(jfaQ{dUW4-kJM_VEe7rwDu98pTO6|j*J8*X5D-mj#HU--iUkG^!fjM_5ghqIo zJwp5{i!1X;7Q=QbkU2af=@-ekofjD=Kkx@SgTl2%^02R3>n50(tnqG?`}84c(X!YE z{z~rtu{GGpI-Xkv6kaIx9t*AP^@=UCwLvXDYm^JsSd5Sy^AgM&oJ4W#go;$h{g)dxB>f_~j|z zk%idR=$Fpc5(_nc9XDvo>b5>_2bI(^5wv2LSNCb@9SDO34!uhZ#p*>`n2;<8>Cu8h zX^8kmZ4PWH?BBNpgEGqAg$ee^0oF?d&jy{|A*dTk%hb5%>4WlkFCmm0yv)C7Ea@nc+@f?KoU~D z>wxKH{HvY(I5x%#&_x;0V^uRaPTDqH%V?*@weu&RN|LI95VhVp9cI+ZZ%5fv6YcMG zY3`UBJQ4WbOMslbIWk>)wB+ur7G6aaZ>IVVwNgV)MBgFbu_~o5IXcfWnNQ8fa2MXh z$26;&6XvkjG>B6^N+6|1RbuP-(X}!lofo8n+=Yjo#OU)6+ETX@gwlvGJ+lL`!3H?z z09>)&DHHfFDnVKTlUp5vG!EDtM2HH2+{#K(=ZD6GAY|B5yp;ZDhMon=x66G6DM2-I zr5MK7@WMs!jALT__XTL zf8gE|z=%5SW@c&}0(tcC0(ZqI$SF5At@d)W?G@dMOSm)NRwK<`W zdw6>E@J>*G8Pg-P>A;NcmeDFju#xf*;M2JGLUuner&2%q0_w>9n`Y!T7MX z;0n208E6r^AMB8gX}xbF{7}}Xv#EoN`9NLv?&~-$-Xx97d}@Va)ojY9U$O;E9-$i` z4ap*jGC*`Cyj?(aLW;`t_N}l*PJg(hKdi_FEWouUA>v(~4-qn7tpa>H6N1sa#V(BZ zh{jTk-pk2@^0d|+8oCO0XMGRX%YB>1<)YGOGm>zfxc|hm-?v;QUBW~Y(b#|xhb{!{ zl12$37vyJXBF{ph4Qr_N5@OuzfRP4WY&)88S;e%2rw|kD>z4Xbz2ADuJnQ<_DS#8} z<-V06?p>Oqi-;44ADf)O`2*SjybZk-ph6lYfgGJ;?Ne@)H=$?K?}P^$_X)6NO@fXu z#j>F>U3~j>x|npiTa89lrg!t_S3j%w57V)gx)?F!+@z&+&B-p?iO#9{!D$Xdn4e!k zGW$9itvV3B&_j*?UL4pBMI=fqseH3H6SEYNyTPctuZu&W(IQ>@$Jxu{*em1 z(3PJ=%m@kZ_U-(q8>{+~q%#XOuP5;LU4DjXkd476IKtpFEN@&TU-KNGu|YRDVRUc8 z(@NeuJcz~W$27{~w^?En*FFAN_M&Fc?u`ENwgE~yFMK$`6W&571Vh>%jIKQE7zSeV zPRq|gzDypy129|m>d3G0qx&$#IPl{`eO&KS({1}%ZxdqsWR9x%DNtwh+L5}kzMntt z-{LU$($L6NMR|qql@G7w3(LvdI1YI?FO)KDcXDD^`m?45J+kM-6c(Be2Dpw{x>4ON zx?5a-aZ~CJ_Sc_Q9GyoJnfW>6L*1Cd0~G*C>bdKzm8YCN)PBq5;w*b>qxzPyolKCE;y=m*Xvhs~%gt+}_ z?EpVsMPAom9GIuA*q3d1(vNdwTM+jptYg(zEqxGuq_${j?%=4*fr4@Svimsh__PP- zeDp=7s-EX!g#`jw3G1hH^v5 zo^u`rx~ve`>kptFv|DL(?a_rU%XedS_yyO&Bm0V0_Gg!SiI6NPyYVMf>YX_(VlH^O zE6F8jQ!;2SpK|`x!sg`qGJdg5TKRF8^p;_E)ueB!gdL&lluf?-8_6;-+K`VU_>VvX z%`DY5pNRGJ3my~s=Xbr|6&r(qmTQswN&Crj&wzGo-&HLP^ItT~-d_0q=)#>53lOlT zFnimp2^?Q>gzH+>i6hqjVXPtNgK93v4nx6DD1Y%?ROq6{MotQ+-;?sd%9Au3bE(QllCwCZ0av|O$G^}OZlXC`>oHb$L+S- z(tE({>lTrW*&KMCb8u^DW0?-?*s~Jt0IfB!O9FcW2kDXRg6!gr$4sx6xKZQ#Oqj(g zDc0{gGLPzCg1D7oQEZW_{(xdWH@u$sR>A5XwT>V78kHR602}_*3 zakU@x@>vOU2Z!c{t9E`rV2AThUa)4(mnTP(Wk-$CAjN;Y^f%g4>pxt9FIrpYh~{7I z0%z;jNqtL(|rUVBY_{Nt(!n{hEWzgEZPD6QlTz$3z+{9fA**I63sG zcX=32lGohpw{sX_eAH@bL$NwyW@(8>?~;%}qRR1#fHRnDB#1eBR=p8p2b`pcRrSdY zUH{#4yMvw5sADR*T|Vzj<2^J_?RPM7iY6GBrbw`RtUB)0t0FHn-lsRuOTyJ}rKHqK z@hz;5SFe3gZh$SeA?DM*KThcN}o9EndMH0-Q7Q1+DH4s$syFP;;69bh?)Ny z;274Sz9tEw|I<=}FlDx_kdL{D+gdGP&3rac8ttE#D4hoD?OQ}<1-ntLXp22Og**f@ zBwuQ-cQ(B4%2jyed|dzOc>U8j1pDuDP(fRR)u>k)lOL>b+w^G=H4Q`@Rx-f4AxgJe z#MRBozEzTN`sM5Iq+`i4M!_Ug)|mYZBbQ$xyPZB}6C;v>&A8&}!dBU1Ba*o2mMZ`7 zaZl=k$a_~0ETh`rPywr6$*jYcR#!R7D4wG3^ahrBJDMzEjF1!wVg;=axvB%eJTZEte_v%_NPoKmEDyZY<34y0Fd-hIt z>(=J?)X79Xoja{K?Xiu!L#>ZfJF6J;UWH%N=gC(n<#y&FVE%*~;P|MY7*{lDNHr;- zH2HT!)aBQ%W!si4G)qI=3~9OPu>s?$S6$s2sBQW6R*U9xA-9I_D9ssgUGU)X(5+Dk zrIdh)Yu;KNx(E|2!Z6DZERL#x}Fj{vv1$`)2%tWmAr{( zqHH*=hS~2ICjH*lcgqqU@cI}$_N|iYwd(BE%y$c?j+^-D&5qWB7!0!_d&?{#K#cDC zuzCjNNsq0N5GI8EI;G{79G>3ZS6y-M?VOf?kyfa!dExKhTXDx9YH@40i*EQnw*T_* z;(^g8*1LZ8^){AXbu3thT@GNMeqYtfVVAFQw#52eZ8u-9E*493lgM;6~CSM>}^Bjr8yY^ODXT35l-(kjNA_> z#q@}WV^~-Jd|JMD)FiP@=?>rN-i1iwjkzIf9ks)go2j3F&*s_fX}xWGx?+6#GF4aG znL4NC0_xT32N^$nfUPI;e!Sl{xMhYBjL+P?N-+BkS(*izlltZdTlbF-{nH=+`f14u zC%YJtpo_dh6kLR{Xq6R>A7Lr z?|!N7T3P6v$-%CFuH{Ok(;E)DJczY6b|#94Qy!l zj|~KIqu#1nzwEz{U+wyzA)LY{zL{l?ZPFj6~U}>3wl)* zWA8G1(q#JbPxhNX*{!W|uxVy2u^=7&#CmQ5_U7CDcZ&R?fxJDHm78y;w{ZHQbb4~f z>3OQlo>XW3R>!eRPd#9|_*J?7zT;}nj}KGX>!eiQ=6(f0`~=wX`-$v^(;E;*HRv28 zC1zAPF-|!=J;e&Y>+-6~<@P80d!IZ;o2y+;SUBf?@|^V9-OTlzead;Sg|~CC!_8$5 zi>t6FKeP9c}4hxBRcu>9gPSne*;?TUiCqIu(2{#Kmn} zs5GRl-7+j;YFK|D!4qM%@K{Y+d%l*Gb_E-QFjb(f8sL}IV>~rB0|kMbNg+0;Lw|;F zH(L3HP7T_X7Ui*=TYfh(_%t`%{5k5>ol&^u(O)cs^GQxyKZR`j;#ht!)aOg|e_vdZ zrp8^}7B}rm*lVfd9I1UT=uxA=MTwZLJnIS-oM#oO6vt>inp_7^4mi4ax*)Xmq2r3J`TH%W zuKqf0)VIik+cHjm$-q@P-w4Zio*(KQ=C~xBAH7|;Y1;3&?Jj~W=pF2`MoUv6zj8JS zUfdNhs*`7hPqz!3bv8U{?e^*C&Tvjm%eXi#X_K{ZV?oA?JHm(CXW#HAgaP(%+#F>* z$8I;vm&d_UK87V4TMoEqoC(UR%GBD7g9<0#JCka4MpXPQzN%0(y*g|0eRA%%tQ9M= zNo|==rp=4YcoHVE$~<6GZPwbkgOoX5bIsa-Y1)bA`!nrqvx0ZT)4nI^L$h6{Wm%kA z@OSD0MqBpkHs;zdHftX&^a-CnZ~MHhwz*S}dpd|fCIC&=5QX_D?MI1_I`&B2lY&!z zCnWt04L)TxJDNLhV_Vu~Yacs$Xl%95#ZwEf+2*?L51G0Qnc!F*RiBHQS(N5n|Ub zdGjp!SAz?~BgH|sS@Px6w-$_hn2(*fGuVTf(f?ri!s(OmJutV2&L$}rf4eh%#@+1l zj8XFKA%EKz-@nf|&{DL=TmYZ^TzG#+jK%adk8Dusvjw&^7a!qUMzK2t4=PH|_hua?bEwcVCh z`ogeoqwL9uoza~un-Nuh(u8cCNQ@}o(N-vnWsQA%771l->_2;kteC&BSiWkj^yCtP z@vP~eTz-?4vGQb7dac)8b5sI5>P50{%LReyWi9F7590OS4QG3wpOQ((lxFrN7ym^HF{iV<6LqvA<0q3Mx+$a?qc_7X6%?7+{m@=v9>@7~Yt z%O6I{(DSlfSg~wZX;trvdFlu22BhtR+GV@8dsKOCWZ?phm>dn`RPXP=sQj=;YoKqN zY@(!JMlNG_ReoY_K66%j(tKp|U#KcFW}tn^L7UZE{bop~u7L}TdzN?axIO)#*P0)f z-tLnRC_kBoT81!DD&I_pb-(p0T+Z6%qpGLAJxoZ%rKun%BQ^&nA-PBQI1nlT{yQ|0 zN3-WGdmcc`(Bpv;y2HHAw!=J?{oq;WLahW+IUgT*0ouN;VAqBIpq=qs=D7{5!uB&d55Ey@{W{`!Fu#0y1|5fj!>H3; zximvqPyVW!u(7^2GUf*pL!1u~(`zr#)||^#VR~W9xPC^9(Wmx2am|3MNQ7@Wf8@@u zm~l(m4{C_wSnOfPbDK$RQ#6FGBlRz5;>UQkGaQ@B*OsR^p1n7dkfFJL{KcS~%W2JJNI)VNN)3alVT3$4GBRF6WlF z%|)PJ9aTRsZ^;30Y=t&>=I8dcc-vE?uct%L0}Qw%5Ba%f=45x1i0Kb9+kx5`71^Y+ z@Ym908X}4*-xV=EK?@`M%vRC=_1r(OCCiP`>G1EcEvaX(1)5c|K!jHU3`?HngTHju zQE)aoaVlc6`k9S;Cugu}tSlyZ%(=U>EiHNdKSo=&vpY4jE$LaIDF6x2d+ui5_w<}f zJ2Rqwt`S9`pKV7xnPd7W8|GerNq*glzYADc_A@hahXQlyOy1nK-rw$YjsD_Ax6Z|X z;O7r#&n-adX!yBBKOGIc8&1So?t9tqd2OMJ`W5bbDk3c~;_l9Vj?>a6zumOmyMFX3 zDzZ;NZh+2q11~RM6lexT|=%b|xJNus#^ugzAr9z1aeGPCshM5|CQw*qL#l}g_Y zd5x;nw~`1PA>Bk38A&Y{Vz zX?8*TPL2_^*K`dTdc0MFmpqwn)y!gYgK9qro~v0IG*-{Wb=m&s#(8s%FfSEFI~VIMl7$)nPT z0YcP=j(g7WH`?7GE2!;<6)lFv?27rW2^mZF^TbSw{ZzPZg5xaBbQLp3rNRZhP7%5Z zlf+6Md+^=VN0t*FcPa1=)HGVv`>q1KEur%Btq#$E<>lK?jNL}1UhY!Q743fa{)}R3#>F2WmCI`fvi8<@}{ zV^X-+j(g*+1F5`}G2aaGtzk<6P|JB(c=lGHM3maeIH}yWHSR#GvR525UYYp5H0B{_ zd8g;mnlb%=q+(;qF%1OIyuaY3bUcJlXge1=>RjUPz zhG!t1G5)9Uu746R{@ih68hNG6A`$(HFloh_d;%v?LvB;=ja9pq6>M&_qi|<*q=;nE z9R12yYMgVMCIFORoc5!$rxgHZa;Dzeiq&_{XeIMC);lJXZ{B030inqr_A^A+>FMfI z1#S(CIpXV7fzlFf8N)p+LcKqgVk0^p^bom>ede`qyE=c#BtS<`|18h^s>$lLfHM7&hVz!_p?jKiS z-H`3Fzfl%2Ag%Ck7~20P&mN7x+8jBeb$l76rx=WB<5fKSw?&E7h>gGcj&awrF1eZg zhFc;T+dy5>sB^+r5d!@WKw_3Z`<4XDZcvezjS$$_d_!Nih&W#(XMcckg`~x^rzFc4 zfcGmG((JR3J3x^?ZL*Rnb%l6IbeoDe0`_~1LWpT7qoq!^C`yAjiFlmr>sW$~3+c2*s=;Nb;BQ_tZ_}fLbHAPJO12QE>8KaPk?Jypo&J#?VImgTve%=6Prbu|S<~^nI z%0xz|slUKq`O_|3f&xF>DmIi&erxlyZv^E$f6hk=~zQ z8jxqS`DE&3$aq_msaeFfE}Umb7Hxf>>|kEwm8f)S8QzCNy&gqyxhtX-_GN{htHry2 zMzVbY9@J(U>m6c2TmSC=ny}7$GLO2l5JUI~J=yi?z{^a7-ZDWrG3q(DqM&aEDU|~_ zmVKhHtifPIY7-(g!QzFjKU><0N_~_9be+5ajtpP%VXa4h!%1yL8i+GasI#iBcl<6K z=NN;IYMPFb&y-yas8>p-HtKDs)nelsKNXv;Iu1Bo=0H`qRoIE6^v>I0dB8g@Iiv|k zJqKLn{1eThL=8B!wCm@bQ(*($wYCQ0;G-+;SO{^mzpRlt?4sPlPp!pE8WU1V41*id zKnevKyv5Bgi=|32%Gwe?>kWH2e>@1j!!q`w8@RETUSZf#Qt&%_>x^C%=86H&w$@;B z6ndr)%rnqT(s`3X3v8I+MEi zYZf`sASFF`f(yCy0d4`)Z z;?-n4bqc=X*9&g4jnaOIuR^RJ_gA<{G-M+S?~LVEEXl*rBrM2!Lp6qO%?5(etTt*D z7*VIUYdwqR*PSY1!Fq?eM1a*BOpSyOKy=B5Tqdo@K!_6L&lFIvi9i@mEHcq_0LDT@ z_zF-Wn9yS;Em;E2M^QQ>o_P>+TY;ZpVt6nydrY)uC13-SKO-b(F5wlEN;6?TCv7~5 zO{oWMnK1EP@ydQ#XSJS_UCN4EGC`^j^t%Uwwz<8h` znh$~sBkdd4Z?9=xINRUDK$N_2zbYZ9$Hlb^XeZ7<8Y~t@4P-XiC~!Wx4L4Xd>%y7I z!NU|@6yq*J6u{Vc^|ButI>!R%50HOw>1Ke|gQk`ODSU&SBH8CAlQdldl&gw)W%R=U zPGEu_G8r$}eitP8fmGnQf!@xhePuH04WKWVyv34njZJhi;o7+LDg<(`N6|RUH~_Cz z7r!x(lQFKih|N7wn+bSurHW=`D&DBb6JVT_yD=M`(l=6v4Wsw8Sgz~^mmw712)$23 z91E}dPZwtD2O~t3G!`SQ0c$HDJwfPZlZpP&K$>pCBxpzy%2Xv})~wZuV&6(A zg=$M172%e;co?9}6+xF&Zoim}5mi#(IHDneF(4xQs4<#v_**YB+i=d7?D-{J4|P5U zwPN*Zoc9nW2nKxwfTfcBjY&#X;hw;>D5MBg6(jNJjQ)o6-=#QZUY!XmQTlo)O9oXG zNQ6R|}=F+l<4k%$y2!Z?d??J)J6XffLetx?n3VRWjUlw*(i-a|!SXqGAI7YulUf&2s@ znI!;W27*hra_rY(U0}>MBj>G()??bURnF>8H(x#X&BGK+l1Fl=;HliB+p9x1Z67LylFO&=; zLY}U~jKxm>CZHdL@w3#HaeAy-1JnSFMsy-YfGVNZ@fylY5s7VL5EcMwO6mZD4>b}8 znbgNB2JKKL91KM(p+A?$`2%R68gZHchtjz_1Q>Gxm-b!4_{ygCrmjlf-SFNmB882m zs)(O8{jBN$&LsartW zqFHx~us(&$d1au?)qr_iI*tSESJS?$8Sf<&P8Jr<#)*LB9vE)}6WYl;F(vD)6|8w$Fsi07##WWV4d^Rzkk*aN;n8{g*y{ZvSWnsv8@KxiIZ1 z7UzIquZS48xP+xflAi&*#AKKSxE3bkv<8PYkiQtHt2M+IM(R=nW{rV1-wUm86FADi zQ3m3E0a`UDFT5_16a`I%p+aKF%64#zfN@KJ7qiKGP0XUkS%m^DFZInL`JCN5^^Z?$KJpi1O2V))NMAS6vk#qXy1(F zY3Q!TBs222yH$|pvPly3q)^kf2HcyMRIvu!ETNq>U?NPUH|+l#o#rkBtyVeyygzz z#w%%sGtd}gOaqg)MMG+fh!nxpM+jj#DoY9oTrT0QiEP}7eTo92O7B7Cp-*e^f$Nq> zn=oUHx)iqiLjjH2-5-9)&XM#@YB?J*v7HPWsL2xx6+a4peBNf{84h96SiBV-nU zf68RcxKH_NAo&WQlU#bO5`V%-+pEUE=L0IiN`?V5Mgneu>BAZ#>RrD>wC+*lOA<&Q zE{Y@K<&GN>;Q0w~I>(HsQ5~Nn8PRi%lbu@lPa_g#d_QgWZxg1_DJ(KqX9n!=`+- zpqmTTtossLnWp8vfb6wKFip1>^^#Eyb+nRpS%v;4b4#W6mY2=rN{Wmn&-{N}w?usxR{96f`MtkzqpiCHTs00Fo7~l+JKZ3Uh zDihxBCjL1DBCd0HJ*tyMRSO|Y0I?s5Yzfw{NoQKOEn9PBT(xO#Hdt8xsON^`v5t); zt*Bt4Nst+aSBz#3o)H30wwe8lcyBmI&p>V%$|-NK5+UX;Oj&I}@q`yP|9olQDBi%h&Sas=jFd|(jGd5xh~s7& z!q!Gw>u;8}45vUU_M(!qjfI)Ll+9v5-kxoOVe&0anb(Ap%pp=Tpjn*QDh*|32a?l{ z`%6R07h(l4WmJfB&v*mMcRRe=cBTL$Ac!}!fc zd?w8-G-6rPZ)OPA?5Psq{le^Mc!Z#~7DHvjC$4g+^)PjW#WhN6qqpE0TBu)RGCi&& z{?6k**C>8Ud4w63m=o{NCA4ZzR`ZmO#$5{ueZYrv%M4pvbCS2WmcWIZ(Fh zUI~2HM~r(WAq{Y-jST9jp_07-*rBC%1L)aepn^d;ZU8%3RakV5f%E8+Bk~Ety`hm# zkO_~p!=76Fb|v0mZgS#3@H_M%1H14XI#qbscLNy4A-?DEL|GJx81tuuyqbpgHZ*p@ z=p({a`D@PW#h96NlP(sxUPVD3QQy@z%+#RfX~|zSCjT->8DuA%5&^W&Crj@N-H($-tT-q1P(nWg+35m}<2T^KlHn zKN@Qz1b4GcE{Z{C7A`iciY6wJkD45koC^3sK1?IG8At}fR9NsAkE%$oVG}52c>T4RlNI&G{Q^ zuu0n;Lb6Kwv>?d}pHaje_*6a8m$@pk#ChkOU0o~RxE#OM!^fa$L5=pNE>(3VSgk%z z@63-qu~H^d%EIfDwyTp{Cx%Vk6gZRVWwLV@eka?Xjf!jGOh{D8z46aYl~+dJ9ObMZ<6-peSQ1z!k3iA!ERgGUElC) zZR)~b791^#S7i3Z#A(#9m-&qtyOU>iU2#6!BQqUr&&;|!8kp;eKe%XmSN6t#k6`e1 zf5eFg8Intf^A)Duk9RBL-SSh9yqQHc8|wSv%sAH8NpeUlT-#_9ceyY4rPJ~-1l6OUZLLK3}e=8X-5%l zON^>|(Uo(?{RNJ@^_cC8Os{Tbc1(}LW|Aksp}j%rrY}j1R%T#VrMOkMC1d31%Y79; z*XM#W2EQ(o(xxWzTJ6q@Yxel$SX|v5xQ8j;@#8G4ucGBJuzRD~taeLD>p>tTrgj!G#)qtOrKu5M{--T1Rr&;31gM}mh;jkT*YQ%7mNf}6Kq6=Lk=le zqt>$A;}y_SoYhplD}LlvwZhLR17xv}&mE$;x6*ak1y`0_u5)k1%ev-|zCz<%WlCpC z?!P^_{ZVNm9kpmp>hqm`+ zBF=Kf=RT}mWQDOEg{PJe*e(Cos+V%lpIh#<@-~vhqJBs8`EOvUO)HJZq=alvMl11=@p35Z9Gi3XjHj7EScGq=a~MWm5alr zJv@o=%`9T{BLdp-5$=>YjT?TXb|4dmA8Y_e|DksPLN$bUBG zO&9lbZ=UrB6-e4hjj+d<5z?5nXmp0cD_GXc|Pk~Lh%OSBHGi^eovslz3+O}{mpHBnnY`WM)3rSSt9ht6?02uMwOja#Re zbnEa@$mv%R%iSXuGi!B$U|z4bp0q#S>05a`VNSZ)nP|)=Z5!p$>>V8TSb)}$qs z!nn)9xWZa22i%s12%1$FVDe2(}Hq{WD#JykPdpcJXALQWwK z^8FxogF$5Kg7h1cmty9z6Ie=#l%6lQEv@4*w-e%(c%a}2K;)hzUYl2juf)H zaiu>O_q&c+)?18bl;fgtcyRqq`Tm?-K6Z{ljc(SS4p719TYV|01!I&Hq;%`}M2)9J zLxfDnIIq>0DK*<2az{}1(^?t+FlZuT8BpUBnCGJ(+iBU;>3;4JcjuZlqjMEc(Zc$q zSZ}SYU>Hwi!62c?)MQ~g2suG!WS$Y_V&g@0F;s=U*3_-)1UD`om6~eK%a2%wSihoU zZRwo)8efL#`0!;YSylV-u>psm2j*@@d1drda+2CS@*@ZB*(Xlf1jXXw8O-!#XH-?| z74KMS;~W|nk_xW6E#RPAm0>s@K0{I+l{LO*WqP?WKEO)SwMOlYu^qY`Vs@7*Dj0L( zsxoLAH*mq=LF+^&>|Yj&@t9nht+TaqU}&JF@C0~pG=3F@Lnuxr;oWsR&*p3Wic}pK zs)0k2upk_QM!-xx)vXNe+hfR{K6n}WmS%uFG6oz+wL0?!g(e#(4i0=*U3Ja}?)G_@nmI(;lp8WY{X+?v^pPAoMrHJcK`3m$?5v-HS9ZR&Hd572$PeUi{Y41d z2Q1CCg@N^Dfi?DRoVE5dZ_PA1H(-!Fr4AJbYor~pdA7u%mktrThPN*BeecUsaLhXH zk}r)I2-)QWPDn)}qnujO;kxe?yU^KWslXBO`-2hz(2jY~*>e;`hcH0YW1ho)rp~T6 zmHc!E*Y28NT4%@TLRn}Gws%BXG%AvUA{fVV)KV0q>9`qPZ2Gn@jwI?ZRCbU0hDxLh zZhkzvz^}Do{Y|V35ipzg%z(e5xMH3L)U365hrvWMIHxIftF#?xL>CKpNd@PqT}|D! zQj|ZZ$|Ls(G*5hmP32bilnhz_DMn*@0m@1`B-}e$!|EGG&df2hZ?JXP!@eZvJsixu z0=*fWASR5c5b|@0q7pe;e%s9RH+;Y&Wp(IzXuTP&sJ|gWMods{pp6R1YuLGj zWQA*7XJCzAIY)vdG7-Z7!UhG8yl|KUHh_(`Hei#Vjo!S*5MntBQ>21em+Abm#wBz; zs!@^PU13wRHhL)~r$k5W)5u+0((p&n@xRvtRrFS_S=}hgZz8baNn1W<*^u0{AW>e~ zEk;>R#zyA_VlSAqV@+B7Q1*;!=iVo1Uv_o05Cp@r_%?BLnd_6l83D?t^wnw@-{;&I zLtBF3i=?;>9J2L(q?+#EI2LOdO>b3A-e$_sqm4u}M!U_U2|d{;X=;iL38NVB7VAlH0gU6YAy+!&p*`QAtjX<@`;-$b6KjIlz&*y{P^2kQ zAUl6P20_3iFiO~36Et~DnAOqhfyV}8cUWm(LlH%!!Gd$X?DM`V$Xo)aig5D` zJoo}3$<8T?2u4cXXXDgfz2=alw|$XVx1cH*sJ7^T5TG*xz!we|`y3?Dty zP#yCcasaAJh1KQ^sh2r6QI16{5|7c=g$&eb)_J@JCBb8_AC=nDrKT{iF=rZx6MLs* zRo^p}I|2Q%LUa+nR)}0kM4lu@%@fl1M#Q`mAF zq zbz&=ev7~k>tCPX1caJvhRi%6%O!-m8!)xVnt<%`~b?AR5Yay|G3mxUI>cE!Prf|?} znPwgeh*-BRxDV>p4yUSdOV~)2=>a(bG?xU;Yn34+Yatt#tVJzV<3t>yGYn@9BWna= zD2U_5=zMXbKq9ZC$?9_9Bp5euc)$E8l&7r~)f7#jn8L1dVRd*prh<(PDVNO^kEE-yqSq+< z(SaZuHfQc{HVP2ufZ?jKWqooRjx>1^nI3sA;)V(jG9++{x;966Z9cExV}-%sNGN_(XL%jPa(y z>E*c9Vst9Ab{Si4rIoK5u8Gy6SF>uPMn@_c)$jV`zG5&RKuTIMn;2Hj?Lf=->VSNx zB@(jn!<9_R&7WG&VAmEHQ6XwfI-O+B2C@*{&>%a?LYSW_ggh)aVlSxy#7cIN%8%GM zNCfiKJ}g^+To-)vE@L)HssowOk%8(};wp1h)w=v{F1xmjj)~D?OVlJ(7cLvI0#&$K zKoowmwg{*?nKl>KT2(B>Mhh{eqM9&RMiY*#%dcHb^EOvHtdmqbw@%A*IoJL=fB8yj z)>ua~$|yfsEnE)Q#=tV|xOBy6?Q#Yx@P@x{6L~E=Xik1@QF)aQ&7V9QvyL@yp$eDD zK#@nQ))@v91@@7!-lA{k(^i>@i!=if?GOo}yk=oJWHAZmv1?N%p}DQqQA#Oe7|s~3 zNoL4=wR`*p)hTLOq7hrbMj?lly?a29)}eCD&Mr}_ORMGVRFd{>O(Cm#s-^1tA3&NK z(Jke9qDX{9SWu2zQht}^^6SdJn%E&UqSA!0K_5m#qPVJv9Y<%P77kS<`8`Zf$cQxY z;__5>UrcHiIwv2Ot*DAJN-Kr8%>zlxwjevgG-`TAm1`Z~N2^^9qwI&Mn1N;@8&hUP z(}qEZBvFh6TS3EEo!ylVpjQZM`C1uWP@URZm8`+87gzrnIAQffN)^cSCu+E(it>pn z$tJ1y59yK~3kxkuI8-GP;?`@btnxdP4OQvG*a``T#+HUm)RgCAI4taX8k#-!R})k^@O7RrRK!1{0$HX^quK4F=i&Rtd+M zct|*O+(NOSaxZ9R!0fDsJOPNtNRihwN@!?%4r&p6!-j)i4r82t)UJB1ng6JE+de5G zEEf;qDiFjMh6ti*%m|zZMS~`jQgNTkD!Q4eX(rtVE4p7)s&ScACE&})J?vWW%Zhj3J!p)_1g#J?9sctYsE^7y01zd^f2mzqV3=li)Gl%tKe>K3M#2frJRz+{dm4rfWB{PPybm-d}++ zO7&z`Pu_^X!w~G>>ab3ME!~1XPWA6K!fzsKH!8;NoPuY!V%O&5HVSLHH``iHWUpR9 zf7ya5)gXUXZCW|BS!#H&rZ$r;xAd5~VyJdgzQJ4#Eo5(9UX3#OaYz|Y`ls~zmXg0_ z*XK9eS1Vo|)rgI%&v__=rj9mH;i08A-d?W(+E zer}bSA~C%WUg&{d)r#8$zjoo&6U#AiYjKGNh^d(dvs!V~V_}}`=C{W2sE=~_{@M=K zKAUnEa{-jJYH66tSi!`_Dy|=3yxb_li2y0W`h=^o^xtcXjObJ+S-7G4fk#`g__~7# zejF`*mkIp+0bANvo6jt|@JC^4p~)gutXE!xat>tzj}U1t1EWxn0WsfXL3pvdr@vI(L0{r}rGYI(1~Sc2QlwC!AukX_JGb!aM)l z!KfdXkI0VM{O(SMJ~#cixNgJS>ld62khgfu+?s>X+usS%ePa={NcPMyOAr&7B>!=Ps1!Nmu zHBwaSGoKnLsJ^1~Oct|_uK4iR^d;Nrve>EcQ@J->bIw}OpUwWg&N)+!zxLtaf>RE2 z<6fxqO@|umqRK{CnZ?(5^vIRuy7ECatd#Z zExp5@1tsL=T)#+KG0b`#l$WgAm~p~TRP=Vs78*au<`|dnB2gb^qE|n?Mr$?oIw_(5 zc6`1f%O&jQwcIa%RFXc;*`Erw2D4+^rb@?h6aza`cB-Bs$iKNYJ9TNl1Knp6C7 z_1XNi<+zM5^H)bmW8*CJ&tFdK%`?%voMRJwJ5`hfz*86()^a&6JF;QdZ$!rB!JN$4 zt?mmN)7iSV#VqacK*(5cPpo9m^M4-Gd@t`@EcBn*Gq5`Fu8@zsSxvob8WmD9$bA@* zzO-C_RLn~X>EmR_-i}DfPWD!Fb}Iu@6Ly!8>O#y8xcY_cY~#e4Vpe;1#{PLA%1D@> zv}KGiQW113QLc;|3r)+zF3LpF)*MPi9X{k`YrQNaq>tahDUIAo@DPTn4_ILE9_FqQ zNk^#?Z;Ps8(w}`+M>s%S=Asdhs7n3l$L&6>^zU(nLqnt(;rrt(vr>PpYLptnu#G*i zX->SnZKs)4%P&oh8Pmt98-Kp!#m*w1kr!J&w|w7G;m{KcR+YQfV`6u+4gFEiG@T?Q z)_DXxUcP;ZqWiJn#KN0Td}0rJSK0o?^G07jYF@R;-B7vbeCc57p0r)f#VzkL*HXOv zTJFXB-O^T3tvA_Q#V5>;oM%2e-MNhAL71MU__j@V2a&IC3 zTznhyAl=vYX~?qfY{AOQ&(5<9*DR0H#77c_UOm3H(%c$NxdI-%GxI{*n0#^3f@f_K zpEtv=S10tn$}?mhGfeZ|oz6bWdrRCfwe3yOy`%iMTQZ&n9sky|lJ|02GE?*Nmd7)X zzppojephi;JDxpN{^h>+vL5Tnii1APwtwEHCA6dw_uAgQNZpq3`4~00VTXFY7tsE8 z@ycr-W_u06oxKr9+`X=~%wK8nxoOc=WaV5>{Pw^DnC*|>dCEd~CCCa~p-gH`9QpAL zd#E%!34b6e1Me57zxerD_6AehL)gr`;^=XCyUX4_tD%3- zj!`e~kXw#FpWm}!NWf$BU0+ly99o=PM)KnJ-KF_^F3mZt75Oy$kSH#kr&Eurtv%>E zaH|-nebRwaJySJC2&R`Vy3*W?8G#&H*g~jqvUwZhi{--u^)dS*X7Qf{ zw-F*f`!+*jJ>`IjI9+Jr^?iZ{R2`D^4aV!a|ScFJrfIE458K6xMWQ!GDz zYWUE3yGw9fhCf4cA?9JCXPy8Qcd<;w9Zohg( z<(Y4PF$lTXBT0LcUaeZRD?S(>!F;x{=iBU4scC+K&d!`U66u#sW_2@sa~3gQ&9f{~ zVZO_oHzx|hs>1$ps_;36UsaIfT%|cU5NCYIv-~yi-#&$FVIv9+$jr&tyT0w{;%<7p ztF=`N!fzM0T-?)7% zkpSeB>#a?YnBW%Bf=2a+u3%;cM9)oYx^<73vhuEUxl|kUn9z_t^qU)+DhBOy?*uGe zuOofF$CXb%KRa@G=9!}h=Ov^ch{OdLr6zB0tjycI{=wN_Lr)YRUp4o)vfumT16!9u zavK;x&umDZ4i%6iVc?4n(-mze?LPJOM|!L} z=j!{W>SuZ)?}c`MVYJA(Per^h!ObWs#JaOHYxmt>vh$A_%UoL-R(EKFgnu6nx2RyK z=*6jxC{(Hg+1dQjB!Bm%^)E1Uf4dc!DRmljCM3Rod0PGY_02`X>Ul!>A5{hAzSH)3 zSx5j`#g&EDCfUy{-T)Zud=6>>ZPsU%7$gB3+T7D(sJ>drg3Xnr=|LiA9n({DIdUSE z6wY*>W_>vH{QM@re|u0bHs^a>Xy(!X&7NiRZcSy>uub!49PI_x(m96o}p2cT9fMj z+O&g|fJmoCeMB2S2#@42AjjlTNT)n{7!_F#;ivf6K`paH9<3hm>jhNZfF~2>P$0!V z=a>vhBaKfiM@4^P+G$j0Q>%7UM`tsScC)T07@_uVsFpzI{y=ju0y#^fL$$&EH#s04 zrdH@wcC<(y#O0qbZE$v2khwj0~Pwd&s%KhMGeW9 z1GdT7Q#urq&|ypV_}TtR3xfr4IG%53P+=|iL7cI~yMXO<7(9T%F@KK5e!c_YIhcv| zt+O4%ZH8R-186+#)QuQl0Cq^L>F>bM|6snrkSFcI5CG4box}k^4q%omrBB=?v-Yu9 zx|k>b2?+u0+uc;kQ}%*uWFZWpVf!JuXRhuCrR8uI(!{rq$~s7N%fw5h<`M;|1O_zR zC^3Z1T1vA30;&dV7=Y`Bj>Y{*b*$D$1|%i_ao2qxVH6HZmj}>MGt_)fu@0=zvqR** z$SLYGDft|?(^~v&0FI> z|HV#hKQGV%#m+~0H-KkNQ4!NO`7?&((TM0J;aCpyB31HVy}&-?-AzB2HN}r0^BwRy z@+9bAG7ur+bF8G6G=5}1YKG={Km|yh0{pu9;Zr<2V`i+2JG+e^h;++{b@OYUi%#id zCbg+H_hZQVAeA0@dB~&>#28>~3D-9Z70u>*6(myZwQeB;5ek$?uGCCJcc!7D6>@*J zfw^Bn66w6lkz5G5XV(6Q2AI+dMf49WxQ+_bO377Pe1j|uap3HErs&z2=tCxv<3wM; z5j_ymBKMJSO?|mojWnQzAK{B~vEWiVwIcXBarN z=}8V|R2N(>bEuFQgHbA1b5Af()p6|g1qc8C%Bv5E0yuxiCC zUXhiQ)CuD%WGp~N8I(mK24_|tf|t5fpdu#t(dBA)wlqGEACNB()9UHQ-HTNKeV7-} zsxNm$S%04A({Ln21#KX69Y?rk8blIBK9y3SLXUtPR+|m@64*YO&l-WrlboultHd^0 z+8Qb29S1YW@w=z9sK}mwrK|h4_wff^$DedP%m)HT_<_?6ykITgZ7AQKDGQH9c?~?yT6C$r-7)^wU%sNK<|L7stW-tnQiib1}LQEwhh9a_w&R0WC2=+ z6>?=l%fkkF-V#(OX9c-mA33P^Za~d!k#X|8%#odbf`{FV$O07nfIg6_^!Ca^*(kVOC%VF?8ShNY z+)m8XU>38m%Qe{Vk90ItR5XNoD-FB598|!T=eYzG>;_7auUUct8;&kskQY~kw^vDv zOSoh-4D^HSn>@P`EoKl1^5xqh^kf5?oCV{bL1DwIEYkBM-1wF0P=rQrJB4CtQTV^X z=m{^YZltmt0L1_!jtjDphOxIPGL%cKM?n4nO$=CTb*69s44u@QGXNrUAowx(vk~Pf z2B=f>cBLlZ)4_mblr@5JX}P<8Tn_q-WUv7!)woj&V4BORE|dF805Dz3o|176FZVmE zvuxGk(}92xlp`62hInBm5VjQzv5<2&gZ9$^m&p7WCgc*Li#ptFpw_~Xb{HJyv7_|_ z3GB$?`&LLj6%eUS_K^pmlb14SpeaX+<#2quQ4C+$M5`;#zDD-}pk9u7R)-CXAN1^_ zzli|P0X!?@&fQX_LK`CHI|(@M2KmT__iQZ>d5IMqjdGv^?g}~67XTSDb|-{0fP0ES zQa>~k?Pis312VN}1KeDs4=sm~eiX+RF3VS*S;UF2=lAAF&sx9^fLr*DmVeI5J*Qw- zwcNKCw9wFPmcsQHFB1@gl3b9Y0*N7o5z$i2NFmMlW=uKCR%SFDK;^MkwjwIC&_yrLEc*K&%u6knh6-0oK>--` zSRcdTl8XN$W||H*f}gdd3sUky*owgqV`W;XI8^44CyjsRk$l;04sHqv_C>YC>zXcd zOxS@Ivp5U{R)+!eR$VxGz;?nryg?^ED1XI~+9k@v6a&6WmUDLxFva(VJ2I*(*k_Jam-nA3b213+z3?_ev(^uLPXoHGbuK0_RV6 z4_UD2i)4UE_sULoCiqf6Y0EK0Zq;^HR&a#CjXeR@Y%(NH;2s z0Y$CTE}|t-@^xPHflxKyPq{lAg{4kvasBJu2ETL_>7yp}H})dYjy$Unsn>VN8&z$^ z;ZMxD=sBVzOm_p0{j#;q&nX4yVbYAdm3b31y|?6*Q>@O+D^?NkiNKU@bmb4ulluq; z0+2=`CC5d}w#p?X7V`W#{3r{Q15N63N_Y9?YO4bD!@V=u>MNAbTM_2F`DHM<6Sh{O ze7m{mD&5(2@7vczn3SJ$u43P<*WcI(Ip%BK5LlQaodVsg3bX2d=35|1qKyg| zpcrq)2v!WQlK+U*eHWEp`KfncT-(!B4r%}n`nNLmkXMn$Bi3;6gjJJYR6d$;YI^C_ zOO+NrgTo#Tw|Ce_`qo%PH0LI6_e?#Uey(}htX%<1uCzpK&zrqByzs@yx$VnS4#Y@* zy~&l)&xT<;TejcFZUIg2HJ+2Y#11vPW6SZ|U)10!7R&b3MY${`;4N&m-Jf>Eb9NP9 zdNkRpgEB{4Qq>#YHIeKbY*Ojy=9gV)^WbNjkEepZk5j!ScJcz-msC^y6Iw#NIEp{I zD+3oCtxu1wmXpP1?%UTL;XTUmOY)_&xOF5dCZ|6UbJBX}BY$7Vqm$dNG@wkc)4U(N zH)$F7ubZS5COvj_5qTH1#?Bd$lPHd&{Ck~HeS!W_)>ms8CS-ZOBg|pJL#ESs-0+^R zyfruLt#Lsbm!_QYuPBnOco?qoY*e@qx3uDA;DWw7G>$=6J+ob^?1{5oleC+s$#T#8^k<}9sBExrckkfyJfAJ4~JTF zTdT5M&GQ;VEz$&5Ni(k3p2Ks*s)(%-RL!MXr#tOmm-y- zwTz!13;_N*-HpECr^-bEalorPgZ(WU<>qsk9Q0DGch2_dLfUl(tu%M{c)P;Gwy^`B zW4y9!RxRMAUe$AJ-XE*ay?gM-S{-Hnui;T0&iY zLW&|RTx7vVU1@yX-nQVj&;{?5zj;ZGYa^4htze6(0k8>`y&nIcLK3e4_q72>Mu%4cxiq0{)|x9?I?CpsK2PvFsLl{7;lCzvpx*CE=P(#{;noGIHR z(@`R08H61jC{r0ndw0hgoa+4JKwkjO5Dj8CYvm{bhqOLA2jj|23qpgnQ8$s3htGVQ z>m1^Gx2Ghw1{HEDwZ?lI&v$HK^3023o0s=!?d(&xof)!>4{U5|SQhfs=5A|z=-FJH zt)eDk2)0;1(Lou#re)rCZd|SzC)v|u{abq)H;A9ok+aiPl2qy{w%l&N5vDBour0?z zPM@a759V=vN^|A5712`13LUw~AXl~`&vT5sl(o71C98!tK|jY@BYqyln>7gJV zAazAFYI^Vbe4SlI`|v8(L5rLro%I56&T7S6a_}%{E?n0%#&X7)k6&?>7$UtCu8tdq zQ8Q2VV6L@liP!TJf_4_-Z95s}PsG^Z>(cs}Vz85O1|Qeoj9mgBv@ws1OSsD+Eh~BI zI987Jt)WRdFUFf`KJYIhvpjWTNbnEBaZjL&)r(;v>gX~qM!>3$Lng$M#C3`Kfn-jP5mQ>nsX@d0D%OqFy+}KR zS_>EYi3{=GC7g>t_r*DODCOI=V*Cb0wSURjBB!=o{48djU4<5j>r$DXow)2f3{+ca zwI;_Ws(tgPwz)qWLT??83vg+|*k-ASyEWB*c{)Y#5J1Sja(UVhu|$}|V*F+iriHJ= z>_DGfY8A;NDj9^i6(Hp>>zPchkxl+PZe6L#v=xBM=4nCvJjZK(i-(sloQfDuVsS0g z0vBiY+r;}!z)o{M5Yx1-yFEFBo+}GdQpB0qe;ca()&v&#_5pn*P_tVzEHSSTMFY14*|^dapHaJ5EYzYscTYKTaiz;ZG%l zPyY=4dM$N-(T{o}oq^LELDoZs|>1Q0-a`aw~ zt*8^6&ez3Up8?@TgV0|Kp^SoeCA8QXM1O%4K*J!-z#uZYG&D2}|H^lEPhb%Ql)nK` zp#0I=n!DLzd6uTyXInS{S9py4NTz1dUmtW^LeD*=-&Mo!x` z`0^4LV!S~MeS8m0Z@@?ij*_2mi~p*+S-cOjQa^vs=eew8V3-C-W-ola_+OQPsJ%un8# zrp?a5&4Fn-T$}5l)hY3Hz0vJoR)QPPe2nIv%e1`YfhVTYX8eb|w5f8o+pMDqRhdlv z-2FE!XWiJTJ#02ZXu@A<<@W)vr_pN<(#Di7NkUpmM+wZqmN87T@7S~#ngky2{a0d} zvaGlJgIfuJ3DQ|twU6yF&~~vLpBFm5>T!J2gMJlTGb+KUjo&zz%}SP7uW7d`<65n3 zw@P+?qBfN%<(J$*hz?zp6A}7HE6&q}!PZBuL!4S!dCg<2=KxQ`BU2(bRL+__RBw$1*Cl za~QI2aJE?>rRKgs?KRHruBI;!v~2qDac7VH-X4#LK(9m%Iy}(E>0WxXsn0sVo>J%+ zQ)HWP%qNu>A7b*RMNBZ_C7rs`B%Y4of9oM(A3I@# zVY9R&qo-qje2M`>IGFUv-5iQPXwq#U<%vt?HAG!Bj~*zF!Ikj5dU<}Id4atbT9KB( z&t^m}Wu^+^Y;k?}iL09%vz5WmD2dDLjm!QVw@gN$!yvnt=09eJoJ&@~v4NZjXA8$9 zOnh~TpsrW2HGKwmB{nae5;;PdKm(-TVn1znNYWA-KPUBs%sNvt>mM`hei#?|*{qy_ z?hs>Dy-^>EBcvk)_V!tSex5xRGUs_n!-zJ%5b5veOnzScr9=gGwnQLN=8sC|5Y7lG z{|HSp+=Z$+_hIn$$>e`5l758D&Ndf(_e%{7of}%ZeeRhOY>)x?Xpwec#Cf_sWx6*s zwL}O(x%*6Jy>i|c3(;;kefEyD@7$P&BbjGP7oIz_@YpQ;;m`#~&bV<_656zcQ)1H8 z3gopJ<>EitW1)+l-*0e}`M&&T(TC8*|LkywAi()68iNL=0pD5Z3lIo^0DwonMSk=@ zzxdxdBrZTR(r9djjP6QcnqV(_^Or{IwP@;T=Z&2l4`@Dl>UXWIx{i){KWf@}@ak4O zdG5&2-K7ai`-Gq7`csEy?Q&gwy}+jU@XbA8OY&}hHS1U`*%u=joSsPxza|I9NhcSkPy=q6kGv*`8By1zm5?U5Gb zPrsj3r&hjYP2E%<)CmtJZ1=ycMhygX2?b}*N zF6~VzyM5yXTD(2E)wgim?Z!^TbYdS}Se&C|M6CJUicb5Vb@ab=9sPH?{Li)E|F~V| zzmxkv*Mk4+?j-&*`SkyHm!JOcE{~;F4aAOJvLxDxGzJL+UmI1%T2k~(pk&yrQ)xM; zIx%DmOy1+s4@=`MBqi_8pPBXG#DdUmcng=oI2_S}V==Z~)^zEhpsD$8J73UfD@!}~ zu>@DG>`3^&;?L^=q`4lvXiiT2oJB{iQZ;L`|MYf-#wFcG0ajws6eNU z^Tsr9Oin&HyKy)At6jNf!N8BtA4dY^g@0bHaVNFk6tR{JHSPXbveL#cuYXVCTC;Uu z{c~?^p`@EF?}{_G-$}e=b!%5581M}+G@Y2Fj3jBXgcW^q_#Q;E}GdmmTh@SeG} zYm~?{%56@&i(FWZd%{zU+}8bzj(z!S;>*Ex_^(I>^>*JmJJap)mD4|A;J>?yH!^It zfF*Ks^q*m~m>hTV%s%_`Pa7ud0mq+9Ps$bLba05%J4KHXq?g8UD4hUuKt6%Y3=Gl2 zJmlq&{R|n|#Z1wi9bWw49tKy<@kp-1J9wwNSyc+Qd;C-4($S!bt+jpr`^m2Rn}0^` z8~yNiym=E#r++N1eto|y^B3YE6o#uMd9sHXtN!hdNo4n(o$TVvDbZV_17!obv;I7` z!j*`O)}U(D(~-jB=L5#f-UXIXN1MhIP83UW?LVRiK0Y6W!jDWek?dXAS^mSU)#0bL z9#KWg{E#(mp$pf+!|?^*o!&dR28pCC-Hzv7bEpgBHa%TTbM{w`!YXIW8Jt!A2lLL1 zlrXm2XJnnpLA|mK3mLn7@Tcc{Y9qb#@xz0^kmt1c+*?w{qekK_Fy^+o1^~^r00&K% zT}yZpgGp1Pgq-R_{Hi0R_hf?lY(;yG{i9_BDuej!UQFt_XH8~FVriUtyujjr+0cWL zp||<(ie+jZXaggDmQDl>n_J6hgawnoyLDjfxi0SkeX1hCIjT&Q54XEvN$x3As36Hw zCBuokpOvv{m+#&SD}Us4eq4O>08f^ze0frRx8sh-O(Ws+L1Ed?Z;AU}|2>L!NZw0~ zkb$q$y9Q1WN6w#FHFEODRQ2Tz%dgE+aXd79pN!*(FJF1(pDhpkA5=zsyn@czd1A3N z3SIelR`|O|izF?qCD8o$4^P%kN9-p5BKhmg^fQMovbfqt-A+oay8?5g;kWv^mHQdS zIS&q`1jrBlNJ+Ffo_s#+Y<)Q{6I~H_@~8F3@{fPgq|={z2CrGYnX`v|jox!XyDI=y zjGDIoU&dwT|MyA$jx5QkFCEvlX(`yB^%UA)VzJ}d+*-!lMKQbti9J0sG<*@zP10`vDwK^D7;0S z@0>l?PIq6sG^^lq$d-#axE-49W=~0XQvY}!y4zz#OZ~+!)1tO{T;6Y*&i>yNjfBR7 z_TMQ=n>@4Rjc*RkEHrfWOWmQjR_)0NTO8Sh#7&RmK^==!%xVNK>-0+sh0@$rv7 z!XB@g>wi*xF}5j}a_`)_0EIZ2U)FOfwk3O*?&|q{*|kbHYdi8z+lZ!-)T<{F{`T33 zUHE*Yeo1TkQTU7+C5;jL9N0H5k#f^|R&T9N@1f1fRM)dRvE<|nOOJ=V1)ZtwQQ<+( z3zxoGklZZ7ZHgZj-fl~rnQ$`w+pFoie#ETPdJX!%pHGq^&S@;sJ6lLk8&rI_w(KzH zK~_~Z>HbN|eKdW=iK^&_b#9kiulzp$;t1J}G721!z57f$3jXc&N7(a?XtNV<2e{(J zW9YiRYxXOK!D5$fgIccCOcSU@9b`66Aeq zro7M2+%usX6gtb$zS#Hu{gQ#+UBS5nP0-6WKk=fj{^#E2hMT2{?g8dzx8o0R$)J06n<$7+TzEU~Jtb~sP) zOYMdK!Q?rcRFyIop7Zj%v8Q>a@Wiv`&JO3n^J#5oYlq+w;;DiwSwx5DCnUKPq7yZ$&NcNfSWc=WnaV+f96>oql8b9(gXrC0m%>LQJ^ z)tJtuv%bHoF!_1#?p#7J{b+pTY>POFnOUq}Y?}J-!bQ@5=kR}4W3C}pDZ-lL+XQ2( zP)V@kl~L1hh0@M~nf<8oL$|4jlYd!dT3@R)Keqba?z8zXrq6XnCmo#oNf@%7RWMfn z6_my7_j6VM-)&i+i=IMlUKL&vT5RjJqp(w>aAk!L=E0@f<53m(QnMc9;jl#iZhm}2 zH&6YmDe|ZFv~d4|mA+tkLkTvxJ+ETuR|71e{XYlWFP2V>G?9%Qx>YU-;ig~x9Yx$o zM|LSTSKj__g!`Ieouu7ulmcOhq-T8tI4* zo%i&Qf{x=Zv-C(V-nsqO9dlXk-8Dm^4W6@Lwdp7%mJy_5d<0THYs_Eb2ZsHl$R$*5 z-qiOz?ts$YLAQMEZ5(nWX4-HMGI2h;xu>XnRy~hwivCwAC>$zo0+b5h$@>pYqdo+;>PsEOM<(d zZY4XEqUou(*sxGplwD9P^J8Dzs@s0k3rmR?O(XX4HkLY8HACUx4FCI1j=KP(lzB^O zf%$;h zPWiFg)`VH((T8~(;FQ%3xwntyKk3CTn3dIX($C7hd^}?@5{0KlopX)Bll0VWY8KtSUdi5_;$#VXP0*(|}iWCAb@jV+Yo?G6GGyvv~Aa7NeK3rnMX zR!JgW2f zyWV@fa|Uj$>x)wEU=-AjG=}wAZD)(omeR1g*h9hj$?Rrn>eU9`-`@%ALNky|`W=1!9;50SHny~T#X$L`sWFAe&%KpYpBHc*Sun=mo0>S! zK4t#=`E-7>xaWc}zd6)w)ld@u!bi)uBj$nVsUou;IWlU3Ib#+4XhHn;>Llf%dEFAc zM{oPiv=-#GD}6PYCZ*xwJ^0XZo~2Jqy_=!At2n{xtn+BTip2G?kdvQxq%)ivWiS8bS|3m>lQoVDd$TF>1@6iy>wL_e+S=uQmk{nAmZb2tMYL~sZ zFeGjDJ@3RztDlWbJN{zMPNW!3`Uo6`HWRxRZU(|s#F|iX4FA=cBX>^xE=#L+P{&q6 zQsK+~zGo*EpGb7oGbb1Kl|oZX0DJ@=C!XvZ!FT69S71m*wj0x*AA9?F+p2r`(I=;tB($Ct*RT(j4Gp<$2^^%a}Z~4;;`_j`4{K@z0;|(1)0---~5s4 zap&5;rbRh>h_9o6ETIRduviaardvlLQ0ET3!RN*OYM`s-2-A%Nv zOdFpMAj3Hktlg1#h4m3Bjx%j!&TRkkh}DcBSoana&KD&+urTw{92o3>xsDVX_$mK= z+i6^->YsI^lfvWmcSs=Z?ap=1&ByK5<>u9Vjgrj;C>x7Zaw zp^X!F!SSw@dWvsa_0=Qn?PFc4JXM*^4BHFQcW^sR9H`sAzll2AG^c3Vj-Zg}F$@3A zFUijmM4WpgO^aVt^*d0yi>-s)X%r>lVO?|F&DwVjd*0Ox6SFmq8p0GhZT`pi?>4Mk z+u`HJ&t`ZkxMNA1hQE3h_4e?u?XjHxB!;3`**WU&y60kh^Dd!-xRL8)b6}J~Wln#& zZ0yS%dgzw^V=0r&+`Dy~t=p=d5U1CObNTx~+Nn39SSbxy9DDDOA9ekT#Ml!*?Pm+2 zY+&w(=OY)l_Nf(5Pu=~dVa%&;gu003RGn8cI9N`(#@`&wYRq8 zu2OL`-aNRl{sr%`;KA3q%I$H__w19bL{3S6`GA&w{Yy6A)@@0BN5(75OWa-5IkSE& zh}hxWaII(FH}cf18xc<(7dMZM1gEAT!Ss~_l!?=`j8Zj+@Sw&lB)g-v^1|Ay)8P-R zv9O5;p1wP-3WF0<-bjUd#xZrr>nVS3lB=|*9^Paw7Z%o1g#yj+%&?q%75(5{ zLD)Q2SvDQEnx>~MaXa9WUCgaC4G7q}{1Y7Y;#v)v@ci?cinWg}a=!gu`#p76a!+1( z;-3RwES;JOn5#ccW>|WxiY=dCGV&_s>#c|PNNwE?Hv=|*8GC(V!(068ldYJ@JQyMr zMh0rxlC3SMdz6?+Dy)JMbZ{{pi%EJuED9?9N)IPw>BVNz799?96Vks&xCR>G|CK0c zlhY$?M8-YDwimdXFroWzFACkzZz>@m(Hj}zP>CWi|Lv%0H(XZ1n7^Da5=8awvWpTi z&;GMd4p=ugh@-B%c_ehI=2KJ~BW|^MArWd|e}(ve`(&zYkJI+|z{kR-rQ5H&v<>Dx z3%_sf$_v>!aW?hN2}GKPYsN4=7AOvVypLb@Zs`fQkzf8sZ`Z!*f#%tiyWPplj{jlY zDQ-+R3FNg;9Pd23GxllUAL1=_mtRde5Ti3xe|-79dD)36s4}Lhe#+swFOZyz>t7W- z)FM`59=u$+dnTvs;+OTLWO}J>*B|2BryhMvB{mzk=EYr_{QUeBrz_5dJ8gIdySfRs zzml|*bv1rhv0XxaaWTayOI2N7+l6@Z;f5@hKNCz;|L2 z#j|F7QJKyTH;pj=C&@Hx{`ZpC1dTH7f038P+`|wVBk6OUwRiTpcvGTjTn@cryL)`h zL1>iCUF?D+O zS;v6BM^aAS@#CzOdwM=Nc7kkc!LZF9^7!j`cbL~UL;k%R`x<MEp;18Y6SadFR@tZ^Zx145|XEiAD-O6Rxnm?}Hu1}r8 zvC?%6hWt=<;VqlI?wV{i`%VdmU`{%K9L3aN~5Qu84J5Q#0rOa;IRZ?ULPsgm(O%ll|?@<5A_=h3|IHC|K%sAO@NH z$PKzRLM#7gQ~J4-yfb9;dv@L!(y``OZSpY+u;*F}NbE@9H6Y zhj`N^?}zTG({3jGI$u8?iP+LTu!&-EI{rdd-e^R*WKVnW%qKtIVJ4sAoY?+sYW%x< z62~3C;IpBM48_DJeO0go!5Hn?S%pkXXOquoMAsgq6efLoWX0K{U`-oZNVwl-?RWSg z1fLJ+-?O6FF?0Re_MJV2%;BbGjZJ?2*1gt#IHT$iAuzsa`RcST3C=p`;3!W)kuwW3E4jm}2n8*82ko`Cwnyx0 zJnEVK(Q#mh_uO+^=H9Lw*l)M!boW3jR9Rw+@pjQ|jl*@^3ip(2ZO3mn@am!uMW3CB zv-9J{(5mlXy7uB)hp>sCUUI03as38|McAbl%MVQWU%&NYXkW;O9V0oPGhArXp5ZOf8te=e)e=XXdEGm#5jafCe=H!Qp6 zvNcau%z6HPSiBfHFH4RPBZr6g-9PQKd{x(;8|R%rz0%grX<$6QP^iED#(QPir%j*x zbzLP!`vq4nfB&SveInIexcf3Uj+yhj&xXiM=(qNDn=kOM7?HGz2dvH<58o@)mP415 zoj+?ZA+4XkJ`4-OMjhPRsw{uBZGFo5dxcM=qX*}Yb~rmOXRPmkoVxZZ!4C(FtO=4J>9g(F!9`ABn13qc1tkq?0m>{vPt%AyT&fX%C>bi#~mr6S}|dnAHn zg?n{~z+?*mlu>6`K$#uSM+cpTwp0;I0wg``h~-Rij@3r~^EqUJAe6vnIUJKaUu@JX zp47B8?r?1izg^ezBK!5x>a3>M#}2M{w?tHG%;#dZsp_sqFEDlm68<_3Pfu@PKW4-&$Mqv#Ht#&fG%yHc(6OW9` zAe^clF<&5ilJsFmkS=_j5Hvax*IjdGTJ-UfyIWoVy8QWy+53!qVCFFjRsW)3;IUh>ioE8JtnShbPX}u3WnR>!+P9 zUVlDZxAM%dua7qTH7hL?{4o^#w`wej5?q?w>o1AQ^KpJT=%_)Tt`tY1Y8%a?P0cbx zbXKWNV!Bpv@|9;dibn4a*p`Q|$2wpFsS2bF9URh3w|p{*4*dF|#E+kbtrw&3@C_no zgUI?1N~DiQSCa1e7xu#g@|X0YGnx^B?DoE?U#|3ZP5ohj1QL#o#|u~EGG0wBMs*12`JGF9cY5@KZwX@r=Oq1P@p@F_-m`^a{x4J z3kMse8Mn>_;l%3xD*=~5L{fi*_Y-ZW|8qy1>GcjrDQ%7V`#c$Iu%^z@raL<6Ig z%rbV*(FkP*b*-|)Y>6hS^E)ZyB^Uu5!;-@b>E^E}D3rUVxQOq#!i5RLU_tRTX9do? z9i$y=Celv6fcs*Xp+k@agd6U<1E1%7|Y_3x%IiVcZ+}NDNVh(N_16TtG2A zJa1e4X9VV@ij-5xSzK+7s95MgnkR6;ppjX)0tb`DlK`m}2>12iqXhmL1ar2KTyNN! z7UKY^efpR~07~rm*^2Ndi0ertdQHO1U$@$ccw~b)^-s2dJB>((ZL-y7M>~Y$eAG!hb;~80<_)(!!-88NbUF3soI|Ea?n$`K^=8h;~J}DXQILgbF|P zY4i*Q%;Du5*}ZPM=`kI0YIL6BmmX$O*DooIdxoB(>oDO$Z=e#ygsZ@S^XpdEH3luS znqPIOVr;D-DrU^=K=q=~Q3zk46F1jDUAUt#41=9P;pyOBksY{L9>Venztq?d!~7Py zSe4A}F)Cq{@XscU6#jg-jj&3#QY@O(!ReEII~D-9%=!CzEtns1JSKwkT8E@5PC4hD zh}XYB8sluyc?(!u#)2MxA1a!Bi>}57h4Z{ECPA zZniGyv&oIp`Pj}?Q^Q>9ho+pq&(7P^(C{$P(Iu=Zbt5ir{l~$HC6|8OSsd52KGJN; z+xuF_gYS8@1Jzv<^KFChaRm=gV~$@K?C!cv_@Z8UsCJXj-|R-&*|vuH?^Yv@9Y66~ z*>W!{%p!r_d(&zNcV+&=*gp;+NE*%g1u1Ky{d_U>c7WS#mu~$6OjwMb;bi)J%~mnv z!Ci8@21Cy2iq-S>UHN?a*JZ;jr=VwBV*O9g5Wl8tBX4VHaB6HC)@M+sbulHwF*Q4a zEjn&C8etcX+fAdk&f0cvN7(tI;#?W$h#2hOE(u?78lmi zaf6yj`%FHvzQXq1iVfd~j{Fu;PliqvsjKfyKlJeQrQcuFXBzM{HGtu1;H+#>#A>aO zAW$I)3>euef12$$+uw+NSphNpN^D4zglrhO^CjGxt@%pO2+brJei$r(bmfH_&3!9` zh>_Wp*ZOW-$D(iaMn0@rE2E?7TS{&&kG87mK$Z4nXCKI3tWenSH*XFPA!LRn;N1q|R_#0|_U8Ky$jmrvvvN3@oq59= zwQtzDw_$UrIvheu9|y@$6pmwVZd(eE0Mp{6YnqozB8wz>b?{;)Zl4a{WWdY^7TOt1 zpgW<(N_;CF3t2F@TI^{ZzLbrkNRWp$lGA*AE?aCq1Aj_`7if`e9o$Wco?ngMV?bqe z!xjjnr$JnXAU{wmJ*APoQEhu`o&Ww7&@3ResPL^uK5hXW5nwQ>fqq+o+pXCi2(I|F zBq#R++zrI6>Boa?RFn=j6~I4Mfov@pWl@K1Ckor-kmHY|XNFL^o+o#e*1M7TK4+!MhpmPC?YENH6H*yL^1A7M7wTxE?3pqT}K~#LHUp3nu9e54v=Kl<-K? zaO8G2CS9;DOkdWxZ-0}UlNp;hslz)1xX%JY$YP+1V)6vUg()!`fQShmagG5!3X(xB ze3h2;MvGmb#ZU6^OeXT0np~`gH}OnbnP?0XHx3;KXi%j*OjBYNLprnH)$0h zS(Hek0k3xhrW$asGBV9DBS_FoPpD^IU0VsuweBV%I`(TG;E_{tfa!N;TRHJQqwXW`{F%`jw zf_S7PZUA9P8lpd*2T7Y6C-4(Y;!Gu+3`?-#6W$515n3b*fZ0(H{g9hZ4KUe+$B^*P zfWOVhO`{;@?8Delu%AFeHBa_}LSDw-f9l&Ym(48<56eL9{%2~mB^@@TA#G(NQEHst zsKK}UBK+v^Ha@vr2TWz+UeO6uRpYff7-V)IP{IGul3O6~qZ&3yA#c#YxV$DkpVTCP z-g)E&1KFSaq+4y_v8RJY7wHo^Sr|(LjSH@(C!K71% zW@!=K>^gfk;Rlbbf`L$+r*e#H>L4cZZoxHCI3CX;O z?0+m>7zzyPjkQvuA1H~gI@l`UxVIAhicbgw;hGa0r>n2>nfQB#{d5EB0zeWd0W1?R z(E>gIZbFBnF_DKY@J9ZLcTq>0wWK{-IHWOrOTp``(fxelIX-zi4>^xXx$NpZcw05R z38)v4D+H(f3~;HaCO8mfWFpMi*bh45A0Uv$CZE(?xXiCT@;AYUhq}Wf3IKSBhUmzE zwdqLf0Kl9He2zk)g=nJzY1Qhx1BGFaBQ{$g26e=Z%**Grq(drX8#d&{FZGu`>bHYk`N+qa8C)R$A&=KOYZIJJ;XtCMZ3kd;AWK!+!3Q8& zz=juV$)};7ICY|ciP**@7dazRc_>>tVAPR1H7Euf|CC7>-GN+ZK;1Y>zNkT_vI&Oo z9p{@AubG5I4ML-9P5#>V8X#Y%qZfsC70|J%f-d<91ci;=T!0BTpi-D}A4M}E~KhVe^U0LI9^gX7@6*~T|hP*+An6AXX z0SWu)B)t}w2zaz>aEJMjhY`;aKw?LtQHd96@uL(x8AM-DA3CKbf1y;ga4NpMCe`r> zuLQKQK47z!{6Sr0)psWaApZ?w6PVjR<*jj3!`qqUKb6=P6=6Huo~D6zbfnR$k|G|d z!+@>^NI%pUC;;vig;0Fdve6%=HK53+ zG}u3xgj@lvShw&PooJvFlC@CiAwDqR+Ks?DIfzKr;$LeCB0ByKlW?W{*n>B>-~W2D z7Jucwj`$8BH>w=iI^GZ;=c+~=coe*fLWCr$T|g2pk#t8(e5ZuGl1Rno>h}A#31GrC zCE2JX9cI_h697xJgje8!KMfc=0KwM~ptbfF6_=yQv3vz5Gx6O@V)0T!E*m*ti$qh< zx0IxiJEML)R0o|5GVlBOnZ|^|RXp+sz;(v*B3m~0KF=hc0Q1mchUt4x@kmGcr+u{e z2_=;Hl3ER@I0_`cA{jNrVFRI%5}Cp$ywZ`!C}W)V(t-I18^{7HAb-@6j%rX$H6R9w zt6$)g>CrYu73PMHtm6|$_*m;>u(_v~3{h}zPTe*fdcA+BERYTF21)Z*!S?@TyJx|C z)d+Sn+f4u?X@Lhz5ey~z4xNYvVP1l?M>8`B{E4u1KWp`yV^@&-I_|VJ02Ux3uR}B= zYa)p4LaA>J%0aT(nKbnqmLYJ460UF}uX>IYU6`<9M$#5euWJQJ^ockiER^>i!L2uH zHf8XxBS=*p#$%-Z*s*fzjF3l?z2-c9v}u1R0NjUo*|cyTkL_t-Erf7QO9_vUxH zHy0M8L~wXnKTjJ}VQZ>djve^@fqr$}p;+Qw)lgN#`_$bw(rPP;6>+G$h` zeDHa%j6kF<^7B_`a|B(09!@Nex9+NgSU=&PM`|jVIZ#5<&$8X?|aPpy|Nhq2GaZO z|GB|rChb>^{rV@{%35gNAhJbA=+yrBQ~TqX0BvQzo~*^bQ(XhUTQ(2dRa$>5TW`BQ z*LK+q`*jZ0Ay2LRheIrC)}u1_-&~*b`x|%XoL?hPSMPcXYY+X-^vT(0G)bK0!iXgO zh<2^0J7YiZ&Mzwm$(?(!G)We8z2Hb|j>1JQO!uKR|Gi@P??C3p&OeYqT6f%sNFwTnyu(6pSCnhVzcOF%>Ef` zpLFkA^eXo7tgXM1w()viZN$#05&Pp`FFZE?&}?avPam1Sc*AqSfMlRsO2Dmths}&q zo(?Xf<(1z>Te?J6bARf;99dH8xZrTeiL@T`b1_z{XEZwWRx^xEPYz<2ID|>;#qA&m zK2YJBsHVm@JEG0J5{_auO~|^iXWuaj#+vC@pRpWM}Kaoc+ztC9PJ`IW;$}^0l4C{hQyPE~cLVOxAd=A}HvL_!_aZa-*!wu?#G$ z>lLY)UWA*su60U@EdmdcKlSJVD3*QXK$&@zmE%FiU+n2uk$y2gea@{hem5;Btrn{h zq7K_^t^u()Rb83|TKXbjSnV*}jgT zx;L_mUCNk$^|I`^qUx1DG_ZcU*Z%%aR%&(H5WQN(kz408vt>5Rx0+Sv97Bp^Z2@XX zYo^lF&hy_D5sgH9 z<%fCI32PH*5b6URMTjl`VC|6DH_N^+3$+k9pohS(D6!X+(f&*9D@hhw|k zVwf-sw+3KLwcVXxNAoJVW0KTxL>9FAc*C)a#)(ErBUn+eaG)CvIMSM`LM0<&<(9wJezr(aBbncLpz_w}F%Mo2@h=Lv@+obU1g)kXCDOB%i9?Hy`nv8yZ z)J|)yh@eGUu{)_Nh~GC#=F7bI)9b6eMXOFUG+f#A=1kx0zo$=AUm}yUbe+Zcfb3o> zi$SMX34%;DW!YPvK^@EOqtB$yMZ;NA^Xj5b#bsZ5H!IWu{h13;$Jj_rlZu!fQj1hV zO0y)oXleDhNrVD^w6F__e*4T=5U&YECg_N(05~!qQn~8^DTBqQyklc%0=h#ftpmFt zIx_I05+1T8!zx3?_PXp7;tYtX{ZoV(N$&|e>hq2B{1jj7SrP6_hIcIOu8ncl$cx(Q zs7=|SrbLx=^+?0iPwkjlJO{u7*){dPR!a92R8hgPsXD66)srqUnvT&B5)L*2Ag$Ka zAebs?K+p$pZVY5w8`ZdJO>wkLO1jhiXv`cc3gPT9r4vM8+cc$drVe;pI?PrpK)Pxv z(*nBF0+d>qM`4Eb$^?*7oE`35#xD-fsU;ugO0HAAO8UaHe5)?RWSR9N1E}Hd)gQ9-dpUH!%2`h^ghPab(fRiTEX#rmUvh++~Mh z+9(~fqBDp)3==h^p(b8B^WI(v?DLeTUV@N%0E38{6km0is{mYj357{|scR zS{XttH;x>gWEMpDLf5M`fT_UAW&?z!Qu#D3yaS*tRN%6JXi7qpt}d0`VdOTS1>;q1 zuoO1hR|#D=7o^)RS_qGk?(=8Z-fn1!Si5@hr3Y_t9mt*4-IR1CVPoN#J&oQIB=M0D zsza@|{{!Q6P{1jnv?>pHFb*c1331mpXrlq7N}d-EM_MW1$fRfFWps|k^7=5`lOz#I z3Aa-)SA;HAgFrvWu9U&SWod*7rB0TRyk=JX-jooolT9uIp0a$mHP%@?g*zHMGwU2U zcg-xv7C=*glWi;)c_$-mGr);?iNWb+dq=xnf8WB+t|?nzUpGaaEv96# zMHiaJY42FQb~FPdaB{MHUDWGPsX{uBcJ{q#jD&oU8l*QcKIQ!+W|qF0$ikkz@<9>h z3qW^SGt+4T%MQ2a9g5G(Z#e`oduR4{>?-OXw^^YBsQJTXn@YQ;j!+WU<2WYk9yw@Y zC}!8=`J_A*48^BH1#qpl{N(-%XRK2xlTC^xsTb z@o3PKWS}!WxT-M(NOxGE>9T8Ni;dQomzjxx@To%-lz2piS3nczWY`|NQPqRpEX3aZ z=T?_(crg@0oC-L6ajGOdzH=X*+re!PYkTJ=9C1B^0tBr z`>D9j#HlZ*San2vwAdJuvApL%%g7n`X7@1n)ea>~N|!^3gYcSbx#dkK^^T#en3pSj ztE89to)$;A5)u3TBYUI6V(W%>044S7A$P^FMFpk5;P+SR zrYkX(XEqMbwEuM7$o+8Exb^*_t3U6{Xa6|AYpcP}_BV7IF!FhgN@nznezZP-sT{`}H8Iddr`TDTk!g^h<)<5@5q?f{w%{Rp%E zhlUHJC7Y2Ugog%58|kuc?8Rk+8IrJ;e&Nc?krtE^yP`;FcbfYdHh8HkGdYsdFPs++ zasMM}g6`GfeOtOg^8~mpL~T^}npfj(b>NnmzFhzAQZ0;}4S{kk#e6PG-}|O0TmnQI zvnzXDf}#rBfGN$K#Ez(}(!R&Rp2gk059)vwZJ-c5zWaG^gNMR~)rSUPeFyr`*<2fa z*p~1<91qNJR&>Fm6P&Nr`d_=t6K)qss#&;5|I+wQB$8oOa&whisvIC9JO_k z(7qa(%tWU^s2mWUI1F&HvP^+g+66b^i{r5}z5q2-BdQRC)JaLQO17LOF~^!o@gfRU zIM;wW7lL5W$y|f<>=ty2K<+f=<;VeHw+<0E*9)@hP%& zt}K%w^}zy61uBCgJLL&Ct43yM=4UWuX%va0fjh5FX+&tn5L-I{gsb+87jw~RN~E_S zFvEdGV#Z{&OQ&l@i$uug)pUY*_va^+?a^ z9d+GW;vMa=1aLcD?n*1pTmx<|3fiFp5s)2kQjAdpC)Lq*0x;YlTcV4m>cP3~vfN4e zdIlyzBeJH7=2GR^OmvY}3b9knu(I5CS-wKPauVSJEs{mjb%1=0>K_H5h6uM$5JpmO zW%A^yRB`lm=?19mp_3WY6oZo8+Q|O6wYuR%jmV}59yKZ}Xos9xVp0w&Gh3F|FVE*K zn)WwrIUvuZ$k*s4j>@4dg)9q1$Fxdpe#AO%gn6*h+rUE}0w9DZ%Mr*{EB1OS2W>}$ zwsc8uqs;Lgs*?di-kG&ZbPiQE+T1~gJZf6mY5@TuWELzEKn^;TKM(Hwma{_)8aa)! z_)(D;NDP^jaEcJIqv-W|#K~}3E-0R^k`}5ZGt{tHg9Jh~Cu=YXMIu6@WUXErq=V0# zgtwNIIWb|D03wrtVT}SwDmj-5w@^uQK(Vb(G}LdRuZB@I;y6Qs@|S#eH6Z{*#&YG$ z5+GD1%$Y5ont>pCxi-FU;7dux2CXG>WI{ z5NkkrP&I5KNH%>^xKxRmr-C!MB6hZ?m`Hti^v+4dhrLgMLhky_~`*`vAI^9%tNnW zW7eFS4;>#%kIGgQjVji~?bq$xaYq(c4fiZkUMK)eRj4ASgrXI%E0SVVkhSgM3_XZw z2UI19jqOs%=g0@qi+HF+Hqxd2;E}~JbCq`r6@Y2P1xXJo-$|1U5ZX7CCE{gf}QmoK=8A`dPC&DzVvdblJT?g_++A&(dn#nu6IEq>2yz>keyLr35QlJx>< zI8!=%w(QjPvXDUO%@2T8wk)?FEl^zS^#VDZG26Y{@zSDzXu23QZIG{fe<=+g+iJRo#{{z!}a$z zs^oK6LdGb_&XzCXOBSfbf3VQ_SZV2U%m%7#HdEAe5=%D-sdUNGepFt&)PX8OUr_@9 zYAZ{2<|}AA30qr)_7_|zR_z`8C|j=SSwzR=QsnCr~F$NX-FQv|4`t>oV19 zlp7~IKVT))#Jgh8yZhTBqKYt-qt;l;=_LtLW3C1r#u8dngo`Pd=-q?08)1@m#6E#S zb|5N$OVxH3A+inyb37BFdX=6nj{x><7r>pW&&(3M31EQE3iM_TD!gBkKe_hO8_@#l ztaz4~I10`M_32zp6kEOmIuhoK0|9Y3L$-;J@>OaBsnX$`p>+q}yQ`#sFr;QIxQjsO zAXwGBGhyGcRR>-=e+ob+GB8PoRo@ceQ_hN4v1H}Xl-3Giyj~itCazi)Tp%xM#N;U@9@FL?!P)NG*4FS8%bQGu@g({nTu4pa7kBy=~R z1X^hdh|UM|^K$J3YLss~eAs;qMSs2J=)1WMpLdPJ_hT(W=?}8`vck!=j*wM@{yt1Y zSMaffNsI-TO9&}$Yc(y`Uvw@)t*0`k@qxFosJQ}Ep#D9L3q$A-xhmP5Q8NE!I+POx0 zBgn4CWY8hK21da8h)|#+?2&PR9J+(;k$|;OgH`p`IQE+*+I3r&Bk1%%8!X@k9i3A4 z_KA1>PEk0p;eG%r^bKU}6nZOAS$y==*=WHxz@$;ci%fQopNlfZ1@hYvW<0u@* z2UZ$nVUrki^_N&(6loN2o)mdftw~hLIxWUMiJbV z2bV)T)2HYJ#)b4970ja7ZvE%z+Hd<`e#4FeE3{~~GTl9w>dFAT1n3-ScP{vo2A%RH z^wArE*$T9PCC_77TTX*zDP_J?Ko=-?gDGhK%ad8p!Z4+z^$%Vz)M{cbrsix>Da*US z%KT0}`}=t@dM7RL_r}3tA#}WU_(AjjmQEpvfRAb~RiR2SSf7ht1!3LAC1k#0MUMZA zXc@k~x5NFJgYsh1Of_2(2=2VJET^!ZHRHx^s?F^Dw{#ol{<0S5do63Cxo;Cr&uWjU4xcPPHENB_KbPiL*n<&oe?pzFdFG@j zv)Le3=Xzzf6kE*7K6IjI#h|%`(-XG%>x+3F8xH;U8AY77rF*At8Pp3V4!F4_DW!hS zPF(U1#uls)h9I`B;jU?`l@||G%uLx9KiBe)yVZ=)mh0^DuzvjgGb25=1uu(;Z|?C9VcPtyqe(9XJO(>2LqB)jNIzQ*zGBT4BaCae;0=|;?qDXG>ARaO~;!q zPNYP)%}7Li%x5iHIqK)Hi?M5{N zK|TGxvCOqUKXv$jqx!{6@1v)~@kvZ^tk>m2KZ4C{YTQYRw{!R0;GXXMA>VDarlr%{ z4Yjd;GQN+^<$m|;Z<$^FqFzEMC?xoNt@ev?iwE+`D-R!3cvAZniwM4tRV|UGzMlbN zuv|xRoNEk>uOZDT4bh7Tj6yz}_=Gi%CPyE4n(xthaD1Nqq7jX7>U-@c3^}Hh4L^Ig zEF)%0&QIMupWoZWHyonFIbHDj=i-{J&Y6xonU~j?FYw*UP7}LzAaCCYzEtEj?tbAi z;-;UvJq_^s7E_^S9t-K{F!>voL0Ax?0nu*o7Z4M0L)BJroV1Zn5}PZ;+j2_tGo7}$@fE|P!`Te*M@v{y_P_YS>y4lwCIsiE-M^$QCjA#4#djx6r zH=1g}6nC9{gy1Qb3*d za112|PFKOEO};PQ9rt>b170_X2dQf(twzXaB=f-(3U)G22+f(^v(zfrJv zT7M_Uj}D?3AOL*?7l6{XqL!0cvpkY+H{Cr8{r}$3rwt>u*6u$M2h1!wIf>?y^R+85 zCllx4U&E)jB8B`=B|qs_=e;Y(dbVy~(V2$(`)+sB3bm0%pp>!`2jN2J%s)LY59RN< zdJ%QnErgNw*zrO8wy&N?R+QwJ6CU24;GZ>WJF+5zci&uMak?_)(9?4HTgoSiql@WZa< zKfBD0de6BD6-ymXT7l&~B`cZ<_xpd}ZL3`Ob}Q`CQaUf-O3!Xjq51XuI$Kto^zoTx zkNT`emItWeWovW(Zc6ICcDBplr*Eh)kxB*~T{gq0!*XIr{cSybXmRze7ikh`2!Dui)`5Z9)VyNoM@ zF8$8;_g{bRaduAoocH_ndOp{D4pngra=m7?A~PuIOD}3C-&V=&%df`|dhfg3vue8U z!N0FP-u?5nCLq>~Kh}}_Wbi0q1>DZ^9ILFd{xNC!bXt|@InUqXiau|;U!BG2lp9e? zdUlk0?)oPfYul&b|I&6%DiB8Bu)fo^e(Q&FG~kofkh)~gu+K?sBYW2I;77Z6_&2Vc z^kM1WR~n;)p%reIt?he$+V?yF*E!F{k}ai-*Ht&I+$m65K^W=q>u;s2VT@U08~)lb${v-+a1#(s0_otNm~6dMK$dZm+=TLYx4SA8*gQVkg1|7(%TdF2FjY zT0Wj0wnx0FPF_ZhODt%vMo>Ai1H~g2Bqy47?KCXALfj*w?a)#-kBOEL=iW`Z@Zb6; z+piAF>_#pxJoB~U{I%Cbb|T+jYb8}t!8Kn87DVOk{-nW$Z53Zec z`ObjXkIR2wA6``f_>82{gx8dI@7hI<3%m<_niKhPWZ0?4n+nE2RtDF7M4;7c`OI1j z51AP8v!)jmue0uuE z53N5kE>1P6CXX2{X2h5a!f(5)bASFfY_#i!Xyspur&|KF-mGw1qo8=LeDELe2LAQ` zBI29@vYV?oQ2PU8nM&?0 zz_@5I>1;Af9Mmi#M8JNrSiaz%8?2hvC!U_siEo7L-YM)p&L^je@G%f_S7{!Vhl52^ z`@$`?fS(l0&j8GuLj(KTrwwAqqD5X%yHk{oc&%+lM!bdP61rTsj4u7$G;Rxe88Oox zEW>LpYnCzmq(N#0Awqz^2TX3nde!Tgu2_E#hQfy&!`eOSF~PAIvygq{ns(%bfciKz zr>DTLUq?bUQ#mrLAhGWl$P86E0JSXh+Nh&9-(Fk(oV?iL{Y%T~j?UqA&UH%}eETjg zK&?V8JtA6?N*E($LgGx8$ZQ1i$`JcW#5P$auU?C!mv|d zpCoid47j#neUSt~>i>j16V#|CDD>mc0$;e@A;{_Y+<_Bwoz^Tm5|CFPQR*CdX7+?( zbzuC9$$A~_8p3CZr&gbZNg88r$FsvV&@o3^U=28kV76Vy574A zpD|T%PrV-pW7hXSt*B6iUWt)46XK2?jkE5Ij1$|{ zi)^bwYnqORy7I2+W*{Q29<-9`=H6DIo)WsBA^}ufuh8+wbexzNQjCZ<)^1y^Q-#E{ zVMR6q^7?ZL0x5E-k;AV>-qx-nDcPp*kOrs9%*{bTk?N zOi{+aR2x@Smb~S*%ht-{TUQOB^Jm{Gv5lZCJ}Qs<(%{{gsQY#x_RP%WDa-QzOUP)- zi(T+|MQ#5qG{^dE<}-5KS%-!!Uf)*Kel~pwGYrw|b@m8rc@Mx7VjK}L{^qXZ>unTk zpD&A!Exdg5v(^06vW9|pizv}6lN1v(%NB3&u3LIAWlP&op?l)RNBdJFoo?T>R<+*j zdI!taul9SEqP{rJTYA8{cn3#&J!ReIzm%0j?~PyO&*ZcD#Pb?dPtKavMA$KR2H77qon${&Ozct0y@1M~d z_B)jQ<&v0Kja2`dS*L`}wD_7cGwT*0mDb_=>#EjN#O~hidVsO+w*T9=mJOPU7{VCr zG1SJcIw&iHZJkwuo>w_rPZrLNJ$$({=@XKa3j@uvxE6p|h4C5_%^I=V-TC-RdS6pL zgsp}w)#J-EGa;U#%~dUm9Y)svoOt}3`)=hrn|u3@DZxod=+%1Go{Jvv8QYmNpCtZV zr@h6w!Kmsu_H5bD4@up-tItHqCt2&z6tpKqO|rJ=kImrr^C9eN)YW5Y+_%az0bF+R zOv<|M#?98d0Ub;?V4Ab$ZkWlAkfVM|&>HS2{fKKtwA}t8Wbl87C5(dRtn)yKXK$&oQpl{akJf*GlAq3BksBYoKc&{K z^e8?eqj!p~GrDXarW`(o7o~Q0;QRnatZUQs4Y#*)&t1to7blt=f#tOnWqd+k?8lW` zV?XRmTvrwBR-WmRl!=P;+BoW)-S0!E#I{X)_f|H^bNi=Ho4iGo423WY!*=7tKDVssjZLCzK8ziO}?4__+}mNUbcq? z>mlD#HK97MK=Exs-?D)d;2;71pQKCNH;A20<8rIv@&Jt5C{l>mVJxqYsgkES$*lRS~dTldX9 z2oZ5Gsafpak6;_4Qad_qlU&4PUHKwBCae7O0`>gMmJDs);wB`p2g6AEniK{D@kj!L zW+AaOxa*cmd!2lT&9(PMws)%^zQ%jP=6)jXZ%a(hLW}xc6q;B68FN~9*pv%^Z1Yo* z2mxaknek&lR1nwl|6WU$C@$q+zlu$=MKE9qcn7t!oyQ^f+6WJkrSF|N-zrp|Qk^xw zcM278wNRLA!=YQ=1Q-rW{x`q_2}~0m|{JUWAR{z%OH}=@pP=#0VxsWG~e%EnWafl)-32O^Pi05Ab!y`hOZR4||gO z0HPQ4fEM!Lq+6rkzc&nH$^qoRcv1%0|nzVJ*Gl$g}zmah|yWZcT0Uq{KdFz!S8JHm@bS-Z!L!fgW4fSmLox^kzsC}wN93&S{?1Kd>R9>TPGqi0paNYRkd>{1#ZeRXzhjNlsCCn%x z*Mr_rdq}l7C>QI38V<`rFJZf{G}JohT=RcuY*FkJ_JT@N*!6|_qM|7PgGSzkri&Xl ziCuvRbG_2vS?rpmOFsl{i%|KZ%fo`18S}Sfj-UI&wUYW0M5CidOs!&i;E@>%VLJn6cUSjz$)TKuDi72p zTi;ncwcU#pI%AsOk~f%b=i4?h748k8R+;N5eo9XR=seaQbWJryiZv^lNy`ZphP4YL zFjkGtUkZM%+kZLL33N@p=piAe3PkRli*EdO2O3Dp3H9tyj(j;|-V5MacFMonIAan@ zz0SiAI~j)!Cbd~LH|-lbTe5eIAVbU9$x5$cko^bJzENp&Ulp_^1K=6&~_(ZP^GF}X)Pu~8>oH!ijtW3huk zv`FEYDxRzXEyf7V(HC#5PP=vJCN)GP&|{cC!%{i7r*KeRC3aebl7s4Sb0L>8v2&7c z&EQ9dT0IGe^~&w>G9=h$q2FqNy&9XoMdYr>Ov!Ec>Q@SAI!t35DoYJOt#)H7>9R9{ z-E#wI?OX%I%MgcfRFh$BfJS7g0p0YWArb9&sBLB$08bw3)ghkTth0*QipPci7*Pso zDnT{ERx7;?p+dF2ZGnjGxBbrNwuAPf^E*Sm>f42lugo}*`A8_5;1_CCUJ{X+X2mql z_CV+BE0i6g(^U*lcv5dSMxgNV9Hcwz+{?x1N#iQlYJ}8>xMqlbQV;uZl$;2dKUC~R zQh6aF*e^Bm-FDCT`7Kp#WR8Mc9V%==&w_29{kn1yW71$KR&liHMrfc$Jh?yARR9uW zbslKNa#R^0DSHwFR97(uUQ!$zoRzPU)}lUarwA*LlWtR0DonnezVv~}$BlhCd0h@?sqw9q&(^M_ zDdk^OOG7q3=})_=I!d0kXZ(-tl*Cs+ecJn6`nF2S%{>cW=g=)yz3;feXU~IR!;tMs ze^$a}@!}qxNhI>~IGq&mCA;ifO!HKvlKLS*D~yhS+y>4;(Dm zm+5J?GMDUOi4_ZSyCJ|s^D~+5R4IflGP50Y6q!MU%lFc_9jDo>O2X}SO=&?>P&~Da zU~8Rn(Q}Wacgh*vYcl>NuzJ5gEhyPm9i6Aa99R ztkisStj?i`(&IYI+Vi5pm9VP%gbJ|HE`7tGTL0{8BxNEgo3P&nDVzatc>cGy)dWG!Ibm2OfWo|HHFw2_PP zd6QqsNe+n}c^VVWxDX6-x~m zyZ1q1w?x8^RJPbNUoiwY+FcU#R8Q6zFvdjG3iRgrEHy0E zd|W%btEHVK5&F)kSFYJt&}TXRM+dqIR&Ja!ar)cJ1b zU_8kW!!Aq;vp%R%+$kAAOT;2Gi3#IjO0;c~58$ey?u5mF<=3iR7Ud?TPj4+PRfC_F z^abb48nA88%H?ZhrLz#))`|-slfD01dUr$R`9pJGeuX@8-%OjF{rB&VDW1`}^q^3? zy+|8nona!EqsZz1$yodiqRCyw0rTo1rFAoQdjDs8Uy{N)H=@IK%n5!b#gW1Q8g7Sx zt^IcwcAW#6RqtSPCrE_3d)V33nGTc(zE!P@=P&6BC5u`K=sZ;t4 zqOLg>0d?ArQ||-bmuJ#2^dLCQ*V}<;pS5d>=L5y0nj@>oUxx{89z{D-9k2%^;l2%K zg|?#z*u)~%-Ro{}ONCjTEqOupvOSFy{;@OnEz>rJ=*D{@TIfW1q zE5c96lHzkE;r@t%9@&iSwL$7#jv$dX>QEa!snc~_cDvDhWkndG^jIS*UELqexr*e{ zJWt$7TVK0BO+XARbtvv>d1W6|Aeyivo*^3piFN|ep`fh9^*HV?pU^ztz1|#oDO8=2 z1yc6Hv}Jvcw%63V{9~h)W*rv%vRJX%W{HZI;=q1t$_tDF^*bR9=b=1r0_z~wY#exI z^V+r3ex5$0a6v})zSvo=XAod|_mLxf*YJSb2)OtAD{9VxBJ4H?Y6#6}^(+f#77I}_ z`~8mBr{uZs3|0wK2P`@ZW_f0tmCT9~IVVWn%?>}4E|5H07MvwwAN)e&MCorux6^)XT_vW*-3(%8XJkzzpBW^x8Y}JkEmY*ihyow$-|T>% zLq_v=0TPT|<|N1852a95ninE-+S=31C9(Q+pB z!Te_q6z>9^>TSd>(zLcRw1BlssQ&C%`asF4tG@YVXeOJ-%F7rLQiPkE|TRRyK0>P%LI+5O{6!f~ z{ACS*b5$j5&O(Og2^H92N#0DB%C5Hi>*DlrT)V9fZ`%UX2ep(8xf6Ana756lNcJpW zV*Aj91ry~Z3n)eSq&%!y|9wJ&%!c6rT1tWG;og2Q9jUcC1JR^XLOsmiP>ZvKK)?Vd z0SEaSiaE%BDC2Y(@T>vyL#AzqZ2owzln^iYQHl_01kz#%|Hpy%$H+*Gz@#fUe;l|u zI^Kr$lu+rN;A1rbp~OE9*q7+QQOgW3AjF~VIfR&lIHAk$lTucS1MVh7E=9Ixh-`A+ zc#vfO5;h!>=DKo{Xf$I z-VQZ8UB}OPzdBfY;=2o_%0PmllYI{6MF!H?Ct{tEyZ0`2P+`>~U>%W+9h8!LZ#Tq- zc?UV-`7mzGV2SAXod9703BryA&dH9tpXq!3hxT<0G6F0ofp)-l55JcCh*bQ#J$5jiuJdYJvSH zKR_Dl-q1w}ik2J*pA8K@2E_3Km~j-J1zq{20dQ|Qc^c3FSiCo2JU`;jxS9xOF?#`i zs)#n*fZGfagQQU!2kT=}N{|No2ju8Q=1DLW2QpSoG7+St6r(M!@!ww$qJ#h*7LbCa z=tt*mmQiqpAZ|6sUEtoUFpJaB>O|jD&i;4pEj|GuRzXez*y6U%k^nG&ofWrBRQ>?^EKrLllp3BqgR)=UXV^aPf z}d1AvzzaLj#B z0-JG+)FKV-4U8i}%x2@H1c3a;U@sr!O6yW{1(+2AVr#p6m84n^k<)iswi>+wKS=a%%`n?v@(y-Swwo>r4>pb@p zrbT`TSWL0r5NWX*3cLydS73HuEi)J(yBcjOK?YhTml*6*0j2?_b6lT)8@ITy=;3sZ@mX8RLX#iR!FVw4$vB>yPqoKD|MV_BKuH~szq=D zh&v{-LT}?c6G>>AhE&Tf5?Lh}`Gd6<^9GzdEa$C6buT8>~J0^E}#Yq`R%(a4-_pjWn8|8cNc1yU2FB%fNF`dX`OoejF0=?jOL}ukK>&5%eDlyIf~ouCQ5EJD3L%AHv*gBI{K~Mhrqot>wizSnU@T8ApANg4{So3lU$iDeh126BRopQp1LmR=vz@J>2dN2PM~8axK%6zQxR zMFUz$nr5_*eVlwiK>4+jXxWa7fvSfA;yHAM>0sCFz#LDK*~?|ri%1C3$ZOGA#p>v+ z0n0xkcCOAQPsaflJB<$DMxfMNl{V;m{zJpO3l4S}GHc-jLY$FbtYBYsfbtEvy(0cI z7C%=WQ{WCP;=U5u3B4%{ao}c{Kmjbj*K$rG-0vdG8~{H8Tc*hP z`dVwLk(mULd=N%+EpL^`s$a0?6ljCWC3|4I7zMRb6G+SdbaIx}1~LhAk{0vWdhrvh za|rGw%>N2L+^geO`V*AK{(2+7#>lFJ2v-E`UQvFt%(`1ZtfbDHkfn5MQBG>f8qAog zlwLPia5Oq@xdXpOXF)kl8ILnQh%<5koy08jIOF6+zfoirgeBE-s&&@kGWH*YmIP{Y}mIkan|X^u;#u5IW(S8KgiWHk(vc1SG`I`H=DEVKZ{ z^&Xa2%V~7rrW%>&5bWS+d8SNAdKWF$P=W(^#kH2@jsLEyVpZ#SS|jTkksK%D7K^OL zQ$eeHu)707Np#?~7_D0Yk^mu07jZ3w{wHQ>Mu2|_U~J^XVDZVcdPMBKPaUYPMvB4l+?!ATI=g(}Dr$STR` zpcYt%8PQ+$`nX!|h91k}2UrBLu5#ce8rj2wJ4&{9NE@~f;yBl0ePo>X2Ao7-0c4l$ z7j=gE5`4hFj>izHxYnf*wpqjG)b8zNlOBh&5=G|YL5v+MpyNO=7okx61oSMBQ!V1L zmQ_UpmgNpL$vV2e9MzZ5Q^AV4GFpMb-f>hp4BIY#`73{g0mH&# zAvnlCl!!Za{qHx(N1N;8;*jRCxl$LXHO*yeNX`W-L$=C*zqqW`qyOTkWuOqo6eFZD z`c)8*OVV7V#is{Ioaz~%oWH6Rz`Fvv`GE2=rv36?&F5898?%W50dO1opEWf{N=|_~ z-5}E9nG=_ErmFc#V=633dTqkSeOCwYjOq)AbFwy8U$+5>r7&)XhC-483qZR+0tyV^ zc*u-Zz>UCB`(SCOKc6r&v2&6@(mD_rmYA+Y^z$`@kgu3z8!+$r$r&q=v}B^SMz=+i zT)FMRwsu|qb0r?&?GedT%a@4m8WPb>a= z8~)d&@eAU>i%O@U#EDibJ?d=9=WRlQ6N#J8-S%&LzK!D@uSsHW_sHht?LwZ(5c$Dv z=nrz%8o2)wCM9h0qL8*3G$-Y>M30cRoW?^=0UYO`L=ToKsr~xxb$6bvLF7Rg?|R$k z|GjYPd-3w}w0|yP`-wFk+W($sVx7$s23}v!O+f|@Tzz`p>G_rc=bj_c({msX1VvtE4dla2y*DQ|5V}#U|#QN>HhA*!1AfTt`C~6 z^q_S)Nzvm2_Fnt)w^NoAVY`=SUpTpX6Zj6iIGN>18M_WfFYe>*5k&VF&HjI;Ce#?{ zdBfwAY@eUM`e{n&BXj03`-Rik4x&;T^Z7q~is1duftR1B5&djF&Z;4&+P<-GeY5@L zvv<=?#^v5c+n-Jw|5r3)r11FD$q9k210SX+`)}o6qPDt!dhz;8O`!hz$*oS`X5Oh8 zzCN;Xx_7DJb0&6C*q%q{rwz*vkN)###6N9_`SR%=b^q>~pIhy|1-_g*yLDuX)4$uW zzjukh48&}GRWq=q-Jp6h+J1uzZvNuLaX!Nz%T&G1R}EyY=vWW(JB&F?uDyn$^eK_z*gK=g+j5}`Mg?wU$+2^pQ7UlRTjDLi#^rc}3+$>wFWm?h52W6jJ9X8m0uhz?%Er3D(-rb z|Eb5P!@`6$((8bS@uez!u+ik%r@)jXL!kmYL_{dMkE%x)D$EZxu5Ay+`Zz~G2U_% zypl_GvjlUYw?Ccx7WgPT9?~j6Sxv&VyO|YamO-0qHd^7V55+t!I0E_gm~etE{IY>0 z9=^$8;rurj^)$Yx+0CS2y%cY^QtDm3P%x=0m*Un9B&0>9psncnLAt&LxLr>Z3SwVx zHtck`7inHHPj)k<%rB-=RT>P4>J`DPK@4r;sA1p!`Mh2?PPTAw7biM*B)Kj+fYM=h z)^72m3fm09@D`WdqS9}yn_~cPS8hdAs zY{i_KZ$mcfU|KYhA3q4-Qf3{CdPG^nUvT;&;rg?$cfQY!%M0vnMw%K_*&Z%Y3%8UJ z*=sJ2Fe{I={7bCf?f%UEkXOstOvX*FtljksU_Mh*Y)x8tqh(S>L-qZDXSIvV2s-n7 z@{k9wj~{&GqM*!DY=rfA$$4&@iLw-rAH!v8~2@0gQm-IP;Ay z#&sp)9z{5>z~DgoR3J#tx9HjM?RD>i&BBPO$K<-+OPQZdqZc<#o**G?Z20>Q_f2}q zhJv%d!Y~s@1g}o*^P-gzdGRBS?U>WZKqPgJ$>z$9`3BKd!4?*?g|WOxmTfzAPE7cx zoh>??lionyh+rMZTtK? zloFwfD%aK_VM-QQ7H`7X<3w0ifzE$#TE4ZbgAeZKf#StJShJ{=_U%Df%h<0<4nY?_ zTi8Yk)+&~ii&>LkrTU?yBvAqptanT4@p=Wj8zD_^il!`pl}Y3NAR*WlAg4Yki9n^+ zga5*WF+DZ7;I6=lB+_=evZm7K5N1n@$Qsw1cl^u9E)fdC2#Vv9I8den%97kgxm#>& z39G|ap8J{lATmuD5UI+jOe1G2}K6WbMZ1Z%U)TQ;vwMypcL zgNB4^+CBv{YR&(~qpUBinK!d92ua-les14>28IR1#}1fH=jMoziNDTJ%DS2kiU zpJH%)-Ob)ZwgqW>vKRw|?1-+(1zHd0H3z#ZuHhjs)ArOE^!OOBvHx4R^Z-NRR0d z%4Tiuq(+&zQ)GVzeUI$M2ZyBPPnF2Xz8aC$L-qMD+nJ1%J_U2Fgy6?f;FjyLehs>U z88K86^^1Zzd!UN@PD)7V%k$T!9L7Q8pV7N;_S(uY~pn5hd$MEuFn}Xsq_A+_Xcl^2&(ymMhYXvW; zKn=_3aayr^@0Z=?u#wl*63V_U#ZDug-8oj0@42CCmt!y7^Xfz8q7;d0a=VdMvK!>Q zN4o-kx`}3D%=oH1^8B@UhbwYq!yfj-#L;_u+&nLPa!iuaxMq-Am^i@Buzn;!OZz>U z3it)<(u4*ne*NNnA*1%$1QLAWaFA;4WkI`9vWWSi8}ArmRUMxAJ%~Ms8E|P1;oIRG|a2f4y;{6s8??^bL&VO z-Dec^xyKku));Zg1^A#hGUobRB}rVBd;fe9GdnhMzH`B@;5Ww775yS|tO~ zUGzhx?tF36q0q%uhD}WgpK4MtmPi~9%rN0iyY>)#G*(;yRA}ipG5bYjJ=#es2 z2J$C_gkKDl>lrmLex?xXs|8W})+md459KT9CF5Ffm4WtS3F8;rEL+IW?AJS(z zb)6pjTu)u0$DnjZAH4_tHePkYgvsj1wLJj6yyBf`EBc@3skGT#yhR3g{aoIG!A^foWZG z0taz+$p8!0jE{0+*534MGK_wla{f|mTjM2;7b8exJ^4%Q3D z8P_EQm4uGs&oBVtwuGLkE^9e1oY1t5g^=G#Df8tOat#jkaPc78twoqHDb7btI0BKp zg`@{82D**4l>q4)MwJ{JXu!@+&U~-_qgC!)PY|$(=p-nm^ z2*I4vGgK&ml$B=rtul>FI%y!R-DhQ|1_=c)8Y6ruAiXd#PHHIcfxzhhhj-RUq`?T7 zqot!9NV$MgAji-vuqWIUVuYlHS6K;w1{W134bW&A7bS$#5++LhoJQJOh%#Xj#s(86 z1)>eW%;LKs-GZ#PSXJ z9u#eA08%CNFEPwJdZMoomj*FfCG?eeDp%%r-1X?f*+&=6K6=8H?Qa!!R=~&?;+F!+ z`%Lt96>d2~zb~0vkhs$7mtj5`9b^S~za<2~D0WkVmCDkhaIfa|Kl<-j5ctk@xn_Ygtwp^$6PB)dW zlK{u%43!Bd)_9tsPx4PB~tZx1+xUH{AptmoTcdnDlq_ zb_wPhnSu5`qx2s69TkNzE(Ug5$8`v;z$kXU75e#onyYzX&K<*oTGNT?=xBqyd~HBm}H4Af)|wM~sXh0<`f9Gd!czAzH| z;Ph+OLWz{+aFTIY2t=@G4-97rx5I5TMBpg%hnD$%%?1>F`$NJw0T82rq9_z2L>*DnR{&Uri7}$3RU@=f79~cHTU^xo?o{gso7mWcM@0bk$?c=rm+)3v zuo_vyM6%tTy)%yd9wFJtDIcXITXn-f zeVCH94c?X~Ua`nwEPQ1g{gxDLea@&efIAF~-=~VUwGyAsdWbIR4IVKjE*19U)JGI0h!;`%sx}&1NReqpyO1t8+{ZejGSHoFt13O zoe|p6?32#~Wd9!OU3I${!m@Pcvu|w;*VIc6fUD$;VT67~PMpgEBZc*ob2gh`3RR-| zu3_91P+kpcZ*>p`Sj?xIu6dFsThm$YvJ?6WGRo`xf@2g;~OVm=bm8U~uDnq8Ws#Y9iN5U2&$ zU7jl}JwUbdQt%UhnKr2=Y*V^E0w8U>(#ytU5=yVBhQ2At4MZ&cE z0Fj}`cj{>$rjVXUs1tk0uLWc$A-Vhbjc+W*N(25MQ@$Ci;p9d9yu7WhD2P{2s{$CW zA<{JyZ6OqXa#`(Z8=Scscj66UiSX(P1HDFoPNb=i)a`!A)nLQbcL1$QL%k~`CJG2H z8jvp}UXU=@eOJaMphnKP4iT0>*vP^vZvpj-fGjj!y$@rp00N3KKH1i~q-6Zj($kMz zU$tHbgJL`x{V_LwOl9nav1^i|hN8hZJsri09w@|{9FA`h2xm7%zwN-yXg8-JRQoMV zVGwmbfN7GK8HXCSOVGzpm#=BEl@K0FXtz^|ZmAe6G9}8!)2B>VtOX(fT2KfcZA+g* zNwn~T^<&Jb*G^skb&7ycBWbv%iwAUC21?JS0kj1)ypIXoJNtCB)_k(&=2rPRa}EB0 zP3Ow^Gv`btDaEuYW6TD+*>`igPL7!eos}HGIOy^F0NQ5(GY%>v7&36M$NbfjFT2Ty;U*moNQa6n*l$Fa%zR1 zkDlV@A=_FJTFm#`*WE~Lb@<`tbsG`#T`BX8P!)x|`0;{~{lneL(eiv4X+TR|r~x;d z=sgnJAuauHIc=R37c8&7_4Alb6{uW8-AtrTU>%(=!*~FM!@#RoCYM+V$TcV%kmau0 zw3~7wOM)NqY`;d@5!Akh_oN4xDIlZ!=&`*s)x#4(c_KEynDv<(azhfDie zZQrg&eL(M9#5}|im%WW%kJ7Y-gk|y`PnZ^7gpH9t@rR#epT>H8pdHns(_F?KfJjGT zDy3kYJnsH`>`>oPN1FW_DgBNdlNIqaSx@hj6QYrDf-LhD^0bEj%nia2-?ck-%?j;# zhPXHGHCW)vz!@m)79g?(_#RV1n11*;>v0CJzwacYqXgeHOuq#aT&4II(D0l0^t}S0 z=D+@htQRq|$+tDMC#Ok+tZZK?X4(qiFACK|3*MH~QN*p629rF5@z7wlhtP(EJIov{ z(Rvk6G7eN}7+Uxe%8o{)x9p_YvqE|SfH~pDJS5p_4qvVV@Rj>9AzFHK%^YeI&YS_Z z2$OTTIF#AmC`{%kTSv|W6GkeB*0$vx0QOteIE8Ifjj_Eg&PR}K#VgI z;&TJzyq566se)aFk2NHv&Whgoo3>s6n?3wD=+LxhKaNFDf1Sj-VFS?mVG>42d?dL) zt$}`3bN?+ua*&iY>%Y6B)S2hlpm{_*LOk%CkcjBB+kkBv`Xhu|FJQdXlYQ)QjvCTe zo-)SgmdV#HZ}gT_ z32Q|I-DU*G#LN3)!tVI3UBanS1f~}66O4zIIxl@V7+LPN=uFbnhp*>Uc_-hiU;6i( zxz$rLhXkev8XPRWxrT?+V>GC@riW`uaA5CZrABehtBnM z*E+-o%$Ri0uW*41bx|6JyQPUS4ODjN!wSdqbyzR?&e^zMi>Y|$Eq%YbgB)cRK?^68 z4?)o`%bF~BBh3~Uv=vjAiS?vYyN-z_Z7jAHcpvN0Te97u%$2)pZ<%w1K58Iyc)r<$ zIX?C8j?w?NSfo`~krvbS7|G{0Zd+4W=+X4U&O}+FV@KZH_g|r>uf`qmURzE)94YEr z+oOy(`Kq)+nV0T9!-#1BGCBm*~mUW!yhZK$Av@2!DE%;i!v@|WX%%NohMKGZz zA+;fqv%Fu@h97Dz+g0RP=PE5txfhv>joRymCpu5(9;M8vlf5nFCb+VS{i0|`$xc;$ zGGbZiN6qd<2X8rBtnS@9Sj0Nn^5)RI4%h|p&p}C!lEE*|yInI3(4LsFhPsMPo6WEj z8d6Q>QQn_p8wqWoqlxMZ)v=)}PTd*;gAW6V zikOZsN&fLCe-0FJGYWhQP{37`wX3!P=A^YinEf%lHO|)AMG7o#c6V8)MWpa2mS|2W zyeVBasC!fFm>6`_?whi9wa)1!?tN1E!o^#YE0=BlnOwE9^74eMYp1&xU=X>>;q5&N zF@bpnnP9i=mD#MlI|)mP`zNk~>Uf)m(U2mE0Ioi~y)^Ae0nbYkSADsP)aG?9J@PHn zd+fHeU2H?2v?A-f?3m43+7uZX+uV0~bx@G2_^OObJ~Cxh0WU_Id}v$IG%>mBdRdbH%BroW9rmqlP|#CGYA15G;G$&a9iQIi zoy~SgasKP?C)_s-;%(E-nr;14-Y_Oi_jKzpyWiARlO7ToLF7OX^QGabj~-FjH`m#Y zROR{T%_#gZMSK%rH$6BFN6(U4zSg4^2!K1bA@wN3S%Rb??0Qh>&6T04&Am+ zPUj*xvJt!P(kKRe_L_{gFxZbc5!Z(wvFJ2My9;org}Z^2?b>B+kh}`cFbhcN$FBR; zJu8R-f~ME)b{~drvbBb@9Fo}ndl1pRMVh;JQTnO@=haj0Zk?BLY~i5~QH6K=xsD&6 z0_4@BZRVAFmb1V}{auft=Z%~2Uh*#duYR34UYMJM8LngJ-#9JUYj2%7&RuG zyQgvPe5lQ=(ts)5VI%|7+Cup!?{BxOUCQ3B_|_`KsT`Xrzen_p@L&3!@#W+>4Jq`I zDfgWapq6~}ow-u2vKkwq{Sy+p;D%t?=VpJUZEmpX@e7(RyFkV-g%7DppAA1E=9m(4XD_dYsV zUu)XM1Hk(EoHp}P3AVJ(??~CFPk}F-?`f4ksH0|U7#ZqElY2%^8Z+D@*B8C8tvA#$ z9mw)6hWTZQk84-N>R4@a{&q#+mPN5=Vg}+8)TGMh%;eR(CgsRzt7F@3N)Ox(Ti~1Z zSb%ryRxm$CUfU{5G1p;#*)^ZllD`({PVKRpX82m%Sq7dI7c zblPjvJ`NE*15zmNClf!1ZtZxF!B}i4-rqkmN}4CUzxQv?i+R`H-AiH|k9?U_Y|si55HR$lA|<^ znaPX8+_W$E9WeCwhk>1QgbIr398ORbaQm->FXr>^KGXR;uW7RKIg*@%D~r8<>-kGj z(?X%@`RJD3d$vu}%BU%9`4w!kp#$~i7N$2SNwI=;jAp8eujfp5s_~znsZp9mTr zos~}b&n5HGoy(#;g{FOtT`pEZ*!WCGO)+7@e_UERem9-bBF0+zClM+hr(4zubNhr_ z3FGMjmz!j2B|HDG-k?^${PjCFRlkjYJ2mil{mBs($B9dc2aaaTGf#gnZ+Y?Iign@NzRO1I?d{&*J9p(#=Jw62um8HX(Qz!| zS?jYqPOYC{|B%56^S^X_;EhyK+Qd~GMvE3~`?UL#^F{Wa??~vMFV+8mA5Nz2$!<_p z2pb?cflSN~LbqRw|)xNhPWKnsY)bm2|jAlBALjUv(?L>-Pt^9^-Mjc6~md z*ZcYU@9o|t9U7ZB;SYX^rWP*zv^;GN>EHQrFE;Yp3;yt`Weq+aYt~(EdC~Z7_dh5m z@z0yGuZ`~TquYPJ-tI$rR8T#pcDD?iyEAR;MeVr#?sn_^Igd^!!IQSuo>fBi2f^Tf z9>ss%dFXWR(KXxZAa@pY9q<+YA$cCHfd^mQWfj%g2g=+aS?*Zb>vgSK!NPvo-QAqK zXb;b+Rd=PgZ->)JQ`g*7TbI?n5RBZ`x21bI+W9zn`0z3f&Lt78))jR*d0klNb$!3^>OU29hu6+c*s%p?KiK>gcoZIkW7pFRSQCZAoo?bH|_U%TSjjlO;hDIL^I;;egz zFVCxP)qWRqgnI4x8q^WcRPt+`Z!phm<&f{0l8zPA9g1e3U8K%ctu4wPkX{a&Bpnge zcX;&q1*CL@&^xnG{?^|*gXsRNf_)N#{WrzMDd`L>^{dGC3$pXuo3}qFrZc;v+aGf`$RjY{{GZ&R&LgQkq4Mtd6#s+sf#u}o zhw8n)st;`Hk(ti4d`I7L*-}*et1)#2&rsGq`*jJr2D39MKXjp4R+>zpn-R}cgXVP=9X*h5&xXtu#jQQ(TUQiTbeF{tFHZML=6&midd`3Ajw1)v zCv?d!?(k4H*%A$I@Ti*|g-S#ySQ7$@K!t=!g`wF1xg5L^(R;n3 z<*9E_!+2n$ytih&Yd9e&wm#%}aM0EH{u@;x^+xxv=JoG0?;7C^{N307G9~0zUg%_L z==&4{PLG6=`WEgJFER*3uSA$HHEuQ1C^J_`p8=MM3ewg8zt3R7 zE=_B|XAAIYgUZz8Q0)W#FPPy?RV!#A;k36Qy34xswmsC@^YBeY_()Z#(VcK+e|SM3 zs3Vqz2ny26^AQl$d=e6h3fCurv_N#G-~lTMx4Q_pwj75*oOY>@un3o!gpH%(*D%nF z6d0mfud zx}qUJa}pb2g~bN1GF;d*bU;27>>GZvVn}~exbA_6WlckYZzJ@-M~H{Q!&$3W9tfQu z1<+CXt~Mayl*Fb7yCYkw3t@7~<%W~M=2Uzz1LeUej7^o1)z~dC8mj=-HxvX`O0RI_ zyP!gMD-`c?%gIp)P+&9oXjaB*+erwV0~6*7J^8@ma@-Dq+$vj&bZxM$AQVHMLCDt$ z3=Y6P3FsVp84;S>zh=*?HG4YO1YTcLYqwg$ijw;I&r3kPY~*V4oOTVJIr+N%5;1|H z9faE^K+eAx8IT_6tclELMHQ}uP{;b$?0dWBS!Q(2f#^$@pItcmuvT+e+8=%S zRdiL!W&OZmtwqv{1e7L#PU^uTS6Bz3bh+T>h5}0~jZHlTjt$bSJq6LJ*tMzH@Mg4C z_7Q!)gf`RcOE*IIU^5hGc8`SI1BjZ}t>@=&tE8aV^7NW~qR5()T|{C_&S_$;Qg0Na z1}-gL|9IK@p^#VmBi7fCM?c%Met5m*->;xG>Vg1RVnH=Z&&l6bgUv3&SXtdbAlA|+ zKw>$LUnJRTRbVLqr~m}AQI=7CxFjIiF2*eTdB^&fWU(X}!Yyw`>co&k4^2!Ozkt@z zsUa>M2$AnvJz~aKpPR7$*X0fWU4Hmq|Ay-x_lG}jSopnRDP1bH!ut*eEdr#?V`#*t zO`)P4*sM*Jg<&;da8luVKAHfOL?TU;0(o#V+B6mUgUX_yd?(0Zm(E|u-{MYSrGz3$ zN@~Fp01^~w_$UBdZb8}%hLVk1K8Ie!mFN!2(nQ!NcBrl2BA`3Hbx$_v>>S&dA8+Bg z9=H;3dv~m=CKTZkcOWbxqSzARbtl1uLHz1UDgG(2DGI*~g^w;q5mL{jBb4z>LHwL1 zqZ#m44>l~1s~XLB2tQ6L0#+3j#7|;lv++pZm)61zniNv--dk?U1+@av2@pPxQQ#FA zZ|!_P^u|A77e+*Xo>^FIvh&;&5&AYPhVZ)*vmpw%R&;nDL&E66W~QR87^iea1xcyc zxIru{S$f4<7CwW0R4#w3l=KE-X%h)cPhn{OlIpJ#-Ad$q1G|cgjZmPUkR+~2`TH2S zRieYAv$9zJxRedy>xp4s}j)QOJv&#NRa{(1lK51SS1xv=I|P+QqSEN*)<@( z0jT}2kjapst@<<+&^{5tf&mhc`ybT+>D8Q}UfqIXPnt$W>#V=OC~IKXh3JW@&DVpc zcCSw!P1wB4eoFazbLj8Qb$6$pt@pZlUt+?}PZ8mRAXHzA!i4b0>j_AQns}iT*eDWV}eb;_vy5n?8d*t>@ zP1FCxewzBxAItkRb?no?kA#;Cb^~$D&WnFOE!P})(e&(F!S+t)ZU5W*`TcZ<%NGeQ zHP(c&Kkpi#k=l60h*)0szJq+xKn>BFKOccWO5lwS|IX^J{p$2a>;r!|erETN?KhiJ z2Tl{^DV-mj0}DJJe)+M#ZDQu*>F{q^+ruI{fBznOSg=EX-xo)7&m$7S;pUGMvKtRB5{i)9;7frbh=X#Tc^bx zsb`zS{od|C{u+6nt;1OP3LDlE&6 zWK06K>in%oB`>7cI8pLl3s(8wO1^8wOwGo7JDpX~OF#Ge8cGA`1!2MfxfLwUxzoi) zK;cT+@)?XjUuFl}QI~wtT=0eJQ}zCy&Phq5<3Em9@7&Y+owh6E-M92hlrPa?Uy6g% zKT&qP`LQ$id`9AqA7rx@3(HhG{MoO-&D~c*gR|%Y$<5awoeFrpmE*G^Qy7K$7x0Gi z9Ym?e{6YLABw!bYCS|5rrrPQ6PeCRXjy|1m2e&+sDB&Ob7%|S9zrOzqq|H3unS|fo zAU7p^r#^&yn+wvC3bUHAZtR$uyV0`$ZD0R#&ieE02K~V9?e~{9h16~jy+VJu#B#m8 z$=4(LelP6SZ(jI2=Pxfyj!0W`4)h9?@2imw{le=88u|kmB$eEnjrOQSFBfC@u+%D0 z!fTMl^xO-~mM;-WjYBYAld{E7BSS0`GUQ=Vg*ne8t`E`6XV7k`Qm!r91C|NJaxVpf zbmyG@UykA+3JOAB*T4zi?}6Va@}I z{lZLsT2WzElnF}#t%*VeSbSbmHdEv<;)U1JDfl-E^oZKnc_RPl<*Nn|S|~t61k(hz zN)lXI6DXWAs>ADqsxbJg*x!xmv@gL7t0?jN(+&}R4i z(WbtW&KnzBi5V6T_POoTnI>jhJ*@IQXt=C4QxV2lcEJphiFS{0w zbYjb_JeYrkUoCpNta8rYNO=gTqCBHELQKwD$M)hiFFbBNY$F=mnMP$!HWPe$Z^msS z^@P8x*QziW-RitPT2wQCJnX}R?!S3=AJ_Z}|Fw&@ZvhOXNq`@_#Nk^Uh7~d`Z-!D% zTN$Oy*H6A431&g7$W+HUkuQFMmtJN^Pk;(NZVw7%4kI29LB^|>-u@IPCb!t7vZ(<> zCG0HswI6O6Z^xC@d?jLiQcOn-qbvT0H}aY{3uV#jQ4~|syr9pifS@RJR&hB#bbe+- zoB4-oRJYNNBA*bwdqV1c*YgSBsZ8u9F?#Ximu;F(3fSzv=D&AbsATR!9wLFBPdXH| z?B&ZeZ1#+%mB}8G<4%){Xa1P$*8I+KL*AWEjBKfOjvKD6`@7AsuKwDiXxlZ0Zf#|D zjQX9vSe@WU6dT_Nz~9yQQ+cp+SgWGb`F52ymPV-_3o&!Ci_<1sedC(59JwlB(M%@l zlj(S=9^Q3MO?%++Ep-(hyq>giKh~7mei)D|Rs|6S{Lv4%s+X(6mVN0k3v&ofxZO_F zRIo)W_S|(mU~{{*@sx61;F@r%uyQbe$){Es*=;zYsazLpwUH>))^C{(EAhn0Hj z4<>u~fYI59Wd59*@Z|Puey(=D0eMs-EXkW5EJm3t79<)W{G#Qa6H-cQywUXrSSv|Y z7TEIu8WUz5#;GUulWGUJU z_H&Q<@x^Ick*O*|uvHv2Vh~(ReZ#ZPD_}&PknW4vXnd$y>KDN+ipVq7 z|I7_ANuc`v`#es%CN~;CWk1tP zxwn7&q?z%gxRYijDoJ6FVY~{osExAtq25l;;&Nn)XR*HMV%)x2TO7lrpK=N zE~oOjg^A;6llw&*{9;AeE%k4-qiTxqI0wq^Ntx01a>?{wz5Yc%2KI}l6C;mQI&Hf! zUZ?tM!MnfZ>9w;dZ8l z-}Pn_ckh}(Jr2j-)o~hoJN=?!E^oDs>)dDQmYLUVLH?#^6*E+ggwff=qeYLax%oR? zMoCV7w|UP~rQX5UwjQqRF#S|f7}VEKH>vb$*_~FpF>;LZtTJ(G)7j#EH#b(jWvC1X z9E!WQj+>de-t+$JbN52l{6UnFA3Xa?xR;Z+ffbR{YqxbaqI!DlwI8E>!|&nqa(I&^ z?Pmu&_RE2Pm=hoOo@h_r?og}a@k$%-+RwG0Eldl3$9q%x!0iY9z<+i$k88KOcT6}a zp4g3KHdz_w2r=iFaS#s07M5DPP7x7(sWRAN%g*>4xD*Avg>vWiN1x`A5F*d+l@ZW6#951nQWW_e>_E5nUA~JT>>=`9M^D? zjYc)Y)J8RCZ3}?2GZ2ugMt3+=voUxogcYQ&({F}B-3NevhkwHX$c3zJGXrAF`Lm>;bQ7d0wA z`=yN;en{%N+VBx_RL3)Csa>qpa;ZJW$KX*C-lew_!%`^nr{?g^cEWrs0<6^=6`&kQ zMM)JfN-uTCs;* zRLp*4(*6ytw>iM!S1Q_x+HQ1(;m4~!3{N}{z*o^8pD%a-q-N*wL zPs-dXd|aDko@5!e1F)WNXOh7;n!>~_0vxrCKip5i5P3{AizzVRq8GT$AmXzugVAnK zdk{;8st`Jx%dpdcN#+1)7Uez&QpW-6yet57#BDfk*&y0h(2wAKYywJu@c6r>aTdvA z7U{_9oI{!cmOwIFvD7kKYCbL@&&!M=#d8W59QXd!P<4^@tdO+8THp3+7oJaRBCWsD{IP+xIm1nt+gqWYth<%2S7sXf> zzu_O==(>VMn}Z00(o`}c#=$@nL`#Bnsc2r`Yfg$v7y;o1&obt*N6pcOOo3s9%%NH3 zHQ46NY(pc_OAi=32pj963DdAK_l+R~SXkWT!>Sx2Rsom}*vm?06bzxMFj@@@o5RpN zNQWWO{&do{cRct}LdXq6+BgJSdAo{yblC#q<~9ypg6jYlwaQ$??N#JRfB+bkB6t-t zxGTUR=1qc>Sl#B%FxR$fa~8>r$gokfluh60%-%?;33BoWOqzTghd=^XYTf~0n%dl^ zz3FxWGq{b_15pLA5khb&Bs%c;x##0?rit-37SVfxNgkk8Qo9#V#_yq1=4BegD);Gj zJ4BMKgfv@`K(LRe0_`#{HR8iet9Cx*<2v1*O9hF7iKT%um!2W)ki^B@$5E%vU4iP; z4sc2GS>QFG?ec`$^Uz|*XKA31D?%a8BL)n>QTw>R6l#}KE$k<<(l_tQeK%Ms!Ve2f ztJ}O_sd<%<)`T&yX=BaHXq7NY;BDK~X4NCLQ?waW3rG#1RgX7PY-H9T&o*9VTjOn6 zCB(BOmSoiGwV)-VO|Mx%8Vs{(LfOuPx?I(^U~k*zHcMZWzOO_(;xDW0HUleRR@c9~ z8k0&|CQCefx?7Q&5efl5+A$7IC?P)xe_+Lcmk6nCI9dPO2Mqz(Ip3gE!MF$}4uw;A z)<-v;w)xee0c?WPlkZQQwT^`Ft*U1W70dD2*?(R9 z?Nd^29RzjTEj{s8;8)V{zT^AqqnadN>2?C2)w(J;)K%h(fc zQ`(3>vwrP~O>0+kg;YV|ne@)?`mjcpo~ggh>Y*(`_4#K8p4BEJpQcO5mE2s5t@;ED z5o_(Lye>ZZ{K%z7tSY(>b0IpvD*2&y!xW`7`KD@0NUpl-_(I#G?mgkdr5kcc_#rqV zxiQqJI@(s@pM2#H`a-1b~Yvhzi^K0pF4i zqp+gdggZ7hXN^Y^J_jnp|&;>9~QZI1NdbJwI%?C84P9(OsjiUsKJft=IodtyTb7 zUvik>vSiWaMpR1c>$=CLAG`0`sw`4^?Jqyko`$b%dr({VKGon>%jKTg`nIlZVND;J z+CJR8kkX2iXfF0m8s@rr4F_2=wcjAuVnSWuA|McIK z?cHa$HTF-xiQf9~*S3En*ESxWp2mfQOgGb@!D*$;074uTqy5#cP%r>bK9YqX0@o^42sM z72}Y%Da~*A5i-r)FGZ}`d?NIPbucYxDB_5Xeo!_{B756TdRym7bi^k%s8!#X|E3D$7Ce?A&$@tM&CGhp{mL6+g>%5oq+loNJ9h1x!p8ohcac63ZVR zT{1Ea5y!8%Z2ml%KKoh?(DO=(4YLcs1nq;{J-drPt_UWmRhBW6EaVa1P+?MvvM%=Z z6H|?cFWL}L+M?%Vh1#X4eE~_z>G|&H4P7G46zC^-+cbOI_IaDn%>0;5-*y_Dof5RC zLjm`tHuDHi3z-{c+BBfpT!~JK9o+Vr+@P|Yms!6Q(qje)^BJ~qo5}RwT1kLUNfUdf zL6axVZ;{$ov>oIMukD1H!*BKLA8oMlL8wi87^Fm~%%iMq32i!af~2G1?%FnvuL}PR zX3t%;Y6cPAPBXKnP?~AoEKI29*6g(TJtVWNKNk6q%55ISx(8`8kJweVneeT3=0HK+ zPMQ^n>la!yOKqZ1`hnZ-ega6kn$MZmPw+dQz&44 z!+Juho)XC3yb3hpbaLladc#<5xsPXdJ3_|GBL(d2c8?(rLb7+WU>w6|X_Ej|0k6zi z(K|YeMY^<3%a$o*ZWyu04LQ2G%ga|ql0y!@?b^YVBCZ6_1`*ob717WM-r7_lo9p9V zFLR%lz2bqNpE^;*mb3_n71i#Q((dB%j+zM>51w+ampOX0=_UYPu|6K$F}oO8BMRh= zqs`8?bMxvKV-ep6|!t>5aoQew%Z%kLP@w zVJkomgiVXkZkaxAWFM0RzI_#%|1!?AvfZq@dcn;desCHHIgjK(1mL8^Lypp&+=-X} z*L-~UNyyt}Q07sDwuk{plc3Y!ZTBP}>z*cq1MQd3_}DZ_yru*Tu`p^b7db(*NNRVj zX-6_+BtuB=8v_2d^NW0}^YpU00!EULClhTjo%`7sHjrsxswGSKd9D#M%c^@?P2O9x z+L!jBbW_WT*^pi^+KcIfyeWf$aqcxTH@*oeMqm+vzH<=mP$O>ALh**sX0O|b0Qh9h zMo&8#!-|5s=7^1f=9z$1IoSZAIam$508nAVRjBO5M zUdE8-wrc}vxN?C-h0lTugmx=J(S0Q!jRf}DKAL>DkSEuim#DN81mt1jsUWnO+LI{o z-sYVC&1-N-N>u34MJzT zIk$@2ztFw}?OSs>PQK=V<*u*2syC6nLXz!`p&T@xa`cErcyMNFgThbSBG|McE%M3> z*Ui$(9z@+a)tokH7jlnkrn@5bb#j_&)@=CJ&QD#h&e9h3dYunC;k@$~Jvrjis!NgA zb9J{yUS4-A>-#U=l&Gs4?;U$(Gk%78ee3f^)+LqywVnIROHc0F+V_uR34hc5A4$a} zl$1)zSIor$7Mr(F9_;qyqoGaYzJ_W3D6f#p;7-i1diy@?7%I1RG*{Zye_~OOe4B&XCRG0AYfF7A+~Q)2&2x|53#;3?;;7wn2g@Ti!P}7(k099i!oI&| zJ~ldZM7f07dY*E>aRK-%acuPErLSZ8y73Qdo3H-kdx_*x#oy#scwFYn1}B&sM8vnH zv`0ypgD#%83Ql>77;Ti5g0y$XmZn3T{ac!~%?s9y$891Q)CQUzuy?#Qq3>{vYbv+5 z_}M`hb`^PJjc`BZG|@OQpJW$2{I}Q6?XK+-{}!RY4*yT;8!Q8N6?-dkV1Fu(A8XKg zFs${&yF*J8vloPDue0srW$aM++#%PAz)hz%jaUKnotalvTH8C)&?Wm48HB3by_|Ez zcahvxZv09<``FHSVSIUd{jGBt@2<29CA^A50aUAo8FoR;4dv!ayBl1!ZYnaRz0@XC zfD}SZ^vEi9p5D?9a?8O0dIuftUFfxim?^TXGMepkui-hTx`?>A{k> z)M}>HM*o+`hBXhP&IDpkB@DozR#MZwh=1J^1sm@R9WPxt9r|=qTrPYK%k*+*q^20T z*V+X+BZaI|5zGmre;>;*y(PuQjtI>oa_#QLzn}z4E*Pi$VV?y8o0h*VNm?!99Ldbh zi7!hUzU8yu$}QW>Ev&}L6n!S-D(6Uc?oV%A^xg3M;^i$$+?r)b1xsoC*#7FG{r(1+ z!^!`zmsa<=F~4-^Zm9aw#oEW5?P*`RwXk=W$hL?*68)jbj3+>yOip354`%G$@+RK^ zRRlT1!4OojZRI`m5!ViA49m+#B1t(N+TBMic!1BPiVC+j0unm+Kb78ktMdRrxaEJs z*Zh`@z)4S?I_{JlsH#k}Pwqb9kv9l1c1$qD*iE${IUi@=tVTzxbL2A4x1xm$Rq626 z^P2Hukk|MH115pS{~&~Btv1=ELXCzA-DW5OF||6La)j@zSD}`fQ_mU634X?k2CP;B zto4Ly!vFLLM=FvUe5eTsE(^ySRKp;0{7udSwS0;&C<+(t>Nt*O1WK6K1Yuf(9I~5$ zgSWDR!Ih&2LJ8hl0hXF;c75-dSa4pNBoZN#Q>jh!_cjm8xP93~aLrsmv%HOqXp zhq-0(Vg(YB=(cZ04ABL0ykUj9;L#P>F1z;##dmIEBSRuV*0aW^t-R?oQ0bpbX#G9I zQe3(6fFl_u#n!jciX^3;FCnmr+ihkqD9RX)2dG@XtSd7pVLA-#hVizIgP41F^ln@| z`Y~n8x^*wy%F^9?R78HNl$NwT!+WwSW#z*I5j=0k(*`*s5tft61qKg+K0@G3@s7ZA z%LRugU2FsK;=p{%LxC#|yEmsW=3842F3h8`>HCQgZ9 z&~$-$j4LFc3_su#j4a8;g^S1y#Th(V{q`4a=}cMvd{+8ZhSMToyNb~bdfnr3z$%_HQ^jt4BeQZuSv0$zmhHd#p}*?sXOkkktcYz@6z0k3Fc-L<}pt0`FFS-kb?tu`lqob1HEh2p5mWJuXH{i&}s*a^S;aa)O zH(E>7z|A|qiJO`2kAutGZ#`Zwa;Skpq`lf@a0Z|T&O0=Uz4fIILUffk>q557#Nuih zG7pZ^AOK4m;v__B9L9`*<69g;35t9eNzis4;~Q>0V**pnD72nc7YcfO^n78IW|CT> zTR&!mXs%T8j7-3nK0YOGBZhv_T$3u%`Ai5f(GwJ*53Ig0Q+F18$AH5v4%wYIx zsZ(W*!L31*b46Fv`&Y+}@6Vwzkw9@;%~^~QAG_e0AVIqzTVc{{p;@Uf?sbxx-hqZr zp8_r>Hn?49ks5SRhZo~2B>GQ!d@T-NCA&awLr!AYM(x0R_FC`fy)}PkPyCzrZbN>$ zYmd7HH;rHqNQg%>G-y19gvV_+{@xt0QC(=-cTU*=%XfOLhE_4wIMtkB_W6e;3%5H5K`wLy>W?AEgNGoYMrb=A67Ee5VA98 z0B90xm5lT*y%-z%1-Qr&!bS^OQA!L$tUadEV+eJ0KxTuGY%b8K7Mi>sH7<})DgkUD z$jp^!$4Z#PN}8!!_s4>Y$sfHpG)gT}6B#P4d3M(Ls8&G$D|ZYv4NnZPNqU=*qCZ+R zOw3{vM1bb&&&DmBwn{cB2EdK8S&j(~&X8WON|zwfpOP5;Qj^@e0UH%F5!u{T0MoG1 zX(28_K}b~qfeP)XAh<}ZJ&8p71nSIDqCKqDrPQOB8hle3)PL;yC1^`hTdW*qij^3M zO_)qYqd?;VkaQAQ&G*AqK*;vx{ku4W=~3g8D(VF`>YKo*nnUF)nPWn|P=K7RV)!e_ z!G(lK1v*9YSpnmV5uH9eCVg>q3zgv<1zFh}u2+z|M)j|VF>JQph(x?Pf;>`LF`J3(S^~< z%s7(gcB~DocQEc%76K?LjEd42h$NUIFenZG!L8Rah3FNjh0&v%6U9^@jPXdNJuESd z7oZW`4_2V6RR*7sv3vyuC!_{8GP(d#;KDh>L|-Gs>~sUPA4&8WN*YdO)W#`03^S%A zjN?j5v4UU|XLwAgGqU}e9)wB$WIUl{`Nq9+yNKe6seSE42q2u+ayz%m?cx!)x>dGT z?=asWgDH;j=}~e`@PALo76-zJIQm^4XDl8y`DOe2tOi$*uh#?W8Y=)kXe?G@KP_3P z65^^LTm;+3P;Jts(%B9zZvCLIAwXJCjBy;ypHbsVDeI3CfpQJ%L83_PTsx}i%{A~< z=~<{=hYsRJY@9&JOywZ`juDm8^2muun-7 zgB7hbGY4U9j3@eNh zgsQm!>W_PRFsDuW|I7>F$a1|n$om3lG{`PZqq6Q6KBG_k~VWW!fsWhAnLwk<0 z1fX_s9P99?c83DD_bM6%lhxpxE9}*4b~2moIPXEd!x1_oD&0hg_Ih-OR zWPVaaT>Cp+Bshsu;}5HhC`!z<+OP?^F3y;u!qgw7Q-$=WLW2(bAqrr*Ai!lmB2|vE z#zEt*Q6_Q_kbapN6-W2ZWM(O?GuXINl_Bq}%^fjoY_#@DZJr{?FgQ-vQ;9q&XneIp z1gIAqr_<7~c(oY&4KS<+DJK<bTA20qALkA>sv}gk3K`-nl_P zYvY&(CC){QT9uYy}Py@@D%8&Iobm|Sd3ASE&wgmCWtv*$}t*L zV;uzsjUa`m=zI-;iEKtIN9Te96{Tp-0!jZ55yRRe9Bmx{jX;T9HmQ8l6b*qB#T&fU z09%0E$&8q?IS~i2Q77$CV)J19N&%JuX$`L~8B*z<7ITZwYF5Amih}%L(Ca-F=M96T zaN`vc0)HVM)260814xj7tH;J*1Q^o6)4@nSL2THyf2W3k(kf)w0fb`!;n5DAF3>ox z93eR|uLY^wAapOOELebOwN!fqv<8_gK!denIy{QZVr7TG7-tA+rZX4-NK!E#L5F*l zlu$8IZ8o%$jV0VW*Xjbk7_au7N*59=XQp!Vq@X~q?L|B zhr)j_@bG}niD>Mr+uVJB#xYxDvv(TjYIUf1? z=^WLnx;9V=GDg^-T{enaq7%Oz`G`6rpk5I~jB&O(B`{+MGzOHq#bOj40IBTKY?aZx zVC8+GPAWVbJPI;eR&0WZ=IWC3D$OFc*J)QEifvQ_QceQ~6{C&W0HfIDS>iO1dN$=8 zq}db4SiuIUNsLG_b;Z|;{zJxYqo{QDskN{^Ih!O_pee{QN31ihqWiP8AAvf?3JhH> z-J`(Y9c6UEb^qyed2D&WoNfg&U@v5O3jqqO^;EKHkr-W|Y4lPNv048rZQWJIP>h2WMiUF$H!fE{RB(c03u!mv^os6Bv3`uzl550#WWg~kk|IW5+C6j#@j_SbzTVL(9&R^uyGMhqpo zT;YM;s{2SqFBY@5N;H4I)H1DHcVt`t83?2cjV<&MDyaVzb6_zCpbMD=qZScyEME{` z3q0n;vAzXyJvpr5<+y<=T$WnnF5+Orlw;bIv+PHf%W!-pD{~Yx2xy&V>5K>s+ROH>C>#e*mm9C9oIP%bXyYy5TIM&CCUuvr0o?A@0c9O$1Y5A{a!? zE;5`_ti3H{B&hMe=ByKt)(zFZOF-X;<3nczm}v#G3Z#g{Wml{y7vetgYOOTbL}?t0 zWII#(DoexaS>YxG25OF$SgqL-rznB3Er4bz zgug2>{KQ7rvklMYktW@7De&6%I8ELIr4xMj)u{dj!SHRRVa55&hA%$+V?5m+`*T>@ z*zVLUhtac3SkX%DZxecdREN={bU04E0;EKXjURAy{gup`xMg+q8V&!$Gy;Syz=pgV zoj%IU1hrQpnll@1q0(Q;(RF^SU#TEenKISL{_Ql!pgf2r;viVM`lN~`2aSW3|JX>F zy&T;LmF@}&Df5NiBc=qb=vffc#5vizm&<${Bqs?iDlZb+Ug6(%(uuf;p%v{ zHrk*$GI0H^wO=YK>XK%}KYJXO@32_)MD4Ir=R7)Y=nfJyRklkOr$M39J!vW}-j2$N z;anuFsT=cVYK+^(Y~6oDN8e*@c+Vg~!(Z^y=a`8@Io6ijdMF|Xi z>^}584t8xQ)%K%O5==EMEP02d8s#z9KDyqRKiN(#Z#@#~HanORtjC!I%iO>6GjNmu zZa8fIyvY!Iz$Q~6G#gPw1+)Aj%Kf>EjM_sj-TE5R?=NXj$C33X!T#39W)(=QD1SU~ zcdo*0Ieu@R4`tc6$@?qx%mg!N`+eukdTCDOjt%aws~>ggwsp-8cu>MpJGA$lELS++ z6e-)ij6L>JJP&7ROEu3#IPF-H3c+%mtmZ?Rd2a38{TUEt#uE>*eFu)zz^f6_Cs7S#&kK$3B6_R3k!H*f6Q5M^EKzfTa z0+xz|`KIhX?cgaKuPly0DFw9pE4%qshYkb?RA@tfc;_sH_56Jfe^I#044?Ddk)C`dRTn*a3f{yXz zx2>ICE~(%C(ZnrV6<)a9?e6QPe=}!>{C4C>HyJClt;Ds#84cxZ#q~?5op!N*O{SrYXY1J;lm*}!zbxei5D1NN?`{NOfSRgF!HM>cFasBc= z<*#y)iH>&P_x4*-QIv>pt@=GRt|t~AFD2OtF0{Q;1?G%IEHWSZ`^w_BoPnuu%xCEG z=W58q)#hQ_pOrX&ahq*G@R-hDa~)QpSBuxV-q*|M#UcSM4gY5s$5hQ>e;KmKVg*Wf zFlrCAN=Wj?%9*0C^+;t4t#TDwU!I)FEpRyCU--i7fPKW$8ZhGmc^&q#K-GTjDpCht zwa8AjihDuD%jdeG>flvgpS~PFo*G(ItG>qzanh_|V(d2G!kzcq^1}PAHDeOSu6_M= zGHK+E=x7cx{EA9@p!AVl*qVFc#;D_+rJH$XhJ(W9S&Eoxxnduh3_?%y2zw#4tpPOwD|?LTkaPAt1va&z*2FaKfUr|X+n z!zl?!@Kj*|EgZg9LW#Pjh@gnvet2Pjg?;O4QCwX=a%JN})s!G>_ZFX{KW+sXef~zteCaoBxxSluH4*R8 z)j6;$%pvwOd%^w1$J)8OFV=s~+PC}lz1X?iVaBt2ezcA)HJNMK5j%2xSBjtT%&+eM ztlz`mY480^a_^hH{vu!U-}Isl;dO78eck=eePWZzyy|h$=ccebW4C_q9=qxJzoG}X zzFiFaJ+*G(*O8H*hfe&-xRzn?*;nhw!-K8g%(Qynd(ZqjdEVIS<&NH|zJHhAyhTZ9 z^|~Xv60qmngV^1@f8G7q@hne<-g z{FRFZr*Ln*ta-PvKO^)_?bL(PA+2PTSe|&+KlG4F@pnkaGxfG z3}Vi$+~(WOv}iy@LD&_}R>1-L_IrD7Y(^bPOy+S5`oar>t@5+73$rT=bDInEh70%3 z6+%(g5m9-O%?WPhnP6Bn(^~R@ z1bEQdi~duS_X#jN8AbKO#aHHv8yF>x{E{ZC{J+kobw3S2rdr>YlQxR{H3HDsaB{5x zClYxWH#j~?CBSVMN+=^!kI#4xLgZOo+`ECl(K|$_E zI6slc_2IHlb7eD(gR}gD--ZkSa$NbNW2O300N-t6l=Esd7s8K=wSI`S=BULngW!%-O~3b~u1XYwo%wFj z3NWDTguyU?^gqC@AQjt#0?(uxyn{&_;kCN(|8aEhaV_@$AHc6`=X2}4YOAHwI-=xd{*8X zDdNp5%4xCRpcKotqQ)|@@2NzU8JiyFA+OO=qbz;%| z^>ws;b?#T|=(AUMe6=%*!G%_>6Bn@oR(^#l8;t7>Y2$6$qQ3Zpuh$=p2DYEoADpJk z-yeyHy>LTVRumHe_4rq2jH4MbP6uA$+8wh1 zYzyI})h-gk?h>M@Y{HPxWrAgHZ;$pRjkH{cE_xbZK7Znu)0v=a=R=;I51TXLwVti! zf=evq+fsxt75A^0aCQPh3fg^O!l);BT1tMUvHJ$tby4vF`mt*P@`#=S+mb9H*2JcK z(%5mY5!0=9N|k%3Fx20?=8ObGr%WAC;Y2wC?=VU+0VWU*2%- z@`jB#+r6*o3IG?W*}fCP(2r+NH{%Xl?bbR#An5bo?Q@zU5J1s<^6qyhU&qx3U>E%s{ zEp2mJZeFXSSOe0{i$nfGhUun7F}bZZEl$@^b6)|sJ;ZdFzUPXc4*(o9YQk#(3rw*N z+li<_RBJ$*CD0Q9tx9B?F7PgP5AziHo0w9kM~Ah88i)id(asxMP&ss77q$s| z+s4(lDI?pVLSrPo{V#d@7gn{Ez|ESOI!wExh?$l3B{tzrAZ z_NNkcjimkHqPbTFJfnrk=UqSm6&(^1l-$UgnAx^ql$8^*W}oQh!VV)p$COxLs%mVn zrr%U&-rU)EyQbE}>%BcQq<;_*c@My2d+`LkvX~H!ppt zJk_Jvmo$;lyE?8n&n8A-wE&qLGqi9n!Hk$-`KSKD9Xrx=Q|T6)2-h(^$F#k-=+HlwJf7tZkPk}im)JUBBFoA3yZdvWL zyghDGXY}3Gk#q0k@7}*#U_O&HDgN$5#ObbYIp)OY_XUiHL$zH|j5gPg?K8HUDZjfv zN-}-9IJ*bu7Cv5Qio5F)ifR`WB|eY!Vw0^>QWdu#E*f{1OX(BC^Z!xZ2_GKMg=LGe zJ<#(m<@39$%{_BY_f$OZsr=oeVLYig&{IZ!v^%sMhSShu;-Cg=XGS<5o$6!;OeZJm z*MMZe1bsm6-21@}n%!2D5k7GVbnDj(Hwzq9kPwU)X(}CVQ z*LyoY_S_oVvxo8gbPY0si)&(&Kk7(-14Idc3T9(##YA!;R;XJLtiher)SQ&!W?5Sb z^!Tex;$IUp!{do0%LMfJo^iee&AD{vS}--H_jnJ)$={}~W^zMeO>FMCUA$t3_S zCG?uHc0xor8=1kzt+oKZX2Mq~E?A6&k@fWu$}^IweFyCD zxv0=a{zf2RCRa(n|hwJ@J4B+n9#lQ-Ubq60dRLn)SgWk%PP! zfjcgO<6hjT@q7}n`Q1O0C)w_MeteMpk#ytTqd&^*ABYeu;SF`jpN*IyC0K-%z)HJg zV#F3R<(L%}smHuz69;9evu3hINWK7J2vu8H+^6Bzz@Mj)%E{OX;+e~%EZ3LM={jhg z6n2mB(n_&e=WY7vFlFjs0jL2&9O$Y>M>E)N3R7 zN08kaDtCWB^6sh4ZSw|EDM-^6>)+%r$%icWe}Chr3}+^PN#D8|)|vYuoF5m}z8C)% z!s9fy zOE|>qljF_pSHl7E*EP# zN1%iL*^RruE>8K+!05U7`Ed%lPqqBdI~#mmOLK}XI5xo_2JzuTA2B#V69Is^1}?=< z%FcB#rUT%%t`dg@c{l&wN)DlJbMVEH-5I!QN#TH+y3=psROOdk_luJkS4uKv={8Dq zfvSxD>DWE7ZsP55gC!!!@j+B?;66ps}F}T^M(euxxZ4}mSw%|WxQ7))VEJB;LYzY z+rN77G z<<5oJmy>Jb)?41UKa8~v7Z+MBoyY@IE+%dq{C4_3yAUpj_0@5acByP0+Lc5-$BbSr zjJRo|djuRTu04S)^AB6Vzfj8=HD4QGJ+J@-cNT)EoI#aWtiGQXH+RkBg_q|R`83_(jUV46BL=C_WA4*3vI2Ja@8ggnlGaEy zzBv2fK&&Ii`>p5Z6$Y^Ua$^B;s-3I{d{y!7fUIfV*NC^&G5a#S(NmM>9j^{7)EegQ znXigpw0H5bD~tB8JVuy* zNYI9vwEh=<(PpkRsFpfjK}aob_u!S84u2uAe#Mn-9gWVF1~rVl#W|yFi`CvbwYyC^KAM4pE*ynH;*&z2;N1 zQ=n6Io%>U>DtW*_@M~tGZ|iQlPQX>pt@TE;g`TlBrRcXOfDJ*<48zTFsbgF^)#Fn0 z99;9|)Run68*Uoh9jYSw9(LYVEC{)|iWu1fU^I^7eBruEZxpXMg^5lY(xGi3uqk;- zS{nR@T2WLzhKQ{#jU3gK!J$U-v|?mn&w&*wH>Gc|+>#M-O&iZd(|3_Eu_u zDvy*vL!_bh$dGM%+I{t1lE_M^OUv{L%HWZ>b?LD)nE0ncjKd<0Y6aa$#-hgggqhJx zPzuV-j9wg_2~O3$vQHE9(E~bD`qYV`>mUT#MS6ZgPGru$UK~LWkQZx#C0{kEfv06k zS4o}6snK!4^RFN;%f@V&)}s!Kxtdi8w=;Rg{DsdJm#<2)hY{WtUxb{hv2?kc^^ zPNXYalnzdb()cHR)o0*qK+mfdzEd98krT~zeF2*W8ZIf1mPhaqrACXE+7+iB#%-$& z_^1=dTrx3n@x`sK%~rQ(k~TC0F0bF&DJS>vJP(eHqhxNAXFsx{qs-i=aPo~c@@~EB zX^#waqNvs7k*;(s(Qy?>NhpAWzBB`&u!=Ij10

    m)Pgu>A3i$XeI|;lJLiJ_29`P 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

    U$`@Mh1xBJa&0m)Mi_xDtxRw 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⪼*HGn~yCvh49{`;;3tiY&kk7LkL{V-Uspeuq{q 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

    VuyV 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

    #{{job.issue.number}} {{job.issue.title}}

    {{ job.progress.join('\\n') }}

    {{ job.error }}

    +

    + recommendation: + {{job.recommendation.engine}} + no automatic pick + -- {{job.recommendation.reason}} +

    @@ -113,6 +120,10 @@ export default {
    • {{f}}
    +
    + {{c.engine}} log +
    {{c.log}}
    +
    {{f.path}}
    {{l.text}}\\n
    diff --git a/tests/test_dual_solve.py b/tests/test_dual_solve.py index 12d7584d..0f0979fe 100644 --- a/tests/test_dual_solve.py +++ b/tests/test_dual_solve.py @@ -5,6 +5,7 @@ """ from __future__ import annotations +import json from pathlib import Path import pytest @@ -56,6 +57,32 @@ def test_changed_files_extracts_paths_from_git_diff(): assert ds.changed_files(diff) == ["README.md", "src/new.py"] +def test_recommendation_prefers_smaller_successful_diff(): + claude = ds.Candidate( + "claude", "b-claude", Path("/w/claude"), + diff="diff --git a/a.txt b/a.txt\n+one\n", ok=True, + ) + codex = ds.Candidate( + "codex", "b-codex", Path("/w/codex"), + diff="diff --git a/a.txt b/a.txt\n+one\n+two\n", ok=True, + ) + + rec = ds.recommendation([codex, claude]) + + assert rec["engine"] == "claude" + assert "smaller scoped diff" in (rec["reason"] or "") + + +def test_recommendation_avoids_tiebreaking_equal_scope(): + claude = ds.Candidate("claude", "b1", Path("/a"), diff="d", ok=True) + codex = ds.Candidate("codex", "b2", Path("/b"), diff="x", ok=True) + + rec = ds.recommendation([claude, codex]) + + assert rec["engine"] is None + assert "equally scoped" in (rec["reason"] or "") + + def test_require_engines_raises_when_missing(monkeypatch): monkeypatch.setattr(ds.shutil, "which", lambda b: None) with pytest.raises(RuntimeError, match="not on PATH"): @@ -140,6 +167,7 @@ def test_run_candidate_success_commits_and_captures_sha(tmp_path): assert cand.engine == "claude" assert cand.branch == "vouch-dual/3-fix-bug-claude" assert cand.diff == "patch text" and cand.sha == "abc123" + assert cand.log == "done" assert any(c[:5] == ["git", "-C", str(root), "worktree", "add"] for c in fr.calls) assert any(c[:4] == ["git", "-C", str(wt), "commit"] for c in fr.calls) assert any(c and c[0] == "claude" for c in fr.calls) @@ -390,8 +418,16 @@ def test_cli_dual_solve_json_is_noninteractive(monkeypatch, tmp_path): from vouch.cli import cli issue = ds.Issue("t", "b", number=1) - cands = [ds.Candidate("claude", "b1", tmp_path / "a", diff="DA", ok=True), - ds.Candidate("codex", "b2", tmp_path / "b", diff="DB", ok=True)] + cands = [ + ds.Candidate( + "claude", "b1", tmp_path / "a", + diff="diff --git a/a b/a\n+1\n", log="claude log", ok=True, + ), + ds.Candidate( + "codex", "b2", tmp_path / "b", + diff="diff --git a/b b/b\n+1\n+2\n", log="codex log", ok=True, + ), + ] monkeypatch.setattr("vouch.dual_solve._require_engines", lambda: None) monkeypatch.setattr("vouch.dual_solve.repo_root", lambda r, c: tmp_path) monkeypatch.setattr("vouch.dual_solve.prepare", @@ -403,7 +439,10 @@ def test_cli_dual_solve_json_is_noninteractive(monkeypatch, tmp_path): r = CliRunner().invoke(cli, ["dual-solve", "o/n#1", "--json"]) assert r.exit_code == 0, r.output - assert '"engine"' in r.output and "DA" in r.output and "DB" in r.output + body = json.loads(r.output) + assert body["recommendation"]["engine"] == "claude" + assert body["candidates"][0]["log"] == "claude log" + assert body["candidates"][1]["log"] == "codex log" # --json must not prompt and must not finalize/record. assert finalize_called["n"] == 0 diff --git a/tests/test_web_dual_solve.py b/tests/test_web_dual_solve.py index 00a4bcd5..4ea528df 100644 --- a/tests/test_web_dual_solve.py +++ b/tests/test_web_dual_solve.py @@ -80,9 +80,11 @@ def __init__(self, *, repo_root, runner, image): def _fake_prepare(monkeypatch, *, calls): issue = ds.Issue("Fix bug", "body", number=4, url="u") cA = ds.Candidate("claude", "vouch-dual/4-fix-bug-claude", Path("/w/claude"), - diff="diff --git a/x b/x\n+1\n", sha="s1", ok=True) + diff="diff --git a/x b/x\n+1\n", sha="s1", + log="claude fixed it", ok=True) cX = ds.Candidate("codex", "vouch-dual/4-fix-bug-codex", Path("/w/codex"), - diff="diff --git a/y b/y\n+2\n", sha="s2", ok=True) + diff="diff --git a/y b/y\n+2\n+3\n", sha="s2", + log="codex fixed it too", ok=True) def fake(store, issue_ref, root, runner, *, claude_effort="high", codex_effort="high", autonomy="edit", dry_run=False, @@ -117,6 +119,9 @@ def test_run_starts_job_and_reaches_ready(git_kb, monkeypatch): assert [x["engine"] for x in state["candidates"]] == ["claude", "codex"] assert state["candidates"][0]["changed_files"] == ["x"] assert state["candidates"][1]["changed_files"] == ["y"] + assert state["candidates"][0]["log"] == "claude fixed it" + assert state["candidates"][1]["log"] == "codex fixed it too" + assert state["recommendation"]["engine"] == "claude" # autonomy is forced to edit regardless of input assert calls[0]["autonomy"] == "edit" @@ -200,6 +205,7 @@ def test_choose_winner_finalizes_and_returns_ids(git_kb, monkeypatch): assert r.json()["proposed_ids"] == ["prop-1", "prop-2"] assert r.json()["kept_branch"] == "vouch-dual/4-fix-bug-codex" assert r.json()["changed_files"] == ["y"] + assert r.json()["recommendation"]["engine"] == "claude" assert captured["winner"] == "codex" assert captured["record"] is True and captured["reason"] == "cleaner" From 0f9687e656bd713f83771b30ed3e31b4047685bb Mon Sep 17 00:00:00 2001 From: Yaroslav98214 Date: Sun, 21 Jun 2026 18:57:20 +0000 Subject: [PATCH 056/123] fix(sessions): make crystallize retry idempotent for summary pages Partial crystallize runs that already wrote session-{id} summary pages failed on retry with "page already exists". Upsert the summary page and derive its artifact list from all approved session proposals. Fixes #139 Co-authored-by: Cursor --- CHANGELOG.md | 2 ++ src/vouch/sessions.py | 29 +++++++++++++++++++++++------ tests/test_sessions.py | 34 ++++++++++++++++++++++++++++++++++ 3 files changed, 59 insertions(+), 6 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 75723dbd..a4da06b6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -88,6 +88,8 @@ All notable changes to vouch are documented here. Format follows - `vault_to_kb` skips filing a second proposal when a pending proposal already targets the same page id (with differing body), preventing duplicate proposals on repeated sync runs before approval (fixes #219). - `vault_to_kb` now warns when a user edits a claim stub instead of silently dropping the edit, directing the user to edit the citing page instead, and reports it via the dedicated `claim_stubs_edited` field on `VaultSyncResult` (fixes #219). - `approve()` now supports updating an existing page via `KBStore.update_page` when a PAGE proposal's id matches an existing artifact (the vault-edit flow), instead of raising `cannot approve: page already exists` for every vault edit (fixes #219). +- `crystallize()` now updates an existing session summary page on retry instead of + failing with `page session-... already exists` after a partial approval run (#139). ### Fixed - `vouch serve` now fails fast with a clear `vouch init` hint when no `.vouch/` KB is present, instead of starting a server that immediately misbehaves (#95). diff --git a/src/vouch/sessions.py b/src/vouch/sessions.py index 44e8b285..d243646b 100644 --- a/src/vouch/sessions.py +++ b/src/vouch/sessions.py @@ -14,9 +14,9 @@ from . import audit, index_db, volunteer_context from . import salience as salience_mod -from .models import Page, PageType, ProposalStatus, Session +from .models import Page, PageType, ProposalKind, ProposalStatus, Session from .proposals import approve -from .storage import KBStore +from .storage import ArtifactNotFoundError, KBStore logger = logging.getLogger(__name__) @@ -99,18 +99,24 @@ def crystallize( }) summary_page_id: str | None = None - if write_summary_page and approved_artifact_ids: + approved_for_session = _approved_artifact_ids_for_session(store, sess.id) + if write_summary_page and approved_for_session: page = Page( id=f"session-{sess.id}", title=f"Session {sess.id}", type=PageType.SESSION, - body=_build_summary_body(sess, approved_artifact_ids), + body=_build_summary_body(sess, approved_for_session), claims=[ - aid for aid in approved_artifact_ids + aid for aid in approved_for_session if (store.kb_dir / "claims" / f"{aid}.yaml").exists() ], ) - store.put_page(page) + try: + store.get_page(page.id) + except ArtifactNotFoundError: + store.put_page(page) + else: + store.update_page(page) with index_db.open_db(store.kb_dir) as conn: index_db.index_page( conn, id=page.id, title=page.title, body=page.body, @@ -155,3 +161,14 @@ def _build_summary_body(sess: Session, ids: list[str]) -> str: for aid in ids: lines.append(f"- `{aid}`") return "\n".join(lines) + + +def _approved_artifact_ids_for_session(store: KBStore, session_id: str) -> list[str]: + ids = { + str(pr.payload.get("id")) + for pr in store.list_proposals(ProposalStatus.APPROVED) + if pr.session_id == session_id and pr.kind in { + ProposalKind.CLAIM, ProposalKind.PAGE, ProposalKind.ENTITY, ProposalKind.RELATION, + } and pr.payload.get("id") + } + return sorted(ids) diff --git a/tests/test_sessions.py b/tests/test_sessions.py index 9e3cbfed..e87cadb1 100644 --- a/tests/test_sessions.py +++ b/tests/test_sessions.py @@ -170,3 +170,37 @@ def test_crystallize_audit_event_records_summary_page_id( assert cryst_events, "no session.crystallize audit event found" last = cryst_events[-1] assert page_id in last["object_ids"], last["object_ids"] + + +def test_crystallize_retry_updates_existing_summary_page(store: KBStore) -> None: + from unittest.mock import patch + + src = store.put_source(b"e") + sess = sess_mod.session_start(store, agent="a", task="retry") + propose_claim(store, text="first", evidence=[src.id], proposed_by="a", session_id=sess.id) + propose_claim(store, text="second", evidence=[src.id], proposed_by="a", session_id=sess.id) + sess_mod.session_end(store, sess.id) + + real_approve = approve + calls = {"n": 0} + + def flaky_approve(*args, **kwargs): + calls["n"] += 1 + if calls["n"] == 2: + raise ValueError("transient") + return real_approve(*args, **kwargs) + + with patch("vouch.sessions.approve", side_effect=flaky_approve): + first = sess_mod.crystallize(store, sess.id, approver="u") + + assert len(first["approved"]) == 1 + assert len(first["failures"]) == 1 + assert first["summary_page_id"] is not None + + second = sess_mod.crystallize(store, sess.id, approver="u") + assert len(second["approved"]) == 1 + assert second["failures"] == [] + assert second["summary_page_id"] == first["summary_page_id"] + + summary = store.get_page(second["summary_page_id"]) + assert sorted(summary.claims) == sorted([c.id for c in store.list_claims()]) From 536c4ce89f3147481fb5e5ec16eb1066c6c7cdf8 Mon Sep 17 00:00:00 2001 From: minion1227 Date: Tue, 30 Jun 2026 19:19:26 -0700 Subject: [PATCH 057/123] fix(models): reject empty text/name/title on claim/entity/page MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit the non-empty contract for `Claim.text`, `Entity.name`, and `Page.title` lived only in the `propose_*` helpers, so `store.put_*`, `store.update_*`, and bundle/sync import (via `_validate_content`) all silently accepted empty or whitespace-only values and landed artifacts carrying zero of the field's semantic content. add `@field_validator`s on each field, mirroring the existing `Claim.evidence` min-citation validator (#81/#82): they reject blank input at construction time, so every write path — direct construction, put/update, and import — inherits the check at once. the validators gate on emptiness only and preserve surrounding whitespace of non-blank values. `Source.locator` is deliberately left out of scope — its format question is bigger and deserves its own issue, as the report notes. closes #155 --- CHANGELOG.md | 1 + src/vouch/models.py | 30 +++++++++++++++++++ tests/test_storage.py | 67 +++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 98 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8f4d85de..eb9a94bc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -96,6 +96,7 @@ All notable changes to vouch are documented here. Format follows KB under `eval/fixture-kb/`, and an `eval` workflow gating retrieval changes (#226). ### Fixed +- `Claim.text`, `Entity.name`, and `Page.title` now reject empty / whitespace-only values at the model layer via `@field_validator`s, mirroring the `Claim.evidence` min-citation validator (#81/#82). the non-empty contract previously lived only in the `propose_*` helpers, so `store.put_*`, `store.update_*`, and bundle/sync import all silently accepted blank-content artifacts; enforcing on the model closes every write path at once (fixes #155). - `parse_since` (the `--since` parser behind `vouch metrics`/`vouch audit`) now raises a clean `MetricsError` for a duration too large to represent (e.g. `--since 1000000000000d`), instead of letting an uncaught `OverflowError` traceback escape — restoring the documented "clean error, not a traceback" contract. - `sync_apply` now loads the sync source exactly once and passes the same `_SyncSource` instance into `sync_check`, closing a TOCTOU window where a bundle replaced on disk between the two `_load_source` calls could cause the validation and write phases to operate on different snapshots. Also eliminates redundant directory walks (KB sources) and triple tarball opens (bundle sources). Fixes #217. - `vault_to_kb` now passes `slug_hint=page_id` to `propose_page` so vault edit proposals target the existing page id from frontmatter instead of a slugified copy of the title (fixes #219). diff --git a/src/vouch/models.py b/src/vouch/models.py index 23f94aa4..d08ed8c0 100644 --- a/src/vouch/models.py +++ b/src/vouch/models.py @@ -231,6 +231,18 @@ def _at_least_one_citation(cls, v: list[str]) -> list[str]: "(README §'Object model'; CONTRIBUTING §'Things we won't merge')" ) return v + + @field_validator("text") + @classmethod + def _text_non_empty(cls, v: str) -> str: + # Same shape as _at_least_one_citation: the non-empty contract lived + # only in proposals.propose_claim, so store.put_claim, + # store.update_claim, and bundle.import_apply via _validate_content + # accepted text="" / whitespace and landed a claim carrying zero + # semantic content. Enforce on the model to close all paths at once. + if not v.strip(): + raise ValueError("claim text must not be empty") + return v entities: list[str] = Field(default_factory=list) supersedes: list[str] = Field(default_factory=list) superseded_by: str | None = None @@ -266,6 +278,15 @@ class Entity(BaseModel): created_at: datetime = Field(default_factory=utcnow) updated_at: datetime = Field(default_factory=utcnow) + @field_validator("name") + @classmethod + def _name_non_empty(cls, v: str) -> str: + # See Claim._text_non_empty — the propose_entity check alone left + # store.put_entity and bundle import accepting name="" / whitespace. + if not v.strip(): + raise ValueError("entity name must not be empty") + return v + class Relation(BaseModel): """Typed edge between entities / claims / pages.""" @@ -314,6 +335,15 @@ def _normalize_type(cls, v: Any) -> str: raise ValueError("page type must be a non-empty string") return v.strip() + @field_validator("title") + @classmethod + def _title_non_empty(cls, v: str) -> str: + # See Claim._text_non_empty — the propose_page check alone left + # store.put_page and bundle import accepting title="" / whitespace. + if not v.strip(): + raise ValueError("page title must not be empty") + return v + # --- audit + sessions ----------------------------------------------------- diff --git a/tests/test_storage.py b/tests/test_storage.py index ce1d643f..7c3098ad 100644 --- a/tests/test_storage.py +++ b/tests/test_storage.py @@ -196,6 +196,47 @@ def test_update_claim_rejects_empty_evidence(store: KBStore) -> None: assert (store.kb_dir / "claims" / "c1.yaml").read_text() == persisted_before +@pytest.mark.parametrize("bad", ["", " ", "\n\t "]) +def test_claim_model_rejects_empty_text(store: KBStore, bad: str) -> None: + """Regression for #155: same shape as the #81 evidence validator, on the + text field. Empty / whitespace-only text is rejected at the model layer so + direct construction, store.put_claim, and bundle import all inherit it.""" + src = store.put_source(b"e") + with pytest.raises(ValidationError, match="text must not be empty"): + Claim(id="c1", text=bad, evidence=[src.id]) + + +def test_put_claim_rejects_empty_text(store: KBStore) -> None: + src = store.put_source(b"e") + with pytest.raises(ValidationError, match="text must not be empty"): + store.put_claim(Claim(id="c1", text=" ", evidence=[src.id])) + assert not (store.kb_dir / "claims" / "c1.yaml").exists() + + +def test_update_claim_rejects_empty_text(store: KBStore) -> None: + """A previously-populated claim cannot be mutated down to blank text and + silently re-persisted — update_claim re-validates via model_validate.""" + src = store.put_source(b"e") + store.put_claim(Claim(id="c1", text="cited", evidence=[src.id])) + persisted_before = (store.kb_dir / "claims" / "c1.yaml").read_text() + + c = store.get_claim("c1") + c.text = " " + + with pytest.raises(ValidationError, match="text must not be empty"): + store.update_claim(c) + assert (store.kb_dir / "claims" / "c1.yaml").read_text() == persisted_before + + +def test_claim_text_preserves_surrounding_whitespace_when_non_blank( + store: KBStore, +) -> None: + """The validator gates on emptiness only — it must not strip content.""" + src = store.put_source(b"e") + c = Claim(id="c1", text=" padded text ", evidence=[src.id]) + assert c.text == " padded text " + + # --- pages ---------------------------------------------------------------- @@ -217,6 +258,19 @@ def test_page_with_frontmatter_round_trip(store: KBStore) -> None: assert back.type == PageType.CONCEPT +@pytest.mark.parametrize("bad", ["", " ", "\n"]) +def test_page_model_rejects_empty_title(bad: str) -> None: + """Regression for #155 — empty / whitespace titles rejected on the model.""" + with pytest.raises(ValidationError, match="title must not be empty"): + Page(id="p1", title=bad) + + +def test_put_page_rejects_empty_title(store: KBStore) -> None: + with pytest.raises(ValidationError, match="title must not be empty"): + store.put_page(Page(id="p1", title=" ")) + assert not (store.kb_dir / "pages" / "p1.md").exists() + + # --- entities + relations ------------------------------------------------- @@ -226,6 +280,19 @@ def test_entity_round_trip(store: KBStore) -> None: assert back.name == "Foo" +@pytest.mark.parametrize("bad", ["", " ", "\t\n"]) +def test_entity_model_rejects_empty_name(bad: str) -> None: + """Regression for #155 — empty / whitespace names rejected on the model.""" + with pytest.raises(ValidationError, match="name must not be empty"): + Entity(id="e1", name=bad, type=EntityType.CONCEPT) + + +def test_put_entity_rejects_empty_name(store: KBStore) -> None: + with pytest.raises(ValidationError, match="name must not be empty"): + store.put_entity(Entity(id="e1", name=" ", type=EntityType.CONCEPT)) + assert not (store.kb_dir / "entities" / "e1.yaml").exists() + + def test_relation_round_trip(store: KBStore) -> None: store.put_entity(Entity(id="a", name="A", type=EntityType.PROJECT)) store.put_entity(Entity(id="b", name="B", type=EntityType.PROJECT)) From 89815c0088771cf70d9d6406138768b011c78a74 Mon Sep 17 00:00:00 2001 From: minion1227 Date: Tue, 30 Jun 2026 19:25:45 -0700 Subject: [PATCH 058/123] refactor(models): extract shared _require_non_empty validator helper address review on #300: the three #155 field validators (Claim.text / Entity.name / Page.title) were structurally identical strip-checks. extract a module-level `_require_non_empty(v, label)` helper they all delegate to, keeping the per-field error messages. also fix a mid-entry sentence casing in the CHANGELOG. no behaviour change. --- CHANGELOG.md | 2 +- src/vouch/models.py | 24 +++++++++++++++--------- 2 files changed, 16 insertions(+), 10 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index eb9a94bc..4cacf1aa 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -96,7 +96,7 @@ All notable changes to vouch are documented here. Format follows KB under `eval/fixture-kb/`, and an `eval` workflow gating retrieval changes (#226). ### Fixed -- `Claim.text`, `Entity.name`, and `Page.title` now reject empty / whitespace-only values at the model layer via `@field_validator`s, mirroring the `Claim.evidence` min-citation validator (#81/#82). the non-empty contract previously lived only in the `propose_*` helpers, so `store.put_*`, `store.update_*`, and bundle/sync import all silently accepted blank-content artifacts; enforcing on the model closes every write path at once (fixes #155). +- `Claim.text`, `Entity.name`, and `Page.title` now reject empty / whitespace-only values at the model layer via `@field_validator`s, mirroring the `Claim.evidence` min-citation validator (#81/#82). The non-empty contract previously lived only in the `propose_*` helpers, so `store.put_*`, `store.update_*`, and bundle/sync import all silently accepted blank-content artifacts; enforcing on the model closes every write path at once (fixes #155). - `parse_since` (the `--since` parser behind `vouch metrics`/`vouch audit`) now raises a clean `MetricsError` for a duration too large to represent (e.g. `--since 1000000000000d`), instead of letting an uncaught `OverflowError` traceback escape — restoring the documented "clean error, not a traceback" contract. - `sync_apply` now loads the sync source exactly once and passes the same `_SyncSource` instance into `sync_check`, closing a TOCTOU window where a bundle replaced on disk between the two `_load_source` calls could cause the validation and write phases to operate on different snapshots. Also eliminates redundant directory walks (KB sources) and triple tarball opens (bundle sources). Fixes #217. - `vault_to_kb` now passes `slug_hint=page_id` to `propose_page` so vault edit proposals target the existing page id from frontmatter instead of a slugified copy of the title (fixes #219). diff --git a/src/vouch/models.py b/src/vouch/models.py index d08ed8c0..3855d6e4 100644 --- a/src/vouch/models.py +++ b/src/vouch/models.py @@ -82,6 +82,18 @@ def _coerce_artifact_scope(value: object) -> object: return value +def _require_non_empty(v: str, label: str) -> str: + """Reject empty / whitespace-only required text fields (#155). + + Shared by the ``Claim.text`` / ``Entity.name`` / ``Page.title`` + validators. Gates on emptiness only — non-blank values pass through + unchanged, so surrounding whitespace is preserved. + """ + if not v.strip(): + raise ValueError(f"{label} must not be empty") + return v + + class ArtifactScope(BaseModel): """Structured scope: visibility tier plus optional project/agent binding.""" @@ -240,9 +252,7 @@ def _text_non_empty(cls, v: str) -> str: # store.update_claim, and bundle.import_apply via _validate_content # accepted text="" / whitespace and landed a claim carrying zero # semantic content. Enforce on the model to close all paths at once. - if not v.strip(): - raise ValueError("claim text must not be empty") - return v + return _require_non_empty(v, "claim text") entities: list[str] = Field(default_factory=list) supersedes: list[str] = Field(default_factory=list) superseded_by: str | None = None @@ -283,9 +293,7 @@ class Entity(BaseModel): def _name_non_empty(cls, v: str) -> str: # See Claim._text_non_empty — the propose_entity check alone left # store.put_entity and bundle import accepting name="" / whitespace. - if not v.strip(): - raise ValueError("entity name must not be empty") - return v + return _require_non_empty(v, "entity name") class Relation(BaseModel): @@ -340,9 +348,7 @@ def _normalize_type(cls, v: Any) -> str: def _title_non_empty(cls, v: str) -> str: # See Claim._text_non_empty — the propose_page check alone left # store.put_page and bundle import accepting title="" / whitespace. - if not v.strip(): - raise ValueError("page title must not be empty") - return v + return _require_non_empty(v, "page title") # --- audit + sessions ----------------------------------------------------- From 96ea554bd18b0f8326a2dc7784545dcb26c76d73 Mon Sep 17 00:00:00 2001 From: RealDiligent Date: Sun, 5 Jul 2026 18:05:07 +0800 Subject: [PATCH 059/123] fix: resolve RPC traceback leakage on internal errors Unexpected exceptions in handle_request() included full stack traces in the JSON error envelope, exposing paths and internals to HTTP /rpc clients. Log server-side and return message only. Co-authored-by: Cursor --- src/vouch/jsonl_server.py | 6 ++++-- tests/test_jsonl_server.py | 14 ++++++++++++++ 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/src/vouch/jsonl_server.py b/src/vouch/jsonl_server.py index 5f42e16b..39ff620c 100644 --- a/src/vouch/jsonl_server.py +++ b/src/vouch/jsonl_server.py @@ -18,9 +18,9 @@ from __future__ import annotations import json +import logging import os import sys -import traceback from collections.abc import Callable from contextvars import ContextVar from pathlib import Path @@ -37,6 +37,8 @@ from .capabilities import capabilities as build_caps from .context import build_context_pack from .logging_config import configure_logging + +_log = logging.getLogger("vouch.jsonl_server") from .models import ProposalStatus from .proposals import ( EXPIRE_ACTOR, @@ -761,12 +763,12 @@ def handle_request(envelope: dict) -> dict: "error": {"code": "invalid_request", "message": str(e)}, } except Exception as e: + _log.exception("internal error handling %s", method) return { "id": req_id, "ok": False, "error": { "code": "internal_error", "message": str(e), - "traceback": traceback.format_exc(), }, } diff --git a/tests/test_jsonl_server.py b/tests/test_jsonl_server.py index 65627b76..dc1aa0a7 100644 --- a/tests/test_jsonl_server.py +++ b/tests/test_jsonl_server.py @@ -234,3 +234,17 @@ def test_jsonl_self_approval_allowed_with_trusted_agent_config( resp = handle_request({"id": "2", "method": "kb.approve", "params": {"proposal_id": pid}}) assert resp["ok"] + + +def test_jsonl_internal_error_omits_traceback(monkeypatch) -> None: + """HTTP /rpc clients must not receive server tracebacks on unexpected errors.""" + from vouch import jsonl_server + + def _boom(_params: dict) -> dict: + raise RuntimeError("secret internals") + + monkeypatch.setitem(jsonl_server.HANDLERS, "kb.status", _boom) + resp = handle_request({"id": "x", "method": "kb.status", "params": {}}) + assert resp["ok"] is False + assert resp["error"]["code"] == "internal_error" + assert "traceback" not in resp["error"] From 24c55c257a6a91f63153ae49c0c7c01b2451a84a Mon Sep 17 00:00:00 2001 From: jsdevninja Date: Fri, 3 Jul 2026 01:15:51 -0500 Subject: [PATCH 060/123] =?UTF-8?q?feat(review):=20kb.triage=5Fpending=20?= =?UTF-8?q?=E2=80=94=20advisory=20triage=20scoring=20for=20the=20pending?= =?UTF-8?q?=20queue?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit a long `kb.list_pending` forces the reviewer to reconstruct, per proposal, whether the claim fits the existing kb, whether its citations resolve, whether it duplicates something already filed, and whether it contradicts an approved claim. this adds an optional triage pass that scores each pending proposal on those four signals and attaches a `_meta.vouch_triage` block (recommendation/score/signals/rationale) to help a reviewer prioritize, without ever deciding anything itself. read-only by construction: the pass never calls proposals.approve/reject, store.put_*, or store.move_proposal_to_decided — a human still calls kb.approve/kb.reject. citation_quality reuses proposals._payload_block_reason; duplication_risk reuses the propose-time embedding similarity path (embeddings.similarity.find_similar_on_propose) and degrades to a difflib heuristic when the embeddings extra isn't installed. fit uses a separate, lower-threshold embedding search so a near-duplicate hit doesn't also inflate fit and cancel out its own duplication penalty. opt-in via `triage.enabled: true` in config.yaml (default false). registered at all four kb.* surface sites (server.py, jsonl_server.py, capabilities.py, cli.py) plus `vouch triage [proposal-id...]` with `--json` and `--reverse`. --- CHANGELOG.md | 13 + src/vouch/capabilities.py | 1 + src/vouch/cli.py | 46 ++++ src/vouch/jsonl_server.py | 7 + src/vouch/server.py | 17 ++ src/vouch/triage.py | 503 ++++++++++++++++++++++++++++++++++++++ tests/test_triage.py | 433 ++++++++++++++++++++++++++++++++ 7 files changed, 1020 insertions(+) create mode 100644 src/vouch/triage.py create mode 100644 tests/test_triage.py diff --git a/CHANGELOG.md b/CHANGELOG.md index 71809356..8987817e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,19 @@ All notable changes to vouch are documented here. Format follows ## [Unreleased] +### Added +- `kb.triage_pending` — advisory triage scoring over the pending-review queue. + Scores each pending proposal on fit, citation quality, duplication risk, and + contradiction risk, then attaches a `_meta.vouch_triage` block + (`recommendation`, `score`, `signals`, `rationale`) to help a reviewer + prioritize a long `kb.list_pending`. Read-only and advisory only: it never + calls `kb.approve` / `kb.reject` and never moves a proposal out of pending — + a human still decides. Duplication and fit reuse the propose-time embedding + similarity path and degrade to a `difflib` heuristic when the `[embeddings]` + extra isn't installed. Opt-in via `triage.enabled: true` in `config.yaml`. + `vouch triage [proposal-id...]` mirrors it on the CLI with `--json` and + `--reverse` (#322). + ## [1.2.1] — 2026-07-06 ### Fixed diff --git a/src/vouch/capabilities.py b/src/vouch/capabilities.py index 3fd21c75..90be307b 100644 --- a/src/vouch/capabilities.py +++ b/src/vouch/capabilities.py @@ -33,6 +33,7 @@ "kb.list_relations", "kb.list_sources", "kb.list_pending", + "kb.triage_pending", "kb.register_source", "kb.register_source_from_path", "kb.propose_claim", diff --git a/src/vouch/cli.py b/src/vouch/cli.py index a490fcf9..cd0a30ae 100644 --- a/src/vouch/cli.py +++ b/src/vouch/cli.py @@ -1030,6 +1030,52 @@ def list_relations() -> None: click.echo(output) +@cli.command() +@click.argument("proposal_ids", nargs=-1) +@click.option( + "--json", "as_json", is_flag=True, + help="Emit machine-readable _meta.vouch_triage blocks.", +) +@click.option( + "--reverse", is_flag=True, + help="Ascending order (worst-first) instead of the default descending (best-first).", +) +def triage(proposal_ids: tuple[str, ...], as_json: bool, reverse: bool) -> None: + """Advisory triage scoring over pending proposals (opt-in: triage.enabled). + + Scores each proposal on fit, citation quality, duplication risk, and + contradiction risk, then prints a ranked table. Never approves or + rejects — a human still decides via `vouch approve` / `vouch reject`. + """ + from . import triage as triage_mod + + store = _load_store() + with _cli_errors(): + results = triage_mod.triage_pending(store, proposal_ids=list(proposal_ids) or None) + results.sort(key=lambda r: r["_meta"]["vouch_triage"]["score"], reverse=not reverse) + + if as_json: + _emit_json(results) + return + if not results: + click.echo("no pending proposals to triage") + return + for r in results: + block = r["_meta"]["vouch_triage"] + preview = ( + r["payload"].get("text") + or r["payload"].get("title") + or r["payload"].get("name") + or r["payload"].get("id") + or "-" + ) + click.echo( + f"{block['score']:.2f} [{block['recommendation']:>11}] " + f"{r['id']} [{r['kind']}] {str(preview).strip()[:80]}" + ) + click.echo(f" {block['rationale']}") + + @cli.command() @click.argument("proposal_ids", nargs=-1, required=True) @click.option("--reason", default=None) diff --git a/src/vouch/jsonl_server.py b/src/vouch/jsonl_server.py index 5e3b62b7..e7c48581 100644 --- a/src/vouch/jsonl_server.py +++ b/src/vouch/jsonl_server.py @@ -294,6 +294,12 @@ def _h_list_pending(_: dict) -> list[dict]: ] +def _h_triage_pending(p: dict) -> list[dict]: + from . import triage as triage_mod + + return triage_mod.triage_pending(_store(), proposal_ids=p.get("proposal_ids")) + + def _h_register_source(p: dict) -> dict: s = _store() src = s.put_source( @@ -729,6 +735,7 @@ def _h_propose_theme(p: dict) -> dict: "kb.list_relations": _h_list_relations, "kb.list_sources": _h_list_sources, "kb.list_pending": _h_list_pending, + "kb.triage_pending": _h_triage_pending, "kb.register_source": _h_register_source, "kb.register_source_from_path": _h_register_source_from_path, "kb.propose_claim": _h_propose_claim, diff --git a/src/vouch/server.py b/src/vouch/server.py index 8cabee08..e79e5083 100644 --- a/src/vouch/server.py +++ b/src/vouch/server.py @@ -382,6 +382,23 @@ def kb_list_pending() -> list[dict[str, Any]]: ] +@mcp.tool() +def kb_triage_pending(proposal_ids: list[str] | None = None) -> list[dict[str, Any]]: + """Advisory triage scoring over the pending-review queue. + + Attaches `_meta.vouch_triage` (recommendation/score/signals/rationale) + to each pending proposal's view. Read-only — never approves, rejects, + or otherwise decides; a human still calls `kb_approve` / `kb_reject`. + Opt-in: disabled unless `triage.enabled: true` is set in config.yaml. + """ + from . import triage as triage_mod + + try: + return triage_mod.triage_pending(_store(), proposal_ids=proposal_ids) + except (ValueError, ArtifactNotFoundError) as e: + raise ValueError(str(e)) from e + + # === write tools — gated (produce proposals) ============================= diff --git a/src/vouch/triage.py b/src/vouch/triage.py new file mode 100644 index 00000000..31202e40 --- /dev/null +++ b/src/vouch/triage.py @@ -0,0 +1,503 @@ +"""Advisory triage scoring for the pending-review queue (issue #322). + +Read-only. Scores each pending proposal on four signals — fit, citation +quality, duplication risk, and contradiction risk — and folds them into a +composite ``score`` plus an advisory ``recommendation``. The result is +attached as ``_meta.vouch_triage`` on the proposal's own ``model_dump``. + +This never decides anything: no call here ever reaches +``proposals.approve``, ``proposals.reject``, ``store.put_*``, or +``store.move_proposal_to_decided``. A human still calls ``kb.approve`` / +``kb.reject``; ``recommendation`` is a hint the reviewer may ignore. + +Opt-in: disabled unless ``triage.enabled: true`` is set in +``.vouch/config.yaml`` (mirrors the defensive yaml-read pattern in +``salience.reflex_cfg`` / ``embeddings.similarity.similarity_threshold`` — +no pydantic Config model yet, see issue #243). + +Duplication risk reuses the embedding path already built for propose-time +warnings (``embeddings.similarity.find_similar_on_propose``); fit uses the +same underlying primitive (``index_db.search_embedding``) at a lower +threshold band so a near-duplicate hit doesn't also inflate fit and cancel +out its own duplication penalty (see ``_topical_fit_scores``). When no +embedder is registered (base install, no ``[embeddings]`` extra), both +signals fall back to a ``difflib`` text-similarity heuristic so the method +still returns a full block. +""" + +from __future__ import annotations + +import difflib +import re +from dataclasses import dataclass +from typing import Any + +import yaml + +from .models import Proposal, ProposalKind, ProposalStatus +from .proposals import _payload_block_reason +from .storage import ArtifactNotFoundError, KBStore + +DEFAULT_WEIGHTS: dict[str, float] = { + "fit": 0.3, + "citation_quality": 0.3, + "duplication_risk": 0.2, + "contradiction_risk": 0.2, +} + +_APPROVE_THRESHOLD = 0.7 +_REJECT_THRESHOLD = 0.35 +_FUZZY_MATCH_FLOOR = 0.3 +_CONTRADICTION_CANDIDATE_FLOOR = 0.35 + +_NEGATION_MARKERS = frozenset({ + "not", "no", "never", "cannot", "isnt", "doesnt", "wont", "wasnt", + "arent", "dont", "didnt", "hasnt", "havent", "without", "neither", "nor", +}) + + +class TriageError(ValueError): + """Raised when `kb.triage_pending` is invoked while disabled, or misused.""" + + +@dataclass(frozen=True) +class TriageConfig: + enabled: bool + backend: str + weights: dict[str, float] + + +def triage_cfg(store: KBStore) -> TriageConfig: + """Read `triage.*` from config.yaml defensively. Default: disabled.""" + cfg: dict[str, Any] = {} + try: + loaded = yaml.safe_load(store.config_path.read_text(encoding="utf-8")) + if isinstance(loaded, dict): + cfg = loaded + except Exception: + pass + + triage = cfg.get("triage") + triage = triage if isinstance(triage, dict) else {} + + enabled = triage.get("enabled", False) + enabled = bool(enabled) if isinstance(enabled, bool) else False + + backend = triage.get("backend", "embeddings") + backend = backend if isinstance(backend, str) else "embeddings" + + weights = dict(DEFAULT_WEIGHTS) + weights_cfg = triage.get("weights") + if isinstance(weights_cfg, dict): + for key in weights: + value = weights_cfg.get(key) + if isinstance(value, int | float) and not isinstance(value, bool): + weights[key] = float(value) + + return TriageConfig(enabled=enabled, backend=backend, weights=weights) + + +# --- shared helpers --------------------------------------------------------- + + +def _referenced_entity_ids(proposal: Proposal) -> list[str]: + if proposal.kind in (ProposalKind.CLAIM, ProposalKind.PAGE): + return list(proposal.payload.get("entities") or []) + return [] + + +def _has_negation(text: str) -> bool: + tokens = set(re.findall(r"[a-z']+", text.casefold())) + tokens = {t.replace("'", "") for t in tokens} + return bool(tokens & _NEGATION_MARKERS) + + +def _safe_embedder() -> Any | None: + try: + from .embeddings import get_embedder + + return get_embedder() + except Exception: + return None + + +def _best_fuzzy_match( + text: str, pool: list[tuple[str, str]], +) -> tuple[str | None, float]: + needle = text.casefold() + best_id: str | None = None + best_ratio = 0.0 + for cid, candidate in pool: + candidate = (candidate or "").strip() + if not candidate: + continue + ratio = difflib.SequenceMatcher(None, needle, candidate.casefold()).ratio() + if ratio > best_ratio: + best_ratio, best_id = ratio, cid + if best_id is None or best_ratio < _FUZZY_MATCH_FLOOR: + return None, 0.0 + return best_id, best_ratio + + +def _claim_text_pool( + store: KBStore, *, exclude_proposal_id: str, exclude_claim_id: str | None, +) -> list[tuple[str, str]]: + pool = [ + (c.id, c.text) for c in store.list_claims() if c.id != exclude_claim_id + ] + pool += [ + (p.id, str(p.payload.get("text", ""))) + for p in store.list_proposals(ProposalStatus.PENDING) + if p.kind == ProposalKind.CLAIM and p.id != exclude_proposal_id + ] + return pool + + +def _embedding_hits_for_claim( + store: KBStore, proposal: Proposal, *, use_embeddings: bool, +) -> list[dict[str, Any]] | None: + """`find_similar_on_propose` hits, or None when the embedding path can't run. + + None means "no embedder available (or backend forced to heuristic)" — + callers fall back to a difflib heuristic. `[]` means the embedder ran + and genuinely found nothing similar. Every hit returned is, by that + function's own contract, at or above the near-duplicate threshold — + it's a duplicate detector, not a general similarity search. Used by + `duplication_risk` and `contradiction_risk`; deliberately NOT reused + for `fit` (see `_topical_fit_scores`). + """ + if not use_embeddings or proposal.kind != ProposalKind.CLAIM: + return None + text = str(proposal.payload.get("text", "")).strip() + if not text or _safe_embedder() is None: + return None + try: + from .embeddings.similarity import find_similar_on_propose + except ImportError: + return None + return find_similar_on_propose( + store, text, exclude_claim_id=proposal.payload.get("id"), + ) + + +def _topical_fit_scores(store: KBStore, proposal: Proposal, embedder: Any) -> list[float]: + """Cosine scores against the approved corpus, below the duplicate band. + + A near-duplicate hit is already penalized by `duplication_risk`; letting + it also inflate `fit` would let the two signals cancel each other out + for the exact-duplicate case. So this looks at a lower, wider band + (`min_score=0.3`) and excludes anything at or above the near-duplicate + threshold (`review.similarity_threshold`, default 0.95). + """ + text = str(proposal.payload.get("text", "")).strip() + if not text: + return [] + try: + from . import index_db + from .embeddings.similarity import similarity_threshold + + vec = embedder.encode(text) + dup_threshold = similarity_threshold(store) + hits = index_db.search_embedding( + store.kb_dir, query_vec=vec, kinds=("claim", "page"), limit=5, min_score=0.3, + ) + except Exception: + return [] + exclude_id = proposal.payload.get("id") + return [ + float(cos) for _kind, cid, _snip, cos in hits + if cid != exclude_id and cos < dup_threshold + ] + + +# --- signals ----------------------------------------------------------------- + + +def _signal_citation_quality(store: KBStore, proposal: Proposal) -> dict[str, Any]: + block = _payload_block_reason(store, proposal) + if block: + return {"score": 0.0, "reason": block} + if proposal.kind in (ProposalKind.CLAIM, ProposalKind.RELATION): + n = len(proposal.payload.get("evidence") or []) + if n == 0: + # Relations may legitimately have no evidence; claims can't reach + # here with n == 0 (Claim._at_least_one_citation already blocked). + return { + "score": 0.6, + "reason": "relation has no evidence citation (allowed, but weaker)", + } + score = min(1.0, 0.7 + 0.15 * (n - 1)) + return {"score": round(score, 4), "reason": f"{n} evidence citation(s) resolve cleanly"} + if proposal.kind == ProposalKind.PAGE: + sources = proposal.payload.get("sources") or [] + claims = proposal.payload.get("claims") or [] + if not sources and not claims: + return {"score": 0.5, "reason": "page has no source/claim citations"} + return { + "score": 1.0, + "reason": f"{len(sources)} source(s), {len(claims)} claim(s) resolve cleanly", + } + return {"score": 1.0, "reason": "entity payload resolves cleanly"} + + +def _signal_fit( + store: KBStore, proposal: Proposal, embedder: Any | None, +) -> dict[str, Any]: + entity_ids = _referenced_entity_ids(proposal) + known = {e.id for e in store.list_entities()} + overlap: float | None = None + if entity_ids: + overlap = sum(1 for e in entity_ids if e in known) / len(entity_ids) + + topical: float | None = None + if embedder is not None and proposal.kind == ProposalKind.CLAIM: + scores = _topical_fit_scores(store, proposal, embedder) + if scores: + topical = sum(scores) / len(scores) + + parts = [v for v in (overlap, topical) if v is not None] + if not parts: + return { + "score": 0.5, + "reason": "no referenced entities or approved-corpus signal; neutral fit", + } + bits = [] + if overlap is not None: + bits.append(f"{overlap:.0%} of referenced entities already known") + if topical is not None: + bits.append(f"mean topical similarity to approved corpus {topical:.2f}") + return {"score": round(sum(parts) / len(parts), 4), "reason": "; ".join(bits)} + + +def _duplication_risk_structural(store: KBStore, proposal: Proposal) -> dict[str, Any]: + if proposal.kind == ProposalKind.RELATION: + triple = ( + proposal.payload.get("source"), + proposal.payload.get("relation"), + proposal.payload.get("target"), + ) + for r in store.list_relations(): + if (r.source, r.relation.value, r.target) == triple: + return {"score": 1.0, "reason": f"identical relation already approved: {r.id}"} + for p in store.list_proposals(ProposalStatus.PENDING): + if p.kind != ProposalKind.RELATION or p.id == proposal.id: + continue + other = (p.payload.get("source"), p.payload.get("relation"), p.payload.get("target")) + if other == triple: + return {"score": 1.0, "reason": f"identical relation already pending: {p.id}"} + return {"score": 0.0, "reason": "no identical relation found"} + + if proposal.kind == ProposalKind.ENTITY: + name = str(proposal.payload.get("name", "")).strip() + pool = [(e.id, e.name) for e in store.list_entities()] + pool += [ + (p.id, str(p.payload.get("name", ""))) + for p in store.list_proposals(ProposalStatus.PENDING) + if p.kind == ProposalKind.ENTITY and p.id != proposal.id + ] + else: # PAGE + name = str(proposal.payload.get("title", "")).strip() + pool = [(pg.id, pg.title) for pg in store.list_pages()] + pool += [ + (p.id, str(p.payload.get("title", ""))) + for p in store.list_proposals(ProposalStatus.PENDING) + if p.kind == ProposalKind.PAGE and p.id != proposal.id + ] + + if not name: + return {"score": 0.0, "reason": "no name/title to compare"} + best_id, best_ratio = _best_fuzzy_match(name, pool) + if best_id is None: + return {"score": 0.0, "reason": "no similarly-named artifact found (heuristic backend)"} + return { + "score": round(best_ratio, 4), + "reason": f"name similarity {best_ratio:.2f} vs {best_id} (heuristic backend)", + } + + +def _signal_duplication_risk( + store: KBStore, proposal: Proposal, hits: list[dict[str, Any]] | None, +) -> dict[str, Any]: + if proposal.kind != ProposalKind.CLAIM: + return _duplication_risk_structural(store, proposal) + + text = str(proposal.payload.get("text", "")).strip() + if not text: + return {"score": 0.0, "reason": "no claim text to compare"} + + if hits is None: + pool = _claim_text_pool( + store, exclude_proposal_id=proposal.id, + exclude_claim_id=proposal.payload.get("id"), + ) + best_id, best_ratio = _best_fuzzy_match(text, pool) + if best_id is None: + return {"score": 0.0, "reason": "no near-duplicate claims found (heuristic backend)"} + return { + "score": round(best_ratio, 4), + "reason": f"text similarity {best_ratio:.2f} vs {best_id} (heuristic backend)", + } + + if not hits: + return {"score": 0.0, "reason": "no near-duplicate claims found (embedding backend)"} + top = max(hits, key=lambda w: w["cosine"]) + return { + "score": round(float(top["cosine"]), 4), + "reason": ( + f"cosine {top['cosine']:.2f} vs {top['artifact_kind']} " + f"{top['artifact_id']} (embedding backend)" + ), + } + + +def _signal_contradiction_risk( + store: KBStore, proposal: Proposal, hits: list[dict[str, Any]] | None, +) -> dict[str, Any]: + if proposal.kind != ProposalKind.CLAIM: + return {"score": 0.0, "reason": "contradiction risk is only assessed for claim proposals"} + + text = str(proposal.payload.get("text", "")).strip() + if not text: + return {"score": 0.0, "reason": "no claim text to compare"} + + entity_ids = set(proposal.payload.get("entities") or []) + neg = _has_negation(text) + + if hits is not None: + backend = "embedding" + candidates = [ + (h["artifact_id"], float(h["cosine"])) + for h in hits + if h.get("artifact_kind") == "claim" + ] + else: + backend = "heuristic" + pool = _claim_text_pool( + store, exclude_proposal_id=proposal.id, + exclude_claim_id=proposal.payload.get("id"), + ) + candidates = [ + (cid, ratio) + for cid, ratio in ( + (cid, difflib.SequenceMatcher(None, text.casefold(), ctext.casefold()).ratio()) + for cid, ctext in pool + ) + if ratio >= _CONTRADICTION_CANDIDATE_FLOOR + ] + + if not candidates: + return {"score": 0.0, "reason": f"no topically related claims found ({backend} backend)"} + + conflicts: list[tuple[str, float]] = [] + for cid, sim in candidates: + try: + claim = store.get_claim(cid) + except ArtifactNotFoundError: + continue # candidate is a pending proposal, not yet an approved claim + if entity_ids & set(claim.entities) and _has_negation(claim.text) != neg: + conflicts.append((cid, sim)) + + if not conflicts: + return { + "score": 0.0, + "reason": ( + f"{len(candidates)} related claim(s), " + f"no polarity conflict ({backend} backend)" + ), + } + top_id, top_sim = max(conflicts, key=lambda c: c[1]) + score = round(min(1.0, 0.5 + top_sim / 2), 4) + return { + "score": score, + "reason": ( + f"possible polarity conflict with {top_id} " + f"(similarity {top_sim:.2f}, {backend} backend)" + ), + } + + +# --- composite --------------------------------------------------------------- + + +def _composite_score(signals: dict[str, dict[str, Any]], weights: dict[str, float]) -> float: + goodness = { + "fit": signals["fit"]["score"], + "citation_quality": signals["citation_quality"]["score"], + "duplication_risk": 1.0 - signals["duplication_risk"]["score"], + "contradiction_risk": 1.0 - signals["contradiction_risk"]["score"], + } + total_weight = sum(weights.get(k, 0.0) for k in goodness) or 1.0 + raw = sum(goodness[k] * weights.get(k, 0.0) for k in goodness) / total_weight + return round(min(1.0, max(0.0, raw)), 4) + + +def _recommendation(score: float, signals: dict[str, dict[str, Any]]) -> str: + if signals["citation_quality"]["score"] == 0.0: + # A blocked payload can't be approved as-is (approve() would raise) — + # no composite score should be able to override that. + return "reject" + if score >= _APPROVE_THRESHOLD: + return "approve" + if score <= _REJECT_THRESHOLD: + return "reject" + return "needs-human" + + +def _rationale(recommendation: str, score: float, signals: dict[str, dict[str, Any]]) -> str: + parts = "; ".join(f"{name}: {sig['reason']}" for name, sig in signals.items()) + return f"{recommendation} (score {score:.2f}) — {parts}" + + +def score_proposal( + store: KBStore, proposal: Proposal, *, + weights: dict[str, float] | None = None, + use_embeddings: bool = True, +) -> dict[str, Any]: + """Compute the `_meta.vouch_triage` block for one pending proposal.""" + weights = weights or DEFAULT_WEIGHTS + hits = _embedding_hits_for_claim(store, proposal, use_embeddings=use_embeddings) + embedder = _safe_embedder() if use_embeddings else None + signals = { + "fit": _signal_fit(store, proposal, embedder), + "citation_quality": _signal_citation_quality(store, proposal), + "duplication_risk": _signal_duplication_risk(store, proposal, hits), + "contradiction_risk": _signal_contradiction_risk(store, proposal, hits), + } + score = _composite_score(signals, weights) + recommendation = _recommendation(score, signals) + return { + "recommendation": recommendation, + "score": score, + "signals": signals, + "rationale": _rationale(recommendation, score, signals), + } + + +def triage_pending( + store: KBStore, proposal_ids: list[str] | None = None, +) -> list[dict[str, Any]]: + """Score pending proposals (default: all of them) — read-only, advisory. + + Raises TriageError if `triage.enabled` isn't `true` in config.yaml. + """ + cfg = triage_cfg(store) + if not cfg.enabled: + raise TriageError( + "triage is disabled; set triage.enabled: true in .vouch/config.yaml to opt in" + ) + use_embeddings = cfg.backend != "heuristic" + + if proposal_ids: + proposals = [store.get_proposal(pid) for pid in proposal_ids] + proposals = [p for p in proposals if p.status == ProposalStatus.PENDING] + else: + proposals = store.list_proposals(ProposalStatus.PENDING) + + out: list[dict[str, Any]] = [] + for p in proposals: + result = p.model_dump(mode="json") + result.setdefault("_meta", {})["vouch_triage"] = score_proposal( + store, p, weights=cfg.weights, use_embeddings=use_embeddings, + ) + out.append(result) + return out diff --git a/tests/test_triage.py b/tests/test_triage.py new file mode 100644 index 00000000..ed46b8c9 --- /dev/null +++ b/tests/test_triage.py @@ -0,0 +1,433 @@ +"""Advisory triage scoring over the pending-review queue — issue #322.""" + +from __future__ import annotations + +import json +from pathlib import Path + +import pytest +import yaml +from click.testing import CliRunner + +from vouch import triage +from vouch.cli import cli +from vouch.jsonl_server import HANDLERS, handle_request +from vouch.models import Claim, Entity, EntityType, Proposal, ProposalKind, ProposalStatus +from vouch.proposals import propose_claim, propose_entity +from vouch.storage import KBStore + +SIGNAL_NAMES = {"fit", "citation_quality", "duplication_risk", "contradiction_risk"} + + +@pytest.fixture +def store(tmp_path: Path) -> KBStore: + return KBStore.init(tmp_path) + + +def _enable_triage(store: KBStore, **overrides: object) -> None: + cfg = {"triage": {"enabled": True, **overrides}} + store.config_path.write_text(yaml.safe_dump(cfg), encoding="utf-8") + + +def _no_embedder(monkeypatch: pytest.MonkeyPatch) -> None: + def _raise(name: str | None = None) -> None: + raise KeyError("no embedder registered") + + monkeypatch.setattr("vouch.embeddings.get_embedder", _raise) + + +def _assert_block_shape(block: dict) -> None: + assert set(block) == {"recommendation", "score", "signals", "rationale"} + assert block["recommendation"] in {"approve", "reject", "needs-human"} + assert 0.0 <= block["score"] <= 1.0 + assert set(block["signals"]) == SIGNAL_NAMES + for sig in block["signals"].values(): + assert 0.0 <= sig["score"] <= 1.0 + assert isinstance(sig["reason"], str) and sig["reason"] + assert isinstance(block["rationale"], str) and block["rationale"] + + +# --- opt-in gate ------------------------------------------------------------- + + +def test_disabled_by_default_raises(store: KBStore) -> None: + with pytest.raises(triage.TriageError, match="disabled"): + triage.triage_pending(store) + + +def test_enabled_scores_pending_proposals(store: KBStore, monkeypatch: pytest.MonkeyPatch) -> None: + _no_embedder(monkeypatch) + _enable_triage(store) + src = store.put_source(b"evidence") + propose_claim(store, text="vouch requires citations", evidence=[src.id], proposed_by="agent") + results = triage.triage_pending(store) + assert len(results) == 1 + + +# --- output shape -------------------------------------------------------------- + + +def test_triage_block_shape(store: KBStore, monkeypatch: pytest.MonkeyPatch) -> None: + _no_embedder(monkeypatch) + _enable_triage(store) + src = store.put_source(b"evidence") + propose_claim(store, text="vouch requires citations", evidence=[src.id], proposed_by="agent") + [result] = triage.triage_pending(store) + assert result["kind"] == "claim" + _assert_block_shape(result["_meta"]["vouch_triage"]) + + +# --- no-write invariant --------------------------------------------------------- + + +def test_never_mutates_pending_queue(store: KBStore, monkeypatch: pytest.MonkeyPatch) -> None: + _no_embedder(monkeypatch) + _enable_triage(store) + src = store.put_source(b"evidence") + p1 = propose_claim(store, text="a claim", evidence=[src.id], proposed_by="agent").id + p2 = propose_entity(store, name="widget", entity_type="concept", proposed_by="agent").id + + before = {p.id for p in store.list_proposals(ProposalStatus.PENDING)} + triage.triage_pending(store) + after = {p.id for p in store.list_proposals(ProposalStatus.PENDING)} + + assert before == after == {p1, p2} + assert store.list_proposals(ProposalStatus.APPROVED) == [] + assert store.list_proposals(ProposalStatus.REJECTED) == [] + assert store.list_claims() == [] + assert store.list_entities() == [] + + +# --- citation_quality: reuses proposals._payload_block_reason ----------------- + + +def test_citation_quality_flags_dangling_ref_and_forces_reject( + store: KBStore, monkeypatch: pytest.MonkeyPatch, +) -> None: + _no_embedder(monkeypatch) + _enable_triage(store) + # Bypass propose_claim's own ref validation (store.put_proposal is raw + # I/O) to simulate a dangling reference slipping into the queue — + # the same shape proposals._payload_block_reason guards at approve time. + bad = Proposal( + id="bad-1", kind=ProposalKind.CLAIM, proposed_by="agent", + payload={ + "id": "c-bad", "text": "x", "type": "observation", "confidence": 0.7, + "evidence": ["missing-source"], "entities": [], "tags": [], + }, + ) + store.put_proposal(bad) + [result] = triage.triage_pending(store) + block = result["_meta"]["vouch_triage"] + assert block["signals"]["citation_quality"]["score"] == 0.0 + assert "missing-source" in block["signals"]["citation_quality"]["reason"] + assert block["recommendation"] == "reject" + + +def test_citation_quality_scores_clean_claim_positively( + store: KBStore, monkeypatch: pytest.MonkeyPatch, +) -> None: + _no_embedder(monkeypatch) + _enable_triage(store) + src = store.put_source(b"evidence") + propose_claim(store, text="a well cited claim", evidence=[src.id], proposed_by="agent") + [result] = triage.triage_pending(store) + assert result["_meta"]["vouch_triage"]["signals"]["citation_quality"]["score"] > 0.0 + + +# --- duplication_risk: heuristic fallback (default in this dev env) ---------- + + +def test_duplication_risk_heuristic_fallback_flags_near_duplicate( + store: KBStore, monkeypatch: pytest.MonkeyPatch, +) -> None: + _no_embedder(monkeypatch) + _enable_triage(store) + src = store.put_source(b"evidence") + text = "auth uses jwts in the authorization header for every request" + store.put_claim(Claim(id="c1", text=text, evidence=[src.id])) + propose_claim(store, text=text, evidence=[src.id], proposed_by="agent") + [result] = triage.triage_pending(store) + dup = result["_meta"]["vouch_triage"]["signals"]["duplication_risk"] + assert dup["score"] > 0.9 + assert "heuristic backend" in dup["reason"] + assert "c1" in dup["reason"] + + +def test_duplication_risk_heuristic_no_match_for_unrelated_text( + store: KBStore, monkeypatch: pytest.MonkeyPatch, +) -> None: + _no_embedder(monkeypatch) + _enable_triage(store) + src = store.put_source(b"evidence") + store.put_claim(Claim(id="c1", text="apples and oranges", evidence=[src.id])) + propose_claim( + store, text="zebras run fast in the savanna", evidence=[src.id], proposed_by="agent", + ) + [result] = triage.triage_pending(store) + dup = result["_meta"]["vouch_triage"]["signals"]["duplication_risk"] + assert dup["score"] == 0.0 + assert "heuristic backend" in dup["reason"] + + +def test_duplication_risk_relation_exact_match( + store: KBStore, monkeypatch: pytest.MonkeyPatch, +) -> None: + _no_embedder(monkeypatch) + _enable_triage(store) + from vouch.models import Relation + + store.put_entity(Entity(id="a", name="A", type=EntityType.CONCEPT)) + store.put_entity(Entity(id="b", name="B", type=EntityType.CONCEPT)) + store.put_relation( + Relation(id="a--relates_to--b", source="a", relation="relates_to", target="b") + ) + dup_proposal = Proposal( + id="rel-1", kind=ProposalKind.RELATION, proposed_by="agent", + payload={ + "id": "a--relates_to--b-2", "source": "a", "relation": "relates_to", + "target": "b", "confidence": 0.7, "evidence": [], + }, + ) + store.put_proposal(dup_proposal) + [result] = triage.triage_pending(store) + dup = result["_meta"]["vouch_triage"]["signals"]["duplication_risk"] + assert dup["score"] == 1.0 + assert "already approved" in dup["reason"] + + +# --- fit: entity-overlap heuristic (no embeddings needed) --------------------- + + +def test_fit_scores_high_when_entities_already_known( + store: KBStore, monkeypatch: pytest.MonkeyPatch, +) -> None: + _no_embedder(monkeypatch) + _enable_triage(store) + store.put_entity(Entity(id="jwt", name="JWT", type=EntityType.CONCEPT)) + src = store.put_source(b"evidence") + propose_claim( + store, text="jwt tokens expire after an hour", evidence=[src.id], + entities=["jwt"], proposed_by="agent", + ) + [result] = triage.triage_pending(store) + fit = result["_meta"]["vouch_triage"]["signals"]["fit"] + assert fit["score"] == 1.0 + + +def test_fit_neutral_when_no_entities_referenced( + store: KBStore, monkeypatch: pytest.MonkeyPatch, +) -> None: + _no_embedder(monkeypatch) + _enable_triage(store) + src = store.put_source(b"evidence") + propose_claim(store, text="an unrelated observation", evidence=[src.id], proposed_by="agent") + [result] = triage.triage_pending(store) + fit = result["_meta"]["vouch_triage"]["signals"]["fit"] + assert fit["score"] == 0.5 + + +# --- contradiction_risk -------------------------------------------------------- + + +def test_contradiction_risk_flags_polarity_conflict( + store: KBStore, monkeypatch: pytest.MonkeyPatch, +) -> None: + _no_embedder(monkeypatch) + _enable_triage(store) + store.put_entity(Entity(id="api", name="API", type=EntityType.CONCEPT)) + src = store.put_source(b"evidence") + store.put_claim(Claim( + id="c1", text="the api requires an auth token for every request", + evidence=[src.id], entities=["api"], + )) + propose_claim( + store, text="the api does not require an auth token for every request", + evidence=[src.id], entities=["api"], proposed_by="agent", + ) + [result] = triage.triage_pending(store) + conflict = result["_meta"]["vouch_triage"]["signals"]["contradiction_risk"] + assert conflict["score"] > 0.0 + assert "c1" in conflict["reason"] + + +def test_contradiction_risk_no_conflict_without_shared_entity( + store: KBStore, monkeypatch: pytest.MonkeyPatch, +) -> None: + _no_embedder(monkeypatch) + _enable_triage(store) + src = store.put_source(b"evidence") + store.put_claim(Claim( + id="c1", text="the api requires an auth token for every request", + evidence=[src.id], + )) + propose_claim( + store, text="the api does not require an auth token for every request", + evidence=[src.id], proposed_by="agent", + ) + [result] = triage.triage_pending(store) + conflict = result["_meta"]["vouch_triage"]["signals"]["contradiction_risk"] + assert conflict["score"] == 0.0 + + +def test_contradiction_risk_not_applicable_to_non_claim_kind( + store: KBStore, monkeypatch: pytest.MonkeyPatch, +) -> None: + _no_embedder(monkeypatch) + _enable_triage(store) + propose_entity(store, name="widget", entity_type="concept", proposed_by="agent") + [result] = triage.triage_pending(store) + conflict = result["_meta"]["vouch_triage"]["signals"]["contradiction_risk"] + assert conflict["score"] == 0.0 + assert "only assessed for claim proposals" in conflict["reason"] + + +# --- embeddings-present path (requires numpy; skipped without it) ------------ + + +@pytest.fixture +def _mock_embedder() -> None: + pytest.importorskip("numpy") + from tests.embeddings._fakes import MockEmbedder + from vouch.embeddings import register + from vouch.embeddings.base import DEFAULT_MODEL_NAME + + register(DEFAULT_MODEL_NAME, lambda: MockEmbedder(dim=8)) + + +def test_duplication_risk_embedding_backend_flags_exact_duplicate( + store: KBStore, _mock_embedder: None, +) -> None: + _enable_triage(store) + src = store.put_source(b"evidence") + text = "auth uses jwts in the authorization header" + store.put_claim(Claim(id="c1", text=text, evidence=[src.id])) + propose_claim(store, text=text, evidence=[src.id], proposed_by="agent") + [result] = triage.triage_pending(store) + block = result["_meta"]["vouch_triage"] + dup = block["signals"]["duplication_risk"] + assert dup["score"] >= 0.95 + assert "embedding backend" in dup["reason"] + # A near-duplicate hit is penalized by duplication_risk and must not + # also inflate fit via the same signal (see _topical_fit_scores). + assert block["recommendation"] != "approve" + + +def test_backend_heuristic_config_forces_fallback_even_with_embedder( + store: KBStore, _mock_embedder: None, +) -> None: + _enable_triage(store, backend="heuristic") + src = store.put_source(b"evidence") + text = "auth uses jwts in the authorization header" + store.put_claim(Claim(id="c1", text=text, evidence=[src.id])) + propose_claim(store, text=text, evidence=[src.id], proposed_by="agent") + [result] = triage.triage_pending(store) + dup = result["_meta"]["vouch_triage"]["signals"]["duplication_risk"] + assert "heuristic backend" in dup["reason"] + + +# --- proposal_ids filter / config plumbing ------------------------------------ + + +def test_proposal_ids_filters_to_subset(store: KBStore, monkeypatch: pytest.MonkeyPatch) -> None: + _no_embedder(monkeypatch) + _enable_triage(store) + src = store.put_source(b"evidence") + p1 = propose_claim(store, text="first claim", evidence=[src.id], proposed_by="agent").id + propose_claim(store, text="second claim", evidence=[src.id], proposed_by="agent") + results = triage.triage_pending(store, proposal_ids=[p1]) + assert [r["id"] for r in results] == [p1] + + +def test_custom_weights_read_from_config(store: KBStore) -> None: + custom_weights = { + "fit": 1.0, "citation_quality": 0.0, "duplication_risk": 0.0, "contradiction_risk": 0.0, + } + _enable_triage(store, weights=custom_weights) + cfg = triage.triage_cfg(store) + assert cfg.weights == custom_weights + + +def test_disabled_config_value_keeps_default_false(store: KBStore) -> None: + raw = yaml.safe_dump({"triage": {"weights": {"fit": 0.9}}}) + store.config_path.write_text(raw, encoding="utf-8") + cfg = triage.triage_cfg(store) + assert cfg.enabled is False + + +# --- registration sites -------------------------------------------------------- + + +def test_jsonl_handler_registered() -> None: + assert "kb.triage_pending" in HANDLERS + + +def test_jsonl_triage_pending_disabled_returns_invalid_request( + store: KBStore, monkeypatch: pytest.MonkeyPatch, +) -> None: + import vouch.jsonl_server as jsonl_server + + monkeypatch.setattr(jsonl_server, "_store", lambda: store) + resp = handle_request({"id": "1", "method": "kb.triage_pending", "params": {}}) + assert resp["ok"] is False + assert resp["error"]["code"] == "invalid_request" + + +def test_jsonl_triage_pending_enabled_returns_blocks( + store: KBStore, monkeypatch: pytest.MonkeyPatch, +) -> None: + import vouch.jsonl_server as jsonl_server + + _no_embedder(monkeypatch) + _enable_triage(store) + src = store.put_source(b"evidence") + propose_claim(store, text="a claim", evidence=[src.id], proposed_by="agent") + monkeypatch.setattr(jsonl_server, "_store", lambda: store) + resp = handle_request({"id": "1", "method": "kb.triage_pending", "params": {}}) + assert resp["ok"] is True + [item] = resp["result"] + _assert_block_shape(item["_meta"]["vouch_triage"]) + + +def test_cli_triage_disabled_shows_clean_error( + store: KBStore, monkeypatch: pytest.MonkeyPatch, +) -> None: + monkeypatch.chdir(store.root) + result = CliRunner().invoke(cli, ["triage"]) + assert result.exit_code != 0 + assert "Traceback" not in result.output + assert "Error:" in result.output + assert "disabled" in result.output + + +def test_cli_triage_json_output(store: KBStore, monkeypatch: pytest.MonkeyPatch) -> None: + _no_embedder(monkeypatch) + _enable_triage(store) + src = store.put_source(b"evidence") + propose_claim(store, text="a claim", evidence=[src.id], proposed_by="agent") + monkeypatch.chdir(store.root) + result = CliRunner().invoke(cli, ["triage", "--json"]) + assert result.exit_code == 0, result.output + data = json.loads(result.output) + _assert_block_shape(data[0]["_meta"]["vouch_triage"]) + + +def test_cli_triage_sorts_ranked_table(store: KBStore, monkeypatch: pytest.MonkeyPatch) -> None: + _no_embedder(monkeypatch) + _enable_triage(store) + src = store.put_source(b"evidence") + propose_claim(store, text="a well cited unique claim", evidence=[src.id], proposed_by="agent") + bad = Proposal( + id="bad-1", kind=ProposalKind.CLAIM, proposed_by="agent", + payload={ + "id": "c-bad", "text": "y", "type": "observation", "confidence": 0.7, + "evidence": ["missing-source"], "entities": [], "tags": [], + }, + ) + store.put_proposal(bad) + monkeypatch.chdir(store.root) + result = CliRunner().invoke(cli, ["triage"]) + assert result.exit_code == 0, result.output + lines = [ln for ln in result.output.splitlines() if ln and ln[0].isdigit()] + scores = [float(ln.split()[0]) for ln in lines] + assert scores == sorted(scores, reverse=True) From f2b554c5db9e7254dffddbdd343f821875d18d78 Mon Sep 17 00:00:00 2001 From: jsdevninja Date: Thu, 2 Jul 2026 23:39:25 -0500 Subject: [PATCH 061/123] feat(diff): register kb.diff at all four kb.* surface sites MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit vouch diff shipped CLI-only in 0.1.0, an explicit non-goal at the time ("MCP/JSONL parity ... kb.* surface unchanged"). that leaves it the only read method skipping the four-site registration convention documented in CLAUDE.md, so agents talking MCP/JSONL have no way to fetch a revision diff. adds the kb_diff MCP tool, the kb.diff JSONL handler, and the capabilities.METHODS entry, next to the other by-id read tools (kb_read_claim/kb_read_page) with the same unrestricted-read posture. also makes new_id optional for a superseded claim: diff_artifacts and the CLI both resolve it from superseded_by when omitted, erroring clearly when there's no successor (pages still require an explicit new_id — they have no successor pointer). closes #327. --- CHANGELOG.md | 8 ++ .../specs/2026-05-25-vouch-diff-design.md | 42 +++++++- src/vouch/capabilities.py | 1 + src/vouch/cli.py | 10 +- src/vouch/diff.py | 21 +++- src/vouch/jsonl_server.py | 9 ++ src/vouch/server.py | 12 +++ tests/test_diff.py | 98 +++++++++++++++++++ 8 files changed, 191 insertions(+), 10 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 71809356..2f70d287 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -98,6 +98,14 @@ All notable changes to vouch are documented here. Format follows ## [1.1.0] — 2026-07-03 ### Added +- `kb.diff` — `vouch diff ` (0.1.0) now has full `kb.*` + parity: an MCP tool and a JSONL `kb.diff` handler alongside the existing + CLI, registered in `capabilities.METHODS` like every other read method. + `` is now optional for a claim: omitting it resolves the diff + against `superseded_by`, with a clear error when the claim has no + successor (pages still require an explicit `new_id` — they have no + successor pointer). Read-only throughout; still no writes, proposals, or + audit events (#327). - auto-capture: claude code sessions are harvested via hooks and filed as a single pending session-summary proposal for human approval. a `PostToolUse` hook (`vouch capture observe`) appends compact tool-use observations to an diff --git a/docs/superpowers/specs/2026-05-25-vouch-diff-design.md b/docs/superpowers/specs/2026-05-25-vouch-diff-design.md index f5bb4ea0..5bd1f862 100644 --- a/docs/superpowers/specs/2026-05-25-vouch-diff-design.md +++ b/docs/superpowers/specs/2026-05-25-vouch-diff-design.md @@ -23,7 +23,14 @@ field. Read-only: no writes, no proposals, no audit events. `last_confirmed_at`, `approved_by`). - **Line-diff the long text.** `claim.text` / `page.body` render as a `difflib` unified diff; everything else as `field: old → new`. -- **CLI-only.** Read-only inspection; does not touch the `kb.*` capability set. +- **Full `kb.*` parity.** Registered as `kb.diff` at all four sites (MCP tool, + JSONL handler, `capabilities.METHODS`, CLI) like any other read method — + see "MCP/JSONL parity" under Non-goals below for the superseded original + call on this. +- **Omitted `new_id` resolves via `superseded_by`.** For a claim, `new_id` is + optional; when omitted it resolves to `old_claim.superseded_by`, erroring + clearly if that's unset. Pages have no successor pointer, so `new_id` is + required for a page. ## Components — `src/vouch/diff.py` @@ -37,7 +44,10 @@ Raised for unknown ids and mismatched kinds. `kind: str, old_id: str, new_id: str, changes: list[FieldChange], text_diff: list[str]`. -### `diff_artifacts(store, old_id, new_id) -> ArtifactDiff` +### `diff_artifacts(store, old_id, new_id=None) -> ArtifactDiff` +- **`new_id` resolution:** if omitted, `old_id` must resolve to a claim with + `superseded_by` set — that becomes `new_id`. A page, or a claim without a + successor, raises `DiffError` naming the id. - **Kind resolution:** try `store.get_claim` on both ids → both succeed ⇒ `kind="claim"`. Otherwise try `store.get_page` on both → `kind="page"`. If an id resolves to neither, raise `DiffError("unknown artifact: ")`. If one is @@ -55,7 +65,7 @@ Field sets (long text field rendered as `text_diff`, the rest as changes): - **Page** — body *(diff)*; title, type, status, claims, entities, sources, tags. -## CLI — `vouch diff OLD NEW [--json]` +## CLI — `vouch diff OLD [NEW] [--json]` Follows existing patterns (`_load_store`, `_cli_errors`, `_emit_json`). @@ -74,6 +84,20 @@ diff claim - `--json` → `_emit_json` of the `ArtifactDiff` as a dict. - No differences → prints `no differences`. +## `kb.diff` — MCP + JSONL + +Same read as the CLI, exposed for agents: + +- **MCP** `kb_diff(old_id, new_id=None) -> dict` in `server.py`, next to + `kb_read_claim`/`kb_read_page` in the unrestricted-read section. +- **JSONL** `_h_diff` reads `params["old_id"]` (required) and + `params["new_id"]` (optional) — `kb.diff` in `HANDLERS`. +- **capabilities** `kb.diff` in `METHODS`, next to `kb.read_relation`. +- Both return `dataclasses.asdict(ArtifactDiff)`. +- Unrestricted like the other by-id read tools (`kb_read_claim`, + `kb_read_page`) — no `ViewerContext`/scope filtering, since resolving a + *specific known id* carries the same exposure either way. + ## Error handling - Unknown id (neither claim nor page) → `DiffError` → clean CLI `Error:` line. @@ -90,6 +114,14 @@ diff claim ## Non-goals -- Following supersede chains automatically (caller passes both ids). +- Following supersede chains more than one hop (omitted `new_id` resolves one + `superseded_by` link, not the full chain to the latest revision). - Diffing entities/relations/sources (claims and pages only, per ROADMAP). -- MCP/JSONL parity (`kb.*` surface unchanged). +- `ViewerContext` scope filtering on `kb.diff` (see "MCP + JSONL" above — + matches the other by-id read tools). + +Superseded decision from the original design: "MCP/JSONL parity" was +initially scoped out ("CLI-only... does not touch the `kb.*` capability +set"). Issue #327 pointed out this leaves `kb.diff` as the only read method +skipping the four-site registration convention (`CLAUDE.md` §"When you add a +new kb.* method"), so it was added — see "MCP + JSONL" above. diff --git a/src/vouch/capabilities.py b/src/vouch/capabilities.py index 3fd21c75..749c10a6 100644 --- a/src/vouch/capabilities.py +++ b/src/vouch/capabilities.py @@ -27,6 +27,7 @@ "kb.read_claim", "kb.read_entity", "kb.read_relation", + "kb.diff", "kb.list_pages", "kb.list_claims", "kb.list_entities", diff --git a/src/vouch/cli.py b/src/vouch/cli.py index a490fcf9..992c8a6a 100644 --- a/src/vouch/cli.py +++ b/src/vouch/cli.py @@ -2979,10 +2979,14 @@ def sync_apply_cmd(source_path: str, on_conflict: str) -> None: @cli.command() @click.argument("old_id") -@click.argument("new_id") +@click.argument("new_id", required=False) @click.option("--json", "as_json", is_flag=True, default=False, help="Emit the diff as JSON.") -def diff(old_id: str, new_id: str, as_json: bool) -> None: - """Show what changed between two claim or two page revisions.""" +def diff(old_id: str, new_id: str | None, as_json: bool) -> None: + """Show what changed between two claim or two page revisions. + + NEW_ID is optional for a claim that has been superseded: it resolves to + ``superseded_by`` automatically. + """ from .diff import diff_artifacts store = _load_store() diff --git a/src/vouch/diff.py b/src/vouch/diff.py index 8387afa0..392072e2 100644 --- a/src/vouch/diff.py +++ b/src/vouch/diff.py @@ -72,11 +72,28 @@ def _line_diff(old: str, new: str) -> list[str]: )) -def diff_artifacts(store: KBStore, old_id: str, new_id: str) -> ArtifactDiff: - """Diff two same-kind artifacts (both claims or both pages) by id.""" +def diff_artifacts(store: KBStore, old_id: str, new_id: str | None = None) -> ArtifactDiff: + """Diff two same-kind artifacts (both claims or both pages) by id. + + ``new_id`` is optional for claims: when omitted, it resolves to + ``old_id``'s ``superseded_by`` field. Pages have no successor pointer, so + omitting ``new_id`` for a page is an error. + """ old_kind = _kind_of(store, old_id) if old_kind is None: raise DiffError(f"unknown artifact: {old_id}") + + if new_id is None: + if old_kind != "claim": + raise DiffError( + f"{old_id} is a {old_kind}; pages have no successor pointer, " + "pass new_id explicitly" + ) + old_claim = store.get_claim(old_id) + if not old_claim.superseded_by: + raise DiffError(f"{old_id} has not been superseded; pass new_id explicitly") + new_id = old_claim.superseded_by + new_kind = _kind_of(store, new_id) if new_kind is None: raise DiffError(f"unknown artifact: {new_id}") diff --git a/src/vouch/jsonl_server.py b/src/vouch/jsonl_server.py index 5e3b62b7..b1dbbc50 100644 --- a/src/vouch/jsonl_server.py +++ b/src/vouch/jsonl_server.py @@ -249,6 +249,14 @@ def _h_read_relation(p: dict) -> dict: return _store().get_relation(p["relation_id"]).model_dump(mode="json") +def _h_diff(p: dict) -> dict: + from dataclasses import asdict + + from .diff import diff_artifacts + + return asdict(diff_artifacts(_store(), p["old_id"], p.get("new_id"))) + + def _h_list_pages(p: dict) -> list[dict]: pages = filter_pages( _store().list_pages(), @@ -723,6 +731,7 @@ def _h_propose_theme(p: dict) -> dict: "kb.read_claim": _h_read_claim, "kb.read_entity": _h_read_entity, "kb.read_relation": _h_read_relation, + "kb.diff": _h_diff, "kb.list_pages": _h_list_pages, "kb.list_claims": _h_list_claims, "kb.list_entities": _h_list_entities, diff --git a/src/vouch/server.py b/src/vouch/server.py index 8cabee08..d4aff659 100644 --- a/src/vouch/server.py +++ b/src/vouch/server.py @@ -309,6 +309,18 @@ def kb_read_relation(relation_id: str) -> dict[str, Any]: raise ValueError(str(e)) from e +@mcp.tool() +def kb_diff(old_id: str, new_id: str | None = None) -> dict[str, Any]: + """Field-level diff between two claim revisions or two page revisions. + + new_id is optional for a superseded claim: resolves to superseded_by. + """ + from dataclasses import asdict + + from .diff import diff_artifacts + return asdict(diff_artifacts(_store(), old_id, new_id)) + + @mcp.tool() def kb_list_pages( *, diff --git a/tests/test_diff.py b/tests/test_diff.py index 4189d806..f26c063a 100644 --- a/tests/test_diff.py +++ b/tests/test_diff.py @@ -7,8 +7,11 @@ import pytest from click.testing import CliRunner +from vouch import audit +from vouch.capabilities import capabilities from vouch.cli import cli from vouch.diff import ArtifactDiff, DiffError, diff_artifacts +from vouch.jsonl_server import HANDLERS, handle_request from vouch.models import Claim, ClaimStatus, Page from vouch.storage import KBStore @@ -80,6 +83,36 @@ def test_diff_mismatched_kinds_raises(store: KBStore) -> None: diff_artifacts(store, "c1", "p1") +def test_diff_omitted_new_id_resolves_via_superseded_by(store: KBStore) -> None: + _claim(store, "c2", text="new wording") + _claim(store, "c1", text="old wording", superseded_by="c2") + d = diff_artifacts(store, "c1") + assert d.new_id == "c2" + assert any(line.startswith("+new wording") for line in d.text_diff) + + +def test_diff_omitted_new_id_without_successor_raises(store: KBStore) -> None: + _claim(store, "c1") + with pytest.raises(DiffError, match="has not been superseded"): + diff_artifacts(store, "c1") + + +def test_diff_omitted_new_id_for_page_raises(store: KBStore) -> None: + store.put_page(Page(id="p1", title="P", body="b")) + with pytest.raises(DiffError, match="pages have no successor pointer"): + diff_artifacts(store, "p1") + + +def test_diff_read_only_writes_no_audit_event_or_proposal(store: KBStore) -> None: + _claim(store, "c1", text="old") + _claim(store, "c2", text="new") + before = list(audit.read_events(store.kb_dir)) + diff_artifacts(store, "c1", "c2") + after = list(audit.read_events(store.kb_dir)) + assert after == before + assert store.list_proposals() == [] + + # --- CLI ------------------------------------------------------------------ @@ -127,3 +160,68 @@ def test_cli_diff_unknown_id_clean_error( assert res.exit_code != 0 assert "Traceback" not in res.output assert "unknown artifact: nope" in res.output + + +def test_cli_diff_omitted_new_id_resolves_successor( + store: KBStore, monkeypatch: pytest.MonkeyPatch, +) -> None: + monkeypatch.chdir(store.root) + _claim(store, "c2", text="new") + _claim(store, "c1", text="old", superseded_by="c2") + res = CliRunner().invoke(cli, ["diff", "c1"]) + assert res.exit_code == 0, res.output + assert "diff claim c1 → c2" in res.output + + +def test_cli_diff_omitted_new_id_clean_error( + store: KBStore, monkeypatch: pytest.MonkeyPatch, +) -> None: + monkeypatch.chdir(store.root) + _claim(store, "c1") + res = CliRunner().invoke(cli, ["diff", "c1"]) + assert res.exit_code != 0 + assert "Traceback" not in res.output + assert "has not been superseded" in res.output + + +# --- kb.* RPC surface ------------------------------------------------------- + + +def test_diff_method_in_capabilities() -> None: + methods = set(capabilities().methods) + assert "kb.diff" in methods + assert set(capabilities().methods) == set(HANDLERS.keys()) + + +def test_kb_diff_over_jsonl(store: KBStore, monkeypatch: pytest.MonkeyPatch) -> None: + monkeypatch.chdir(store.root) + _claim(store, "c1", status=ClaimStatus.WORKING) + _claim(store, "c2", status=ClaimStatus.STABLE) + resp = handle_request( + {"id": "1", "method": "kb.diff", "params": {"old_id": "c1", "new_id": "c2"}} + ) + assert resp["ok"] is True, resp + assert resp["result"]["kind"] == "claim" + changed = {c["field"]: (c["old"], c["new"]) for c in resp["result"]["changes"]} + assert changed["status"] == ("working", "stable") + + +def test_kb_diff_missing_param_over_jsonl( + store: KBStore, monkeypatch: pytest.MonkeyPatch, +) -> None: + monkeypatch.chdir(store.root) + resp = handle_request({"id": "2", "method": "kb.diff", "params": {}}) + assert resp["ok"] is False + assert resp["error"]["code"] == "missing_param" + + +def test_kb_diff_unknown_id_over_jsonl( + store: KBStore, monkeypatch: pytest.MonkeyPatch, +) -> None: + monkeypatch.chdir(store.root) + _claim(store, "c1") + resp = handle_request( + {"id": "3", "method": "kb.diff", "params": {"old_id": "c1", "new_id": "nope"}} + ) + assert resp["ok"] is False + assert resp["error"]["code"] == "invalid_request" From b4fd4691a61100ba395f5f6b549dd56f487b1315 Mon Sep 17 00:00:00 2001 From: dripsmvcp <138900956+dripsmvcp@users.noreply.github.com> Date: Mon, 6 Jul 2026 17:32:36 +0900 Subject: [PATCH 062/123] fix(jsonl): define module logger after the import block MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit #361 inserted `_log = logging.getLogger(...)` between two import groups in jsonl_server.py. that statement-among-imports trips ruff's E402 on every import that follows it, so `ruff check src tests` — the lint gate in ci — now fails on the whole repo. move the logger definition below the imports (where storage.py already keeps its own module logger); no behaviour change. --- src/vouch/jsonl_server.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/vouch/jsonl_server.py b/src/vouch/jsonl_server.py index 8aea8cab..97b4753c 100644 --- a/src/vouch/jsonl_server.py +++ b/src/vouch/jsonl_server.py @@ -40,8 +40,6 @@ from .capabilities import capabilities as build_caps from .context import build_context_pack from .logging_config import configure_logging - -_log = logging.getLogger("vouch.jsonl_server") from .models import ProposalStatus from .page_filters import filter_pages from .proposals import ( @@ -65,6 +63,8 @@ ) from .synthesize import synthesize +_log = logging.getLogger("vouch.jsonl_server") + # Per-request actor override. The HTTP transport sets this from the # X-Vouch-Agent header so audit attribution is correct without mutating # process-wide env (each ThreadingHTTPServer request thread gets its own From 1a3f1c3dc3e4006db9beab60443178342dc80d19 Mon Sep 17 00:00:00 2001 From: dripsmvcp <138900956+dripsmvcp@users.noreply.github.com> Date: Mon, 6 Jul 2026 16:11:49 +0900 Subject: [PATCH 063/123] feat(adapters): toml_merge install strategy for codex config.toml .codex/config.toml is codex's primary config file, so the plain-copy path silently skipped any project where codex was already configured and vouch never got wired. add a toml_merge entry flag mirroring json_merge: parse the existing destination with tomllib, deep-merge the template's tables into it (existing user values always win on conflict), and write back. flip the codex T1 entry to toml_merge. writing uses a minimal hand-rolled serializer (tables, arrays, inline tables in arrays, scalars, datetimes) so the dependency set stays unchanged; the output must survive a tomllib round-trip back to the merged data, and anything the serializer can't faithfully re-emit degrades to skipped rather than risking the user's config. closes #384 --- adapters/codex/install.yaml | 6 +- src/vouch/install_adapter.py | 180 ++++++++++++++++++++++++++++++++- tests/test_install_adapter.py | 183 ++++++++++++++++++++++++++++++++++ 3 files changed, 365 insertions(+), 4 deletions(-) diff --git a/adapters/codex/install.yaml b/adapters/codex/install.yaml index 7ba68b2f..3e41ef45 100644 --- a/adapters/codex/install.yaml +++ b/adapters/codex/install.yaml @@ -3,8 +3,12 @@ # Codex reads `/.codex/config.toml` (also `~/.codex/config.toml` for # user-global). We ship the project-local form so `vouch install-mcp codex` # doesn't touch home-directory state -- see issue #179 scope decision. +# +# `.codex/config.toml` is codex's *primary* config file (model, approval +# policy, other MCP servers), so T1 deep-merges into an existing one instead +# of skipping it -- see issue #384. Existing user values always win. host: codex pretty: OpenAI Codex CLI tiers: T1: - - { src: config.toml, dst: .codex/config.toml } + - { src: config.toml, dst: .codex/config.toml, toml_merge: true } diff --git a/src/vouch/install_adapter.py b/src/vouch/install_adapter.py index ba4f0b1c..abc426af 100644 --- a/src/vouch/install_adapter.py +++ b/src/vouch/install_adapter.py @@ -12,6 +12,9 @@ inside a `` ... `` block (``InstallResult.appended``). If the fence already exists, the file is treated as skipped -- so reruns of ``vouch install-mcp`` stay flat-noop. +* **settings.json with ``json_merge`` / config.toml with ``toml_merge``** -> + an existing destination is deep-merged into instead of skipped + (``InstallResult.merged``); the user's existing values always win. Tiers stack from T1 (the minimum: MCP wire) through T4 (full integration: slash commands and host-side hooks). Each manifest declares only the tiers @@ -27,8 +30,11 @@ from __future__ import annotations +import datetime import json +import re import shutil +import tomllib from dataclasses import dataclass, field from pathlib import Path from typing import Any @@ -75,6 +81,7 @@ class _FileEntry: dst: str # path relative to the target directory fenced_append: bool = False # CLAUDE.md-style: append inside our fence json_merge: bool = False # settings.json-style: deep-merge into existing + toml_merge: bool = False # config.toml-style: deep-merge into existing @dataclass(frozen=True) @@ -135,10 +142,32 @@ def _load_manifest(host: str) -> _Manifest: raise AdapterError( f"{host}: install.yaml tier {tier_name}: every entry needs a non-empty `dst`" ) - fenced = bool(raw.get("fenced_append", False)) - json_merge = bool(raw.get("json_merge", False)) + def _flag(name: str, raw: Any = raw, tier_name: str = tier_name) -> bool: + # Require an actual YAML boolean. `bool(raw.get(...))` would + # coerce a mistakenly-quoted `toml_merge: "false"` (a + # non-empty string) to True and silently enable a merge + # strategy, so reject anything that isn't a real bool. + val = raw.get(name, False) + if not isinstance(val, bool): + raise AdapterError( + f"{host}: install.yaml tier {tier_name}: `{name}` must be " + f"a boolean, got {type(val).__name__} ({val!r})" + ) + return val + + fenced = _flag("fenced_append") + json_merge = _flag("json_merge") + toml_merge = _flag("toml_merge") + if fenced + json_merge + toml_merge > 1: + raise AdapterError( + f"{host}: install.yaml tier {tier_name}: entry sets more than " + f"one of fenced_append/json_merge/toml_merge; pick one strategy" + ) parsed_entries.append( - _FileEntry(src=src, dst=dst, fenced_append=fenced, json_merge=json_merge) + _FileEntry( + src=src, dst=dst, fenced_append=fenced, + json_merge=json_merge, toml_merge=toml_merge, + ) ) if parsed_entries: parsed[tier_name] = parsed_entries @@ -224,6 +253,10 @@ def install(adapter: str, *, target: Path, tier: str = "T4") -> InstallResult: _install_json_merge(src, dst, result, entry.dst) continue + if entry.toml_merge: + _install_toml_merge(src, dst, result, entry.dst) + continue + if dst.exists(): result.skipped.append(entry.dst) continue @@ -389,3 +422,144 @@ def _install_json_merge( result.merged.append(rel_dst) else: result.skipped.append(rel_dst) + + +def _merge_toml(src: dict[str, Any], dst: dict[str, Any]) -> bool: + """Recursively add ``src`` keys missing from ``dst`` in place. Returns + True if ``dst`` changed. Same never-clobber convention as + :func:`_merge_settings`: on any conflict — a key present on both sides + with non-table values, or with mismatched types — the user's existing + ``dst`` value wins and only genuinely missing nested keys are filled in. + Idempotent: re-merging the same ``src`` reports no change. + """ + changed = False + for key, src_val in src.items(): + if key not in dst: + dst[key] = src_val + changed = True + continue + dst_val = dst[key] + if ( + isinstance(src_val, dict) + and isinstance(dst_val, dict) + and _merge_toml(src_val, dst_val) + ): + changed = True + return changed + + +_BARE_TOML_KEY = re.compile(r"[A-Za-z0-9_-]+") + + +def _toml_key(key: str) -> str: + if _BARE_TOML_KEY.fullmatch(key): + return key + # TOML basic strings share JSON's escape rules, so json.dumps is a + # valid quoted-key serializer. + return json.dumps(key) + + +def _toml_inline(value: Any) -> str: + if isinstance(value, bool): + return "true" if value else "false" + if isinstance(value, int): + return str(value) + if isinstance(value, float): + if value != value or value in (float("inf"), float("-inf")): + raise ValueError(f"non-finite float not serialized: {value!r}") + return repr(value) + if isinstance(value, str): + return json.dumps(value) + if isinstance(value, (datetime.datetime, datetime.date, datetime.time)): + return value.isoformat() + if isinstance(value, list): + return "[" + ", ".join(_toml_inline(v) for v in value) + "]" + if isinstance(value, dict): + pairs = ", ".join( + f"{_toml_key(str(k))} = {_toml_inline(v)}" for k, v in value.items() + ) + return "{" + pairs + "}" + raise ValueError(f"unsupported TOML value type: {type(value).__name__}") + + +def _emit_toml_table( + table: dict[str, Any], path: list[str], lines: list[str] +) -> None: + plain = [(k, v) for k, v in table.items() if not isinstance(v, dict)] + subs = [(k, v) for k, v in table.items() if isinstance(v, dict)] + # A header is only needed for the table's own keys, or to make an empty + # table exist at all; sub-table headers imply their parents. + if path and (plain or not subs): + if lines: + lines.append("") + lines.append("[" + ".".join(_toml_key(p) for p in path) + "]") + for key, value in plain: + lines.append(f"{_toml_key(str(key))} = {_toml_inline(value)}") + for key, value in subs: + _emit_toml_table(value, [*path, str(key)], lines) + + +def _toml_dumps(data: dict[str, Any]) -> str: + """Serialize the merged config back to TOML. + + Deliberately minimal — covers the shapes tomllib can produce from the + configs we merge into (tables, arrays, inline tables inside arrays, + scalars, datetimes), not the whole spec. Lists containing tables are + emitted as arrays of inline tables rather than ``[[table]]`` blocks. + Raises ValueError on anything it can't faithfully re-emit; the caller + treats that as "leave the user's file alone". + """ + lines: list[str] = [] + _emit_toml_table(data, [], lines) + return "\n".join(lines) + "\n" if lines else "" + + +def _install_toml_merge( + src: Path, dst: Path, result: InstallResult, rel_dst: str +) -> None: + """config.toml-style: deep-merge our tables into a pre-existing TOML + file instead of skipping it. ``.codex/config.toml`` is codex's primary + config file, so a plain copy-or-skip would leave vouch unwired on any + project where codex is already configured (vouchdev/vouch#384). + + States mirror :func:`_install_json_merge`: + + * dst missing -> copy fresh (``written``) + * dst exists, merge adds keys -> merge + rewrite (``merged``) + * dst exists, nothing to add -> skip (``skipped``); already installed + * dst exists, unparseable -> skip (``skipped``); never clobber the user + + Rewriting re-serializes the whole file (comments and formatting are not + preserved — same trade-off ``_install_json_merge`` already makes). The + serialized result must survive a tomllib round-trip back to the merged + data; anything the minimal serializer can't faithfully re-emit degrades + to ``skipped`` rather than risking the user's config. + """ + if not dst.exists(): + dst.parent.mkdir(parents=True, exist_ok=True) + shutil.copy2(src, dst) + result.written.append(rel_dst) + return + + try: + dst_data = tomllib.loads(dst.read_text(encoding="utf-8")) + src_data = tomllib.loads(src.read_text(encoding="utf-8")) + except (OSError, UnicodeDecodeError, tomllib.TOMLDecodeError): + # Malformed or unreadable user file — leave it untouched. + result.skipped.append(rel_dst) + return + + if not _merge_toml(src_data, dst_data): + result.skipped.append(rel_dst) + return + + try: + text = _toml_dumps(dst_data) + if tomllib.loads(text) != dst_data: + raise ValueError("serializer round-trip mismatch") + except (ValueError, tomllib.TOMLDecodeError): + result.skipped.append(rel_dst) + return + + dst.write_text(text, encoding="utf-8") + result.merged.append(rel_dst) diff --git a/tests/test_install_adapter.py b/tests/test_install_adapter.py index 83036e8c..1a11d283 100644 --- a/tests/test_install_adapter.py +++ b/tests/test_install_adapter.py @@ -319,6 +319,189 @@ def test_install_openclaw_is_idempotent(tmp_path: Path) -> None: } +# --- codex: config.toml deep-merge (vouchdev/vouch#384) --------------------- + + +def test_codex_toml_merges_into_existing_config(tmp_path: Path) -> None: + """User already has .codex/config.toml — codex's *primary* config file. + The old plain-copy path silently skipped it, so vouch never got wired on + any project where codex was already configured. toml_merge adds + [mcp_servers.vouch] while preserving every unrelated table and value.""" + import tomllib + + codex_dir = tmp_path / ".codex" + codex_dir.mkdir() + (codex_dir / "config.toml").write_text( + 'model = "gpt-5"\napproval_policy = "never"\n\n' + '[mcp_servers.other]\ncommand = "other-server"\nargs = ["--fast"]\n', + encoding="utf-8", + ) + result = install("codex", target=tmp_path, tier="T1") + data = tomllib.loads((codex_dir / "config.toml").read_text(encoding="utf-8")) + + # user content preserved + assert data["model"] == "gpt-5" + assert data["approval_policy"] == "never" + assert data["mcp_servers"]["other"]["command"] == "other-server" + assert data["mcp_servers"]["other"]["args"] == ["--fast"] + + # vouch content merged in + assert data["mcp_servers"]["vouch"]["command"] == "vouch" + assert data["mcp_servers"]["vouch"]["args"] == ["serve"] + assert data["mcp_servers"]["vouch"]["env"]["VOUCH_AGENT"] == "codex" + + assert ".codex/config.toml" in result.merged + assert ".codex/config.toml" not in result.skipped + assert ".codex/config.toml" not in result.written + + +def test_codex_toml_merge_is_idempotent(tmp_path: Path) -> None: + codex_dir = tmp_path / ".codex" + codex_dir.mkdir() + (codex_dir / "config.toml").write_text('model = "gpt-5"\n', encoding="utf-8") + install("codex", target=tmp_path, tier="T1") + first = (codex_dir / "config.toml").read_text(encoding="utf-8") + second = install("codex", target=tmp_path, tier="T1") + after = (codex_dir / "config.toml").read_text(encoding="utf-8") + + assert first == after # no change on re-run + assert ".codex/config.toml" in second.skipped + assert ".codex/config.toml" not in second.merged + + +def test_codex_toml_fresh_install_writes_template(tmp_path: Path) -> None: + import tomllib + + result = install("codex", target=tmp_path, tier="T1") + cfg = tmp_path / ".codex" / "config.toml" + assert cfg.is_file() + data = tomllib.loads(cfg.read_text(encoding="utf-8")) + assert data["mcp_servers"]["vouch"]["command"] == "vouch" + assert ".codex/config.toml" in result.written + assert ".codex/config.toml" not in result.merged + + +def test_codex_toml_existing_vouch_entry_wins(tmp_path: Path) -> None: + """Conflict convention matches _install_json_merge: never clobber the + user. An existing [mcp_servers.vouch] value stays; only genuinely + missing keys (here the env table) are filled in.""" + import tomllib + + codex_dir = tmp_path / ".codex" + codex_dir.mkdir() + (codex_dir / "config.toml").write_text( + '[mcp_servers.vouch]\ncommand = "/opt/custom/vouch"\nargs = ["serve", "--debug"]\n', + encoding="utf-8", + ) + result = install("codex", target=tmp_path, tier="T1") + data = tomllib.loads((codex_dir / "config.toml").read_text(encoding="utf-8")) + + # the user's conflicting values win, deterministically + assert data["mcp_servers"]["vouch"]["command"] == "/opt/custom/vouch" + assert data["mcp_servers"]["vouch"]["args"] == ["serve", "--debug"] + # the missing env table is deep-merged in + assert data["mcp_servers"]["vouch"]["env"]["VOUCH_AGENT"] == "codex" + assert ".codex/config.toml" in result.merged + + +def test_codex_toml_malformed_existing_is_skipped(tmp_path: Path) -> None: + codex_dir = tmp_path / ".codex" + codex_dir.mkdir() + (codex_dir / "config.toml").write_text("= not valid toml [", encoding="utf-8") + before = (codex_dir / "config.toml").read_text(encoding="utf-8") + result = install("codex", target=tmp_path, tier="T1") + # unreadable user file is left untouched, not clobbered + assert (codex_dir / "config.toml").read_text(encoding="utf-8") == before + assert ".codex/config.toml" in result.skipped + assert ".codex/config.toml" not in result.merged + + +def test_toml_dumps_roundtrips_shipped_shapes() -> None: + """The hand-rolled serializer must faithfully re-emit everything tomllib + can hand it from the config shapes we merge into: nested tables, arrays, + inline tables inside arrays, quoted keys, and scalar types.""" + import tomllib + + from vouch.install_adapter import _toml_dumps + + data = { + "model": "gpt-5", + "temperature": 0.5, + "retries": 3, + "verbose": True, + "tags": ["a", "b"], + "weird key.name": "quoted", + "profiles": [{"name": "fast"}, {"name": "safe"}], + "mcp_servers": { + "vouch": { + "command": "vouch", + "args": ["serve"], + "env": {"VOUCH_AGENT": "codex"}, + }, + }, + } + assert tomllib.loads(_toml_dumps(data)) == data + + +def test_merge_toml_reports_no_change_when_subset() -> None: + from vouch.install_adapter import _merge_toml + + dst = {"a": {"b": 1, "c": [1, 2]}, "top": "x"} + src = {"a": {"b": 999}} # conflicting value: dst wins, nothing to add + assert _merge_toml(src, dst) is False + assert dst["a"]["b"] == 1 + + +def _write_manifest(tmp_path: Path, host: str, body: str, monkeypatch) -> None: + """Point the loader at a throwaway adapters dir holding one manifest.""" + import vouch.install_adapter as ia + + (tmp_path / host).mkdir(parents=True) + (tmp_path / host / "install.yaml").write_text(body, encoding="utf-8") + monkeypatch.setattr(ia, "ADAPTERS_DIR", tmp_path) + + +def test_manifest_non_boolean_flag_is_rejected(tmp_path: Path, monkeypatch) -> None: + """A quoted `"false"` is a non-empty string; bool() would read it as + True and silently enable a merge. The loader must reject it.""" + from vouch.install_adapter import _load_manifest + + _write_manifest(tmp_path, "badhost", ( + "host: badhost\n" + "tiers:\n" + " T1:\n" + ' - { src: a, dst: b, toml_merge: "false" }\n' + ), monkeypatch) + with pytest.raises(AdapterError, match="`toml_merge` must be a boolean"): + _load_manifest("badhost") + + +def test_manifest_multiple_strategies_rejected(tmp_path: Path, monkeypatch) -> None: + from vouch.install_adapter import _load_manifest + + _write_manifest(tmp_path, "badhost", ( + "host: badhost\n" + "tiers:\n" + " T1:\n" + " - { src: a, dst: b, json_merge: true, toml_merge: true }\n" + ), monkeypatch) + with pytest.raises(AdapterError, match="more than one of"): + _load_manifest("badhost") + + +def test_manifest_boolean_flags_still_accepted(tmp_path: Path, monkeypatch) -> None: + from vouch.install_adapter import _load_manifest + + _write_manifest(tmp_path, "okhost", ( + "host: okhost\n" + "tiers:\n" + " T1:\n" + " - { src: a, dst: b, toml_merge: true }\n" + ), monkeypatch) + manifest = _load_manifest("okhost") + assert manifest.tiers["T1"][0].toml_merge is True + + # --- error paths ---------------------------------------------------------- From 628c733b021b93ecd012a4880eabcc68dae80e55 Mon Sep 17 00:00:00 2001 From: dripsmvcp <138900956+dripsmvcp@users.noreply.github.com> Date: Mon, 6 Jul 2026 16:22:08 +0900 Subject: [PATCH 064/123] feat(adapters): codex T2 agents.md fenced snippet codex reads AGENTS.md for project instructions the way cursor does, but the codex adapter stopped at T1, so a codex session got the kb tools with no standing guidance on recall-first or the review gate. ship adapters/codex/AGENTS.md.snippet as a T2 tier with the standard fence markers, kept in lockstep with cursor's snippet modulo the host name (enforced by a sync test). also close the edited-fence gap in _install_fenced per the ticket's acceptance criteria: a fence body that drifted from the shipped snippet is replaced within the markers (reported as merged) instead of being skipped forever, while user content outside the fence stays untouched. a begin marker without an end marker is treated as corrupt and left alone. closes #385 --- adapters/codex/AGENTS.md.snippet | 31 +++++++++ adapters/codex/install.yaml | 8 +++ src/vouch/install_adapter.py | 70 +++++++++++++++++-- tests/test_install_adapter.py | 116 +++++++++++++++++++++++++++++++ 4 files changed, 220 insertions(+), 5 deletions(-) create mode 100644 adapters/codex/AGENTS.md.snippet diff --git a/adapters/codex/AGENTS.md.snippet b/adapters/codex/AGENTS.md.snippet new file mode 100644 index 00000000..593f97df --- /dev/null +++ b/adapters/codex/AGENTS.md.snippet @@ -0,0 +1,31 @@ +# Vouch — knowledge base + +This repo uses **vouch** for durable agent knowledge. The KB lives in +`.vouch/` and is reviewed in PRs like any other code. + +## How to remember things + +To preserve a fact, decision, or workflow across sessions: + +1. Register evidence: `kb_register_source` (or + `kb_register_source_from_path` for a file). +2. Propose a claim that cites it: `kb_propose_claim`. Every claim + MUST cite at least one source or evidence id. +3. For richer write-ups, propose pages: `kb_propose_page` with a + markdown body that references claims. + +You **cannot** write durable knowledge directly. Proposals land in +`.vouch/proposed/` and require human approval via `vouch approve`. +This is intentional. + +## How to read + +- `kb_search` for keyword search. +- `kb_context` to fill a working set for a task ("what does this KB know + about X?"). +- `kb_read_*` for specific ids. + +## Identity + +Set `VOUCH_AGENT=codex` in your env (or the MCP entry's `env:` block) so the +audit log can attribute writes to this host. diff --git a/adapters/codex/install.yaml b/adapters/codex/install.yaml index 3e41ef45..29eb1a37 100644 --- a/adapters/codex/install.yaml +++ b/adapters/codex/install.yaml @@ -9,6 +9,14 @@ # of skipping it -- see issue #384. Existing user values always win. host: codex pretty: OpenAI Codex CLI +fence: + begin: "" + end: "" tiers: T1: - { src: config.toml, dst: .codex/config.toml, toml_merge: true } + # T2 = AGENTS.md fenced snippet (codex reads AGENTS.md for project + # instructions the way cursor does -- see issue #385). Kept in lockstep + # with adapters/cursor/AGENTS.md.snippet modulo the host name. + T2: + - { src: AGENTS.md.snippet, dst: AGENTS.md, fenced_append: true } diff --git a/src/vouch/install_adapter.py b/src/vouch/install_adapter.py index abc426af..4fce5cd0 100644 --- a/src/vouch/install_adapter.py +++ b/src/vouch/install_adapter.py @@ -280,10 +280,15 @@ def _install_fenced( States: - * dst is missing -> write fresh, fenced (``written``) - * dst exists, fence not in file -> append fenced block (``appended``) - * dst exists, fence already in -> skip (``skipped``); we are the - author and there's nothing to do + * dst is missing -> write fresh, fenced (``written``) + * dst exists, fence not in file -> append fenced block (``appended``) + * dst exists, fence body up to date -> skip (``skipped``); we are the + author and there's nothing to do + * dst exists, fence body edited -> replace within the markers + (``merged``); the fence is ours, + content around it is the user's + * dst exists, begin without end -> skip (``skipped``); corrupt fence + we refuse to mangle """ snippet = src.read_text(encoding="utf-8") fenced_block = f"\n{manifest.fence_begin}\n{snippet.rstrip()}\n{manifest.fence_end}\n" @@ -295,16 +300,71 @@ def _install_fenced( return existing = dst.read_text(encoding="utf-8") - if manifest.fence_begin in existing: + span = _fence_span(existing, manifest.fence_begin, manifest.fence_end) + if span is not None: + start, stop = span + current = existing[start:stop] + expected = fenced_block.strip("\n") + if current == expected: + result.skipped.append(rel_dst) + return + # The fence is ours: bring an edited body back in sync in place, + # touching nothing outside the markers. + refreshed = existing[:start] + expected + existing[stop:] + dst.write_text(refreshed, encoding="utf-8") + result.merged.append(rel_dst) + return + + if _has_standalone_line(existing, manifest.fence_begin): + # A begin marker on its own line with no matching end marker: a + # corrupt fence we can't cleanly parse. Don't append a second one. result.skipped.append(rel_dst) return # User-authored content above; append our fenced block at the bottom. + # (A file that merely *mentions* the marker text in prose or a code + # sample has no standalone fence, so it lands here and gets the block + # appended rather than being mistaken for an existing install.) new_content = existing.rstrip() + "\n" + fenced_block dst.write_text(new_content, encoding="utf-8") result.appended.append(rel_dst) +def _has_standalone_line(text: str, marker: str) -> bool: + return any(line.strip() == marker for line in text.splitlines()) + + +def _fence_span(text: str, begin: str, end: str) -> tuple[int, int] | None: + """Char offsets of a well-formed fence whose ``begin``/``end`` markers + each occupy their own line, or None if there's no such pair. + + Only standalone marker lines count — text that merely mentions the + marker inside prose or a fenced code sample is ignored, so a passing + reference can't be mistaken for an installed fence (and can't cause an + in-place rewrite to clobber unrelated content between two stray + mentions). The returned span runs from the start of the begin line to + the end of the end-marker text (excluding its trailing newline), so a + caller can splice a replacement in without disturbing the surrounding + file. + """ + lines = text.splitlines(keepends=True) + begin_idx: int | None = None + end_idx: int | None = None + for i, line in enumerate(lines): + stripped = line.strip() + if begin_idx is None: + if stripped == begin: + begin_idx = i + elif stripped == end: + end_idx = i + break + if begin_idx is None or end_idx is None: + return None + start = sum(len(line) for line in lines[:begin_idx]) + stop = sum(len(line) for line in lines[:end_idx]) + len(lines[end_idx].rstrip("\n")) + return start, stop + + def _event_commands(groups: Any) -> set[str]: """Every hook ``command`` string already present under one hooks-event.""" cmds: set[str] = set() diff --git a/tests/test_install_adapter.py b/tests/test_install_adapter.py index 1a11d283..493241b6 100644 --- a/tests/test_install_adapter.py +++ b/tests/test_install_adapter.py @@ -319,6 +319,122 @@ def test_install_openclaw_is_idempotent(tmp_path: Path) -> None: } +# --- codex: T2 AGENTS.md fenced snippet (vouchdev/vouch#385) ---------------- + + +def test_codex_t2_appends_snippet_to_existing_agents_md(tmp_path: Path) -> None: + """Codex reads AGENTS.md for project instructions the way cursor does; + without the snippet a codex session gets the kb tools but no standing + guidance on recall-first or the review gate.""" + (tmp_path / "AGENTS.md").write_text("# My project\n\nExisting content.\n") + result = install("codex", target=tmp_path, tier="T2") + final = (tmp_path / "AGENTS.md").read_text(encoding="utf-8") + assert "Existing content." in final + assert "" in final + assert "" in final + assert "AGENTS.md" in result.appended + + +def test_codex_t2_creates_agents_md_when_absent(tmp_path: Path) -> None: + result = install("codex", target=tmp_path, tier="T2") + agents = tmp_path / "AGENTS.md" + assert agents.is_file() + assert "" in agents.read_text(encoding="utf-8") + assert "AGENTS.md" in result.written + + +def test_codex_t2_rerun_is_noop(tmp_path: Path) -> None: + install("codex", target=tmp_path, tier="T2") + before = (tmp_path / "AGENTS.md").read_text(encoding="utf-8") + again = install("codex", target=tmp_path, tier="T2") + after = (tmp_path / "AGENTS.md").read_text(encoding="utf-8") + assert before == after + assert "AGENTS.md" in again.skipped + assert "AGENTS.md" not in again.appended + + +def test_codex_t1_does_not_touch_agents_md(tmp_path: Path) -> None: + install("codex", target=tmp_path, tier="T1") + assert not (tmp_path / "AGENTS.md").exists() + + +def test_codex_snippet_stays_in_lockstep_with_cursor(tmp_path: Path) -> None: + """The two snippets carry the same invariants (recall first, all writes + via proposals, review stays human) and are phrased host-neutrally: the + only difference allowed is the host name itself.""" + codex = (ADAPTERS_DIR / "codex" / "AGENTS.md.snippet").read_text(encoding="utf-8") + cursor = (ADAPTERS_DIR / "cursor" / "AGENTS.md.snippet").read_text(encoding="utf-8") + assert codex == cursor.replace("cursor", "codex") + + +def test_fenced_refresh_replaces_edited_fence_body(tmp_path: Path) -> None: + """An edited fence body is brought back in sync within the markers; + user content outside the fence is untouched (vouchdev/vouch#385).""" + (tmp_path / "AGENTS.md").write_text("# Mine\n\nAbove.\n") + install("codex", target=tmp_path, tier="T2") + installed = (tmp_path / "AGENTS.md").read_text(encoding="utf-8") + + tampered = installed.replace( + "", + "\nstale hand edits\n", + ) + "\nBelow.\n" + (tmp_path / "AGENTS.md").write_text(tampered, encoding="utf-8") + + result = install("codex", target=tmp_path, tier="T2") + final = (tmp_path / "AGENTS.md").read_text(encoding="utf-8") + assert "stale hand edits" not in final + assert "Above." in final + assert "Below." in final + assert final.count("") == 1 + assert "AGENTS.md" in result.merged + assert "AGENTS.md" not in result.skipped + + +def test_fenced_append_when_marker_only_mentioned_in_prose(tmp_path: Path) -> None: + """A file that merely *mentions* the marker text (docs, a code sample) + has no standalone fence, so the snippet is appended rather than the + mention being mistaken for an existing install and skipped.""" + (tmp_path / "AGENTS.md").write_text( + "# Docs\n\nWe wrap vouch content in `` markers.\n", + encoding="utf-8", + ) + result = install("codex", target=tmp_path, tier="T2") + final = (tmp_path / "AGENTS.md").read_text(encoding="utf-8") + # the prose line survived, and a real standalone fence was appended + assert "We wrap vouch content in" in final + assert any(line.strip() == "" for line in final.splitlines()) + assert "AGENTS.md" in result.appended + assert "AGENTS.md" not in result.skipped + + +def test_fenced_refresh_ignores_marker_mention_below_real_fence(tmp_path: Path) -> None: + """Re-running stays a flat no-op even when the user pasted the marker + text into prose below the installed fence: the standalone fence is + up to date, the prose mention is not a second fence.""" + install("codex", target=tmp_path, tier="T2") + installed = (tmp_path / "AGENTS.md").read_text(encoding="utf-8") + (tmp_path / "AGENTS.md").write_text( + installed + "\nnote: the `` line is ours.\n", + encoding="utf-8", + ) + before = (tmp_path / "AGENTS.md").read_text(encoding="utf-8") + result = install("codex", target=tmp_path, tier="T2") + assert (tmp_path / "AGENTS.md").read_text(encoding="utf-8") == before + assert "AGENTS.md" in result.skipped + + +def test_fenced_refresh_leaves_unclosed_fence_alone(tmp_path: Path) -> None: + """A begin marker without an end marker is a corrupt state we refuse to + mangle — the file is left untouched and reported skipped.""" + (tmp_path / "AGENTS.md").write_text( + "content\n\nno end marker here\n", encoding="utf-8" + ) + before = (tmp_path / "AGENTS.md").read_text(encoding="utf-8") + result = install("codex", target=tmp_path, tier="T2") + assert (tmp_path / "AGENTS.md").read_text(encoding="utf-8") == before + assert "AGENTS.md" in result.skipped + + # --- codex: config.toml deep-merge (vouchdev/vouch#384) --------------------- From 109a3a3897e698c5bcdda8f35ac4b4a9b0314ad6 Mon Sep 17 00:00:00 2001 From: dripsmvcp <138900956+dripsmvcp@users.noreply.github.com> Date: Mon, 6 Jul 2026 16:26:45 +0900 Subject: [PATCH 065/123] feat(adapters): codex T3 skills mirroring the vouch slash commands MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit claude-code T3 ships nine slash commands; codex users got none of the guided flows. ship them as codex skills under the project-local .codex/skills/ as a T3 tier. scope decision the ticket asked to resolve first: codex loads custom prompts only from ~/.codex/prompts/ (user-global) and has deprecated them upstream in favour of skills, which do have a project-local home at /.codex/skills/ in trusted projects. the #179 rule forbids a project-scoped install from touching home-directory state, so prompts are out and skills are in — recorded in the manifest comment and the adapter readme, with a manual-copy pointer for users who still want ~/.codex/prompts. the SKILL.md files are referenced from the openclaw mirror rather than duplicated (same reuse pattern openclaw itself applies to the claude-code commands), so one edit updates every host. a parametrized sync test asserts each installed codex skill body equals the matching claude-code command body, and a scope test asserts every installed path stays under the project target. closes #386 --- adapters/codex/README.md | 36 +++++++++++++- adapters/codex/install.yaml | 18 +++++++ tests/test_install_adapter.py | 88 +++++++++++++++++++++++++++++++++++ 3 files changed, 140 insertions(+), 2 deletions(-) diff --git a/adapters/codex/README.md b/adapters/codex/README.md index cfb324a4..ae028608 100644 --- a/adapters/codex/README.md +++ b/adapters/codex/README.md @@ -6,8 +6,19 @@ Wires `vouch serve` into [OpenAI's Codex CLI][codex] as an MCP server. ## Setup -Codex reads MCP server config from `~/.codex/config.toml`. Add a -`vouch` entry: +```bash +vouch install-mcp codex +``` + +This writes the `vouch` MCP entry into the *project-local* +`/.codex/config.toml` (deep-merged into any existing one, so +your other servers and settings are preserved) — never into +`~/.codex/config.toml`, per the project-scoped install rule. Codex +loads project-local `.codex/` config for trusted projects, so trust +the project when codex asks. + +Prefer a user-global setup, or no installer? Add the entry to +`~/.codex/config.toml` (or `/.codex/config.toml`) by hand: ```toml [mcp_servers.vouch] @@ -20,6 +31,27 @@ VOUCH_AGENT = "codex" Restart any running `codex` session. +## Skills (T3) + +`vouch install-mcp codex --tier T3` also drops the vouch guided flows +(`vouch-recall`, `vouch-status`, `vouch-resolve-issue`, +`vouch-propose-from-pr`, plus the company-brain set) into the +project-local `.codex/skills/` directory. Codex discovers skills from +`/.codex/skills/` in trusted projects, so they surface in the +session automatically — ask for a skill by name (e.g. "use the +vouch-recall skill for X") or let codex pick them up from context. + +Why skills and not custom prompts: codex loads custom prompts only +from `~/.codex/prompts/` (user-global) and has deprecated them in +favour of skills. A project-scoped `vouch install-mcp` never touches +home-directory state, so skills are the surface vouch ships. If you +prefer slash-style prompts anyway, copy the installed +`.codex/skills/*/SKILL.md` bodies into `~/.codex/prompts/.md` +yourself. + +The skill bodies are identical to the claude-code slash commands +(enforced by a sync test), so the flows behave the same on every host. + ## Notes - Codex respects MCP tool naming verbatim, so the tools appear as diff --git a/adapters/codex/install.yaml b/adapters/codex/install.yaml index 29eb1a37..016be7ba 100644 --- a/adapters/codex/install.yaml +++ b/adapters/codex/install.yaml @@ -20,3 +20,21 @@ tiers: # with adapters/cursor/AGENTS.md.snippet modulo the host name. T2: - { src: AGENTS.md.snippet, dst: AGENTS.md, fenced_append: true } + # T3 = the vouch guided flows as codex *skills* under the project-local + # `.codex/skills/` -- see issue #386. Scope decision recorded here per + # that ticket: codex custom prompts load only from ~/.codex/prompts/ + # (user-global) and are deprecated upstream in favour of skills, and the + # #179 rule forbids a project-scoped install from touching home-directory + # state, so prompts are out and project-local skills are in. The SKILL.md + # files are referenced from the openclaw mirror rather than duplicated; + # their bodies are sync-tested against the claude-code commands. + T3: + - { src: ../openclaw/skills/vouch-recall/SKILL.md, dst: .codex/skills/vouch-recall/SKILL.md } + - { src: ../openclaw/skills/vouch-status/SKILL.md, dst: .codex/skills/vouch-status/SKILL.md } + - { src: ../openclaw/skills/vouch-resolve-issue/SKILL.md, dst: .codex/skills/vouch-resolve-issue/SKILL.md } + - { src: ../openclaw/skills/vouch-propose-from-pr/SKILL.md, dst: .codex/skills/vouch-propose-from-pr/SKILL.md } + - { src: ../openclaw/skills/vouch-ask/SKILL.md, dst: .codex/skills/vouch-ask/SKILL.md } + - { src: ../openclaw/skills/vouch-remember/SKILL.md, dst: .codex/skills/vouch-remember/SKILL.md } + - { src: ../openclaw/skills/vouch-record/SKILL.md, dst: .codex/skills/vouch-record/SKILL.md } + - { src: ../openclaw/skills/vouch-followup/SKILL.md, dst: .codex/skills/vouch-followup/SKILL.md } + - { src: ../openclaw/skills/vouch-standup/SKILL.md, dst: .codex/skills/vouch-standup/SKILL.md } diff --git a/tests/test_install_adapter.py b/tests/test_install_adapter.py index 493241b6..e4adad83 100644 --- a/tests/test_install_adapter.py +++ b/tests/test_install_adapter.py @@ -435,6 +435,94 @@ def test_fenced_refresh_leaves_unclosed_fence_alone(tmp_path: Path) -> None: assert "AGENTS.md" in result.skipped +# --- codex: T3 skills mirroring the vouch slash commands +# (vouchdev/vouch#386) ------------------------------------------------------ +# +# Scope decision from the ticket: codex custom prompts live only under +# ~/.codex/prompts/ (user-global) and are deprecated upstream in favour of +# skills, which DO have a project-local home at /.codex/skills/. +# Shipping skills keeps the #179 rule intact — a project-scoped install +# never touches home-directory state. + +_CODEX_SKILL_NAMES = ( + "vouch-ask", + "vouch-followup", + "vouch-propose-from-pr", + "vouch-recall", + "vouch-record", + "vouch-remember", + "vouch-resolve-issue", + "vouch-standup", + "vouch-status", +) + + +def _body_after_frontmatter(text: str) -> str: + parts = text.split("---", 2) + assert len(parts) == 3, "expected yaml frontmatter" + return parts[2].strip() + + +def test_install_codex_t3_ships_all_nine_skills(tmp_path: Path) -> None: + result = install("codex", target=tmp_path, tier="T3") + for name in _CODEX_SKILL_NAMES: + skill = tmp_path / ".codex" / "skills" / name / "SKILL.md" + assert skill.is_file(), f"missing {name}" + assert f".codex/skills/{name}/SKILL.md" in result.written + + +def test_codex_t3_writes_nothing_outside_the_project(tmp_path: Path) -> None: + """#179 invariant: every installed path stays under the target — a + project-scoped install must never reach ~/.codex.""" + result = install("codex", target=tmp_path, tier="T3") + for rel in (*result.written, *result.appended, *result.merged): + resolved = (tmp_path / rel).resolve() + assert resolved.is_relative_to(tmp_path.resolve()), rel + + +@pytest.mark.parametrize("name", _CODEX_SKILL_NAMES) +def test_codex_skills_stay_in_sync_with_claude_commands( + name: str, tmp_path: Path +) -> None: + """The skill bodies are the claude-code command bodies — referenced in + place from the openclaw mirror rather than forked, so one edit updates + every host and this test catches any drift.""" + install("codex", target=tmp_path, tier="T3") + skill = tmp_path / ".codex" / "skills" / name / "SKILL.md" + command = ( + REPO_ROOT / "adapters" / "claude-code" / ".claude" / "commands" / f"{name}.md" + ) + assert _body_after_frontmatter(skill.read_text(encoding="utf-8")) == ( + _body_after_frontmatter(command.read_text(encoding="utf-8")) + ), f"{name}: codex SKILL.md body drifted from the claude-code command" + + +def test_codex_skill_frontmatter_names_match_dirs(tmp_path: Path) -> None: + """Codex resolves a skill by its frontmatter name; a mismatch with the + directory name would ship a skill that answers to the wrong id.""" + install("codex", target=tmp_path, tier="T3") + for name in _CODEX_SKILL_NAMES: + text = (tmp_path / ".codex" / "skills" / name / "SKILL.md").read_text( + encoding="utf-8" + ) + frontmatter = text.split("---", 2)[1] + # Match the whole `name:` line, not a substring: `name: vouch-recall` + # must not be satisfied by `name: vouch-recall-typo`. + name_lines = [ + ln.strip() for ln in frontmatter.splitlines() + if ln.strip().startswith("name:") + ] + assert f"name: {name}" in name_lines, (name, name_lines) + + +def test_install_codex_t3_is_idempotent(tmp_path: Path) -> None: + install("codex", target=tmp_path, tier="T3") + second = install("codex", target=tmp_path, tier="T3") + assert second.written == [] + for name in _CODEX_SKILL_NAMES: + assert f".codex/skills/{name}/SKILL.md" in second.skipped + + # --- codex: config.toml deep-merge (vouchdev/vouch#384) --------------------- From 0eb7917a09f66b7fc10f3cedce2d2b481cff26f0 Mon Sep 17 00:00:00 2001 From: dripsmvcp <138900956+dripsmvcp@users.noreply.github.com> Date: Mon, 6 Jul 2026 16:34:52 +0900 Subject: [PATCH 066/123] feat(capture): ingest codex session rollouts into review-gated summaries MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit session auto-capture was claude-code-only: hooks drive capture observe and capture finalize live. codex has no hook stream, but it persists every session as a rollout jsonl under $CODEX_HOME/sessions containing user messages, tool calls, and outputs — everything the existing rollup needs, just after the fact. new cli command `vouch capture ingest-codex [ | --latest]` parses one rollout through a small dedicated parser (codex_rollout.py) that maps function_call records into the same observation shape capture.observe produces — shell commands with failure detection from exit codes, apply_patch heredocs surfaced as file edits, mcp tools under their own names, session mechanics skipped — then reuses the existing build_summary_body -> propose_page rollup. one code path from observation to proposal, two front doors. the rollout format is not a stable public contract: unknown record types are tolerated, and unreadable, compressed, or meta-less files degrade to a CodexRolloutError with an actionable message and a non-zero exit, never a stack trace. re-ingesting a session is a no-op keyed on the rollout's session id; --latest resolves the newest rollout whose recorded cwd matches the current project. proposals are attributed to the codex actor (VOUCH_AGENT wins when set), respect capture's enabled/min_observations config, and never touch approve(). fixture rollouts use placeholder data only, enforced by a test. closes #387 --- src/vouch/cli.py | 49 +++ src/vouch/codex_rollout.py | 374 +++++++++++++++++++++ tests/fixtures/codex/rollout-basic.jsonl | 17 + tests/fixtures/codex/rollout-no-meta.jsonl | 2 + tests/test_codex_rollout.py | 299 ++++++++++++++++ 5 files changed, 741 insertions(+) create mode 100644 src/vouch/codex_rollout.py create mode 100644 tests/fixtures/codex/rollout-basic.jsonl create mode 100644 tests/fixtures/codex/rollout-no-meta.jsonl create mode 100644 tests/test_codex_rollout.py diff --git a/src/vouch/cli.py b/src/vouch/cli.py index a490fcf9..853d2a46 100644 --- a/src/vouch/cli.py +++ b/src/vouch/cli.py @@ -25,6 +25,7 @@ from . import __version__, bundle, health, volunteer_context from . import audit as audit_mod from . import capture as capture_mod +from . import codex_rollout as codex_rollout_mod from . import compile as compile_mod from . import digest as digest_mod from . import fetch as fetch_mod @@ -98,6 +99,7 @@ def _cli_errors() -> Iterator[None]: ProposalError, LifecycleError, migrations_mod.MigrationError, + codex_rollout_mod.CodexRolloutError, ) as e: raise click.ClickException(str(e)) from e @@ -2022,6 +2024,53 @@ def capture_finalize_all_cmd(session_id: str | None, max_age_seconds: float) -> _emit_json(result) +@capture.command("ingest-codex") +@click.argument( + "rollout", required=False, + type=click.Path(exists=True, dir_okay=False, path_type=Path), +) +@click.option( + "--latest", is_flag=True, + help="Resolve the newest codex rollout recorded for this project (by cwd).", +) +@click.option( + "--codex-home", type=click.Path(file_okay=False, path_type=Path), default=None, + help="Codex state dir holding sessions/ (default: $CODEX_HOME or ~/.codex).", +) +def capture_ingest_codex_cmd( + rollout: Path | None, latest: bool, codex_home: Path | None +) -> None: + """Ingest one codex session rollout into a PENDING summary proposal. + + Codex has no live hook stream; it persists each session as a rollout + jsonl instead. This maps the rollout's tool calls into the same + observation shape `capture observe` produces and reuses the existing + rollup, so the result is the same review-gated summary a claude + session yields. Re-ingesting a session is a no-op; review with + `vouch review`. + """ + if (rollout is None) == (not latest): + raise click.ClickException("pass exactly one of ROLLOUT or --latest") + store = _load_store() + with _cli_errors(): + if latest: + found = codex_rollout_mod.find_latest_rollout( + Path.cwd(), codex_home=codex_home + ) + if found is None: + raise click.ClickException( + "no codex rollout found for this project under " + f"{(codex_home or codex_rollout_mod.default_codex_home()) / 'sessions'}; " + "pass a rollout file explicitly" + ) + rollout = found + assert rollout is not None + result = codex_rollout_mod.ingest_rollout( + store, rollout, generated_at=datetime.now(UTC).isoformat() + ) + _emit_json(result) + + @capture.command("banner") def capture_banner_cmd() -> None: """Emit a SessionStart nudge if captured summaries await review.""" diff --git a/src/vouch/codex_rollout.py b/src/vouch/codex_rollout.py new file mode 100644 index 00000000..c94684c7 --- /dev/null +++ b/src/vouch/codex_rollout.py @@ -0,0 +1,374 @@ +"""Ingest OpenAI Codex CLI session rollouts into review-gated summaries. + +Codex has no live hook stream the way claude-code does, but it persists +every session as a rollout file — ``$CODEX_HOME/sessions/YYYY/MM/DD/`` +``rollout--.jsonl`` — holding user messages, tool calls, +and outputs: everything ``capture.build_summary_body`` needs, just after +the fact instead of live. ``vouch capture ingest-codex`` maps rollout +records into the same observation shape ``capture.observe`` produces, then +reuses the existing rollup (``build_summary_body`` -> ``propose_page``) so +a codex session yields the same kind of PENDING session-summary proposal a +claude session does: one code path from observation to proposal, two front +doors. + +The rollout format is not a stable public contract. Parsing is therefore +tolerant — unknown record types are skipped — but a file that doesn't look +like a rollout at all degrades to :class:`CodexRolloutError` with an +actionable message, never a stack trace. Ingesting the same session twice +is a no-op: the session id in the rollout is the natural dedup key. + +Never calls ``approve()`` — the review gate stays intact. A human reviews +the proposal with ``vouch review`` like any other write. +""" + +from __future__ import annotations + +import json +import os +import re +from collections.abc import Iterator +from dataclasses import dataclass, field +from pathlib import Path +from typing import Any + +from . import capture +from .proposals import propose_page +from .storage import KBStore + +# The default proposer when VOUCH_AGENT isn't set: rollouts are codex +# sessions, so the audit trail attributes them to the codex actor the +# adapter configures (`VOUCH_AGENT=codex` in adapters/codex/config.toml). +CODEX_ACTOR = "codex" + +_ZSTD_MAGIC = b"\x28\xb5\x2f\xfd" +_MAX_PROMPT_CHARS = 240 +_PATCH_FILE_RE = re.compile(r"^\*\*\* (Add|Update|Delete) File: (.+)$", re.MULTILINE) +_EXIT_CODE_RE = re.compile(r"exited with code (\d+)") + +# Codex tool calls that are session mechanics, not work worth summarizing. +_IGNORED_CALLS = frozenset({"update_plan", "write_stdin", "list_mcp_resources"}) +_SHELL_CALLS = frozenset({"exec_command", "shell", "local_shell", "container.exec"}) + + +class CodexRolloutError(RuntimeError): + """Raised when a rollout file can't be read or doesn't parse as one. + + The CLI layer translates this into a clean ``Error: ...`` line via + ``_cli_errors``; nothing is written to the KB when it's raised. + """ + + +@dataclass +class CodexSession: + """The capture-relevant slice of one parsed rollout.""" + + session_id: str + cwd: str | None = None + started_at: str | None = None + first_prompt: str | None = None + observations: list[dict[str, Any]] = field(default_factory=list) + + +def _clean_prompt(raw: str) -> str | None: + """Mirror ``capture.first_user_prompt``'s hygiene: skip host wrapper + messages and meta lines, collapse whitespace, cap the length.""" + text = raw.strip() + if not text or text.startswith("<"): + return None + if text.lower().startswith("caveat:"): + return None + collapsed = " ".join(text.split()) + if len(collapsed) > _MAX_PROMPT_CHARS: + collapsed = collapsed[: _MAX_PROMPT_CHARS - 1].rstrip() + "…" + return collapsed + + +def _patch_observation(patch: str) -> dict[str, Any] | None: + """Turn an apply_patch payload into an Edit/Created observation.""" + matches = _PATCH_FILE_RE.findall(patch) + if not matches: + return None + files = [path.strip() for _, path in matches] + verbs = {verb for verb, _ in matches} + if verbs == {"Add"}: + verb = "Created" + elif verbs == {"Delete"}: + verb = "Deleted" + else: + verb = "Edited" + name = files[0].rsplit("/", 1)[-1] + summary = f"{verb} {name}" if len(files) == 1 else f"{verb} {len(files)} files" + return {"tool": "Edit", "summary": summary, "files": files} + + +def _observation_from_call(name: str, arguments: object) -> dict[str, Any] | None: + """Map one codex ``function_call`` record into an observation, or None + to skip. Shapes match ``capture.summarize_tool``'s conventions so the + rollup renders codex and claude sessions identically.""" + if not name or name in _IGNORED_CALLS: + return None + args: dict[str, Any] = {} + if isinstance(arguments, str): + try: + loaded = json.loads(arguments) + if isinstance(loaded, dict): + args = loaded + except json.JSONDecodeError: + args = {} + elif isinstance(arguments, dict): + args = arguments + + if name == "apply_patch": + patch = str(args.get("input") or args.get("patch") or "") + obs = _patch_observation(patch) + if obs is not None: + return obs + + if name in _SHELL_CALLS or name == "apply_patch": + cmd = args.get("cmd") or args.get("command") or "" + if isinstance(cmd, list): + cmd = " ".join(str(c) for c in cmd) + cmd = str(cmd) + first_line = cmd.splitlines()[0] if cmd else "" + # Codex often applies patches through the shell tool as an + # `apply_patch < Iterator[str]: + """Yield the rollout's lines one at a time, decoded as UTF-8. + + Streams from the file handle rather than slurping the whole file into + memory — codex rollouts can carry large tool outputs. The zstd magic + header is checked up front (compressed rollouts aren't parsed here). + """ + try: + fh = path.open("rb") + except OSError as e: + raise CodexRolloutError(f"cannot read rollout file {path}: {e}") from e + with fh: + if fh.read(4) == _ZSTD_MAGIC: + raise CodexRolloutError( + f"{path.name} is zstd-compressed; decompress it first " + f"(`zstd -d {path.name}`) and ingest the .jsonl" + ) + fh.seek(0) + for raw_line in fh: + yield raw_line.decode("utf-8", errors="replace") + + +def parse_rollout(path: Path) -> CodexSession: + """Parse one rollout jsonl into a :class:`CodexSession`. + + Unknown record types are tolerated (the format drifts); a file that is + unreadable, compressed, or has no ``session_meta`` record raises + :class:`CodexRolloutError` with a message that says what to do next. + """ + session_id: str | None = None + cwd: str | None = None + started_at: str | None = None + first_prompt: str | None = None + observations: list[dict[str, Any]] = [] + # call_id -> index into observations, so a later function_call_output + # can mark the command as failed the way summarize_tool does live. + open_calls: dict[str, int] = {} + + for line in _iter_rollout_lines(path): + line = line.strip() + if not line: + continue + try: + record = json.loads(line) + except json.JSONDecodeError: + continue + if not isinstance(record, dict): + continue + rtype = record.get("type") + payload = record.get("payload") + if not isinstance(payload, dict): + continue + + if rtype == "session_meta" and session_id is None: + sid = payload.get("id") or payload.get("session_id") + if isinstance(sid, str) and sid.strip(): + session_id = sid.strip() + raw_cwd = payload.get("cwd") + if isinstance(raw_cwd, str) and raw_cwd: + cwd = raw_cwd + raw_ts = payload.get("timestamp") + if isinstance(raw_ts, str) and raw_ts: + started_at = raw_ts + + elif rtype == "response_item": + ptype = payload.get("type") + if ptype == "function_call": + obs = _observation_from_call( + str(payload.get("name") or ""), payload.get("arguments") + ) + if obs is not None: + observations.append(obs) + call_id = payload.get("call_id") + if isinstance(call_id, str) and obs["tool"] == "Bash": + open_calls[call_id] = len(observations) - 1 + elif ptype == "function_call_output": + call_id = payload.get("call_id") + idx = open_calls.pop(call_id, None) if isinstance(call_id, str) else None + if idx is not None: + output = payload.get("output") + match = _EXIT_CODE_RE.search(str(output)) + if match and match.group(1) != "0": + obs = observations[idx] + obs["summary"] = "Command failed: " + obs["summary"].removeprefix( + "Ran: " + ) + + elif rtype == "event_msg": + if payload.get("type") == "user_message" and first_prompt is None: + msg = payload.get("message") + if isinstance(msg, str): + first_prompt = _clean_prompt(msg) + + if session_id is None: + raise CodexRolloutError( + f"{path.name}: no session_meta record found — this doesn't look " + f"like a codex rollout, or its schema has drifted; expected a " + f"session_meta record carrying an `id`" + ) + return CodexSession( + session_id=session_id, + cwd=cwd, + started_at=started_at, + first_prompt=first_prompt, + observations=observations, + ) + + +def default_codex_home() -> Path: + env = os.environ.get("CODEX_HOME") + return Path(env) if env else Path.home() / ".codex" + + +def _rollout_meta_cwd(path: Path) -> str | None: + """The ``cwd`` recorded in a rollout's ``session_meta``, or None.""" + try: + with path.open(encoding="utf-8") as fh: + first = json.loads(fh.readline()) + except (OSError, json.JSONDecodeError, UnicodeDecodeError): + return None + if not isinstance(first, dict) or first.get("type") != "session_meta": + return None + payload = first.get("payload") + if isinstance(payload, dict) and isinstance(payload.get("cwd"), str): + return payload["cwd"] + return None + + +def find_latest_rollout(cwd: Path, *, codex_home: Path | None = None) -> Path | None: + """Newest rollout whose session ran in ``cwd``, or None. + + Rollout filenames embed the full timestamp + (``rollout-YYYY-MM-DDThh-mm-ss-.jsonl``), so ``path.name`` orders + chronologically regardless of directory. Rather than sort the whole + ``sessions/`` tree up front, keep the newest match seen and skip + opening any candidate that can't beat it — most rollouts never get read. + """ + sessions = (codex_home or default_codex_home()) / "sessions" + if not sessions.is_dir(): + return None + target = str(cwd.resolve()) + best: Path | None = None + for path in sessions.rglob("rollout-*.jsonl"): + if best is not None and path.name <= best.name: + continue + if _rollout_meta_cwd(path) == target: + best = path + return best + + +def find_existing_proposal(store: KBStore, session_id: str) -> str | None: + """Id of any proposal (any status) already filed for this session.""" + for proposal in store.list_proposals(None): + if proposal.session_id == session_id: + return proposal.id + return None + + +def ingest_rollout( + store: KBStore, + path: Path, + *, + actor: str | None = None, + generated_at: str | None = None, +) -> dict[str, Any]: + """Roll one rollout into a PENDING summary proposal. No ``approve()``. + + Honours the same ``capture:`` config as live capture (``enabled``, + ``min_observations``) so the two front doors gate identically, and + dedups on the rollout's session id: re-ingesting reports the existing + proposal instead of filing a second one. + """ + cfg = capture.load_config(store) + session = parse_rollout(path) + if not cfg.enabled: + return { + "session_id": session.session_id, + "captured": len(session.observations), + "summary_proposal_id": None, + "skipped": "disabled", + } + + existing = find_existing_proposal(store, session.session_id) + if existing is not None: + return { + "session_id": session.session_id, + "captured": len(session.observations), + "summary_proposal_id": existing, + "skipped": "already-ingested", + } + + if len(session.observations) < cfg.min_observations: + return { + "session_id": session.session_id, + "captured": len(session.observations), + "summary_proposal_id": None, + "skipped": "below-min", + } + + project = None + if session.cwd: + project = session.cwd.rstrip("/").rsplit("/", 1)[-1] or None + title, body = capture.build_summary_body( + session.session_id, + session.observations, + [], # no git backstop: the session's working tree is long gone + "", + project=project, + generated_at=generated_at or session.started_at, + first_prompt=session.first_prompt, + ) + proposal = propose_page( + store, + title=title, + body=body, + page_type=capture.CAPTURE_PAGE_TYPE, + proposed_by=actor or os.environ.get("VOUCH_AGENT") or CODEX_ACTOR, + session_id=session.session_id, + rationale="ingested codex session rollout", + ) + return { + "session_id": session.session_id, + "captured": len(session.observations), + "summary_proposal_id": proposal.id, + } diff --git a/tests/fixtures/codex/rollout-basic.jsonl b/tests/fixtures/codex/rollout-basic.jsonl new file mode 100644 index 00000000..f4a51d9b --- /dev/null +++ b/tests/fixtures/codex/rollout-basic.jsonl @@ -0,0 +1,17 @@ +{"timestamp": "2026-07-01T09:00:00.000Z", "type": "session_meta", "payload": {"session_id": "0197aaaa-1111-7000-8000-000000000001", "id": "0197aaaa-1111-7000-8000-000000000001", "timestamp": "2026-07-01T09:00:00.000Z", "cwd": "/home/alice-example/projects/acme-app", "originator": "codex_exec", "cli_version": "0.142.0", "source": "exec"}} +{"timestamp": "2026-07-01T09:00:00.100Z", "type": "event_msg", "payload": {"type": "task_started", "turn_id": "0197aaaa-1111-7000-8000-0000000000t1"}} +{"timestamp": "2026-07-01T09:00:00.200Z", "type": "turn_context", "payload": {"turn_id": "0197aaaa-1111-7000-8000-0000000000t1", "cwd": "/home/alice-example/projects/acme-app", "model": "example-model"}} +{"timestamp": "2026-07-01T09:00:00.300Z", "type": "event_msg", "payload": {"type": "user_message", "message": "add a health endpoint to the acme api"}} +{"timestamp": "2026-07-01T09:00:01.000Z", "type": "response_item", "payload": {"type": "reasoning", "id": "rs_example", "summary": [], "encrypted_content": "opaque"}} +{"timestamp": "2026-07-01T09:00:02.000Z", "type": "response_item", "payload": {"type": "function_call", "id": "fc_1", "name": "exec_command", "arguments": "{\"cmd\":\"pytest -q\",\"workdir\":\"/home/alice-example/projects/acme-app\"}", "call_id": "call_1"}} +{"timestamp": "2026-07-01T09:00:03.000Z", "type": "response_item", "payload": {"type": "function_call_output", "call_id": "call_1", "output": "Process exited with code 1\nOutput:\n2 failed, 10 passed"}} +{"timestamp": "2026-07-01T09:00:04.000Z", "type": "response_item", "payload": {"type": "function_call", "id": "fc_2", "name": "exec_command", "arguments": "{\"cmd\":\"apply_patch <<'EOF'\\n*** Begin Patch\\n*** Update File: src/acme/api.py\\n@@\\n-old\\n+new\\n*** End Patch\\nEOF\",\"workdir\":\"/home/alice-example/projects/acme-app\"}", "call_id": "call_2"}} +{"timestamp": "2026-07-01T09:00:05.000Z", "type": "response_item", "payload": {"type": "function_call_output", "call_id": "call_2", "output": "Process exited with code 0\nOutput:\nDone!"}} +{"timestamp": "2026-07-01T09:00:06.000Z", "type": "response_item", "payload": {"type": "function_call", "id": "fc_3", "name": "update_plan", "arguments": "{\"plan\":[{\"step\":\"example\",\"status\":\"completed\"}]}", "call_id": "call_3"}} +{"timestamp": "2026-07-01T09:00:07.000Z", "type": "response_item", "payload": {"type": "function_call", "id": "fc_4", "name": "kb_search", "arguments": "{\"query\":\"health endpoint\"}", "call_id": "call_4"}} +{"timestamp": "2026-07-01T09:00:08.000Z", "type": "response_item", "payload": {"type": "function_call_output", "call_id": "call_4", "output": "{\"results\":[]}"}} +{"timestamp": "2026-07-01T09:00:09.000Z", "type": "response_item", "payload": {"type": "function_call", "id": "fc_5", "name": "exec_command", "arguments": "{\"cmd\":\"pytest -q\",\"workdir\":\"/home/alice-example/projects/acme-app\"}", "call_id": "call_5"}} +{"timestamp": "2026-07-01T09:00:10.000Z", "type": "response_item", "payload": {"type": "function_call_output", "call_id": "call_5", "output": "Process exited with code 0\nOutput:\n12 passed"}} +{"timestamp": "2026-07-01T09:00:11.000Z", "type": "world_state", "payload": {"unknown_future_field": true}} +{"timestamp": "2026-07-01T09:00:12.000Z", "type": "event_msg", "payload": {"type": "agent_message", "message": "added the endpoint and the tests pass"}} +{"timestamp": "2026-07-01T09:00:13.000Z", "type": "event_msg", "payload": {"type": "task_complete", "turn_id": "0197aaaa-1111-7000-8000-0000000000t1", "last_agent_message": "added the endpoint and the tests pass"}} diff --git a/tests/fixtures/codex/rollout-no-meta.jsonl b/tests/fixtures/codex/rollout-no-meta.jsonl new file mode 100644 index 00000000..cc1d9252 --- /dev/null +++ b/tests/fixtures/codex/rollout-no-meta.jsonl @@ -0,0 +1,2 @@ +{"timestamp": "2026-07-01T09:00:00.300Z", "type": "event_msg", "payload": {"type": "user_message", "message": "hello"}} +{"timestamp": "2026-07-01T09:00:02.000Z", "type": "response_item", "payload": {"type": "function_call", "id": "fc_1", "name": "exec_command", "arguments": "{\"cmd\":\"ls\"}", "call_id": "call_1"}} diff --git a/tests/test_codex_rollout.py b/tests/test_codex_rollout.py new file mode 100644 index 00000000..353b6046 --- /dev/null +++ b/tests/test_codex_rollout.py @@ -0,0 +1,299 @@ +"""`vouch capture ingest-codex` — codex rollout parsing + review-gated +ingest (vouchdev/vouch#387). + +Codex persists sessions as rollout jsonl files instead of emitting live +hooks. The parser maps rollout records into capture observations; the +ingest path reuses the existing rollup so a codex session yields the same +kind of PENDING page proposal a claude session does, deduped on the +rollout's session id. Fixtures use placeholder data only (alice-example). +""" + +from __future__ import annotations + +import json +from pathlib import Path + +import pytest +from click.testing import CliRunner + +from vouch import codex_rollout as cr +from vouch.cli import cli +from vouch.models import ProposalKind, ProposalStatus +from vouch.storage import KBStore + +FIXTURES = Path(__file__).parent / "fixtures" / "codex" +BASIC = FIXTURES / "rollout-basic.jsonl" +NO_META = FIXTURES / "rollout-no-meta.jsonl" +BASIC_SESSION = "0197aaaa-1111-7000-8000-000000000001" + + +@pytest.fixture +def store(tmp_path: Path) -> KBStore: + return KBStore.init(tmp_path) + + +# --- parser ---------------------------------------------------------------- + + +def test_parse_basic_rollout_extracts_session_meta() -> None: + session = cr.parse_rollout(BASIC) + assert session.session_id == BASIC_SESSION + assert session.cwd == "/home/alice-example/projects/acme-app" + assert session.started_at == "2026-07-01T09:00:00.000Z" + assert session.first_prompt == "add a health endpoint to the acme api" + + +def test_parse_maps_tool_calls_to_observations() -> None: + session = cr.parse_rollout(BASIC) + summaries = [o["summary"] for o in session.observations] + # exec_command with a non-zero exit is marked failed, like live capture + assert "Command failed: pytest -q" in summaries + # ...and the same command succeeding later reads as a plain run + assert "Ran: pytest -q" in summaries + # an apply_patch heredoc through the shell surfaces as a file edit + edit = next(o for o in session.observations if o["tool"] == "Edit") + assert edit["files"] == ["src/acme/api.py"] + assert edit["summary"] == "Edited api.py" + # mcp/custom tools keep their own name + assert any(o["tool"] == "kb_search" for o in session.observations) + # session mechanics (update_plan) are not observations + assert not any("update_plan" in o["tool"] for o in session.observations) + + +def test_parse_keeps_bash_cmd_for_notable_commands() -> None: + session = cr.parse_rollout(BASIC) + bash = [o for o in session.observations if o["tool"] == "Bash"] + assert all(o.get("cmd") for o in bash) + + +def test_patch_observation_verbs() -> None: + add = cr._patch_observation("*** Add File: src/new.py\n") + assert add is not None and add["summary"] == "Created new.py" + delete = cr._patch_observation("*** Delete File: src/old.py\n") + assert delete is not None and delete["summary"] == "Deleted old.py" + update = cr._patch_observation("*** Update File: src/mod.py\n") + assert update is not None and update["summary"] == "Edited mod.py" + mixed = cr._patch_observation("*** Add File: a.py\n*** Delete File: b.py\n") + assert mixed is not None and mixed["summary"] == "Edited 2 files" + + +def test_parse_tolerates_unknown_record_types() -> None: + # rollout-basic.jsonl includes a world_state record and a reasoning + # item; both must be skipped, not fatal. + session = cr.parse_rollout(BASIC) + assert len(session.observations) == 4 + + +def test_parse_without_session_meta_is_actionable_error() -> None: + with pytest.raises(cr.CodexRolloutError, match="session_meta"): + cr.parse_rollout(NO_META) + + +def test_parse_missing_file_is_actionable_error(tmp_path: Path) -> None: + with pytest.raises(cr.CodexRolloutError, match="cannot read"): + cr.parse_rollout(tmp_path / "nope.jsonl") + + +def test_parse_zstd_compressed_is_actionable_error(tmp_path: Path) -> None: + frame = tmp_path / "rollout-2026-07-01T09-00-00-x.jsonl" + frame.write_bytes(b"\x28\xb5\x2f\xfd" + b"\x00" * 16) + with pytest.raises(cr.CodexRolloutError, match="zstd"): + cr.parse_rollout(frame) + + +# --- ingest ---------------------------------------------------------------- + + +def test_ingest_files_one_pending_page(store: KBStore) -> None: + result = cr.ingest_rollout(store, BASIC, generated_at="2026-07-01T10:00:00Z") + pid = result["summary_proposal_id"] + assert pid is not None + assert result["captured"] == 4 + pend = store.list_proposals(ProposalStatus.PENDING) + assert [p.id for p in pend] == [pid] + pr = pend[0] + assert pr.kind == ProposalKind.PAGE + assert pr.proposed_by == cr.CODEX_ACTOR + assert pr.session_id == BASIC_SESSION + assert pr.payload["type"] == "session" + body = pr.payload["body"] + assert "src/acme/api.py" in body + assert "pytest -q" in body + assert pr.payload["title"].startswith("session: add a health endpoint") + assert "[acme-app]" in pr.payload["title"] + + +def test_ingest_respects_vouch_agent_env(store: KBStore, monkeypatch) -> None: + monkeypatch.setenv("VOUCH_AGENT", "codex-nightly") + cr.ingest_rollout(store, BASIC) + pend = store.list_proposals(ProposalStatus.PENDING) + assert pend[0].proposed_by == "codex-nightly" + + +def test_reingest_same_session_is_noop(store: KBStore) -> None: + first = cr.ingest_rollout(store, BASIC) + second = cr.ingest_rollout(store, BASIC) + assert second["skipped"] == "already-ingested" + assert second["summary_proposal_id"] == first["summary_proposal_id"] + assert len(store.list_proposals(None)) == 1 + + +def test_ingest_below_min_files_nothing(store: KBStore) -> None: + store.config_path.write_text("capture:\n min_observations: 99\n") + result = cr.ingest_rollout(store, BASIC) + assert result["skipped"] == "below-min" + assert result["summary_proposal_id"] is None + assert store.list_proposals(None) == [] + + +def test_ingest_noop_when_capture_disabled(store: KBStore) -> None: + store.config_path.write_text("capture:\n enabled: false\n") + result = cr.ingest_rollout(store, BASIC) + assert result["skipped"] == "disabled" + assert store.list_proposals(None) == [] + + +def test_ingest_never_writes_approved_content(store: KBStore) -> None: + """The review gate stays intact: ingest files a proposal, not a page.""" + cr.ingest_rollout(store, BASIC) + assert store.list_pages() == [] + + +# --- --latest resolution ---------------------------------------------------- + + +def _write_rollout(sessions: Path, day: str, stamp: str, sid: str, cwd: str) -> Path: + d = sessions / day + d.mkdir(parents=True, exist_ok=True) + path = d / f"rollout-{stamp}-{sid}.jsonl" + meta = { + "timestamp": f"{day.replace('/', '-')}T00:00:00.000Z", + "type": "session_meta", + "payload": {"id": sid, "session_id": sid, "cwd": cwd}, + } + path.write_text(json.dumps(meta) + "\n", encoding="utf-8") + return path + + +def test_find_latest_rollout_matches_project_cwd(tmp_path: Path) -> None: + home = tmp_path / "codex-home" + sessions = home / "sessions" + project = tmp_path / "proj" + project.mkdir() + other = "/home/alice-example/elsewhere" + _write_rollout(sessions, "2026/07/01", "2026-07-01T08-00-00", "aaa", str(project)) + newest_match = _write_rollout( + sessions, "2026/07/02", "2026-07-02T08-00-00", "bbb", str(project) + ) + _write_rollout(sessions, "2026/07/03", "2026-07-03T08-00-00", "ccc", other) + found = cr.find_latest_rollout(project, codex_home=home) + assert found == newest_match + + +def test_find_latest_rollout_none_when_no_match(tmp_path: Path) -> None: + home = tmp_path / "codex-home" + _write_rollout(home / "sessions", "2026/07/01", "2026-07-01T08-00-00", + "aaa", "/home/alice-example/elsewhere") + project = tmp_path / "proj" + project.mkdir() + assert cr.find_latest_rollout(project, codex_home=home) is None + + +def test_find_latest_rollout_none_without_sessions_dir(tmp_path: Path) -> None: + assert cr.find_latest_rollout(tmp_path, codex_home=tmp_path / "nope") is None + + +# --- CLI surface ------------------------------------------------------------ + + +def test_cli_ingest_codex_files_proposal(store: KBStore, monkeypatch) -> None: + monkeypatch.chdir(store.kb_dir.parent) + res = CliRunner().invoke(cli, ["capture", "ingest-codex", str(BASIC)]) + assert res.exit_code == 0, res.output + out = json.loads(res.output) + assert out["summary_proposal_id"] + assert out["session_id"] == BASIC_SESSION + + +def test_cli_ingest_codex_reingest_reports_noop(store: KBStore, monkeypatch) -> None: + monkeypatch.chdir(store.kb_dir.parent) + runner = CliRunner() + runner.invoke(cli, ["capture", "ingest-codex", str(BASIC)]) + res = runner.invoke(cli, ["capture", "ingest-codex", str(BASIC)]) + assert res.exit_code == 0, res.output + assert json.loads(res.output)["skipped"] == "already-ingested" + + +def test_cli_ingest_codex_malformed_is_clean_error( + store: KBStore, monkeypatch +) -> None: + monkeypatch.chdir(store.kb_dir.parent) + res = CliRunner().invoke(cli, ["capture", "ingest-codex", str(NO_META)]) + assert res.exit_code != 0 + assert "Traceback" not in res.output + assert "Error:" in res.output + assert store.list_proposals(None) == [] + + +def test_cli_ingest_codex_requires_exactly_one_source( + store: KBStore, monkeypatch +) -> None: + monkeypatch.chdir(store.kb_dir.parent) + runner = CliRunner() + neither = runner.invoke(cli, ["capture", "ingest-codex"]) + assert neither.exit_code != 0 + assert "exactly one" in neither.output + both = runner.invoke(cli, ["capture", "ingest-codex", str(BASIC), "--latest"]) + assert both.exit_code != 0 + assert "exactly one" in both.output + + +def test_cli_ingest_codex_latest_resolves_for_project( + store: KBStore, tmp_path: Path, monkeypatch +) -> None: + project = store.kb_dir.parent + home = tmp_path / "codex-home" + sid = "0197bbbb-2222-7000-8000-000000000002" + path = _write_rollout( + home / "sessions", "2026/07/02", "2026-07-02T09-00-00", sid, + str(project.resolve()), + ) + # give the rollout enough activity to clear min_observations + with path.open("a", encoding="utf-8") as fh: + for i in range(3): + fh.write(json.dumps({ + "timestamp": "2026-07-02T09:00:01.000Z", + "type": "response_item", + "payload": { + "type": "function_call", "name": "exec_command", + "arguments": json.dumps({"cmd": f"echo step-{i}"}), + "call_id": f"call_{i}", + }, + }) + "\n") + monkeypatch.chdir(project) + res = CliRunner().invoke( + cli, ["capture", "ingest-codex", "--latest", "--codex-home", str(home)], + ) + assert res.exit_code == 0, res.output + assert json.loads(res.output)["session_id"] == sid + + +def test_cli_ingest_codex_latest_no_rollout_is_clean_error( + store: KBStore, tmp_path: Path, monkeypatch +) -> None: + monkeypatch.chdir(store.kb_dir.parent) + res = CliRunner().invoke( + cli, + ["capture", "ingest-codex", "--latest", "--codex-home", + str(tmp_path / "empty-home")], + ) + assert res.exit_code != 0 + assert "no codex rollout found" in res.output + + +def test_fixtures_use_placeholder_data_only() -> None: + """Privacy rule: fixture rollouts must not carry real paths or names.""" + for fixture in FIXTURES.glob("*.jsonl"): + text = fixture.read_text(encoding="utf-8") + assert "alice-example" in text or "session_meta" not in text + assert "/home/a/" not in text From 79ed4c13b61691950a4d1a3ee43fa8340c99617f Mon Sep 17 00:00:00 2001 From: dripsmvcp <138900956+dripsmvcp@users.noreply.github.com> Date: Mon, 6 Jul 2026 16:44:50 +0900 Subject: [PATCH 067/123] feat(adapters): codex T4 hook wiring for automatic session capture MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit with `vouch capture ingest-codex` available, codex can self-capture the way claude-code T4 does. the ticket assumed the `notify` setting in config.toml, but codex only honours notify in user-global config — it is a restricted key in project-local layers — and the #179 rule forbids touching ~/.codex. codex's hooks system is the project-local equivalent: `.codex/hooks.json` (loaded in trusted projects) fires Stop when a turn completes, with a payload carrying the session id and transcript path. T4 ships that file through json_merge, so an existing user hooks.json is deep-merged into, never overwritten, and re-runs don't duplicate the hook. the handler is a new --hook mode on ingest-codex: read the stop payload from stdin, resolve the session's rollout (transcript_path when present, else by session id in the rollout filename), ingest idempotently, and exit 0 no matter what — the same never-break-the- host rule capture observe follows. stop fires per turn, not per session end, so the finalize policy the ticket left open is resolved as idempotent re-ingest: the dedup guard now refreshes a session's still-PENDING proposal in place when the rollout grew (same id, updated summary, audit-logged), reports an unchanged rollout as a no-op, and never resurrects a proposal a human already decided. storage gains update_proposal, a pure-I/O in-place rewrite of a pending proposal file. wiring only — everything still lands through propose_page; nothing touches approve(). closes #388 --- adapters/codex/README.md | 26 ++++++ adapters/codex/hooks.json | 15 +++ adapters/codex/install.yaml | 11 +++ src/vouch/cli.py | 34 +++++-- src/vouch/codex_rollout.py | 119 ++++++++++++++++++++++-- src/vouch/storage.py | 14 +++ tests/test_codex_rollout.py | 166 +++++++++++++++++++++++++++++++++- tests/test_install_adapter.py | 51 +++++++++++ 8 files changed, 419 insertions(+), 17 deletions(-) create mode 100644 adapters/codex/hooks.json diff --git a/adapters/codex/README.md b/adapters/codex/README.md index ae028608..562b7290 100644 --- a/adapters/codex/README.md +++ b/adapters/codex/README.md @@ -52,6 +52,32 @@ yourself. The skill bodies are identical to the claude-code slash commands (enforced by a sync test), so the flows behave the same on every host. +## Automatic session capture (T4) + +`vouch install-mcp codex` (default tier T4) wires automatic capture +through codex's hooks system: `.codex/hooks.json` registers a `Stop` +hook that runs `vouch capture ingest-codex --hook` when a turn +completes. The handler reads the hook payload, resolves the session's +rollout file, and rolls it into ONE pending session-summary proposal — +the same review-gated summary a claude-code session produces. Because +`Stop` fires per turn, re-ingest is idempotent: an unchanged session +is a no-op, a session that grew refreshes its pending proposal in +place, and a proposal you've already reviewed is never resurrected. + +Failure semantics match `capture observe`: the `--hook` mode exits 0 +no matter what, so a capture problem can never break your codex turn. +Nothing is auto-approved — review with `vouch review`. + +Hooks merge, not clobber: if you already have a `.codex/hooks.json`, +the installer deep-merges the vouch hook in next to yours (re-runs +don't duplicate it). Project-local hooks run in trusted projects only, +so trust the project when codex asks. + +Why not codex's `notify` setting: codex honours `notify` only in +user-global config (`~/.codex/config.toml`), which a project-scoped +install never touches. If you prefer notify anyway, point it at a +wrapper that calls `vouch capture ingest-codex --hook` yourself. + ## Notes - Codex respects MCP tool naming verbatim, so the tools appear as diff --git a/adapters/codex/hooks.json b/adapters/codex/hooks.json new file mode 100644 index 00000000..acaf8d04 --- /dev/null +++ b/adapters/codex/hooks.json @@ -0,0 +1,15 @@ +{ + "hooks": { + "Stop": [ + { + "hooks": [ + { + "type": "command", + "command": "vouch capture ingest-codex --hook", + "statusMessage": "vouch capture" + } + ] + } + ] + } +} diff --git a/adapters/codex/install.yaml b/adapters/codex/install.yaml index 016be7ba..9d4cb447 100644 --- a/adapters/codex/install.yaml +++ b/adapters/codex/install.yaml @@ -38,3 +38,14 @@ tiers: - { src: ../openclaw/skills/vouch-record/SKILL.md, dst: .codex/skills/vouch-record/SKILL.md } - { src: ../openclaw/skills/vouch-followup/SKILL.md, dst: .codex/skills/vouch-followup/SKILL.md } - { src: ../openclaw/skills/vouch-standup/SKILL.md, dst: .codex/skills/vouch-standup/SKILL.md } + # T4 = automatic session capture -- see issue #388. codex's hooks system + # fires Stop when a turn completes; the handler re-ingests the session's + # rollout idempotently (`vouch capture ingest-codex --hook` exits 0 even + # on failure, so capture can never break a codex turn), updating the + # session's single PENDING summary proposal as the session grows. + # hooks live in their own `.codex/hooks.json` file (project-local in + # trusted projects) and json_merge preserves any hooks the user already + # has. note: the legacy `notify` setting can't be used here -- codex only + # honours it in user-global config, which the #179 rule forbids touching. + T4: + - { src: hooks.json, dst: .codex/hooks.json, json_merge: true } diff --git a/src/vouch/cli.py b/src/vouch/cli.py index 329799a1..8cd475a4 100644 --- a/src/vouch/cli.py +++ b/src/vouch/cli.py @@ -2079,22 +2079,44 @@ def capture_finalize_all_cmd(session_id: str | None, max_age_seconds: float) -> "--latest", is_flag=True, help="Resolve the newest codex rollout recorded for this project (by cwd).", ) +@click.option( + "--hook", "hook_mode", is_flag=True, + help="Read a codex Stop-hook payload from stdin; never fails the host " + "(exits 0 even on errors, like `capture observe`).", +) @click.option( "--codex-home", type=click.Path(file_okay=False, path_type=Path), default=None, help="Codex state dir holding sessions/ (default: $CODEX_HOME or ~/.codex).", ) def capture_ingest_codex_cmd( - rollout: Path | None, latest: bool, codex_home: Path | None + rollout: Path | None, latest: bool, hook_mode: bool, codex_home: Path | None ) -> None: """Ingest one codex session rollout into a PENDING summary proposal. - Codex has no live hook stream; it persists each session as a rollout - jsonl instead. This maps the rollout's tool calls into the same - observation shape `capture observe` produces and reuses the existing - rollup, so the result is the same review-gated summary a claude - session yields. Re-ingesting a session is a no-op; review with + Codex has no live notify stream vouch can use project-locally; it + persists each session as a rollout jsonl instead. This maps the + rollout's tool calls into the same observation shape `capture observe` + produces and reuses the existing rollup, so the result is the same + review-gated summary a claude session yields. Re-ingesting an + unchanged session is a no-op; a session that grew since the last + ingest refreshes its one PENDING proposal in place. Review with `vouch review`. """ + if hook_mode: + # Hook wire (codex `Stop` event): parse the stdin payload, resolve + # the session's rollout, ingest idempotently. Exits 0 no matter + # what — capture must never break the user's codex turn. + try: + raw = "" if sys.stdin.isatty() else sys.stdin.read() + payload = json.loads(raw) if raw.strip() else {} + if isinstance(payload, dict): + codex_rollout_mod.ingest_hook_payload( + _capture_store(), payload, codex_home=codex_home + ) + except Exception: + # the hook contract is exit 0 — never surface an error here. + pass + return if (rollout is None) == (not latest): raise click.ClickException("pass exactly one of ROLLOUT or --latest") store = _load_store() diff --git a/src/vouch/codex_rollout.py b/src/vouch/codex_rollout.py index c94684c7..b23d409a 100644 --- a/src/vouch/codex_rollout.py +++ b/src/vouch/codex_rollout.py @@ -31,7 +31,8 @@ from pathlib import Path from typing import Any -from . import capture +from . import audit, capture +from .models import Proposal, ProposalStatus from .proposals import propose_page from .storage import KBStore @@ -297,14 +298,46 @@ def find_latest_rollout(cwd: Path, *, codex_home: Path | None = None) -> Path | return best -def find_existing_proposal(store: KBStore, session_id: str) -> str | None: - """Id of any proposal (any status) already filed for this session.""" +def find_existing_proposal(store: KBStore, session_id: str) -> Proposal | None: + """Any proposal (any status) already filed for this session.""" for proposal in store.list_proposals(None): if proposal.session_id == session_id: - return proposal.id + return proposal return None +def find_rollout_by_session_id( + session_id: str, *, codex_home: Path | None = None +) -> Path | None: + """The rollout file for one session id — codex embeds the id in the + filename (``rollout--.jsonl``), so no file needs opening. + + The session id comes from a hook payload, so it's matched as a literal + filename suffix rather than interpolated into the glob pattern: a + payload carrying glob metacharacters (``*``, ``?``, ``[``) can't widen + the search or change its semantics. + """ + sessions = (codex_home or default_codex_home()) / "sessions" + if not sessions.is_dir() or not session_id.strip(): + return None + suffix = f"-{session_id}.jsonl" + best: Path | None = None + for path in sessions.rglob("rollout-*.jsonl"): + if not path.name.endswith(suffix): + continue + if best is None or path.name > best.name: + best = path + return best + + +def _comparable_body(body: str) -> str: + """The summary body minus its generation timestamp, so re-ingesting an + unchanged rollout compares equal across runs.""" + return "\n".join( + line for line in body.splitlines() if not line.startswith("- generated:") + ) + + def ingest_rollout( store: KBStore, path: Path, @@ -316,8 +349,12 @@ def ingest_rollout( Honours the same ``capture:`` config as live capture (``enabled``, ``min_observations``) so the two front doors gate identically, and - dedups on the rollout's session id: re-ingesting reports the existing - proposal instead of filing a second one. + dedups on the rollout's session id: at most one proposal per session, + ever. Because codex's Stop hook fires per *turn* rather than at session + end, re-ingesting a session that grew since the last ingest refreshes + the still-PENDING proposal in place (same id, updated summary) instead + of filing a duplicate; an unchanged rollout is a flat no-op, and a + decided proposal is history — it blocks re-ingest regardless. """ cfg = capture.load_config(store) session = parse_rollout(path) @@ -330,11 +367,11 @@ def ingest_rollout( } existing = find_existing_proposal(store, session.session_id) - if existing is not None: + if existing is not None and existing.status != ProposalStatus.PENDING: return { "session_id": session.session_id, "captured": len(session.observations), - "summary_proposal_id": existing, + "summary_proposal_id": existing.id, "skipped": "already-ingested", } @@ -358,12 +395,42 @@ def ingest_rollout( generated_at=generated_at or session.started_at, first_prompt=session.first_prompt, ) + resolved_actor = actor or os.environ.get("VOUCH_AGENT") or CODEX_ACTOR + + if existing is not None: + if _comparable_body(body) == _comparable_body( + str(existing.payload.get("body", "")) + ): + return { + "session_id": session.session_id, + "captured": len(session.observations), + "summary_proposal_id": existing.id, + "skipped": "already-ingested", + } + refreshed = existing.model_copy(deep=True) + refreshed.payload["title"] = title.strip() + refreshed.payload["body"] = body + store.update_proposal(refreshed) + audit.log_event( + store.kb_dir, + event="proposal.page.update", + actor=resolved_actor, + object_ids=[existing.id], + data={"reason": "codex rollout re-ingest", "captured": len(session.observations)}, + ) + return { + "session_id": session.session_id, + "captured": len(session.observations), + "summary_proposal_id": existing.id, + "updated": True, + } + proposal = propose_page( store, title=title, body=body, page_type=capture.CAPTURE_PAGE_TYPE, - proposed_by=actor or os.environ.get("VOUCH_AGENT") or CODEX_ACTOR, + proposed_by=resolved_actor, session_id=session.session_id, rationale="ingested codex session rollout", ) @@ -372,3 +439,37 @@ def ingest_rollout( "captured": len(session.observations), "summary_proposal_id": proposal.id, } + + +def ingest_hook_payload( + store: KBStore | None, + payload: dict[str, Any], + *, + codex_home: Path | None = None, +) -> dict[str, Any] | None: + """Handle one codex Stop-hook payload; never raises. + + The hook wire (`vouch capture ingest-codex --hook`) must exit 0 even on + failure — a capture problem must never break the user's codex turn, + the same rule ``capture observe`` follows. Returns the ingest result, + or None when there was nothing safe to do. + """ + try: + if store is None: + return None + session_id = str(payload.get("session_id") or "") + if not session_id: + return None + rollout: Path | None = None + transcript = payload.get("transcript_path") + if isinstance(transcript, str) and transcript.endswith(".jsonl"): + candidate = Path(transcript) + if candidate.is_file(): + rollout = candidate + if rollout is None: + rollout = find_rollout_by_session_id(session_id, codex_home=codex_home) + if rollout is None: + return None + return ingest_rollout(store, rollout) + except Exception: + return None diff --git a/src/vouch/storage.py b/src/vouch/storage.py index 653ea806..2024164c 100644 --- a/src/vouch/storage.py +++ b/src/vouch/storage.py @@ -815,6 +815,20 @@ def put_proposal(self, proposal: Proposal) -> Proposal: ) from e return proposal + def update_proposal(self, proposal: Proposal) -> Proposal: + """Overwrite an existing *pending* proposal file in place. + + Pure I/O: the caller decides whether a refresh is legitimate (only + pending proposals may be rewritten — a decided one is history). + """ + path = self._proposal_path(proposal.id) + if not path.exists(): + raise ArtifactNotFoundError(f"proposal {proposal.id}") + path.write_text( + _yaml_dump(proposal.model_dump(mode="json")), encoding="utf-8" + ) + return proposal + def get_proposal(self, proposal_id: str) -> Proposal: for path in (self._proposal_path(proposal_id), self._decided_path(proposal_id)): if path.exists(): diff --git a/tests/test_codex_rollout.py b/tests/test_codex_rollout.py index 353b6046..2969008c 100644 --- a/tests/test_codex_rollout.py +++ b/tests/test_codex_rollout.py @@ -139,7 +139,9 @@ def test_reingest_same_session_is_noop(store: KBStore) -> None: def test_ingest_below_min_files_nothing(store: KBStore) -> None: - store.config_path.write_text("capture:\n min_observations: 99\n") + store.config_path.write_text( + "capture:\n min_observations: 99\n", encoding="utf-8" + ) result = cr.ingest_rollout(store, BASIC) assert result["skipped"] == "below-min" assert result["summary_proposal_id"] is None @@ -147,7 +149,9 @@ def test_ingest_below_min_files_nothing(store: KBStore) -> None: def test_ingest_noop_when_capture_disabled(store: KBStore) -> None: - store.config_path.write_text("capture:\n enabled: false\n") + store.config_path.write_text( + "capture:\n enabled: false\n", encoding="utf-8" + ) result = cr.ingest_rollout(store, BASIC) assert result["skipped"] == "disabled" assert store.list_proposals(None) == [] @@ -159,6 +163,164 @@ def test_ingest_never_writes_approved_content(store: KBStore) -> None: assert store.list_pages() == [] +# --- per-turn re-ingest: refresh the pending proposal (vouchdev/vouch#388) -- + + +def _grown_copy(tmp_path: Path) -> Path: + """BASIC plus one more tool call, same session id — a later turn.""" + grown = tmp_path / f"rollout-2026-07-01T09-30-00-{BASIC_SESSION}.jsonl" + extra = { + "timestamp": "2026-07-01T09:30:00.000Z", + "type": "response_item", + "payload": { + "type": "function_call", "name": "exec_command", + "arguments": json.dumps({"cmd": "ruff check src"}), + "call_id": "call_extra", + }, + } + grown.write_text( + BASIC.read_text(encoding="utf-8") + json.dumps(extra) + "\n", + encoding="utf-8", + ) + return grown + + +def test_reingest_grown_session_updates_pending_in_place( + store: KBStore, tmp_path: Path +) -> None: + first = cr.ingest_rollout(store, BASIC) + pid = first["summary_proposal_id"] + second = cr.ingest_rollout(store, _grown_copy(tmp_path)) + assert second["updated"] is True + assert second["summary_proposal_id"] == pid + proposals = store.list_proposals(None) + assert len(proposals) == 1 # refreshed, not duplicated + assert "ruff check src" in proposals[0].payload["body"] + assert proposals[0].status == ProposalStatus.PENDING + + +def test_reingest_decided_session_stays_decided( + store: KBStore, tmp_path: Path +) -> None: + """A proposal the human already reviewed is history — a later turn must + not resurrect or mutate it.""" + from vouch.proposals import approve + + first = cr.ingest_rollout(store, BASIC) + approve(store, first["summary_proposal_id"], approved_by="alice-example") + result = cr.ingest_rollout(store, _grown_copy(tmp_path)) + assert result["skipped"] == "already-ingested" + assert len(store.list_proposals(ProposalStatus.PENDING)) == 0 + + +def test_reingest_update_lands_in_audit_log(store: KBStore, tmp_path: Path) -> None: + from vouch import audit + + cr.ingest_rollout(store, BASIC) + cr.ingest_rollout(store, _grown_copy(tmp_path)) + events = [e.event for e in audit.read_events(store.kb_dir)] + assert "proposal.page.update" in events + + +# --- hook wire (--hook): codex Stop event ------------------------------------ + + +def test_ingest_hook_payload_files_proposal(store: KBStore) -> None: + result = cr.ingest_hook_payload( + store, + {"session_id": BASIC_SESSION, "transcript_path": str(BASIC), + "hook_event_name": "Stop", "cwd": str(store.kb_dir.parent)}, + ) + assert result is not None + assert result["summary_proposal_id"] + + +def test_ingest_hook_payload_resolves_by_session_id( + store: KBStore, tmp_path: Path +) -> None: + home = tmp_path / "codex-home" + day = home / "sessions" / "2026" / "07" / "01" + day.mkdir(parents=True) + rollout = day / f"rollout-2026-07-01T09-00-00-{BASIC_SESSION}.jsonl" + rollout.write_text(BASIC.read_text(encoding="utf-8"), encoding="utf-8") + result = cr.ingest_hook_payload( + store, {"session_id": BASIC_SESSION}, codex_home=home + ) + assert result is not None + assert result["summary_proposal_id"] + + +def test_ingest_hook_payload_never_raises(store: KBStore, tmp_path: Path) -> None: + assert cr.ingest_hook_payload(None, {"session_id": "x"}) is None + assert cr.ingest_hook_payload(store, {}) is None + assert ( + cr.ingest_hook_payload( + store, {"session_id": "no-such-session"}, + codex_home=tmp_path / "empty", + ) + is None + ) + + +def test_cli_hook_mode_files_proposal(store: KBStore, monkeypatch) -> None: + monkeypatch.chdir(store.kb_dir.parent) + payload = json.dumps({ + "session_id": BASIC_SESSION, + "transcript_path": str(BASIC), + "hook_event_name": "Stop", + }) + res = CliRunner().invoke( + cli, ["capture", "ingest-codex", "--hook"], input=payload + ) + assert res.exit_code == 0, res.output + assert len(store.list_proposals(ProposalStatus.PENDING)) == 1 + + +def test_cli_hook_mode_exits_zero_on_garbage(store: KBStore, monkeypatch) -> None: + monkeypatch.chdir(store.kb_dir.parent) + res = CliRunner().invoke( + cli, ["capture", "ingest-codex", "--hook"], input="{ not json" + ) + assert res.exit_code == 0, res.output + + +def test_cli_hook_mode_exits_zero_without_kb(tmp_path: Path, monkeypatch) -> None: + monkeypatch.chdir(tmp_path) # no .vouch anywhere above tmp_path + payload = json.dumps({"session_id": BASIC_SESSION, "transcript_path": str(BASIC)}) + res = CliRunner().invoke( + cli, ["capture", "ingest-codex", "--hook"], input=payload + ) + assert res.exit_code == 0, res.output + + +def test_find_rollout_by_session_id(tmp_path: Path) -> None: + home = tmp_path / "codex-home" + day = home / "sessions" / "2026" / "07" / "01" + day.mkdir(parents=True) + target = day / "rollout-2026-07-01T09-00-00-sess-42.jsonl" + target.write_text("{}", encoding="utf-8") + (day / "rollout-2026-07-01T10-00-00-sess-43.jsonl").write_text( + "{}", encoding="utf-8" + ) + assert cr.find_rollout_by_session_id("sess-42", codex_home=home) == target + assert cr.find_rollout_by_session_id("sess-99", codex_home=home) is None + + +def test_find_rollout_by_session_id_treats_glob_chars_literally( + tmp_path: Path, +) -> None: + """A session id from a hook payload is matched as a literal suffix, so + glob metacharacters can't widen the search to unrelated rollouts.""" + home = tmp_path / "codex-home" + day = home / "sessions" / "2026" / "07" / "01" + day.mkdir(parents=True) + (day / "rollout-2026-07-01T09-00-00-sess-42.jsonl").write_text( + "{}", encoding="utf-8" + ) + # `*` must not match the real session above. + assert cr.find_rollout_by_session_id("sess-*", codex_home=home) is None + + # --- --latest resolution ---------------------------------------------------- diff --git a/tests/test_install_adapter.py b/tests/test_install_adapter.py index e4adad83..64fe097f 100644 --- a/tests/test_install_adapter.py +++ b/tests/test_install_adapter.py @@ -523,6 +523,57 @@ def test_install_codex_t3_is_idempotent(tmp_path: Path) -> None: assert f".codex/skills/{name}/SKILL.md" in second.skipped +# --- codex: T4 hooks.json capture wiring (vouchdev/vouch#388) --------------- + + +def test_codex_t4_writes_hooks_json(tmp_path: Path) -> None: + """Fresh T4 install wires the Stop hook so a completed codex session + lands as a PENDING summary proposal with no manual steps.""" + result = install("codex", target=tmp_path, tier="T4") + hooks_path = tmp_path / ".codex" / "hooks.json" + assert hooks_path.is_file() + assert ".codex/hooks.json" in result.written + data = json.loads(hooks_path.read_text(encoding="utf-8")) + cmds = [ + h["command"] + for g in data["hooks"]["Stop"] + for h in g["hooks"] + ] + assert "vouch capture ingest-codex --hook" in cmds + + +def test_codex_t4_merges_into_existing_hooks_json(tmp_path: Path) -> None: + """An existing user hook is never silently overwritten — ours merges in + next to it via the json_merge machinery.""" + codex_dir = tmp_path / ".codex" + codex_dir.mkdir() + (codex_dir / "hooks.json").write_text(json.dumps({ + "hooks": { + "Stop": [ + {"hooks": [{"type": "command", "command": "my-own-stop-hook"}]} + ] + } + }), encoding="utf-8") + result = install("codex", target=tmp_path, tier="T4") + data = json.loads((codex_dir / "hooks.json").read_text(encoding="utf-8")) + cmds = [h["command"] for g in data["hooks"]["Stop"] for h in g["hooks"]] + assert "my-own-stop-hook" in cmds + assert "vouch capture ingest-codex --hook" in cmds + assert ".codex/hooks.json" in result.merged + + +def test_codex_t4_rerun_does_not_duplicate_hook(tmp_path: Path) -> None: + install("codex", target=tmp_path, tier="T4") + first = (tmp_path / ".codex" / "hooks.json").read_text(encoding="utf-8") + second = install("codex", target=tmp_path, tier="T4") + after = (tmp_path / ".codex" / "hooks.json").read_text(encoding="utf-8") + assert first == after + assert ".codex/hooks.json" in second.skipped + data = json.loads(after) + cmds = [h["command"] for g in data["hooks"]["Stop"] for h in g["hooks"]] + assert cmds.count("vouch capture ingest-codex --hook") == 1 + + # --- codex: config.toml deep-merge (vouchdev/vouch#384) --------------------- From f8020a2a695500eb1643c28ef1ab9d25033f43cf Mon Sep 17 00:00:00 2001 From: dripsmvcp <138900956+dripsmvcp@users.noreply.github.com> Date: Mon, 6 Jul 2026 16:49:18 +0900 Subject: [PATCH 068/123] test(adapters): live codex install gate against the real cli MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit tests/test_openclaw_plugin_load_real.py set the pattern: exercise the real host cli when it's on PATH, skip cleanly where it isn't. the codex adapter had no equivalent, so regressions in the shipped config only surfaced when a user hit them — the old T1 silent-skip no-op is exactly the class of bug a live gate would have caught. the new suite installs the adapter into a temp project at T4, marks the project trusted inside an isolated CODEX_HOME, and asserts through `codex mcp list --json` that the vouch server is visible: next to a pre-seeded unrelated server on the merge path, alone on the fresh path, and absent for an untrusted project (the config must stay inert where codex says it does). a full-tier check covers the fenced AGENTS.md, the skills, and the Stop hook, and an isolation check pins every written artifact under the temp project. assertions target the observable contract — server listed, config parses, snippet present — not codex internals, so version bumps shouldn't break the suite. no network, no credentials, never touches the real ~/.codex; runs in the normal pytest invocation. closes #389 --- tests/test_codex_adapter_load_real.py | 199 ++++++++++++++++++++++++++ 1 file changed, 199 insertions(+) create mode 100644 tests/test_codex_adapter_load_real.py diff --git a/tests/test_codex_adapter_load_real.py b/tests/test_codex_adapter_load_real.py new file mode 100644 index 00000000..de230b49 --- /dev/null +++ b/tests/test_codex_adapter_load_real.py @@ -0,0 +1,199 @@ +"""Tier-2 e2e: the real Codex CLI reads the installed adapter (#389). + +The unit tests in test_install_adapter.py assert what the installer writes; +nothing there proves the real codex CLI accepts it — the old T1 silent-skip +behavior (installer no-op whenever `.codex/config.toml` existed) is exactly +the class of bug only a live gate catches. This suite closes that gap, +following the pattern tests/test_openclaw_plugin_load_real.py set: install +the adapter into a temp project at the highest shipped tier, mark the +project trusted inside an isolated ``CODEX_HOME``, and assert through codex +itself (``codex mcp list --json``) that the vouch server is visible — next +to a pre-seeded unrelated server on the merge path, and alone on the +fresh-install path. + +Assertions target the observable contract (server listed, config parses, +snippet present), not codex internals, so codex version bumps shouldn't +break the suite. Skips when the ``codex`` CLI is not on PATH (e.g. GitHub +CI). Every codex invocation runs with a throwaway ``CODEX_HOME`` and a temp +project cwd, so the user's real ``~/.codex`` is never touched; listing +configured servers needs no network and no credentials. +""" + +from __future__ import annotations + +import json +import os +import shutil +import subprocess +import tomllib +from pathlib import Path + +import pytest + +from vouch.install_adapter import install + +CODEX = shutil.which("codex") + +pytestmark = pytest.mark.skipif(CODEX is None, reason="codex CLI not on PATH") + + +def _run_codex( + env: dict[str, str], cwd: Path, *args: str +) -> subprocess.CompletedProcess[str]: + assert CODEX is not None + return subprocess.run( + [CODEX, *args], + env=env, + cwd=cwd, + capture_output=True, + text=True, + timeout=120, + check=False, + ) + + +def _isolated_env(home: Path) -> dict[str, str]: + home.mkdir(parents=True, exist_ok=True) + return {**os.environ, "CODEX_HOME": str(home)} + + +def _trust(home: Path, project: Path) -> None: + # Codex loads project-scoped .codex/ layers only for trusted projects; + # this is the non-interactive equivalent of answering the trust prompt. + # The path is a TOML quoted key, so escape it with json.dumps (TOML + # basic strings share JSON's escaping) — a backslash or quote in the + # path would otherwise produce invalid TOML. + key = json.dumps(str(project)) + with (home / "config.toml").open("a", encoding="utf-8") as fh: + fh.write(f'[projects.{key}]\ntrust_level = "trusted"\n') + + +def _mcp_servers(env: dict[str, str], cwd: Path) -> list[dict]: + result = _run_codex(env, cwd, "mcp", "list", "--json") + assert result.returncode == 0, ( + f"codex mcp list failed.\nstdout: {result.stdout}\nstderr: {result.stderr}" + ) + # `codex mcp list --json` may emit a one-time notice before the JSON, + # so try a straight parse first and fall back to slicing from the first + # bracket; on failure surface stdout/stderr so the reason is actionable. + try: + servers = json.loads(result.stdout) + except json.JSONDecodeError: + start = result.stdout.find("[") + if start == -1: + raise AssertionError( + f"codex mcp list produced no JSON array.\n" + f"stdout: {result.stdout!r}\nstderr: {result.stderr!r}" + ) from None + try: + servers = json.loads(result.stdout[start:]) + except json.JSONDecodeError as e: + raise AssertionError( + f"codex mcp list JSON did not parse: {e}\n" + f"stdout: {result.stdout!r}\nstderr: {result.stderr!r}" + ) from e + assert isinstance(servers, list) + return servers + + +def test_merge_install_is_visible_to_codex(tmp_path: Path) -> None: + """The #384 regression at the live level: a project where codex is + already configured must end up with vouch wired next to the user's + existing server, as seen by codex itself.""" + home = tmp_path / "codex-home" + project = tmp_path / "project" + (project / ".codex").mkdir(parents=True) + (project / ".codex" / "config.toml").write_text( + 'model = "gpt-5"\n\n[mcp_servers.other]\ncommand = "other-server"\n', + encoding="utf-8", + ) + + install("codex", target=project, tier="T4") + + # the merged file is still valid toml with both servers side by side + merged = tomllib.loads( + (project / ".codex" / "config.toml").read_text(encoding="utf-8") + ) + assert merged["model"] == "gpt-5" + assert set(merged["mcp_servers"]) == {"other", "vouch"} + + env = _isolated_env(home) + _trust(home, project) + servers = {s["name"]: s for s in _mcp_servers(env, project)} + assert "vouch" in servers, f"vouch not listed: {sorted(servers)}" + assert "other" in servers, "user's pre-existing server disappeared" + transport = servers["vouch"]["transport"] + assert transport["command"] == "vouch" + assert transport["args"] == ["serve"] + + +def test_fresh_install_is_visible_to_codex(tmp_path: Path) -> None: + home = tmp_path / "codex-home" + project = tmp_path / "project" + project.mkdir() + + install("codex", target=project, tier="T4") + + env = _isolated_env(home) + _trust(home, project) + names = [s["name"] for s in _mcp_servers(env, project)] + assert names == ["vouch"], names + + +def test_untrusted_project_config_stays_inert(tmp_path: Path) -> None: + """Codex ignores project-scoped config for untrusted projects — the + install must not leak into a session the user never trusted.""" + home = tmp_path / "codex-home" + project = tmp_path / "project" + project.mkdir() + install("codex", target=project, tier="T4") + + env = _isolated_env(home) # note: no _trust() call + names = [s["name"] for s in _mcp_servers(env, project)] + assert "vouch" not in names, names + + +def test_full_tier_artifacts_present(tmp_path: Path) -> None: + """The T4 install ships every codex-readable surface: merged config, + fenced AGENTS.md, the nine skills, and the Stop hook.""" + home = tmp_path / "codex-home" + project = tmp_path / "project" + project.mkdir() + install("codex", target=project, tier="T4") + + agents = (project / "AGENTS.md").read_text(encoding="utf-8") + assert "" in agents + assert "VOUCH_AGENT=codex" in agents.replace("`", "") + + assert (project / ".codex" / "skills" / "vouch-recall" / "SKILL.md").is_file() + + hooks = json.loads( + (project / ".codex" / "hooks.json").read_text(encoding="utf-8") + ) + cmds = [h["command"] for g in hooks["hooks"]["Stop"] for h in g["hooks"]] + assert "vouch capture ingest-codex --hook" in cmds + + # and codex still accepts the whole tree + env = _isolated_env(home) + _trust(home, project) + assert [s["name"] for s in _mcp_servers(env, project)] == ["vouch"] + + +def test_nothing_written_outside_project_and_home(tmp_path: Path) -> None: + """#179 invariant at the live level: after an install plus a codex + invocation, the throwaway home holds only what we put there and the + project holds only adapter artifacts — the real ~/.codex is never in + play because CODEX_HOME is pinned for every invocation.""" + home = tmp_path / "codex-home" + project = tmp_path / "project" + project.mkdir() + result = install("codex", target=project, tier="T4") + for rel in (*result.written, *result.appended, *result.merged): + assert (project / rel).resolve().is_relative_to(project.resolve()) + + env = _isolated_env(home) + _trust(home, project) + _mcp_servers(env, project) + # the trust entry is the only file vouch's test wrote into the home; + # codex may add its own state (caches, logs) but only under that home. + assert (home / "config.toml").is_file() From 4b93764e6f99976db943dc9379fb3e393e1f111c Mon Sep 17 00:00:00 2001 From: dripsmvcp <138900956+dripsmvcp@users.noreply.github.com> Date: Mon, 6 Jul 2026 16:52:30 +0900 Subject: [PATCH 069/123] docs(adapters): codex adapter docs reflect the tiered install three surfaces went stale once the codex tier work landed. the adapters table row described codex as a one-file config.toml snippet; it now lists the tiered install. the codex adapter readme led with the manual ~/.codex edit; it now leads with `vouch install-mcp codex`, explains the project-local .codex/config.toml choice and the trust requirement, summarizes what each tier adds (mcp wire / AGENTS.md snippet / skills / capture hook) with the merge-safety guarantees, and keeps the manual edit as an explicit fallback section. getting-started treated codex as a one-liner aside inside the claude instructions; the install section now shows both hosts side by side. the prompts-location decision from the T3 ticket and the notify restriction from the T4 ticket stay documented in their sections. no code; placeholder examples only. closes #390 --- adapters/README.md | 2 +- adapters/codex/README.md | 96 +++++++++++++++++++++++----------------- docs/getting-started.md | 14 ++++-- 3 files changed, 68 insertions(+), 44 deletions(-) diff --git a/adapters/README.md b/adapters/README.md index f4edce8c..84bb8127 100644 --- a/adapters/README.md +++ b/adapters/README.md @@ -10,7 +10,7 @@ file you need into your project and edit it. |---|---|---| | [claude-code/](claude-code/) | Anthropic's Claude Code CLI | `.mcp.json` snippet, `CLAUDE.md` excerpt | | [cursor/](cursor/) | Cursor IDE | `mcp.json` snippet | -| [codex/](codex/) | OpenAI's Codex CLI | `config.toml` snippet | +| [codex/](codex/) | OpenAI's Codex CLI | tiered install: `.codex/config.toml` merge, `AGENTS.md` excerpt, skills, capture hook | | [continue/](continue/) | Continue.dev | `config.json` snippet | | [openclaw/](openclaw/) | OpenClaw plugin host | `.openclaw/plugins.json`, `AGENTS.md` excerpt | | [generic-mcp/](generic-mcp/) | Any MCP-speaking host | annotated reference | diff --git a/adapters/codex/README.md b/adapters/codex/README.md index 562b7290..5b8666c4 100644 --- a/adapters/codex/README.md +++ b/adapters/codex/README.md @@ -1,45 +1,43 @@ # Codex CLI adapter -Wires `vouch serve` into [OpenAI's Codex CLI][codex] as an MCP server. +Wires vouch into [OpenAI's Codex CLI][codex]: the MCP server, standing +`AGENTS.md` instructions, the vouch guided flows as skills, and +automatic session capture. [codex]: https://github.com/openai/codex -## Setup +## Install ```bash -vouch install-mcp codex +vouch install-mcp codex # everything (T1–T4) +vouch install-mcp codex --tier T1 # just the MCP wire ``` -This writes the `vouch` MCP entry into the *project-local* -`/.codex/config.toml` (deep-merged into any existing one, so -your other servers and settings are preserved) — never into -`~/.codex/config.toml`, per the project-scoped install rule. Codex -loads project-local `.codex/` config for trusted projects, so trust -the project when codex asks. +Everything lands in the *project*, never in `~/.codex` — the same +scope rule every adapter follows. Codex loads project-local `.codex/` +config for trusted projects, so trust the project when codex asks. -Prefer a user-global setup, or no installer? Add the entry to -`~/.codex/config.toml` (or `/.codex/config.toml`) by hand: +What each tier adds (tiers stack): -```toml -[mcp_servers.vouch] -command = "vouch" -args = ["serve"] +| Tier | File | What it does | +|---|---|---| +| T1 | `.codex/config.toml` | registers the `vouch` MCP server (`kb_search`, `kb_propose_claim`, …) with `VOUCH_AGENT=codex` for audit attribution | +| T2 | `AGENTS.md` | fenced snippet with the standing rules: recall first, all writes via proposals, review stays human | +| T3 | `.codex/skills/vouch-*/SKILL.md` | the nine vouch guided flows as project-local skills | +| T4 | `.codex/hooks.json` | `Stop` hook that auto-captures each session into a pending, review-gated summary | -[mcp_servers.vouch.env] -VOUCH_AGENT = "codex" -``` - -Restart any running `codex` session. +The install is idempotent and merge-safe: an existing +`.codex/config.toml` or `.codex/hooks.json` is deep-merged into (your +entries always win on conflict), an existing `AGENTS.md` gets the +snippet appended inside fence markers, and re-runs are a flat no-op. ## Skills (T3) -`vouch install-mcp codex --tier T3` also drops the vouch guided flows -(`vouch-recall`, `vouch-status`, `vouch-resolve-issue`, -`vouch-propose-from-pr`, plus the company-brain set) into the -project-local `.codex/skills/` directory. Codex discovers skills from -`/.codex/skills/` in trusted projects, so they surface in the -session automatically — ask for a skill by name (e.g. "use the -vouch-recall skill for X") or let codex pick them up from context. +Codex discovers skills from `/.codex/skills/` in trusted +projects, so the flows (`vouch-recall`, `vouch-status`, +`vouch-resolve-issue`, `vouch-propose-from-pr`, plus the company-brain +set) surface in the session automatically — ask for one by name or let +codex pick them up from context. Why skills and not custom prompts: codex loads custom prompts only from `~/.codex/prompts/` (user-global) and has deprecated them in @@ -54,30 +52,48 @@ The skill bodies are identical to the claude-code slash commands ## Automatic session capture (T4) -`vouch install-mcp codex` (default tier T4) wires automatic capture -through codex's hooks system: `.codex/hooks.json` registers a `Stop` -hook that runs `vouch capture ingest-codex --hook` when a turn -completes. The handler reads the hook payload, resolves the session's -rollout file, and rolls it into ONE pending session-summary proposal — -the same review-gated summary a claude-code session produces. Because -`Stop` fires per turn, re-ingest is idempotent: an unchanged session -is a no-op, a session that grew refreshes its pending proposal in -place, and a proposal you've already reviewed is never resurrected. +`.codex/hooks.json` registers a `Stop` hook that runs `vouch capture +ingest-codex --hook` when a turn completes. The handler reads the hook +payload, resolves the session's rollout file, and rolls it into ONE +pending session-summary proposal — the same review-gated summary a +claude-code session produces. Because `Stop` fires per turn, re-ingest +is idempotent: an unchanged session is a no-op, a session that grew +refreshes its pending proposal in place, and a proposal you've already +reviewed is never resurrected. Failure semantics match `capture observe`: the `--hook` mode exits 0 no matter what, so a capture problem can never break your codex turn. Nothing is auto-approved — review with `vouch review`. -Hooks merge, not clobber: if you already have a `.codex/hooks.json`, -the installer deep-merges the vouch hook in next to yours (re-runs -don't duplicate it). Project-local hooks run in trusted projects only, -so trust the project when codex asks. +Past sessions can be ingested by hand too: + +```bash +vouch capture ingest-codex --latest # newest rollout for this project +vouch capture ingest-codex # a specific one +``` Why not codex's `notify` setting: codex honours `notify` only in user-global config (`~/.codex/config.toml`), which a project-scoped install never touches. If you prefer notify anyway, point it at a wrapper that calls `vouch capture ingest-codex --hook` yourself. +## Manual fallback + +No installer, or a user-global setup on purpose? Add the entry to +`~/.codex/config.toml` (or `/.codex/config.toml`) by hand: + +```toml +[mcp_servers.vouch] +command = "vouch" +args = ["serve"] + +[mcp_servers.vouch.env] +VOUCH_AGENT = "codex" +``` + +Restart any running `codex` session, then confirm with +`codex mcp list`. + ## Notes - Codex respects MCP tool naming verbatim, so the tools appear as diff --git a/docs/getting-started.md b/docs/getting-started.md index bb9ac038..b1003078 100644 --- a/docs/getting-started.md +++ b/docs/getting-started.md @@ -118,9 +118,17 @@ Add `-e VOUCH_AGENT=claude-code` to attribute the agent's proposals to it rather than your shell user. Confirm with `claude mcp list` (look for `vouch … ✓ Connected`). -Prefer a config file, or want the brain-first `CLAUDE.md`, slash commands, and -hooks too? Run `vouch install-mcp claude-code` — or drop this into `.mcp.json` -at the project root by hand: +Prefer a config file, or want the brain-first instructions, guided flows, and +capture hooks too? The installer ships the full tiered setup for either host: + +```bash +vouch install-mcp claude-code # .mcp.json + CLAUDE.md + slash commands + hooks +vouch install-mcp codex # .codex/config.toml + AGENTS.md + skills + capture +``` + +Both are idempotent and merge-safe — existing config files are deep-merged +into, never clobbered. Or drop this into `.mcp.json` at the project root by +hand: ```json { From 1ac6cbbc61549e49b5ee202f863fb079f3a91627 Mon Sep 17 00:00:00 2001 From: plind-junior <59729252+plind-junior@users.noreply.github.com> Date: Tue, 7 Jul 2026 14:50:38 +0900 Subject: [PATCH 070/123] =?UTF-8?q?docs(mcp):=20design=20a=20friendlier=20?= =?UTF-8?q?mcp=20surface=20=E2=80=94=20profiles=20+=20auto-recall?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit the closest competitor (pmb) exposes 10 mcp tools by default and hides the rest behind a profile flag; vouch shows all 58 every turn, which is the main first-touch friendliness gap. this spec adds a minimal-by-default tool profile, fusion-by-default retrieval, a per-prompt auto-recall hook, and compact tool descriptions. all of it is presentation-only — the review gate, the yaml storage, and the protocol method surface are untouched. it also closes the current 2-of-3 surface-parity gap as a bonus. --- ...026-07-07-friendlier-mcp-surface-design.md | 145 ++++++++++++++++++ 1 file changed, 145 insertions(+) create mode 100644 docs/superpowers/specs/2026-07-07-friendlier-mcp-surface-design.md diff --git a/docs/superpowers/specs/2026-07-07-friendlier-mcp-surface-design.md b/docs/superpowers/specs/2026-07-07-friendlier-mcp-surface-design.md new file mode 100644 index 00000000..fc5b4e1d --- /dev/null +++ b/docs/superpowers/specs/2026-07-07-friendlier-mcp-surface-design.md @@ -0,0 +1,145 @@ +# friendlier mcp surface — tool profiles + per-prompt auto-recall — design + +date: 2026-07-07 +status: approved-direction, pending user review of this spec +decided with user: the main reason vouch feels less user-friendly than pmb is +its mcp surface — 58 tools shoved at the agent every turn. lead with slimming +that surface + auto-recall; search-fusion rides underneath as the quality layer. + +## context + +a code-grounded comparison against pmb (pmbai.dev, `oleksiijko/pmb`) — the +closest competitor — isolated *why* pmb feels smoother on first touch. it is +almost entirely the mcp surface: + +| | pmb | vouch (today) | +|---|---|---| +| tools the agent sees | **10** (default profile) | **58** (all, always) | +| gating mechanism | `PMB_TOOL_PROFILE`, minimal by default | **none** | +| tool names | intent-first (`recall`, `remember`) | mechanic-first (`kb_propose_claim`) | +| recall a memory | 0 tool calls (auto-injected each prompt) | agent must call `kb_context`/`kb_search` | +| context cost | compact one-liners, ~16kb saved | 58 verbose descriptions, paid every turn | + +pmb defines **69** tools too — it just exposes 10 by default and hides the +other 59 behind a profile flag (`_toolspec.py`, `server.py:446-478` registers +all then removes those outside the active profile). vouch surfaces its whole +propose→approve→supersede→contradict→synthesize→maintenance lifecycle at once +because the review gate is the product — but the *agent* rarely needs 50 of +those tools, and reading them every turn is the friendliness tax. + +the key insight: this is a **presentation** problem, not a capability problem. +the fix touches only which mcp tools are *shown* to a given agent. the protocol +surface, the jsonl and cli surfaces, and — critically — the review gate are all +unchanged. + +## scope + +one slice, four moves, in priority order: + +1. **mcp tool profiles** — a `minimal` default that shows ~7 core tools; the + rest move to `standard`/`full`. the biggest first-touch win, self-contained. +2. **fusion-by-default retrieval** — wire the already-built `rrf_fuse` into the + context path so recall quality is good (prerequisite for move 3 feeling + good). add recency preference + near-duplicate drop. +3. **per-prompt auto-recall** — a `UserPromptSubmit` hook that injects + relevant context every turn → recall becomes 0 tool calls, like pmb. +4. **compact tool descriptions** — one-line descriptions under non-`full` + profiles to stop burning context. nice-to-have; lands last. + +**out of scope** (later slices): the follow-rate "was it used?" loop and +reproducible A/B numbers (that's the *better-proven* slice); a warm daemon for +sub-50ms injection (only if cold-spawn latency bites); bundling a local +embedding model by default (a packaging decision with its own weight); +auto-*write* of claims from observed actions (pmb does this; for vouch it must +route through the gate as proposals — a separate design). + +## move 1 — tool profiles + +### the profiles + +- **`minimal` (default)** — the everyday knowledge loop, agent-facing: + `kb_context`, `kb_search`, `kb_read_page`, `kb_propose_claim`, + `kb_propose_page`, `kb_status`, `kb_list_pending`. (7 tools.) +- **`standard`** — minimal + the review lifecycle for unattended agents: + `kb_approve`, `kb_reject`, `kb_supersede`, `kb_contradict`, `kb_confirm`, + `kb_read_claim`, `kb_list_claims`, `kb_neighbors`, `kb_why`. (~16 tools.) +- **`full`** — all 58 (maintenance, provenance, eval, import/export, themes). + +approve/reject are deliberately **not** in `minimal`: approval is a human +action done at the cli or review ui, so hiding it from a first-run agent is +correct, not lossy. `standard` exists for the "let an agent run the whole loop" +case. + +### mechanism + +mirror pmb: register every `@mcp.tool()` as today, then, at server build time, +read the active profile and remove tools outside it from the fastmcp tool +manager (`mcp._tool_manager`). the profile → tool-name sets live in one place — +a new `src/vouch/mcp_profiles.py` (a dict of profile → frozenset of method +names), imported by `server.py`. config precedence: `VOUCH_TOOL_PROFILE` env +var overrides `mcp.tool_profile` in `config.yaml`, default `minimal`. + +`capabilities.METHODS` still lists all 58 — the profile filters *exposure*, not +the protocol. `mcp_profiles.py` must be exhaustive: a meta-test asserts every +name in every profile exists in `METHODS`, and that `full` == `METHODS`, so a +new tool can't silently fall out of `full`. + +## move 2 — fusion by default + +in `context.py:_retrieve`, add a `hybrid` branch that fuses semantic + fts +results via the existing `embeddings/fusion.py:rrf_fuse` instead of the current +first-non-empty waterfall; add `hybrid` to `_VALID_BACKENDS`; flip the +`storage.py` default backend to `hybrid` (gracefully degrading to fts when the +embeddings extra is absent). then, before the context-budget clip: a cheap +recency multiplier and a greedy near-duplicate (MMR-style) drop. the CI recall +eval (`eval/recall.py`, `eval.yml`, 0.05 regression floor) is the guardrail — +fusion should raise those numbers and can't regress them. + +## move 3 — per-prompt auto-recall + +add a `UserPromptSubmit` hook to `adapters/claude-code/.claude/settings.json` +that runs `vouch context "$PROMPT"` with a budget-capped, structured output the +harness injects as additional context. mirror into the cursor adapter and +`install_adapter.py` tiers. **approach: cold spawn first** — it runs once per +turn (not per keystroke), so a few hundred ms is usually invisible; measure it, +and only build the warm daemon (generalizing the existing openclaw rpc) if it +feels laggy. this replaces reliance on the session-start `recall` firehose, +which is not query-relevant. + +## move 4 — compact descriptions + +under `minimal`/`standard`, serve a one-line description per tool (a +`SHORT_DESC` map, or the docstring's first line) instead of the full docstring; +`full` keeps the complete docstrings. lands last; the tool-count cut is the +bulk of the context win. + +## invariants preserved + +- **review gate untouched** — no write-path change; propose stays gated; + approve/reject remain fully available (cli, review ui, `standard`/`full`). +- **git-native yaml, no saas, protocol surface unchanged** — `METHODS`, jsonl, + and cli keep all 58; only mcp *exposure* narrows. +- **3-surface parity** — the parity test is extended to enumerate the *full* + mcp tool set + cli commands against `METHODS` (closing the current 2-of-3 + gap as a bonus), checked against `full`, not the active profile. + +## verification + +- new `tests/test_mcp_profiles.py`: `minimal` exposes exactly the 7; `full` + exposes all 58; every profile name ⊆ `METHODS`; env var overrides config. +- extended `tests/test_capabilities.py`: full mcp tools + cli commands vs + `METHODS` (the real 3-surface check). +- recall eval green / improved with fusion (ci-gated). +- manual before/after: fresh claude-code install shows ~7 tools not 58; + a prompt gets relevant context injected with 0 tool calls; record the + cold-spawn hook latency. + +## risks + +- **hidden tool confusion** — an agent (or user) may look for a tool that's in + `full` but not `minimal`. mitigation: `kb_capabilities` (in `minimal`) and + the docs list the profiles and how to widen with `VOUCH_TOOL_PROFILE`. +- **fusion regressing recall on some queries** — mitigated by the ci eval + floor; keep `backend` pinnable in config for escape. +- **hook latency on large KBs** — measured in verification; warm-daemon + fast-follow is the known escape hatch. From b14cf0608ee345cbd932361c51be98180539a8f6 Mon Sep 17 00:00:00 2001 From: plind-junior <59729252+plind-junior@users.noreply.github.com> Date: Tue, 7 Jul 2026 15:04:03 +0900 Subject: [PATCH 071/123] docs(mcp): plan the friendlier-mcp-surface build MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit six TDD tasks: tool profiles (minimal default), real mcp↔methods parity, fusion-by-default retrieval, near-duplicate drop, per-prompt auto-recall hook, and compact tool descriptions. reconcile the spec: minimal is 8 tools (kb_capabilities kept as the discovery escape hatch) and the recency multiplier is deferred (per-hit timestamps aren't plumbed through _retrieve). --- .../2026-07-07-friendlier-mcp-surface.md | 930 ++++++++++++++++++ ...026-07-07-friendlier-mcp-surface-design.md | 24 +- 2 files changed, 945 insertions(+), 9 deletions(-) create mode 100644 docs/superpowers/plans/2026-07-07-friendlier-mcp-surface.md diff --git a/docs/superpowers/plans/2026-07-07-friendlier-mcp-surface.md b/docs/superpowers/plans/2026-07-07-friendlier-mcp-surface.md new file mode 100644 index 00000000..f68021cc --- /dev/null +++ b/docs/superpowers/plans/2026-07-07-friendlier-mcp-surface.md @@ -0,0 +1,930 @@ +# Friendlier MCP Surface Implementation Plan + +> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking. + +**Goal:** Make vouch feel as friendly as pmb by narrowing the MCP tool surface an agent sees (58 → ~8 by default), fusing retrieval by default, and injecting relevant context on every prompt — all without touching the review gate. + +**Architecture:** A new `mcp_profiles` module filters which `@mcp.tool()` tools the stdio server exposes (applied in `run_stdio`, not at import, so tests and the parity check still see all 58). `context._retrieve` is rewritten so `auto`/`hybrid` fuse embedding + FTS5 via the existing `rrf_fuse` instead of a first-non-empty waterfall, with a cheap near-duplicate drop. A tiny, always-safe `hooks` helper + a hidden `vouch context-hook` CLI command feed a Claude Code `UserPromptSubmit` hook so recall costs zero tool calls. + +**Tech Stack:** Python 3.11–3.13, `mcp.server.fastmcp.FastMCP`, click CLI, pytest, pydantic v2, yaml config, sqlite FTS5 + optional embeddings. + +## Global Constraints + +- **Review gate is untouched.** No task changes the write path (`proposals.py`, `lifecycle.py`, `storage.put_*`). Profiles change *exposure* only. +- **Protocol surface unchanged.** `capabilities.METHODS`, the JSONL `HANDLERS`, and the CLI keep all 58 methods. Only which MCP tools are *shown* narrows. +- **Default profile is `minimal`.** Resolution: `VOUCH_TOOL_PROFILE` env var > `config.yaml` `mcp.tool_profile` > `"minimal"`. Unknown → `"minimal"`. +- **CI gate must stay green:** `.venv/bin/python -m pytest tests/ -q --ignore=tests/embeddings`, `.venv/bin/python -m mypy src`, `.venv/bin/python -m ruff check src tests`. Every new function is fully type-annotated (mypy `src` is strict). +- **Commits:** conventional-commit format, summary ≤72 chars, lowercase body, **no `Co-Authored-By` trailer**. This repo's hooks reject `git commit -m` with heredocs and may reject `-m` outright — write the message to `/tmp/msg.txt` with the Write tool (never a heredoc) and use `git commit -F /tmp/msg.txt`. Stage files by name, never `git add -A`. +- **Branch:** `feat/friendlier-mcp-surface` (already created off `origin/main`; the spec is already committed on it). +- **Profile tool sets (dotted `METHODS` names), authoritative:** + - `minimal` (8): `kb.capabilities`, `kb.status`, `kb.context`, `kb.search`, `kb.read_page`, `kb.propose_claim`, `kb.propose_page`, `kb.list_pending` + - `standard` (minimal + 9 = 17): + `kb.approve`, `kb.reject`, `kb.supersede`, `kb.contradict`, `kb.confirm`, `kb.read_claim`, `kb.list_claims`, `kb.neighbors`, `kb.why` + - `full`: all of `capabilities.METHODS` (58) +- MCP tool names use `_`; `METHODS` uses `.`. Transform: `"kb.foo_bar"` ↔ `"kb_foo_bar"` via the substring after the first separator. + +--- + +### Task 1: MCP tool profiles + +**Files:** +- Create: `src/vouch/mcp_profiles.py` +- Modify: `src/vouch/server.py` (add import; apply profile inside `run_stdio` at `server.py:1011-1015`) +- Test: `tests/test_mcp_profiles.py` + +**Interfaces:** +- Produces: `mcp_profiles.PROFILES: dict[str, frozenset[str]]`, `mcp_profiles.DEFAULT_PROFILE: str`, `resolve_profile_name(config: dict | None = None) -> str`, `tool_names_for(name: str) -> set[str]`, `apply_tool_profile(mcp, name: str) -> list[str]` (returns removed underscore tool names, sorted). +- Consumes (Task 6): `compact_descriptions(mcp) -> int` is added to this module later. + +- [ ] **Step 1: Write the failing test** — create `tests/test_mcp_profiles.py`: + +```python +"""MCP tool profiles narrow the surface an agent sees (friendlier-mcp slice).""" + +from __future__ import annotations + +import pytest +from mcp.server.fastmcp import FastMCP + +from vouch import mcp_profiles +from vouch.capabilities import METHODS + +_MINIMAL_TOOLS = { + "kb_capabilities", "kb_status", "kb_context", "kb_search", + "kb_read_page", "kb_propose_claim", "kb_propose_page", "kb_list_pending", +} + + +def _make(name: str): + def fn(x: int = 0) -> int: + return x + fn.__name__ = name + return fn + + +def _fresh_mcp() -> FastMCP: + m = FastMCP("probe") + for method in METHODS: + m.tool()(_make("kb_" + method.split(".", 1)[1])) + return m + + +def test_full_profile_removes_nothing() -> None: + m = _fresh_mcp() + removed = mcp_profiles.apply_tool_profile(m, "full") + assert removed == [] + assert len(m._tool_manager._tools) == len(METHODS) + + +def test_minimal_exposes_core_only() -> None: + m = _fresh_mcp() + mcp_profiles.apply_tool_profile(m, "minimal") + assert set(m._tool_manager._tools) == _MINIMAL_TOOLS + + +def test_standard_is_superset_of_minimal() -> None: + assert mcp_profiles.PROFILES["minimal"] <= mcp_profiles.PROFILES["standard"] + + +def test_every_profile_is_subset_of_methods() -> None: + allm = set(METHODS) + for name, methods in mcp_profiles.PROFILES.items(): + assert methods <= allm, f"{name} references non-methods: {methods - allm}" + assert mcp_profiles.PROFILES["full"] == allm + + +def test_resolve_env_beats_config(monkeypatch: pytest.MonkeyPatch) -> None: + monkeypatch.setenv("VOUCH_TOOL_PROFILE", "full") + assert mcp_profiles.resolve_profile_name({"mcp": {"tool_profile": "minimal"}}) == "full" + + +def test_resolve_default_is_minimal(monkeypatch: pytest.MonkeyPatch) -> None: + monkeypatch.delenv("VOUCH_TOOL_PROFILE", raising=False) + assert mcp_profiles.resolve_profile_name(None) == "minimal" + + +def test_unknown_profile_falls_back_to_minimal(monkeypatch: pytest.MonkeyPatch) -> None: + monkeypatch.setenv("VOUCH_TOOL_PROFILE", "bogus") + assert mcp_profiles.resolve_profile_name(None) == "minimal" +``` + +- [ ] **Step 2: Run test to verify it fails** + +Run: `.venv/bin/python -m pytest tests/test_mcp_profiles.py -q` +Expected: FAIL — `ModuleNotFoundError: No module named 'vouch.mcp_profiles'`. + +- [ ] **Step 3: Write minimal implementation** — create `src/vouch/mcp_profiles.py`: + +```python +"""MCP tool profiles — narrow the tool surface an agent sees by default. + +vouch exposes 58 kb.* methods. Handing all of them to an agent every turn is +the main first-touch friendliness cost (the closest competitor, pmb, exposes +~10 by default and hides the rest behind a profile flag). Profiles control +*exposure* only: the JSONL and CLI surfaces, the protocol method list +(capabilities.METHODS), and the review gate are unchanged. + +Resolution order: VOUCH_TOOL_PROFILE env var > config.yaml `mcp.tool_profile` +> "minimal" (the default). Unknown names fall back to "minimal". +""" + +from __future__ import annotations + +import os +from typing import Any + +from .capabilities import METHODS + +_MINIMAL: frozenset[str] = frozenset({ + "kb.capabilities", + "kb.status", + "kb.context", + "kb.search", + "kb.read_page", + "kb.propose_claim", + "kb.propose_page", + "kb.list_pending", +}) + +_STANDARD: frozenset[str] = _MINIMAL | frozenset({ + "kb.approve", + "kb.reject", + "kb.supersede", + "kb.contradict", + "kb.confirm", + "kb.read_claim", + "kb.list_claims", + "kb.neighbors", + "kb.why", +}) + +PROFILES: dict[str, frozenset[str]] = { + "minimal": _MINIMAL, + "standard": _STANDARD, + "full": frozenset(METHODS), +} + +DEFAULT_PROFILE = "minimal" + + +def _tool_name(method: str) -> str: + """`"kb.propose_claim"` -> `"kb_propose_claim"` (MCP tool names use `_`).""" + return "kb_" + method.split(".", 1)[1] + + +def resolve_profile_name(config: dict[str, Any] | None = None) -> str: + """Pick the active profile from env > config > default.""" + raw = os.environ.get("VOUCH_TOOL_PROFILE") + if not raw and config: + raw = config.get("mcp", {}).get("tool_profile") + name = str(raw).strip().lower() if raw else DEFAULT_PROFILE + return name if name in PROFILES else DEFAULT_PROFILE + + +def tool_names_for(name: str) -> set[str]: + """The MCP (underscore) tool names exposed by profile `name`.""" + return {_tool_name(m) for m in PROFILES.get(name, PROFILES[DEFAULT_PROFILE])} + + +def apply_tool_profile(mcp: Any, name: str) -> list[str]: + """Remove every registered `kb_*` MCP tool not in profile `name`. + + Returns the sorted list of removed tool names. Idempotent. `full` removes + nothing. Only `kb_*` tools are touched, so trust/diagnostic tools + registered elsewhere are never dropped. + """ + keep = tool_names_for(name) + tools = mcp._tool_manager._tools + removed: list[str] = [] + for tool_name in list(tools.keys()): + if tool_name.startswith("kb_") and tool_name not in keep: + tools.pop(tool_name, None) + removed.append(tool_name) + return sorted(removed) +``` + +- [ ] **Step 4: Run test to verify it passes** + +Run: `.venv/bin/python -m pytest tests/test_mcp_profiles.py -q` +Expected: PASS (7 tests). + +- [ ] **Step 5: Wire the profile into the stdio server** — modify `src/vouch/server.py`. Add to the imports near the top (with the other `from .` imports, e.g. after `from .synthesize import synthesize` at line 56): + +```python +from . import mcp_profiles +``` + +Then replace `run_stdio` (currently `server.py:1011-1015`): + +```python +def run_stdio() -> None: + """Entry point used by `vouch serve`.""" + configure_logging() + trust_mod.set_stdio_default(trust_mod.MCP_STDIO) + try: + cfg: dict[str, Any] | None = _load_cfg(_store()) + except Exception: + cfg = None + mcp_profiles.apply_tool_profile(mcp, mcp_profiles.resolve_profile_name(cfg)) + mcp.run() +``` + +(`Any` is already imported in `server.py`; `_load_cfg` is at `server.py:204` and `_store` at `server.py:61`.) + +- [ ] **Step 6: Verify server still imports and mypy/ruff pass** + +Run: `.venv/bin/python -c "import vouch.server"` → Expected: no output, exit 0. +Run: `.venv/bin/python -m mypy src/vouch/mcp_profiles.py src/vouch/server.py` → Expected: `Success`. +Run: `.venv/bin/python -m ruff check src/vouch/mcp_profiles.py src/vouch/server.py` → Expected: `All checks passed!`. + +- [ ] **Step 7: Commit** + +Write `/tmp/msg.txt`: +``` +feat(mcp): add tool profiles, expose a minimal surface by default + +agents saw all 58 kb.* tools every turn — the main first-touch friendliness +gap vs pmb, which exposes ~10 by default. add a profile layer applied in +run_stdio: minimal (8 core tools) by default, standard (16), or full (58), +selected by VOUCH_TOOL_PROFILE / config mcp.tool_profile. exposure only — the +protocol surface, jsonl/cli, and the review gate are unchanged. +``` +Run: +```bash +git add src/vouch/mcp_profiles.py src/vouch/server.py tests/test_mcp_profiles.py +git commit -F /tmp/msg.txt +``` + +--- + +### Task 2: Enforce true MCP↔METHODS parity + +**Files:** +- Modify: `tests/test_capabilities.py` + +**Interfaces:** +- Consumes: `vouch.server.mcp` (the module-level, unfiltered `FastMCP`), `vouch.capabilities.METHODS`. + +**Why:** `test_capabilities.py` today only checks `capabilities.METHODS == JSONL HANDLERS`. The 58 MCP tools were never compared to `METHODS`, so MCP drift passed CI (the CLAUDE.md "all three surfaces" claim was really 2-of-3). Importing `vouch.server` registers all tools but does **not** apply a profile (that happens only in `run_stdio`), so this sees the full surface. + +- [ ] **Step 1: Write the failing test** — append to `tests/test_capabilities.py`: + +```python +def test_mcp_tools_match_methods() -> None: + """Every MCP kb_* tool maps to a capabilities method and vice-versa. + + Closes the MCP half of the 3-surface parity invariant that the JSONL + check above did not cover. Uses the unfiltered server object (profiles + apply only in run_stdio). + """ + from vouch.server import mcp + + tool_names = {n for n in mcp._tool_manager._tools if n.startswith("kb_")} + as_methods = {"kb." + n.split("_", 1)[1] for n in tool_names} + declared = set(capabilities.METHODS) + assert as_methods == declared, ( + f"mcp/methods mismatch: " + f"missing tools={declared - as_methods}, " + f"undeclared tools={as_methods - declared}" + ) +``` + +- [ ] **Step 2: Run test to verify it passes or reveals real drift** + +Run: `.venv/bin/python -m pytest tests/test_capabilities.py -q` +Expected: PASS if the 58 tools already align with `METHODS`. If it FAILS, the message names the exact drift — fix `capabilities.METHODS` or the tool registration in `server.py` until it passes (this is a real bug the test just caught, not a test error). Do not weaken the assertion. + +- [ ] **Step 3: Commit** + +Write `/tmp/msg.txt`: +``` +test(capabilities): assert mcp tool set matches the method list + +the parity test only compared capabilities.METHODS to the jsonl handlers; +the 58 mcp tools were never checked, so mcp drift passed ci. enumerate the +unfiltered server tools and assert they equal METHODS — the real 3-surface +check for the mcp side. +``` +Run: +```bash +git add tests/test_capabilities.py +git commit -F /tmp/msg.txt +``` + +--- + +### Task 3: Fuse retrieval by default + +**Files:** +- Modify: `src/vouch/context.py` (`_VALID_BACKENDS` at line 45; rewrite `_retrieve` body at lines 90-120; add a top-level import) +- Modify: `src/vouch/storage.py` (default backend at line 96) +- Modify: `tests/test_retrieval_backend.py` (update the two `auto` tests whose behavior intentionally changes; add a hybrid-fusion test) + +**Interfaces:** +- Consumes: `vouch.embeddings.fusion.rrf_fuse(a, b, *, limit=10, k=60)` where `a`/`b` are `list[tuple[str, str, str, float]]` (kind, id, summary, score). +- Produces: `_retrieve` now tags fused hits with backend `"hybrid"`; `auto` and `hybrid` both fuse embedding + FTS5. + +- [ ] **Step 1: Update the two tests whose behavior changes + add the fusion test.** In `tests/test_retrieval_backend.py`, replace `test_backend_auto_prefers_embedding` (lines 82-89) and `test_unset_backend_defaults_to_auto` (lines 92-101) with: + +```python +def test_backend_auto_now_fuses( + store: KBStore, monkeypatch: pytest.MonkeyPatch +) -> None: + """`auto` no longer waterfalls embedding-first; it fuses embedding + fts5 + (RRF) and tags hits `hybrid`.""" + _force_semantic_hit(monkeypatch) + _set_backend(store, "auto") + pack = context.build_context_pack(store, query="JWT") + assert pack["items"] + assert _backends(pack) == {"hybrid"} + + +def test_unset_backend_fuses( + store: KBStore, monkeypatch: pytest.MonkeyPatch +) -> None: + """A config with no retrieval.backend behaves like fused `auto`.""" + _force_semantic_hit(monkeypatch) + cfg = yaml.safe_load(store.config_path.read_text()) + cfg.get("retrieval", {}).pop("backend", None) + store.config_path.write_text(yaml.safe_dump(cfg)) + pack = context.build_context_pack(store, query="JWT") + assert _backends(pack) == {"hybrid"} + + +def test_backend_hybrid_merges_semantic_and_lexical( + store: KBStore, monkeypatch: pytest.MonkeyPatch +) -> None: + """`hybrid` returns the union of both retrievers, not first-non-empty.""" + src = store.put_source(b"e2") + store.put_claim(Claim(id="c2", text="OAuth refresh flow", evidence=[src.id])) + health.rebuild_index(store) + monkeypatch.setattr( + context.index_db, "search_semantic", + lambda *a, **k: [("claim", "c1", "JWT token rotation", 0.99)], + ) + monkeypatch.setattr( + context.index_db, "search", + lambda *a, **k: [("claim", "c2", "OAuth refresh flow", 0.88)], + ) + _set_backend(store, "hybrid") + pack = context.build_context_pack(store, query="auth") + assert {item["id"] for item in pack["items"]} == {"c1", "c2"} + assert _backends(pack) == {"hybrid"} +``` + +- [ ] **Step 2: Run tests to verify the new ones fail** + +Run: `.venv/bin/python -m pytest tests/test_retrieval_backend.py -q` +Expected: FAIL — `test_backend_auto_now_fuses` / `test_unset_backend_fuses` / `test_backend_hybrid_merges_semantic_and_lexical` fail because `hybrid` isn't accepted yet and `auto` still waterfalls (backend is `embedding`, not `hybrid`). + +- [ ] **Step 3: Implement fusion.** In `src/vouch/context.py`: + +(a) Add near the top imports (after the existing `from . import` block): +```python +from .embeddings.fusion import rrf_fuse +``` +(`fusion.py` is pure-Python with no heavy deps, so a top-level import is safe under the base install.) + +(b) Change `_VALID_BACKENDS` (line 45): +```python +_VALID_BACKENDS = ("auto", "hybrid", "embedding", "fts5", "substring") +``` + +(c) Replace the body of `_retrieve` from line 90 (`backend = _configured_backend(store)`) through line 120 (the final substring `return`) with: +```python + backend = _configured_backend(store) + fetch_limit = scoped_fetch_limit(limit, viewer) + + if backend in ("auto", "hybrid"): + sem = index_db.search_semantic(store.kb_dir, query, limit=fetch_limit) + try: + lex = index_db.search(store.kb_dir, query, limit=fetch_limit) + except sqlite3.Error: + lex = [] + fused = rrf_fuse(sem, lex, limit=fetch_limit) + if fused: + filtered = filter_hits(store, fused, viewer, limit=limit) + return [(k, i, s, sc, "hybrid") for k, i, s, sc in filtered] + # both retrievers empty -> fall through to the substring scan below. + + if backend == "embedding": + raw = index_db.search_semantic(store.kb_dir, query, limit=fetch_limit) + if raw: + filtered = filter_hits(store, raw, viewer, limit=limit) + return [(k, i, s, sc, "embedding") for k, i, s, sc in filtered] + return [] + + if backend == "fts5": + try: + hits = index_db.search(store.kb_dir, query, limit=fetch_limit) + if hits: + filtered = filter_hits(store, hits, viewer, limit=limit) + return [(k, i, s, sc, "fts5") for k, i, s, sc in filtered] + except sqlite3.Error: + pass + return [] + + substring_hits = store.search_substring(query, limit=fetch_limit) + filtered = filter_hits(store, substring_hits, viewer, limit=limit) + return [(k, i, s, sc, "substring") for k, i, s, sc in filtered] +``` + +(d) In `src/vouch/storage.py` line 96, change the init default so new KBs say `hybrid` explicitly: +```python + "backend": "hybrid", +``` + +- [ ] **Step 4: Run tests to verify they pass** + +Run: `.venv/bin/python -m pytest tests/test_retrieval_backend.py -q` +Expected: PASS. `test_backend_fts5_skips_embedding`, `test_backend_embedding_is_recognized`, `test_backend_substring_only` still pass (explicit pins unchanged). + +- [ ] **Step 5: Guard against retrieval-quality regression + mypy/ruff** + +Run: `.venv/bin/python -m pytest tests/test_context.py tests/test_index.py -q` → Expected: PASS. +Run: `.venv/bin/python -m vouch eval recall eval/queries.jsonl --kb eval/fixture-kb --baseline eval/baseline.json --max-regression 0.05` (the exact args `eval.yml` uses; if the CLI flags differ, run `.venv/bin/vouch eval recall --help` and match them) → Expected: no regression beyond 0.05. +Run: `.venv/bin/python -m mypy src/vouch/context.py src/vouch/storage.py` → Expected: `Success`. +Run: `.venv/bin/python -m ruff check src/vouch/context.py src/vouch/storage.py` → Expected: `All checks passed!`. + +- [ ] **Step 6: Commit** + +Write `/tmp/msg.txt`: +``` +feat(retrieval): fuse embedding + fts5 by default instead of a waterfall + +_retrieve tried embedding, then fts5, then substring, returning the first +non-empty list — so lexical and semantic hits never combined. auto and +hybrid now fuse both retrievers with the already-built rrf_fuse and tag hits +"hybrid"; explicit embedding/fts5/substring pins are unchanged. existing KBs +(config says "auto") benefit with no migration. +``` +Run: +```bash +git add src/vouch/context.py src/vouch/storage.py tests/test_retrieval_backend.py +git commit -F /tmp/msg.txt +``` + +--- + +### Task 4: Drop near-duplicate context items + +**Files:** +- Modify: `src/vouch/context.py` (add `_jaccard` + `_dedupe_near_duplicates`; call it in `build_context_pack` after graph expansion, ~line 256) +- Test: `tests/test_retrieval_backend.py` (add one test; reuses the existing `store` fixture) + +**Interfaces:** +- Produces: `build_context_pack` drops lower-scored items whose summary is near-identical (token-set Jaccard ≥ 0.85) to a higher-scored kept item. + +- [ ] **Step 1: Write the failing test** — append to `tests/test_retrieval_backend.py`: + +```python +def test_near_duplicate_summaries_are_dropped( + store: KBStore, monkeypatch: pytest.MonkeyPatch +) -> None: + """An agent should not see the same fact twice.""" + src = store.put_source(b"z") + store.put_claim(Claim( + id="d1", text="the cache uses redis with a 60 second ttl", evidence=[src.id])) + store.put_claim(Claim( + id="d2", text="the cache uses redis with a 60 second ttl now", evidence=[src.id])) + health.rebuild_index(store) + monkeypatch.setattr( + context.index_db, "search_semantic", + lambda *a, **k: [ + ("claim", "d1", "the cache uses redis with a 60 second ttl", 0.90), + ("claim", "d2", "the cache uses redis with a 60 second ttl now", 0.89), + ], + ) + monkeypatch.setattr(context.index_db, "search", lambda *a, **k: []) + _set_backend(store, "hybrid") + pack = context.build_context_pack(store, query="cache") + assert {item["id"] for item in pack["items"]} == {"d1"} +``` + +- [ ] **Step 2: Run test to verify it fails** + +Run: `.venv/bin/python -m pytest tests/test_retrieval_backend.py::test_near_duplicate_summaries_are_dropped -q` +Expected: FAIL — both `d1` and `d2` present. + +- [ ] **Step 3: Implement the dedupe pass.** In `src/vouch/context.py`, add these helpers above `build_context_pack` (e.g. after `_append_graph_neighbors`, ~line 198): + +```python +def _jaccard(a: set[str], b: set[str]) -> float: + if not a or not b: + return 0.0 + return len(a & b) / len(a | b) + + +def _dedupe_near_duplicates(items: list[ContextItem]) -> list[ContextItem]: + """Drop later items whose summary is near-identical to a kept one. + + Cheap greedy pass (token-set Jaccard >= 0.85 over the first 40 tokens). + `items` must arrive in descending-score order so the higher-scored + duplicate is the one kept. + """ + kept: list[ContextItem] = [] + kept_tokens: list[set[str]] = [] + for it in items: + toks = set(it.summary.lower().split()[:40]) + if any(_jaccard(toks, seen) >= 0.85 for seen in kept_tokens): + continue + kept.append(it) + kept_tokens.append(toks) + return kept +``` + +Then in `build_context_pack`, immediately after the `if expand_graph:` block closes (after line 256, before the `failed: list[str] = []` line at 257) insert: + +```python + items = _dedupe_near_duplicates(items) +``` + +- [ ] **Step 4: Run test to verify it passes** + +Run: `.venv/bin/python -m pytest tests/test_retrieval_backend.py -q` → Expected: PASS (all, including the earlier fusion tests — single non-duplicate hits are unaffected). + +- [ ] **Step 5: mypy/ruff** + +Run: `.venv/bin/python -m mypy src/vouch/context.py` → Expected: `Success`. +Run: `.venv/bin/python -m ruff check src/vouch/context.py` → Expected: `All checks passed!`. + +- [ ] **Step 6: Commit** + +Write `/tmp/msg.txt`: +``` +feat(retrieval): drop near-duplicate items from the context pack + +a fused pack could surface the same fact from two claims. add a cheap greedy +jaccard pass (>=0.85 over the first 40 tokens) that keeps the highest-scored +of a near-duplicate cluster, so an agent never reads the same thing twice. +``` +Run: +```bash +git add src/vouch/context.py tests/test_retrieval_backend.py +git commit -F /tmp/msg.txt +``` + +--- + +### Task 5: Per-prompt auto-recall hook + +**Files:** +- Create: `src/vouch/hooks.py` +- Modify: `src/vouch/cli.py` (add a hidden `context-hook` command near the `context` command at `cli.py:2272`) +- Modify: `adapters/claude-code/.claude/settings.json` (add a `UserPromptSubmit` hook) +- Test: `tests/test_hooks.py` + +**Interfaces:** +- Produces: `hooks.build_claude_prompt_hook(store: KBStore, stdin_text: str) -> str` — returns the JSON envelope to inject, or `""` for nothing. Never raises. +- Consumes: `context.build_context_pack`, `cli._load_store`. + +- [ ] **Step 1: Write the failing test** — create `tests/test_hooks.py`: + +```python +"""The per-prompt hook injects relevant KB context with zero tool calls.""" + +from __future__ import annotations + +import json +from pathlib import Path + +import pytest + +from vouch import context, health, hooks +from vouch.models import Claim +from vouch.storage import KBStore + + +@pytest.fixture +def store(tmp_path: Path) -> KBStore: + s = KBStore.init(tmp_path) + src = s.put_source(b"e") + s.put_claim(Claim(id="c1", text="deploys run on tuesdays via ci", evidence=[src.id])) + health.rebuild_index(s) + return s + + +def _force_hit(monkeypatch: pytest.MonkeyPatch) -> None: + monkeypatch.setattr( + context.index_db, "search_semantic", + lambda *a, **k: [("claim", "c1", "deploys run on tuesdays via ci", 0.9)], + ) + monkeypatch.setattr(context.index_db, "search", lambda *a, **k: []) + + +def test_empty_prompt_injects_nothing(store: KBStore) -> None: + assert hooks.build_claude_prompt_hook(store, json.dumps({"prompt": ""})) == "" + assert hooks.build_claude_prompt_hook(store, "") == "" + + +def test_relevant_prompt_yields_additional_context( + store: KBStore, monkeypatch: pytest.MonkeyPatch +) -> None: + _force_hit(monkeypatch) + out = hooks.build_claude_prompt_hook(store, json.dumps({"prompt": "when do deploys run"})) + env = json.loads(out) + assert env["hookSpecificOutput"]["hookEventName"] == "UserPromptSubmit" + assert "tuesdays" in env["hookSpecificOutput"]["additionalContext"] + + +def test_raw_non_json_stdin_is_tolerated( + store: KBStore, monkeypatch: pytest.MonkeyPatch +) -> None: + _force_hit(monkeypatch) + out = hooks.build_claude_prompt_hook(store, "when do deploys run") + assert "tuesdays" in json.loads(out)["hookSpecificOutput"]["additionalContext"] + + +def test_no_hits_injects_nothing( + store: KBStore, monkeypatch: pytest.MonkeyPatch +) -> None: + monkeypatch.setattr(context.index_db, "search_semantic", lambda *a, **k: []) + monkeypatch.setattr(context.index_db, "search", lambda *a, **k: []) + assert hooks.build_claude_prompt_hook(store, json.dumps({"prompt": "zzznomatch"})) == "" +``` + +- [ ] **Step 2: Run test to verify it fails** + +Run: `.venv/bin/python -m pytest tests/test_hooks.py -q` +Expected: FAIL — `ModuleNotFoundError: No module named 'vouch.hooks'`. + +- [ ] **Step 3: Implement the helper** — create `src/vouch/hooks.py`: + +```python +"""Host-hook helpers: translate an agent host's prompt hook into KB context. + +Claude Code's UserPromptSubmit hook passes a JSON payload on stdin and injects +whatever the hook prints (as an `additionalContext` envelope) before the model +runs. `build_claude_prompt_hook` turns that payload into a compact, relevant +context block drawn from *approved* KB knowledge — so recall costs the agent +zero tool calls. It never raises: on any problem it returns "" (inject +nothing), so a hook failure can never block the user's turn. +""" + +from __future__ import annotations + +import json +from typing import Any + +from .context import build_context_pack +from .storage import KBStore + +_MAX_ITEMS = 8 +_MAX_CHARS = 2000 + + +def _render(pack: dict[str, Any]) -> str: + lines: list[str] = [] + for item in pack.get("items", []): + summary = str(item.get("summary", "")).strip() + if not summary: + continue + cites = item.get("citations") or [] + suffix = f" [{', '.join(cites)}]" if cites else "" + lines.append(f"- {summary}{suffix}") + return "\n".join(lines) + + +def build_claude_prompt_hook(store: KBStore, stdin_text: str) -> str: + """Return the stdout a host should inject for this prompt, or "" for none.""" + try: + payload = json.loads(stdin_text) if stdin_text.strip() else {} + except json.JSONDecodeError: + payload = {"prompt": stdin_text} + prompt = str(payload.get("prompt", "")).strip() + if not prompt: + return "" + try: + pack = build_context_pack( + store, query=prompt, limit=_MAX_ITEMS, max_chars=_MAX_CHARS, + ) + except Exception: + return "" + body = _render(pack) if isinstance(pack, dict) else "" + if not body: + return "" + block = ( + "Relevant knowledge from the project's vouch KB " + "(approved & cited — consider it before answering):\n" + body + ) + return json.dumps({ + "hookSpecificOutput": { + "hookEventName": "UserPromptSubmit", + "additionalContext": block, + } + }) +``` + +- [ ] **Step 4: Run test to verify it passes** + +Run: `.venv/bin/python -m pytest tests/test_hooks.py -q` → Expected: PASS (4 tests). + +- [ ] **Step 5: Add the hidden CLI command.** In `src/vouch/cli.py`, immediately after the `context` command (after `_emit_json(pack)` at `cli.py:2299`, before the `synthesize` command at 2302) add: + +```python +@cli.command(name="context-hook", hidden=True) +def context_hook() -> None: + """Emit relevant KB context for a host UserPromptSubmit hook (reads stdin). + + Wired by the claude-code adapter; not meant to be run by hand. Reads the + host's JSON hook payload on stdin, prints an additionalContext envelope, + and always exits 0 so it can never block a turn. + """ + import sys + + from . import hooks + + stdin_text = sys.stdin.read() + try: + out = hooks.build_claude_prompt_hook(_load_store(), stdin_text) + except Exception: + out = "" + if out: + click.echo(out) +``` + +- [ ] **Step 6: Verify the command runs end-to-end** + +Run: `printf '{"prompt":"anything"}' | .venv/bin/vouch context-hook` from inside a KB dir (or `cd eval/fixture-kb && printf '{"prompt":"jwt"}' | ../../.venv/bin/vouch context-hook`). +Expected: either empty output (no hits) or a single line of JSON containing `"hookEventName": "UserPromptSubmit"`. Never a traceback, always exit 0 (`echo $?` → `0`). + +- [ ] **Step 7: Wire the hook into the claude-code adapter.** In `adapters/claude-code/.claude/settings.json`, add a `UserPromptSubmit` block inside `"hooks"` (after the `SessionStart` block, before `PostToolUse`). The file's `"hooks"` object becomes: + +```json + "hooks": { + "SessionStart": [ + { + "comment": "finalize old buffers from previous sessions; current session will be finalized here too on next session start (fallback: windowclose event not yet supported by claude-code extension)", + "matcher": "*", + "hooks": [ + { "type": "command", "command": "vouch capture finalize-all || true" }, + { "type": "command", "command": "vouch status --json || true" }, + { "type": "command", "command": "vouch capture banner || true" }, + { "type": "command", "command": "vouch recall || true" } + ] + } + ], + "UserPromptSubmit": [ + { + "comment": "inject KB context relevant to THIS prompt (per-prompt auto-recall, 0 tool calls); never blocks the turn", + "matcher": "*", + "hooks": [ + { "type": "command", "command": "vouch context-hook || true" } + ] + } + ], + "PostToolUse": [ + { + "matcher": "*", + "hooks": [ + { "type": "command", "command": "vouch capture observe || true" } + ] + } + ], + "SessionEnd": [ + { + "matcher": "*", + "hooks": [ + { "type": "command", "command": "vouch capture finalize || true" } + ] + } + ] + } +``` + +(`kb_context` is already in the adapter's permission allowlist, and the hook uses the CLI, so no permission change is needed. `vouch recall` stays at SessionStart — it serves the session banner, a different purpose from per-prompt recall.) + +- [ ] **Step 8: Verify the adapter JSON stays valid + install-merge test passes** + +Run: `.venv/bin/python -c "import json; json.load(open('adapters/claude-code/.claude/settings.json'))"` → Expected: no output, exit 0. +Run: `.venv/bin/python -m pytest tests/test_install_adapter.py -q` → Expected: PASS. + +- [ ] **Step 9: Commit** + +Write `/tmp/msg.txt`: +``` +feat(hooks): inject per-prompt kb context via a userpromptsubmit hook + +recall used to be either a session-start firehose or an explicit tool call. +add a pure, never-raising helper + a hidden `vouch context-hook` command that +reads the host's prompt payload on stdin and prints an additionalContext +envelope, and wire it into the claude-code adapter's UserPromptSubmit hook — +so relevant, approved knowledge is injected every turn with zero tool calls. +``` +Run: +```bash +git add src/vouch/hooks.py src/vouch/cli.py adapters/claude-code/.claude/settings.json tests/test_hooks.py +git commit -F /tmp/msg.txt +``` + +--- + +### Task 6: Compact tool descriptions under non-full profiles + +**Files:** +- Modify: `src/vouch/mcp_profiles.py` (add `compact_descriptions`) +- Modify: `src/vouch/server.py` (call it in `run_stdio` when profile != `full`) +- Test: `tests/test_mcp_profiles.py` (add one test) + +**Interfaces:** +- Produces: `mcp_profiles.compact_descriptions(mcp) -> int` — trims each `kb_*` tool's description to its first line; returns count changed. + +- [ ] **Step 1: Write the failing test** — append to `tests/test_mcp_profiles.py`: + +```python +def test_compact_descriptions_trims_to_first_line() -> None: + m = FastMCP("probe") + + def kb_thing(x: int = 0) -> int: + """First line. + + Second paragraph with lots of detail the agent does not need. + """ + return x + + m.tool()(kb_thing) + changed = mcp_profiles.compact_descriptions(m) + assert changed == 1 + assert m._tool_manager._tools["kb_thing"].description == "First line." +``` + +- [ ] **Step 2: Run test to verify it fails** + +Run: `.venv/bin/python -m pytest tests/test_mcp_profiles.py::test_compact_descriptions_trims_to_first_line -q` +Expected: FAIL — `AttributeError: module 'vouch.mcp_profiles' has no attribute 'compact_descriptions'`. + +- [ ] **Step 3: Implement.** Append to `src/vouch/mcp_profiles.py`: + +```python +def compact_descriptions(mcp: Any) -> int: + """Trim each kb_ tool's description to its first line to save context. + + Full docstrings are only needed under the `full` profile; the first line + is enough for an agent choosing a tool. Returns the number changed. + """ + changed = 0 + for tool in mcp._tool_manager._tools.values(): + if not tool.name.startswith("kb_"): + continue + desc = tool.description or "" + first = desc.strip().split("\n", 1)[0].strip() + if first and first != desc: + try: + tool.description = first + except (AttributeError, TypeError): + # pydantic frozen-model fallback + object.__setattr__(tool, "description", first) + changed += 1 + return changed +``` + +- [ ] **Step 4: Run test to verify it passes** + +Run: `.venv/bin/python -m pytest tests/test_mcp_profiles.py -q` → Expected: PASS (8 tests). + +- [ ] **Step 5: Call it from the server.** In `src/vouch/server.py` `run_stdio`, insert after the `apply_tool_profile(...)` line and before `mcp.run()`: + +```python + if mcp_profiles.resolve_profile_name(cfg) != "full": + mcp_profiles.compact_descriptions(mcp) +``` + +(Resolve is cheap and pure; calling it twice is fine. Alternatively hoist the resolved name into a local `profile` var and reuse — either is acceptable.) + +- [ ] **Step 6: mypy/ruff + import check** + +Run: `.venv/bin/python -c "import vouch.server"` → Expected: exit 0. +Run: `.venv/bin/python -m mypy src/vouch/mcp_profiles.py src/vouch/server.py` → Expected: `Success`. +Run: `.venv/bin/python -m ruff check src/vouch/mcp_profiles.py src/vouch/server.py` → Expected: `All checks passed!`. + +- [ ] **Step 7: Commit** + +Write `/tmp/msg.txt`: +``` +feat(mcp): serve one-line tool descriptions under non-full profiles + +full docstrings for every exposed tool are paid on every turn. under minimal +and standard, trim each tool's description to its first line (full keeps the +complete docstrings), cutting the per-turn context cost. +``` +Run: +```bash +git add src/vouch/mcp_profiles.py src/vouch/server.py tests/test_mcp_profiles.py +git commit -F /tmp/msg.txt +``` + +--- + +## Final verification + +Run the full CI gate exactly as `.github/workflows/ci.yml` does, plus a manual end-to-end (per the "verify the shipped diff" rule — exercise the real behavior, not just unit tests): + +- [ ] `.venv/bin/python -m pytest tests/ -q --ignore=tests/embeddings` → all pass. +- [ ] `.venv/bin/python -m mypy src` → `Success`. +- [ ] `.venv/bin/python -m ruff check src tests` → `All checks passed!`. +- [ ] **Surface, minimal (default):** in a KB dir, run the server and count tools — + `.venv/bin/python -c "import vouch.server as s, vouch.mcp_profiles as p; p.apply_tool_profile(s.mcp, 'minimal'); print(sorted(n for n in s.mcp._tool_manager._tools if n.startswith('kb_')))"` → exactly the 8 minimal tools. +- [ ] **Surface, full override:** same one-liner with `'full'` → all 58 present. +- [ ] **Auto-recall e2e:** `cd eval/fixture-kb && printf '{"prompt":"how is rate limiting done"}' | ../../.venv/bin/vouch context-hook` → one JSON line with `additionalContext` drawn from the fixture claims; `echo $?` → `0`. +- [ ] **Docs (light):** add one line documenting `VOUCH_TOOL_PROFILE` / `mcp.tool_profile` (default `minimal`, values `minimal|standard|full`) to `mintlify/reference/` (the config/MCP reference) and the claude-code guide. Commit as `docs(mcp): document tool profiles`. + +Then hand back to the user for review before any push (this branch is off `main`; pushing is a separate, explicit step). diff --git a/docs/superpowers/specs/2026-07-07-friendlier-mcp-surface-design.md b/docs/superpowers/specs/2026-07-07-friendlier-mcp-surface-design.md index fc5b4e1d..002c7228 100644 --- a/docs/superpowers/specs/2026-07-07-friendlier-mcp-surface-design.md +++ b/docs/superpowers/specs/2026-07-07-friendlier-mcp-surface-design.md @@ -58,8 +58,10 @@ route through the gate as proposals — a separate design). ### the profiles - **`minimal` (default)** — the everyday knowledge loop, agent-facing: - `kb_context`, `kb_search`, `kb_read_page`, `kb_propose_claim`, - `kb_propose_page`, `kb_status`, `kb_list_pending`. (7 tools.) + `kb_capabilities`, `kb_context`, `kb_search`, `kb_read_page`, + `kb_propose_claim`, `kb_propose_page`, `kb_status`, `kb_list_pending`. + (8 tools.) `kb_capabilities` stays in so the agent can always discover the + wider surface and how to widen its profile. - **`standard`** — minimal + the review lifecycle for unattended agents: `kb_approve`, `kb_reject`, `kb_supersede`, `kb_contradict`, `kb_confirm`, `kb_read_claim`, `kb_list_claims`, `kb_neighbors`, `kb_why`. (~16 tools.) @@ -90,9 +92,13 @@ in `context.py:_retrieve`, add a `hybrid` branch that fuses semantic + fts results via the existing `embeddings/fusion.py:rrf_fuse` instead of the current first-non-empty waterfall; add `hybrid` to `_VALID_BACKENDS`; flip the `storage.py` default backend to `hybrid` (gracefully degrading to fts when the -embeddings extra is absent). then, before the context-budget clip: a cheap -recency multiplier and a greedy near-duplicate (MMR-style) drop. the CI recall -eval (`eval/recall.py`, `eval.yml`, 0.05 regression floor) is the guardrail — +embeddings extra is absent). `auto` — what every already-initialised KB has in +its config — is redefined to mean the same fused path, so existing installs +benefit without a config migration. then, before the context-budget clip: a +greedy near-duplicate (MMR-style) drop so an agent never sees the same fact +twice. (a recency multiplier is deferred to a follow-up — it needs per-hit +timestamps that `_retrieve` does not currently carry.) the CI recall eval +(`eval/recall.py`, `eval.yml`, 0.05 regression floor) is the guardrail — fusion should raise those numbers and can't regress them. ## move 3 — per-prompt auto-recall @@ -125,12 +131,12 @@ bulk of the context win. ## verification -- new `tests/test_mcp_profiles.py`: `minimal` exposes exactly the 7; `full` +- new `tests/test_mcp_profiles.py`: `minimal` exposes exactly the 8; `full` exposes all 58; every profile name ⊆ `METHODS`; env var overrides config. -- extended `tests/test_capabilities.py`: full mcp tools + cli commands vs - `METHODS` (the real 3-surface check). +- extended `tests/test_capabilities.py`: full mcp tool set vs `METHODS` (the + real 3-surface check for the mcp surface). - recall eval green / improved with fusion (ci-gated). -- manual before/after: fresh claude-code install shows ~7 tools not 58; +- manual before/after: fresh claude-code install shows ~8 tools not 58; a prompt gets relevant context injected with 0 tool calls; record the cold-spawn hook latency. From add870f584ceeb8c246c9981eb45dfe87cf21565 Mon Sep 17 00:00:00 2001 From: plind-junior <59729252+plind-junior@users.noreply.github.com> Date: Tue, 7 Jul 2026 15:18:33 +0900 Subject: [PATCH 072/123] feat(mcp): add tool profiles, expose a minimal surface by default MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit agents saw all 58 kb.* tools every turn — the main first-touch friendliness gap vs pmb, which exposes ~10 by default. add a profile layer applied in run_stdio: minimal (8 core tools) by default, standard (16), or full (58), selected by VOUCH_TOOL_PROFILE / config mcp.tool_profile. exposure only — the protocol surface, jsonl/cli, and the review gate are unchanged. --- src/vouch/mcp_profiles.py | 85 ++++++++++++++++++++++++++++++++++++++ src/vouch/server.py | 7 +++- tests/test_mcp_profiles.py | 67 ++++++++++++++++++++++++++++++ 3 files changed, 158 insertions(+), 1 deletion(-) create mode 100644 src/vouch/mcp_profiles.py create mode 100644 tests/test_mcp_profiles.py diff --git a/src/vouch/mcp_profiles.py b/src/vouch/mcp_profiles.py new file mode 100644 index 00000000..381c66d6 --- /dev/null +++ b/src/vouch/mcp_profiles.py @@ -0,0 +1,85 @@ +"""MCP tool profiles — narrow the tool surface an agent sees by default. + +vouch exposes 58 kb.* methods. Handing all of them to an agent every turn is +the main first-touch friendliness cost (the closest competitor, pmb, exposes +~10 by default and hides the rest behind a profile flag). Profiles control +*exposure* only: the JSONL and CLI surfaces, the protocol method list +(capabilities.METHODS), and the review gate are unchanged. + +Resolution order: VOUCH_TOOL_PROFILE env var > config.yaml `mcp.tool_profile` +> "minimal" (the default). Unknown names fall back to "minimal". +""" + +from __future__ import annotations + +import os +from typing import Any + +from .capabilities import METHODS + +_MINIMAL: frozenset[str] = frozenset({ + "kb.capabilities", + "kb.status", + "kb.context", + "kb.search", + "kb.read_page", + "kb.propose_claim", + "kb.propose_page", + "kb.list_pending", +}) + +_STANDARD: frozenset[str] = _MINIMAL | frozenset({ + "kb.approve", + "kb.reject", + "kb.supersede", + "kb.contradict", + "kb.confirm", + "kb.read_claim", + "kb.list_claims", + "kb.neighbors", + "kb.why", +}) + +PROFILES: dict[str, frozenset[str]] = { + "minimal": _MINIMAL, + "standard": _STANDARD, + "full": frozenset(METHODS), +} + +DEFAULT_PROFILE = "minimal" + + +def _tool_name(method: str) -> str: + """`"kb.propose_claim"` -> `"kb_propose_claim"` (MCP tool names use `_`).""" + return "kb_" + method.split(".", 1)[1] + + +def resolve_profile_name(config: dict[str, Any] | None = None) -> str: + """Pick the active profile from env > config > default.""" + raw = os.environ.get("VOUCH_TOOL_PROFILE") + if not raw and config: + raw = config.get("mcp", {}).get("tool_profile") + name = str(raw).strip().lower() if raw else DEFAULT_PROFILE + return name if name in PROFILES else DEFAULT_PROFILE + + +def tool_names_for(name: str) -> set[str]: + """The MCP (underscore) tool names exposed by profile `name`.""" + return {_tool_name(m) for m in PROFILES.get(name, PROFILES[DEFAULT_PROFILE])} + + +def apply_tool_profile(mcp: Any, name: str) -> list[str]: + """Remove every registered `kb_*` MCP tool not in profile `name`. + + Returns the sorted list of removed tool names. Idempotent. `full` removes + nothing. Only `kb_*` tools are touched, so trust/diagnostic tools + registered elsewhere are never dropped. + """ + keep = tool_names_for(name) + tools = mcp._tool_manager._tools + removed: list[str] = [] + for tool_name in list(tools.keys()): + if tool_name.startswith("kb_") and tool_name not in keep: + tools.pop(tool_name, None) + removed.append(tool_name) + return sorted(removed) diff --git a/src/vouch/server.py b/src/vouch/server.py index 8cabee08..f4ab0d72 100644 --- a/src/vouch/server.py +++ b/src/vouch/server.py @@ -19,7 +19,7 @@ import yaml from mcp.server.fastmcp import FastMCP -from . import audit, bundle, health, volunteer_context +from . import audit, bundle, health, mcp_profiles, volunteer_context from . import compile as compile_mod from . import digest as digest_mod from . import lifecycle as life @@ -1012,4 +1012,9 @@ def run_stdio() -> None: """Entry point used by `vouch serve`.""" configure_logging() trust_mod.set_stdio_default(trust_mod.MCP_STDIO) + try: + cfg: dict[str, Any] | None = _load_cfg(_store()) + except Exception: + cfg = None + mcp_profiles.apply_tool_profile(mcp, mcp_profiles.resolve_profile_name(cfg)) mcp.run() diff --git a/tests/test_mcp_profiles.py b/tests/test_mcp_profiles.py new file mode 100644 index 00000000..2f7604a8 --- /dev/null +++ b/tests/test_mcp_profiles.py @@ -0,0 +1,67 @@ +"""MCP tool profiles narrow the surface an agent sees (friendlier-mcp slice).""" + +from __future__ import annotations + +import pytest +from mcp.server.fastmcp import FastMCP + +from vouch import mcp_profiles +from vouch.capabilities import METHODS + +_MINIMAL_TOOLS = { + "kb_capabilities", "kb_status", "kb_context", "kb_search", + "kb_read_page", "kb_propose_claim", "kb_propose_page", "kb_list_pending", +} + + +def _make(name: str): + def fn(x: int = 0) -> int: + return x + fn.__name__ = name + return fn + + +def _fresh_mcp() -> FastMCP: + m = FastMCP("probe") + for method in METHODS: + m.tool()(_make("kb_" + method.split(".", 1)[1])) + return m + + +def test_full_profile_removes_nothing() -> None: + m = _fresh_mcp() + removed = mcp_profiles.apply_tool_profile(m, "full") + assert removed == [] + assert len(m._tool_manager._tools) == len(METHODS) + + +def test_minimal_exposes_core_only() -> None: + m = _fresh_mcp() + mcp_profiles.apply_tool_profile(m, "minimal") + assert set(m._tool_manager._tools) == _MINIMAL_TOOLS + + +def test_standard_is_superset_of_minimal() -> None: + assert mcp_profiles.PROFILES["minimal"] <= mcp_profiles.PROFILES["standard"] + + +def test_every_profile_is_subset_of_methods() -> None: + allm = set(METHODS) + for name, methods in mcp_profiles.PROFILES.items(): + assert methods <= allm, f"{name} references non-methods: {methods - allm}" + assert mcp_profiles.PROFILES["full"] == allm + + +def test_resolve_env_beats_config(monkeypatch: pytest.MonkeyPatch) -> None: + monkeypatch.setenv("VOUCH_TOOL_PROFILE", "full") + assert mcp_profiles.resolve_profile_name({"mcp": {"tool_profile": "minimal"}}) == "full" + + +def test_resolve_default_is_minimal(monkeypatch: pytest.MonkeyPatch) -> None: + monkeypatch.delenv("VOUCH_TOOL_PROFILE", raising=False) + assert mcp_profiles.resolve_profile_name(None) == "minimal" + + +def test_unknown_profile_falls_back_to_minimal(monkeypatch: pytest.MonkeyPatch) -> None: + monkeypatch.setenv("VOUCH_TOOL_PROFILE", "bogus") + assert mcp_profiles.resolve_profile_name(None) == "minimal" From de6310e97a2407faeb77e8d0a26a1693f21ab2de Mon Sep 17 00:00:00 2001 From: plind-junior <59729252+plind-junior@users.noreply.github.com> Date: Tue, 7 Jul 2026 15:26:15 +0900 Subject: [PATCH 073/123] fix(mcp): harden profile resolution against a non-dict config section a bare `mcp:` key in config.yaml parses to None in YAML, and a non-dict mcp section is also possible from hand-edited configs. the previous config.get("mcp", {}).get("tool_profile") chain only supplied the {} default when the key was absent, so a present-but-None or non-dict value passed through and the chained .get raised AttributeError. run_stdio calls resolve_profile_name outside its try/except, so this would crash vouch serve instead of degrading to the minimal default. guard each nesting level with isinstance, matching the established reflex_cfg pattern in salience.py. --- src/vouch/mcp_profiles.py | 6 ++++-- tests/test_mcp_profiles.py | 9 +++++++++ 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/src/vouch/mcp_profiles.py b/src/vouch/mcp_profiles.py index 381c66d6..e3f02383 100644 --- a/src/vouch/mcp_profiles.py +++ b/src/vouch/mcp_profiles.py @@ -57,8 +57,10 @@ def _tool_name(method: str) -> str: def resolve_profile_name(config: dict[str, Any] | None = None) -> str: """Pick the active profile from env > config > default.""" raw = os.environ.get("VOUCH_TOOL_PROFILE") - if not raw and config: - raw = config.get("mcp", {}).get("tool_profile") + if not raw and isinstance(config, dict): + mcp_cfg = config.get("mcp") + if isinstance(mcp_cfg, dict): + raw = mcp_cfg.get("tool_profile") name = str(raw).strip().lower() if raw else DEFAULT_PROFILE return name if name in PROFILES else DEFAULT_PROFILE diff --git a/tests/test_mcp_profiles.py b/tests/test_mcp_profiles.py index 2f7604a8..5cb201ba 100644 --- a/tests/test_mcp_profiles.py +++ b/tests/test_mcp_profiles.py @@ -65,3 +65,12 @@ def test_resolve_default_is_minimal(monkeypatch: pytest.MonkeyPatch) -> None: def test_unknown_profile_falls_back_to_minimal(monkeypatch: pytest.MonkeyPatch) -> None: monkeypatch.setenv("VOUCH_TOOL_PROFILE", "bogus") assert mcp_profiles.resolve_profile_name(None) == "minimal" + + +def test_resolve_tolerates_non_dict_mcp_section(monkeypatch: pytest.MonkeyPatch) -> None: + """A bare `mcp:` key (YAML -> None) or non-dict mcp section must degrade + to the default, not crash `vouch serve`.""" + monkeypatch.delenv("VOUCH_TOOL_PROFILE", raising=False) + assert mcp_profiles.resolve_profile_name({"mcp": None}) == "minimal" + assert mcp_profiles.resolve_profile_name({"mcp": "oops"}) == "minimal" + assert mcp_profiles.resolve_profile_name({"mcp": {}}) == "minimal" From cb291fd5dee1dd9cc203522cf0a58c87705567e7 Mon Sep 17 00:00:00 2001 From: plind-junior <59729252+plind-junior@users.noreply.github.com> Date: Tue, 7 Jul 2026 15:28:35 +0900 Subject: [PATCH 074/123] test(capabilities): assert mcp tool set matches the method list MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit the parity test only compared capabilities.METHODS to the jsonl handlers; the 58 mcp tools were never checked, so mcp drift passed ci. enumerate the unfiltered server tools and assert they equal METHODS — the real 3-surface check for the mcp side. --- tests/test_capabilities.py | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/tests/test_capabilities.py b/tests/test_capabilities.py index 736b20ba..037b4a5c 100644 --- a/tests/test_capabilities.py +++ b/tests/test_capabilities.py @@ -15,3 +15,22 @@ def test_capabilities_matches_jsonl_handlers() -> None: f"missing handlers={declared - implemented}, " f"missing capabilities={implemented - declared}" ) + + +def test_mcp_tools_match_methods() -> None: + """Every MCP kb_* tool maps to a capabilities method and vice-versa. + + Closes the MCP half of the 3-surface parity invariant that the JSONL + check above did not cover. Uses the unfiltered server object (profiles + apply only in run_stdio). + """ + from vouch.server import mcp + + tool_names = {n for n in mcp._tool_manager._tools if n.startswith("kb_")} + as_methods = {"kb." + n.split("_", 1)[1] for n in tool_names} + declared = set(capabilities.METHODS) + assert as_methods == declared, ( + f"mcp/methods mismatch: " + f"missing tools={declared - as_methods}, " + f"undeclared tools={as_methods - declared}" + ) From a13cbfc0fba31ffa90e8111e42e352de7f85334b Mon Sep 17 00:00:00 2001 From: plind-junior <59729252+plind-junior@users.noreply.github.com> Date: Tue, 7 Jul 2026 15:44:23 +0900 Subject: [PATCH 075/123] feat(retrieval): fuse embedding + fts5 by default instead of a waterfall MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit _retrieve tried embedding, then fts5, then substring, returning the first non-empty list — so lexical and semantic hits never combined. auto and hybrid now fuse both retrievers with the already-built rrf_fuse and tag hits "hybrid"; explicit embedding/fts5/substring pins are unchanged. existing KBs (config says "auto") benefit with no migration. --- src/vouch/context.py | 36 +++++++++++++++++++-------------- src/vouch/storage.py | 4 ++-- tests/test_retrieval_backend.py | 35 ++++++++++++++++++++++++++------ 3 files changed, 52 insertions(+), 23 deletions(-) diff --git a/src/vouch/context.py b/src/vouch/context.py index 6e9b08ce..2f92f23c 100644 --- a/src/vouch/context.py +++ b/src/vouch/context.py @@ -19,6 +19,7 @@ import yaml from . import graph, index_db +from .embeddings.fusion import rrf_fuse from .models import ClaimStatus, ContextItem, ContextPack, ContextQuality from .scoping import ( ViewerContext, @@ -42,7 +43,7 @@ ContextItemKind = Literal["claim", "page", "entity", "relation", "source"] -_VALID_BACKENDS = ("auto", "embedding", "fts5", "substring") +_VALID_BACKENDS = ("auto", "hybrid", "embedding", "fts5", "substring") def _configured_backend(store: KBStore) -> str: @@ -82,7 +83,8 @@ def _retrieve( """Return list of (kind, id, summary, score, backend). The backend is chosen by `retrieval.backend` in config.yaml: - - "auto" (default): embedding -> FTS5 -> substring + - "auto" (default) / "hybrid": fuse embedding + FTS5 via RRF, falling + back to a substring scan only if both retrievers are empty - "embedding": semantic search only - "fts5": lexical FTS5 only - "substring": substring scan only @@ -90,34 +92,38 @@ def _retrieve( backend = _configured_backend(store) fetch_limit = scoped_fetch_limit(limit, viewer) - if backend in ("auto", "embedding"): + if backend in ("auto", "hybrid"): + sem = index_db.search_semantic(store.kb_dir, query, limit=fetch_limit) + try: + lex = index_db.search(store.kb_dir, query, limit=fetch_limit) + except sqlite3.Error: + lex = [] + fused = rrf_fuse(sem, lex, limit=fetch_limit) + if fused: + filtered = filter_hits(store, fused, viewer, limit=limit) + return [(k, i, s, sc, "hybrid") for k, i, s, sc in filtered] + # both retrievers empty -> fall through to the substring scan below. + + if backend == "embedding": raw = index_db.search_semantic(store.kb_dir, query, limit=fetch_limit) if raw: filtered = filter_hits(store, raw, viewer, limit=limit) return [(k, i, s, sc, "embedding") for k, i, s, sc in filtered] - if backend == "embedding": - return [] + return [] - if backend in ("auto", "fts5"): + if backend == "fts5": try: hits = index_db.search(store.kb_dir, query, limit=fetch_limit) if hits: filtered = filter_hits(store, hits, viewer, limit=limit) return [(k, i, s, sc, "fts5") for k, i, s, sc in filtered] except sqlite3.Error: - # FTS5 unavailable, db missing, or schema mismatch — fall through - # to substring scan (auto) or empty (explicit fts5). Other - # exceptions are real bugs and propagate. pass - if backend == "fts5": - return [] + return [] substring_hits = store.search_substring(query, limit=fetch_limit) filtered = filter_hits(store, substring_hits, viewer, limit=limit) - return [ - (k, i, s, sc, "substring") - for k, i, s, sc in filtered - ] + return [(k, i, s, sc, "substring") for k, i, s, sc in filtered] def _enrich_summary(store: KBStore, kind: str, artifact_id: str, summary: str) -> str: diff --git a/src/vouch/storage.py b/src/vouch/storage.py index 653ea806..cfbd295e 100644 --- a/src/vouch/storage.py +++ b/src/vouch/storage.py @@ -91,9 +91,9 @@ def _starter_config() -> dict[str, Any]: "max_chars": 12000, }, "retrieval": { - # auto = embedding -> fts5 -> substring; or pin one of + # hybrid/auto = fuse embedding + fts5 via RRF; or pin one of # embedding | fts5 | substring. See context._retrieve. - "backend": "auto", + "backend": "hybrid", "default_limit": 10, }, "agents": { diff --git a/tests/test_retrieval_backend.py b/tests/test_retrieval_backend.py index 2dc30cd6..8f5ee8bc 100644 --- a/tests/test_retrieval_backend.py +++ b/tests/test_retrieval_backend.py @@ -79,23 +79,46 @@ def test_backend_substring_only( assert _backends(pack) == {"substring"} -def test_backend_auto_prefers_embedding( +def test_backend_auto_now_fuses( store: KBStore, monkeypatch: pytest.MonkeyPatch ) -> None: - """Default `auto` tries embedding first when it returns hits.""" + """`auto` no longer waterfalls embedding-first; it fuses embedding + fts5 + (RRF) and tags hits `hybrid`.""" _force_semantic_hit(monkeypatch) _set_backend(store, "auto") pack = context.build_context_pack(store, query="JWT") - assert any(item["backend"] == "embedding" for item in pack["items"]) + assert pack["items"] + assert _backends(pack) == {"hybrid"} -def test_unset_backend_defaults_to_auto( +def test_unset_backend_fuses( store: KBStore, monkeypatch: pytest.MonkeyPatch ) -> None: - """A config with no retrieval.backend behaves like `auto`.""" + """A config with no retrieval.backend behaves like fused `auto`.""" _force_semantic_hit(monkeypatch) cfg = yaml.safe_load(store.config_path.read_text()) cfg.get("retrieval", {}).pop("backend", None) store.config_path.write_text(yaml.safe_dump(cfg)) pack = context.build_context_pack(store, query="JWT") - assert any(item["backend"] == "embedding" for item in pack["items"]) + assert _backends(pack) == {"hybrid"} + + +def test_backend_hybrid_merges_semantic_and_lexical( + store: KBStore, monkeypatch: pytest.MonkeyPatch +) -> None: + """`hybrid` returns the union of both retrievers, not first-non-empty.""" + src = store.put_source(b"e2") + store.put_claim(Claim(id="c2", text="OAuth refresh flow", evidence=[src.id])) + health.rebuild_index(store) + monkeypatch.setattr( + context.index_db, "search_semantic", + lambda *a, **k: [("claim", "c1", "JWT token rotation", 0.99)], + ) + monkeypatch.setattr( + context.index_db, "search", + lambda *a, **k: [("claim", "c2", "OAuth refresh flow", 0.88)], + ) + _set_backend(store, "hybrid") + pack = context.build_context_pack(store, query="auth") + assert {item["id"] for item in pack["items"]} == {"c1", "c2"} + assert _backends(pack) == {"hybrid"} From 356c3a3a89d4030b4171ef86649b83615701d91e Mon Sep 17 00:00:00 2001 From: plind-junior <59729252+plind-junior@users.noreply.github.com> Date: Tue, 7 Jul 2026 15:46:17 +0900 Subject: [PATCH 076/123] fix(volunteer): treat hybrid relevance as rank-relative, not pre-normalized MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit normalize_relevance() grouped "hybrid" with "embedding", returning the raw score unclamped-by-batch on the assumption it was already a 0-1 similarity. now that _retrieve's auto/hybrid path tags fused hits "hybrid" with a rrf_fuse score (bounded by ~2/(k+rank), typically 0.01-0.03), that assumption stopped holding: every fused relevance landed far below DEFAULT_THRESHOLD (0.85), so kb.volunteer_context stopped firing for any KB using the new default backend. batch-normalize hybrid like fts5 and substring instead — restores the confidence-gated push channel (#236). --- src/vouch/volunteer_context.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vouch/volunteer_context.py b/src/vouch/volunteer_context.py index b1036e0f..33fd23c4 100644 --- a/src/vouch/volunteer_context.py +++ b/src/vouch/volunteer_context.py @@ -99,7 +99,7 @@ def session_query(sess: Session) -> str | None: def normalize_relevance(raw: float, backend: str, *, batch_max: float) -> float: - if backend in ("embedding", "hybrid"): + if backend == "embedding": return max(0.0, min(1.0, raw)) if batch_max <= 0.0: return 0.0 From 3cbf712cc9079e890431967083e587c41d194a25 Mon Sep 17 00:00:00 2001 From: plind-junior <59729252+plind-junior@users.noreply.github.com> Date: Tue, 7 Jul 2026 15:59:31 +0900 Subject: [PATCH 077/123] feat(retrieval): drop near-duplicate items from the context pack a fused pack could surface the same fact from two claims. add a cheap greedy jaccard pass (>=0.85 over the first 40 tokens) that keeps the highest-scored of a near-duplicate cluster, so an agent never reads the same thing twice. --- src/vouch/context.py | 27 +++++++++++++++++++++++++++ tests/test_retrieval_backend.py | 23 +++++++++++++++++++++++ 2 files changed, 50 insertions(+) diff --git a/src/vouch/context.py b/src/vouch/context.py index 2f92f23c..7812df52 100644 --- a/src/vouch/context.py +++ b/src/vouch/context.py @@ -203,6 +203,30 @@ def _append_graph_neighbors( return warnings +def _jaccard(a: set[str], b: set[str]) -> float: + if not a or not b: + return 0.0 + return len(a & b) / len(a | b) + + +def _dedupe_near_duplicates(items: list[ContextItem]) -> list[ContextItem]: + """Drop later items whose summary is near-identical to a kept one. + + Cheap greedy pass (token-set Jaccard >= 0.85 over the first 40 tokens). + `items` must arrive in descending-score order so the higher-scored + duplicate is the one kept. + """ + kept: list[ContextItem] = [] + kept_tokens: list[set[str]] = [] + for it in items: + toks = set(it.summary.lower().split()[:40]) + if any(_jaccard(toks, seen) >= 0.85 for seen in kept_tokens): + continue + kept.append(it) + kept_tokens.append(toks) + return kept + + def build_context_pack( store: KBStore, *, @@ -260,6 +284,9 @@ def build_context_pack( rel_types=graph_rel_types, ) ) + + items = _dedupe_near_duplicates(items) + failed: list[str] = [] uncited: list[str] = [] budget_truncated = False diff --git a/tests/test_retrieval_backend.py b/tests/test_retrieval_backend.py index 8f5ee8bc..fc4a2f9f 100644 --- a/tests/test_retrieval_backend.py +++ b/tests/test_retrieval_backend.py @@ -122,3 +122,26 @@ def test_backend_hybrid_merges_semantic_and_lexical( pack = context.build_context_pack(store, query="auth") assert {item["id"] for item in pack["items"]} == {"c1", "c2"} assert _backends(pack) == {"hybrid"} + + +def test_near_duplicate_summaries_are_dropped( + store: KBStore, monkeypatch: pytest.MonkeyPatch +) -> None: + """An agent should not see the same fact twice.""" + src = store.put_source(b"z") + store.put_claim(Claim( + id="d1", text="the cache uses redis with a 60 second ttl", evidence=[src.id])) + store.put_claim(Claim( + id="d2", text="the cache uses redis with a 60 second ttl now", evidence=[src.id])) + health.rebuild_index(store) + monkeypatch.setattr( + context.index_db, "search_semantic", + lambda *a, **k: [ + ("claim", "d1", "the cache uses redis with a 60 second ttl", 0.90), + ("claim", "d2", "the cache uses redis with a 60 second ttl now", 0.89), + ], + ) + monkeypatch.setattr(context.index_db, "search", lambda *a, **k: []) + _set_backend(store, "hybrid") + pack = context.build_context_pack(store, query="cache") + assert {item["id"] for item in pack["items"]} == {"d1"} From 1468a7eda48e6550b83c2dd030c38109fa2838fd Mon Sep 17 00:00:00 2001 From: plind-junior <59729252+plind-junior@users.noreply.github.com> Date: Tue, 7 Jul 2026 16:10:03 +0900 Subject: [PATCH 078/123] fix(retrieval): dedupe by score so the highest-scored near-dup wins _dedupe_near_duplicates assumed its input arrived in descending-score order, which only holds for the plain retrieval path. when build_context_pack runs with expand_graph=True, graph neighbours are appended in bfs order with decayed scores after the sorted main items, so a higher-scored neighbour could be dropped in favor of an earlier, lower-scored main item. sort inside the function so the invariant holds regardless of caller order. --- src/vouch/context.py | 15 ++++++++++----- tests/test_retrieval_backend.py | 17 +++++++++++++++++ 2 files changed, 27 insertions(+), 5 deletions(-) diff --git a/src/vouch/context.py b/src/vouch/context.py index 7812df52..7215f95c 100644 --- a/src/vouch/context.py +++ b/src/vouch/context.py @@ -210,15 +210,20 @@ def _jaccard(a: set[str], b: set[str]) -> float: def _dedupe_near_duplicates(items: list[ContextItem]) -> list[ContextItem]: - """Drop later items whose summary is near-identical to a kept one. + """Drop items whose summary is near-identical to a higher-scored one. - Cheap greedy pass (token-set Jaccard >= 0.85 over the first 40 tokens). - `items` must arrive in descending-score order so the higher-scored - duplicate is the one kept. + Cheap greedy pass (token-set Jaccard >= 0.85 over the first 40 tokens), + keeping the highest-scored member of each near-duplicate cluster. Sorts + by score internally so the invariant holds even when callers append + lower-priority items out of order (e.g. graph-expansion neighbours). + + Note: the 0.85/40-token heuristic can over-merge long, near-templated + claims that differ by a single token (e.g. a version or status word); + it is a deliberate cheap filter, not a semantic dedup. """ kept: list[ContextItem] = [] kept_tokens: list[set[str]] = [] - for it in items: + for it in sorted(items, key=lambda i: i.score, reverse=True): toks = set(it.summary.lower().split()[:40]) if any(_jaccard(toks, seen) >= 0.85 for seen in kept_tokens): continue diff --git a/tests/test_retrieval_backend.py b/tests/test_retrieval_backend.py index fc4a2f9f..2630765e 100644 --- a/tests/test_retrieval_backend.py +++ b/tests/test_retrieval_backend.py @@ -145,3 +145,20 @@ def test_near_duplicate_summaries_are_dropped( _set_backend(store, "hybrid") pack = context.build_context_pack(store, query="cache") assert {item["id"] for item in pack["items"]} == {"d1"} + + +def test_dedupe_keeps_highest_scored_regardless_of_input_order() -> None: + """Invariant: the highest-scored member of a near-duplicate cluster + survives even when items arrive out of score order (as graph-expansion + neighbours can).""" + from vouch.context import _dedupe_near_duplicates + from vouch.models import ContextItem + + lo = ContextItem(id="lo", type="claim", + summary="the cache uses redis with a 60 second ttl", + score=0.30, backend="hybrid", citations=[], freshness="unknown") + hi = ContextItem(id="hi", type="claim", + summary="the cache uses redis with a 60 second ttl now", + score=0.90, backend="hybrid", citations=[], freshness="unknown") + out = _dedupe_near_duplicates([lo, hi]) # deliberately low-score-first + assert [i.id for i in out] == ["hi"] From f698fd0658d91f9cc692ba15525c01b8df4bca68 Mon Sep 17 00:00:00 2001 From: plind-junior <59729252+plind-junior@users.noreply.github.com> Date: Tue, 7 Jul 2026 16:18:44 +0900 Subject: [PATCH 079/123] feat(hooks): inject per-prompt kb context via a userpromptsubmit hook MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit recall used to be either a session-start firehose or an explicit tool call. add a pure, never-raising helper + a hidden `vouch context-hook` command that reads the host's prompt payload on stdin and prints an additionalContext envelope, and wire it into the claude-code adapter's UserPromptSubmit hook — so relevant, approved knowledge is injected every turn with zero tool calls. --- adapters/claude-code/.claude/settings.json | 12 +++++ src/vouch/cli.py | 21 ++++++++ src/vouch/hooks.py | 62 ++++++++++++++++++++++ tests/test_hooks.py | 60 +++++++++++++++++++++ 4 files changed, 155 insertions(+) create mode 100644 src/vouch/hooks.py create mode 100644 tests/test_hooks.py diff --git a/adapters/claude-code/.claude/settings.json b/adapters/claude-code/.claude/settings.json index 5fd35a67..d77ad5ad 100644 --- a/adapters/claude-code/.claude/settings.json +++ b/adapters/claude-code/.claude/settings.json @@ -43,6 +43,18 @@ ] } ], + "UserPromptSubmit": [ + { + "comment": "inject KB context relevant to THIS prompt (per-prompt auto-recall, 0 tool calls); never blocks the turn", + "matcher": "*", + "hooks": [ + { + "type": "command", + "command": "vouch context-hook || true" + } + ] + } + ], "PostToolUse": [ { "matcher": "*", diff --git a/src/vouch/cli.py b/src/vouch/cli.py index a490fcf9..338e31dd 100644 --- a/src/vouch/cli.py +++ b/src/vouch/cli.py @@ -2299,6 +2299,27 @@ def context( _emit_json(pack) +@cli.command(name="context-hook", hidden=True) +def context_hook() -> None: + """Emit relevant KB context for a host UserPromptSubmit hook (reads stdin). + + Wired by the claude-code adapter; not meant to be run by hand. Reads the + host's JSON hook payload on stdin, prints an additionalContext envelope, + and always exits 0 so it can never block a turn. + """ + import sys + + from . import hooks + + stdin_text = sys.stdin.read() + try: + out = hooks.build_claude_prompt_hook(_load_store(), stdin_text) + except Exception: + out = "" + if out: + click.echo(out) + + @cli.command() @click.argument("query") @click.option("--depth", default=3, show_default=True, type=int) diff --git a/src/vouch/hooks.py b/src/vouch/hooks.py new file mode 100644 index 00000000..a9c47de6 --- /dev/null +++ b/src/vouch/hooks.py @@ -0,0 +1,62 @@ +"""Host-hook helpers: translate an agent host's prompt hook into KB context. + +Claude Code's UserPromptSubmit hook passes a JSON payload on stdin and injects +whatever the hook prints (as an `additionalContext` envelope) before the model +runs. `build_claude_prompt_hook` turns that payload into a compact, relevant +context block drawn from *approved* KB knowledge — so recall costs the agent +zero tool calls. It never raises: on any problem it returns "" (inject +nothing), so a hook failure can never block the user's turn. +""" + +from __future__ import annotations + +import json +from typing import Any + +from .context import build_context_pack +from .storage import KBStore + +_MAX_ITEMS = 8 +_MAX_CHARS = 2000 + + +def _render(pack: dict[str, Any]) -> str: + lines: list[str] = [] + for item in pack.get("items", []): + summary = str(item.get("summary", "")).strip() + if not summary: + continue + cites = item.get("citations") or [] + suffix = f" [{', '.join(cites)}]" if cites else "" + lines.append(f"- {summary}{suffix}") + return "\n".join(lines) + + +def build_claude_prompt_hook(store: KBStore, stdin_text: str) -> str: + """Return the stdout a host should inject for this prompt, or "" for none.""" + try: + payload = json.loads(stdin_text) if stdin_text.strip() else {} + except json.JSONDecodeError: + payload = {"prompt": stdin_text} + prompt = str(payload.get("prompt", "")).strip() + if not prompt: + return "" + try: + pack = build_context_pack( + store, query=prompt, limit=_MAX_ITEMS, max_chars=_MAX_CHARS, + ) + except Exception: + return "" + body = _render(pack) if isinstance(pack, dict) else "" + if not body: + return "" + block = ( + "Relevant knowledge from the project's vouch KB " + "(approved & cited — consider it before answering):\n" + body + ) + return json.dumps({ + "hookSpecificOutput": { + "hookEventName": "UserPromptSubmit", + "additionalContext": block, + } + }) diff --git a/tests/test_hooks.py b/tests/test_hooks.py new file mode 100644 index 00000000..ce7ebf93 --- /dev/null +++ b/tests/test_hooks.py @@ -0,0 +1,60 @@ +"""The per-prompt hook injects relevant KB context with zero tool calls.""" + +from __future__ import annotations + +import json +from pathlib import Path + +import pytest + +from vouch import context, health, hooks +from vouch.models import Claim +from vouch.storage import KBStore + + +@pytest.fixture +def store(tmp_path: Path) -> KBStore: + s = KBStore.init(tmp_path) + src = s.put_source(b"e") + s.put_claim(Claim(id="c1", text="deploys run on tuesdays via ci", evidence=[src.id])) + health.rebuild_index(s) + return s + + +def _force_hit(monkeypatch: pytest.MonkeyPatch) -> None: + monkeypatch.setattr( + context.index_db, "search_semantic", + lambda *a, **k: [("claim", "c1", "deploys run on tuesdays via ci", 0.9)], + ) + monkeypatch.setattr(context.index_db, "search", lambda *a, **k: []) + + +def test_empty_prompt_injects_nothing(store: KBStore) -> None: + assert hooks.build_claude_prompt_hook(store, json.dumps({"prompt": ""})) == "" + assert hooks.build_claude_prompt_hook(store, "") == "" + + +def test_relevant_prompt_yields_additional_context( + store: KBStore, monkeypatch: pytest.MonkeyPatch +) -> None: + _force_hit(monkeypatch) + out = hooks.build_claude_prompt_hook(store, json.dumps({"prompt": "when do deploys run"})) + env = json.loads(out) + assert env["hookSpecificOutput"]["hookEventName"] == "UserPromptSubmit" + assert "tuesdays" in env["hookSpecificOutput"]["additionalContext"] + + +def test_raw_non_json_stdin_is_tolerated( + store: KBStore, monkeypatch: pytest.MonkeyPatch +) -> None: + _force_hit(monkeypatch) + out = hooks.build_claude_prompt_hook(store, "when do deploys run") + assert "tuesdays" in json.loads(out)["hookSpecificOutput"]["additionalContext"] + + +def test_no_hits_injects_nothing( + store: KBStore, monkeypatch: pytest.MonkeyPatch +) -> None: + monkeypatch.setattr(context.index_db, "search_semantic", lambda *a, **k: []) + monkeypatch.setattr(context.index_db, "search", lambda *a, **k: []) + assert hooks.build_claude_prompt_hook(store, json.dumps({"prompt": "zzznomatch"})) == "" From 63333c4705405de99a2cc490f072f79b10e40bf2 Mon Sep 17 00:00:00 2001 From: plind-junior <59729252+plind-junior@users.noreply.github.com> Date: Tue, 7 Jul 2026 16:30:50 +0900 Subject: [PATCH 080/123] fix(hooks): never raise on non-dict payload or missing kb a reviewer reproduced two crash paths that violated task 5's own contract that the prompt hook must never block a turn: build_claude_prompt_hook raised AttributeError on non-dict JSON (null/number/bool/array/string all decode fine but lack .get), and the context-hook CLI command called _load_store(), whose sys.exit(2) on a missing KB is a SystemExit that slips past `except Exception` and exits the process nonzero. guard the payload with an isinstance check before .get, log a breadcrumb when build_context_pack fails so a broken KB isn't silently indistinguishable from "no hits", and swap _load_store() for the existing non-exiting _capture_store() helper so the command has no sys.exit on its path at all. --- src/vouch/cli.py | 11 +++++++---- src/vouch/hooks.py | 6 ++++++ tests/test_hooks.py | 25 +++++++++++++++++++++++++ 3 files changed, 38 insertions(+), 4 deletions(-) diff --git a/src/vouch/cli.py b/src/vouch/cli.py index 338e31dd..f7383c7d 100644 --- a/src/vouch/cli.py +++ b/src/vouch/cli.py @@ -2312,10 +2312,13 @@ def context_hook() -> None: from . import hooks stdin_text = sys.stdin.read() - try: - out = hooks.build_claude_prompt_hook(_load_store(), stdin_text) - except Exception: - out = "" + store = _capture_store() + out = "" + if store is not None: + try: + out = hooks.build_claude_prompt_hook(store, stdin_text) + except Exception: + out = "" if out: click.echo(out) diff --git a/src/vouch/hooks.py b/src/vouch/hooks.py index a9c47de6..e90c2f66 100644 --- a/src/vouch/hooks.py +++ b/src/vouch/hooks.py @@ -11,11 +11,14 @@ from __future__ import annotations import json +import logging from typing import Any from .context import build_context_pack from .storage import KBStore +_log = logging.getLogger("vouch") + _MAX_ITEMS = 8 _MAX_CHARS = 2000 @@ -38,6 +41,8 @@ def build_claude_prompt_hook(store: KBStore, stdin_text: str) -> str: payload = json.loads(stdin_text) if stdin_text.strip() else {} except json.JSONDecodeError: payload = {"prompt": stdin_text} + if not isinstance(payload, dict): + payload = {} prompt = str(payload.get("prompt", "")).strip() if not prompt: return "" @@ -46,6 +51,7 @@ def build_claude_prompt_hook(store: KBStore, stdin_text: str) -> str: store, query=prompt, limit=_MAX_ITEMS, max_chars=_MAX_CHARS, ) except Exception: + _log.warning("context-hook: build_context_pack failed", exc_info=True) return "" body = _render(pack) if isinstance(pack, dict) else "" if not body: diff --git a/tests/test_hooks.py b/tests/test_hooks.py index ce7ebf93..9a096eff 100644 --- a/tests/test_hooks.py +++ b/tests/test_hooks.py @@ -58,3 +58,28 @@ def test_no_hits_injects_nothing( monkeypatch.setattr(context.index_db, "search_semantic", lambda *a, **k: []) monkeypatch.setattr(context.index_db, "search", lambda *a, **k: []) assert hooks.build_claude_prompt_hook(store, json.dumps({"prompt": "zzznomatch"})) == "" + + +def test_non_dict_json_payload_is_safe(store: KBStore) -> None: + for raw in ("null", "42", "true", "[1,2,3]", '"a string"'): + assert hooks.build_claude_prompt_hook(store, raw) == "" + + +def test_build_context_pack_exception_is_swallowed( + store: KBStore, monkeypatch: pytest.MonkeyPatch +) -> None: + def _boom(*a: object, **k: object) -> object: + raise RuntimeError("boom") + monkeypatch.setattr(hooks, "build_context_pack", _boom) + assert hooks.build_claude_prompt_hook(store, json.dumps({"prompt": "x"})) == "" + + +def test_context_hook_cli_always_exits_zero_without_kb( + tmp_path: Path, monkeypatch: pytest.MonkeyPatch +) -> None: + from click.testing import CliRunner + + from vouch.cli import cli + monkeypatch.chdir(tmp_path) # no .vouch here + result = CliRunner().invoke(cli, ["context-hook"], input='{"prompt":"anything"}') + assert result.exit_code == 0 From c33b48ebad8ec38e430c591a3cbdd8cac0b27b0e Mon Sep 17 00:00:00 2001 From: plind-junior <59729252+plind-junior@users.noreply.github.com> Date: Tue, 7 Jul 2026 16:40:43 +0900 Subject: [PATCH 081/123] feat(mcp): serve one-line tool descriptions under non-full profiles full docstrings for every exposed tool are paid on every turn. under minimal and standard, trim each tool's description to its first line (full keeps the complete docstrings), cutting the per-turn context cost. --- src/vouch/mcp_profiles.py | 22 ++++++++++++++++++++++ src/vouch/server.py | 5 ++++- tests/test_mcp_profiles.py | 16 ++++++++++++++++ 3 files changed, 42 insertions(+), 1 deletion(-) diff --git a/src/vouch/mcp_profiles.py b/src/vouch/mcp_profiles.py index e3f02383..6f79f7c3 100644 --- a/src/vouch/mcp_profiles.py +++ b/src/vouch/mcp_profiles.py @@ -85,3 +85,25 @@ def apply_tool_profile(mcp: Any, name: str) -> list[str]: tools.pop(tool_name, None) removed.append(tool_name) return sorted(removed) + + +def compact_descriptions(mcp: Any) -> int: + """Trim each kb_ tool's description to its first line to save context. + + Full docstrings are only needed under the `full` profile; the first line + is enough for an agent choosing a tool. Returns the number changed. + """ + changed = 0 + for tool in mcp._tool_manager._tools.values(): + if not tool.name.startswith("kb_"): + continue + desc = tool.description or "" + first = desc.strip().split("\n", 1)[0].strip() + if first and first != desc: + try: + tool.description = first + except (AttributeError, TypeError): + # pydantic frozen-model fallback + object.__setattr__(tool, "description", first) + changed += 1 + return changed diff --git a/src/vouch/server.py b/src/vouch/server.py index f4ab0d72..8ac1487b 100644 --- a/src/vouch/server.py +++ b/src/vouch/server.py @@ -1016,5 +1016,8 @@ def run_stdio() -> None: cfg: dict[str, Any] | None = _load_cfg(_store()) except Exception: cfg = None - mcp_profiles.apply_tool_profile(mcp, mcp_profiles.resolve_profile_name(cfg)) + profile = mcp_profiles.resolve_profile_name(cfg) + mcp_profiles.apply_tool_profile(mcp, profile) + if profile != "full": + mcp_profiles.compact_descriptions(mcp) mcp.run() diff --git a/tests/test_mcp_profiles.py b/tests/test_mcp_profiles.py index 5cb201ba..30bff123 100644 --- a/tests/test_mcp_profiles.py +++ b/tests/test_mcp_profiles.py @@ -74,3 +74,19 @@ def test_resolve_tolerates_non_dict_mcp_section(monkeypatch: pytest.MonkeyPatch) assert mcp_profiles.resolve_profile_name({"mcp": None}) == "minimal" assert mcp_profiles.resolve_profile_name({"mcp": "oops"}) == "minimal" assert mcp_profiles.resolve_profile_name({"mcp": {}}) == "minimal" + + +def test_compact_descriptions_trims_to_first_line() -> None: + m = FastMCP("probe") + + def kb_thing(x: int = 0) -> int: + """First line. + + Second paragraph with lots of detail the agent does not need. + """ + return x + + m.tool()(kb_thing) + changed = mcp_profiles.compact_descriptions(m) + assert changed == 1 + assert m._tool_manager._tools["kb_thing"].description == "First line." From 6ea2a94acffc2c5ba17830bcc8b5e6954005f6ba Mon Sep 17 00:00:00 2001 From: plind-junior <59729252+plind-junior@users.noreply.github.com> Date: Tue, 7 Jul 2026 16:41:11 +0900 Subject: [PATCH 082/123] docs(mcp): document tool profiles note VOUCH_TOOL_PROFILE / mcp.tool_profile (default minimal, values minimal|standard|full) in the transports reference and the claude-code adapter guide; this repo has no mintlify/ tree yet so both live under docs/ and adapters/claude-code/ instead. --- adapters/claude-code/README.md | 3 +++ docs/transports.md | 7 +++++++ 2 files changed, 10 insertions(+) diff --git a/adapters/claude-code/README.md b/adapters/claude-code/README.md index 8c3efe05..8739da73 100644 --- a/adapters/claude-code/README.md +++ b/adapters/claude-code/README.md @@ -112,3 +112,6 @@ To upgrade or check your extension version, see [Claude Code releases](https://g (`kb_supersede`, `kb_contradict`, …) without you asking each time, add: "When you find a stale claim, supersede it rather than proposing a contradicting one." +- Only a core set of `kb_*` tools is visible by default (`mcp.tool_profile: + minimal` in `.vouch/config.yaml`, or the `VOUCH_TOOL_PROFILE` env var). + Set it to `standard` or `full` to expose lifecycle/admin tools. diff --git a/docs/transports.md b/docs/transports.md index 64105fa3..16e16fa2 100644 --- a/docs/transports.md +++ b/docs/transports.md @@ -25,6 +25,13 @@ The server speaks MCP over stdin/stdout. Your host configures it as a subprocess. Method `kb.search` is exposed as MCP tool `kb_search` (dots aren't valid in MCP tool names). +By default only a core set of `kb_*` tools is exposed (profile +`minimal`) to keep the per-turn tool-choice cost down; set +`VOUCH_TOOL_PROFILE` (env var, wins) or `mcp.tool_profile` in +`config.yaml` to `standard` or `full` to widen the surface. Outside +`full`, each exposed tool's description is also trimmed to its first +line. + ### Resources vouch also exposes read-only views as MCP resources: From 0cf6b29b7482d34d094d1d11e55c126638a4dd91 Mon Sep 17 00:00:00 2001 From: plind-junior <59729252+plind-junior@users.noreply.github.com> Date: Tue, 7 Jul 2026 17:19:01 +0900 Subject: [PATCH 083/123] fix(retrieval): dedupe by score but keep caller order for the pack _dedupe_near_duplicates sorted by score and returned that score-sorted order, which fought graph-expansion: build_context_pack appends decayed-score neighbours after the ranked hits, and fused primary hits now carry small rrf scores. re-sorting let an irrelevant depth-2 neighbour outrank a real match, and the max_chars tail-pop then evicted the real match instead of the neighbour. keep the keep-decision in descending-score order so the highest-scored member of a near-duplicate cluster still survives, but return survivors in the caller's original order so budget eviction drops the tail (appended neighbours), not the ranked hits. --- src/vouch/context.py | 27 ++++++++++++++------------- tests/test_retrieval_backend.py | 15 +++++++++++++++ 2 files changed, 29 insertions(+), 13 deletions(-) diff --git a/src/vouch/context.py b/src/vouch/context.py index 7215f95c..fa7e3f16 100644 --- a/src/vouch/context.py +++ b/src/vouch/context.py @@ -212,24 +212,25 @@ def _jaccard(a: set[str], b: set[str]) -> float: def _dedupe_near_duplicates(items: list[ContextItem]) -> list[ContextItem]: """Drop items whose summary is near-identical to a higher-scored one. - Cheap greedy pass (token-set Jaccard >= 0.85 over the first 40 tokens), - keeping the highest-scored member of each near-duplicate cluster. Sorts - by score internally so the invariant holds even when callers append - lower-priority items out of order (e.g. graph-expansion neighbours). - - Note: the 0.85/40-token heuristic can over-merge long, near-templated - claims that differ by a single token (e.g. a version or status word); - it is a deliberate cheap filter, not a semantic dedup. + The *keep* decision runs in descending-score order so the highest-scored + member of a near-duplicate cluster survives; survivors are returned in the + caller's original order. build_context_pack appends lower-priority items + (graph-expansion neighbours) after the ranked hits and relies on that tail + ordering for budget eviction, so this pass must not re-rank the pack. + + Cheap greedy heuristic (token-set Jaccard >= 0.85 over the first 40 tokens); + it can over-merge long near-templated claims that differ by a single token. """ - kept: list[ContextItem] = [] + dropped: set[int] = set() kept_tokens: list[set[str]] = [] - for it in sorted(items, key=lambda i: i.score, reverse=True): - toks = set(it.summary.lower().split()[:40]) + order = sorted(range(len(items)), key=lambda i: items[i].score, reverse=True) + for idx in order: + toks = set(items[idx].summary.lower().split()[:40]) if any(_jaccard(toks, seen) >= 0.85 for seen in kept_tokens): + dropped.add(idx) continue - kept.append(it) kept_tokens.append(toks) - return kept + return [it for i, it in enumerate(items) if i not in dropped] def build_context_pack( diff --git a/tests/test_retrieval_backend.py b/tests/test_retrieval_backend.py index 2630765e..dcff5372 100644 --- a/tests/test_retrieval_backend.py +++ b/tests/test_retrieval_backend.py @@ -162,3 +162,18 @@ def test_dedupe_keeps_highest_scored_regardless_of_input_order() -> None: score=0.90, backend="hybrid", citations=[], freshness="unknown") out = _dedupe_near_duplicates([lo, hi]) # deliberately low-score-first assert [i.id for i in out] == ["hi"] + + +def test_dedupe_preserves_input_order_not_score_order() -> None: + """Survivors keep the caller's order (ranked hits first, appended + neighbours last) even when a later distinct item outscores an earlier one, + so budget eviction drops the tail, not the real matches.""" + from vouch.context import _dedupe_near_duplicates + from vouch.models import ContextItem + + a = ContextItem(id="a", type="claim", summary="alpha topic one", + score=0.02, backend="hybrid", citations=[], freshness="unknown") + b = ContextItem(id="b", type="claim", summary="beta subject two", + score=0.32, backend="graph", citations=[], freshness="unknown") + out = _dedupe_near_duplicates([a, b]) # distinct summaries, a first but lower-scored + assert [i.id for i in out] == ["a", "b"] From 6246363fd80e3f8595f663ba0c71dd1e702c119e Mon Sep 17 00:00:00 2001 From: plind-junior <59729252+plind-junior@users.noreply.github.com> Date: Tue, 7 Jul 2026 17:19:05 +0900 Subject: [PATCH 084/123] docs(changelog): note minimal mcp profile, fusion, auto-recall summarize this branch's user-visible changes under [Unreleased]: the minimal-by-default mcp tool profile, rrf fusion for auto/hybrid retrieval, and the per-prompt auto-recall hook in the claude-code adapter. --- CHANGELOG.md | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 71809356..5e396ef7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,23 @@ All notable changes to vouch are documented here. Format follows ## [Unreleased] +### Added +- mcp now serves a **minimal tool profile by default** (8 core tools) + instead of the full 58-method surface; widen with + `VOUCH_TOOL_PROFILE=standard|full` or `mcp.tool_profile` in + `config.yaml`. approve/reject and maintenance tools live in + `standard`/`full` — they stay human/cli actions, not agent defaults. + the jsonl and cli surfaces are unaffected; all 58 methods remain + reachable there. +- per-prompt auto-recall: the claude-code adapter's `UserPromptSubmit` + hook (`vouch context-hook`) injects relevant kb context on every + prompt, so recall no longer depends on the agent remembering to ask. + +### Changed +- retrieval `auto`/`hybrid` now **fuses embedding + fts5** results via + reciprocal rank fusion instead of a waterfall (embedding-first, + fts5-fallback), with near-duplicate suppression over the fused list. + ## [1.2.1] — 2026-07-06 ### Fixed From c5c5282eeaac76d219893f3b5c9657b773d98f73 Mon Sep 17 00:00:00 2001 From: plind-junior <59729252+plind-junior@users.noreply.github.com> Date: Tue, 7 Jul 2026 17:46:19 +0900 Subject: [PATCH 085/123] docs(readme): note the fourth hook, per-prompt recall, and lean mcp profile install-mcp now writes a fourth hook (UserPromptSubmit -> vouch context-hook), and recall fires per prompt, not only at session start. also note the kb.* mcp surface defaults to a lean profile that widens via VOUCH_TOOL_PROFILE. --- README.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 730d7867..ef8f261c 100644 --- a/README.md +++ b/README.md @@ -56,7 +56,7 @@ vouch init vouch install-mcp claude-code ``` -`init` creates `.vouch/` with a starter config; `install-mcp` writes `.mcp.json` (the `kb.*` MCP tools), the `/vouch-*` slash commands, and three hooks — `PostToolUse` capture, `SessionEnd` rollup, `SessionStart` recall. Restart Claude Code so they load. +`init` creates `.vouch/` with a starter config; `install-mcp` writes `.mcp.json` (the `kb.*` MCP tools — a lean default surface you can widen with `VOUCH_TOOL_PROFILE`), the `/vouch-*` slash commands, and four hooks — `PostToolUse` capture, `SessionEnd` rollup, `SessionStart` recall, and `UserPromptSubmit` per-prompt context injection. Restart Claude Code so they load. **2. Point `compile` at an LLM** — the only step that needs a model. In `.vouch/config.yaml`: @@ -120,6 +120,8 @@ Detection is Claude Code's hook contract: whatever a `SessionStart` hook prints Only approved artifacts are ever emitted — archived, superseded, and still-pending items are excluded — and the digest is size-guarded (`recall.max_chars`) with an explicit truncation notice. +Recall isn't only a session-start event anymore: a `UserPromptSubmit` hook runs `vouch context-hook` on *every* prompt, fusing the most relevant approved claims and pages for what you just asked and injecting them with zero tool calls — so the model sees relevant knowledge even when the agent doesn't think to look it up. + How the approved pages actually get used from there: recall carries the *titles*, and the session pulls full content on demand through the `kb.*` MCP tools — `kb_search` matches page bodies, `kb_read_page` returns a page's markdown plus the claims it cites, and `kb_context` bundles the most relevant claims and pages for a stated task. To pull a topic in explicitly, use the `/vouch-recall ` slash command, or just ask Claude to check the KB. One thing to know: pages still sitting in `vouch review` are invisible to all of this — the gate applies to retrieval too, so a compiled page only starts informing sessions once you approve it. **7. Commit the knowledge with the code.** From 7e68098916a06171f3b0b9da58e707773d95c789 Mon Sep 17 00:00:00 2001 From: plind <59729252+plind-junior@users.noreply.github.com> Date: Tue, 7 Jul 2026 04:17:01 -0700 Subject: [PATCH 086/123] fix(capabilities): read openclaw.compat from package.json (#417) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit the host-compat drift check (#237) read openclaw.compat.pluginApi from openclaw.plugin.json. that block moved to package.json when the plugin packaging was split, and openclaw.* is now banned from the manifest (enforced by test_manifest_carries_no_dead_dialect_fields). the #237 reader was left pointing at the old, now-empty location, so host_compat silently degraded to {} and both host-compat assertions failed on the test branch — which every open pr targeting test inherited, including #413. repoint _load_host_compat and the test helpers at package.json. the openclaw.compat.pluginApi key path is identical in both files, so this is purely a source-file change with no behaviour difference. --- src/vouch/capabilities.py | 24 ++++++++++++----------- tests/test_capabilities.py | 39 +++++++++++++++++++------------------- 2 files changed, 33 insertions(+), 30 deletions(-) diff --git a/src/vouch/capabilities.py b/src/vouch/capabilities.py index 1393d978..e051115d 100644 --- a/src/vouch/capabilities.py +++ b/src/vouch/capabilities.py @@ -17,10 +17,12 @@ _log = logging.getLogger(__name__) -# Path to the plugin manifest, relative to this module. capabilities.py lives -# at src/vouch/capabilities.py; openclaw.plugin.json lives at the repo root, -# three levels up (src/vouch/ -> src/ -> repo root). -_PLUGIN_MANIFEST_PATH = Path(__file__).resolve().parent.parent.parent / "openclaw.plugin.json" +# Path to package.json, relative to this module. capabilities.py lives at +# src/vouch/capabilities.py; package.json lives at the repo root, three levels +# up (src/vouch/ -> src/ -> repo root). The openclaw.compat block lives here, +# not in openclaw.plugin.json — the manifest bans openclaw.* dead dialect +# fields (see test_manifest_carries_no_dead_dialect_fields). +_PACKAGE_JSON_PATH = Path(__file__).resolve().parent.parent.parent / "package.json" # The full method surface this implementation exposes. Keep this list in # sync with the MCP server + JSONL server registrations — `test_capabilities` @@ -90,19 +92,19 @@ def _load_host_compat() -> dict[str, dict[str, str]]: - """Read the `openclaw.compat` block from openclaw.plugin.json (#237). + """Read the `openclaw.compat` block from package.json (#237). Surfaced in `kb.capabilities` as `host_compat` so non-OpenClaw clients - can detect compat without parsing the manifest themselves. Returns an - empty dict (rather than raising) if the manifest is missing or + can detect compat without parsing package.json themselves. Returns an + empty dict (rather than raising) if package.json is missing or malformed — capabilities() must never fail to report basic info just - because the manifest moved or this is installed as a standalone wheel - without the manifest packaged alongside it. + because the file moved or this is installed as a standalone wheel + without package.json packaged alongside it. """ try: - manifest = json.loads(_PLUGIN_MANIFEST_PATH.read_text(encoding="utf-8")) + manifest = json.loads(_PACKAGE_JSON_PATH.read_text(encoding="utf-8")) except (OSError, json.JSONDecodeError) as e: - _log.debug("openclaw.plugin.json unreadable, host_compat will be empty: %s", e) + _log.debug("package.json unreadable, host_compat will be empty: %s", e) return {} compat = manifest.get("openclaw", {}).get("compat") if not isinstance(compat, dict): diff --git a/tests/test_capabilities.py b/tests/test_capabilities.py index 49c29c99..4d4dcc27 100644 --- a/tests/test_capabilities.py +++ b/tests/test_capabilities.py @@ -24,31 +24,32 @@ def test_capabilities_matches_jsonl_handlers() -> None: # --- host_compat drift detection (#237) ----------------------------------- # -# vouch declares openclaw.compat.pluginApi in openclaw.plugin.json. The same -# value must surface in kb.capabilities so non-OpenClaw clients can detect -# compat without parsing the manifest. These tests fail CI with a clear -# message if the two declarations drift apart. - -_MANIFEST_PATH = ( - Path(__file__).resolve().parent.parent / "openclaw.plugin.json" +# vouch declares openclaw.compat.pluginApi in package.json (openclaw.plugin.json +# bans openclaw.* dead dialect fields). The same value must surface in +# kb.capabilities so non-OpenClaw clients can detect compat without parsing +# package.json. These tests fail CI with a clear message if the two +# declarations drift apart. + +_PACKAGE_JSON_PATH = ( + Path(__file__).resolve().parent.parent / "package.json" ) -def _manifest_plugin_api() -> str: - manifest = json.loads(_MANIFEST_PATH.read_text(encoding="utf-8")) +def _package_plugin_api() -> str: + manifest = json.loads(_PACKAGE_JSON_PATH.read_text(encoding="utf-8")) return manifest["openclaw"]["compat"]["pluginApi"] def test_capabilities_host_compat_matches_openclaw_manifest() -> None: """kb.capabilities.host_compat.openclaw.pluginApi must equal the - pluginApi range declared in openclaw.plugin.json. A bump in one file + pluginApi range declared in package.json. A bump in one file without the other is exactly the "host compat drift" #237 asks CI to catch.""" caps = capabilities.capabilities() - manifest_range = _manifest_plugin_api() + manifest_range = _package_plugin_api() capabilities_range = caps.host_compat.get("openclaw", {}).get("pluginApi") assert capabilities_range == manifest_range, ( - f"host compat drift: openclaw.plugin.json declares pluginApi=" + f"host compat drift: package.json declares pluginApi=" f"{manifest_range!r} but kb.capabilities.host_compat reports " f"{capabilities_range!r}. Keep both in sync." ) @@ -68,10 +69,10 @@ def test_load_host_compat_returns_empty_on_missing_manifest( monkeypatch: pytest.MonkeyPatch, tmp_path: Path, ) -> None: """_load_host_compat must degrade gracefully (empty dict, no raise) if - the manifest is absent -- e.g. installed as a standalone wheel without - openclaw.plugin.json packaged alongside it.""" + package.json is absent -- e.g. installed as a standalone wheel without + package.json packaged alongside it.""" monkeypatch.setattr( - capabilities, "_PLUGIN_MANIFEST_PATH", tmp_path / "does-not-exist.json" + capabilities, "_PACKAGE_JSON_PATH", tmp_path / "does-not-exist.json" ) assert capabilities._load_host_compat() == {} @@ -79,11 +80,11 @@ def test_load_host_compat_returns_empty_on_missing_manifest( def test_load_host_compat_returns_empty_on_malformed_manifest( monkeypatch: pytest.MonkeyPatch, tmp_path: Path, ) -> None: - """A malformed manifest must not crash capabilities() -- it's reporting - diagnostic info, not validating the install.""" - bad = tmp_path / "openclaw.plugin.json" + """A malformed package.json must not crash capabilities() -- it's + reporting diagnostic info, not validating the install.""" + bad = tmp_path / "package.json" bad.write_text("{not valid json", encoding="utf-8") - monkeypatch.setattr(capabilities, "_PLUGIN_MANIFEST_PATH", bad) + monkeypatch.setattr(capabilities, "_PACKAGE_JSON_PATH", bad) assert capabilities._load_host_compat() == {} From bb065659d851e93667a4a2522f0770f1b1b48ebc Mon Sep 17 00:00:00 2001 From: plind <59729252+plind-junior@users.noreply.github.com> Date: Tue, 7 Jul 2026 04:21:23 -0700 Subject: [PATCH 087/123] chore(repo): untrack owner-local web/ and .claude/ (#413) these two directories were committed by accident and reach every first-time contributor on clone. neither is project source: - web/ is the netlify-deployed marketing landing page. it is shipped via the netlify cli and is not meant to live in the repo tree. - .claude/ is a personal claude code config: a settings.json with owner-specific hooks, plus command files that are byte-identical duplicates of adapters/claude-code/.claude/commands/. untrack both (files stay on disk) and gitignore them, anchored to the repo root so src/vouch/web and adapters/claude-code/.claude stay tracked. also ignore coverage.xml and the .netlify/ and .playwright-mcp/ tool-scratch dirs. --- .claude/commands/vouch-propose-from-pr.md | 25 - .claude/commands/vouch-recall.md | 20 - .claude/commands/vouch-resolve-issue.md | 27 - .claude/commands/vouch-status.md | 23 - .claude/settings.json | 60 -- .gitignore | 10 + web/app.css | 366 ------------ web/app.js | 420 ------------- web/base.css | 686 ---------------------- web/gittensor.html | 196 ------- web/how-it-works.html | 263 --------- web/index.html | 268 --------- web/reference.html | 128 ---- 13 files changed, 10 insertions(+), 2482 deletions(-) delete mode 100644 .claude/commands/vouch-propose-from-pr.md delete mode 100644 .claude/commands/vouch-recall.md delete mode 100644 .claude/commands/vouch-resolve-issue.md delete mode 100644 .claude/commands/vouch-status.md delete mode 100644 .claude/settings.json delete mode 100644 web/app.css delete mode 100644 web/app.js delete mode 100644 web/base.css delete mode 100644 web/gittensor.html delete mode 100644 web/how-it-works.html delete mode 100644 web/index.html delete mode 100644 web/reference.html diff --git a/.claude/commands/vouch-propose-from-pr.md b/.claude/commands/vouch-propose-from-pr.md deleted file mode 100644 index aca31fc7..00000000 --- a/.claude/commands/vouch-propose-from-pr.md +++ /dev/null @@ -1,25 +0,0 @@ ---- -description: Distill a merged PR into vouch claim proposals ---- - -# /vouch-propose-from-pr - -A PR is a decision: someone proposed a change, the team accepted it. The -"why" gets compressed into the merge message and forgotten. This command -preserves the why as cited claims in the KB. - -Steps: - -1. Parse `$ARGUMENTS` as a PR URL or `/#`; default to the - most-recently-merged PR you authored. -2. Fetch the PR title, body, and the merged-commit SHA via `gh`. -3. Register the merge commit as a `kb_register_source` so subsequent claims - can cite it. -4. Read the diff. For each *behavioural* change (not formatting / renaming), - draft one `kb_propose_claim` whose text summarises the new invariant the - code now upholds, citing the source from step 3. -5. Propose at most five claims per PR. If a PR is that big, suggest the - contributor split it next time. - -Do not auto-approve. The KB's review gate is intentional; this command -only fills the queue. diff --git a/.claude/commands/vouch-recall.md b/.claude/commands/vouch-recall.md deleted file mode 100644 index d72d7168..00000000 --- a/.claude/commands/vouch-recall.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -description: Recall what the project's vouch KB knows about a topic ---- - -# /vouch-recall - -Use vouch's `kb_context` MCP tool to assemble a working set of claims, sources, -and entities the KB already has on the current topic. Print them with their -ids and citations; do not write anything. - -Steps: - -1. Call `kb_context` with `query: "$ARGUMENTS"`. -2. List every returned claim by id + one-line text; for each, show the - source ids it cites. -3. End with a one-sentence summary of what's *missing* from the KB on this - topic — the gap the user can fill with `/vouch-propose-from-pr` or - `kb_propose_claim`. - -Be terse. The KB is meant to remove ambiguity, not pad it. diff --git a/.claude/commands/vouch-resolve-issue.md b/.claude/commands/vouch-resolve-issue.md deleted file mode 100644 index 1b5aaf63..00000000 --- a/.claude/commands/vouch-resolve-issue.md +++ /dev/null @@ -1,27 +0,0 @@ ---- -description: Use vouch's KB to ground a fix for a GitHub issue ---- - -# /vouch-resolve-issue - -Wire vouch's `kb_context` into an issue-resolution flow: the KB should -inform the fix, and the act of solving should propose new claims that -make the next contributor faster. - -Steps: - -1. Parse `$ARGUMENTS` as a GitHub issue URL or `/#` shorthand. - If neither, ask for clarification. -2. `kb_context` with the issue title + body — what does the KB already know - about this area? Show the top 5 claims. -3. Read the relevant code paths. -4. Propose the smallest fix (run the project's tests first to confirm the - bug reproduces). -5. After the fix is committed, propose **at most three** new claims via - `kb_propose_claim` that capture: - * the root cause in one sentence (cited by the offending file:line), - * the chosen fix pattern (cited by the patch commit), and - * any policy/precedent established (only if novel). - -Do not auto-approve. Leave the proposals in `.vouch/proposed/` for the -maintainer to review with `vouch approve` after the PR merges. diff --git a/.claude/commands/vouch-status.md b/.claude/commands/vouch-status.md deleted file mode 100644 index 3320c642..00000000 --- a/.claude/commands/vouch-status.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -description: Show the project's vouch KB at a glance ---- - -# /vouch-status - -Run vouch's `kb_status` MCP tool and surface the result. Use this when the -user asks "what's in our KB?" or before/after a long claim-proposal flow so -they can see the proposal count tick up. - -Format: - -``` -KB at - claims: - sources: - entities: - pending: ← review queue depth - last audit: -``` - -If `pending > 0`, suggest the user run `vouch approve ` (or `vouch lint` -if they want to inspect anything first). Do not propose anything yourself. diff --git a/.claude/settings.json b/.claude/settings.json deleted file mode 100644 index 3130289c..00000000 --- a/.claude/settings.json +++ /dev/null @@ -1,60 +0,0 @@ -{ - "permissions": { - "allow": [ - "mcp__vouch__kb_status", - "mcp__vouch__kb_capabilities", - "mcp__vouch__kb_search", - "mcp__vouch__kb_context", - "mcp__vouch__kb_read_claim", - "mcp__vouch__kb_read_source", - "mcp__vouch__kb_read_page", - "mcp__vouch__kb_read_entity", - "mcp__vouch__kb_read_relation", - "mcp__vouch__kb_list_claims", - "mcp__vouch__kb_list_sources", - "mcp__vouch__kb_list_pages", - "mcp__vouch__kb_list_entities", - "mcp__vouch__kb_list_relations", - "mcp__vouch__kb_list_pending" - ] - }, - "hooks": { - "SessionStart": [ - { - "matcher": "*", - "hooks": [ - { - "type": "command", - "command": "vouch status --json || true" - }, - { - "type": "command", - "command": "vouch capture banner || true" - } - ] - } - ], - "PostToolUse": [ - { - "matcher": "*", - "hooks": [ - { - "type": "command", - "command": "vouch capture observe || true" - } - ] - } - ], - "SessionEnd": [ - { - "matcher": "*", - "hooks": [ - { - "type": "command", - "command": "vouch capture finalize || true" - } - ] - } - ] - } -} diff --git a/.gitignore b/.gitignore index 9a61a8d8..ee98bd96 100644 --- a/.gitignore +++ b/.gitignore @@ -6,6 +6,7 @@ __pycache__/ .mypy_cache/ .ruff_cache/ .coverage +coverage.xml htmlcov/ bench.json .benchmarks/ @@ -13,3 +14,12 @@ dist/ build/ *.swp .DS_Store + +# local tool scratch +.netlify/ +.playwright-mcp/ + +# owner-local, never shipped (anchored to repo root so src/vouch/web +# and adapters/claude-code/.claude stay tracked) +/web/ +/.claude/ diff --git a/web/app.css b/web/app.css deleted file mode 100644 index 3d710b86..00000000 --- a/web/app.css +++ /dev/null @@ -1,366 +0,0 @@ -/* ============================================================ - app.css — the interactive layer for the Gittensor fascicle. - - Loaded after the inline

    -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 auth.md && git add -A && git -c user.email=demo@x.com -c user.name=demo commit -q -m init && clear" +Enter +Sleep 500ms +Show + +# --- init ------------------------------------------------------------- +Type "vouch init" +Sleep 300ms +Enter +Sleep 1200ms + +# --- register a source ------------------------------------------------ +Type "SID=$(vouch source add auth.md --title 'auth notes')" +Sleep 300ms +Enter +Sleep 600ms +Type "echo $SID" +Enter +Sleep 1000ms + +# --- propose a claim as an agent -------------------------------------- +Type "PID=$(VOUCH_AGENT=claude-code vouch propose-claim \" +Enter +Type " --text 'Authentication uses stateless JWTs signed with RS256' \" +Enter +Type " --source $SID --type fact --confidence 0.9)" +Enter +Sleep 800ms +Type "echo $PID" +Enter +Sleep 1000ms + +# --- review ----------------------------------------------------------- +Type "vouch pending" +Enter +Sleep 1500ms + +Type "vouch show $PID | head -20" +Enter +Sleep 2500ms + +# --- approve ---------------------------------------------------------- +Type "vouch approve $PID --reason 'matches the code'" +Enter +Sleep 1500ms + +Type "vouch status" +Enter +Sleep 2000ms + +# --- retrieve --------------------------------------------------------- +Type 'vouch search "JWT"' +Enter +Sleep 2000ms + +Type "vouch audit --tail 4" +Enter +Sleep 3000ms + +# --- the durable artifact on disk ------------------------------------- +Type "ls .vouch/claims/" +Enter +Sleep 1500ms + +Type "cat .vouch/claims/*.yaml" +Enter +Sleep 4000ms diff --git a/docs/example-session.md b/docs/example-session.md index 5f7e9370..230a37f3 100644 --- a/docs/example-session.md +++ b/docs/example-session.md @@ -1,7 +1,10 @@ # Example session +![vouch end-to-end demo](demo.gif) + A full propose → review → commit → retrieve loop, captured from a real -run on 2026-05-21. Reproduce by following along in any git repo. +run on 2026-05-21. Reproduce by following along in any git repo, or +re-render the GIF with `vhs docs/demo.tape` (see [demo.tape](demo.tape)). ## Setup From 98e4e18c028d6fc9b5e4edd1fc3ceffb2254cfd9 Mon Sep 17 00:00:00 2001 From: plind-junior <59729252+plind-junior@users.noreply.github.com> Date: Thu, 21 May 2026 16:56:18 +0900 Subject: [PATCH 047/123] docs: embed demo GIF under Quick start in README --- README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/README.md b/README.md index 11c0d0e0..88bcf9e0 100644 --- a/README.md +++ b/README.md @@ -65,6 +65,10 @@ vouch reject --reason "..." git add .vouch/ && git commit -m "kb: approve auth-uses-jwt" ``` +![vouch end-to-end demo](docs/demo.gif) + +The full captured walkthrough lives at [docs/example-session.md](docs/example-session.md); re-render the GIF from [docs/demo.tape](docs/demo.tape) with `vhs docs/demo.tape`. + ## Object model ``` From 1f1eeb8f49990aaf0890eafb17d24e1c26cd6737 Mon Sep 17 00:00:00 2001 From: plind-junior <59729252+plind-junior@users.noreply.github.com> Date: Thu, 21 May 2026 17:22:30 +0900 Subject: [PATCH 048/123] fix(embeddings): address CodeRabbit review on hybrid + fusion + write hook Bundles the substantive correctness fixes flagged by CodeRabbit on PR #41. CI was already green; these are latent bugs the review caught. storage._embed_and_store - Re-embed when the active embedder model changes, not only when the content hash changes. The previous short-circuit kept stale vectors on disk after a model swap, mixing document embeddings from one model with queries from another. - Truly best-effort: catch any exception during encode/put/meta/dedup so a hook failure can't bubble back to the caller and leave an artifact persisted-but-API-errored. index_db.reset - Also clears embedding_index, query_embedding_cache, embedding_dupes, and embedding_* keys from index_meta. Otherwise `vouch index` left orphaned hits behind after artifacts were removed. index_db.search_embedding (Python fallback) - Normalize the stored vector by its own L2 norm before scoring, so rankings match the sqlite-vec `1 - vec_distance_cosine` path. The previous raw dot product made magnitude leak into the score. index_db.search_semantic - Invalidate the query-vector cache entry when the embedder dim no longer matches what's on disk; otherwise a model swap returned stale vectors living in the wrong space. server.kb_search + jsonl_server._h_search (hybrid branch) - Hybrid now passes min_score into search_semantic (consistent with embedding/auto branches) and wraps the FTS lookup in try/except so an FTS5 error doesn't fail the whole request. - JSONL transport rejects unknown backend values with a clear error instead of silently returning []; matches MCP transport behavior. embeddings.fusion - rrf_fuse validates limit >= 0 and k >= 0 (k = -rank would divide by zero). weighted_fuse validates limit >= 0. Tests - Three new fusion guard tests cover the negative-limit and negative-k paths. --- src/vouch/embeddings/fusion.py | 9 ++++++ src/vouch/index_db.py | 34 +++++++++++++++++++-- src/vouch/jsonl_server.py | 21 +++++++++++-- src/vouch/server.py | 12 ++++++-- src/vouch/storage.py | 54 ++++++++++++++++++++++----------- tests/embeddings/test_fusion.py | 18 +++++++++++ 6 files changed, 124 insertions(+), 24 deletions(-) diff --git a/src/vouch/embeddings/fusion.py b/src/vouch/embeddings/fusion.py index 84a2656b..c732c720 100644 --- a/src/vouch/embeddings/fusion.py +++ b/src/vouch/embeddings/fusion.py @@ -21,6 +21,13 @@ def _coalesce_snippet(h: Hit, other: Hits) -> str: def rrf_fuse(a: Hits, b: Hits, *, limit: int = 10, k: int = 60) -> Hits: """Reciprocal Rank Fusion: score = sum(1 / (k + rank)) across lists.""" + if limit < 0: + raise ValueError("limit must be >= 0") + if k < 0: + # rank starts at 1, so k must be > -1, but disallow negative + # entirely to match the canonical RRF definition (Cormack et al.) + # and to avoid division by zero when k == -rank. + raise ValueError("k must be >= 0") scores: dict[tuple[str, str], float] = {} for lst in (a, b): for rank, h in enumerate(lst, start=1): @@ -54,6 +61,8 @@ def weighted_fuse( limit: int = 10, ) -> Hits: """Min-max normalize each list, then score = w_a * a_score + w_b * b_score.""" + if limit < 0: + raise ValueError("limit must be >= 0") a_norm = _minmax([h[3] for h in a]) b_norm = _minmax([h[3] for h in b]) a_score = {_key(h): a_norm[i] for i, h in enumerate(a)} diff --git a/src/vouch/index_db.py b/src/vouch/index_db.py index 3152a8cb..71c7734a 100644 --- a/src/vouch/index_db.py +++ b/src/vouch/index_db.py @@ -87,10 +87,24 @@ def open_db(kb_dir: Path): def reset(kb_dir: Path) -> None: - """Drop everything; the rebuild caller re-populates.""" + """Drop everything; the rebuild caller re-populates. + + Clears every derived table — FTS indexes, embedding vectors, the + query embedding cache, dedup detections, and embedding metadata. + `vouch index` rebuilds the FTS rows from disk; the embedding write + hook backfills `embedding_index` and `index_meta` as artifacts are + re-read. Leaving stale rows here means semantic search can return + orphaned hits after a reindex. + """ with open_db(kb_dir) as conn: conn.executescript( - "DELETE FROM claims_fts; DELETE FROM pages_fts; DELETE FROM entities_fts;" + "DELETE FROM claims_fts;" + "DELETE FROM pages_fts;" + "DELETE FROM entities_fts;" + "DELETE FROM embedding_index;" + "DELETE FROM query_embedding_cache;" + "DELETE FROM embedding_dupes;" + "DELETE FROM index_meta WHERE key LIKE 'embedding_%';" ) @@ -314,7 +328,13 @@ def search_embedding( scored: list[tuple[str, str, str, float]] = [] for kind, id_, blob, dim in rows: vec = _blob_to_vec(blob, dim) - score = float(q @ vec) + # Cosine similarity: q is already unit-normalized above; normalize + # the stored vec here too so rankings match the sqlite-vec path + # (which uses `1 - vec_distance_cosine`, i.e. true cosine). + vnorm = float(np.linalg.norm(vec)) + if vnorm == 0: + continue + score = float(q @ vec) / vnorm if score >= min_score: scored.append((kind, id_, "", score)) scored.sort(key=lambda r: r[3], reverse=True) @@ -342,6 +362,14 @@ def search_semantic( except KeyError: return [] qvec = lookup_query_vec(kb_dir, query=query) + # The query cache is keyed by text only; if the embedder model or + # vector dimension has changed since the entry was cached, the stored + # vector lives in a different space than the indexed document + # embeddings. Drop the stale entry and re-encode in that case. + if qvec is not None: + cached_dim = int(getattr(qvec, "shape", [0])[0] or 0) + if cached_dim != embedder.dim: + qvec = None if qvec is None: qvec = embedder.encode(query) cache_query_vec(kb_dir, query=query, vec=qvec) diff --git a/src/vouch/jsonl_server.py b/src/vouch/jsonl_server.py index bb4b9226..f6f6a293 100644 --- a/src/vouch/jsonl_server.py +++ b/src/vouch/jsonl_server.py @@ -81,6 +81,16 @@ def _h_search(p: dict) -> list[dict]: hits: list[tuple[str, str, str, float]] = [] used = backend_arg + # Reject unknown backends with a clear error rather than silently + # returning []. Falling through hides client typos and diverges from + # the MCP transport, which raises ValueError on the same input. + valid_backends = {"auto", "embedding", "fts5", "substring", "hybrid"} + if backend_arg not in valid_backends: + raise ValueError( + f"unknown backend: {backend_arg!r} " + f"(expected one of {sorted(valid_backends)})" + ) + if backend_arg in ("auto", "embedding"): hits = index_db.search_semantic( s.kb_dir, q, limit=limit, min_score=min_score, @@ -100,8 +110,15 @@ def _h_search(p: dict) -> list[dict]: from .embeddings.fusion import ( # type: ignore[import-not-found,import-untyped,unused-ignore] rrf_fuse, ) - emb = index_db.search_semantic(s.kb_dir, q, limit=limit * 2) - fts = index_db.search(s.kb_dir, q, limit=limit * 2) + # Hybrid must honour min_score and survive FTS failures the same + # way the dedicated fts5 branch does. + emb = index_db.search_semantic( + s.kb_dir, q, limit=limit * 2, min_score=min_score, + ) + try: + fts = index_db.search(s.kb_dir, q, limit=limit * 2) + except Exception: + fts = [] hits = rrf_fuse(emb, fts, limit=limit) used = "hybrid" diff --git a/src/vouch/server.py b/src/vouch/server.py index 75dff925..0665dc11 100644 --- a/src/vouch/server.py +++ b/src/vouch/server.py @@ -127,8 +127,16 @@ def _to_dicts(h: list[tuple[str, str, str, float]], used: str) -> dict[str, Any] from .embeddings.fusion import ( # type: ignore[import-not-found,import-untyped,unused-ignore] rrf_fuse, ) - emb = index_db.search_semantic(store.kb_dir, query, limit=limit * 2) - fts = index_db.search(store.kb_dir, query, limit=limit * 2) + # Hybrid must honour min_score (the embedding side can return + # low-relevance noise otherwise) and survive FTS failures the same + # way the dedicated fts5 branch does. + emb = index_db.search_semantic( + store.kb_dir, query, limit=limit * 2, min_score=min_score, + ) + try: + fts = index_db.search(store.kb_dir, query, limit=limit * 2) + except Exception: + fts = [] hits = rrf_fuse(emb, fts, limit=limit) return _to_dicts(hits, "hybrid") diff --git a/src/vouch/storage.py b/src/vouch/storage.py index 4c5e0892..ab3085c4 100644 --- a/src/vouch/storage.py +++ b/src/vouch/storage.py @@ -24,6 +24,7 @@ from __future__ import annotations import hashlib +import logging import os import re import stat @@ -44,6 +45,8 @@ Source, ) +_embed_log = logging.getLogger("vouch.embeddings") + KB_DIRNAME = ".vouch" CONFIG_FILENAME = "config.yaml" @@ -468,9 +471,14 @@ def list_sessions(self) -> list[Session]: def _embed_and_store(self, *, kind: str, id: str, text: str) -> None: """Compute and persist an embedding for an artifact. - Skipped if (kind, id) already exists with the same content hash. - Failures (e.g. embeddings extras not installed) are swallowed -- - embeddings are an enhancement, not a hard requirement. + Skipped only if (kind, id) already has an embedding produced by + the *current* embedder model for the same content. Changing + embedders mid-life means the existing vector is in the wrong + space, so we must re-embed even when the content hash matches. + + Every failure in here is swallowed (logged at DEBUG) — embeddings + are an enhancement, not a hard requirement. The caller has + already committed the artifact to disk; we must not undo that. """ if not text or not text.strip(): return @@ -479,25 +487,35 @@ def _embed_and_store(self, *, kind: str, id: str, text: str) -> None: from .embeddings import content_hash, get_embedder except ImportError: return - h = content_hash(text) - existing = _index_db.get_embedding(self.kb_dir, kind=kind, id=id) - if existing is not None and existing[1] == h: - return try: embedder = get_embedder() except KeyError: return - vec = embedder.encode(text) - with _index_db.open_db(self.kb_dir) as conn: - _index_db.put_embedding( - conn, kind=kind, id=id, vec=vec, content_hash=h, - model=embedder.name, model_version=embedder.version, - dim=embedder.dim, + try: + h = content_hash(text) + existing = _index_db.get_embedding(self.kb_dir, kind=kind, id=id) + # existing is (vec, content_hash, model); skip only when both the + # content AND the embedder model match what's on disk. + if ( + existing is not None + and existing[1] == h + and existing[2] == embedder.name + ): + return + vec = embedder.encode(text) + with _index_db.open_db(self.kb_dir) as conn: + _index_db.put_embedding( + conn, kind=kind, id=id, vec=vec, content_hash=h, + model=embedder.name, model_version=embedder.version, + dim=embedder.dim, + ) + _index_db.set_embedding_meta( + self.kb_dir, model=embedder.name, + version=embedder.version, dim=embedder.dim, ) - _index_db.set_embedding_meta( - self.kb_dir, model=embedder.name, - version=embedder.version, dim=embedder.dim, - ) + except Exception as e: + _embed_log.debug("embedding write failed for %s/%s: %s", kind, id, e) + return try: # NB: dedup module is added in a later phase; ignore missing-stub # / missing-module noise in CI's [dev]-only mypy run. @@ -507,6 +525,8 @@ def _embed_and_store(self, *, kind: str, id: str, text: str) -> None: check_and_log(self.kb_dir, kind=kind, id=id, vec=vec) except ImportError: pass + except Exception as e: + _embed_log.debug("dedup check failed for %s/%s: %s", kind, id, e) # --- proposals --------------------------------------------------------- diff --git a/tests/embeddings/test_fusion.py b/tests/embeddings/test_fusion.py index 322179c9..eb51361b 100644 --- a/tests/embeddings/test_fusion.py +++ b/tests/embeddings/test_fusion.py @@ -2,6 +2,8 @@ from __future__ import annotations +import pytest + from vouch.embeddings.fusion import ( normalized_fuse, rrf_fuse, @@ -39,3 +41,19 @@ def test_normalized_fuse_zero_score_inputs() -> None: b = _hits([("claim", "y", 0.0)]) fused = normalized_fuse(a, b, limit=2) assert len(fused) == 2 + + +def test_rrf_fuse_rejects_negative_limit() -> None: + with pytest.raises(ValueError, match="limit must be >= 0"): + rrf_fuse([], [], limit=-1) + + +def test_rrf_fuse_rejects_negative_k() -> None: + # k=-1 would make 1/(k+rank) explode (rank=1 -> divide by zero). + with pytest.raises(ValueError, match="k must be >= 0"): + rrf_fuse([], [], limit=5, k=-1) + + +def test_weighted_fuse_rejects_negative_limit() -> None: + with pytest.raises(ValueError, match="limit must be >= 0"): + weighted_fuse([], [], limit=-1) From cef16642268389dac05340c68ed263b3be038786 Mon Sep 17 00:00:00 2001 From: plind-junior <59729252+plind-junior@users.noreply.github.com> Date: Thu, 21 May 2026 21:14:00 +0900 Subject: [PATCH 049/123] fix(lifecycle): only catch missing-artifact errors in cite() the bare except was treating every error as a missing citation, which hid real bugs. narrow it to ArtifactNotFoundError so unexpected failures actually surface. --- src/vouch/lifecycle.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/vouch/lifecycle.py b/src/vouch/lifecycle.py index 86482a54..e2e8bc88 100644 --- a/src/vouch/lifecycle.py +++ b/src/vouch/lifecycle.py @@ -15,7 +15,7 @@ from . import audit from .models import Claim, ClaimStatus, Evidence, Relation, RelationType -from .storage import KBStore +from .storage import ArtifactNotFoundError, KBStore class LifecycleError(RuntimeError): @@ -127,7 +127,7 @@ def cite(store: KBStore, claim_id: str) -> list[Evidence | dict]: try: out.append(store.get_evidence(ref)) continue - except Exception: + except ArtifactNotFoundError: pass try: src = store.get_source(ref) @@ -138,6 +138,6 @@ def cite(store: KBStore, claim_id: str) -> list[Evidence | dict]: "locator": src.locator, "hash": src.hash, }) - except Exception: + except ArtifactNotFoundError: out.append({"kind": "missing", "ref": ref}) return out From bc719aa14477bd7f952c377ede4a1a7386cb7862 Mon Sep 17 00:00:00 2001 From: plind-junior <59729252+plind-junior@users.noreply.github.com> Date: Thu, 21 May 2026 21:14:05 +0900 Subject: [PATCH 050/123] fix(context): only catch missing-artifact errors in citation lookup MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit same issue as cite() — a bare except was hiding real errors behind an empty citation list. narrow it to ArtifactNotFoundError. --- src/vouch/context.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/vouch/context.py b/src/vouch/context.py index 532e7278..c2dccbbf 100644 --- a/src/vouch/context.py +++ b/src/vouch/context.py @@ -17,7 +17,7 @@ from . import index_db from .models import ContextItem, ContextPack, ContextQuality -from .storage import KBStore +from .storage import ArtifactNotFoundError, KBStore ContextItemKind = Literal["claim", "page", "entity", "relation", "source"] @@ -41,7 +41,7 @@ def _retrieve(store: KBStore, query: str, limit: int def _citations_for_claim(store: KBStore, claim_id: str) -> list[str]: try: claim = store.get_claim(claim_id) - except Exception: + except ArtifactNotFoundError: return [] return list(claim.evidence) From 0f3ffc44c1835193bb2241b6504646d5898d63ce Mon Sep 17 00:00:00 2001 From: plind-junior <59729252+plind-junior@users.noreply.github.com> Date: Thu, 21 May 2026 21:14:09 +0900 Subject: [PATCH 051/123] refactor(sessions): keep tracebacks when crystallize() approve fails we were dropping the traceback and only stringifying the error, which made it painful to diagnose anything other than ProposalError. now logs via logger.exception and includes error_type in the failures list. --- src/vouch/sessions.py | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/src/vouch/sessions.py b/src/vouch/sessions.py index 5a93134d..5b4d6354 100644 --- a/src/vouch/sessions.py +++ b/src/vouch/sessions.py @@ -7,6 +7,7 @@ from __future__ import annotations +import logging import time import uuid from datetime import UTC, datetime @@ -16,6 +17,8 @@ from .proposals import approve from .storage import KBStore +logger = logging.getLogger(__name__) + def new_session_id() -> str: ts = time.strftime("%Y%m%d-%H%M%S", time.gmtime()) @@ -81,7 +84,15 @@ def crystallize( ) approved_artifact_ids.append(artifact.id) except Exception as e: - failures.append({"proposal_id": proposal.id, "error": str(e)}) + logger.exception( + "crystallize: approve(%s) failed in session %s", + proposal.id, sess.id, + ) + failures.append({ + "proposal_id": proposal.id, + "error": str(e), + "error_type": type(e).__name__, + }) summary_page_id: str | None = None if write_summary_page and approved_artifact_ids: From c095ff38e1fb6e0ad4529b05aa98cc46d417a8f4 Mon Sep 17 00:00:00 2001 From: plind-junior <59729252+plind-junior@users.noreply.github.com> Date: Thu, 21 May 2026 21:58:43 +0900 Subject: [PATCH 052/123] fix(context): only catch sqlite errors when FTS5 falls back the retrieval helper had a bare except that would also swallow bugs in the substring fallback path or in our own code. narrow it to sqlite3.Error so only the intended cases (FTS5 missing, db missing, schema mismatch) trigger the fallback. --- src/vouch/context.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/vouch/context.py b/src/vouch/context.py index c2dccbbf..16ddde2a 100644 --- a/src/vouch/context.py +++ b/src/vouch/context.py @@ -13,6 +13,7 @@ from __future__ import annotations +import sqlite3 from typing import Literal, cast from . import index_db @@ -29,8 +30,9 @@ def _retrieve(store: KBStore, query: str, limit: int hits = index_db.search(store.kb_dir, query, limit=limit) if hits: return [(k, i, s, sc, "fts5") for k, i, s, sc in hits] - except Exception: - # FTS5 unavailable or empty — fall through to substring scan. + except sqlite3.Error: + # FTS5 unavailable, db missing, or schema mismatch — fall through + # to substring scan. Other exceptions are real bugs and propagate. pass return [ (k, i, s, sc, "substring") From 781fa8ea5c0d326189e21cfc4ce203c9c6dd93e6 Mon Sep 17 00:00:00 2001 From: plind-junior <59729252+plind-junior@users.noreply.github.com> Date: Thu, 21 May 2026 22:46:50 +0900 Subject: [PATCH 053/123] refactor(health): use typed status filter for pending proposal count MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit we were listing every proposal and comparing p.status.value == 'pending' as a string. list_proposals() already takes a ProposalStatus filter — use it. shorter, type-checked, and avoids the stringly-typed compare. --- src/vouch/health.py | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/vouch/health.py b/src/vouch/health.py index fde3412b..0bc684cb 100644 --- a/src/vouch/health.py +++ b/src/vouch/health.py @@ -13,7 +13,7 @@ from . import index_db from .audit import count_events -from .models import ClaimStatus +from .models import ClaimStatus, ProposalStatus from .storage import KBStore, sha256_hex from .verify import verify_all @@ -44,9 +44,7 @@ def status(store: KBStore) -> dict: "relations": len(store.list_relations()), "evidence": len(store.list_evidence()), "sessions": len(store.list_sessions()), - "pending_proposals": sum( - 1 for p in store.list_proposals() if p.status.value == "pending" - ), + "pending_proposals": len(store.list_proposals(ProposalStatus.PENDING)), "audit_events": count_events(store.kb_dir), "index_present": (store.kb_dir / index_db.DB_FILENAME).exists(), } From d416e6559952c7aaad1e900b54c24f25455d87e8 Mon Sep 17 00:00:00 2001 From: Tet-9 Date: Sun, 21 Jun 2026 22:15:45 +0100 Subject: [PATCH 054/123] chore(capabilities): pin pluginApi compat baseline, fail CI on host-compat drift --- CHANGELOG.md | 1 + schemas/capabilities.schema.json | 6 +++ src/vouch/capabilities.py | 33 +++++++++++++++ src/vouch/models.py | 9 ++++ tests/test_capabilities.py | 70 ++++++++++++++++++++++++++++++++ 5 files changed, 119 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index b88c0498..38fb0f25 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -16,6 +16,7 @@ All notable changes to vouch are documented here. Format follows New `vouch schema list` and `vouch schema sync` commands inspect declared kinds and audit existing pages against them; `propose-page` gains `--kind` and repeatable `--meta key=value`. +- `kb.capabilities` now reports a `host_compat` block mirroring the `openclaw.compat` constraints declared in `openclaw.plugin.json` (e.g. `pluginApi`), so non-OpenClaw clients can detect compat without parsing the manifest. A new test asserts the two stay in sync and fails CI on drift (#237). - `kb.synthesize` — answer-mode retrieval over the review-gated KB. Answers a query in prose from approved claims only, with an inline `[claim_id]` citation behind every sentence, an explicit `gaps` block listing query diff --git a/schemas/capabilities.schema.json b/schemas/capabilities.schema.json index b986604e..f795ed3d 100644 --- a/schemas/capabilities.schema.json +++ b/schemas/capabilities.schema.json @@ -12,6 +12,12 @@ "title": "Context Engines", "type": "array" }, + "host_compat": { + "additionalProperties": true, + "description": "Per-host compatibility ranges (#237). Mirrors the `openclaw.compat` block in openclaw.plugin.json so non-OpenClaw clients can detect compat without parsing the manifest, e.g. {\"openclaw\": {\"pluginApi\": \">=2026.4.0\"}}.", + "title": "Host Compat", + "type": "object" + }, "knowledge_capability": { "additionalProperties": true, "title": "Knowledge Capability", diff --git a/src/vouch/capabilities.py b/src/vouch/capabilities.py index 39872ade..b84ccaf9 100644 --- a/src/vouch/capabilities.py +++ b/src/vouch/capabilities.py @@ -7,10 +7,21 @@ from __future__ import annotations +import json +import logging +from pathlib import Path + from . import __version__ from .models import Capabilities from .openclaw.context_engine import describe_engine +_log = logging.getLogger(__name__) + +# Path to the plugin manifest, relative to this module. capabilities.py lives +# at src/vouch/capabilities.py; openclaw.plugin.json lives at the repo root, +# three levels up (src/vouch/ -> src/ -> repo root). +_PLUGIN_MANIFEST_PATH = Path(__file__).resolve().parent.parent.parent / "openclaw.plugin.json" + # The full method surface this implementation exposes. Keep this list in # sync with the MCP server + JSONL server registrations — `test_capabilities` # asserts they match. @@ -72,6 +83,27 @@ ] +def _load_host_compat() -> dict[str, dict[str, str]]: + """Read the `openclaw.compat` block from openclaw.plugin.json (#237). + + Surfaced in `kb.capabilities` as `host_compat` so non-OpenClaw clients + can detect compat without parsing the manifest themselves. Returns an + empty dict (rather than raising) if the manifest is missing or + malformed — capabilities() must never fail to report basic info just + because the manifest moved or this is installed as a standalone wheel + without the manifest packaged alongside it. + """ + try: + manifest = json.loads(_PLUGIN_MANIFEST_PATH.read_text(encoding="utf-8")) + except (OSError, json.JSONDecodeError) as e: + _log.debug("openclaw.plugin.json unreadable, host_compat will be empty: %s", e) + return {} + compat = manifest.get("openclaw", {}).get("compat") + if not isinstance(compat, dict): + return {} + return {"openclaw": {k: str(v) for k, v in compat.items()}} + + def capabilities() -> Capabilities: retrieval = ["fts5", "substring"] try: @@ -94,4 +126,5 @@ def capabilities() -> Capabilities: "config_path": "retrieval.scope", }, context_engines=[describe_engine()], + host_compat=_load_host_compat(), ) diff --git a/src/vouch/models.py b/src/vouch/models.py index 23f94aa4..e4b27727 100644 --- a/src/vouch/models.py +++ b/src/vouch/models.py @@ -456,3 +456,12 @@ class Capabilities(BaseModel): default_factory=list, description="OpenClaw context engines exposed (see openclaw.plugin.json)", ) + host_compat: dict[str, Any] = Field( + default_factory=dict, + description=( + "Per-host compatibility ranges (#237). Mirrors the " + "`openclaw.compat` block in openclaw.plugin.json so non-OpenClaw " + "clients can detect compat without parsing the manifest, e.g. " + '{"openclaw": {"pluginApi": ">=2026.4.0"}}.' + ), + ) diff --git a/tests/test_capabilities.py b/tests/test_capabilities.py index 736b20ba..6908a3cb 100644 --- a/tests/test_capabilities.py +++ b/tests/test_capabilities.py @@ -2,6 +2,11 @@ from __future__ import annotations +import json +from pathlib import Path + +import pytest + from vouch import capabilities from vouch.jsonl_server import HANDLERS @@ -15,3 +20,68 @@ def test_capabilities_matches_jsonl_handlers() -> None: f"missing handlers={declared - implemented}, " f"missing capabilities={implemented - declared}" ) + + +# --- host_compat drift detection (#237) ----------------------------------- +# +# vouch declares openclaw.compat.pluginApi in openclaw.plugin.json. The same +# value must surface in kb.capabilities so non-OpenClaw clients can detect +# compat without parsing the manifest. These tests fail CI with a clear +# message if the two declarations drift apart. + +_MANIFEST_PATH = ( + Path(__file__).resolve().parent.parent / "openclaw.plugin.json" +) + + +def _manifest_plugin_api() -> str: + manifest = json.loads(_MANIFEST_PATH.read_text(encoding="utf-8")) + return manifest["openclaw"]["compat"]["pluginApi"] + + +def test_capabilities_host_compat_matches_openclaw_manifest() -> None: + """kb.capabilities.host_compat.openclaw.pluginApi must equal the + pluginApi range declared in openclaw.plugin.json. A bump in one file + without the other is exactly the "host compat drift" #237 asks CI to + catch.""" + caps = capabilities.capabilities() + manifest_range = _manifest_plugin_api() + capabilities_range = caps.host_compat.get("openclaw", {}).get("pluginApi") + assert capabilities_range == manifest_range, ( + f"host compat drift: openclaw.plugin.json declares pluginApi=" + f"{manifest_range!r} but kb.capabilities.host_compat reports " + f"{capabilities_range!r}. Keep both in sync." + ) + + +def test_capabilities_host_compat_present_and_nonempty() -> None: + """host_compat must not silently degrade to {} when the manifest is + readable -- that would defeat the drift check above by making both + sides agree on "missing" rather than catching real drift.""" + caps = capabilities.capabilities() + assert "openclaw" in caps.host_compat + assert "pluginApi" in caps.host_compat["openclaw"] + assert caps.host_compat["openclaw"]["pluginApi"].strip() != "" + + +def test_load_host_compat_returns_empty_on_missing_manifest( + monkeypatch: pytest.MonkeyPatch, tmp_path: Path, +) -> None: + """_load_host_compat must degrade gracefully (empty dict, no raise) if + the manifest is absent -- e.g. installed as a standalone wheel without + openclaw.plugin.json packaged alongside it.""" + monkeypatch.setattr( + capabilities, "_PLUGIN_MANIFEST_PATH", tmp_path / "does-not-exist.json" + ) + assert capabilities._load_host_compat() == {} + + +def test_load_host_compat_returns_empty_on_malformed_manifest( + monkeypatch: pytest.MonkeyPatch, tmp_path: Path, +) -> None: + """A malformed manifest must not crash capabilities() -- it's reporting + diagnostic info, not validating the install.""" + bad = tmp_path / "openclaw.plugin.json" + bad.write_text("{not valid json", encoding="utf-8") + monkeypatch.setattr(capabilities, "_PLUGIN_MANIFEST_PATH", bad) + assert capabilities._load_host_compat() == {} From 45f32c298dec94a89ae3055be42a2383a70e61b3 Mon Sep 17 00:00:00 2001 From: plind-junior <59729252+plind-junior@users.noreply.github.com> Date: Fri, 26 Jun 2026 19:02:47 +0900 Subject: [PATCH 055/123] feat(dual-solve): surface engine logs --- CHANGELOG.md | 3 ++ src/vouch/cli.py | 14 +++++++- src/vouch/dual_solve.py | 51 ++++++++++++++++++++++++++++- src/vouch/web/dual_solve_api.py | 4 ++- src/vouch/web/static/dual_solve.css | 3 ++ src/vouch/web/static/dual_solve.js | 13 +++++++- tests/test_dual_solve.py | 45 +++++++++++++++++++++++-- tests/test_web_dual_solve.py | 10 ++++-- 8 files changed, 134 insertions(+), 9 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 75723dbd..5ba7890e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -27,6 +27,9 @@ All notable changes to vouch are documented here. Format follows - dual-solve JSON, review-ui job, and choose responses now include `changed_files` for each candidate and the kept branch, so desktop and browser clients can show the resulting files without parsing unified diffs. +- dual-solve JSON and review-ui job responses now include each engine's returned + output log plus a deterministic recommendation hint based on success and diff + scope, so clients can compare Claude and Codex results before choosing. - `vouch review-ui --allow-dual-solve` — a browser SPA that runs `dual-solve` on a github issue link, streams progress over the review-ui's websocket, shows both engines' diffs side by side, and lets you pick the winner. Off by default; diff --git a/src/vouch/cli.py b/src/vouch/cli.py index ca465cae..9cf69649 100644 --- a/src/vouch/cli.py +++ b/src/vouch/cli.py @@ -2029,21 +2029,33 @@ def dual_solve_cmd(issue_url: str, claude_effort: str, codex_effort: str, _emit_json({ "issue": {"number": issue.number, "title": issue.title, "url": issue.url}, + "recommendation": ds_mod.recommendation(candidates), "candidates": [ {"engine": c.engine, "branch": c.branch, "ok": c.ok, "error": c.error, "changed_files": ds_mod.changed_files(c.diff), - "diff": c.diff} for c in candidates + "log": c.log, "diff": c.diff} for c in candidates ], }) return for c in candidates: click.echo(f"\n=== {c.engine} ({c.branch}) ===", err=True) + if c.log.strip(): + click.echo("--- engine log ---", err=True) + click.echo(c.log) if c.ok: + if c.log.strip(): + click.echo("--- diff ---", err=True) click.echo(c.diff) else: click.echo(f"(failed: {c.error})", err=True) + rec = ds_mod.recommendation(candidates) + if rec.get("reason"): + label = f"recommendation: {rec['engine']}" if rec.get("engine") \ + else "recommendation: no automatic pick" + click.echo(f"{label} -- {rec['reason']}", err=True) + ok = [c for c in candidates if c.ok] if not ok: raise click.ClickException("both engines failed; nothing to choose") diff --git a/src/vouch/dual_solve.py b/src/vouch/dual_solve.py index d7734af5..dedbb82d 100644 --- a/src/vouch/dual_solve.py +++ b/src/vouch/dual_solve.py @@ -37,6 +37,7 @@ "parse_issue_ref", "parse_summary", "prepare", + "recommendation", "record_to_kb", "repo_root", "run_candidate", @@ -73,6 +74,7 @@ class Candidate: worktree: Path diff: str = "" sha: str = "" + log: str = "" ok: bool = False error: str | None = None @@ -97,6 +99,53 @@ def changed_files(diff: str) -> list[str]: return files +def _diff_stats(candidate: Candidate) -> tuple[int, int]: + files = changed_files(candidate.diff) + return len(files), len(candidate.diff.splitlines()) + + +def recommendation(candidates: list[Candidate]) -> dict[str, str | None]: + """Return a deterministic reviewer hint for the two dual-solve candidates. + + This is deliberately a scope heuristic, not an automated quality judgment: + successful candidates beat failed ones; then the smaller changed-file count + and smaller diff win. Ties stay unresolved for the human reviewer. + """ + ok = [c for c in candidates if c.ok] + if not ok: + return { + "engine": None, + "reason": "neither engine produced a usable diff.", + } + if len(ok) == 1: + return { + "engine": ok[0].engine, + "reason": f"only {ok[0].engine} produced a usable diff.", + } + + ranked = sorted(ok, key=_diff_stats) + best = ranked[0] + other = ranked[1] + best_files, best_lines = _diff_stats(best) + other_files, other_lines = _diff_stats(other) + if (best_files, best_lines) == (other_files, other_lines): + return { + "engine": None, + "reason": ( + "both engines produced equally scoped diffs; " + "review the logs and tests before choosing." + ), + } + return { + "engine": best.engine, + "reason": ( + f"{best.engine} has the smaller scoped diff " + f"({best_files} files, {best_lines} lines vs " + f"{other_files} files, {other_lines} lines)." + ), + } + + def parse_issue_ref(ref: str) -> tuple[str | None, str]: """Normalize an issue reference for ``gh issue view``. @@ -209,7 +258,7 @@ def run_candidate(engine: Engine, issue: Issue, prompt: str, root: Path, return cand try: - engine.fix(cwd=str(worktree), prompt=prompt) + cand.log = engine.fix(cwd=str(worktree), prompt=prompt) except Exception as exc: cand.error = f"engine failed: {exc}" return cand diff --git a/src/vouch/web/dual_solve_api.py b/src/vouch/web/dual_solve_api.py index 5b0e08df..c696cb94 100644 --- a/src/vouch/web/dual_solve_api.py +++ b/src/vouch/web/dual_solve_api.py @@ -68,9 +68,10 @@ def _serialize(job: DualSolveJob) -> dict[str, Any]: "candidates": [ {"engine": c.engine, "branch": c.branch, "ok": c.ok, "error": c.error, "changed_files": ds.changed_files(c.diff), - "diff": c.diff} + "log": c.log, "diff": c.diff} for c in job.candidates ], + "recommendation": ds.recommendation(job.candidates), "proposed_ids": list(job.proposed_ids), "kept_branch": job.kept_branch, "changed_files": ds.changed_files(kept.diff) if kept is not None else [], @@ -200,4 +201,5 @@ async def dual_solve_choose(req: _ChooseReq) -> dict[str, Any]: "kept_branch": job.kept_branch, "proposed_ids": ids, "changed_files": ds.changed_files(chosen.diff) if chosen is not None else [], + "recommendation": ds.recommendation(job.candidates), } diff --git a/src/vouch/web/static/dual_solve.css b/src/vouch/web/static/dual_solve.css index e94148a8..e77e4bf8 100644 --- a/src/vouch/web/static/dual_solve.css +++ b/src/vouch/web/static/dual_solve.css @@ -3,9 +3,12 @@ .ds-run input { flex: 1; } .ds-progress { background:#111; color:#ddd; padding:.5rem; white-space:pre-wrap; } .ds-error { color:#b00; } +.ds-recommendation { border:1px solid #ddd; padding:.5rem; background:#f8f8f8; } .ds-panes { display:grid; grid-template-columns:1fr 1fr; gap:1rem; } .ds-pane { border:1px solid #ccc; padding:.5rem; overflow:auto; } .ds-changed-files { font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace; font-size:12px; margin:.25rem 0 .5rem; } +.ds-log { margin:.25rem 0 .75rem; } +.ds-log pre { max-height:220px; overflow:auto; white-space:pre-wrap; background:#111; color:#ddd; padding:.5rem; } .ds-file-head { font-weight:600; margin-top:.5rem; } .ds-pane pre { margin:0; font-size:12px; overflow-x:auto; } .ln-add { background:#e6ffed; display:block; } diff --git a/src/vouch/web/static/dual_solve.js b/src/vouch/web/static/dual_solve.js index fc0e9b85..a7772013 100644 --- a/src/vouch/web/static/dual_solve.js +++ b/src/vouch/web/static/dual_solve.js @@ -36,7 +36,7 @@ export default { const job = reactive({ id: null, status: "idle", progress: [], candidates: [], issue: null, error: null, kept_branch: null, proposed_ids: [], - changed_files: [], + changed_files: [], recommendation: null, }); function applyState(s) { @@ -64,6 +64,7 @@ export default { async function run() { job.progress = []; job.error = null; job.candidates = []; job.kept_branch = null; job.proposed_ids = []; job.changed_files = []; + job.recommendation = null; const r = await fetch("/dual-solve/run", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ @@ -105,6 +106,12 @@ export default {

  • X!ce{sNaCUTWckz@GDH-g|sb%oCRt_oJDGw63PzJXqquC2G=@@t(o?dJ?mv zj@Wy7lNlvrN6+Q8_FG~Ktsd6R+Rl5Hy86QIDXV9c?Wv>pE6nT>U`@G?18d%@g-4cL z3ygJ7(swOE2A@p7bz0PWKZbcTOEaf%aWwMj?U6IzHV5|wp$QI+{SShvdpDaVzkV_0 zlQOgdo=vh!sAP>ZZ@tEXzHgsqeRA2-`sdPyS98s5MXR=&n6w7PEJ!GBHC@iBUr9EO zF1N|?OU@Q@|Fuj9{;ya3e6+CR;Gr zd5rZiIno}Plh8jFfyvFfx%oqh&(@gfi#eEU{nHY(9$8#D*!qp@yyyUZ@Ar3Y4QJODx&Y1zUevbT$Gd*^|4(#)RIGGIgLHPch#oJ*bfsa^$@_z=N@zzm{xUl z)15O^3Hg`jn!VNuZy#12bUb}&)g{CuZs=BG9Lr7SWM!L?l#igwlX=>$vIrSsXcU-pQt;K*klHR=RPTdM>^026jvwU4?ATL#r{^sS> z``;U%Xy#r_xiwk4GQTJB>E_eI2-2@{5Lpua=Dp@%dTZc#@1?0=%>@`Ajp4MbpKjkA z@2m*nAz(pd|4!x6RY-RZS%&p2KbqbYmZ^^l{F9kYS(x1ylotiq_61v|uv)k#ubuxZ zqJop=OrwR8`IJDNF-BRN8!pIYrWoYXu<+CRc)?Twaq)Ah4z@!=I^! z+Z6WOM!5eJ+@rTP_ms3|i^6DT`3&=EBT(fHJ?Jz#L`5>fCF1w=^|bYO&d2_YptNU) z72+%I4!BTS*7VdZ-H9vZ4Qp#Qs;nh?{cw;&R#N@u-%qh56SCrBkMRihG2L$4-zx`x z{$*-`FFJk5^~@rxI^%sNUX$oEu&T7ts7=okFD`i9w9`*F3%35K8(_S!-Yd=G!%8Q9 z9H+cyQ!kNHsYueXA8-q1wNc<5=0a z`U2eQa8km8XsofaWz=I!Kdjl28>v*lf&?h@jIec8 zLfEzuP716AOI!BL@5A#&Z?m&_lNGhHbtPwlwp~tM`?Gs`f0n(I&%0jtm-PWg-Q!;@ zw*{RH3#BVca?c^2wl0>p_`s@gO3p6*2fLHy7hW{-9T2I#MT{G}?_7+VdCa`JY?D6F zM5Os>w*HSzx$zhfKDT_!l@@xR{iAK`FIB{kjll|+*-TS^CjKnk4sI~oa^ynr^4$6T z?uLcG8)YGTp93u`_2-arAB&zbYMn;0PKZ(zx|?~Zl2?wH1*}XFFe>fC`qCaZA~iJPm4zR*>&Rw`tN46 zNoalOyRwy|4ofGbZv8gs&}D`5uM>|qJ}GKD*ZXq|CMWhK{VJJPu5%!9OR70c)ztW(M7tM%=QOEolsawUF@~ zHS+Lb%s|iKIPCC;HemYez*Hbk|5;O>(M%lKi&VzR!?1~5`2rjBN^KDfnN(b``k8s- z5$?K5ZoAKIb$v%bH{DKRH6*6CyL>5K6S}{sF#gb9X9bY&|BbWefyZtoAh3Vhzm??M z-=9*oCiC{hB3eX}0)}QNCD4~C9aoMfb96k4r=GlT=eD&;CFF26bp1Q*H#M7Uc}#*i z_B$;sZtnJvX9Xv+CaGge2%LRpnTKCXi}8HUU^azh(zE^y4ECQlD-C-7|Jgg!$~P!^ z&Y&|9QQE51kU=vy2;k9XoJ(}0rLe?pMNFOqfSncODp2&u)hd;-oRDkH%Xc_ypIf)W zcS~={Dg49x(%I!03LoB@!xUVffa=a!7K4X6>EW3cY8|nvWc*#*)s1tqsul*BWai}+ znR{>_-+z*TExoYvh74K1Mzqw5#gwFcY2CNHG39ss2FUEX)L7){Zr{l?(3Ik7|rZw~E3!sf1lY2^fOu(WomKAAA}#uKZMe z?|_B)FCmlAMJif8@OG&9j-79;>D+wcp-REN%dMGDZ-Ae$3E4v@^UD^0px^L&GRuEL zx;>%k&%`Y&Z||5Wx{4<5+*_0t%+>@U$&iK@qTC9z=`X`j{4kK{s22(zbDK?wdwRm~ zcfk-?%aT2gB4X{}m*zjsq9%R<4jyXsCq7rBjHJ9?{UhTiwd9}l*+k*v=dzrN_X z`TQEZDMY|hvCibT%c;@dS8wV!#}my=8fxeFyuMd-?#R=brg_2W0-UJ(#)d17A(xg~W9@vrtBS@jU%}ulv%gQO70@rz+?#o9Yo3r<`l2FCt1CkBN6qO*OQd(Q88gl*!>=MGs( z%&FF_xw-4^Db22Ia#Qu(aosZ~_mBPC_0?I6UN0f_ANZpEV|{uj>D|v)3msz{aWT8M zf1XqH=nc-?{aVnX6J2M#E|F^LH1GKZbh6*&?6B=F^Dizhc$sor{qL5T0&1_(0V;Hg z>4LgBPpa%g$xh+fm}m8Cuqc9~_3Q=-Psx>`C@%fQ@WP8Lu0#DDpUb8Pvv7;g(Tqo+ zeHwes-CreZM(>r)`2FQY#}ykhtC`V5-Omm>KTuA~H686}wTnD8fA?$hM7QJPQ*j$k z*Hl%*bE%$1v4wA`N%O200YrXj?)|>nMZ(h~67-Q-yZRnBWQKh`Gtb0zPpq{06o&Li z#BUsNs5zv_${Dd@`VQKk+Uv2SOM;sk#$R{LS|1s_1EeHXFZOxiwtL5!q%*wr1YUbW zhw*dp-+PK9|LX<(r)x0wzqCKN#n3DR$yUf|Y{_MX&?Li)yxe-O z(&bt4aBltfzxBWU#%bae(uj=rI&$@Vb6+7{PF(KWe#gpu>xiLPUQ=+XC~FVN<@=1N zhPVsIPY2BW+TRVXd6Yr0^L;vSN$}tMe3*UtN6D3B8IeaO$Zrk1Bg1yKY>)KKXYD9BRsoy*{y_A;b-S}?aLyE z-KG6gYmRcZL>?u3CKlm6SI_3Yxpd-j^<+`JWEx^`5&hs~!YAIrfyd`3%NB_Ihh>M- zuB#;6Pm&dn&;KrQ@2MI_+eVI*RgHgMCyQ=ae`s>eebn>o+de~g(xSEfOY3&no@O$K zEbFEjar#=1nhD5xE^$fUGd2ba z%HviQWx6i5J+V!3g4^(|9?N@q^tj*P)!o1TdJt4hi3q9+qAlRow;F%{P5sxAzYfZx z|M$rM`@SvIi-wM&bb|4SQY#Ay=j>uB26?uA#!i8$LFhs%R8a_F(tE`+e&o54S~=Wq z#jS+a{^;{%E(~Ynx&CQEXxXYs8IG85B&U=HE`FN?G@N*HW>SAhB#Rm*?VW#g_HGv= zIJw48SlI~h?-rnL{o0iNcG1i1z2I43pXT&qhw!Y%@X%Ym>z`f%Pv{K?@%{cgdfjH} zZ_PXxBV}bP)m~={(ENd-1@TSS-bEbaGnw1vZ6vScO`Fetc(;^ErrP%DBF$zD%t}s+ z`nD-R8b)^H@%xx%7flH8Che(}1JB0p*e$U8Rl9^xh@7F*jwb#Qy>j2B&5coswR+d1 zH8ak?oc44e)TP=1q#pWbuE6{_4L&kEOAK z+SOU%1&p|M1+<3^FZWKatyZ?~_hTpZC&2`8CfapnLpfBimR}WqEQvmEdPs_tBdR=x zTXGouh0O7`E9)M4`KSHbZ=P_M8dQFKMAvcUpU}5=l5ehQE4DYU!~FgFG={{RJf1(g zE%EIg#u6#5UENMQ%;J!8Onx@h>D(4X^{IzLyKGz{5+tXVKTURES)Hq!cVq;M z?TV{-L8%iY&bi#{^D$0ade+?KayIY4%F09fyw4TxqvE}JA`kJAt(5i)twHLRGlGTlm1c5KVUZ4WgqUbC99ud?p`tOB|v*#;9v3Ga(wo7)p+2x zdFD7%BU>h8OgGrF&$Mpe;^Vg2`#PCsgQrg{<^4u0gTah-{hwZCL7MR7G=c=Gt5Wt(U>;o`wZ_wu5Or< zb!y=Vz5Fr3Q~WJsMOA3RiJo(lf#xQCh-xXY;@*Ia|LI=$l^DS>jHkH6m}p^0yLBr2 z{lJy=Daj^dW-5_3;la?CGlxZ`ccdC#;%c+MqQf~T{*CvsTL+nIXDvQGjXZC-^Ju`L zCG!nm7!QKWm1PBusjnQ}h9tm;wBcfV3(h4DYxoj?q{@98zo++w(kqV*sebRzTM8lk>h@PnMB#p(jM#Kswi53)SPs=N|8tAXeOwnauy1_v{4Mx+dB( z%Z{G>^5g2}7uRPGKm6djg!%G{{EYQc)$qj^P14cv=*~V5{c+ycb05sEjo)$NmE$N) z6@L%iow}Qc^0)o8?9sN0?62lEUq+tt5HpviCY=B9;Mmsv{kF@z23objc7JTz!QU)B zzx9n_u%@Hz-STtr_3bM}MSt0#QLumQ$#nk}6oeebyC-`M=xYRnw zJ|vJ4s{-I8CK-vs%8J7jR;;N7ENPV^3O_?m@AnvQFD_;+V*YU481v{jv^i6JUzGQ_ znia8dV)WA4C#QcnN!)gHv-0uID@C=Vmrgvr^m}Xp$4BRv*S>V ztaho>wD5+T=tq%YW9scL*J6QwDcy_U#{c>-uI5h4Xui+tax8(An0MPV@!<@;di9yN zI+$jz`)ZkZpWw6p$_Tb}>d$i6Ak~{cW5;#@!cQD~cIJ}}6^WfjmTSkt7o-r&HY@a2 zecYq#4*ZzC>y#)M70{Qfe!S@QM3SZ&Z5|lCc=M*Ix4&+YEE>F`+8sZ7{C#QQKF%*- zC(?am(|~UbcJTmGPI5|P3doMNZMk%o!Cs@k)t_MW@^#HTg+e$m&$!y0NI z7t;^8m}D;gbHQFH1T9_?Q5_BmMg)m+<-(4?I6uL@5_FEO{|` zYw6_;k4iS4O+58y@5jD+<7wm3^BYxz&3RPUnMY~K!2J@ufJP-Z-TwK_a3Qtn_w)MS zKjUrRj_F{yvZH^0Xo(1hEliMMo!iMsDt}C}D%drR38#iIG{tDAG(DFR8~$0i0`V!g z)im;yaId$P{ON?e)}xQP-}<9>F`7)PSMKMJkm1f_Baefq0q?m&1+N!b7G<}ZM ztD~s*h`cc|i^tFa&Gn=-F`qJzBYjeDagW(-98#wQ5#&kfDme3X zISG<&;Cz!5JFAFyyS?yc;q*^cnNvZ59+c3s;sqYQb*zK?qi^P)GMd>i{w5ngs)9N6 zcTsJE@BFUJ=;Z@hMoJRh;i(RF`AhT^WzoyK_koh!@! zl;N|vYeG%oqoQD+#vg1mPE%W zJC&%zvWs@!Fy|*5Ry5DevoTXcApg8ppGh{%jumg$m#QY_0|Lxvw@AodOjy`1NyH4} z=@{DCDbvUc<|>iNkXS%n5(S$cx5lztDZjWuC&fe^dRROpL zCB~!#chgi1vjg^_{*uLDQKmUKh8j3yKrxqvx*O4el~H3t8hN$5yq5V--vr5$$c=6) z0p!?_?XueJd>RvA(Lqyx2gF%SHfUD<^w#8{#Pk;&Q|J|{*q}da4|)EWv!fhIIAc$dA`a#?Lnmcv%qfy+l>I7x1r z2t+tegye*iLl#etDa@5fUqsc(e8!AoQ$TtVk?IzCJjKrGR~xMK*;MGSU-sxwI>Ir@ z_P{FW%J~raE|w#fQ1tOuS40SB4y9llMqr|9Y!3L=(Qf8x8+xQZ)bH`wJR`(G+`?D| z{N10x+H+$H(gYf9%I$Py+aBIm17MP~$rea1utIlt#zRBH(Zg76DP*^ljVvQZK|)?dO{t-`N(uPZW&^H#N;{()!8=e zVfs=D*R1Xn-XThAe(e}~_Gga*uXbS3DeVyDU}H;ukcjd`mE&hu??kH6n&&mD&BPP} zhdpR=t#$hB#uPNE)Yd{5IybO|f@3nIC^LPF&rlU9Dq#?5Mi2Hnl0upqfT2BNb7sA) zI?#UvP73ZTp7nKSu8*w)5~)F$aSW*CY1P(mCy-YD5R7DDpLQEpL!J4Fv?FuasImrz zg@fX6f zS?vCGVB?SoIXhSNI;(crbaT6A_lCC$orJh<7mq%m7TEPtaPA5SdK8+=YBU^Rsg>};q`8L=K-T45rSk*MhMFY9 zHY^biVyq3#oR_u-BI{f*vvq)j`jgQ*&MdUgd(O)2kr|8?0xsZIAuMwUdjal!pB7cE0D8Qi;p>cMld1ele?5NfgvRn52To&<@mtthSSWzBVi3_*I3h3{~=GwFv zj3R5R%?g#sfVbw>8qV6*Dw77W+ zNvGf!dV^-8Nv)2C!g*aVk&>W1jD27*%3`jmF%VTE>^VIyNBTkW6^5!#e4Kvk;>m!1joZ?&we(FPo6KnCA+dBNu@d!4+asF%z{Q6Za=O(tV`J*4grv7Bf=rb3y(;5z28^f!=n}A@3ew(yg0M6h4CbK1JvCq!a~T$F z%m5n)$v#6N5IZ;1Qn;gIooKcQfntJPLc(S)Vsf16uTK>#;33NGE<)s}0vD<$v~tl4 zxI0c?2hN@$)Wrac%nvQT0iUKrK4lYE36Yv!>_!N=uf)eO0Z>Kg7NhA9HlGPu*HI9Y zJxvd1FkzuV9`n?c+y>Yoz-T)YHSh*Tfq8i70gwxJClmJGFdq&35$!Q&8kf}zl(!)I(S!a}_QFA1uWAKRp+!Ta+V)TX^2p@yU z2tmFCvI=umLz(U zdfA6i+z1mNAVRfBh`s9%I5?yK(ybka(EnttKmn`PlRoPSRZO@u^oMs~^+J3Q7aWNtKC zR|ek%FU3$CtW{gy0Y=BT$OVwsNP&H-BYhC#*C;pGir`s}hj?5#fs6gY6^-jiKglF} zKgb+F_zZ}J%$l{+i1z`{(l)mKbZ+U;?rb(GnGKxN6PZ_ldM2qre^|{W)V+bt1P(=Z zAljyupn8=AQ!ygdV04O!TFE6%07f6gq@PTq?Gm6~NrdQTb^yUXAMVEl&$Cy;sSXa! z;Q41q1`fl(LDWJ3F`HaDbXW9FY4m`6MZWZkw}gDG5&KG<)oX`*Wx!7 zkjjMMBFn2GKqQ_ApHdxrB!<75hKo`nvK6FZJsy(Eu@qpKn(#$OdaESKPbsHCQ4W)nec0_=olMm%?0K9yjYbJfsA^` zHX3Id&2=@BNkBHR{#}h7gMo&ff@+lGQyX@wl2BKC30VNQ+ z*K`JNTF{T&nQH7SHtsnWe@{i|=b|ETu);CyQk4_gfYL#LdIfH?>I#?JNGJwps<1Ed zf0*hJ3-wMY5&C>zKFR=p0F?Wx;cE3ck`n#efWKOSeWS*(xtOn9qj42fag5%p!DSNC zEdzp~MhzJ7tJsC!9+Z2*_;x+|F+kd*!}oC!%SE883Nykj@|Ofx-NdH}|IvWp*|-dJ zV*{DAmkF=+CVz`f{Zm1_N+ynqup8Bg2nk|4fYSh^9x^so39(!-dU3@a|I<11wtbLb z*lf(-K=EcZ+W9&vMB(Abguk5P(IBzT?%1`CI>cK3#nQMA@+Xic1a_$LBWe<`F5!~N za^6YU9yYETz>AJvvNE75^|)#SW+79Bcz1NM2wELrrI2ArjVV!MyLz{)-0bMvSu_9yOmAq;?5VTwVU|$V)TAsKIEt3Vz53ZlQu|1ffEQ=^_)q zp7-1O|z5Ua4^f3QU0nlVt#T zI(Vf7Z{tk(Zp_J6cYjhXXGvCo#)yyjjd#>AS4q)bCE=i$*ssj~`6BOSFCqdG@+i?~ z^n?!*(%{Z6R!Sgb1-h*yepV4ebO=m@#;gEIQFdx{=*4+&&Hj|6fDRAO`T$d6bTGvvfYdJoZ9~>!(PE)2Ysl+`M z;v5aI<-agTLdl7zV2&ZAs|Ms+GNDZ|V?G7gDg5u*}7bAyGk zzYs29BWAO00u=Lo$PPcIA>i|`T>S;+Tqm6{0M9vqqXcOz0?zA*8Zl|kEhmbo><@|3 z#CSQ?7UrfTKG)%IO7QPQvZr-Kxe7><5FUtL*t4%Z5nk~!7;%;pL>Uijp*;vPT5rk>A~6Y~|IrQ@SIo#cquX5?GJ$?19ZuUYCgh4-uh9y~9?0 zbmMHKd_Q?T>AL(I=tVwvpGkI85W4|1Rn>4z@zRmF1=r7ieNL3xokgu%_31S%+H!j*FWZ%9gBJAcO!j%Xc z74C6NRkeKr6$MX^e|YhS%axal(aa?%723eYAEBdOahs=f#BmiqK{bXXC%>HQ9yJ2Y z6d@JB)&zFRrYXx!KkK(`HQ2WU@((+Ga4q)>;A6pCa5N;~}}*DP@&|Zb0r#W*b1o4LoFd zdbYLo&9RqnTV8(6L=>JvzZ2tQ6flL3R6@=&Q^WS90e6KQ>|dCts(N#OL>olC7Q$+{ zMyGVJbOW(TqzF?H?>Y4F{YZ zt|(xhppzIkpu=J%FfIv|$iNy2kr&9gSP>wFgh@gq}%kwru&OcYBx-ftykTz^6sl=aKBF3jP&l z+06N-vw`ZwP!t(es!N|IvCUPO<8W@W+|w;IBa6ukTfe?(xidF3)cYU`EvZiLAzb)V z3G3z*Smcb5Riekf{)@?&@96NAXNk(Ojvuo4s#C^+nSNfM|7tI?;y2+Qe;NvLPg@0! zXxm)!OL+TSqVjr3(WPKbH?~?bJP2XJv80Bb<-|3@5iD~cdWRPgpwMW#$|hL zt!SUhHumZq?7WHcT@(pz%as3urS-B0jmwSLMFF*U zHuZlbwA=58POJMqb8C&02kbp;QSqs^gWX)0h{io%j#T5ESI91j$>;HAV&yJDX5KBQCV)k#5^meoepGsPm4 z-dbgLrT9lI*J$e=ibx)w>0*aX&=&{691=ez$T20;oGA|C`ZtHYPUi8^R21gqppjzqChsTr9n3hdX5^85m~4-*$&|SLBhY?n}1k z9`cdUyB0)*M0Xj8t8@u+7 zaU?SCEe~Q-%styy%FyZ8GPYE%53vxOW)C6*&Q-M?UHeh5EJ&?{*-P;%Kn^t zG+AGaBqGuxa*Hj4n0t@TN#NMQ*A475C7Is?ULQ#tpVn5nya>=bY`RGasrO=r)>Ldf z5;6C9vUP&$d zSw#^)JUiE7w}>*76Mhr+#wIPJ;w#c&ndX*7W?4sdj(6tLkS*)|_kn@FmU8{a&G)9| zZm};fm%>ADes4RvVh^g>OnhYhYnvVX@926PSw)-WW;?7F?HY7vE+akT`x|IIVJ9BD z{YVj?6PEGyu4RgY-{8K*T~%?6C4c1EWk1ls&Ws1hxZ#? z9T2#8rxdMM4BPC5X72ku2w0P@TG6l&xq0xrzDF1;vqWDR|tP)q5jWiuO< z@egXz_5j5wg|m0nynAT>miqmlJ^zpGzh^;X&D1>y9=lAEozwCr^}sXXe-wYSzw+Sp?f z&$n(rJ3EWcz688tYC0M;%anIsVOcGm8pWvCCW3`&M zpON|{tfrk*WLusTAw#(xaBC65=^>=vtkI*hIj0;Obr%=y2o9Yxz@3z4x7{H{gHI+* zIai7eW1fUqcoG-^>hvsDjuU2N${c=4JePfq$GeP4Oq@LO7nKf?{vVFcJ)X(_|Kr!r z2Q$Mk44dPeN6yC$F(o0VN}98znn)_ub?rowB)KJZZ%8_;RFb-{AxY9IolhGomAZAj zRcgO|fB)@|ogR;Uu4|vq`~7}BpW%K8h5;96S_qT-(u8|>s)~5H&v5z}(l!!7jPF1i zH?Z#F|9IeIS?y#^oPs!0yJInDuqj1brCP9QII$fd?AN+^J@rRi9#Kd(w<4_SYf;n@ zu0ejso8ZTXeG*nNup-*EP>Oz4;1nO*HL{AOl!@)fKopNQ5E{a)3MZYb|GUhN(E?(w zyS95+#=T)B%5U1It<{>r+MQfHq?AU6?tb<)t<5=F7gSrd@~>Hdd^Em3<6!$tghfw3 z+OS&HcCHp}(xOD{@JXaL%pwh?05+B`))(gVY4B%%>cwF* z{r)RJY0RVoTRb(*YBrTv7tS->^}*g=S&Nb#>)Ssc?jz-@Ab-yJvy1Y>m}`=32|R`A zGaAaq!9UyDpa1(kX~u$L9;Ar%y<+|`Z_&%1^7T_lU`BPxkeVdABbV)DBfRQi_9_vBUIyFQTKuEfkeZyT?YnHsL4vK23G zT`hU-_57U)umFleW=?qyV#g&wQF+jeb)H;GUGnW@X2Q@Ofty#Ido zU;d4t{fLm<-i?~&Gu3%pvqoLpG^Q_{*XLbn4t@DyYsG@mmA;q9mVexI*ZHOTNi z(^lHu%TGxIeidG4nWS)v;$KeZ_X*bDH+(W)eD0N8`Rc6s@$vRS=icpzTRPEO;+LlX zl>U9?yUo>C=R(cuE(2q|%M?8>n}u4!mz}EWyUk@n8%!M8=Wx&H%v0NIl>uD~uh>21 z+(9XhB{bOHbUEpVyxl6dE;3{~8Z0vFxwky%Phbc^Y;kMFY$4Ah$p&CEjDgNQfIea8aew@do0)B4^Y56f5;MlTOF_3pqBEZN6VQZYM$+ z%>!Mn`$kp)m{hMI`aX8a6@~de-x8zH>Ii+UAf1o2l7ZNKfWIn~+6g$Hjj&RBf_o#D zH?uFUjI~!xjsh6Kll=p_s+quY=#QTyBvxkCQa>hC=b5&pUS%5s`@Xdy2RT#K^ENJrx zg3yUtN|7!Vpsd))?bBQf8S{jBkP#2^n$Wu{3O#rH`qHlh^41%-4@5Cpb;Ma{F)YdG zL_6gRjo_w40PO@I*&;(5t}uE?>;nqw{pVc%@(judvwC$AiyBbpsUXd6d5`H1>6 zH}{nw@Q-*pFl3+KN9pd2?iRYrpt$I0yVYUvz5bWKY#AqFe2VFIPp<_}j*O1QY?-{S zq~5w?8@T;zP*m@Hs642{h4&$l*LN>i(si?V0wi}xBFX?$zXs}*Fs4$njE&J~$BWI% zkg=VTW%-yDwUWR}p%YD#+9_E&C8pOxdq=|Umo)5)Kqhg}KcVR7dv7>-@rJVlsk2ur z_Dcd`TiGV@B07p`_OHhXuN%Zpv|=hi6K>w0T>TTHvV)@!1eab`FQnB^?A^Sg+d ztuRl$$zUHdP8B{#ApPlp$lU;00N_{%dabM07Ne62P+-U|Rj8R=52ApJ_DKyW3@UC& z%I8P|J8hj|%mxl_T`l$*7vVJ|S<{F+MyLp)Al=IKw_hu0D~!Xf=8K&vD8nfr7?dt&L64ip ztiFv{9**C);qk4K$Bnn*8+V1&^v#Bv(z>z6q+(Mzm;e>%0E=#Iz^v$NbM;@C z!jmKjP$s-*DS`^kppo|CH0d|GYj+c&3m-kR^`V^#d{Kx=^%Jk0s~GW?Y*((J;*sV< z;-p8?^#aNEGBI-&=dATzZV;9&f_!Ju2`cm|fpp7noH_5dSUM#>Y>9!p7 zdolTHW!Wojo#ru5h2*z}Nq;-?<8YixM4Aj2eC&~#*FJBjikJ>4npKgRFLGuqaUPNg z1i~}6>HDw5|MF7rTXdP4n^BVe_}9Q=T7#OHc7w`CB(QKrL)biR@wD;5cBS-MrNn0z zr^}J{u>r?g+zJ_rg$LsDajSXKLQcifA&>-%v>&>T_D>K8x^NULP+|qM7+(R>0npLR zQ0h>CWUUIll!Ljn0WdF4U@+v!9LFY=A*r*7G!{;K8Rkx*Jp@1)V3j*1efk4u_h?T654X8fDwsh#4Iz9O zSiulZYl^fN18lssc&M?gY^8OjTcVrpwOWK%qjaMRt67&?!Our|%;F64S?iJ|?vytv z6kMWInm`eixfmGE06{cdhBhd`Ms4oKxPd{Z;edrXh+LjDFcs7a8dh_fs;dz6NVGL9 zRIXOHo{DIz39Vz9*E83BTXsjg?SDW03TXUlQ@2 z2>DaM4;j!U*Dr``ai$yNqyc;+moIkj29tQWrDa0y6t-Xrg`|mVFerAJ_O_H~lnUVS z*t|xN;Ad=K2_PC#0uIJ=2w|`7#+XWs0Lfi_!L|O4fM>HYKrj^ z$3}?S0V3ih=B#&DmlPP6zVolR^4H;|0eW}y+unuz_a!>hy}=We-64$_5-~dgQzCkk z07I!nx-)R$Qh<-I@a6-KoQjK5A+iI#sT-5L2Vu$rIh2Y_So;7;*D@7B^u{Sn%n*99 zU#pz}`Mynlm?>TBSCL8)d*Hu0@g(cxDsp*}(0rlw(kG$V52m!qyQe_CA?zAf=zFh* zm7dyJ9{WFWkpB&I{OplIeIZea+)%dKqY)7jD_RXp9Qf!p9TFDjN-24!B@Ib;&@WQs$ zgY{oBqai0AIu<v@!6il@*>hL~vp5^0j+ zO0@Niqb&ownq%6$W3TonElw@!+y%WohC;HxyfyY*O4*0uhzjztI$G}JEH*J!gv{T> zWg)F*_u=`7>~3sg0XogEP)F%|EJ%1UU%WwiqeOr%DU-VWy`{4elK5bGotS?eC5}S~ zS_crusz`1`?#^2f_+}(vyQjl}rR@!K!;@cvcfSk$Z|?SyeJ*8?NhP$X!*aC};|D{! zap+AHN!K3Xnpp!~09%;4+EK9j{A7uygfH2VinL(?gQq0~)+4(P0634^AfpRZ*cEeszb$L zmM#?@{wCSL`|H#fV$sIco&ers-k((p-F@mX}?Y{}@|eWvcU zv~yVW&>q;#lVny=MXJ`2{r`Gi6n8Cko>$tRE5Gu7c;dbC7khmQtGVBV>{VVeUG76T zx6xbywHgy6YU`pJ5*d5)54tSwnwBm9emZ)Z?jQM1sh@eRtze?w`%7}c0y52rb)knT zjl6p}%w_ezAAbjy)jjLqYhv~1^FLo+J^U-`-#_dB`|tCcd#BfFLjKJC{O`-Z|7t?P zA6ttCLYW(sT$BBjFQfC8@YvCT?adU4=}XeN!O&iDxKyi&Id{`^IW=yF-{}vX0|pp$ zLcGrQ8!AY*x!NWgi6_l)P%LQ|RX2bRC>&)}RII}iu|S1Hppmy-T)p;iNtdd_D>!bc z-xua5z+bfUmeU;vbu>H~gf{U6B+m_#WS=m^$P&9m|C3!s5`Aum3ba-}x;rv&YctHX zc|Me>?OV%i7UK4v*vmuek=Pub zVIe+=jfycRumm>bg_v9+p|tkPLLEdt^R{~yUoIqikHH`Gy+;_}|ET)aetTjN;Y1_9 zmKv5Oq7bs!;&JoD^RjtI^5&JlyVYB~?ImV*o|3B*>~&{8Dp-5dVZ=*xktO=o{v{Ct zQ=`Q$b!3;-`7>4iTdAG6;PYLG`3UXs{0>Z@A0k5g&$w5Y;Tea(8K_E^kWA>Lc%0d} ztxNBc^5?(-r`qoEXSzxCkXSbq?90|!TFaNzOHUv~I){GWy{>m$iPAAyG%ey2M|NhcZ>{;Y~y2Hvt!gfM2oM$i2s|BvsfaX;#rgEQQK1EV4*_9vh!4(VPu5X-Qw1{3=|HeoA-9&njdN_cui9u&@ z>^^j_my$-Kkb0^X^TP}wwNk$(3cg0aI2*NMFoR&t&Tt>-9DLGaB*vpTdMXZv8pjq9 zC&TD<0+`Wrr`l~5GI(VtiP*!}%^HFUKfI8HQ-{iM59=CY zKa6oG&ma{A^{;GZM7k`4bk;OZQ0TLL*6BsNHqB)kuVf2NhnO`hyjm@9vvyG;Qw(I) z*(DtR7D`VG!rTjGCZ~wMifcv4=03|;Wdk?FzBQ#|nba5XplSNd?&P*s6Cq{3Pi{OT z{WIQ9H8b$dT2)y%h9ot|RRpc|6#D0fo44}@v{#3Ol@FqaJFxbuXpF3Kuk9qsA^hSw z<(>|JFiaU^NYzAN5Trb*9CW{bW~Vouu?$(MV0}zLZ+bH39_trIOarh%)tMIOI|r<~ zRbb?a&xV7KD!hIwg>FM{kog^vo`0-yTkmVeXcM*bV^MK}kuC+iL`Eh7Jy06hd{(j%CaihLUTtJwym?t zT|R7DFMaZ%`%LI3f^A`z^V7$JrM0Y1Wb!zoCb3pc6x%|sV|U1Ta}a)!l0(Xr*OaKN z>9QqAG($~_Zieei7eH8iyzWLgizZ<86(t~Q%If<~_f+;7EE|R*C|MR?1lK*@DTOvu z2--w2&h3v?-W;r)jQ96eKU8YJKg)-l!d`qVok%OpM8r6V{MJuSZSpRG+EgR}lAt zUtQXTGOv&!qaD)JI>mAYsZHJhd76S%P1X12?cXR?c2xMq?HBIwrgs&P$bJ!@a z1!u5MHfkf62c9M^6u^g?W$|HV(Dj+X34hrOZ>EG@o-%g@@VRHI_s#c@Q(zb_YO5TT zB=ArCE?z315D$3To>Ekq(;)&W{e$^L<#h0|(#L*J_0Fww{;+DvM(8bEZ1$OzZo!k7!cKU&k}PMSxhC>H=}hh}1QYG(;)8>br)hy7TcF{oG-+Ne$2 zGoe&CEa;S&0q@Mt@xZ~HPV_i>&Wc*Ah`D?YMV>3i>5Ou5#*7(5%Ckp-U>S*t>w}~xejB(_3NWW*vXVd(rNLPVHoMzJQKjex?oC)n> zP7S+`I+S3V2O>|5PZS39ROB65wC3F7FPj7Z;DR1p4gOecwLI+-5D2|pK$)D6y6MNf z5~zeu6m*K{*?+8teRHHyNb0Uzmz*KT(dM0~@)Oq^vD#yyGyg4m`oBY14wLd@$-4di zzYe)@Y5rRloI>rApyxYvD#ANH;pkp+?D8vvuBq_2mIj*0%(Na!GSaPMikPmEEly9Ykxk<{`0GwrD+IE8 z)=rsJvfTMtCOI`SrQ`1{K<1ZSu};I|fAwB>TFZ!b`J2RE`ToY(>LL~8l-l<79anOO zX;ZRqU%cO4l37ERop8dp%4U15+I+AzXmq07MPqH{3FWl$@df&pA6o;z%Nd?FRO1QX z8XSYzN*|xNB}Us8Sok|#3#hrru8a66;NVzX!)}7kT>v*$`}l3E+aXy%?u1vE+A&?q zxZ1+)YxD`T^;=-==2q_}l?PuCRc4xB^du$i4ZKZ|fI4wB5U0@e1%}FiYd2#wW{SYH=ME&*EuolAI z&wR;P`!_G7EeD3@9>WGKb@L^FRE@4m9VB*uD@Ik#8P&#jWGMlYaUq9k$Xl5W%Pd~O zR4zB!uTmP?Q!nJ+>1ba)*nWOb z4)yi*rGw+|S(D2GMBdGc<%eWx z#x;Bb69tg5|HQ&lhULiyr8tV+^dN7&I?>ZSwa+r|g6)>lcGJyS3#;0bl3(Yh+Xsxl ziEFoC{SH?+Y!70Gwqsck)}U5bLDE)_#%!oz{M~aeFzo z^tb8DxXkNE)m(N*Gk+#5cv=+P-LIYCqND zn%$4iC-%Z57G!V&Bz&E}f0pxGkpH%Afg#vY%E!^r{eh1}K`tUa0Kx*{fgMN(R`?-> zf&fAmyVx|o?AIjPrV1Em=FY|d@XXe=9_H^&&T+1AbRcG@W zPB|UF;1ui$nNg8?Y!H_Shr(c3PgF`Hh|-!#M*4%|!Yx&RadVSZT6l2TJtm*T&KG$O zga-}vz4drts}=aD22H34<3eV1D$_Maq1hbI4itl;AaX#P@_x5k z4Z?7i(^jR$+5zK-zJLgn4ZhEnAEsT69=+i{147?{ zaEELN^=LkOmg_nsa?=9ZN8rT`5x9DU*G!ltK0Linf}TMJHbZC{=-$=Oq$&;$ymu8F ze^(0qQu`2vpz{FArHgZrovK*i_+Edy-+FpgpX;_l`~C+f{hv4_w>#A*yS)5<@+EQ6 z^dms8Lt#gC(~Hoqpn@B(faTdJ?Hm(=A@u7OVoJDfoyYa#5GDeJm#abd%m9k>_W0x!n$v3-9JRH+ZH+fQhIu}#(mpB4Xzxc+ZQ^okzx9lZ6`hANFSqcCVX`;QTyw+Kh2(yw9Cj z4!DD^*nCI>7l{D53dTEwuS|HMPF2P>IXhmd?p=D_B?yoL4Vz6 z)6M^Wb@O0Vd>-)R{xtq**P+0%In?fdo!@cD<$!BF%7y_DK>#Cwb?Olwvhe*b3W7F= z(gCbHOQ4GORiq;=KkEJtdkGWTPZD|wpF6q8Tn#jEVI&X$eObNILT>uB++9iCcbena0oyH15V zIbULb>eSg=RoUUDEWl<8=|V^jnnjwyfHO}x*!;<`1fX#SOwu^c-Qg|_h}9A9p;R2F zyGEnQ4x~PFbiYGazk8)36hH-bAt*EBpML|i+CD#eKhtk<+cA;T6y%}m_ZR}(rcZ`$ zTt`{AesjL3-S%U+zBjgCzP!7?$KlO6&UWwAi}sGK>qrq?ysek>JZr<|C$`!B0UhE0 z62tVhrjcr-UzaFA^`1BedXu+6r zpGBO4+{`iJ_}V;E81Qm8QXFWcK9*OwZT(_`85?sTpzTQ+pl^WQux=A zo@4*rS=l@sI<4{$n(sey$*SQ}(?6Sv`p2bBj8mc$6oKvL=Dk~p3d0thxM#wtA**eo z9rwAeC2zvd({4fCrdYFp&AgwT;g6@r)SJIMl&juA;oTtlS5}Sv-qo*@gqK%sdvodd zyZ0wG0ln9M-KIuS-Yuq@F?0v!QIvsrto1)uZ4_z+`gJS$QBIMURVhz4mk~vw$LG2Q z=|0j+_=-<^y}1Z)dli?-8@lB9_#pgH9qPi`+Gb~XfZNz=pysR! z_?6w}xh>Z(#(!jK%Niib4nXH3p; zh9&F`-0#QU&bV^vnmI1QLK{Z8yi__?99#&WX1W1b7EGw!a#X+W-rrz0dF7*u-{>|v zHCgiPVDQ}V^U<5ZE-k==BhAkV+n)Qv<*u*(dfiSef!ug~*)e~s+_&<|uOJ2Huk|$s zn6#@H@HweN=vgvs<1_yk29W;SY-6-aQPlKNlQ? zkmo?-6=y$kO!uf4xnx~ikn`!xOw=*{jl}cN*%r~fb@{Ssz`#~hNx&C}5cftL=21;7 z>Xc3nqz6{yoL>LSYTKdEzdS#^zJK|zbu0hbj=&iQH3~BNEA$H3aSd ztfnb?Rymve``F6f^8|qUD~9g7a6TjE?t@!T14=tvSa)P^nl2YU*!H{CBWv`0!Jsnu zvf(R^)5fQ5MaxSoQB~0oJuf=rbZ%BVG+#J+`QrPk70j24?JuFesx#XM7tC`SXD*rd zpK|KPIk9NRp2u%K|LzN$z}UWoPwud-BKNS{4`g?#+YL=)@ofjnn$FmpCRTPYJZ-VQ zTZTYvW<@o4bZRrh#`%w0X@{Nqp!WKsyq7{itCFa53U^4$cAaFY8qjoVL3kR zTJEVLd-I~08_1nxtP8M#|@WzBlGTz=n!Iq zZrG61XEI*xKrLGuwa*l3`lit*oib3*9g(3eic~CX!X1O6iJgJ<+K9u-2N?sHiB!{Y zF!9v>HoV)QEUdzGZZ^Btw{zYRJv%8s%OLjdr5s(;QvAPx3~)#WCf+T2CE;9se6EtI zoDyOJJLT;=>|T$c_tpoo$~#~bEz41n@WF-0|^hJG17=(Li;ZBSuoOs+%cO; zvb#{d!&xsTA8oQMR!g5f7zBa_xli;R>da{!CJn?#8bM^UXRb16yxt2dib+Bb!?mt`4c-__4+TnTK_G0RT#k8B94%5Qn@RW!Qv&B09{ zAHVqsj3NWZ7ywRry$W%gP1PyyAD6VtDJk9L!wfcEg9oiE@ z^;-b48ugdfEWC%vHA(&mBd`_$0#KwAA;TPsni9zXpJiK2l7M{N)U&;uu6 zrmJ9Z{y_X;v`ZK#bKffaOP`3kg_V)!w%D?X=EC5($OFCrsGzMQJ3_lx_3pW5#I5B2 zXV=@kV3GNn+Q-F=~FOt zzw5R4nf;5_tSxq@1oe^PIxE(ZT6HnJFrO-YoejOhYW^64xS69##P&Z+`Bo%2?Tw9qu z6lT0#CPZuoV>g`LYrzk?$vEXvZ9WAO3OSK3aV@YhJrpOwaVt?aGzQ@U z>$=MY?b6~Pmm9JG+SnZ(!;wzuDOgV48HXkd7(gf=JCF29@3gJjXsQuIJ$n{qbb>?H z2=gt2w4xL`Wos9ZLG;rvvD{!j~@ImRI+WN7r3RrhHzhgc_G9wTX1 zZuF@GW0J{U8B=YoU;JT!8Y>Wz(?G=W+9(HsOzhN~S*Gqrk@zzM`DUJj@M1l zs-NG`q|8`0>i>7f6zRqtfc8Y%Vm4BS36e6eW@k_6m`_N2KdZo0u-{n3#`x7|R66o5 znDw(1zIa>F&60 z(lZs&s6+b?5-%h&E}De1`u&9n(RnD#bZw;@F+C2n(iY*RsUp;gnX0v&<7huvxG