#!/usr/bin/env python3 # SPDX-License-Identifier: Apache-2.0 # © 2026 Lutar, Stephen P. — SZL Holdings · ORCID 0009-0001-0110-4173 · Doctrine v11 LOCKED # Signed-off-by: Stephen Lutar """brain/harvest_vault.py — the vault that writes itself. Harvests the LIVE a11oy estate into a dated, YAML-frontmatter, backlinked markdown knowledge vault under brain/vault/. This is the SZL "Self-Writing Vault": one command turns the real estate (frontier surfaces, PURIQ formulas incl. the locked-8, active org repos, topic clusters) plus the workspace knowledge docs into Obsidian-style notes wired as a neural-net brain. SZL adaptation of the leaked "8 rules" (see brain/README.md): 1. one capture inbox -> workspace docs land in vault/inbox/ 2. auto-file by topic -> notes filed under vault/{formulas,surfaces,repos,topics}/ 3. morning digest -> vault/digest/.md, regenerated each run 4. session-aware context -> every note carries the harvest date + provenance 5. backlinks -> notes cross-link with [[wikilinks]] 6. graph-is-the-pulse -> vault/index.md mirrors the /brain/graph counts HONESTY (Doctrine v11): * Every note traces to a REAL source (a module, an endpoint, a file on disk). * Counts are the ACTUAL harvested totals (NOT the leaked 8,893). * Λ (F23) = Conjecture 1, never a theorem. Locked-8 flagged, adds nothing. * Nothing is signed here — a harvest is a read, and receipts belong on writes. USAGE python3 brain/harvest_vault.py # harvest into brain/vault/ python3 brain/harvest_vault.py --check # harvest to a temp dir; print counts # optional workspace-doc capture (best-effort; skipped if absent): # SZL_KNOWLEDGE_DIRS=/path/a:/path/b python3 brain/harvest_vault.py """ import argparse import datetime import os import pathlib import sys import tempfile # brain/ lives one level under the repo root; the graph module is at the root. _BRAIN_DIR = pathlib.Path(__file__).resolve().parent _REPO_ROOT = _BRAIN_DIR.parent if str(_REPO_ROOT) not in sys.path: sys.path.insert(0, str(_REPO_ROOT)) import a11oy_brain_graph as brain_graph # noqa: E402 # Default workspace knowledge-doc roots (the "capture inbox" sources). These live # OUTSIDE the repo and are read best-effort — absent -> skipped, never fabricated. _DEFAULT_KNOWLEDGE_DIRS = [ "/home/user/workspace/research", "/home/user/workspace/audit", ] def _today() -> str: return datetime.date.today().isoformat() def _slug(text: str) -> str: keep = [c.lower() if c.isalnum() else "-" for c in text] s = "".join(keep) while "--" in s: s = s.replace("--", "-") return s.strip("-") or "note" def _frontmatter(title: str, kind: str, date: str, tags, links, extra=None) -> str: lines = ["---", f"title: {title}", f"kind: {kind}", f"harvested: {date}", "source: a11oy self-writing vault (brain/harvest_vault.py)", f"tags: [{', '.join(tags)}]"] for k, v in (extra or {}).items(): lines.append(f"{k}: {v}") lines.append("backlinks:") for lk in links: lines.append(f" - \"[[{lk}]]\"") lines.append("---") return "\n".join(lines) + "\n" def _write(path: pathlib.Path, text: str) -> None: path.parent.mkdir(parents=True, exist_ok=True) path.write_text(text, encoding="utf-8") def _capture_knowledge_docs(dirs) -> list: """Best-effort read of workspace knowledge docs (the capture inbox). Returns [(name, topic_guess, rel_dir)]; never fabricates — absent dir skipped.""" out = [] for d in dirs: root = pathlib.Path(d) if not root.is_dir(): continue for p in sorted(root.rglob("*.md")): topic = "research" if "research" in str(p) else \ ("audit" if "audit" in str(p) else "knowledge") out.append((p.name, topic, root.name)) return out def harvest(vault_dir: pathlib.Path, knowledge_dirs=None, ns: str = "a11oy") -> dict: """Run one full harvest. Writes the vault; returns a summary dict.""" date = _today() g = brain_graph.build_brain_graph(ns) knowledge_dirs = knowledge_dirs if knowledge_dirs is not None else _DEFAULT_KNOWLEDGE_DIRS docs = _capture_knowledge_docs(knowledge_dirs) nodes = g["nodes"] by_id = {n["id"]: n for n in nodes} # adjacency for backlinks adj = {n["id"]: set() for n in nodes} for lk in g["links"]: adj[lk["source"]].add(lk["target"]) adj[lk["target"]].add(lk["source"]) def note_name(nid: str) -> str: n = by_id[nid] kind = n["kind"] if kind == "formula": return f"formula-{n['formula_id']}" if kind == "surface": return f"surface-{_slug(nid.split(':', 1)[1])}" if kind == "repo": return f"repo-{_slug(n['title'])}" if kind == "topic": return f"topic-{_slug(n['title'])}" if kind == "endpoint": return f"endpoint-{_slug(n['path'])}" return _slug(nid) written = 0 # ---- formulas (auto-filed) ------------------------------------------- # for n in nodes: if n["kind"] != "formula": continue fid = n["formula_id"] back = [note_name(t) for t in sorted(adj[n["id"]]) if t in by_id] extra = {"formula_id": fid, "proof_status": n["proof_status"], "locked": str(n["locked"]).lower()} if n.get("conjecture"): extra["conjecture"] = n["conjecture"] fm = _frontmatter(n["title"], "formula", date, ["formula", "puriq", n["organ"].replace("/", "-")], back, extra) body = [f"# {fid} — {n['title']}", "", f"- **Organ:** {n['organ']}", f"- **Primitive:** {n['primitive']}", f"- **Proof status:** `{n['proof_status']}`", f"- **Locked-8:** {'YES — flagged; adds nothing (locked_count_eight)' if n['locked'] else 'no'}"] if fid == "F23": body.append("- **Λ:** Conjecture 1 — NEVER a theorem.") body += ["", "Harvested from `szl_puriq_formulas.FORMULA_META` via " f"`/api/{ns}/v1/brain/graph`.", ""] if back: body.append("## Backlinks") body += [f"- [[{b}]]" for b in back] _write(vault_dir / "formulas" / f"formula-{fid}.md", fm + "\n" + "\n".join(body) + "\n") written += 1 # ---- surfaces (auto-filed) ------------------------------------------- # for n in nodes: if n["kind"] != "surface": continue back = [note_name(t) for t in sorted(adj[n["id"]]) if t in by_id] fm = _frontmatter(n["title"], "surface", date, ["surface", "frontier"], back, {"honesty_label": n["label"], "present": str(n["present"]).lower()}) body = [f"# {n['title']}", "", f"- **Honesty label:** `{n['label']}` (verbatim from surface source)", f"- **Asset:** `{n.get('asset')}`", "", f"Harvested from the frontier surfaces manifest " f"(`/api/{ns}/v1/frontier/surfaces`).", ""] if back: body.append("## Backlinks") body += [f"- [[{b}]]" for b in back] _write(vault_dir / "surfaces" / f"{note_name(n['id'])}.md", fm + "\n" + "\n".join(body) + "\n") written += 1 # ---- repos (auto-filed) ---------------------------------------------- # for n in nodes: if n["kind"] != "repo": continue back = [note_name(t) for t in sorted(adj[n["id"]]) if t in by_id] fm = _frontmatter(n["title"], "repo", date, ["repo", "org"], back, {"org": n["org"]}) body = [f"# {n['org']}/{n['title']}", "", f"- Active (non-archived) org repo, snapshot " f"{brain_graph.ORG_REPOS_SNAPSHOT['captured']}.", ""] if back: body.append("## Backlinks") body += [f"- [[{b}]]" for b in back] _write(vault_dir / "repos" / f"{note_name(n['id'])}.md", fm + "\n" + "\n".join(body) + "\n") written += 1 # ---- topics (auto-filed) --------------------------------------------- # for n in nodes: if n["kind"] != "topic": continue back = [note_name(t) for t in sorted(adj[n["id"]]) if t in by_id] fm = _frontmatter(n["title"], "topic", date, ["topic", "organ"], back) body = [f"# Topic — {n['title']}", "", "Topic cluster derived from the distinct formula organs " "(`FORMULA_META.organ`).", ""] if back: body.append("## Backlinks") body += [f"- [[{b}]]" for b in back] _write(vault_dir / "topics" / f"{note_name(n['id'])}.md", fm + "\n" + "\n".join(body) + "\n") written += 1 # ---- capture inbox: workspace knowledge docs -------------------------- # inbox = [f"# Capture inbox — workspace knowledge docs", "", f"Auto-filed {date}. {len(docs)} doc(s) captured from the workspace " "knowledge roots (read-only; content stays in place, the vault keeps a " "backlinked pointer).", ""] if docs: for name, topic, root in docs: inbox.append(f"- `{root}/{name}` — topic: {topic} (see [[topic-{_slug(topic)}]])") else: inbox.append("- (no workspace knowledge roots present in this environment — " "skipped honestly, nothing fabricated)") _write(vault_dir / "inbox" / "knowledge-docs.md", "\n".join(inbox) + "\n") # ---- morning digest --------------------------------------------------- # s = g["summary"] digest = [f"# Morning digest — {date}", "", "Regenerated each harvest. The pulse of the estate brain.", "", "## Pulse (graph-is-the-pulse)", f"- **Nodes:** {g['node_count']} · **Links:** {g['link_count']}", f"- By kind: {s['by_kind']}", f"- By layer: {s['by_layer']}", f"- Locked-8 flagged: {s['locked_flagged']} (Λ = Conjecture 1)", "", "## Real sources harvested", f"- Frontier surfaces: {g['sources']['surfaces']['count']} " f"(`{g['sources']['surfaces']['endpoint']}`)", f"- PURIQ formulas: {g['sources']['formulas']['count']} " f"(`{g['sources']['formulas']['endpoint']}`)", f"- Active org repos: {g['sources']['repos']['count']} " f"(snapshot {g['sources']['repos']['captured']})", f"- Topic clusters: {g['sources']['topics']['count']}", f"- Workspace docs captured: {len(docs)}", "", "See [[index]] for the full pulse and [[knowledge-docs]] for the inbox.", ""] _write(vault_dir / "digest" / f"{date}.md", "\n".join(digest) + "\n") # ---- index (the pulse mirror) ---------------------------------------- # idx = [f"# a11oy self-writing brain vault", "", f"Harvested {date} — canonical domain **{brain_graph.CANONICAL_DOMAIN}**.", "Top label: **MODELED** (a derived view over the real estate).", "", "## Pulse", f"- Nodes: **{g['node_count']}** · Links: **{g['link_count']}**", f"- By kind: {s['by_kind']}", f"- Live view: `/api/{ns}/v1/brain/graph`", "", "## Sections", "- [[knowledge-docs]] — capture inbox", f"- `formulas/` — {s['by_kind'].get('formula', 0)} notes", f"- `surfaces/` — {s['by_kind'].get('surface', 0)} notes", f"- `repos/` — {s['by_kind'].get('repo', 0)} notes", f"- `topics/` — {s['by_kind'].get('topic', 0)} notes", f"- `digest/{date}.md` — morning digest", "", "## Doctrine", "- Λ = Conjecture 1 (never a theorem). Locked-8 exactly 8, flagged, adds nothing.", "- Counts are the ACTUAL harvested totals — NOT the leaked 8,893.", ""] _write(vault_dir / "index.md", "\n".join(idx) + "\n") return {"date": date, "vault": str(vault_dir), "notes_written": written + 3, "node_count": g["node_count"], "link_count": g["link_count"], "by_kind": s["by_kind"], "docs_captured": len(docs)} def main() -> int: ap = argparse.ArgumentParser(description="a11oy self-writing vault harvester") ap.add_argument("--check", action="store_true", help="harvest into a temp dir and print counts (no vault write)") ap.add_argument("--vault", default=str(_BRAIN_DIR / "vault"), help="vault output dir (default: brain/vault)") args = ap.parse_args() env_dirs = os.environ.get("SZL_KNOWLEDGE_DIRS") kdirs = env_dirs.split(":") if env_dirs else None if args.check: with tempfile.TemporaryDirectory() as td: r = harvest(pathlib.Path(td), knowledge_dirs=kdirs) else: r = harvest(pathlib.Path(args.vault), knowledge_dirs=kdirs) print(f"[harvest_vault] {r['date']} — {r['node_count']} nodes / " f"{r['link_count']} links; wrote {r['notes_written']} note groups to " f"{r['vault']}; {r['docs_captured']} workspace docs captured.") print(f"[harvest_vault] by_kind={r['by_kind']}") return 0 if __name__ == "__main__": raise SystemExit(main())