diff --git a/.terraphim/README.md b/.terraphim/README.md index b6b56f95e..847d88270 100644 --- a/.terraphim/README.md +++ b/.terraphim/README.md @@ -89,3 +89,30 @@ When adding new concepts: 2. Include synonyms using the `synonyms::` directive 3. Regenerate the thesaurus JSON 4. Test with `terraphim-grep --role {role} --answer "your query"` + + +## Fleet roles (added 2026-08-08) + +Additional Terraphim-AI domain roles (fleet standard §8): + +| Role | shortname | KG | +|------|-----------|-----| +| Terraphim AI Developer | `taidev` | `.terraphim/kg-taidev/` | +| Terraphim AI Architect | `taiarch` | `.terraphim/kg-taiarch/` | + +These coexist with the existing `Rust Engineer` / `kg//` layout. + +```bash +python3 .terraphim/scripts/bootstrap.py # materialize {REPO} + refresh thesauri +``` + +Skills manifest: `.terraphim/skills.toml` (`tsm install `). +Repo agent memory: `memory/` at repo root. + +## Path portability + +Fleet roles use **repo-relative** haystack and KG paths (`.`, `crates`, `memory`, …). +`scripts/bootstrap.py` regenerates thesauri and normalizes absolute/`{REPO}` paths +that resolve **inside this repo** back to relative form. Foreign absolute haystacks +are left untouched. The script never writes machine-absolute paths into tracked config. + diff --git a/.terraphim/config.json b/.terraphim/config.json index 39ad5cb06..d6eee56e3 100644 --- a/.terraphim/config.json +++ b/.terraphim/config.json @@ -31,6 +31,112 @@ "llm_provider": "ollama", "ollama_model": "llama3.2:3b", "ollama_base_url": "http://127.0.0.1:11434" + }, + "Terraphim AI Developer": { + "shortname": "taidev", + "name": "Terraphim AI Developer", + "relevance_function": "terraphim-graph", + "terraphim_it": true, + "theme": "united", + "kg": { + "automata_path": null, + "knowledge_graph_local": { + "input_type": "markdown", + "path": ".terraphim/kg-taidev" + }, + "public": false, + "publish": false + }, + "haystacks": [ + { + "location": ".", + "service": "Ripgrep", + "read_only": true, + "fetch_content": false, + "atomic_server_secret": null, + "extra_parameters": {} + }, + { + "location": "crates", + "service": "Ripgrep", + "read_only": true, + "fetch_content": false, + "atomic_server_secret": null, + "extra_parameters": {} + }, + { + "location": "memory", + "service": "Ripgrep", + "read_only": true, + "fetch_content": false, + "atomic_server_secret": null, + "extra_parameters": {} + } + ], + "llm_enabled": false, + "llm_provider": "ollama", + "ollama_model": "llama3.2:3b", + "ollama_base_url": "http://127.0.0.1:11434", + "llm_router_enabled": false, + "llm_context_window": 32768, + "extra": {} + }, + "Terraphim AI Architect": { + "shortname": "taiarch", + "name": "Terraphim AI Architect", + "relevance_function": "terraphim-graph", + "terraphim_it": true, + "theme": "united", + "kg": { + "automata_path": null, + "knowledge_graph_local": { + "input_type": "markdown", + "path": ".terraphim/kg-taiarch" + }, + "public": false, + "publish": false + }, + "haystacks": [ + { + "location": ".", + "service": "Ripgrep", + "read_only": true, + "fetch_content": false, + "atomic_server_secret": null, + "extra_parameters": {} + }, + { + "location": "docs", + "service": "Ripgrep", + "read_only": true, + "fetch_content": false, + "atomic_server_secret": null, + "extra_parameters": {} + }, + { + "location": ".docs", + "service": "Ripgrep", + "read_only": true, + "fetch_content": false, + "atomic_server_secret": null, + "extra_parameters": {} + }, + { + "location": "memory", + "service": "Ripgrep", + "read_only": true, + "fetch_content": false, + "atomic_server_secret": null, + "extra_parameters": {} + } + ], + "llm_enabled": false, + "llm_provider": "ollama", + "ollama_model": "llama3.2:3b", + "ollama_base_url": "http://127.0.0.1:11434", + "llm_router_enabled": false, + "llm_context_window": 32768, + "extra": {} } } } diff --git a/.terraphim/kg-taiarch/knowledge-graph.md b/.terraphim/kg-taiarch/knowledge-graph.md new file mode 100644 index 000000000..2067247dd --- /dev/null +++ b/.terraphim/kg-taiarch/knowledge-graph.md @@ -0,0 +1,5 @@ +# Knowledge Graph + +Local-first KG: logseq-style markdown concepts with `synonyms::` lines compile to per-role thesauri; drives term expansion, automata, and graph ranking. + +synonyms:: knowledge graph, kg, thesaurus, synonyms, logseq, concept, term expansion diff --git a/.terraphim/kg-taiarch/privacy.md b/.terraphim/kg-taiarch/privacy.md new file mode 100644 index 000000000..16d8924f5 --- /dev/null +++ b/.terraphim/kg-taiarch/privacy.md @@ -0,0 +1,5 @@ +# Local-First Privacy + +No telemetry, local persistence, optional remote haystacks are explicit per role. Secrets via op:// references, never committed. + +synonyms:: privacy, local-first, no telemetry, offline diff --git a/.terraphim/kg-taiarch/relevance.md b/.terraphim/kg-taiarch/relevance.md new file mode 100644 index 000000000..1844bb3fb --- /dev/null +++ b/.terraphim/kg-taiarch/relevance.md @@ -0,0 +1,5 @@ +# Relevance Functions + +Pluggable ranking: title-scorer, terraphim-graph (rolegraph), BM25 variants. Selected per role in config. + +synonyms:: relevance, ranking, title-scorer, bm25, scorer, rank diff --git a/.terraphim/kg-taiarch/role.md b/.terraphim/kg-taiarch/role.md new file mode 100644 index 000000000..12bbdaf27 --- /dev/null +++ b/.terraphim/kg-taiarch/role.md @@ -0,0 +1,5 @@ +# Roles + +A role bundles a KG, haystacks, relevance function, and theme. Users/agents switch roles to change knowledge domain. Roles defined in config JSON. + +synonyms:: role, roles, role config, default_role, selected_role, haystack set diff --git a/.terraphim/kg-taiarch/search-pipeline.md b/.terraphim/kg-taiarch/search-pipeline.md new file mode 100644 index 000000000..1654a88f8 --- /dev/null +++ b/.terraphim/kg-taiarch/search-pipeline.md @@ -0,0 +1,5 @@ +# Search Pipeline + +Query → thesaurus expansion (automata) → haystack fetch → merge → relevance rank → results. Async via tokio; middleware crate provides the axum service. + +synonyms:: pipeline, search flow, query expansion, middleware, axum, async search diff --git a/.terraphim/kg-taidev/agent.md b/.terraphim/kg-taidev/agent.md new file mode 100644 index 000000000..0753e26ec --- /dev/null +++ b/.terraphim/kg-taidev/agent.md @@ -0,0 +1,5 @@ +# Terraphim Agent + +Agent crates (`terraphim_agent` + `terraphim-agent` binary): REPL with /search /role /graph, hooks handler, guard, learning capture, robot mode JSON for AI integration. + +synonyms:: agent, repl, terraphim-agent, hook, guard, robot mode, learning capture, /search, /role, /graph diff --git a/.terraphim/kg-taidev/automata.md b/.terraphim/kg-taidev/automata.md new file mode 100644 index 000000000..c8e2dc10e --- /dev/null +++ b/.terraphim/kg-taidev/automata.md @@ -0,0 +1,5 @@ +# Automata + +Core text automaton crate (`terraphim_automata`): Aho-Corasick based matching over the role thesaurus, autocomplete, and term linking. Foundation of KG-driven search and hooks text replacement. + +synonyms:: automata, aho-corasick, automaton, thesaurus, autocomplete, matcher, linkify, term linking, AutomataPath, TerraphimAutomata diff --git a/.terraphim/kg-taidev/config.md b/.terraphim/kg-taidev/config.md new file mode 100644 index 000000000..7a8c20bff --- /dev/null +++ b/.terraphim/kg-taidev/config.md @@ -0,0 +1,5 @@ +# Config & Secrets + +`terraphim_config` + `terraphim_onepassword_cli` (in terraphim-config-persistence): role config loading, SecretLoader resolving op://vault/item/field via 1Password CLI with EnvironmentLoader fallback. + +synonyms:: config, settings, secret, 1password, op://, SecretLoader, EnvironmentLoader, vault diff --git a/.terraphim/kg-taidev/haystack.md b/.terraphim/kg-taidev/haystack.md new file mode 100644 index 000000000..51e449279 --- /dev/null +++ b/.terraphim/kg-taidev/haystack.md @@ -0,0 +1,5 @@ +# Haystacks + +Search source crates (`haystack_*`): Ripgrep local files, GrepApp GitHub code search, QueryRs Rust docs, Atomic server, JMAP mail, Atlassian, Discourse. Each role configures its own haystacks. + +synonyms:: haystack, ripgrep, grepapp, queryrs, atomic, jmap, atlassian, discourse, data source, search source diff --git a/.terraphim/kg-taidev/hooks.md b/.terraphim/kg-taidev/hooks.md new file mode 100644 index 000000000..1f41fdfee --- /dev/null +++ b/.terraphim/kg-taidev/hooks.md @@ -0,0 +1,5 @@ +# Hooks + +`terraphim_hooks`: KG-driven text replacement and validation hooks (pre-commit, Claude Code integration). + +synonyms:: hooks, text replacement, validate, pre-commit, replace diff --git a/.terraphim/kg-taidev/mcp.md b/.terraphim/kg-taidev/mcp.md new file mode 100644 index 000000000..591f31275 --- /dev/null +++ b/.terraphim/kg-taidev/mcp.md @@ -0,0 +1,5 @@ +# MCP Server + +`terraphim_mcp_server`: exposes Terraphim search as MCP tools for Claude Code / agents. + +synonyms:: mcp, mcp server, model context protocol, mcp tools, search tool diff --git a/.terraphim/kg-taidev/orchestrator.md b/.terraphim/kg-taidev/orchestrator.md new file mode 100644 index 000000000..b52d5eb21 --- /dev/null +++ b/.terraphim/kg-taidev/orchestrator.md @@ -0,0 +1,5 @@ +# Multi-Agent Orchestration + +Agent fleet crates (`terraphim_orchestrator`, `terraphim_multi_agent`, `terraphim_agent_supervisor`, `terraphim_agent_registry`, `terraphim_agent_messaging`, `terraphim_agent_evolution`): spawn, supervise, message and evolve agent fleets. + +synonyms:: orchestrator, multi-agent, supervisor, registry, messaging, evolution, spawner, fleet, swarm diff --git a/.terraphim/kg-taidev/persistence.md b/.terraphim/kg-taidev/persistence.md new file mode 100644 index 000000000..144c6cbfd --- /dev/null +++ b/.terraphim/kg-taidev/persistence.md @@ -0,0 +1,5 @@ +# Persistence + +Storage layer (`terraphim_persistence`): DeviceStorage over OpenDAL with memory/dashmap/redb/sqlite/s3 profiles, multi-profile cache write-back, settings persistence. + +synonyms:: persistence, storage, opendal, redb, sqlite, dashmap, DeviceStorage, settings, cache, write-back, memory backend, s3 backend diff --git a/.terraphim/kg-taidev/rolegraph.md b/.terraphim/kg-taidev/rolegraph.md new file mode 100644 index 000000000..95224db17 --- /dev/null +++ b/.terraphim/kg-taidev/rolegraph.md @@ -0,0 +1,5 @@ +# Rolegraph + +Graph ranking crate (`terraphim_rolegraph`): builds the co-occurrence graph over documents for a role and ranks results (terraphim-graph relevance function). + +synonyms:: rolegraph, role graph, co-occurrence, graph rank, terraphim-graph, relevance, RoleGraph, graph ranking diff --git a/.terraphim/kg-taidev/session.md b/.terraphim/kg-taidev/session.md new file mode 100644 index 000000000..b06bcf022 --- /dev/null +++ b/.terraphim/kg-taidev/session.md @@ -0,0 +1,5 @@ +# Sessions + +`terraphim_sessions` + `terraphim-session-analyzer`: agent session capture, analysis, resume. + +synonyms:: session, sessions, session analyzer, resume, transcript diff --git a/.terraphim/scripts/bootstrap.py b/.terraphim/scripts/bootstrap.py new file mode 100755 index 000000000..8796b0606 --- /dev/null +++ b/.terraphim/scripts/bootstrap.py @@ -0,0 +1,128 @@ +#!/usr/bin/env python3 +"""Bootstrap .terraphim for this clone. + +- Regenerates thesaurus-.json from kg-/*.md when that + fleet-style directory exists +- Normalizes accidental absolute/{REPO} haystack paths back to repo-relative +- Does NOT rewrite legacy kg// paths (e.g. .terraphim/kg/rust-engineer) +- NEVER writes machine-absolute paths into tracked config.json + +Idempotent. Run after clone and after editing concept files. +""" +from __future__ import annotations + +import glob +import json +import os +import subprocess + +REPO = subprocess.check_output( + ["git", "rev-parse", "--show-toplevel"], text=True +).strip() +TD = os.path.join(REPO, ".terraphim") +CFG = os.path.join(TD, "config.json") + + +def compile_thesaurus(kg_dir: str, out_path: str, role_name: str) -> None: + if not os.path.isdir(kg_dir): + print(f" skip thesaurus (missing {os.path.relpath(kg_dir, REPO)})") + return + data: dict = {} + cid = 100 + for f in sorted(glob.glob(os.path.join(kg_dir, "*.md"))): + nterm = os.path.splitext(os.path.basename(f))[0] + txt = open(f, encoding="utf-8").read() + syn = next( + ( + l.split("::", 1)[1] + for l in txt.splitlines() + if l.strip().lower().startswith("synonyms::") + ), + "", + ) + for term in dict.fromkeys( + [nterm] + [s.strip().lower() for s in syn.split(",") if s.strip()] + ): + key = term.lower() + if key in data and data[key]["nterm"] != nterm: + print( + f" warn: synonym {key!r} already maps to {data[key]['nterm']!r}; " + f"ignoring mapping to {nterm!r} ({os.path.basename(f)})" + ) + continue + data.setdefault(key, {"id": cid, "nterm": nterm}) + cid += 1 + with open(out_path, "w", encoding="utf-8") as fh: + json.dump({"name": role_name, "data": data}, fh, indent=2) + fh.write("\n") + print(f" wrote {os.path.relpath(out_path, REPO)} ({len(data)} terms)") + + +def to_repo_relative(loc: str) -> str: + if loc in ("{REPO}", ".", ""): + return "." + if loc.startswith("{REPO}/"): + return loc[len("{REPO}/") :] or "." + if loc == REPO or loc.rstrip("/") == REPO: + return "." + if loc.startswith(REPO + os.sep): + return loc[len(REPO) + 1 :] or "." + if loc.startswith("/"): + # Only rewrite absolute paths that resolve INSIDE this repo. + # Never rewrite foreign paths that merely share a directory suffix + # (e.g. /mnt/shared/docs must not become "docs"). + try: + real_loc = os.path.realpath(loc) + real_repo = os.path.realpath(REPO) + except OSError: + return loc + if real_loc == real_repo: + return "." + prefix = real_repo + os.sep + if real_loc.startswith(prefix): + return real_loc[len(prefix):] or "." + # foreign absolute path — leave untouched + return loc + return loc + + +cfg = json.load(open(CFG)) +changed = False +for role in cfg.get("roles", {}).values(): + short = role.get("shortname") or role.get("name", "role").lower().replace(" ", "-") + fleet_kg = os.path.join(TD, f"kg-{short}") + kg = role.get("kg", {}).get("knowledge_graph_local") + # Only force fleet path when fleet kg- dir exists; leave legacy kg/ + if kg and "path" in kg and os.path.isdir(fleet_kg): + rel = f".terraphim/kg-{short}" + if kg["path"] != rel: + kg["path"] = rel + changed = True + elif kg and "path" in kg: + # legacy kg// — heal via same relative normalizer (no layout change) + new_p = to_repo_relative(kg["path"]) + if new_p == ".": + new_p = kg["path"] # don't collapse a kg path to repo root + if kg["path"] != new_p: + kg["path"] = new_p + changed = True + for h in role.get("haystacks", []): + new = to_repo_relative(h.get("location", ".")) + if h.get("location") != new: + h["location"] = new + changed = True + if os.path.isdir(fleet_kg): + compile_thesaurus( + fleet_kg, + os.path.join(TD, f"thesaurus-{short}.json"), + role.get("name", short), + ) + +if changed: + with open(CFG, "w", encoding="utf-8") as fh: + json.dump(cfg, fh, indent=2) + fh.write("\n") + print(" config.json normalized (portable relative paths)") +else: + print(" config.json already portable (no path rewrite)") +print("done.") diff --git a/.terraphim/skills.toml b/.terraphim/skills.toml new file mode 100644 index 000000000..0d7ffd6e7 --- /dev/null +++ b/.terraphim/skills.toml @@ -0,0 +1,28 @@ +# Terraphim skills manifest for agents working in this repository. +# Install with: tsm install (all marketplace skills currently premium — `tsm login` required) +# Registry: https://terraphim-skills.md +# Names verified against `tsm list` 2026-08-08. + +[required] +skills = [ + "disciplined-research", + "disciplined-specification", + "disciplined-design", + "disciplined-implementation", + "disciplined-verification", + "disciplined-validation", + "code-review", + "debugging", + "handover", + "learning-capture", + "git-safety-guard", +] + +[recommended] +skills = [ + "architecture", + "documentation", + "kg-rlm-ingest", + "gitea-pagerank-workflow", + "deterministic-rlm-review", +] diff --git a/.terraphim/thesaurus-taiarch.json b/.terraphim/thesaurus-taiarch.json new file mode 100644 index 000000000..07385320e --- /dev/null +++ b/.terraphim/thesaurus-taiarch.json @@ -0,0 +1,129 @@ +{ + "name": "Terraphim AI Architect", + "data": { + "knowledge-graph": { + "id": 100, + "nterm": "knowledge-graph" + }, + "knowledge graph": { + "id": 100, + "nterm": "knowledge-graph" + }, + "kg": { + "id": 100, + "nterm": "knowledge-graph" + }, + "thesaurus": { + "id": 100, + "nterm": "knowledge-graph" + }, + "synonyms": { + "id": 100, + "nterm": "knowledge-graph" + }, + "logseq": { + "id": 100, + "nterm": "knowledge-graph" + }, + "concept": { + "id": 100, + "nterm": "knowledge-graph" + }, + "term expansion": { + "id": 100, + "nterm": "knowledge-graph" + }, + "privacy": { + "id": 101, + "nterm": "privacy" + }, + "local-first": { + "id": 101, + "nterm": "privacy" + }, + "no telemetry": { + "id": 101, + "nterm": "privacy" + }, + "offline": { + "id": 101, + "nterm": "privacy" + }, + "relevance": { + "id": 102, + "nterm": "relevance" + }, + "ranking": { + "id": 102, + "nterm": "relevance" + }, + "title-scorer": { + "id": 102, + "nterm": "relevance" + }, + "bm25": { + "id": 102, + "nterm": "relevance" + }, + "scorer": { + "id": 102, + "nterm": "relevance" + }, + "rank": { + "id": 102, + "nterm": "relevance" + }, + "role": { + "id": 103, + "nterm": "role" + }, + "roles": { + "id": 103, + "nterm": "role" + }, + "role config": { + "id": 103, + "nterm": "role" + }, + "default_role": { + "id": 103, + "nterm": "role" + }, + "selected_role": { + "id": 103, + "nterm": "role" + }, + "haystack set": { + "id": 103, + "nterm": "role" + }, + "search-pipeline": { + "id": 104, + "nterm": "search-pipeline" + }, + "pipeline": { + "id": 104, + "nterm": "search-pipeline" + }, + "search flow": { + "id": 104, + "nterm": "search-pipeline" + }, + "query expansion": { + "id": 104, + "nterm": "search-pipeline" + }, + "middleware": { + "id": 104, + "nterm": "search-pipeline" + }, + "axum": { + "id": 104, + "nterm": "search-pipeline" + }, + "async search": { + "id": 104, + "nterm": "search-pipeline" + } + } +} diff --git a/.terraphim/thesaurus-taidev.json b/.terraphim/thesaurus-taidev.json new file mode 100644 index 000000000..a422da54d --- /dev/null +++ b/.terraphim/thesaurus-taidev.json @@ -0,0 +1,325 @@ +{ + "name": "Terraphim AI Developer", + "data": { + "agent": { + "id": 100, + "nterm": "agent" + }, + "repl": { + "id": 100, + "nterm": "agent" + }, + "terraphim-agent": { + "id": 100, + "nterm": "agent" + }, + "hook": { + "id": 100, + "nterm": "agent" + }, + "guard": { + "id": 100, + "nterm": "agent" + }, + "robot mode": { + "id": 100, + "nterm": "agent" + }, + "learning capture": { + "id": 100, + "nterm": "agent" + }, + "/search": { + "id": 100, + "nterm": "agent" + }, + "/role": { + "id": 100, + "nterm": "agent" + }, + "/graph": { + "id": 100, + "nterm": "agent" + }, + "automata": { + "id": 101, + "nterm": "automata" + }, + "aho-corasick": { + "id": 101, + "nterm": "automata" + }, + "automaton": { + "id": 101, + "nterm": "automata" + }, + "thesaurus": { + "id": 101, + "nterm": "automata" + }, + "autocomplete": { + "id": 101, + "nterm": "automata" + }, + "matcher": { + "id": 101, + "nterm": "automata" + }, + "linkify": { + "id": 101, + "nterm": "automata" + }, + "term linking": { + "id": 101, + "nterm": "automata" + }, + "automatapath": { + "id": 101, + "nterm": "automata" + }, + "terraphimautomata": { + "id": 101, + "nterm": "automata" + }, + "config": { + "id": 102, + "nterm": "config" + }, + "settings": { + "id": 102, + "nterm": "config" + }, + "secret": { + "id": 102, + "nterm": "config" + }, + "1password": { + "id": 102, + "nterm": "config" + }, + "op://": { + "id": 102, + "nterm": "config" + }, + "secretloader": { + "id": 102, + "nterm": "config" + }, + "environmentloader": { + "id": 102, + "nterm": "config" + }, + "vault": { + "id": 102, + "nterm": "config" + }, + "haystack": { + "id": 103, + "nterm": "haystack" + }, + "ripgrep": { + "id": 103, + "nterm": "haystack" + }, + "grepapp": { + "id": 103, + "nterm": "haystack" + }, + "queryrs": { + "id": 103, + "nterm": "haystack" + }, + "atomic": { + "id": 103, + "nterm": "haystack" + }, + "jmap": { + "id": 103, + "nterm": "haystack" + }, + "atlassian": { + "id": 103, + "nterm": "haystack" + }, + "discourse": { + "id": 103, + "nterm": "haystack" + }, + "data source": { + "id": 103, + "nterm": "haystack" + }, + "search source": { + "id": 103, + "nterm": "haystack" + }, + "hooks": { + "id": 104, + "nterm": "hooks" + }, + "text replacement": { + "id": 104, + "nterm": "hooks" + }, + "validate": { + "id": 104, + "nterm": "hooks" + }, + "pre-commit": { + "id": 104, + "nterm": "hooks" + }, + "replace": { + "id": 104, + "nterm": "hooks" + }, + "mcp": { + "id": 105, + "nterm": "mcp" + }, + "mcp server": { + "id": 105, + "nterm": "mcp" + }, + "model context protocol": { + "id": 105, + "nterm": "mcp" + }, + "mcp tools": { + "id": 105, + "nterm": "mcp" + }, + "search tool": { + "id": 105, + "nterm": "mcp" + }, + "orchestrator": { + "id": 106, + "nterm": "orchestrator" + }, + "multi-agent": { + "id": 106, + "nterm": "orchestrator" + }, + "supervisor": { + "id": 106, + "nterm": "orchestrator" + }, + "registry": { + "id": 106, + "nterm": "orchestrator" + }, + "messaging": { + "id": 106, + "nterm": "orchestrator" + }, + "evolution": { + "id": 106, + "nterm": "orchestrator" + }, + "spawner": { + "id": 106, + "nterm": "orchestrator" + }, + "fleet": { + "id": 106, + "nterm": "orchestrator" + }, + "swarm": { + "id": 106, + "nterm": "orchestrator" + }, + "persistence": { + "id": 107, + "nterm": "persistence" + }, + "storage": { + "id": 107, + "nterm": "persistence" + }, + "opendal": { + "id": 107, + "nterm": "persistence" + }, + "redb": { + "id": 107, + "nterm": "persistence" + }, + "sqlite": { + "id": 107, + "nterm": "persistence" + }, + "dashmap": { + "id": 107, + "nterm": "persistence" + }, + "devicestorage": { + "id": 107, + "nterm": "persistence" + }, + "cache": { + "id": 107, + "nterm": "persistence" + }, + "write-back": { + "id": 107, + "nterm": "persistence" + }, + "memory backend": { + "id": 107, + "nterm": "persistence" + }, + "s3 backend": { + "id": 107, + "nterm": "persistence" + }, + "rolegraph": { + "id": 108, + "nterm": "rolegraph" + }, + "role graph": { + "id": 108, + "nterm": "rolegraph" + }, + "co-occurrence": { + "id": 108, + "nterm": "rolegraph" + }, + "graph rank": { + "id": 108, + "nterm": "rolegraph" + }, + "terraphim-graph": { + "id": 108, + "nterm": "rolegraph" + }, + "relevance": { + "id": 108, + "nterm": "rolegraph" + }, + "graph ranking": { + "id": 108, + "nterm": "rolegraph" + }, + "session": { + "id": 109, + "nterm": "session" + }, + "sessions": { + "id": 109, + "nterm": "session" + }, + "session analyzer": { + "id": 109, + "nterm": "session" + }, + "resume": { + "id": 109, + "nterm": "session" + }, + "transcript": { + "id": 109, + "nterm": "session" + } + } +} diff --git a/memory/README.md b/memory/README.md new file mode 100644 index 000000000..f4d93213b --- /dev/null +++ b/memory/README.md @@ -0,0 +1,10 @@ +# Repo-local agent memory + +Durable, repo-scoped memory for agents working in this repository (fleet +standard §8). Root `memory/` is a read-only haystack in `.terraphim/config.json`, +so everything here is searchable via terraphim-agent / terraphim-grep. + +- `YYYY-MM-DD.md` — daily working notes (decisions, evidence, pointers) +- `regressions.md` — failures turned into guardrails: `| date | what broke | rule | status |` +- Long-term curated notes live in the global Terraphim KG, not here — promote + distilled learnings, keep raw logs local.