OpenLore
Memory server
Created by Clay Good
Published in clay-good/OpenLore. Publisher page
362 GitHub stars
What it is
Persistent architectural memory and structural cognition for AI coding agents.
AutoGineer overview, from the brain’s own files
OpenLore is a memory system designed to solve the amnesia and lack of governance in AI coding agents. By performing a one-time static analysis of a repository, it builds a persistent knowledge graph that encompasses application code, infrastructure-as-code, and architectural decisions. Unlike standard RAG systems, OpenLore operates deterministically without an LLM in the hot path, ensuring consistent answers and providing agents with an 'Epistemic Lease' to warn them when facts have become stale. It serves as both a memory layer for agent orientation and a governance engine that certifies changes, flags breaking API surface modifications, and validates sensitive boundary crossings before they are committed.
How it works
Memory model: Hybrid
AutoGineer overview, from the brain’s own files
OpenLore functions as an MCP server that indexes your repository into a local knowledge graph. Upon installation, it maps code structures, dependencies, and architectural specs. During agent sessions, it injects a compact architecture digest into the agent's context. The agent then uses MCP tools to query this graph for tasks like orienting to a codebase, tracing execution paths, or verifying claims. Governance tools analyze diffs against the graph to provide deterministic verdicts on breaking changes or boundary violations without requiring an LLM.
| Folder | Role | Files |
|---|---|---|
| .claude | agent-config | 1 |
| .github | agent-config | 12 |
| docs | docs | 62 |
| examples | examples | 95 |
| scripts | scripts | 27 |
| skills | agent-instructions | 25 |
| src | source-code | 1284 |
| bench | folder | 15 |
| benchmarks | folder | 1 |
| openspec | folder | 1261 |
| packaging | folder | 2 |
| schemas | folder | 2 |
| stubs | folder | 1 |
The agent reads
- get_style_fingerprint evidence: CLAUDE.md
- get_map evidence: CLAUDE.md
- find_clones evidence: CLAUDE.md
- get_duplicate_report evidence: CLAUDE.md
- get_env_vars evidence: CLAUDE.md
- get_language_support evidence: CLAUDE.md
- search_code evidence: README.md
The agent writes
- record_decision evidence: AGENTS.md
Requirements
Runtimes: Node.js ^22.22.0 || >=23.5.0
Databases: LanceDB
Works with: Claude Code, Claude apps, OpenAI Codex, GitHub Copilot, Cursor, Gemini CLI, Google Antigravity, Kiro, OpenCode, Amp, Roo Code, Cline, JetBrains Junie, Devin (ex-Windsurf)
Set it up
This brain runs code automatically: 1 script. Review package.json before opening the folder in Claude Code. No step below turns a hook on for you.
package.json:node scripts/postinstall.mjs
- Not scanned by AutoGineerAutoGineer could not scan everything it runs. https://www.npmjs.com/package/openlore
Created by Clay Good. Published in clay-good/OpenLore. Licence: MIT License.
Usage
AutoGineer overview, from the brain’s own files
- Orienting an agent to a new codebase at the start of a task.
- Validating that a proposed code change does not break public API contracts.
- Checking if a diff introduces a path into a sensitive architectural boundary.
- Verifying claims about code safety or dead code before refactoring.
- Maintaining architectural specifications that stay synchronized with code changes.
- Selecting relevant tests to run based on the specific impact of a code modification.
- “Orient me to the user authentication flow in this repository.”
- The agent calls orient() and receives a summary of relevant functions, callers, and specs, allowing it to start the task immediately without manual file exploration.
- “Review my current changes for breaking API surface modifications.”
- The agent uses certify_public_surface to identify changed exports and lists the specific consumers that would be affected by the proposed changes.
- “Verify if the function 'deleteUser' is safe to remove.”
- The agent uses find_dead_code or verify_claim to determine if the function has any remaining callers or dependencies, providing a deterministic verdict.
- “Check if this diff opens a path into the sensitive 'payment-gateway' module.”
- The agent uses change_impact_certificate to confirm whether the new code creates a reachable path into the protected boundary.
Documentation by Clay Good
<h1 align="center">OpenLore</h1>
<p align="center"> <strong>Deterministic, local-first memory and guardrails for AI coding agents — no LLM in the hot path.</strong><br> Install once. From then on it runs in the background, keeping your agent oriented and its changes safe.<br> No API key. Same answer every time. </p>
<p align="center"> <a href="https://www.npmjs.com/package/openlore"><img src="https://img.shields.io/npm/v/openlore?color=2563eb&label=npm&logo=npm&logoColor=white" alt="npm version"></a> <a href="https://github.com/clay-good/OpenLore/actions/workflows/ci.yml"><img src="https://github.com/clay-good/OpenLore/actions/workflows/ci.yml/badge.svg" alt="CI status"></a> <a href="LICENSE"><img src="https://img.shields.io/npm/l/openlore?color=22c55e" alt="MIT License"></a> <img src="https://img.shields.io/node/v/openlore?color=339933&logo=node.js&logoColor=white" alt="Node >=22.22"> <br> <img src="https://img.shields.io/badge/MCP-ready-7c3aed?logo=anthropic&logoColor=white" alt="MCP ready"> <img src="https://img.shields.io/badge/languages-21%20%2B%2013%20IaC-f97316" alt="21 languages + 13 IaC ecosystems"> <img src="https://img.shields.io/badge/tests-5500%2B-success" alt="5500+ tests"> <img src="https://img.shields.io/badge/API_key-not_required-0ea5e9" alt="No API key required"> <a href="https://github.com/clay-good/OpenLore/stargazers"><img src="https://img.shields.io/github/stars/clay-good/OpenLore?style=social" alt="GitHub stars"></a> </p>
<p align="center"> <code>install</code> wires your agent and indexes the repo → <code>orient</code> returns the code a task touches → <code>review</code> catches the change that breaks a contract. All local, no API key. </p>
<p align="center"> <strong><a href="#install-once-then-forget-it">Install</a> · <a href="#what-you-get">What you get</a> · <a href="#value-scorecard--does-it-pay-for-itself">Benchmarks</a> · <a href="#openlore-vs-alternatives">vs. Alternatives</a> · <a href="#documentation">Docs</a></strong> </p>
AI coding agents are amnesiac and ungoverned. Every task restarts by re-reading the same files, long sessions drift onto stale assumptions, and nothing warns the agent when a change is about to break a contract or cross a boundary.
OpenLore fixes both halves, and then gets out of your way. A one-time static analysis builds a live knowledge graph of your repo — call structure, types, tests, decisions, IaC. From then on your agent is already oriented at the start of every task and its changes are certified before they land — automatically, deterministically, with no LLM in the hot path, so the same question returns the same grounded answer and the agent is told when a fact goes stale instead of served a confident guess.
Install once, then forget it
npm install -g openlore && openlore installThat is the only command most people ever run. It auto-detects your agent (Claude Code, Cursor, Cline, Continue, Pi, AGENTS.md), wires it, registers the MCP server, and builds the index — no API key, no config, no prompts. After that, it's on in the background and you don't think about it:
🔄 Every task starts oriented, automatically — a compact architecture digest is injected into your agent's context at the start of each session, and your agent calls
orient()and the other tools itself over MCP. You don't type anything.🌱 Every repo, not just this one —
installwires your user account too, so each new git repo you open indexes itself in the background on first touch. "Install once" is literal.🩹 Always fresh — a file watcher re-indexes as you edit and converges to a full analysis; anything it can't recompute in time is marked explicitly stale, never silently wrong.
🛡️ Changes get checked before they land — the governance tools (and
openlore reviewon a PR) run deterministically with no API key.
The CLI below exists for humans and CI — prove, review, doctor, features. The everyday path is: install, then let your agent use it.
Zero config. Run
openlore featuresto see every opt-in capability (embeddings, the commit gate, the spec store…), whether it's on, and the one command to enable it.openlore doctorverifies the wiring.
What you get
Two things, both deterministic and local:
🧠 Memory — your agent starts every task already oriented
Orient in one call —
orient(task)returns the relevant functions, callers, specs, tests, and insertion points (~430µs p50 on a 15k-node graph) instead of a dozen exploratory file reads.Survives refactors — anchored notes and decisions carry forward when a symbol is renamed or moved, instead of orphaning.
One graph for everything — application code, Infrastructure-as-Code, and architectural decisions share one graph, so a single query spans all three.
Told when a fact is stale — every response carries a brief, factual freshness note (the Epistemic Lease) once a cached fact has aged or the repo moved, so a long session can't drift onto a confident guess.
🛡️ Governance — guardrails on what the agent changes
Breaking-change verdict —
certify_public_surfaceclassifies every changed exportbreaking / non-breaking / potentially-breakingand names the consumers each break hits. Never silently "safe."Sensitive-boundary check —
change_impact_certificateflags when a diff opens a new path into a boundary you declared (reachable after the change, not before).Grounded claims —
verify_claimreturnsconfirmed / refuted / unverifiablewith a citation, before an agent asserts "X is dead" or "Y is safe to change."One commit gate —
openlore enforceblocks on findings you markblocking. Advisory by default, no API key.
The one line to remember: an agent's expensive failure mode isn't ignorance — it's confidence. A model that doesn't know a function exists will go look. A model that "knows" a stale fact builds on it, and you pay at review time. OpenLore is built so the agent can be told "that fact is stale" and "this change opens a path you said was sensitive" — deterministically, with no second model guessing about the first.
Value Scorecard — does it pay for itself?
OpenLore only earns its place if an agent with it reaches a correct answer for less total cost than the same agent without it. We measure that and publish it — wins and losses. Numbers from the Spec 14 benchmark (claude -p, sonnet, N=4 medians, pinned SHAs), measured 2026-06-01.
| Scenario | Cost Δ | Round-trips Δ | Verdict |
|---|---|---|---|
| Large/unfamiliar repo · deep "how does X flow through Y" (its target) | −7% to −21% | −26% | ✅ helps — and the win grows with repo size |
| Small/familiar repo · shallow "who calls X" | task-dependent (Round 1: +43%) | +38% | ❌ often adds overhead — measure first |
The win scales with codebase size (round-trips without → with):
| Repo (size) | Cost Δ | Round-trips |
|---|---|---|
| excalidraw (~640 files) | −21% | 25 → 16 |
| tokio (~790 files) | −21% | 17 → 13 |
| okhttp | −13% | 13 → 11 |
| django (~3k files) | −7% | 21 → 15 |
| gin (110 files, smallest) | +4% (≈even) | 10 → 9 |
Re-confirmed live 2026-06-03: the deep-task win reproduces (okhttp −13%); the small/familiar case is task-dependent, not a flat loss (chalk −32% win vs. express +59% loss). Don't guess from our repos — run
openlore prove --estimateon yours (seconds, no API key).
Honesty contract. We never publish a savings number the benchmark didn't produce, we always show the losses next to the wins, and every claim traces to a command you can run. Methodology: docs/AGENT-BENCHMARKS.md.
Is OpenLore for you?
| ✅ Strong fit | A codebase too big to hold in your head — and the model's. Private or niche code the model never memorized. Long sessions where stale assumptions compound. Polyglot repos, or code plus the IaC that deploys it. |
| 🤔 Try it, measure | Mid-size repos and mixed workloads. Run openlore prove --estimate (seconds, no key) before you commit. |
| ❌ Probably not | A small repo the model already knows, answering shallow questions — your agent's built-in search is cheaper, and we publish the measurement that says so. Also: OpenLore locates and certifies, it never edits your code. |
What your agent reaches for (you rarely type these)
Once wired, your agent calls these over MCP on its own. The default surface is the substrate preset — 15 tools: the navigation core, the highest-value governance reads (recall, verify_claim, blast_radius), and the spec composites. The lean navigation preset (10 tools) and the full 83 tools (--preset full) are one flag away.
| When the agent needs to… | Tool |
|---|---|
| Start any task | orient(task) — functions, callers, specs, insertion points in one call |
| Find which file/function handles X | search_code |
| Know the blast radius of a change | analyze_impact — risk + up/downstream chain + governing decisions |
| Trace how request X reaches function Y | trace_execution_path |
| Pick the tests a change should run | select_tests — backward reachability to the reaching tests |
| Find dead code / what dies if X is deleted | find_dead_code — cross-language reachability |
| Check a whole diff before commit | blast_radius — callers, tests, specs that drift |
| Tell if a diff opens a sensitive boundary | change_impact_certificate |
| Tell if a change breaks a consumer's API | certify_public_surface — verdict, consumers named |
| Verify a fact before asserting it | verify_claim — deterministic verdict + citation |
| Record an architectural choice | record_decision before writing the code |
Full reference — all 83 tools: docs/mcp-tools.md. Ships as a Claude Code Skill at skills/openlore-orient/.
OpenLore vs. alternatives
Everyone in this category answers the same first question: how does the agent see the codebase without reading it file by file? LSP toolkits answer with symbols, graph MCP servers with a parsed graph, search platforms with an index. OpenLore answers it too — then keeps going into the second question almost nobody answers: what happens when the agent starts writing? A retrieval layer makes an agent informed; it doesn't make it safe. That second half — governance on the same graph, no LLM in the loop — is what OpenLore is for.
| Agent built-ins | LSP toolkits | Graph MCP | Search platforms | OpenLore | |
|---|---|---|---|---|---|
| Structural context instead of file reads | ❌ grep | ✓ symbols | ✓ graph | ✓ index | ✓ call graph + IaC + decisions on one graph |
| Local, no API key, deterministic | Partial | ✓ | ✓ | ❌ hosted | ✓ no LLM in the hot path |
| Cross-session memory anchored to code | ❌ | Partial | ✓ notes | ❌ | ✓ carried across renames |
| Told when a cached fact goes stale | ❌ | ❌ | ❌ | ❌ | ✓ Epistemic Lease |
| Breaking-change verdict over a diff | ❌ | ❌ | Partial | ❌ | ✓ per export, consumers named |
| "Did this diff open a sensitive path?" | ❌ | ❌ | ❌ | ❌ | ✓ differential, pre-commit |
| Cost effect published with the losses | ❌ | ❌ | ❌ | ❌ | ✓ −26% round-trips on deep tasks |
Use the other tool when it's the right one: symbol-level edits (rename across files) are an LSP toolkit's home turf — OpenLore is deliberately read-only, and the two compose. Org-wide search across hundreds of repos is a search platform. Just-fast-graph-retrieval is a smaller graph MCP server. And a small, familiar repo with shallow questions is cheaper with your agent's built-in search. OpenLore also exports SCIP, so it sits alongside these tools, not against them.
Comparisons reflect each project's publicly documented capabilities as of July 2026; a correction PR is always welcome.
What it costs
Measured on a fresh clone of ripgrep with published [email protected]:
| What it costs | On ripgrep (232 files) |
|---|---|
| One-time index build | 13.6 s, entirely local — no API key, no network |
| Disk | 27 MB under .openlore/ (gitignorable; rebuildable from source) |
| Per-query latency | ~430 µs p50 in-process via the MCP server |
| Your source code | never leaves the machine — no account, no telemetry (opt-in only) |
| Lock-in | none — delete .openlore/ and nothing about your repo has changed |
Large monorepos take minutes rather than seconds, stated plainly in Known limitations. Platform: Linux and Windows are exercised in CI; macOS is supported.
Fully local — nothing phones home. No account, no network call; your source, the index, and every query stay on your machine. The only diagnostics that exist are opt-in and local-only, off by default and never transmitted:
OPENLORE_TELEMETRY=1records tool calls, agent identity, latency, error messages, decision titles, and lease events to the gitignored.openlore/telemetry/directory, andOPENLORE_LLM_LOGS=1stores prompts and responses (after secret redaction) in the gitignored.openlore/logs/directory. → docs/configuration.md
Languages, Infrastructure-as-Code & contracts
Languages: TypeScript · JavaScript · Python · Go · Rust · Ruby · Java · C++ · Swift · C# · Kotlin · PHP · C · Scala · Dart · Lua · Elixir · Bash — call graphs ride the same primitives for every language. → docs/language-support.md
Infrastructure-as-Code: Terraform/HCL · Kubernetes · Helm · CloudFormation · Ansible · Pulumi · AWS CDK · CDKTF · Dockerfile · Docker Compose · GitHub Actions · Azure Bicep · Serverless Framework — IaC resources project onto the same graph as application code, so orient, search_code, and analyze_impact answer "what's the blast radius of changing this security group / IAM role / base image / CI job?" with zero new tooling. → docs/iac.md
Interface contracts: OpenAPI 3.x · Swagger 2.0 — each declared operation projects onto the same graph, bound to the route handler that serves it and the function that calls it, so orient and analyze_impact cross the API boundary. Matching is literal, and everything unbound is disclosed. → docs/contracts.md
Known limitations
We'd rather you know these up front.
Static analysis only. Polymorphic dispatch, event channels, and route→handler bindings are recovered (provenance-labeled
synthesized). What isn't: reflective invocation with a non-literal target (getattr(o, name)()),eval, and DI/plugin registries with no visible binding — silently absent from the graph.LLM spec quality varies. Generated spec prose reflects the model's understanding — review complex business logic. Structure, format, coverage, and drift are checked deterministically.
Keyword (BM25) search answers first; local semantic follows in the background.
orient/search_codework immediately with no key. Background builds then add on-device vectors (CPU-only, ~23 MB model) when the optional package is installed; opt out with"embedding": { "provider": "none" }.Large monorepos analyze one package at a time after the first full build (
openlore analyze --shard <name>); the initial index is still a full analysis.Incremental updates converge or flag, never silently diverge. When a change exceeds the per-save budget, the rest is marked explicitly stale and self-heals on later edits or a background re-analyze.
Documentation
Start here: the documentation index maps every task to the one canonical page that answers it. The essentials:
| I want to… | Doc |
|---|---|
| Install & wire my agent (one command) | install.md |
| Understand why wiring an agent helps | agent-setup.md |
| See all 83 MCP tools + parameters | mcp-tools.md |
| Run the full CLI reference | cli-reference.md |
Configure .openlore/config.json (incl. enforcement.policy) | configuration.md |
| Choose / configure an LLM provider (optional) | providers.md |
| Fix a setup problem | TROUBLESHOOTING.md |
| Read the benchmark methodology + per-task numbers | AGENT-BENCHMARKS.md |
| Search code by meaning (semantic / GraphRAG) | semantic-search.md |
| Pick the tests a change should run | test-impact-selection.md |
| Find dead code / coverage gaps | reachability-dead-code.md · coverage-gaps.md |
| Detect spec ↔ code drift | drift-detection.md |
| Enforce architecture / import rules | architecture-invariants.md |
| Gate commits / wire CI & PR review | ci-cd.md · preflight.md |
| Understand IaC & cross-domain impact | iac.md · cross-domain-impact.md |
| See declared API contracts in the graph | contracts.md |
| Query across repos (federation) | federation.md |
| Share the index as a bundle | shareable-bundle.md |
| Export to Sourcegraph / SCIP tools | scip-export.md |
| Read the internals | ARCHITECTURE.md · ALGORITHMS.md · PHILOSOPHY.md |
Development
npm install
npm run build
npm run test:run # 5500+ unit tests, one-shot (npm test is watch mode)
npm run typecheckNew contributor? See CONTRIBUTING.md for setup, MCP wiring, and the commit gate. Please also read our Code of Conduct; to report a vulnerability, see SECURITY.md.
Community
If OpenLore saves your agents from re-reading the same files — or catches one risky change before it lands — star the repo. It's the signal that tells us to keep building, and it helps other engineers find it.
⭐ Star to follow along: github.com/clay-good/OpenLore
🐛 Bug or idea? Open an issue.
🤝 Contribute? Start with CONTRIBUTING.md.
Links
docs/AGENT-BENCHMARKS.md
Agent Token-Efficiency Benchmark (WITH vs WITHOUT openlore)
Spec 14. Does configuring openlore make a headless agent cheaper / fewer round-trips at answering relational questions about a codebase? This is the end-to-end agent story, distinct from scripts/BENCHMARKS.md (raw query latency, orient ~430µs p50).
The table below the marker is regenerated by
npm run bench:agent; this findings section is hand-maintained and preserved across re-runs.
Honesty contract (Spec 25)
The README Value Scorecard and every public token/cost claim about OpenLore are bound by these rules:
No unmeasured numbers. Never publish a savings figure the
bench:agentharness did not produce. Intuitions/estimates are labeled as such or deleted — not dressed up as results.Always show the losses. The negative cases (small/familiar repos: +43% cost) are published next to the wins, in the same table. Suppressing a loss cell is a bug.
Date-stamped and re-measured. The scorecard carries the measurement date and pinned SHAs, and is re-run after each optimization phase (Spec 25 Phases B–D). The README number is always the last measured number.
Reproducible by anyone. Every claim traces to a command in this repo (
npm run bench:agent, and the forthcomingopenlore provefor your-own-repo numbers). If it doesn't reproduce, it's marketing, and we remove it.
Findings — first run (2026-06-01, sonnet, 4 runs/task, 5 repos)
On this repo set, openlore did NOT reduce cost or tokens — it added overhead. Across the relational tasks the median was +43% cost, +79% fresh input tokens, and +38% round-trips WITH openlore, and it lost on 5 of 7 tasks (break-even on the other 2). Correctness was 100% in both conditions on every task — so openlore bought no accuracy either. This is reported as-is, per the Spec 13 "report losses honestly; do not bury this number" discipline.
Why — and why this is the wrong arena for the claim, not a refutation of it. The headline claim
is that orientation burns 15,000–50,000 tokens of file-by-file rediscovery that openlore replaces.
That premise did not hold for these repos: the WITHOUT baseline answered correctly using only
~1,800–6,000 fresh tokens. The reason is structural, not incidental — every pinned repo
(chalk / express / flask / gin / zod) is small, canonical, and heavily represented in the model's
training data. The model already "knows" express's router and Flask's request lifecycle, so a
single grep confirms what it half-remembers; there is no orientation tax to eliminate. Against that,
openlore's fixed costs — ~45 MCP tool definitions in every system prompt, an orient() round-trip,
and the agent still spot-reading to verify — are pure overhead. openlore is designed for the
opposite case: large, unfamiliar, private codebases the model has never seen, where blind
exploration genuinely explodes. None of the pinned repos exercise that case.
What this means (the kill-signal, read precisely). Spec 13 names this benchmark the earliest kill-signal. It has fired — but it falsifies the claim only on popular small repos, which is the benchmark's blind spot, not openlore's target. Two honest conclusions:
The README token-savings figure is not supported by any measurement we have, and is contradicted on popular repos. It has been corrected to say so (no longer a quiet "hypothesis").
The decisive test was deferred to Round 2 (below), which DID run it — large repos + deep multi-hop traces — and found openlore does help there once the tool surface is right. So the Round-1 negative is real but scope-limited to small/familiar repos + shallow queries, not a verdict on the idea. Read Round 2 for the measured win.
Caveats on the numbers themselves. Cost is noisy because Anthropic's prompt cache warms across
back-to-back runs (later runs of a repo are cheaper); fresh input tokens is the cache-robust metric
and tells the same story. Whether the WITH agent actually called orient() each time is not captured
by --output-format json (a stream-json pass to log tool calls is a worthwhile follow-up). N=4 is the
spec floor; variance ([min–max]) is shown per cell.
Round 2 — research-driven fixes + the right arena (2026-06-01) — openlore wins on deep tasks
After Round 1, I studied how comparable tools benchmark and where they win (CodeGraph publishes 35% cheaper / 57% fewer tokens / 62% fewer tool calls; Serena reports 70–80% via LSP semantic chunks). Three concrete fixes followed, all now in the harness:
Right arena. Added large repos + deep multi-hop trace questions mirroring CodeGraph's exact set (Django ORM query execution, Tokio scheduler, Excalidraw render, OkHttp interceptor chain, Gin middleware) — "how does X flow through Y", not the shallow "who calls foo" of Round 1. On these, the baseline genuinely explodes (Django: ~18 tool-calls, ~12–24k fresh tokens), so there is real orientation cost to remove.
Isolation. Both arms now run
--strict-mcp-config(a globally-registered openlore can no longer leak into the WITHOUT baseline) — matching CodeGraph's method.Tool surface. WITH defaults to
--minimal(5 tools) — the MCP best-practice that unused tool schemas are pure per-request overhead.--with-full-toolsexposes all ~45 for comparison.
The diagnosis that led to the fix. Round-1's --minimal was mis-curated for navigation — orient +
search_code + 3 governance tools (record_decision / detect_changes / check_spec_drift), omitting
exactly the graph-traversal tools a trace question needs. Full mode (~45 tools) had them and cut
round-trips, but its schema overhead erased the saving. So we built a navigation preset (openlore mcp --preset navigation, the 7 graph tools measured here: orient, search_code, get_subgraph,
trace_execution_path, analyze_impact, suggest_insertion_points, get_function_skeleton — CodeGraph
parity): the right tools without the overhead. (The shipped preset has since grown to 10 — it added
the structural-navigation primitives get_landmarks, get_map, find_path — and, as of the
default-to-lean-tool-surface change, is now the default MCP surface; full surface is opt-in via
--preset full.)
N=4 result on the deep-trace tasks (the decisive run — see the auto-generated table below). With the navigation preset, openlore flips from a loss to a win:
| Aggregate (5 deep traces, N=4 medians) | WITHOUT | WITH --preset navigation |
|---|---|---|
| Cost | $0.159 | $0.147 (−7%) |
| Round-trips | 17 | 13 (−26%) |
| Fresh input tokens | 21,885 | 21,961 (≈flat) |
| Correctness | 100% | 100% |
And the win scales with codebase size — exactly the hypothesis: excalidraw (~640 files) −21%,
tokio (~790) −21%, okhttp −13%, django (~3k) −7%, gin (110 files, smallest) +4% (≈even).
The clearest, most consistent signal is round-trips: −26% aggregate, fewer on every task — the
agent reaches the answer in fewer tool calls because orient/trace_execution_path collapse the
discovery loop. The cost win is real but modest (the orient/trace context roughly offsets the saved
reads in raw token terms; the gain comes through fewer round-trips), and weaker than CodeGraph's
published 25–35% — a response-compaction pass (CodeGraph's "adaptive sizing" that collapses redundant
implementations to signatures) is the obvious next lever.
Bottom line — the honest, measured two-tier verdict:
Small, familiar repos + shallow queries: openlore adds cost (Round 1: +43%). The model already knows the code; there's no orientation tax to remove and the MCP surface is pure overhead. Don't use it here.
Larger codebases + deep multi-hop questions (its actual target): openlore with the navigation preset is a net win — −7% cost, −26% round-trips at N=4, scaling with repo size, no accuracy cost. The idea works in its arena; rigorous testing — not a first-pass guess — was needed to show it, and to surface the tool-curation fix that made it true.
Round 3 — live re-prove on this machine (2026-06-03, Spec 25 Phase E)
Round 2 deferred the actual re-run as "API-budget-gated." Spec 25 Phase E rescinded that and ran the
benchmark live (sonnet = claude-sonnet-4-6, the new default; --preset navigation; --strict-mcp-config).
Goals: (1) confirm the deep win still holds after the Phase C expand/tokenBudget changes, and
(2) re-measure the small/familiar loss case the navigation preset was never tested on (Round 1's
+43% used the mis-curated --minimal, not navigation). Small N (1–2) — directional, not definitive.
| Task | Arena | Δcost | Round-trips wo→w | N |
|---|---|---|---|---|
| okhttp-interceptor-chain | large / deep | −13% | 14 → 10 | 2 |
| chalk-callers-applyStyle | small / shallow | −32% | 6 → 3 | 2 |
| express-callers-router-route | small / shallow | +59% | 4 → 6 | 2 |
| express-callers-router-route | small / shallow | +32% | 4 → 5 | 1 |
Plus a live openlore prove self-run on this repo (3 graph-derived shallow locate/caller/callee
tasks, N=2/arm): +27% cost, round-trips flat, 67%↔67% correctness → verdict "doesn't help here."
What Round 3 establishes, honestly:
The deep-task win is real and reproducible. okhttp came in at −13%, exactly matching Round 2 — the strongest possible reproducibility signal, and proof the Phase C changes didn't regress it.
The small/familiar-repo loss is NOT eliminated, and it's not even uniform — it's task-dependent and high-variance. Same repo class, opposite outcomes: chalk −32% (win) vs express +59% (loss). The express loss is a forced orient round-trip (4→6) on a question the model could already answer in 4 turns; chalk's win is orient collapsing real exploration (6→3). On shallow "who/where" questions there is often no orientation tax to amortise, so the orient call is pure overhead — exactly as the thesis predicts.
openlore proveworks and tells the truth. On this repo's shallow tasks it honestly returns "doesn't help here." That is the value: rather than trusting our numbers, a user measures theirs.
Verdict, refined and unchanged in spirit: use OpenLore for deep, multi-hop questions on larger /
unfamiliar codebases (consistent, reproduced win). On shallow questions or small familiar repos
it ranges from a modest win to a real loss — so it's break-even-to-negative there, and that's
fine: openlore prove lets each user decide for their own repo + task mix. The §3 goal of fully
eliminating the small-repo loss via a leaner surface was not achieved — the navigation preset
does not close it, because the cost is the (sometimes redundant) orient round-trip, not tool-schema
bytes. We report that plainly rather than claim a fix we did not land.
Round 4 — lean orient (2026-06-03, Spec 27)
Spec 27 added a lean orient mode (navigation core only; enrichment behind expand handles) that
cuts the orient payload 2269 → 1357 tokens (−40%) deterministically. Does that move the
shallow-task loss? No. express "who calls X" with lean orient: WITHOUT $0.024 / 3 turns vs
WITH-lean $0.049 / 5 turns (+107%, N=2) — no better than rich orient (+59%). The loss is
structural: the baseline already finishes a trivial famous-repo lookup in ~3 turns / ~1.9k tokens,
so any orient call — one extra round-trip + its response — costs more than the whole answer. Lean is
a real efficiency win on every orient call (especially deep / borderline ones), but it cannot
remove the round-trip, which dominates on trivial tasks. Honest conclusion: ship lean as the cheaper
navigation default; the trivial-lookup loss is not "fixable" without an unreliable skip-heuristic, so
we don't ship one — openlore prove remains the per-repo arbiter.
openlore prove — measure (or estimate) it on YOUR repo
openlore prove is the per-repo arbiter the honesty contract points at: rather than trusting our
numbers, you measure yours. It derives a few orientation tasks from your call graph, runs a WITH/WITHOUT
agent pass (isolated with --strict-mcp-config), and prints cost / round-trips / correctness deltas at
equal correctness, plus an honest verdict.
| Flag | What you get | Needs API key? |
|---|---|---|
| (none) | Measured WITH/WITHOUT scorecard (the agent arm shells out to claude) | Yes |
--estimate | Deterministic, graph-derived projection of the orientation tax — no agent, no key | No |
--dry-run | The scorecard shape with clearly-labelled synthetic numbers | No |
--json | Stable, CI-consumable JSON (schemaVersion: 1); pure JSON on stdout | depends on arm |
--markdown | Paste-ready scorecard block + a shields.io badge for your README | depends on arm |
--save | Persist a dated scorecard under .openlore/prove/prove-<date>.json (non-clobbering) | depends on arm |
Flags compose — e.g. a no-API-key shareable first look with a saved record:
openlore prove --estimate --markdown --saveThe --estimate arm, and what it does NOT claim. The estimate projects the orientation-task tax
from your graph: a from-scratch agent spends a search round-trip per task plus reads of the distinct
files the answers live in, whereas orient returns the whole neighbourhood in one call followed by a
small bounded confirm. Both arms dedup shared reads, so the comparison is fair. It is a deterministic
proxy with a few documented assumption constants (src/core/agent-eval/estimate.ts) — never a
measured agent run, and every output labels it estimate. Crucially it cannot model whether the
LLM has already memorised your code (the reason a famous/small repo shows no win in the measured
arm); only openlore prove without --estimate measures that. Use --estimate for an honest,
zero-cost first look; use the measured arm for the real verdict.
Honesty in the shareable forms. --json/--markdown/--save carry the same verdict the terminal
shows — wins and losses — and the badge encodes the round-trips Δ with a verdict-keyed colour. A
non-measured run is labelled (OpenLore (estimate)) in the badge so a shared badge never overclaims.
No verdict over no data. Errored agent runs (auth failure, budget exhaustion, unparseable output)
are dropped from the medians rather than counted as $0/0-turn samples, and if a whole arm has no
successful run the command fails loudly (exit 1) instead of emitting a misleading "break-even" —
so a fully-failed measured run can never be mistaken for a neutral result by a CI consumer reading the
--json verdict.
JSON output schema for CI
The --json shape is stable (schemaVersion: 1); CI can gate on the exact, documented shape below.
The key set is guarded by a test so it cannot drift.
{
"schemaVersion": 1,
"mode": "estimate",
"generatedAt": "2026-06-22T15:32:12.662Z",
"repo": { "sha": "eb9c2d3" },
"model": null,
"samplesPerArm": 1,
"tasks": 3,
"cost": { "without": 0.0081, "with": 0.0063, "deltaPct": -22 },
"roundTrips": { "without": 4, "with": 2, "deltaPct": -50 },
"freshTokens": { "without": 5700, "with": 5100 },
"correctness": { "without": 1, "with": 1 },
"verdict": "helps"
}| Key | Type | Notes |
|---|---|---|
schemaVersion | 1 | Format version; new fields append without a bump |
mode | enum | measured · estimate · dry-run — an estimate/dry-run is never a measurement |
generatedAt | ISO-8601 string | Stamp time |
repo.sha | string | null | Short HEAD SHA, or null outside a git repo |
model | string | null | Agent model for a measured/dry-run pass; null for --estimate |
samplesPerArm | number | = tasks × runs (independent samples per arm; divide by tasks for runs-per-task) |
tasks | number | Orientation tasks covered |
cost / roundTrips | {without, with, deltaPct} | deltaPct is integer % (negative = WITH is cheaper/fewer) |
freshTokens | {without, with} | Median fresh input tokens per arm |
correctness | {without, with} | Rate in [0,1] |
verdict | enum | helps · break-even · doesn't help here (never a win when correctness drops) |
Per-arm/per-task raw metrics are not in --json stdout; they are persisted only in the --save
artifact's raw block.
<!-- BENCH-AGENT:AUTOGEN BELOW — regenerated each run; edit findings ABOVE this line -->
Measured run — auto-generated by npm run bench:agent (Spec 14)
Methodology
Agent:
claude -p --output-format json, modelsonnet, 4 run(s)/task, median reported.Isolation: both arms run with
--strict-mcp-configso the agent uses ONLY the config we pass (a globally-registered openlore can't leak into the baseline). Same as CodeGraph's published benchmark.Conditions: WITHOUT = empty MCP config (grep/read tools only) — the baseline. WITH = openlore (the repo's local build):
openlore mcp --no-watch-auto --preset navigation(--preset navigation — a lean graph-navigation surface, the MCP best-practice of not paying schema overhead for tools the agent never calls), repo pre-analyzed withopenlore analyze --no-embed, plus a system-prompt instruction to callorient()before reading files (a faithful mirror of the shippedopenlore-orientskill — measures the product, not tools the agent ignores).Scoring: correct = the agent's final answer contains every independently-verifiable expected substring (
expect.mustIncludeinbench-agent.tasks.ts), confirmed against the pinned source by grep — not derived from openlore's own graph.Metrics: cost (USD) is the bottom line (it prices fresh vs cached tokens correctly). Tokens are broken into fresh input (
input_tokens+ cache creation — what the model processed fresh) and cached reads (cache_read_input_tokens— ~10× cheaper); plus output, round-trips (num_turns), wall-clock.
Pinned repos
| Repo | Lang | Tag | SHA |
|---|---|---|---|
| chalk | TypeScript | v5.3.0 | 85e35510fdb8 |
| express | JavaScript | 4.19.2 | d36495d7e666 |
| flask | Python | 3.0.3 | 85039283fc3e |
| gin | Go | v1.10.0 | 75ccf94d605a |
| zod | TypeScript | v3.23.8 | ca42965df46b |
| django | Python | 5.0.6 | c99021256896 |
| tokio | Rust | tokio-1.38.0 | 14c17fc09656 |
| excalidraw | TypeScript | v0.17.6 | f1640710aae5 |
| okhttp | Java | parent-5.0.0-alpha.14 | 374def39eb27 |
Per-task results (median; cost [min–max] across runs)
| Task | Kind | Correct wo/w | Cost wo | Cost w | Δcost | Fresh-in wo/w | Cached wo/w | Out wo/w | Turns wo/w |
|---|---|---|---|---|---|---|---|---|---|
| django-orm-query-execution | call-path | 100%/100% | $0.159 [0.126–0.186] | $0.147 [0.133–0.155] | −7% | 16323/16261 | 132041/113599 | 3878/3341 | 21/15 |
| tokio-task-scheduling | call-path | 100%/100% | $0.241 [0.215–0.324] | $0.191 [0.179–0.242] | −21% | 31132/24310 | 170872/141725 | 4891/3531 | 17/13 |
| excalidraw-canvas-render | call-path | 100%/100% | $0.300 [0.241–0.367] | $0.238 [0.210–0.277] | −21% | 39097/35246 | 261917/208656 | 4037/3323 | 25/16 |
| okhttp-interceptor-chain | call-path | 100%/100% | $0.132 [0.114–0.140] | $0.115 [0.096–0.132] | −13% | 18124/15189 | 97872/81234 | 2289/2232 | 13/11 |
| gin-middleware-chain | call-path | 100%/100% | $0.141 [0.135–0.149] | $0.146 [0.104–0.171] | +4% | 21885/21961 | 85163/78434 | 2113/2198 | 10/9 |
wo = WITHOUT openlore, w = WITH. Δcost negative = WITH is cheaper. Cost cells show median [min–max].
Aggregate — relational tasks (graph-favourable)
Cost (bottom line): $0.159 → $0.147 (−7%)
Fresh input tokens: 21885 → 21961 (+0%)
Round-trips: 17 → 13 (−26%)
Spec 13 kill-signal: if the relational-task reduction is small or negative, that is the earliest signal to re-weight toward the governance layer (specs 15+). Report losses honestly; do not bury this number.
512 files · 450 not served here
- .claude/commands/first-run-hardening.md (not served here)
- .gitattributes (not served here)
- .github/CODEOWNERS (not served here)
- .github/ISSUE_TEMPLATE/bug_report.md (not served here)
- .github/PULL_REQUEST_TEMPLATE.md (not served here)
- .github/actions/openlore-review/action.yml (not served here)
- .github/codeql/codeql-config.yml (not served here)
- .github/dependabot.yml (not served here)
- .github/windows-unit-exclusions.json (not served here)
- .github/workflows/ci.yml (not served here)
- .github/workflows/codeql.yml (not served here)
- .github/workflows/openlore-review.yml.example (not served here)
- .github/workflows/release.yml (not served here)
- .github/workflows/scorecard.yml (not served here)
- .gitignore (not served here)
- .npmrc (not served here)
- .nvmrc (not served here)
- .prettierrc (not served here)
- AGENTS.md
- ATTRIBUTION.md
- AUTOGINEER-RUNS.md
- CHANGELOG.md
- CLAUDE.md
- CODE_OF_CONDUCT.md
- CONTRIBUTING.md
- LICENSE
- README.md
- ROADMAP.md
- SECURITY.md
- bench/Dockerfile (not served here)
- bench/PROTOCOL.md (not served here)
- bench/container-entrypoint.sh (not served here)
- bench/container/package-lock.json (not served here)
- bench/container/package.json (not served here)
- bench/corpora/default-surface.json (not served here)
- bench/results/adr-0023-default-surface.json (not served here)
- bench/retrieval/queries/gridprims.json (not served here)
- bench/retrieval/queries/openlore.json (not served here)
- bench/retrieval/queries/roughlogic.json (not served here)
- bench/retrieval/results/2026-10-31.json (not served here)
- bench/retrieval/results/2026-11-01.json (not served here)
- bench/retrieval/run.ts (not served here)
- bench/rules/adr-0023.json (not served here)
- bench/run.ts (not served here)
- benchmarks/certified-scale-v1.json (not served here)
- docs/AGENT-ADOPTION.md
- docs/AGENT-BENCHMARKS.md
- docs/ALGORITHMS.md
- docs/ARCHITECTURE.md
- docs/OPENSPEC-FORMAT.md
- docs/OPENSPEC-INTEGRATION.md
- docs/PHILOSOPHY.md
- docs/README.md
- docs/REFACTORING-WORKFLOW.md
- docs/TROUBLESHOOTING.md
- docs/agent-setup.md
- docs/agentic-workflows.md
- docs/agentic-workflows/BMAD.md (not served here)
- docs/agentic-workflows/README.md (not served here)
- docs/agents/domain.md (not served here)
- docs/agents/issue-tracker.md (not served here)
- docs/agents/triage-labels.md (not served here)
- docs/api.md
- docs/architecture-invariants.md
- docs/change-coupling.md
- docs/check-weakening.md
- docs/ci-cd.md
- docs/cli-reference.md
- docs/configuration.md
- docs/contracts.md
- docs/coverage-gaps.md
- docs/cross-domain-impact.md
- docs/cross-service-topology.md
- docs/drift-detection.md
- docs/federation.md
- docs/generated-files.md
- docs/governance-dogfooding.md
- docs/iac.md
- docs/install.md
- docs/language-support.md
- docs/languages.md
- docs/mcp-tools.md
- docs/openlore-gallery-source.svg (not served here)
- docs/openlore-gallery.png (not served here)
- docs/output.md
- docs/performance-envelope.md
- docs/phantom-references.md
- docs/pipeline.md
- docs/preflight.md
- docs/provenance.md
- docs/providers.md
- docs/publishing.md
- docs/reachability-dead-code.md
- docs/scip-export.md
- docs/semantic-search.md
- docs/session-ledger.md
- docs/shareable-bundle.md
- docs/spec-link-index.md
- docs/spec-tests.md
- docs/specs/generation-repair/openlore-capability-audit.md (not served here)
- docs/specs/generation-repair/openlore-generation-repair-hlspec.md (not served here)
- docs/specs/generation-repair/openlore-resume-point.md (not served here)
- docs/specs/generation-repair/openlore-unified-hlspec-v2.md (not served here)
- docs/structural-diff.md
- docs/test-impact-selection.md
- docs/viewer.md
- docs/windows-support.md
- eslint.config.js (not served here)
- examples/bmad/README.md (not served here)
- examples/bmad/agents/architect.md (not served here)
- examples/bmad/agents/dev-brownfield.md (not served here)
- examples/bmad/setup/architect.customize.yaml (not served here)
- examples/bmad/tasks/implement-story.md (not served here)
- examples/bmad/tasks/onboarding.md (not served here)
- examples/bmad/tasks/refactor.md (not served here)
- examples/bmad/tasks/sprint-planning.md (not served here)
- examples/bmad/templates/story.md (not served here)
- examples/ci/openlore-preflight.gitlab.yml (not served here)
- examples/ci/openlore-preflight.sh (not served here)
- examples/ci/openlore-preflight.yml (not served here)
- examples/cline-workflows/openlore-analyze-codebase.md (not served here)
- examples/cline-workflows/openlore-check-spec-drift.md (not served here)
- examples/cline-workflows/openlore-execute-refactor.md (not served here)
- examples/cline-workflows/openlore-implement-feature.md (not served here)
- examples/cline-workflows/openlore-plan-refactor.md (not served here)
- examples/cline-workflows/openlore-refactor-codebase.md (not served here)
- examples/cline-workflows/openlore-write-tests.md (not served here)
- examples/drift-demo/openspec/config.yaml (not served here)
- examples/drift-demo/openspec/specs/architecture/spec.md (not served here)
- examples/drift-demo/openspec/specs/auth/spec.md (not served here)
- examples/drift-demo/openspec/specs/database/spec.md (not served here)
- examples/drift-demo/openspec/specs/overview/spec.md (not served here)
- examples/drift-demo/openspec/specs/projects/spec.md (not served here)
- examples/drift-demo/openspec/specs/tasks/spec.md (not served here)
- examples/drift-demo/package.json (not served here)
- examples/drift-demo/src/auth/auth-middleware.ts (not served here)
- examples/drift-demo/src/auth/auth-routes.ts (not served here)
- examples/drift-demo/src/auth/auth-service.ts (not served here)
- examples/drift-demo/src/database/connection.ts (not served here)
- examples/drift-demo/src/index.ts (not served here)
- examples/drift-demo/src/projects/project-model.ts (not served here)
- examples/drift-demo/src/projects/project-service.ts (not served here)
- examples/drift-demo/src/tasks/task-model.ts (not served here)
- examples/drift-demo/src/tasks/task-routes.ts (not served here)
- examples/drift-demo/src/tasks/task-service.ts (not served here)
- examples/drift-demo/src/utils/validation.ts (not served here)
- examples/drift-demo/tests/auth.test.ts (not served here)
- examples/drift-demo/tests/tasks.test.ts (not served here)
- examples/drift-demo/tsconfig.json (not served here)
- examples/drift-test/run-drift-test.sh (not served here)
- examples/gsd/README.md (not served here)
- examples/gsd/commands/gsd/openlore-drift.md (not served here)
- examples/gsd/commands/gsd/openlore-orient.md (not served here)
- examples/mistral-vibe/README.md (not served here)
- examples/mistral-vibe/antipatterns-template.md (not served here)
- examples/mistral-vibe/skills/openlore-analyze-codebase/SKILL.md (not served here)
- examples/mistral-vibe/skills/openlore-brainstorm/SKILL.md (not served here)
- examples/mistral-vibe/skills/openlore-debug/SKILL.md (not served here)
- examples/mistral-vibe/skills/openlore-execute-refactor/SKILL.md (not served here)
- examples/mistral-vibe/skills/openlore-generate/SKILL.md (not served here)
- examples/mistral-vibe/skills/openlore-implement-story/SKILL.md (not served here)
- examples/mistral-vibe/skills/openlore-plan-refactor/SKILL.md (not served here)
- examples/mistral-vibe/skills/openlore-review-changes/SKILL.md (not served here)
- examples/mistral-vibe/skills/openlore-write-tests/SKILL.md (not served here)
- examples/opencode-skills/openlore-analyze-codebase/SKILL.md (not served here)
- examples/opencode-skills/openlore-brainstorm/SKILL.md (not served here)
- examples/opencode-skills/openlore-debug/SKILL.md (not served here)
- examples/opencode-skills/openlore-execute-refactor/SKILL.md (not served here)
- examples/opencode-skills/openlore-generate/SKILL.md (not served here)
- examples/opencode-skills/openlore-implement-story/SKILL.md (not served here)
- examples/opencode-skills/openlore-plan-refactor/SKILL.md (not served here)
- examples/opencode-skills/openlore-review-changes/SKILL.md (not served here)
- examples/opencode-skills/openlore-write-tests/SKILL.md (not served here)
- examples/opencode/agent-guard.ts (not served here)
- examples/opencode/plugins/anti-laziness.ts (not served here)
- examples/opencode/plugins/lib/openlore-context-injector-helpers.ts (not served here)
- examples/opencode/plugins/lib/openlore-decision-extractor-helpers.ts (not served here)
- examples/opencode/plugins/openlore-context-injector.test.ts (not served here)
- examples/opencode/plugins/openlore-context-injector.ts (not served here)
- examples/opencode/plugins/openlore-decision-extractor.test.ts (not served here)
- examples/opencode/plugins/openlore-decision-extractor.ts (not served here)
- examples/opencode/plugins/openlore-enforcer.ts (not served here)
- examples/opencode/prompts/sisyphus-sdd.md (not served here)
- examples/openspec-analysis/README.md (not served here)
- examples/openspec-analysis/SUMMARY.md (not served here)
- examples/openspec-analysis/config.json (not served here)
- examples/openspec-analysis/dependencies.mermaid (not served here)
- examples/openspec-analysis/dependency-graph.json (not served here)
- examples/openspec-analysis/llm-context.json (not served here)
- examples/openspec-analysis/repo-structure.json (not served here)
- examples/openspec-cli/README.md (not served here)
- examples/openspec-cli/openspec/config.yaml (not served here)
- examples/openspec-cli/openspec/specs/architecture/spec.md (not served here)
- examples/openspec-cli/openspec/specs/artifact-graph/spec.md (not served here)
- examples/openspec-cli/openspec/specs/cli/spec.md (not served here)
- examples/openspec-cli/openspec/specs/overview/spec.md (not served here)
- examples/openspec-cli/openspec/specs/parsing/spec.md (not served here)
- examples/openspec-cli/openspec/specs/validation/spec.md (not served here)
- examples/pi/README.md (not served here)
- examples/spec-kit/README.md (not served here)
- examples/spec-kit/commands/drift.md (not served here)
- examples/spec-kit/commands/orient.md (not served here)
- examples/spec-kit/extension.yml (not served here)
- flake.lock (not served here)
- flake.nix (not served here)
- openspec/changes/BACKGROUND-SUBSTRATE-2026-10.md (not served here)
- openspec/changes/COMPETITIVE-SUBSTRATE-2026-07.md (not served here)
- openspec/changes/CONTRACT-GRAPH-AND-AGENT-LOOP-2026-10.md (not served here)
- openspec/changes/DOGFOOD-call-resolution-recall.md (not served here)
- openspec/changes/DOGFOOD-change-impact-certificate.md (not served here)
- openspec/changes/DOGFOOD-v2.0.19.md (not served here)
- openspec/changes/DOGFOOD-v2.1.1-tool-count-drift.md (not served here)
- openspec/changes/DOGFOOD-widen-js.md (not served here)
- openspec/changes/E2E-AUDIT-2026-07.md (not served here)
- openspec/changes/E2E-FIRSTRUN-2026-07-27.md (not served here)
- openspec/changes/ECOSYSTEM-RESEARCH-2026-07-27.md (not served here)
- openspec/changes/FEATURE-UPDATES.md (not served here)
- openspec/changes/FIELD-RESEARCH-2026-07.md (not served here)
- openspec/changes/GOVERNANCE-SUBSTRATE-2026-07-31.md (not served here)
- openspec/changes/HARDEN-DISTRIBUTION-AND-SUBSTRATE.md (not served here)
- openspec/changes/KNOWN-LIMITATIONS-2026-07.md (not served here)
- openspec/changes/KOTLIN-TOTAL-SUPPORT-2026-10.md (not served here)
- openspec/changes/PARALLEL-WORK-COORDINATION.md (not served here)
- openspec/changes/README.md (not served here)
- openspec/changes/RELEASE-v2.1.0.md (not served here)
- openspec/changes/RELEASE-v2.1.1.md (not served here)
- openspec/changes/RELEASE-v2.1.2.md (not served here)
- openspec/changes/RELEASE-v2.1.4.md (not served here)
- openspec/changes/RELEASE-v2.1.5.md (not served here)
- openspec/changes/SPEC-STORE-INTEGRATION.md (not served here)
- openspec/changes/STATUS.md (not served here)
- openspec/changes/STRUCTURAL-CONTEXT-PATTERNS.md (not served here)
- openspec/changes/SUBSTRATE-WHITESPACE-2026-07-27.md (not served here)
- openspec/changes/add-agent-loop-hooks-task-created/proposal.md (not served here)
- openspec/changes/add-agent-loop-hooks-task-created/specs/cli/spec.md (not served here)
- openspec/changes/add-agent-loop-hooks-task-created/tasks.md (not served here)
- openspec/changes/add-assumption-anchored-resolutions/proposal.md (not served here)
- openspec/changes/add-assumption-anchored-resolutions/specs/mcp-handlers/spec.md (not served here)
- openspec/changes/add-assumption-anchored-resolutions/tasks.md (not served here)
- openspec/changes/add-behavior-neutral-change-verdict/proposal.md (not served here)
- openspec/changes/add-behavior-neutral-change-verdict/specs/analyzer/spec.md (not served here)
- openspec/changes/add-behavior-neutral-change-verdict/specs/mcp-handlers/spec.md (not served here)
- openspec/changes/add-behavior-neutral-change-verdict/tasks.md (not served here)
- openspec/changes/add-build-graph-ingest/proposal.md (not served here)
- openspec/changes/add-build-graph-ingest/specs/analyzer/spec.md (not served here)
- openspec/changes/add-build-graph-ingest/specs/architecture/spec.md (not served here)
- openspec/changes/add-build-graph-ingest/tasks.md (not served here)
- openspec/changes/add-call-site-usage-profile/proposal.md (not served here)
- openspec/changes/add-call-site-usage-profile/specs/mcp-handlers/spec.md (not served here)
- openspec/changes/add-call-site-usage-profile/tasks.md (not served here)
- openspec/changes/add-callgraph-soundness-calibration/proposal.md (not served here)
- openspec/changes/add-callgraph-soundness-calibration/specs/analyzer/spec.md (not served here)
- openspec/changes/add-callgraph-soundness-calibration/tasks.md (not served here)
- openspec/changes/add-change-provenance-certificate/proposal.md (not served here)
- openspec/changes/add-change-provenance-certificate/specs/mcp-handlers/spec.md (not served here)
- openspec/changes/add-change-provenance-certificate/tasks.md (not served here)
- openspec/changes/add-codeowners-ownership-evidence/proposal.md (not served here)
- openspec/changes/add-codeowners-ownership-evidence/specs/analyzer/spec.md (not served here)
- openspec/changes/add-codeowners-ownership-evidence/specs/mcp-handlers/spec.md (not served here)
- openspec/changes/add-codeowners-ownership-evidence/tasks.md (not served here)
- openspec/changes/add-coverage-map-test-selection/proposal.md (not served here)
- openspec/changes/add-coverage-map-test-selection/specs/analyzer/spec.md (not served here)
- openspec/changes/add-coverage-map-test-selection/tasks.md (not served here)
- openspec/changes/add-data-flow-conclusions/proposal.md (not served here)
- openspec/changes/add-data-flow-conclusions/specs/analyzer/spec.md (not served here)
- openspec/changes/add-data-flow-conclusions/specs/mcp-handlers/spec.md (not served here)
- openspec/changes/add-data-flow-conclusions/tasks.md (not served here)
- openspec/changes/add-datastore-access-graph/proposal.md (not served here)
- openspec/changes/add-datastore-access-graph/specs/mcp-handlers/spec.md (not served here)
- openspec/changes/add-datastore-access-graph/tasks.md (not served here)
- openspec/changes/add-dependency-impact-analysis/proposal.md (not served here)
- openspec/changes/add-dependency-impact-analysis/specs/mcp-handlers/spec.md (not served here)
- openspec/changes/add-dependency-impact-analysis/tasks.md (not served here)
- openspec/changes/add-doc-claim-certification/proposal.md (not served here)
- openspec/changes/add-doc-claim-certification/specs/mcp-handlers/spec.md (not served here)
- openspec/changes/add-doc-claim-certification/tasks.md (not served here)
- openspec/changes/add-effect-purity-inference/proposal.md (not served here)
- openspec/changes/add-effect-purity-inference/specs/analyzer/spec.md (not served here)
- openspec/changes/add-effect-purity-inference/specs/mcp-handlers/spec.md (not served here)
- openspec/changes/add-effect-purity-inference/tasks.md (not served here)
- openspec/changes/add-ffi-boundary-edges/proposal.md (not served here)
- openspec/changes/add-ffi-boundary-edges/specs/analyzer/spec.md (not served here)
- openspec/changes/add-ffi-boundary-edges/tasks.md (not served here)
- openspec/changes/add-flag-impact-analysis/proposal.md (not served here)
- openspec/changes/add-flag-impact-analysis/specs/mcp-handlers/spec.md (not served here)
- openspec/changes/add-flag-impact-analysis/tasks.md (not served here)
- openspec/changes/add-fleet-coordination-arc/proposal.md (not served here)
- openspec/changes/add-fleet-coordination-arc/specs/mcp-handlers/spec.md (not served here)
- openspec/changes/add-fleet-coordination-arc/tasks.md (not served here)
- openspec/changes/add-iac-deploy-binding-commands/proposal.md (not served here)
- openspec/changes/add-iac-deploy-binding-commands/specs/analyzer/spec.md (not served here)
- openspec/changes/add-iac-deploy-binding-commands/tasks.md (not served here)
- openspec/changes/add-incremental-early-cutoff/proposal.md (not served here)
- openspec/changes/add-incremental-early-cutoff/specs/analyzer/spec.md (not served here)
- openspec/changes/add-incremental-early-cutoff/specs/mcp-handlers/spec.md (not served here)
- openspec/changes/add-incremental-early-cutoff/tasks.md (not served here)
- openspec/changes/add-invalidation-receipts/proposal.md (not served here)
- openspec/changes/add-invalidation-receipts/specs/drift/spec.md (not served here)
- openspec/changes/add-invalidation-receipts/tasks.md (not served here)
- openspec/changes/add-knowledge-map-and-coupling-upgrades/proposal.md (not served here)
- openspec/changes/add-knowledge-map-and-coupling-upgrades/specs/analyzer/spec.md (not served here)
- openspec/changes/add-knowledge-map-and-coupling-upgrades/tasks.md (not served here)
- openspec/changes/add-log-anchor-conclusions/proposal.md (not served here)
- openspec/changes/add-log-anchor-conclusions/specs/analyzer/spec.md (not served here)
- openspec/changes/add-log-anchor-conclusions/specs/mcp-handlers/spec.md (not served here)
- openspec/changes/add-log-anchor-conclusions/tasks.md (not served here)
- openspec/changes/add-lsp-evidence-tier/proposal.md (not served here)
- openspec/changes/add-lsp-evidence-tier/specs/mcp-handlers/spec.md (not served here)
- openspec/changes/add-lsp-evidence-tier/tasks.md (not served here)
- openspec/changes/add-merge-semantic-certificate/proposal.md (not served here)
- openspec/changes/add-merge-semantic-certificate/specs/mcp-handlers/spec.md (not served here)
- openspec/changes/add-merge-semantic-certificate/tasks.md (not served here)
- openspec/changes/add-migration-impact-certificate/proposal.md (not served here)
- openspec/changes/add-migration-impact-certificate/specs/mcp-handlers/spec.md (not served here)
- openspec/changes/add-migration-impact-certificate/tasks.md (not served here)
- openspec/changes/add-openspec-proposal-orientation/design.md (not served here)
- openspec/changes/add-openspec-proposal-orientation/proposal.md (not served here)
- openspec/changes/add-openspec-proposal-orientation/specs/cli/spec.md (not served here)
- openspec/changes/add-openspec-proposal-orientation/specs/openspec/spec.md (not served here)
- openspec/changes/add-openspec-proposal-orientation/tasks.md (not served here)
- openspec/changes/add-ownership-tagged-conclusions/proposal.md (not served here)
- openspec/changes/add-ownership-tagged-conclusions/specs/architecture/spec.md (not served here)
- openspec/changes/add-ownership-tagged-conclusions/tasks.md (not served here)
- openspec/changes/add-refactoring-aware-churn/proposal.md (not served here)
- openspec/changes/add-refactoring-aware-churn/specs/analyzer/spec.md (not served here)
- openspec/changes/add-refactoring-aware-churn/tasks.md (not served here)
- openspec/changes/add-resource-lifecycle-conclusions/proposal.md (not served here)
- openspec/changes/add-resource-lifecycle-conclusions/specs/mcp-handlers/spec.md (not served here)
- openspec/changes/add-resource-lifecycle-conclusions/tasks.md (not served here)
- openspec/changes/add-scip-index-interchange/proposal.md (not served here)
- openspec/changes/add-scip-index-interchange/specs/analyzer/spec.md (not served here)
- openspec/changes/add-scip-index-interchange/specs/cli/spec.md (not served here)
- openspec/changes/add-scip-index-interchange/tasks.md (not served here)
- openspec/changes/add-shared-state-hazard-conclusions/proposal.md (not served here)
- openspec/changes/add-shared-state-hazard-conclusions/specs/mcp-handlers/spec.md (not served here)
- openspec/changes/add-shared-state-hazard-conclusions/tasks.md (not served here)
- openspec/changes/add-store-origin-provenance/proposal.md (not served here)
- openspec/changes/add-store-origin-provenance/specs/mcp-handlers/spec.md (not served here)
- openspec/changes/add-store-origin-provenance/tasks.md (not served here)
- openspec/changes/add-structural-search-tool/proposal.md (not served here)
- openspec/changes/add-structural-search-tool/specs/mcp-handlers/spec.md (not served here)
- openspec/changes/add-structural-search-tool/tasks.md (not served here)
- openspec/changes/add-symbol-provenance-conclusions/proposal.md (not served here)
- openspec/changes/add-symbol-provenance-conclusions/specs/mcp-handlers/spec.md (not served here)
- openspec/changes/add-symbol-provenance-conclusions/tasks.md (not served here)
- openspec/changes/add-team-memory-promotion/proposal.md (not served here)
- openspec/changes/add-team-memory-promotion/specs/mcp-handlers/spec.md (not served here)
- openspec/changes/add-team-memory-promotion/tasks.md (not served here)
- openspec/changes/add-test-evidence-claims/.openspec.yaml (not served here)
- openspec/changes/add-test-evidence-claims/design.md (not served here)
- openspec/changes/add-test-evidence-claims/proposal.md (not served here)
- openspec/changes/add-test-evidence-claims/specs/analyzer/spec.md (not served here)
- openspec/changes/add-test-evidence-claims/specs/mcp-handlers/spec.md (not served here)
- openspec/changes/add-test-evidence-claims/tasks.md (not served here)
- openspec/changes/add-verification-feedback-loop/proposal.md (not served here)
- openspec/changes/add-verification-feedback-loop/specs/mcp-handlers/spec.md (not served here)
- openspec/changes/add-verification-feedback-loop/tasks.md (not served here)
- openspec/changes/add-vuln-reachability-triage/proposal.md (not served here)
- openspec/changes/add-vuln-reachability-triage/specs/mcp-handlers/spec.md (not served here)
- openspec/changes/add-vuln-reachability-triage/tasks.md (not served here)
- openspec/changes/adopt-agent-context-interop/proposal.md (not served here)
- openspec/changes/adopt-agent-context-interop/specs/cli/spec.md (not served here)
- openspec/changes/adopt-agent-context-interop/specs/generator/spec.md (not served here)
- openspec/changes/adopt-agent-context-interop/tasks.md (not served here)
- openspec/changes/adopt-mcp-tasks-and-cache-hints/proposal.md (not served here)
- openspec/changes/adopt-mcp-tasks-and-cache-hints/specs/mcp-handlers/spec.md (not served here)
- openspec/changes/adopt-mcp-tasks-and-cache-hints/specs/mcp-quality/spec.md (not served here)
- openspec/changes/adopt-mcp-tasks-and-cache-hints/tasks.md (not served here)
- openspec/changes/adopt-spec-link-status-vocabulary/proposal.md (not served here)
- openspec/changes/adopt-spec-link-status-vocabulary/specs/drift/spec.md (not served here)
- openspec/changes/adopt-spec-link-status-vocabulary/specs/verifier/spec.md (not served here)
- openspec/changes/adopt-spec-link-status-vocabulary/tasks.md (not served here)
- openspec/changes/archive/2026-07-25-add-doc-claim-sync-guards/proposal.md (not served here)
- openspec/changes/archive/2026-07-25-add-doc-claim-sync-guards/specs/mcp-quality/spec.md (not served here)
- openspec/changes/archive/2026-07-25-add-doc-claim-sync-guards/tasks.md (not served here)
- openspec/changes/archive/2026-07-25-add-language-capability-conformance/proposal.md (not served here)
- openspec/changes/archive/2026-07-25-add-language-capability-conformance/specs/analyzer/spec.md (not served here)
- openspec/changes/archive/2026-07-25-add-language-capability-conformance/tasks.md (not served here)
- openspec/changes/archive/2026-07-25-add-stable-nested-function-identity/proposal.md (not served here)
- openspec/changes/archive/2026-07-25-add-stable-nested-function-identity/specs/analyzer/spec.md (not served here)
- openspec/changes/archive/2026-07-25-add-stable-nested-function-identity/tasks.md (not served here)
- openspec/changes/archive/2026-07-25-enforce-conclusion-contract-runtime/proposal.md (not served here)
- openspec/changes/archive/2026-07-25-enforce-conclusion-contract-runtime/specs/mcp-quality/spec.md (not served here)
- openspec/changes/archive/2026-07-25-enforce-conclusion-contract-runtime/tasks.md (not served here)
- openspec/changes/archive/2026-07-25-fix-artifact-output-determinism/proposal.md (not served here)
- openspec/changes/archive/2026-07-25-fix-artifact-output-determinism/specs/analyzer/spec.md (not served here)
- openspec/changes/archive/2026-07-25-fix-artifact-output-determinism/specs/architecture/spec.md (not served here)
- openspec/changes/archive/2026-07-25-fix-artifact-output-determinism/tasks.md (not served here)
- openspec/changes/archive/2026-07-25-fix-cli-conclusion-honesty/proposal.md (not served here)
- openspec/changes/archive/2026-07-25-fix-cli-conclusion-honesty/specs/cli/spec.md (not served here)
- openspec/changes/archive/2026-07-25-fix-cli-conclusion-honesty/tasks.md (not served here)
- openspec/changes/archive/2026-07-25-fix-clone-string-normalization/proposal.md (not served here)
- openspec/changes/archive/2026-07-25-fix-clone-string-normalization/specs/analyzer/spec.md (not served here)
- openspec/changes/archive/2026-07-25-fix-clone-string-normalization/tasks.md (not served here)
- openspec/changes/archive/2026-07-25-fix-export-parser-fidelity/proposal.md (not served here)
- openspec/changes/archive/2026-07-25-fix-export-parser-fidelity/specs/analyzer/spec.md (not served here)
- openspec/changes/archive/2026-07-25-fix-export-parser-fidelity/tasks.md (not served here)
- openspec/changes/archive/2026-07-25-fix-language-detection-single-source/proposal.md (not served here)
- openspec/changes/archive/2026-07-25-fix-language-detection-single-source/specs/analyzer/spec.md (not served here)
- openspec/changes/archive/2026-07-25-fix-language-detection-single-source/tasks.md (not served here)
- openspec/changes/archive/2026-07-25-fix-node-sqlite-engine-floor/proposal.md (not served here)
- openspec/changes/archive/2026-07-25-fix-node-sqlite-engine-floor/specs/cli/spec.md (not served here)
- openspec/changes/archive/2026-07-25-fix-node-sqlite-engine-floor/tasks.md (not served here)
- openspec/changes/archive/2026-07-25-fix-route-anchor-fidelity/proposal.md (not served here)
- openspec/changes/archive/2026-07-25-fix-route-anchor-fidelity/specs/analyzer/spec.md (not served here)
- openspec/changes/archive/2026-07-25-fix-route-anchor-fidelity/tasks.md (not served here)
- openspec/changes/archive/2026-07-25-fix-test-suite-hygiene/proposal.md (not served here)
- openspec/changes/archive/2026-07-25-fix-test-suite-hygiene/specs/project/spec.md (not served here)
- openspec/changes/archive/2026-07-25-fix-test-suite-hygiene/tasks.md (not served here)
- openspec/changes/archive/2026-07-25-harden-artifact-write-atomicity/proposal.md (not served here)
- openspec/changes/archive/2026-07-25-harden-artifact-write-atomicity/specs/architecture/spec.md (not served here)
- openspec/changes/archive/2026-07-25-harden-artifact-write-atomicity/tasks.md (not served here)
- openspec/changes/archive/2026-07-25-harden-call-resolution-ambiguity/proposal.md (not served here)
- openspec/changes/archive/2026-07-25-harden-call-resolution-ambiguity/specs/analyzer/spec.md (not served here)
- openspec/changes/archive/2026-07-25-harden-call-resolution-ambiguity/tasks.md (not served here)
- openspec/changes/archive/2026-07-25-harden-index-store-lifecycle/proposal.md (not served here)
- openspec/changes/archive/2026-07-25-harden-index-store-lifecycle/specs/architecture/spec.md (not served here)
- openspec/changes/archive/2026-07-25-harden-index-store-lifecycle/tasks.md (not served here)
- openspec/changes/archive/2026-07-25-harden-local-http-surfaces/proposal.md (not served here)
- openspec/changes/archive/2026-07-25-harden-local-http-surfaces/specs/mcp-security/spec.md (not served here)
- openspec/changes/archive/2026-07-25-harden-local-http-surfaces/tasks.md (not served here)
- openspec/changes/archive/2026-07-25-harden-runtime-event-resilience/proposal.md (not served here)
- openspec/changes/archive/2026-07-25-harden-runtime-event-resilience/specs/cli/spec.md (not served here)
- openspec/changes/archive/2026-07-25-harden-runtime-event-resilience/specs/mcp-handlers/spec.md (not served here)
- openspec/changes/archive/2026-07-25-harden-runtime-event-resilience/tasks.md (not served here)
- openspec/changes/archive/2026-07-25-harden-serve-descriptor-trust/proposal.md (not served here)
- openspec/changes/archive/2026-07-25-harden-serve-descriptor-trust/specs/mcp-security/spec.md (not served here)
- openspec/changes/archive/2026-07-25-harden-serve-descriptor-trust/tasks.md (not served here)
- openspec/changes/archive/2026-07-25-modularize-call-graph-builder/proposal.md (not served here)
- openspec/changes/archive/2026-07-25-modularize-call-graph-builder/specs/analyzer/spec.md (not served here)
- openspec/changes/archive/2026-07-25-modularize-call-graph-builder/tasks.md (not served here)
- openspec/changes/archive/2026-07-25-optimize-hash-keyed-analyze/proposal.md (not served here)
- openspec/changes/archive/2026-07-25-optimize-hash-keyed-analyze/specs/analyzer/spec.md (not served here)
- openspec/changes/archive/2026-07-25-optimize-hash-keyed-analyze/tasks.md (not served here)
- openspec/changes/archive/2026-07-25-reconcile-substrate-write-face/proposal.md (not served here)
- openspec/changes/archive/2026-07-25-reconcile-substrate-write-face/specs/mcp-quality/spec.md (not served here)
- openspec/changes/archive/2026-07-25-reconcile-substrate-write-face/tasks.md (not served here)
- openspec/changes/archive/2026-07-25-refine-happy-path-and-defaults/proposal.md (not served here)
- openspec/changes/archive/2026-07-25-refine-happy-path-and-defaults/tasks.md (not served here)
- openspec/changes/archive/2026-07-25-restore-spec-corpus-integrity/proposal.md (not served here)
- openspec/changes/archive/2026-07-25-restore-spec-corpus-integrity/specs/openspec/spec.md (not served here)
- openspec/changes/archive/2026-07-25-restore-spec-corpus-integrity/tasks.md (not served here)
- openspec/changes/archive/2026-07-26-optimize-parallel-extraction-pool/proposal.md (not served here)
- openspec/changes/archive/2026-07-26-optimize-parallel-extraction-pool/specs/analyzer/spec.md (not served here)
- openspec/changes/archive/2026-07-26-optimize-parallel-extraction-pool/tasks.md (not served here)
- openspec/changes/archive/2026-07-26-optimize-reachability-precompute/proposal.md (not served here)
- openspec/changes/archive/2026-07-26-optimize-reachability-precompute/specs/analyzer/spec.md (not served here)
- openspec/changes/archive/2026-07-26-optimize-reachability-precompute/specs/mcp-handlers/spec.md (not served here)
- openspec/changes/archive/2026-07-26-optimize-reachability-precompute/tasks.md (not served here)
- openspec/changes/archive/2026-07-27-add-config-schema-validation/proposal.md (not served here)
- openspec/changes/archive/2026-07-27-add-config-schema-validation/specs/config/spec.md (not served here)
- openspec/changes/archive/2026-07-27-add-config-schema-validation/tasks.md (not served here)
- openspec/changes/archive/2026-07-27-add-decision-autopilot/proposal.md (not served here)
- openspec/changes/archive/2026-07-27-add-decision-autopilot/specs/cli/spec.md (not served here)
- openspec/changes/archive/2026-07-27-add-decision-autopilot/specs/mcp-handlers/spec.md (not served here)
- openspec/changes/archive/2026-07-27-add-decision-autopilot/tasks.md (not served here)
- openspec/changes/archive/2026-07-27-add-parse-health-boundary-disclosure/proposal.md (not served here)
- openspec/changes/archive/2026-07-27-add-parse-health-boundary-disclosure/specs/analyzer/spec.md (not served here)
- openspec/changes/archive/2026-07-27-add-parse-health-boundary-disclosure/specs/mcp-handlers/spec.md (not served here)
- openspec/changes/archive/2026-07-27-add-parse-health-boundary-disclosure/tasks.md (not served here)
- openspec/changes/archive/2026-07-27-add-symbol-span-locator/proposal.md (not served here)
- openspec/changes/archive/2026-07-27-add-symbol-span-locator/specs/mcp-handlers/spec.md (not served here)
- openspec/changes/archive/2026-07-27-add-symbol-span-locator/tasks.md (not served here)
- openspec/changes/archive/2026-07-27-add-zero-interaction-onboarding/proposal.md (not served here)
- openspec/changes/archive/2026-07-27-add-zero-interaction-onboarding/specs/cli/spec.md (not served here)
- openspec/changes/archive/2026-07-27-add-zero-interaction-onboarding/tasks.md (not served here)
- openspec/changes/archive/2026-07-27-defer-gryph-runtime-observability/proposal.md (not served here)
- openspec/changes/archive/2026-07-27-defer-panic-blocking-enforcement/proposal.md (not served here)
- openspec/changes/archive/2026-07-27-defer-panic-setup-hooks/proposal.md (not served here)
- openspec/changes/archive/2026-07-27-delegate-lifecycle-scope-decision-sync/proposal.md (not served here)
- openspec/changes/archive/2026-07-27-delegate-lifecycle-scope-decision-sync/specs/architecture/spec.md (not served here)
- openspec/changes/archive/2026-07-27-delegate-lifecycle-scope-decision-sync/specs/openspec/spec.md (not served here)
- openspec/changes/archive/2026-07-27-delegate-lifecycle-scope-decision-sync/tasks.md (not served here)
- openspec/changes/archive/2026-07-27-fix-analyze-native-abort-and-file-cost-budget/proposal.md (not served here)
- openspec/changes/archive/2026-07-27-fix-analyze-native-abort-and-file-cost-budget/specs/analyzer/spec.md (not served here)
- openspec/changes/archive/2026-07-27-fix-analyze-native-abort-and-file-cost-budget/specs/cli/spec.md (not served here)
- openspec/changes/archive/2026-07-27-fix-analyze-native-abort-and-file-cost-budget/tasks.md (not served here)
- openspec/changes/archive/2026-07-27-fix-bm25-identifier-tokenization/proposal.md (not served here)
- openspec/changes/archive/2026-07-27-fix-bm25-identifier-tokenization/specs/analyzer/spec.md (not served here)
- openspec/changes/archive/2026-07-27-fix-bm25-identifier-tokenization/tasks.md (not served here)
- openspec/changes/archive/2026-07-27-fix-cli-output-hygiene/proposal.md (not served here)
- openspec/changes/archive/2026-07-27-fix-cli-output-hygiene/specs/cli/spec.md (not served here)
- openspec/changes/archive/2026-07-27-fix-cli-output-hygiene/tasks.md (not served here)
- openspec/changes/archive/2026-07-27-fix-decision-status-transitions/proposal.md (not served here)
- openspec/changes/archive/2026-07-27-fix-decision-status-transitions/specs/mcp-handlers/spec.md (not served here)
- openspec/changes/archive/2026-07-27-fix-decision-status-transitions/tasks.md (not served here)
- openspec/changes/archive/2026-07-27-fix-default-preset-claims/proposal.md (not served here)
- openspec/changes/archive/2026-07-27-fix-default-preset-claims/specs/cli/spec.md (not served here)
- openspec/changes/archive/2026-07-27-fix-default-preset-claims/tasks.md (not served here)
- openspec/changes/archive/2026-07-27-fix-drift-gate-blindness/proposal.md (not served here)
- openspec/changes/archive/2026-07-27-fix-drift-gate-blindness/specs/drift/spec.md (not served here)
- openspec/changes/archive/2026-07-27-fix-drift-gate-blindness/tasks.md (not served here)
- openspec/changes/archive/2026-07-27-fix-epistemic-lease-weights/proposal.md (not served here)
- openspec/changes/archive/2026-07-27-fix-epistemic-lease-weights/specs/mcp-handlers/spec.md (not served here)
- openspec/changes/archive/2026-07-27-fix-epistemic-lease-weights/tasks.md (not served here)
- openspec/changes/archive/2026-07-27-fix-git-path-quoting/proposal.md (not served here)
- openspec/changes/archive/2026-07-27-fix-git-path-quoting/specs/analyzer/spec.md (not served here)
- openspec/changes/archive/2026-07-27-fix-git-path-quoting/specs/drift/spec.md (not served here)
- openspec/changes/archive/2026-07-27-fix-git-path-quoting/tasks.md (not served here)
- openspec/changes/archive/2026-07-27-fix-pi-parity-drift/proposal.md (not served here)
- openspec/changes/archive/2026-07-27-fix-pi-parity-drift/specs/mcp-quality/spec.md (not served here)
- openspec/changes/archive/2026-07-27-fix-pi-parity-drift/tasks.md (not served here)
- openspec/changes/archive/2026-07-27-fix-redaction-module-gaps/proposal.md (not served here)
- openspec/changes/archive/2026-07-27-fix-redaction-module-gaps/specs/mcp-security/spec.md (not served here)
- openspec/changes/archive/2026-07-27-fix-redaction-module-gaps/tasks.md (not served here)
- openspec/changes/archive/2026-07-27-fix-structural-diff-merge-base/proposal.md (not served here)
- openspec/changes/archive/2026-07-27-fix-structural-diff-merge-base/specs/mcp-handlers/spec.md (not served here)
- openspec/changes/archive/2026-07-27-fix-structural-diff-merge-base/tasks.md (not served here)
- openspec/changes/archive/2026-07-27-fix-update-install-detection/proposal.md (not served here)
- openspec/changes/archive/2026-07-27-fix-update-install-detection/specs/cli/spec.md (not served here)
- openspec/changes/archive/2026-07-27-fix-update-install-detection/tasks.md (not served here)
- openspec/changes/archive/2026-07-27-harden-decision-consolidation/proposal.md (not served here)
Advantages
- Deterministic, local-first operation with no LLM in the hot path ensures consistent, grounded answers. evidence: README.md
- Provides governance guardrails that flag breaking changes and sensitive boundary violations before code is committed. evidence: README.md
- Maintains persistent memory across sessions that survives code renames and refactors. evidence: README.md
- Reduces agent round-trips and costs by providing structural context instead of relying on exploratory file reads. evidence: README.md
Limitations
- Static analysis cannot recover reflective invocations, eval, or dynamic DI/plugin registries with no visible bindings. evidence: README.md
- Small, familiar repositories may experience overhead compared to native agent search. evidence: README.md
- Large monorepos require incremental analysis strategies after the initial full build. evidence: README.md
Security
Risk level: Low risk
This brain runs
Agent instructions that run or fetch something (169)
.claude/commands/first-run-hardening.md:Your job: find and fix the bugs that break a NEW USER's first-run experience — the way earlier passes found "unknown command 'orient'", "--no-embed kills BM25", "watcher EMFILE on target/", and "install never builds the index"..claude/commands/first-run-hardening.md:BUILD FIRST so you test current code, not the published version: `npm run build` → drive `node dist/cli/index.js`, never bare `openlore`/`npx openlore` (those resolve the OLD published version)..claude/commands/first-run-hardening.md:When comparing to published behavior, do it explicitly with `npx --yes openlore@latest` and label it..claude/commands/first-run-hardening.md:Run the REAL first-run flow as a user would, end to end, checking exit codes AND actual output of each step: openlore install # the one-command path.claude/commands/first-run-hardening.md:Also exercise: init → analyze → analyze --no-embed → analyze --force → orient (no task / with task / bad --limit) → install --no-analyze → install --dry-run → install --uninstall → mcp server over stdio (initialize → tools/call orient)..claude/commands/first-run-hardening.md:Idempotency / re-runs: running install or analyze twice must be a clean no-op, not a duplicate or a clobber..claude/commands/first-run-hardening.md:Treat other people's repos as READ-ONLY fixtures: after each dogfood run, remove ALL openlore artifacts (.openlore, openspec/, CLAUDE.md, ARCHITECTURE.md) and `git checkout` any modified .gitignore / settings.json..claude/commands/first-run-hardening.md:Verify the repo is clean (`git status`) before moving on..claude/commands/first-run-hardening.md:Verify honestly: run `npm run typecheck` and `npm run test:run` and report the REAL counts..claude/commands/first-run-hardening.md:confirm with `git rev-list --left-right --count origin/main...main` (want `0 0`) before and after..claude/commands/first-run-hardening.md:Branch pruning: only delete branches already merged into origin/main (verify with `git branch -r --merged origin/main`);AGENTS.md:Before committing code (pre-commit hook via `openlore drift --install-hook`)AGENTS.md:openlore drift --install-hook # Install as git pre-commit hookAGENTS.md:[ ] No spec drift — run `openlore drift` to verify specs match codeAGENTS.md:- Run `openspec validate --all` to verify structureAGENTS.md:- Run `openlore drift --install-hook` to catch future driftAGENTS.md:Always run `openlore analyze` first.AGENTS.md:Or install the Vibe skill (creates `.vibe/skills/openlore.md` as a `/openlore` slash command):AGENTS.md:Because the output limit is 4 096 tokens (vs 16 000 for Claude), generation produces **shorter specs per run**.AGENTS.md:**One domain at a time** — run `openlore generate` with `--domain <name>` so each invocation focuses on a single domain and stays within the output budget.AGENTS.md:**Use the analysis artifacts** — always run `openlore analyze` first;AGENTS.md:**Expect multi-pass generation** — large codebases may require multiple `generate` runs (one per domain) rather than a single all-domains run.AGENTS.md:Then run `openlore decisions --sync` and retry `git commit`.AGENTS.md:**`reason: "approved_not_synced"` — decisions approved but not written to specs:** Run `openlore decisions --sync` then retry `git commit`.AGENTS.md:If yes: run `openlore decisions --consolidate --gate` and handle the result.AGENTS.md:If no: retry with `git commit --no-verify` to skip the gate.AGENTS.md:If yes: run `openlore decisions --consolidate --gate` and handle the result.AGENTS.md:If no: retry with `git commit --no-verify` to skip the gate.CLAUDE.md:CLI: `openlore coverage-gaps` | | "What's the blast radius of my diff before I commit?" | `blast_radius` — one advisory briefing: callers/layers, tests to run, anchored memories/decisions that will drift, stale specs | | "Post a deterministic structural review on a PR" (CLI, no MCP/agen …[+99 chars]CLAUDE.md:Call `orient "<task description>"` (via the openlore MCP server, or `npx openlore orient --json`) **before touching a module you have not yet read in this session**, and when a task spans several modules.CLAUDE.md:re-run `openlore install --preset <name>` to change it and regenerate these instructions.examples/mistral-vibe/skills/openlore-analyze-codebase/SKILL.md:Suggest running `/openlore-plan-refactor` once the user has enough context to act, then `/openlore-execute-refactor` to apply the planexamples/mistral-vibe/skills/openlore-analyze-codebase/SKILL.md:To activate `search_specs`, run `openlore analyze --embed` or `openlore analyze --reindex-specs`.examples/mistral-vibe/skills/openlore-brainstorm/SKILL.md:Using Domain Sketch — structural analysis will be available after `openlore analyze` is run on the first implementation."examples/mistral-vibe/skills/openlore-brainstorm/SKILL.md:- First implementation — run `openlore analyze && openlore generate` afterexamples/mistral-vibe/skills/openlore-debug/SKILL.md:**Prerequisite**: openlore analysis must exist (`openlore analyze` has been run).examples/mistral-vibe/skills/openlore-debug/SKILL.md:If `orient` returns `"error": "no cache"` → run `analyze_codebase` first, then retry.examples/mistral-vibe/skills/openlore-debug/SKILL.md:Run it.examples/mistral-vibe/skills/openlore-debug/SKILL.md:**Apply the fix**, then run the test again.examples/mistral-vibe/skills/openlore-debug/SKILL.md:Run the full test suite.examples/mistral-vibe/skills/openlore-debug/SKILL.md:If the domain spec does not exist yet (`uncovered` from Step 8), note the invariant in the story/issue instead and flag it for the next `openlore generate` run.examples/mistral-vibe/skills/openlore-execute-refactor/SKILL.md:"execute the planned refactoring"examples/mistral-vibe/skills/openlore-execute-refactor/SKILL.md:explicit command `/openlore-execute-refactor`examples/mistral-vibe/skills/openlore-execute-refactor/SKILL.md:**Prerequisite**: the `openlore-plan-refactor` skill must have been run and the plan confirmed.examples/mistral-vibe/skills/openlore-execute-refactor/SKILL.md:If a coverage tool is available, run it on the target file and compare against the coverage baseline in the plan.examples/mistral-vibe/skills/openlore-execute-refactor/SKILL.md:git status # must show: nothing to commit, working tree cleanexamples/mistral-vibe/skills/openlore-execute-refactor/SKILL.md:git log --oneline -1 # note this commit hash — your restore pointexamples/mistral-vibe/skills/openlore-execute-refactor/SKILL.md:For **each change** in the plan, execute the full mini-development cycle below.examples/mistral-vibe/skills/openlore-execute-refactor/SKILL.md:**4 — TEST** Run the test gate from the plan entry.examples/mistral-vibe/skills/openlore-execute-refactor/SKILL.md:Run the full test suite one final time to confirm the refactored state is clean.examples/mistral-vibe/skills/openlore-execute-refactor/SKILL.md:Apply renames one file at a time, run tests after each, and respect the ≤ 50-line edit constraint.**examples/mistral-vibe/skills/openlore-generate/SKILL.md:OpenLore does not validate OpenSpec structure, so run the `openspec validate` follow-up the receipt names.examples/mistral-vibe/skills/openlore-generate/SKILL.md:**If validation cannot run — the CLI is missing, broken, or fails for any reason — say so explicitly and report the spec as NOT validated.** Never present an unvalidated spec as complete;examples/mistral-vibe/skills/openlore-generate/SKILL.md:Finalize: after validation, run `openlore mapping refresh` when shell access is available so the persisted link index matches the spec you wrote.examples/mistral-vibe/skills/openlore-generate/SKILL.md:If you cannot run it, say so explicitly — correctness is unaffected, because audit and Repair re-derive the index in memory, and only the cache is stale.examples/mistral-vibe/skills/openlore-implement-story/SKILL.md:**Prerequisite**: openlore analysis must exist (`openlore analyze` has been run).examples/mistral-vibe/skills/openlore-implement-story/SKILL.md:If `orient` returns `"error": "no cache"` → run `analyze_codebase` first, then retry.examples/mistral-vibe/skills/openlore-implement-story/SKILL.md:| Situation | Approach | |---|---| | `risk_context` present, risk 🟢 < 40 | Skip to Step 3 — use insertion point from context | | `risk_context` present, risk 🟡 40–69 | Run Step 2 impact check, then proceed | | `risk_context` present, risk 🔴 ≥ 70 | Stop — a blocking refactor story mus …[+81 chars]examples/mistral-vibe/skills/openlore-implement-story/SKILL.md:Run `/openlore-execute-refactor` on the blocking function first, or create a blocking refactor task and return to this story once the risk is resolved.examples/mistral-vibe/skills/openlore-implement-story/SKILL.md:Run the `openlore-repair` host skill before implementing.examples/mistral-vibe/skills/openlore-implement-story/SKILL.md:Only run once tests are green.examples/mistral-vibe/skills/openlore-implement-story/SKILL.md:| Drift type | Resolution | |---|---| | `uncovered` on new files | Note it — propose `openlore generate` post-sprint | | `gap` on existing domain | Run the `openlore-repair` host skill | | `stale` | Fix the reference | | No drift | Done |examples/mistral-vibe/skills/openlore-plan-refactor/SKILL.md:To apply the plan, use the `openlore-execute-refactor` skill.examples/mistral-vibe/skills/openlore-plan-refactor/SKILL.md:Each change = one atomic edit → one diff verification → one full test run → ✅ or rollback.examples/mistral-vibe/skills/openlore-plan-refactor/SKILL.md:If a recent analysis already exists, skip unless the user explicitly requests a fresh run.examples/mistral-vibe/skills/openlore-plan-refactor/SKILL.md:| Ecosystem | Command | |---|---| | Node.js | `npm test -- --coverage --collectCoverageFrom="<files>"` | | Python | `pytest --cov=<module> --cov-report=term-missing` | | Rust | `cargo tarpaulin --include-files <files>` | | Go | `go test -cover ./...` |examples/mistral-vibe/skills/openlore-plan-refactor/SKILL.md:**Test gate**: exact test command to run after this changeexamples/mistral-vibe/skills/openlore-plan-refactor/SKILL.md:Workflow: /openlore-plan-refactor → /openlore-execute-refactorexamples/mistral-vibe/skills/openlore-plan-refactor/SKILL.md:- `git diff --stat` shows only the expected filesexamples/mistral-vibe/skills/openlore-plan-refactor/SKILL.md:Hash: <to be filled by the execute workflow>examples/mistral-vibe/skills/openlore-write-tests/SKILL.md:**Prerequisite**: openlore analysis must exist (`openlore analyze` has been run).examples/mistral-vibe/skills/openlore-write-tests/SKILL.md:If `orient` returns `"error": "no cache"` → run `openlore analyze` first, then retry.examples/mistral-vibe/skills/openlore-write-tests/SKILL.md:| File found | Framework | |---|---| | `vitest.config.*`, `vitest.config.ts` | Vitest — runner: `npx vitest run <file>` | | `jest.config.*` | Jest — runner: `npx jest <file>` | | `pytest.ini`, `pyproject.toml` (with `[tool.pytest]`), `setup.cfg` | pytest — runner: `pytest <file> -v` | …[+147 chars]examples/mistral-vibe/skills/openlore-write-tests/SKILL.md:Run the test file with `$TEST_RUNNER`.examples/opencode-skills/openlore-analyze-codebase/SKILL.md:Suggest running `/openlore-plan-refactor` once the user has enough context to act, then `/openlore-execute-refactor` to apply the planexamples/opencode-skills/openlore-analyze-codebase/SKILL.md:To activate `search_specs`, run `openlore analyze --embed` or `openlore analyze --reindex-specs`.examples/opencode-skills/openlore-brainstorm/SKILL.md:Using Domain Sketch — structural analysis will be available after `openlore analyze` is run on the first implementation."examples/opencode-skills/openlore-brainstorm/SKILL.md:- First implementation — run `openlore analyze && openlore generate` afterexamples/opencode-skills/openlore-debug/SKILL.md:**Prerequisite**: openlore analysis must exist (`openlore analyze` has been run).examples/opencode-skills/openlore-debug/SKILL.md:If `orient` returns `"error": "no cache"` → run `analyze_codebase` first, then retry.examples/opencode-skills/openlore-debug/SKILL.md:Run it.examples/opencode-skills/openlore-debug/SKILL.md:**Apply the fix**, then run the test again.examples/opencode-skills/openlore-debug/SKILL.md:Run the full test suite.examples/opencode-skills/openlore-debug/SKILL.md:If the domain spec does not exist yet (`uncovered` from Step 8), note the invariant in the story/issue instead and flag it for the next `openlore generate` run.examples/opencode-skills/openlore-execute-refactor/SKILL.md:"execute the planned refactoring"examples/opencode-skills/openlore-execute-refactor/SKILL.md:explicit command `/openlore-execute-refactor`examples/opencode-skills/openlore-execute-refactor/SKILL.md:**Prerequisite**: the `openlore-plan-refactor` skill must have been run and the plan confirmed.examples/opencode-skills/openlore-execute-refactor/SKILL.md:If a coverage tool is available, run it on the target file and compare against the coverage baseline in the plan.examples/opencode-skills/openlore-execute-refactor/SKILL.md:git status # must show: nothing to commit, working tree cleanexamples/opencode-skills/openlore-execute-refactor/SKILL.md:git log --oneline -1 # note this commit hash — your restore pointexamples/opencode-skills/openlore-execute-refactor/SKILL.md:For **each change** in the plan, execute the full mini-development cycle below.examples/opencode-skills/openlore-execute-refactor/SKILL.md:**4 — TEST** Run the test gate from the plan entry.examples/opencode-skills/openlore-execute-refactor/SKILL.md:Run the full test suite one final time to confirm the refactored state is clean.examples/opencode-skills/openlore-execute-refactor/SKILL.md:Apply renames one file at a time, run tests after each, and respect the ≤ 50-line edit constraint.**examples/opencode-skills/openlore-generate/SKILL.md:OpenLore does not validate OpenSpec structure, so run the `openspec validate` follow-up the receipt names.examples/opencode-skills/openlore-generate/SKILL.md:**If validation cannot run — the CLI is missing, broken, or fails for any reason — say so explicitly and report the spec as NOT validated.** Never present an unvalidated spec as complete;examples/opencode-skills/openlore-generate/SKILL.md:Finalize: after validation, run `openlore mapping refresh` when shell access is available so the persisted link index matches the spec you wrote.examples/opencode-skills/openlore-generate/SKILL.md:If you cannot run it, say so explicitly — correctness is unaffected, because audit and Repair re-derive the index in memory, and only the cache is stale.examples/opencode-skills/openlore-implement-story/SKILL.md:**Prerequisite**: openlore analysis must exist (`openlore analyze` has been run).examples/opencode-skills/openlore-implement-story/SKILL.md:If `orient` returns `"error": "no cache"` → run `analyze_codebase` first, then retry.examples/opencode-skills/openlore-implement-story/SKILL.md:| Situation | Approach | |---|---| | `risk_context` present, risk 🟢 < 40 | Skip to Step 3 — use insertion point from context | | `risk_context` present, risk 🟡 40–69 | Run Step 2 impact check, then proceed | | `risk_context` present, risk 🔴 ≥ 70 | Stop — a blocking refactor story mus …[+81 chars]examples/opencode-skills/openlore-implement-story/SKILL.md:Run `/openlore-execute-refactor` on the blocking function first, or create a blocking refactor task and return to this story once the risk is resolved.examples/opencode-skills/openlore-implement-story/SKILL.md:Run the `openlore-repair` host skill before implementing.examples/opencode-skills/openlore-implement-story/SKILL.md:Only run once tests are green.examples/opencode-skills/openlore-implement-story/SKILL.md:| Drift type | Resolution | |---|---| | `uncovered` on new files | Note it — propose `openlore generate` post-sprint | | `gap` on existing domain | Run the `openlore-repair` host skill | | `stale` | Fix the reference | | No drift | Done |examples/opencode-skills/openlore-plan-refactor/SKILL.md:To apply the plan, use the `openlore-execute-refactor` skill.examples/opencode-skills/openlore-plan-refactor/SKILL.md:Each change = one atomic edit → one diff verification → one full test run → ✅ or rollback.examples/opencode-skills/openlore-plan-refactor/SKILL.md:If a recent analysis already exists, skip unless the user explicitly requests a fresh run.examples/opencode-skills/openlore-plan-refactor/SKILL.md:| Ecosystem | Command | |---|---| | Node.js | `npm test -- --coverage --collectCoverageFrom="<files>"` | | Python | `pytest --cov=<module> --cov-report=term-missing` | | Rust | `cargo tarpaulin --include-files <files>` | | Go | `go test -cover ./...` |examples/opencode-skills/openlore-plan-refactor/SKILL.md:**Test gate**: exact test command to run after this changeexamples/opencode-skills/openlore-plan-refactor/SKILL.md:Workflow: /openlore-plan-refactor → /openlore-execute-refactorexamples/opencode-skills/openlore-plan-refactor/SKILL.md:- `git diff --stat` shows only the expected filesexamples/opencode-skills/openlore-plan-refactor/SKILL.md:Hash: <to be filled by the execute workflow>examples/opencode-skills/openlore-write-tests/SKILL.md:**Prerequisite**: openlore analysis must exist (`openlore analyze` has been run).examples/opencode-skills/openlore-write-tests/SKILL.md:If `orient` returns `"error": "no cache"` → run `openlore analyze` first, then retry.examples/opencode-skills/openlore-write-tests/SKILL.md:| File found | Framework | |---|---| | `vitest.config.*`, `vitest.config.ts` | Vitest — runner: `npx vitest run <file>` | | `jest.config.*` | Jest — runner: `npx jest <file>` | | `pytest.ini`, `pyproject.toml` (with `[tool.pytest]`), `setup.cfg` | pytest — runner: `pytest <file> -v` | …[+147 chars]examples/opencode-skills/openlore-write-tests/SKILL.md:Run the test file with `$TEST_RUNNER`.skills/openlore-analyze-codebase/SKILL.md:Suggest running `/openlore-plan-refactor` once the user has enough context to act, then `/openlore-execute-refactor` to apply the planskills/openlore-analyze-codebase/SKILL.md:To activate `search_specs`, run `openlore analyze --embed` or `openlore analyze --reindex-specs`.skills/openlore-brainstorm/SKILL.md:Using Domain Sketch — structural analysis will be available after `openlore analyze` is run on the first implementation."skills/openlore-brainstorm/SKILL.md:- First implementation — run `openlore analyze && openlore generate` afterskills/openlore-debug/SKILL.md:**Prerequisite**: openlore analysis must exist (`openlore analyze` has been run).skills/openlore-debug/SKILL.md:If `orient` returns `"error": "no cache"` → run `analyze_codebase` first, then retry.skills/openlore-debug/SKILL.md:Run it.skills/openlore-debug/SKILL.md:**Apply the fix**, then run the test again.skills/openlore-debug/SKILL.md:Run the full test suite.skills/openlore-debug/SKILL.md:If the domain spec does not exist yet (`uncovered` from Step 8), note the invariant in the story/issue instead and flag it for the next `openlore generate` run.skills/openlore-execute-refactor/SKILL.md:"execute the planned refactoring"skills/openlore-execute-refactor/SKILL.md:explicit command `/openlore-execute-refactor`skills/openlore-execute-refactor/SKILL.md:**Prerequisite**: the `openlore-plan-refactor` skill must have been run and the plan confirmed.skills/openlore-execute-refactor/SKILL.md:If a coverage tool is available, run it on the target file and compare against the coverage baseline in the plan.skills/openlore-execute-refactor/SKILL.md:git status # must show: nothing to commit, working tree cleanskills/openlore-execute-refactor/SKILL.md:git log --oneline -1 # note this commit hash — your restore pointskills/openlore-execute-refactor/SKILL.md:For **each change** in the plan, execute the full mini-development cycle below.skills/openlore-execute-refactor/SKILL.md:**4 — TEST** Run the test gate from the plan entry.skills/openlore-execute-refactor/SKILL.md:Run the full test suite one final time to confirm the refactored state is clean.skills/openlore-execute-refactor/SKILL.md:Apply renames one file at a time, run tests after each, and respect the ≤ 50-line edit constraint.**skills/openlore-generate/SKILL.md:OpenLore does not validate OpenSpec structure, so run the `openspec validate` follow-up the receipt names.skills/openlore-generate/SKILL.md:**If validation cannot run — the CLI is missing, broken, or fails for any reason — say so explicitly and report the spec as NOT validated.** Never present an unvalidated spec as complete;skills/openlore-generate/SKILL.md:Finalize: after validation, run `openlore mapping refresh` when shell access is available so the persisted link index matches the spec you wrote.skills/openlore-generate/SKILL.md:If you cannot run it, say so explicitly — correctness is unaffected, because audit and Repair re-derive the index in memory, and only the cache is stale.skills/openlore-implement-story/SKILL.md:**Prerequisite**: openlore analysis must exist (`openlore analyze` has been run).skills/openlore-implement-story/SKILL.md:If `orient` returns `"error": "no cache"` → run `analyze_codebase` first, then retry.skills/openlore-implement-story/SKILL.md:| Situation | Approach | |---|---| | `risk_context` present, risk 🟢 < 40 | Skip to Step 3 — use insertion point from context | | `risk_context` present, risk 🟡 40–69 | Run Step 2 impact check, then proceed | | `risk_context` present, risk 🔴 ≥ 70 | Stop — a blocking refactor story mus …[+81 chars]skills/openlore-implement-story/SKILL.md:Run `/openlore-execute-refactor` on the blocking function first, or create a blocking refactor task and return to this story once the risk is resolved.skills/openlore-implement-story/SKILL.md:Run the `openlore-repair` host skill before implementing.skills/openlore-implement-story/SKILL.md:Only run once tests are green.skills/openlore-implement-story/SKILL.md:| Drift type | Resolution | |---|---| | `uncovered` on new files | Note it — propose `openlore generate` post-sprint | | `gap` on existing domain | Run the `openlore-repair` host skill | | `stale` | Fix the reference | | No drift | Done |skills/openlore-orient/SKILL.md:This is the lowest-latency path and gives the model access to whatever tool surface the server was wired with — the lean 10-tool `navigation` preset by default (`openlore install --preset full` wires all 62), not just `orient`.skills/openlore-orient/SKILL.md:bash scripts/orient.sh "<task description>"skills/openlore-orient/SKILL.md:The wrapper tries the direct CLI subcommand first (`npx --yes openlore orient --json --task "<task>"`) and falls back to driving the `openlore mcp` server over stdio JSON-RPC via the sibling `orient-via-mcp.mjs` helper on older openlore versions that predate the CLI subcommand.skills/openlore-orient/SKILL.md:Run `npx openlore analyze` once to seed the graph, then retry.skills/openlore-orient/SKILL.md:Re-run `npx openlore analyze` to rebuild.skills/openlore-plan-refactor/SKILL.md:To apply the plan, use the `openlore-execute-refactor` skill.skills/openlore-plan-refactor/SKILL.md:Each change = one atomic edit → one diff verification → one full test run → ✅ or rollback.skills/openlore-plan-refactor/SKILL.md:If a recent analysis already exists, skip unless the user explicitly requests a fresh run.skills/openlore-plan-refactor/SKILL.md:| Ecosystem | Command | |---|---| | Node.js | `npm test -- --coverage --collectCoverageFrom="<files>"` | | Python | `pytest --cov=<module> --cov-report=term-missing` | | Rust | `cargo tarpaulin --include-files <files>` | | Go | `go test -cover ./...` |skills/openlore-plan-refactor/SKILL.md:**Test gate**: exact test command to run after this changeskills/openlore-plan-refactor/SKILL.md:Workflow: /openlore-plan-refactor → /openlore-execute-refactorskills/openlore-plan-refactor/SKILL.md:- `git diff --stat` shows only the expected filesskills/openlore-plan-refactor/SKILL.md:Hash: <to be filled by the execute workflow>skills/openlore-repair/SKILL.md:OpenLore does not validate OpenSpec structure, so run the `openspec validate` follow-up the receipt names.skills/openlore-repair/SKILL.md:**If validation cannot run — the CLI is missing, broken, or fails for any reason — say so explicitly and report the spec as NOT validated.** Never present an unvalidated edit as complete;skills/openlore-repair/SKILL.md:Finalize: after validation, run `openlore mapping refresh` when shell access is available so the persisted link index matches the spec you edited.skills/openlore-repair/SKILL.md:If you cannot run it, say so explicitly — correctness is unaffected, because audit and Repair re-derive the index in memory, and only the cache is stale.skills/openlore-write-tests/SKILL.md:**Prerequisite**: openlore analysis must exist (`openlore analyze` has been run).skills/openlore-write-tests/SKILL.md:If `orient` returns `"error": "no cache"` → run `openlore analyze` first, then retry.skills/openlore-write-tests/SKILL.md:| File found | Framework | |---|---| | `vitest.config.*`, `vitest.config.ts` | Vitest — runner: `npx vitest run <file>` | | `jest.config.*` | Jest — runner: `npx jest <file>` | | `pytest.ini`, `pyproject.toml` (with `[tool.pytest]`), `setup.cfg` | pytest — runner: `pytest <file> -v` | …[+147 chars]skills/openlore-write-tests/SKILL.md:Run the test file with `$TEST_RUNNER`.
Package scripts (1)
package.json(postinstall):node scripts/postinstall.mjs
- Low risk: network-instructions (.claude/commands/first-run-hardening.md:21)
- Low risk: scripts-present (bench/retrieval/run.ts)
- Low risk: scripts-present (bench/run.ts)
- Low risk: autonomy-phrase (examples/mistral-vibe/skills/openlore-execute-refactor/SKILL.md:240)
- Low risk: autonomy-phrase (examples/opencode-skills/openlore-execute-refactor/SKILL.md:240)
- Low risk: scripts-present (scripts/api-consumer-smoke.mjs)
- Low risk: scripts-present (scripts/copy-assets.mjs)
- Low risk: scripts-present (scripts/postinstall.mjs)
- Low risk: autonomy-phrase (skills/openlore-execute-refactor/SKILL.md:240)
- Low risk: network-instructions (skills/openlore-orient/SKILL.md:37)
- Low risk: scripts-present (skills/openlore-orient/scripts/orient.sh)
Attribution and licence
- Created by
- Clay Good
- Declared authors
- Clay Good (declared in package.json)
- Publisher
- Clay Good (Community)
- Source
- clay-good/OpenLore · commit c45c2ca
- Licence
- MIT License (files served here)
- ATTRIBUTION.md (written by AutoGineer)
- Synced
AutoGineer is not affiliated with or endorsed by Clay Good.
Install from source
450 of its files are not served here, so there is no ZIP. clay-good/OpenLore at c45c2ca