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
CHANGELOG.md
Changelog
All notable changes to OpenLore are documented here. This project adheres to Semantic Versioning.
[Unreleased]
[3.6.0] - 2026-11-09
The graph learns your service contracts, and the agent loop leaves receipts.
OpenLore now reads your service contracts — OpenAPI, protobuf, and GraphQL — into the same call graph as your code, binds handlers and generated clients to the operations they serve and call, and grades a contract change against its real consumers, including those in sibling repositories. The agent loop gained receipts that arrive when you can act on them, a session ledger, cross-worktree coordination, and new verifiable claim kinds. Infrastructure definitions are bound to the code they run, and onboarding keeps the index current in the background. Everything is additive and behind existing or opt-in presets; the default tool surface and your configuration are unchanged.
The service-contract graph
certify_service_contractgrades an OpenAPI 3.x / Swagger 2.0, protobuf (proto3), or GraphQL change against the code: two-way parity with the indexed handlers, a closed-table breaking/dangerous verdict per changed element, each joined to the in-repo clients it breaks and the tests that reach them, and a suggested version bump withheld when compatibility cannot be proven. (#639, #659, #687, #688)Declared operations, messages, and named schemas are graph nodes, bound to the handler that serves each (
implements_endpoint) and the function that calls it (consumes_endpoint), soorient,analyze_impact, andget_subgraphcross the API boundary. Matching is literal — an ambiguous address binds nothing and says so. (#660, #682, #687, #688)A generated client is bound to the operations it calls by
operationId, read from a header that names its source spec — never a name match alone. (#680)Consumers in sibling repositories are censused with
--federation, so a breaking verdict is not read as safe just because this repository has no caller. (#681)orientnames the contract of a handler in scope — operation, specfile:line, required parameters and body — unasked, andblast_radiusbriefs a spec-only diff on the elements it declares and who serves and consumes them. (#655, #679)A literal request body missing a required property is reported and carried in
verify_change. (#656, #658)
The agent loop leaves receipts
Loop hooks push OpenLore's receipts at the moments a harness offers — after an edit, after a compaction, before stopping, at sub-agent start, and before a write — in Claude Code, Codex, and Pi. (#637, #649, #650, #651, #652, #654)
A session ledger names the symbol that changed under you, tells a background change from your own edit, tracks declared operations and resources like code symbols, and counts how the session's symbols changed. (#636, #657, #661)
Weakened checks, invented references, and hand-edited generated files are reported on a diff — deleted or skipped tests and relaxed gates, an import or package that does not exist, an edit a regenerate will overwrite. (#629, #632, #634)
get_handoff_briefingstates the in-flight change so a compaction or a new session does not lose it, and lease tokens let any process askverify_claimwhether what it was served still holds. (#638, #644)verify_claimgainsendpoint-implemented,endpoint-consumed,decision-governed, andlease-current, and answersunverifiable(naming the disagreement) rather than a confident "no". (#642)
Infrastructure bound to the code it runs
Function resources are bound to their handlers (
deploys_symbol) across Terraform, CloudFormation/SAM, and Serverless, andorientnames the infrastructure a deployed handler depends on — the resource that runs it and the sites that set each variable it reads. Serverless Framework joins the supported ecosystems (13 in all). (#640, #645, #662)
Coordination across worktrees
A shared footprint board across every worktree of a clone shows who is about to write which symbols, with hazard-typed conflicts and duplicate-intent detection; peer-change notices fire when another agent touches what you read; and
plan_parallel_workcan plan against the live agents on the board. (#641, #646, #647, #648)
Onboarding and the background
OpenLore sets itself up and stays current in the background: a cold start builds the index, a stale one repairs itself (judged by content, not file mtimes), and the first touch is disclosed once rather than read as a broken install. (#630, #631)
An OpenSpec
proposeprompt is grounded in repository structure before drafting, and Claude Code gets a color-coded OpenLore status line. (#622, #623)Local semantic vectors build 8–10x faster. (#633)
Breaking and behavior changes
Minimum Node.js is now 22.22 (
^22.22.0 || >=23.5.0), matching the file watcher's floor (chokidar 6); 22.19–22.21 exits with code 78 and asks you to upgrade. (#620)The Pi repository digest is on-demand. The Pi extension no longer appends the architecture digest to every turn; call
openlore_orientwhen you have a task, or set"pi": { "contextMode": "full" }to restore the previous every-turn injection. (#623)Removed the OpenSpec plugin manifest (
plugin-manifest); the host side was never built. (#692)
Fixed
A failed command prints one legible line, not a V8 stack trace;
installpreserves anmcpServers.openloreentry it did not write, no longer edits your pre-commit hook, and describes a refusal by its cause. (#671, #695)Rust tests are detected from their attributes (
#[test],#[tokio::test], …), andorientnever offers a test function as an insertion point or prescribes a tool the wired preset does not expose. (#674)A watcher save no longer drops the projected contract and deploy edges, one unreadable manifest no longer erases the whole infrastructure graph, and an infrastructure declaration is never served as code (a hub, an entry point, or a term in the fan-in/fan-out averages).
Over-budget answers keep a fair share of every list and no longer overwrite a tool's own disclosure. (#663)
Large composite literals extract in linear time, so a generated
.pb.gono longer stallsanalyze. (#708)analyze's console output is bounded and no longer leaks library warnings. (#700)certify_provenance's in-toto envelope is validated against the Statement v1 shape, with its structural-only scope stated plainly. (#707)A Pi daemon left by an older version recovers, and the vocabulary cache is keyed on its content. (#621, #653)
The new contract-graph, verification, and coordination capabilities ship behind opt-in presets
(full, verify, coordination, federation); the default tool surface is unchanged. The index
schema version is now 17, so the first run after upgrading rebuilds the graph in the background. The
only compatibility change is the raised Node.js floor noted above.
[3.5.0] - 2026-10-25
The index heals itself, and every change comes with a receipt.
An always-on, self-healing index. A call-graph index that is stale, empty, reset by a version upgrade, truncated, or otherwise unservable now rebuilds itself automatically in the background — on a new or upgraded install, a new or an old repo, and across every surface: the Claude Code hooks, the MCP server, and the Pi
servedaemon. Agents are served accurate structure instead of silently falling back to grep, with no manualopenlore analyze. This closes a family of "detected but never repaired" gaps where the problem was disclosed every turn but never fixed. (#616, #614, #609, #600)verify_change— one actionable receipt for a working-tree diff, composing blast radius, the tests to run, and spec drift into a single verdict. (#605)certify_provenance— a reproducible, content-addressed, in-toto-attachable record of what a change did semantically, not just which bytes moved. (#608)certify_merge— a semantic merge-conflict certificate: what a merge actually changes, beyond a textual three-way. (#610)fleet_status— drift-aware verification memory across a fleet of repositories, completing the coordination arc. (#611)Precision-order soundness calibration for the call graph — a monotone-refinement checker and builder resolution toggles that keep structural conclusions an honest lower bound. (#604)
Docs: the README is rewritten shorter and evergreen, and the documentation set curated. (#615)
Internal hardening: backlog and roadmap consolidation, end-to-end tests for the new tools on real graphs, a
certify_mergeperformance pass, and routine dependency updates.
The new verification and coordination tools (verify_change, certify_provenance,
certify_merge, fleet_status) ship in the opt-in verify / coordination presets. No breaking
changes.
[3.4.0] - 2026-10-18
Memories now speak up when they matter, and check their own facts.
Memories come to you.
remembertakes an optionaltrigger(fileGlob,symbolPattern,specDomain, orwithinHops) andpinned: true. Matching notes are pushed intoorient,blast_radius, andworking_set_context, and into the prompt-hook and Pi injection blocks, each with the predicate that fired. A note like "every handler undersrc/routes/validates input" now reaches the agent working there without anyone asking for it. (#585, #586)Memories that stay true, or say they are not. An anchor can name a
span, exact text inside a function, so an edit elsewhere in a 200-line function no longer drifts a note about one line. A note can rest onclaimsinverify_claim's grammar;recallchecks them again and moves a note whose claim is now false toevidenceRefuted. A lost or ambiguous anchor is amemory-anchor-lostfinding thatopenlore enforcecan gate on. (#589, #591)Messages are hops, not dead ends. A tagged send such as
send({ type: "restart" })is paired with theswitchcase orifthat handles it, sofind_path,analyze_impact,blast_radius, andorientfollow client/server, IPC, and Redux-style flows. A send with no handler becomes a disclosed boundary.trace_execution_path,orient,blast_radius, andselect_testsnow label every hop that a synthesized edge realizes. (#580, #581)Catch new calls into deprecated code. OpenLore reads the standard
@deprecatedand GoDeprecated:markers, andstructural_difflists the calls a diff adds into them. TS/JS functions also keep their JSDoc text now: 505 of 505 documented handlers, up from 215. (#592, #593)See which way complexity is going.
get_health_maplabels each hotspotrising,falling,flat, ormixedfrom its git history, and a rising hotspot is an advisorydeclining-healthfinding. Shallow history is withheld, not guessed. (#594)Smoother install and upgrade. One-shot
orient(the agent hooks, a new worktree) builds a missing index in the background.openlore updatehandles npm-global installs under Homebrew and checks the version on PATH after an upgrade, Homebrew installs survivebrew upgrade, anddoctorgains an install-health check. User-wide defaults in~/.openlore/config.jsonare shared by the CLI, MCP, and Pi, and Pi no longer opens a configuration dialog at startup. (#570, #572–#576)
Also hardened git, MCP, commit gates, and path confinement from a two-round audit, including a code
execution path through partial-clone fetches and a trace_execution_path call that could freeze
the server (#579). Analysis no longer stalls on binary files named like source (#583), TypeScript
abstract classes are recognized (#582), analyze forwards SIGTERM to its re-exec child (#584), and
enforce no longer renames a torn decision store (#590). Applied routine dependency updates.
Upgrade: npm i -g [email protected] — or openlore update. The index schema changed, so the
next openlore analyze rebuilds the index once.
Full Changelog: https://github.com/clay-good/OpenLore/compare/v3.3.1...v3.4.0
[3.3.1] - 2026-10-10
Kotlin files now show up on the map.
Kotlin joins the file graph. OpenLore now reads the package, imports, and package-level declarations of
.ktand.ktsfiles. Before, a Kotlin file had no imports, no exports, and no import edges. Imports resolve by declared package, not by directory, and Kotlin and Java files resolve each other. A wildcard import reaches only the files whose names the importer uses; a name declared in two files reaches nothing and is counted as ambiguous, never guessed. Exports follow visibility: public is listed,internalis tagged,privateis left out. (#546)An unreadable index says so. When the index exists but cannot be served, MCP tools now diagnose the cause instead of reporting that no analysis was found.
Also cleared dependency advisories in proxy-addr, sharp, source-map-js, fast-uri,
brace-expansion, and braces, and applied routine dependency updates.
Upgrade: npm i -g [email protected] — or openlore update.
Full Changelog: https://github.com/clay-good/OpenLore/compare/v3.3.0...v3.3.1
[3.3.0] - 2026-09-20
The map now checks the weather before giving directions.
Search with its confidence showing. Retrieval-backed answers say whether the evidence is
covered,weak, oruncovered. An uncovered search no longer presents a ranked list as an answer; weak insertion-point matches no longer come with editing advice. When the index trails your working tree,search_codeandlocate_symbol_spancan use bounded, freshly read symbols, including ones added since the last index build.Ask what the index is actually serving.
openlore statusreports the retrieval mode, build time, and staleness.doctordistinguishes a healthy embedding endpoint from an index with no vectors, while index reuse checks the capability it really has. Lock contention now names the holder and exits with an error instead of quietly producing a keyword index.Connect specs to evidence. Audits can trace scenarios to reachable tests and flag scenarios without an observable outcome. A reachable test is evidence of a path, not a claim that every assertion has been proved.
Keep change analysis close to the edit. Change-oriented tools seed from the symbols that actually changed, so edits in a busy file do not make every neighbor look relevant.
doctoralso names oversized analysis corpora before a build, and fingerprint budget reports name the paths that consumed the budget.Give Pi a useful first glance. Its footer shows whether OpenLore is ready, building, or degraded. Pi now starts with the lean tool set;
openlore_activate_toolsopens other groups on demand. To keep every tool active from the start, set"pi": { "toolSurface": "all" }in.openlore/config.json.Make governance practical.
openlore decisions recordlets CLI-only setups record decisions. Public-surface checks can accept an intentional break with a justification and distinguish changes used by indexed consumers from those with no indexed consumer.
Also fixed npm-aware update checks, Dart and Elixir call detection, and decision sync edge cases.
Upgrade: npm i -g [email protected] — or openlore update.
Full Changelog: https://github.com/clay-good/OpenLore/compare/v3.2.0...v3.3.0
[3.2.0] - 2026-09-13
The release where OpenLore checks the locks before reading the map.
See collisions before they land. In-flight work now gets a real Git textual-merge verdict, and changed or newly added tests are always selected with a plain-language reason.
Find more of the code that actually runs. Framework entry points, literal dispatch tables, and config-wired files now participate in reachability instead of looking accidentally dead.
Make governance portable. Public-surface checks emit stable finding codes, recommend the appropriate SemVer bump, and can export SARIF for code-scanning workflows.
Give agents a better-sized map.
orientfits its entire answer to the requested token budget, while generated spec links are checked against structural evidence before they are presented.Treat a repository like input, not a houseguest. Git execution, network egress, symlinks, artifact reads, terminal output, MCP arguments, regex cost, and trust labels all gained stricter fail-closed boundaries. Dependabot is clear and the reviewed intentional-egress alerts are closed.
No breaking changes. Existing commands and configuration remain compatible with 3.1.x.
Upgrade: npm i -g [email protected] — or openlore update.
Full Changelog: https://github.com/clay-good/OpenLore/compare/v3.1.1...v3.2.0
[3.1.1] - 2026-09-07
The release where the first run stops being the worst run — and Windows joins CI.
Install once, and every repository you open works.
installwires OpenLore at user scope and points at OpenLore's own CLI instead of annpxshim, so no console window flashes on Windows and a second repository needs no second setup.Answer during the first build, instead of "no index found". A partially built index serves what it already has, and an index that genuinely cannot be served says why rather than reporting absence.
The call graph names where it stops seeing. Chained intra-object receivers resolve instead of going silent, and unresolved call shapes are disclosed as boundaries rather than assumed empty.
Windows is a tested platform, not a hope. The unit suite runs on Windows in CI and ten defects it surfaced are fixed; the deny-list dropped from 49 tests to 2. Repository-relative paths OpenLore serves are POSIX on every platform.
The watcher and the serving path stop wasting work. A flush can no longer skip silently, a deterministic-failure budget is not spent on a wait, per-call serving work is bounded, and serving caches invalidate on external writes.
Dependency and supply-chain upkeep. Native tree-sitter grammars, LanceDB 0.38.0, Vitest 5, and the dev-dependency group are current; the
sharpoverride moves to ^0.35.4 to clear the libheif advisory (GHSA-rgj7-g3m4-5g8c); CI now fails on a digest-less lockfile at the point it is fixable.
No breaking changes. No public API or configuration schema change from 3.1.0.
Upgrade: npm i -g [email protected] — or openlore update.
Full Changelog: https://github.com/clay-good/OpenLore/compare/v3.1.0...v3.1.1
[3.1.0] - 2026-08-30
The release where OpenLore learns the shape and vocabulary of a whole workspace.
Analyze large workspaces by shard. OpenLore detects package boundaries, supports explicit
workspace.shardsconfiguration and targetedanalyze --shardruns, then assembles bounded, attributable workspace results without making a monorepo behave like one giant package.Catch imported bundles up instead of starting over. A clean bundle from an ancestor commit now applies the exact repository delta through the watcher's bounded converge-or-flag path; unverifiable, diverged, or oversized gaps still rebuild and disclose why.
Find code using the repository's own language. Keyword search now expands queries through a bounded repository vocabulary, semantic results disclose score meaning and index freshness, and stale regions retain enough structural context to explain what needs rebuilding.
Understand more real-world source files. Vue, Svelte, and Astro script containers participate in structural analysis, while the digest distinguishes languages with structural backing from files that are only counted.
Keep the agent loop honest. New Claude Code and Codex enforcement hooks run repository policy checks during agent work, preserve concurrent settings edits, and fail safely at trust boundaries. Generate and Repair also disclose when OpenSpec validation did not run instead of presenting unvalidated prose as a completed specification.
Treat Pi as a first-class install target.
install,connect, dry-run, force, and uninstall flows now detect and configure Pi. The generated extension shim fixes the previously broken copied artifact while refusing to overwrite user-owned extensions by default.Harden network, path, and architecture boundaries. TLS verification opt-outs are scoped to one outbound surface at a time; configured spec roots and architecture-layer patterns are confined; incremental watcher work is bounded and preserves explicit freshness receipts under races.
Adds a reproducible default-surface benchmark protocol and refreshes
web-tree-sitterto 0.25.10.
This release is backward-compatible with 3.0.x. The programmatic API adds optional workspace, retrieval, and stale-region receipt types; configuration schema 1.2.0 adds only optional sections.
Upgrade: npm i -g [email protected] — or openlore update.
Full Changelog: https://github.com/clay-good/OpenLore/compare/v3.0.1...v3.1.0
[3.0.1] - 2026-08-23
Release validation now builds the trusted OpenLore launcher before exercising hook installation tests, matching the required CI lane and preserving the production fail-closed behavior. No runtime behavior or public API changed from 3.0.0.
Refreshes the compatible release toolchain and development stack: OpenSpec 1.10, Vitest 4.1.11, TypeBox 1.3.16, Vite 8.2.2, Inquirer 8.6, and CodeQL Action 4.37.8.
Upgrade: npm i -g [email protected]
Full Changelog: https://github.com/clay-good/OpenLore/compare/v3.0.0...v3.0.1
[3.0.0] - 2026-08-23
Programmatic API migration: analysis results now require
fromCacheand makedepGraphoptional when the persisted graph is missing or corrupt. Generation and full-run results are discriminated bydryRun; callers must narrow onresult.dryRunbefore readingpipelineResult,init, oranalysis.GenerationReport.configSchemaVersionis now required, andopenloreVersionnow consistently identifies the OpenLore package rather than the config schema. Dry runs no longer fabricate results for stages that did not execute. These are intentional breaking type-shape corrections for embedders.LLM prompt/response diagnostics are now disabled by default, require exact
OPENLORE_LLM_LOGS=1opt-in, redact secrets, and retain at most six files or 300 MB; local telemetry documentation now matches its exact gate and recorded event domains.Repository config can no longer disable source-output secret redaction or force ignored files into generated LLM context; trusted operators retain explicit environment/CLI overrides.
The minimum supported Node.js version is now 22.19, matching the runtime dependency floor; CI exercises that exact version before release.
Drift results now carry required
analyzedFilesandfilesOmittedreceipts. The drift CLI reserves exit1for confirmed drift and uses exit2when the check cannot run; reinstalled pre-commit hooks upgrade in place, validate JSON before blocking, preserve existing hook failures, and allow infrastructure failures with an explicit warning.Interference maps now retain unassessable branches, reject unsafe base guesses, disclose enumeration limits/failures, and stop treating shared reads as conflicts.
Enforcement JSON schema version 3 normalizes governance finding severity to
info,warning,error, orcritical(warnis nowwarning) and adds frozen-baseline ratchet evidence.
Upgrade: npm i -g [email protected]
Full Changelog: https://github.com/clay-good/OpenLore/compare/v2.2.0...v3.0.0
[2.2.0] - 2026-08-16
The release where OpenLore learned to show its work.
Generate and repair now share bounded, provenance-rich evidence across agents.
Analysis, daemon, MCP, and bundle lifecycles are safer under concurrency and untrusted input.
Test selection, language detection, coverage reporting, and OpenSpec change status are more accurate.
Releases now validate and promote one immutable package artifact.
Existing v2 API consumers remain compatible; coverage availability is explicit through mappingCoverage.
Upgrade: npm i -g [email protected] — or openlore update.
Full Changelog: https://github.com/clay-good/OpenLore/compare/v2.1.9...v2.2.0
[2.1.9] - 2026-08-09
The release where OpenLore stopped trusting the vibes.
Import resolution got smarter, including the deeply suspicious
.tsxand.jsxtwins.Stale analysis now says it is stale instead of confidently wearing last week's nametag.
Repository secrets, hostile prompts, and wandering viewer file reads all meet firmer boundaries.
First-run guidance and empty results now tell you what actually happened.
Everything is backward-compatible: no commands, options, exports, or config keys were removed.
Upgrade: npm i -g [email protected] — or openlore update.
Full Changelog: https://github.com/clay-good/OpenLore/compare/v2.1.8...v2.1.9
[2.1.8] - 2026-08-02
The release where analyze stopped caring how big your repo is.
Last time analyze stopped dying on one hostile file. This time it stops dying on
the whole repository, however large. Plus we closed a security advisory, and the MCP
server finally leaves when you do. Everything is additive and backward-compatible.
Security: a spec write that could escape the project root (GHSA-5j8x-q7q6-58j5)
openlore generate built each spec's output path from an LLM-derived domain field.
Against a repository you don't trust, a crafted value could steer that write outside
your project root. Now the domain is normalized to a single safe path segment and every
spec write goes through the same symlink-aware root guard the rest of the codebase uses —
an out-of-root path is refused, not written. Regression tests on both the source and the
sink, plus a structural guard so a future edit can't quietly reopen the door.
analyze scales to any repo size
No more out-of-memory on large repositories. Repo-wide enrichment scans are bounded, five superlinear scans are gone, and the background index no longer grows forever.
The CFG overlay stays in memory and only spills to disk when it's actually big — the common case never touches the filesystem.
Adaptive heap + graceful degradation.
analyzesizes its own heap to the machine (cgroup-aware) and, when a repo is too big for a full pass, steps down a level instead of falling over. Any repo finishes with some answer, never a crash.Deep import chains no longer overflow the stack — cycle detection is iterative now.
The MCP server leaves when you do
The zombie-process known issue from 2.1.7 is fixed: the stdio server's lifetime is now
bound to its transport, so when your agent closes stdin, the process (and its file watcher)
exits. No more stray openlore mcp holding caches after the session ends.
Honesty, still the house style
The walker no longer hands back a silently smaller graph. If it can't cover the whole corpus it says so — with a truncation receipt — instead of quietly analyzing less.
Git-derived signals tell the truth about their own window: churn is measured over a real pre-change window, federation claims reflect the current tree, and change detection is work-tree-aware.
generatepreserves your existing specs instead of clobbering them on regeneration.
Under the hood
Property-based fuzzing now runs against the untrusted-input surface.
Dependency bumps: commander 15, chalk 6, ora 9, transformers 4.
Known issues
A config missing its
analysissection still crashesanalyzewith an internalTypeError(anddoctorstill calls that config healthy). Not a regression — carried over from 2.1.7. If you hand-edit.openlore/config.json, keep theanalysisblock, or re-runopenlore init.
Upgrade: npm i -g [email protected] — or openlore update.
Full Changelog: https://github.com/clay-good/OpenLore/compare/v2.1.7...v2.1.8
[2.1.7] - 2026-07-26
The release where analyze stopped dying and started explaining itself.
Three things this time: analysis got faster, it got harder to crash, and — the theme — it got much better at admitting what it didn't do. Everything is additive and backward-compatible. If OpenLore has been working for you, upgrade and it keeps working.
openlore analyze no longer dies on a hostile file
One 300 KB file could kill the whole run with a single line of C++ and exit code 134:
libc++abi: terminating due to uncaught exception of type Napi::ErrorNo stack, no error line, no artifacts, no clue which file did it. Delightful.
The culprit was a file that parsed into a tree 100,002 nodes deep, which overflowed
the stack inside a native call — where a JavaScript try/catch can't reach. Two fixes:
the tree walk no longer uses the call stack, and every parse is now bounded by a per-file
budget (20 s, generous on purpose; the slowest real file in this repo is under a second).
A file that blows the budget is set aside and reported, not waited on.
Same repository, before and after: exit 134 → exit 0, and 217 s → 52 s.
If you'd rather wait than be told, OPENLORE_PARSE_BUDGET_MS=0 turns the bound off
entirely and restores the old behavior exactly.
Fewer files skipped in silence
"Files skipped: 3" told you nothing and worried you slightly. Now it says why
(pattern 2, gitignore 1), and any file the analyzer set aside is recorded with a
machine-readable reason that analyze, doctor, and the MCP tools all read from the
same place — so they can't tell you three different stories about one repository.
While a run is going, a file that's taking unusually long gets named on stderr, so "why is this slow" has an answer that isn't "attach a debugger."
Analysis got quicker
Pass-1 extraction runs on a worker pool — call-graph build 19.1 s → 7.3 s on this repo; full
analyze --no-embed24.6 s → 18.1 s. Byte-identical output.Unchanged files aren't re-parsed. A content-hash memo takes
--force45–54 s down to 36–39 s on a re-run.Reachability is precomputed at analyze time, so the tools that traverse it just look things up: coverage-gaps 346 ms → 6.4 ms (54×), test selection 575 ms → 117 ms (4.9×), measured at 50k nodes / 200k edges.
Security: analyzing a repo you don't trust
OpenLore reads whatever you point it at, which means a repository can try things. Ten findings closed against that threat model, plus a separate fix for terminal control sequences. Highlights:
A cloned repo's
.openlore/config.jsoncould redirect the LLM endpoint and switch off certificate verification — collecting yourANTHROPIC_API_KEYon your nextgenerate,drift, or commit. Repo-supplied values are now ignored unless they point at loopback; your own--api-base/ env vars still work, because those come from you.A filename could carry raw terminal escapes into OpenLore's output. A forged
[ok] all checks passedis an attack, not a cosmetic glitch.Two regexes could be made to hang on crafted input.
Dependency and workflow scanning now run automatically in CI.
Also
Windows paths with backslashes no longer split incorrectly.
Four places where a tool reported
0for something it had never actually computed.
Known issues
Two defects an end-to-end pass found are not fixed here. Both are tracked and queued for the next release; neither is a regression from this one.
The MCP stdio server doesn't exit when its client closes stdin, once a call has started the file watcher. Every agent session leaves a process holding a watcher and its caches. Workaround: kill stray
openlore mcpprocesses, or useopenlore serve, which reaps itself when idle.A config missing its
analysissection crashesanalyzewith an internalTypeError, anddoctorreports that same config as healthy. If you hand-edit.openlore/config.json, keep theanalysisblock — or re-runopenlore init.
Upgrade: npm i -g [email protected] — or openlore update.
[2.1.6] - 2026-07-19
The boring release. We mean that as the highest compliment.
v2.1.5 made OpenLore pleasant to start using. This one makes it hard to break. Forty-five changes, and not one of them adds a knob you have to turn: no new required config, no tool or command or language removed, no LLM anywhere in the serving path. What changed is that the substrate now tells the truth more stubbornly and falls over less often — the same answers, the same speed, fewer surprises at 2am.
A good memory is one you stop thinking about. That was the whole goal here.
Everything below is additive and backward-compatible. If OpenLore has been quietly working for you, upgrade and it will keep quietly working — just with fewer sharp edges you were never supposed to touch.
The index looks after itself now
Reads can no longer destroy your index. Opening the graph store for a read used to be able to drop tables on a schema mismatch; now a read is a read. A version bump rebuilds through the one path that owns rebuilds, a schema mismatch reports "not ready" instead of nuking your data, and a genuinely corrupt store gets quarantined as
*.corrupt-Nrather than silently reused.Staleness heals itself. When the read path notices the index has drifted from the code, it kicks off an at-most-once background repair and tells you it's doing so — instead of handing you stale answers with a straight face.
openlore doctor --fixcovers the rest.Analysis is now deterministic. Analyze the same commit twice and you get byte-identical artifacts — sampling is seeded, aggregation is order-stable. No more phantom diffs from a graph that couldn't make up its mind.
Artifact writes are atomic and locked. Every analysis artifact is written all-or-nothing behind a single lock, so a crash mid-write leaves you with the old good file, never half a new broken one.
A crashing event no longer takes the daemon with it. An async watcher/stream error is caught and logged instead of felling a long-lived process — the watcher survives the day.
The graph stops fibbing about your code
A pile of parser-fidelity fixes, all in service of one thing: the call graph should describe the code you actually wrote.
Route handlers stay connected. TS/JS route lines are now masked length-preservingly instead of skeletonized, so route→handler edges stop drifting and handlers stop being mislabeled dead.
More exports are seen.
async, generator,abstract,default async, andconst enumexports are recognized, and comment-shifted line numbers are corrected.Clone detection stops crying wolf. String-literal-aware normalization means a truncated literal no longer produces a false "100% identical" verdict.
Ambiguous calls are disclosed, not guessed. When the resolver can't be sure which function a call reaches, it says so instead of confidently binding to the first match.
Non-ASCII filenames stop vanishing. Every git path-listing spawn now runs with quoting off, so files with accents or CJK names stay in the graph.
Sub-word search actually matches. Identifier-aware BM25 tokenization means searching
parsefindsparseConfig; the tokenized corpus is persisted, so cold starts are ~90% faster and the tokenizer stamp guards serving end-to-end. Parse-health is disclosed rather than silently swallowed, and language detection runs through one guarded detector.
Secrets stay secret, servers stay closed
Authorization headers are fully redacted — including the credential half of
Basicauth — and a redaction cycle returns a redacted twin, never the original value it was trying to hide.serve.jsonis validated at every reader through one shared validator, with an outbound SSRF guard, so an untrusted descriptor can't point the daemon somewhere it shouldn't go.The view server now sits behind the serve daemon's request guard, closing the last local HTTP surface that wasn't protected against DNS-rebinding.
Node floor raised to where
node:sqliteactually exists — and OpenLore probes for the capability rather than trusting the version string.
Governance you can trust
A rejected decision stays rejected. One shared status-transition table locks every promotion door (MCP, API, CLI), so
syncorapprovecan't quietly resurrect a verdict you turned down.Decision autopilot (opt-in): auto-accept governance with an append-only audit ledger, for teams who've decided they trust the gate.
The conclusion contract is enforced at dispatch — a tool that's supposed to return an answer can't accidentally hand back a graph to traverse — and MCP↔Pi tool parity is guarded in both directions, so the two surfaces can't drift apart.
Federation degrades gracefully: an empty fingerprint is baselined at first sight and a corrupt registry degrades instead of blocking, so a half-set-up peer never wedges the fleet.
CLI & config, cleaned up
--configis finally honored — an explicit config path is actually read, and it's fatal if it's wrong rather than silently ignored..openlore/config.jsonis validated: typo'd keys get a did-you-mean, type mismatches and version skew are disclosed (diagnostics go to stderr, so machine-readable output stays clean).Uniform output across every command: one color layer, honest summaries, one vocabulary, and base-refs that resolve-or-disclose instead of silently falling back to
main.Install detection is evidence-based — OpenLore figures out how it was installed and never mutates the wrong (e.g. global vs local) install.
openlore servenow reports the samesubstratedefault (13 tools) asopenlore mcp, and every help string, docstring, and doc entry names that one default through a single constant (changefix-default-preset-claims). Pass--preset navigationfor the lean 10-tool surface.
New this release
locate_symbol_span— a read-only, staleness-checked "where does this symbol live right now" lookup a host can trust before it edits (fresh / stale / ambiguous / not-found, never a confident wrong line).
Under the hood
Specs refreshed to match the current architecture; shipped-change statuses reconciled with git reality; quantitative doc claims (language counts, the test floor) are now pinned to code by a guard test. The epistemic-lease weight table is complete and bound to the registry.
tree-sitter-c-sharpis pinned to the ABI-matching^0.21.3. Assorted test-suite flakes defused.
The version is read from package.json, so --version and the tools/list banner track this
bump automatically — nothing to configure.
[2.1.5] - 2026-06-28
Happy-path polish + the benchmark-cleared substrate default (PR #218, change
refine-happy-path-and-defaults). This release raises the first-five-minutes / first-five-tool-calls
quality of OpenLore to the level of its capability: it makes opt-in features discoverable, the CLI and
tool surface legible, first use honest, and verbose output economical — and, on a benchmark run across
two models and both repo tiers, flips the default MCP surface to the both-faces substrate preset.
Everything is additive and backward-compatible — no tool, command, preset, language, or capability
removed; no required config added; deterministic and local-first (no LLM in any serving path). The two
behavior changes below each ship with a one-flag/one-param escape, so callers that want the prior
behavior keep it. The runtime version is read from package.json, so --version and the tools/list
banner track this bump automatically.
Changed
Default MCP surface is now the
substratepreset (13 tools, both faces) — flipped from the 10-toolnavigationpreset. A defaultopenlore install/ bareopenlore mcpnow exposes the navigation graph-traversal core plus the three highest-value governance reads (recall,verify_claim,blast_radius), so an agent is both-faced out of the box. The flip cleared theDefaultSurfaceRevealsAllFacesgate: deterministic token economy (~4.5k tokens, +1.2k over navigation, within the ~10k tool-search threshold) and face coverage, plus an agent benchmark via the Claude Code CLI — selection accuracy (substrate 90% vs navigation 80% shared, 100% vs 0% governance) and end-to-end task completion across two models (sonnet + the weaker haiku) and both repo tiers (100% correctness everywhere, no regression, substrate cheaper on 3 of 4 cells). Recorded as decisionc79ec7ca/ ADR-0023, superseding ADR-0022. Escape:--preset navigationrestores the lean navigate-only core;--preset fullstill wires all 72 tools.Verbose tools are concise by default (
ConciseByDefaultDetailedOnRequest) —get_duplicate_reportand the four list inventories (get_middleware_inventory,get_schema_inventory,get_ui_component_inventory,get_env_vars) now return a concise summary (totals + a sample + a truncation receipt naming the fuller call) instead of the full payload. Measured −87% (get_duplicate_report) and −45% (get_env_vars) on this repo; small inventories return in full (no data lost). Escape:responseFormat: "detailed"returns the complete payload.get_ui_components→get_ui_component_inventory— renamed for consistency with itsget_*_inventorysiblings. The prior name keeps working forever as a permanent deprecated alias; no caller breaks.
Added
openlore features— lists every opt-in feature (embeddings, covering surfaces, enforcement policy, panic, spec store, federation, …), whether each is active, and the one command/snippet to turn it on. Answers "where do I turn on X?" with zero required config.--json,--inactive.Job-grouped
openlore --help— the ~49 commands are grouped by job (set up · navigate · govern · inspect · multi-repo · advanced/experimental) instead of one flat list; nothing is hidden.Structured ready-or-honest first use — a graph tool invoked before the index exists returns a machine-readable
{ notReady, reason, remedy }(or self-bootstraps) instead of a silently-empty result, so an agent never mistakes "no index" for "no findings."Documentation index —
docs/README.mdmaps a task to the one canonical page; overlapping pages cross-link to their canonical source; stale pages carry redirect banners.Preset benchmark harnesses —
npm run bench:surface/bench:selection/bench:completion(deterministic + Claude Code CLI) reproduce the default-flip evidence;bench-agent.tsgains additive--results-json/--with-onlyhooks.
Notes
ProgressiveCatalogDisclosureis satisfied by the shipped server-side design (preset fallback + per-toolannotations.family). Nativedefer_loading/ Tool Search is a client/API responsibility an MCP server cannot emit, and the server-sidelist_changedalternative was rejected because it invalidates the prompt cache the requirement asks to preserve.
[2.1.4] - 2026-06-27
The largest release since v2.1.2: everything merged since the v2.1.3 tag (PRs #183–#216) plus the
capability-family taxonomy + substrate preset + openlore mcp --list-tools and the
behavior-preserving call-graph modularization (PR #217). All changes are additive and
backward-compatible — no breaking changes to tools, schemas, or stored data — and deterministic and
local-first (no LLM in any serving path), per the north-star decision c6d1ad07. The CLI and the MCP
server read the version from package.json, so both report 2.1.4.
Added
Capability-family taxonomy +
substratepreset +openlore mcp --list-tools(PR #217; changeunify-navigation-and-governance-substrate) — names what OpenLore already is: one structural substrate with two faces — a read face that navigates the graph and a write/check face that anchors facts and weighs changes — not two products. Every one of the 72 MCP tools now declares exactly one of six closed capability families —navigate·change·remember·verify·coordinate·federate— surfaced in each tool's MCPannotations.family, so a wide surface stays discoverable by family instead of a flat list of 72 names. A newsubstratepreset spans both faces out of the box — thenavigationgraph-traversal core plus the three highest-value governance reads (recall,verify_claim,blast_radius). Per ADR-0022's evidence rule the active default staysnavigationuntil an agent benchmark clears the wider one;substrateships as a selectable preset. Newopenlore mcp --list-toolsprints the active surface grouped by family. Adjacent tools that answer genuinely distinct questions now cross-reference each other in their descriptions (NoRedundantConclusions), andtool-contract.test.tsfails CI if a tool forgets a family or an adjacent tool drops its sibling reference. No new tool, dependency, LLM, or persisted artifact. Reference:openspec/changes/unify-navigation-and-governance-substrate/.Codebase style fingerprint —
get_style_fingerprint(STRUCTURAL-CONTEXT-PATTERNS proposal 1) — a descriptive, deterministic per-language idiom profile so an agent matches the house style instead of its training-prior default. During the existing tree-sitter walk (no second parse, no LLM) the analyzer tallies a fixed, closed set of idiom counters — function form (arrow / declaration / method), binding (const/let; Go:=/var), conditional (ternary /if), async (await/.then), string (template / concatenation), function-naming case — and rolls them up to the repository, each community/region, and (on request) a single file, each reported as{ dominant, ratio, samples }. Honest by construction: a counter below a fixed evidence floor reports a null signal, and a choice the language/formatter enforces (Go ties identifier case to visibility) reportsenforcedrather than a tautological1.0. Descriptive, not prescriptive — no lint judgment, no composite style score. Persisted as its ownstyle-fingerprint.json(the hotllm-context.jsonstays lean) and incrementally refreshed under the watcher.orientalso carries a compactregionStyleline for the touched region, and theget_language_supportmatrix now derives thestyleFingerprintcapability from the live extractor set (TypeScript/JavaScript/Python/Go). Opt-inget_style_fingerprintMCP conclusion tool (--preset full, not the lean default) and theopenlore style-fingerprintCLI (read-only, never blocks). Full surface count 67 → 68. Reference:openspec/changes/add-codebase-style-fingerprint/.Public API surface contract —
certify_public_surface(FEATURE-UPDATES proposal 2) — certify whether a working-tree diff breaks the package's exported contract. With no base ref the tool returns the public surface (exported symbols + signatures); with a base ref it returns a deterministic breaking-change verdict — each changed export classifiedbreaking/non-breaking/potentially-breaking(removed/renamed export, added required param, narrowed param/return type, reduced visibility), each breaking one paired with the in-repo consumers it breaks, plus an overall summary. Conservative by construction: a change it cannot prove compatible ispotentially-breaking, never silently safe — no type checker, no build. A renamed export is reported as a rename (not remove+add) via symbol-identity continuity; external/unindexed consumers are disclosed as a known-unknowable boundary. Signature classification covers TypeScript/JavaScript/Python (others fail-soft to surface membership). Distinct fromchange_impact_certificate(paths into a surface) — this certifies the exported contract's shape. Opt-incertify_public_surfaceMCP conclusion tool (--preset full, not the lean default) and theopenlore certify-public-surfaceCLI (read-only, never blocks). Full surface count 66 → 67. Reference:openspec/changes/add-public-api-surface-contract/.Symbol identity continuity — memory survives renames & moves (FEATURE-UPDATES proposal 1) — a renamed or moved symbol no longer orphans the memories and decisions anchored to it. At each
openlore analyze, OpenLore snapshots the prior graph, detects symbols that disappeared (anchored, now-unresolved) and appeared (new), and carries the anchors forward to the new symbol withcarriedAcross: { from, reason, basis, atCommit }provenance — turning a silentorphanedinto afresh/drifted (carried)recall thatrecallsurfaces with the provenance. Matching is deliberately conservative and threshold-free:exact-body(byte-identical span — a pure move) orexact-signature(the body is identical modulo the symbol's own name — a rename, verified by substituting the new name back to the old and checking the recorded baseline hash), admitted only on a strict one-to-one match and only when the name-independent body is unique among new symbols. A genuinely deleted symbol is never re-anchored onto an unrelated newcomer that merely shares a parameter shape; an ambiguous move stays orphaned and disclosespossiblyMovedTo: [...]candidates instead of guessing. Test symbols are never carry targets. The anchor'scontentHashbaseline is preserved, so the existing freshness engine remains the single source of truth. No graph-schema change, no new MCP tool, no LLM, no clock; new anchor fields are additive (legacy stores load without migration). Trigger is fullanalyze(the incremental-watcher path is a deferred follow-up). Reference:openspec/changes/add-symbol-identity-continuity/.Call resolution recall — re-export / barrel resolution (FEATURE-UPDATES proposal 4) — the import resolver now follows re-export chains (
export { x } from,export * from, and the TS ESM.js-specifier forms) through any depth of barrel to a symbol's true definition, and that re-export-aware map is threaded into call-edge resolution (Pass 2), which production builds never did before — so a cross-file call resolves to its real target atimportconfidence (or the newre_exportconfidence when a barrel hop was followed) instead of falling through to the ambiguous first-same-named-candidate (name_only). Cycle-detected and depth-bounded; gated toimports-capable languages; fail-soft. Strictly additive: when no re-export applies the result is identical to the direct target, and directly-resolved edges (same_file/self_cls/type_inference) are never dropped or downgraded. Dogfood on this repo: ambiguousname_onlycall edges fell 1067 → 87 (−92%), precise cross-file edges rose 0 → 1326import+ 21re_export, unresolvedexternalfell 8742 → 8563, and 29 symbols moved off the false-dead / false-entry-point list (e.g.EdgeStore.open, reported as having zero callers, recovered its real 22) — raising the soundness floor under every reachability conclusion (find_dead_code,select_tests,analyze_impact,blast_radius,report_coverage_gaps) at once. The resolved map is also threaded into the incremental watcher (newcollectReExportBarrelspulls barrel files into the subset for export-indexing only), so an incremental rebuild converges toanalyze --forceon barrel edges instead of degrading them toname_only(parity oracle Scenario 4). Python relative imports now resolve too: the leading-dot module form (from .impl import x,from ..pkg.mod import y) is resolved to the true file, and function-level (deferred / cycle-breaking) imports are captured — dogfooding a real Python repo this took precise cross-fileimportedges from 0 → 102 and cut ambiguousname_onlyfrom 156 → 58, making the registry's Pythonimportscapability functional. A structural audit during implementation found the proposal's other edge classes — interface→implementation, override, and single-implementor dispatch (items 2/3) — already delivered by the shipped CHA pass (add-type-hierarchy-resolved-dispatch); they are cross-referenced, not re-implemented. No graph-schema change, no new MCP tool, no LLM. Reference:openspec/changes/add-call-resolution-recall/.Structural test-coverage gaps +
report_coverage_gaps(FEATURE-UPDATES proposal 5) — a deterministic, graph-derived report of important code with no reaching test, ranked byhub/chokepointsignificance. It is the structural inverse ofselect_tests: seed on every test node plus the production side of everytested_byassociation, forward-reach to the test-reachable set, and report the internal code outside it (test/generated/vendored/.d.tsexcluded). No test run, no coverage instrumentation, no runtime, no LLM — the graph already encodes the answer. Gaps-only and honest: it reports "no reaching test" and never claims a symbol is "tested" (reachable-from-a-test is not behavior-verified); a gap with no caller at all is labeled also-dead (distinct fromfind_dead_code), an untested entry point is untested-not-dead, a scope that resolves to nothing is disclosed (never a reassuring "0 gaps"), scoped counts range over the in-scope set, and a stale/degraded index is surfaced in the human view (a degraded index manufactures false gaps). Ranking uses labels + raw evidence — no composite score, no tuning constant. Scope to a diff (changedSymbols/diffRef) or a region (filePattern);directResolvedOnlyfor a stricter (more gaps, more certain) report whose also-dead labeling shares the gap basis. Two surfaces: the opt-inreport_coverage_gapsMCP conclusion tool (--preset full, not the lean default) and theopenlore coverage-gapsCLI (read-only, never blocks). Distinct fromget_test_coverage(spec-tag based). Full surface count 65 → 66. Reference:docs/coverage-gaps.md.Declarative language-support registry +
get_language_support— the per-language knowledge OpenLore already encodes (call-graph extractor, CFGSPECStable, signature extractor, type-inference engine, IaC projector) is now consolidated behind one declarative capability registry (src/core/analyzer/language-support.ts), and per-language coverage is observable. Capabilities:signatures,callGraph,imports,cfgOverlay,typeInference,styleFingerprint,iacProjection. The registry is derived from the live extractor structures (not hand-listed), so the coverage matrix cannot silently over-claim — a behavioral test cross-checks every cell against the real extractor (every member of every capability set, including eachIAC_LANGUAGESecosystem run through the real analyze pipeline, plus an exact predicate assertion forcfgOverlay/iacProjection). Two surfaces: a Language coverage matrix in.openlore/analysis/CODEBASE.md, and the opt-inget_language_supportMCP conclusion tool (repo-detected languages, or a named language as a pure registry lookup — fail-soft for unknown languages). Makes a quiet structural result interpretable ("calls unsupported for L" vs. "no callers"). No extraction-output change, no new dependency, no LLM. Full surface count 64 → 65. Canonical reference + "add a language" checklist:docs/language-support.md.map_in_flight_conflicts— cross-actor interference map (PARALLEL-WORK proposal 4). The team version ofplan_parallel_work: instead of a caller-supplied task list it harvests every change in flight — local branches (git), open PRs (gh), and any supplied agent task descriptors — as actor-attributed nodes and runs the shared hazard classifier across all of them. Each footprint is derived from the change's ACTUAL diff: hunks map to the enclosing symbols of a re-parsed base snapshot, and the per-symbolwriteModeis read off the hunks (appendiff pure-insertion, elsemodify), so two PRs appending disjoint entries to the same dispatcher resolve toshared-append, not a false WAW — with nowriteModedeclaration. A change whose diff can't be fetched or whose symbols don't resolve is labeled "not assessed", never a false "no conflict". Read-only and stateless (no watcher/poll/persisted store); opt-infederationmatches in-flight changes across repository boundaries by content-addressed stable id. Advisory; WAW pairs emit the policy-governablecross-actor-conflictfinding a CI check can gate on. In the opt-incoordinationandfederationpresets (not the lean default). Full surface count 63 → 64.Index integrity attestation —
analyzenow writes.openlore/analysis/index-attestation.json(schema version, committed production counts, content digest) deterministically. On load the persisted graph index is reconciled against it into ahealthy | degraded | mismatchedverdict: a schema-version drift ismismatched; a store materially smaller than the build committed (after a WAL checkpoint-and-recount retry, with a small-repo exemption) isdegraded. A non-healthy index is never silently served — it emits a recoverable signal, surfaces onget_health_mapasindexIntegrity, and rides theconfidenceBoundary.integrityoffind_dead_code/select_tests/analyze_impact/ path tracing so a negative conclusion over a broken index is labeled (complete: false) rather than asserted. The incremental watcher keeps the attestation's counts in lockstep so ordinary editing never false-flagsdegraded. Advisory by default; deterministic, no LLM, no new MCP tool. Extends the "never present absence as current fact" store ethos to the graph index.verify_claimdecision-currentkind — verify a recorded decision is still authoritative before an agent cites it to a human ("decision X governs this, so it's safe").subjectis an 8-char decision id; the verdict isconfirmed(recorded, not superseded, not rejected),refuted(superseded — naming the live superseder to cite instead — or rejected), orunverifiable(unknown/malformed id). It reads the same decision-store retirement graph thestale-decision-referencefinding walks, so the active (verify_claim) and passive (recall/openlore enforce) surfaces can never disagree, and it does not touch the structural call-graph verifier. No new MCP tool (stays in the opt-inverifypreset); deterministic, no LLM. Closes the deferredverify_claimclause of the finding-enforcement-policy change.Unified finding-enforcement policy — a single
enforcement.policyblock in.openlore/config.jsonmaps a stable governance findingcodeto one enforcement class (blocking | advisory | off), decoupling a finding's intrinsic severity (owned by its source) from the repository's risk posture. The newopenlore enforcegate collects findings from every in-scope source, resolves each through the single policy, and in--hookmode blocks the commit only on ablocking-classed finding (advisory by default;offfindings stay visible, never invisible). The legacyblastRadius.block/impactCertificate.blockconfigs lower onto it (a direct policy entry wins). Adds the deterministicstale-decision-referencefinding — a live, authoritative artifact (approved decision / non-orphaned anchored memory / spec requirement) that still cites a superseded decision — also surfaced as astaleDecisionRefsignal on therecallMCP tool's output. No new MCP tool; deterministic, no LLM. Flags:--hook,--install-hook,--uninstall-hook,--json,--base.openlore review— deterministic structural PR review (#188). A new no-LLM CLI command that composes the structural delta (structural_diff: removed/added/ signature-changed symbols + the callers they leave stale) and the blast radius (computeBlastRadius: hubs, layers, tests to run, and the spec/memory/decision drift the change introduces) for abase..headrange into one conclusion-shaped Markdown or JSON briefing. No new MCP tool, no new structural computation. Ships with a bundled GitHub Action (.github/actions/openlore-review) that posts it as a single sticky PR comment — created once, updated in place by a hidden marker, never duplicated — plus a copy-paste workflow. Advisory by default (exit 0); opt-in gating via the existingblastRadius.blockconvention. Degrades honestly (no index → structural delta only + "runopenlore analyze"; non-git / unreachable base / unwritable--outdisclosed, never a crash). The Action activates once a publishedopenloreshipsreview.OpenSpec plugin manifest (marketplace Phase 1) — OpenLore is the inaugural OpenSpec marketplace plugin. It now ships a declarative plugin manifest (the
"openspec"key inpackage.json, vendored schemaschemas/openspec-plugin-manifest-v1.json) that OpenSpec reads to discover, surface, gate, and invoke OpenLore as a subprocess without importing its code. Newopenlore plugin-manifest emit|validateinspects/validates it — named distinctly from the federationopenlore manifestso the two never collide. The host loader and curated registry are built separately in the OpenSpec repo.Task-scoped context injection —
openlore installnow wires a Claude CodeUserPromptSubmithook runningopenlore orient --inject, which orients on your submitted prompt and injects a bounded, deterministic, ignorable orientation block before the agent's first turn — amortizing the per-taskorientround-trip the Value Scorecard attributes the small/familiar loss case to. A deterministic relevance gate keeps it out of weak/shallow tasks (degrading to a one-line pointer); it is fail-open (never breaks a turn) and reuses the leanorientoutput (no new MCP tool). Disable or tune via thecontextInjectionblock in.openlore/config.json(mode: "off",tokenBudget, gate thresholds). Adapters without a pre-turn hook (Cursor/Cline/Continue/AGENTS.md) fall back to the instruction block (#184).
Changed
Call-graph builder modularized behind a stable barrel (PR #217; change
modularize-call-graph-builder) —src/core/analyzer/call-graph.ts(the repo's most-imported file, ~155 importers) was 5,425 → 4,745 lines, decomposed into six cohesive sibling modules (call-graph-types,-extract,-external,-complexity,-cfg,-builtins).call-graph.tsre-exports every previously-importable name, so none of the 155 importers moved and the public import surface is byte-for-byte identical (23 exported names, 0 added/removed). Each extraction was verified byte-identical by a graph+helper snapshot oracle (and the full analyzer suite), so graph output is unchanged. Astable call-graph barreltest locks the invariant. The remaining higher-coupling sections (dispatch-synthesis, grammar loading, the attribution hub) are intentionally deferred/out-of-scope — see the proposal for the value-vs-risk rationale. Pure internal hygiene: no feature, dependency, LLM, or persisted artifact.CLI front door now describes the product and steers to one-command setup. Bare
openlore/openlore --helppreviously opened with the legacy spec-gen framing ("Reverse-engineer OpenSpec specifications…") and a Quick start that sent new users toopenlore generate(LLM/API-key-gated). The program description now reads "Persistent architectural memory for coding agents" (served viaorient+ MCP), the--helpepilog leads with "Get started (one command):openlore install" and groups commands into no-API-key Core vs optional Spec authoring, the staletestline now reads "Report spec test coverage" (it never generated tests), andopenlore doctorrecommendsopenlore installwhen config/analysis is missing.openlore installandopenlore doctorare documented in the CLI reference (#188).The default MCP tool surface is now lean (behavior change). A bare
openlore mcpand a plainopenlore installnow wire the 10-toolnavigationpreset — the Spec 14 benchmark-winning graph-traversal core — instead of all 62 tools. Schemas for tools the agent never calls are pure per-request overhead, so breadth is now opt-in. The full 62-tool surface is one explicit selector away:openlore mcp --preset full/--all-tools, oropenlore install --preset full. No tool was removed; every capability stays reachable via its named preset (minimal,memory,verify,federation,full). When the lean default is active, the server advertises the opt-in once through the MCPinitializeinstructionschannel (zero extra tool schemas).openlore servenow also acceptsfullas an alias ofall, andopenlore install/connectaccept--all-tools(#185).Migration — repos that gate commits. The lean default does not include the governance tools the decisions pre-commit gate uses (
record_decision,check_spec_drift,detect_changes). If you rely on that workflow, re-install withopenlore install --preset full(all 62) or--preset minimal(the governance core) to wire them back.Config-key ownership — when OpenSpec owns
openspec/config.yaml, OpenLore now writes only itsopenlorekey and preserves every other key and comment byte-for-byte (a top-level-block string splice that keeps CRLF line endings, inline-comment spacing, and folded scalars intact); it refuses to overwrite a malformed host config rather than risk clobbering it.
Fixed
openlore orient "<task>"now honors a bare positional task. Previously only--taskwas read, so the most natural invocation — a positional task — silently fell through to the no-task session primer and exited0, doing no orientation (and a stray--limitwent unvalidated). A positional task is now accepted (--taskstill wins if both are given); with no task, the install SessionStart hook'sorient --jsonstill prints the primer, unchanged. (v2.1.4 pre-release QA dogfood.)Same-named nested functions no longer collapse into one call-graph node. Two
function helper(){}in different methods, twoconst cleanup = () => {}arrows in one function, or a nested function colliding with a same-named top-level one previously shared one id and were merged at id aggregation (last-write-wins) — one real function was silently dropped and its edges/fan-in/out folded into the survivor. Pre-existing across every language; it surfaced while makingthis.method()resolution load-bearing. Fixed for both the dedicated extractors (TS/JS, Python, Go, Rust, Ruby, Java, C++, Swift, Dart, Elixir) and the shared query-spec extractor (C#, Kotlin, Scala, PHP, Lua) — whose extraction-time overload-dedup no longer drops a genuinely nested twin before disambiguation, so C#/ Kotlin/Scala nested functions split too (true overloads still collapse). A genuinely nested function (byte-contained in another function node with a different id) now gets a stable, scope-qualified id derived from its enclosing scope —file::A.m1/helper, with a document-order ordinal…/helper#2for same-scope twins — never a byte offset, so it is not reported removed-and-re-added bystructural_diff/change_impact_certificatewhen unrelated code shifts. Intentional collapses are preserved: anexport function/ decorated-definition wrapper (a same-id container = the same function matched twice) and sibling collisions (re-assigned members, same-file container homonyms) stay one node. The re-keyed node also carries its CFG overlay with it (collected by start byte, re-attached to the final id), soanalyze_error_propagation/ def-use resolve a nested function's control flow by its node id with no last-write-wins loss or orphaned overlay. Incoming calls resolve by lexical scope — a method'svalidate()binds to its OWN nested twin and a recursive nestedvisit(){ … visit() … }recurses to itself, instead of every incoming call misrouting to whichever twin sorts first (verified end-to-end:analyze_error_propagationonprocessBnow reports its ownTypeError, notprocessA'sRangeError; real-repocfg.tsrecursive twins drop cross-scope misroutes 7→0). Internal to the call-graph builder — no new MCP tool, no new CLI command, surface count unchanged. Dogfooded on the OpenLore repo (e.g. twocleanuparrows instartMcpServer, twogetDiffarrows inextractFromDiffnow resolve distinctly) — a handful repo-wide, no churn elsewhere. Reference:openspec/changes/add-stable-nested-function-identity/.--json/ large CLI output is no longer truncated when piped.process.stdoutis asynchronous on a pipe (the normal case when an agent or shell capturesopenlore … --json), so a command that wrote a large payload and thenprocess.exit()ed lost everything past the ~64KB pipe buffer — e.g.openlore review --format jsonon a real repo emitted a 100KB briefing that arrived truncated to exactly 65536 bytes and failed to parse (it was fine when redirected to a file, where writes are synchronous — so the bug only bit the pipe path agents actually use). A newwriteStdouthelper (src/cli/output.ts) resolves only after the write has flushed; the JSON-emitting CLIs (review,coverage-gaps,blast-radius,impact-certificate,working-set,spec-store,audit,enforce) await it before exiting. Found by the full-product dogfood/--jsonpurity sweep.HTML inline-script extraction is now truly linear on unterminated
<script>tags. A file full of unterminated<scriptopen tags droveextractHtmlScriptsinto O(N²) — each open tag re-scanned to EOF for a close tag that never came — so a large/generated HTML file could stallanalyze(measured ~24s on 100k tags; the existing "no quadratic scan" guard was too small to catch it and intermittently flaked CI instead). Once the close-tag search returns "none from here to EOF", no later open tag can have one either, so the scan now stops — restoring O(N) (100k tags: ~24s → ~17ms). Found by the full-product dogfood/CI pass.Provenance
ghenrichment can no longer hang or flake CI.enrichWithGhshort-circuits to the empty map when the path is not a git repository (a non-git dir can have no GitHub remote, so there is nothing to enrich), and bounds thegh pr listsubprocess with a hard 10s timeout. This honors the documented "best-effort, never required" contract — a stalled or absentghdegrades gracefully instead of blocking analyze — and removes a flaky 5s test timeout in CI where the graceful-degradation test occasionally spawned a slowghin a remote-less temp dir.Incremental watch now converges with
analyze --force(substrate correctness). With--watch-auto, each save re-resolves the changed file's reverse-dependency closure — its direct callers (no longer capped at 10) plus prior non-callers whose previously-unresolved calls a newly-added symbol now binds — so the affected call graph matches a full re-analyze instead of silently diverging (it was depth-1 only:A→B→C, editC, callers past the first 10 and newly-resolvable non-callers stayed stale until the nextanalyze --force). A bounded per-save work budget (INCREMENTAL_CLOSURE_BUDGET, default 40) keeps a hub edit light; over-budget or unreadable files are marked explicitly stale in the graph metadata (freshness verdicts over their symbols report non-authoritative, never silently wrong) and self-heal as later edits touch them. A fullopenlore analyze --forceclears the region. Name resolution for duplicate simple names is now deterministic (seed-order-independent), so incremental and from-scratch builds agree. The call-graph store gains an additiveedges(callee_name)index (keeps the new closure lookups sub-millisecond instead of full table scans) and abusy_timeout(a watcher save and a concurrentanalyze --forceno longer throwdatabase is locked). A stale-region freshness downgrade is now labeled distinctly (staleRegion) and the drift detector no longer reports it as a code change — the anchored code is byte-identical and it self-heals.Node-version guard — launching the CLI under an unsupported Node (<22.5) now fails fast with one legible stderr line and the stable exit code 78 (never a stack trace), protecting subprocess delegation from a host on Node 20/21. The guard runs from a bootstrap module so it evaluates before commander loads.
--jsonstream purity —verify --json(and, defensively,drift/decisions--json) now keep stdout pure: machine output on stdout, all logs on stderr.openlore install --no-analyzenext-step — it skipsinitas well asanalyze, so the old advice "Runopenlore analyze" failed with "Runopenlore initfirst." It now advisesopenlore init && openlore analyze(oropenlore installto do it in one step) (#188).No-key error surfaces the
claude-codeprovider —generate/runwithout an API key previously told the user only to setANTHROPIC_API_KEY/etc., never mentioning that the Claude Code CLI (whichopenlore doctordetects) is a no-key provider. The error now points togeneration.provider: "claude-code"(#188).
Full Changelog: https://github.com/clay-good/OpenLore/compare/v2.1.3...v2.1.4
[2.1.3] - 2026-06-22
Everything merged since v2.1.2: a batch of new agent-facing capabilities plus a
deep end-to-end hardening and dogfooding pass. The version is read from
package.json, so the CLI and the MCP server both report 2.1.3.
Added
Agent behavioral governance ("panic") — opt-in, off by default (#175). A PreToolUse destabilization guard (
openlore panic-check), an observe→memory feedback loop that feeds behavioral hotspots intoorient, an optional Gryph runtime observer, and an accuracy-validation harness (panic-validate/panic-calibrate/panic-replay). Enable per project withopenlore setup --panic <mode>and install the hooks withopenlore setup --hooks <format>(remove them with--hooks none).External spec-store binding — the
spec_store_statusMCP tool (federation preset) reports the read-only health of a.openlore/config.jsonspecStorebinding and its indexed targets (#178).Working-set context briefing — the
working_set_contextMCP tool assembles one token-budgeted, per-target structural briefing for an active change across its spec-store targets (#180).Change-impact certificate — the
change_impact_certificateMCP tool and theopenlore impact-certificateCLI certify what a diff touches: the paths it newly opens into declared covering surfaces (differential, no LLM), blast radius, drifted specs, and the tests to run (#181).Live dependency graph in watch mode —
watchnow reconciles file creates & deletes and keepsdependency-graph.jsonimport edges (including inline<script>and HTML asset edges) fresh incrementally (#173).Pi extension — marketplace gallery preview image (#174); Windows daemon hardening so no console window flashes (#177).
Changed
Removed the
get_decisionsMCP tool. ADRs are now surfaced throughsearch_specs(domaindecisions) and viaorient's ADR matches, which now work without an embedding server (#179)..mjs/.cjs/.mts/.ctsfiles are now recognized as JavaScript / TypeScript and included in the call graph and signature index (previously silently dropped).Panic-state: the on-disk file is the single source of truth for the cross-process intervention counter; all writers (MCP server, hook, daemon) serialize through one lock.
Documentation: Windows setup steps in CONTRIBUTING (#176); corrected and guarded MCP tool-count references.
Fixed
End-to-end hardening pass (PR #182), all with regression tests:
First run —
openlore initandopenlore runnow create.gitignoreon a freshgit initrepo, so.openlore/analysis artifacts (multi-MB lance binaries) aren't accidentally committed and don't pollute diff-based tools.MCP no-throw / robustness —
get_specconfines itsdomainargument (path-traversal fix);get_file_dependenciesguards a partial dependency-graph artifact;change_impact_certificatedrops non-object surface members andbuildLeaseAnchorsnever escapes the handler; a malformedcallGraphis normalized instead of crashing graph handlers; large tool results stay valid JSON when capped to the byte budget.LLM generation — all providers tolerate malformed or
usage-less responses (common with OpenAI-compatible gateways) instead of crashing or reporting$NaNcost.Panic — fixed a cross-process lost-update on the intervention counter; untrusted
panic-state.jsonfields are sanitized and a NaN timestamp is treated as expired; panic hooks gained an uninstall path and update in place on a format change.Multi-repo federation — a registered repo that throws mid-query is skipped with a reason instead of aborting the whole fleet query; tool output no longer leaks absolute host paths.
CLI —
verify --jsonanddecisions --syncnow exit non-zero on failure (they previously reported failure but exited 0, defeating CI gates);decisionshas a top-level error boundary;openlore viewreports a friendly message on a port-in-use, sanitizes errors before logging, and serves a 404 (not 500) for a missing graph artifact.
Full Changelog: https://github.com/clay-good/OpenLore/compare/v2.1.2...v2.1.3
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