Deterministic, local-first memory and guardrails for AI coding agents with no LLM in the hot path.
$ npx -y skills add clay-good/OpenLore --agent claude-code
AI coding agents are powerful but 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. It runs a one-time static analysis of your repo and keeps a live knowledge graph — call structure, types, tests, decisions, IaC, spec drift. Your agent queries it to start every task already oriented and to certify a change before it lands. It's deterministic and local-first — no LLM in the hot path — so the same question always returns the same grounded answer, and the agent is told when a fact goes stale instead of served a confident guess.
npm install -g openlore && openlore install
That one command auto-detects your agent (Claude Code, Cursor, Cline, Continue, Pi, AGENTS.md), wires it to call orient() automatically, registers the MCP server, and builds the index — no API key, no config, no questions. Then ask your agent:
orient("add a payment method")
…and it begins already knowing the relevant functions, their callers, matching specs, tests, and the risk of changing each — in a single call.
Zero config, everything discoverable. Core value needs no keys. Run
openlore featuresto see every opt-in capability (embeddings, the commit gate, the spec store…), whether it's active, and the one command to turn it on.
Two things, both deterministic and local — OpenLore remembers your architecture so every task starts oriented, and governs what the agent changes before it lands.
🧠 Memory — start every task already oriented
orient(task) returns the relevant functions, their callers, matching specs, tests, and insertion points in a single call (~430µs p50 on a 15k-node graph) — instead of a dozen exploratory file reads.🛡️ Governance — guardrails on what the agent changes
certify_public_surface classifies every changed export breaking / non-breaking / potentially-breaking and names the consumers each break hits. Conservative — never silently "safe."change_impact_certificate flags when a diff opens a new path into a boundary you declared (reachable after the change, not before).verify_claim returns confirmed / refuted / unverifiable with a citation, before an agent asserts "X is dead" or "Y is safe to change."openlore enforce blocks on findings you mark blocking, new debt under frozen, or an unverifiable frozen baseline. Advisory by default, no API key.Full guardrail table with commands: Governance.
📊 Honest by construction — −26% agent round-trips on deep traces in large repos, with the losses published next to the wins. Every public claim traces to a command you can run.
The same task, twice. Ask an agent to add a flag to a command it has never seen:
| Without OpenLore | With OpenLore | |
|---|---|---|
| Opening move | grep a guessed name → open a file → wrong layer → open three more | orient("add a --since flag to the blast-radius command") |
| What it learns | file contents, one at a time, in whatever order it guessed | the functions, their callers, the matching specs, and the ranked insertion points — in one call |
| What it misses | the five callers living in files it never opened | every caller the graph can see |
| Before it commits | "looks right to me" | blast_radius → tests to run; certify_public_surface → the consumers this change breaks, by name |
The measured effect on deep, multi-hop tasks: 25 → 16 round-trips on excalidraw, −26% aggregate. Not magic — the difference between rediscovering structure per task and querying it. Full numbers, including where it doesn't pay off: Does it pay for itself?
Real output — openlore orient --json "add a --since flag to the blast-radius command", run on this repo (abridged):
{
"relevantFiles": ["src/cli/commands/blast-radius.ts", "src/core/services/mcp-handlers/blast-radius.ts"],
"relevantFunctions": [
{ "name": "computeBlastRadius", "filePath": "src/core/services/mcp-handlers/blast-radius.ts",
"signature": "async function computeBlastRadius(input: BlastRadiusInput): Promise<BlastRadiusBriefing>",
"fanIn": 5, "isHub": true, "language": "TypeScript" }
],
"callPaths": [
{ "function": "computeBlastRadius",
"callers": ["handleBlastRadius", "computeImpactCertificate", "runBlastRadiusCli",
"composeReview", "collectGovernanceFindings"] }
],
"insertionPoints": [
{ "rank": 2, "name": "computeBlastRadius", "role": "hub", "strategy": "cross_cutting_hook",
"reason": "computeBlastRadius is called by 5 functions -- adding logic here affects the entire callsite surface." }
],
"suggestedTools": ["record_decision", "analyze_impact", "get_subgraph", "check_spec_drift"]
}
The agent knows exactly where to look, what it touches, and what's risky to touch — before reading a single file. Every field is computed from the graph; nothing is inferred by a model.
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 agent benchmark (claude -p, sonnet, N=4 medians, pinned SHAs), measured 2026-06-01.
| Scenario | Cost Δ | Round-trips Δ | Correctness | Verdict |
|---|---|---|---|---|
| Large/unfamiliar repo · deep "how does X flow through Y" (its target) | −7% to −21% | −26% | 100% = 100% | ✅ helps — and the win grows with repo size |
| Small/familiar repo · shallow "who calls X" | task-dependent (Round 1: +43%) | +38% | 100% = 100% | ❌ often adds overhead — measure first |
Re-confirmed live 2026-06-03 (N=2): the deep-task win reproduces (okhttp −13%). The small/familiar case is task-dependent, not a flat loss — same repo class, opposite outcomes (chalk −32% win vs. express +59% loss). Don't guess from our repos — run
openlore proveon yours.
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 |
Prove it on your repo — no API key.
openlore prove --estimateprojects the orientation tax from your own call graph in seconds (zero API key, zero network) when at least one function has 2 direct callers; sparse repos get the measured count and can skip the projection. Plainopenlore proveruns the full measured WITH/WITHOUT pass (needsclaude+ a key). Add--json,--markdown(a paste-ready scorecard + README badge), or--save.
Honesty contract. We never publish a savings number the benchmark didn't produce, we always show the losses next to the wins, and every token claim traces to a command you can run here. Full methodology: docs/AGENT-BENCHMARKS.md.
The fastest way to evaluate a tool is to find out quickly that it isn't for you. So:
| ✅ 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. Anywhere "the agent changed something it shouldn't have" is a real cost. |
| 🤔 Try it, but measure | Mid-size repos and mixed workloads. The win scales with size and depth — run openlore prove --estimate (seconds, no key) before you commit. |
openlore is a Claude Code plugin with 11 hand-picked skills, indexed on Flowy in the Agent Memory category. Install it with the command on its page. It includes openlore-analyze-codebase, openlore-brainstorm, openlore-debug. Its skills do not fire on their own yet. Request auto-invocation to have Flowy route them as you prompt. Free and open source.
Is this plugin yours?
Claim it with GitHubSubmit a pluginPromote it