Skip to content

Repository files navigation

Reify

The business logic lives in one person's head.
Reify gets it out, without asking them to write documentation.

Already installed? Run reify upgrade

CI Release Documentation Apache-2.0 SWE-bench retrieval 84.6% network calls: 0

Claude Code Cursor Codex OpenCode MCP

On SWE-bench Verified, Reify puts the file that had to change in front of the model 84.6% of the time — grep manages 6.6% · 500 real issues, someone else's benchmark · never opens a socket
A real model on 142 tasks from real merged commits across ERPNext, OFBiz, OpenMRS and Medusa, each index built at a commit before those changes existed. That is retrieval: the right file, in front of the model. On end-to-end patch correctness a BM25 baseline currently resolves more issues than Reify does, and the section saying so is as prominent as this one. Full writeup · reproduce it.

A terminal feature tour against a real ERPNext index: reify index rebuilds the graph; reify context compiles a briefing for adding a discount tier under a 1,500-token budget; reify why on one line of customer.py returns its callers, the tables it writes, the files it co-changes with and the 2022-2025 commits that explain it; reify impact traces the blast radius of check_credit_limit through multiple hops; reify explain shows the credit-limit concept across every file it appears in; and reify context --toon emits the same facts in the agent format.

Every command in the demo is real, against a real ERPNext index. The recording script is committed (recorded with vhs); if the GIF ever disagrees with the tool, re-record the GIF.

Two minutes to first answer

curl -fsSL https://raw.githubusercontent.com/lambiengcode/reify/main/install.sh | sh
cd your-repository
reify init --write-agent-instructions   # wires your agent through AGENTS.md / CLAUDE.md
reify index                             # 4.6 s for 5,000 files; 0.7 s after one edit
reify context "the change you are about to make" --toon

One static binary — no daemon, no config, no API key, and every release ships a SHA-256 checksum that reify upgrade verifies before installing. Changed your mind? reify uninstall removes the binary and reify uninit cleans one repository, both showing their plan first. Per-agent wiring, hooks and MCP: Install.

English · Tiếng Việt · 简体中文


Contents

Two minutes to first answer

curl -fsSL https://raw.githubusercontent.com/lambiengcode/reify/main/install.sh | sh
cd your-repository
reify init --write-agent-instructions   # wires your agent through AGENTS.md / CLAUDE.md
reify index                             # 4.6 s for 5,000 files; 0.7 s after one edit
reify context "the change you are about to make" --toon

One static binary — no daemon, no config, no API key, and every release ships a SHA-256 checksum that reify upgrade verifies before installing. Changed your mind? reify uninstall removes the binary and reify uninit cleans one repository, both showing their plan first. Per-agent wiring, hooks and MCP: Install.

English · Tiếng Việt · 简体中文


Contents

The one-person problem

Your system is eleven years old. The business logic is enormous and mostly undocumented — there are BA documents in SharePoint from 2019, and some of them are still true.

One person understands it. They can't take a holiday without a phone. You can't hire around them, because a new developer needs the better part of a year before they are useful, and the knowledge they would need to absorb isn't written down anywhere — it's in that one person's head, and they are far too busy to write it down.

So you point an AI coding agent at it. The agent is brilliant on new code and useless here. It reads the wrong forty files, misses the rule that mattered, and confidently changes behaviour a customer depends on. Then the one person has to review it, which was the bottleneck you were trying to remove.

Reify gets that knowledge out of one head and into a form your agents and your new hires can both use — without asking anyone to write documentation they will never write. It compiles what already exists: the code, the BA documents nobody reads, the database schema, and eleven years of commit messages explaining why.

Does this sound like your codebase?

  • Older than the newest person on the team
  • Business rules spread across code, stored procedures, config and someone's memory
  • No developer documentation. Some BA documents in Word or PDF, of uncertain age
  • "Ask Minh, he wrote that" is a normal answer to a technical question
  • Onboarding is measured in months
  • The documentation you do have disagrees with the code, and nobody knows where
  • AI agents work fine on your side projects and fall apart on this
  • Source code cannot leave the building

Reify was built for exactly this. If none of it sounds familiar, you probably don't need it — see the FAQ.

What it actually gives you

Three questions, answered from evidence rather than from a model's recollection:

Question Command Who asks it
Why does this code exist? reify why <file>:<line> the new hire, on day two
What breaks if I change it? reify impact "<symbol>" the person doing the change
What must I know before I start? reify context "<task>" your AI agent, every time

The third is the one that matters. It hands an agent the smallest set of rules, citations, code spans and known contradictions it needs — and nothing else.

Before / after

You ask your agent to change the order approval threshold. It greps for 50000000, finds one hit, changes it, and ships. It never learns that the BRD says corporate customers always need approval while the code has been quietly bypassing it since 2019.

With reify:

$ reify why erpnext/selling/doctype/sales_order/sales_order.py:812

  [CONFLICT] documentation and implementation disagree about approval
    documented   Corporate customers must require approval    docs/BRD-42.md:6
    observed     Corporate customers bypass approval          sales_order.py:812

  Called by     3 services, 1 batch job
  Writes        tabSales Order, approval_log
  History       8a31c2f  2019-04-17  fix: enterprise approval flow

Three of those four sections are things grep structurally cannot produce.

SWE-bench Verified

The four-repository benchmark below is ours, which is exactly the reason to also run somebody else's. SWE-bench Verified is 500 real GitHub issues from twelve well-known Python projects, each pinned to the base_commit the issue was filed against — the same index-before-the-change protocol Reify's own benchmark uses, written by other people. The task is a plain issue report; the right answer is the set of files the accepted fix actually touched.

retrieval on SWE-bench Verified, n=500 offered a file the fix touched MRR offered every such file median tokens
grep, content 6.6% [4.7–9.1] 0.06 5.6% 3,998
grep, paths 9.0% [6.8–11.8] 0.06 7.8% 3,996
reify, one round 66.0% [61.7–70.0] 0.43 59.0% 3,466
reify, three rounds 84.6% [81.2–87.5] 0.45 77.0% 9,174

A single round of Reify beats grep on 310 instances and loses on 13 — while spending fewer tokens (3,466 against 3,998). Three rounds win 395 to 5 (exact McNemar p ≈ 7 × 10⁻¹¹⁰). This is not a close measurement, and it is the cleanest number in this README precisely because the tasks, the repositories and the ground truth all came from somewhere else.

Per repository, three rounds against content-grep:

grep reify ×3 grep reify ×3
django (n=231) 6% 88% astropy (n=22) 0% 77%
sympy (n=75) 7% 77% xarray (n=22) 9% 91%
sphinx (n=44) 7% 75% pytest (n=19) 26% 84%
matplotlib (n=34) 0% 91% pylint (n=10) 10% 60%
scikit-learn (n=32) 9% 88% requests (n=8) 0% 100%

What this does and does not show. It measures retrieval — whether the files that had to change are put in front of the model — not whether the model then writes a correct patch. Verified is Python-only, so it says nothing about the modern-TypeScript weakness below. And these repositories are famous enough that models have partly memorised them; that affects a model's answers, not which files a retriever offers, and every arm here ran against the same index at the same commit. Reproduce it with the driver in benchmarks/swe/.

End to end: a tie, and what it took to get there

Retrieval is not the final claim — resolving the issue is. The same benchmark, run through the SWE-bench paper's own protocol (one model, one budget, the retriever as the only difference), with every patch judged by the official SWE-bench harness:

resolved the issue, 63 instances graded under both arms
BM25 23.8%
Reify 23.8% paired 6–6, p = 1.0

A tie — and worth stating plainly, because the first attempt was a loss: 11.1% against 18.1%. What closed it is the interesting part.

Reify retrieved the right file far more often (77% against BM25's 60%) and the model still did worse. Rebuilding the exact prompts showed why: a context window filled with whole files in rank order spends itself on whatever ranks first, and Reify's ranking is blind to file size where BM25's has length normalisation built in. The gold file was retrieved and then never shown — visible in only 27% of prompts against BM25's 40%.

reify context --for-edit fixes that at the source: regions padded to whole definitions, the file's imports included once, overlapping regions merged, budget still hard. Nothing retrieved is lost at the window any more:

gold file retrieved visible in the prompt
BM25 60.0% 40.0%
Reify, whole files 76.7% 26.7%
Reify --for-edit 80.0% 56.7%

Two fixes were tried and rejected on evidence: a per-file cap made visibility worse (a truncated file is not editable either), and cost-aware ranking cut retrieval by seven points while buying nothing once regions made file size irrelevant.

So: Reify wins retrieval decisively and ties on final patch success. The remaining constraint is the patch-writing loop, not the context — both arms cap near 24%, and about a fifth of attempts produce no usable edit at all. Beating BM25 significantly on resolution would need Reify to win two of every three disagreements; today it wins half.

Four repositories chosen to hurt

The honest measurement is a real model doing a real task: tickets taken from merged commits, where the prompt is the developer's own description of the change and the right answer is the files they actually touched. Every index is built at a commit before any of those changes existed, so the code being asked for is genuinely absent. Four repositories, chosen partly to hurt; several conditions exist to break the result rather than support it.

Hit rate by condition for four repositories, whiskers are 95% confidence intervals. ERPNext, 40 tasks: no context 22%, grep at tripled budget 50%, reify three rounds 75%, perfect context 100%. OFBiz, 40 tasks: 0%, 28%, 78%, 100%. OpenMRS, 22 tasks: 0%, 32%, 59%, 100%. Medusa, 40 tasks: 0%, 24%, 26%, 100% — reify and grep overlap on Medusa.

The headline comparison is cost-matched: Reify iterates three rounds (an agent that reads, doesn't find it, and asks again — with the already-read files excluded), so the control is grep handed the same tripled budget outright.

model-in-the-loop, hit rate grep ×3 budget reify ×3 rounds margin 95% CIs overlap?
ERPNext (Python/JS), n=40 50% 75% +25 barely
OFBiz (Java + XML), n=40 28% 78% +50 no
OpenMRS (Java), n=22 32% 59% +27 barely
Medusa (modern TS), n=40 24% 26% +2 fully — no win

A note on the fourth row: Medusa's +2 is a tie, not a win, and it stays in the headline table at full prominence rather than in a footnote. What separates the repositories where Reify wins big from the one where it doesn't is measured, not guessed — see Where it doesn't work.

The controls, on every repository: perfect context scores 100% everywhere, so retrieval quality is the entire game. A decoy context of identical shape scores 0–12%, so the content is doing the work, not the format. With no repository access the model scores 0% on three repositories and 22% on ERPNext — it has partially memorised the most famous repo, which is exactly why the other three exist and why every headroom figure subtracts that floor. Seven of ~1,000 provider calls failed, all on Medusa runs; failed calls are excluded from rates, never scored as misses.

Single-shot, for the record: reify 55/68/41/15 against grep 30/12/41/21 at equal single budget — on OFBiz a single reify round already beats grep by 56 points.

Retrieval on its own, no model involved

Share of tasks where a changed file was offered, per repository. ERPNext: grep 10%, path grep 18%, reify 57%, reify three rounds 75%. OFBiz: 12%, 15%, 70%, 78%. OpenMRS: 32%, 18%, 41%, 55%. Medusa: 18%, 18%, 18%, 28%.

a changed file was offered grep reify (MRR) reify ×3
ERPNext 10% 57% (0.45) 75%
OFBiz 12% 70% (0.45) 78%
OpenMRS 32% 41% (0.27) 55%
Medusa 18% 18% (0.09) 28%

Where it doesn't work

Medusa — a modern, well-factored TypeScript monorepo — is the open problem, and it inverts the project's founding assumption. The legacy Java systems were supposed to be the hard case; they are the best cases. Medusa's tasks describe UI behaviour ("remove the duplicate cloud auth button") whose vocabulary barely intersects the code, its history is squashed PR merges, and nothing Reify currently reads closes that gap. Iteration lifts it 18→28% on retrieval; with the model, 26% against grep's 24%; the intervals overlap completely.

The earlier hypothesis — "Reify's advantage scales with declared vocabulary" — did not survive the four-repo test either. OFBiz declares little the way ERPNext does, yet shows the largest margin of all. What the four repositories actually separate on is whether commit history and file naming speak the vocabulary the tasks are written in. Where they do, Reify recovers 54–62% of the oracle gap. Where they don't (Medusa), it is grep with better structure.

How it works

Deterministic first. Semantic second. LLM last. In this build there is no LLM at all unless you configure one, and every command still works without it.

1. Is it in the AST?          → symbols, calls, imports, inheritance
2. Is it in the data layer?   → tables, columns, ORM mappings, embedded SQL
3. Is it in a document?       → sections, cited by heading
4. Is it in git?              → who introduced it, what fixed it, what moves with it
5. Is it declared anywhere?   → glossary, entity metadata, translation files
6. Only then: infer it        → and mark it INFERRED, with the evidence attached

Every claim carries where it came from and how far to trust it:

CONFIRMED read straight out of a source file
OBSERVED derived deterministically from confirmed facts
INFERRED a heuristic. Check the citation before acting on it
CONFLICTED two sources disagree. Resolve it before changing behaviour
UNKNOWN explicitly unresolved, so absence is never read as evidence

Status::Unknown is the Default on purpose. Anything that forgets to state its footing lands on the one an agent may not act on.

Four bridges from business vocabulary to code

In precision order. The last is what makes Reify work on a repository that declares nothing at all.

Bridge Source Available when
Declared .reify/glossary.toml, entity metadata, ORM mappings a human or a framework wrote it down
Translation i18n tables, message bundles the product has been localised
Co-occurrence document headings that also name code there is documentation
Code vocabulary phrases the identifiers keep repeating always

The last runs only on what the others left uncovered, so it fills gaps instead of competing with better evidence. Boilerplate is filtered by measuring which words are ubiquitous in this repository, not from a curated list of get/set/manager that would fit one stack and no other.

What it reads

Code, 11 languages. Python, TypeScript, JavaScript, Java, Go, C#, Rust, Ruby, PHP, C/C++, Kotlin, plus SQL. Each has a test asserting it yields containers, callables and calls — because a missing grammar node gives you an index that looks healthy and holds one symbol per file. That is not hypothetical; it shipped for Java, and the test now catches it.

Documents, however the analyst wrote them. This is the part most code tools skip, and it is the only documentation many of these systems have.

Native Markdown, plain text, HTML (Confluence exports included)
Zip + XML DOCX, ODT, XLSX, PPTX
Delegated PDF, legacy binary DOC, RTF

Formats with no usable pure-Rust reader go to an external converter (pdftotext, mutool, antiword, textutil, soffice), tried in order. When none is installed, Reify names every tool it tried and how to install it rather than indexing nothing quietly.

Whatever the team declared. Frappe DocType JSON, Hibernate ORM mappings, Java and Spring .properties message bundles, i18n CSV tables. The highest-precision vocabulary a repository can offer, because the application itself reads it and so it stays true.

Multilingual

No language is canonical, English included. Concept ids are opaque and every label carries a language tag, so a Vietnamese, Thai, Korean or German requirement reaches English code through the concept layer rather than an embedding model — which is why the answer arrives with a line number instead of a similarity score.

~60 locales recognised on translation files and message bundles. Obligation and exemption language detected in 11 languages, so a rule written in any of them is mined as a rule.

Three things that only break once you leave Latin script, each of which broke here first:

  • Thai, Lao, Khmer, Japanese and Chinese have no word spaces, so a word index stores one enormous token and searching for a word inside it matches nothing. There is a trigram substring index for non-ASCII content; ASCII-only repositories never pay for it.
  • Korean glues particles to stems. 승인 becomes 승인을, and whole-word matching finds neither.
  • Sentence length cannot be counted in spaces, or every Thai requirement is rejected as too short to be a rule.

Install

curl -fsSL https://raw.githubusercontent.com/lambiengcode/reify/main/install.sh | sh

Prebuilt binaries for macOS (Apple Silicon and Intel) and Linux (x86_64 and aarch64). Or build from source:

cargo install --path crates/reify-cli

Then, in any repository:

reify init      # tells you what it will and won't index, and why
reify index     # 4.6s for 5,000 files; 0.7s after you edit one

Stay current, leave cleanly. reify upgrade replaces the binary with the latest release — through curl and tar as visible subprocesses, never an embedded HTTP client, with the checksum verified before anything is installed; --check only asks, and REIFY_OFFLINE=1 refuses the command outright. reify uninstall --yes removes the binary and nothing else; reify uninit --yes removes one repository's .reify/ store and the instruction block init wrote. Both show their plan first when run without --yes.

Shell completions
reify completions zsh  > ~/.zfunc/_reify
reify completions bash > /etc/bash_completion.d/reify
reify completions fish > ~/.config/fish/completions/reify.fish

Wire it into your agent

reify init --write-agent-instructions

Appends a six-line block to AGENTS.md or CLAUDE.md. No protocol, no server, no per-turn schema tax — this is the level the benchmark measured. For tools that read a different file (.cursorrules, CONVENTIONS.md, .windsurfrules, .clinerules/), paste the same four lines:

Before changing code here, run `reify context "<what you are about to do>" --toon`.
Run `reify why <file>:<line>` before modifying unfamiliar logic.
Run `reify impact "<symbol>"` before changing anything shared.
Treat INFERRED claims as leads to verify, not facts.

MCP, if you prefer it: reify serve --mcp exposes three tools — reify_context, reify_why, reify_impact — and three is the whole surface. A server's schemas are re-sent every turn of every session, so a tool built to save context should not charge rent to deliver it; a test asserts they cost under 600 tokens.

A model is optional and off until you name a command in .reify/llm.toml (command = ["ollama", "run", "llama3"]). Reify writes the prompt to its stdin. See Privacy for why that is a command and not an HTTP client.

Shell completions, and a pre-edit risk hook
reify completions zsh > ~/.zfunc/_reify     # also bash, fish

Inject a risk header before every edit, under 300 tokens, asserted by a test because it runs on every edit. Non-blocking by default: a hook that blocks edits gets uninstalled, and its warnings go with it.

{
  "hooks": {
    "PreToolUse": [{
      "matcher": "Edit|Write",
      "hooks": [{ "type": "command", "command": "reify preflight \"$CLAUDE_FILE_PATH\"" }]
    }]
  }
}

Keep the index current with a git hook:

printf '#!/bin/sh\nreify index >/dev/null 2>&1 &\n' > .git/hooks/post-merge
chmod +x .git/hooks/post-merge && cp .git/hooks/post-merge .git/hooks/post-checkout

Commands

Command What it does
reify context "<task>" The minimum knowledge for a change, plus a reading plan. The one that matters. --toon emits the agent format
reify why <file>:<line> What this is, what calls it, what data it touches, what changed it
reify impact "<symbol>" What depends on it — including through the database, where no call edge exists
reify explain "<term>" A business concept across every language, table and file it appears in
reify flow "<process>" The call sequence that carries out a business process
reify conflicts Documentation that disagrees with the code
reify rules Mined business rules, with evidence
reify concepts --suggest Turn what was mined into glossary entries you edit down
reify preflight <file> A risk header for an editor hook
reify report System scorecard
reify status Freshness, coverage, and what was skipped
reify llm status | preview Is a model configured, and exactly what would be sent
reify upgrade [--check] Replace this binary with the latest release. The only networked command; refused under REIFY_OFFLINE=1
reify uninstall --yes | uninit --yes Remove the binary | one repository's store and instruction block
reify serve --mcp Model Context Protocol over stdio
reify completions <shell> Completion script

Everything takes --json against a versioned schema and --budget <tokens>. Full output shapes: docs/json-schema/.

Agents should ask for --toon. JSON repeats every field name on every record; TOON states each section's columns once, then one row per record — measured at 57% fewer tokens for identical facts, with status still the first column of every row. The header carries the measured token cost of the very bytes being emitted, so the budget claim and the payload cannot drift apart. MCP's reify_context answers in TOON already.

Privacy

Your source code and your business documents never leave the machine. Reify opens no network connection — not "by default", at all. There is no HTTP client in the dependency tree, and cargo test fails the build if one appears.

For a company that will not let proprietary code near a cloud service, that is the difference between a tool they can evaluate and one they cannot.

Networking crates in Cargo.lock asserted zero, in CI
Sockets in the source asserted zero, in CI
Subprocesses git, reviewed document converters, and — for reify upgrade only — curl and tar; each named in a test
git reaching the network forbidden: every invocation sets GIT_NO_LAZY_FETCH=1, so a partial clone cannot fetch
Code from your repo, executed never. tree-sitter parses; it does not run
The store .reify/, gitignored by reify init

Model assistance is a command you configure, not an embedded client. Local models work with no extra code, no credential passes through Reify, reify llm preview prints the exact bytes before any are sent, and REIFY_OFFLINE=1 makes it unreachable no matter what a config file says.

Full threat model, including what is not covered: docs/privacy.md.

Architecture

One SQLite file per repository. No graph database, no vector store, no daemon.

  LAYER 4  Synthesis    optional model, cached, always INFERRED        llm.rs
  LAYER 3  Selection    seed → spread → budget knapsack → render       context.rs
  LAYER 2  Semantics    concepts, rules, conflicts       concepts.rs · rules.rs
  LAYER 1  Structure    symbols, calls, tables, sections, commits  extract/ · gitlog.rs
  LAYER 0  Substrate    walk, classify, hash, store      discover.rs · store.rs

An incremental index is byte-identical to a full rebuild, asserted by a property test that applies random edit sequences and compares canonical dumps. Each stage owns a disjoint set of edge kinds and its own invalidation trigger, which is what makes that true. Details: docs/architecture.md.

Measured performance

ERPNext, 5,064 files, 8-core M-series laptop.

measured
full index, no model 4.2 s
reindex, nothing changed 0.10 s
reindex, one file edited 0.49 s
reify context 57 ms
reify impact 0.2 ms
reify why 87 ms median, 168 ms worst — a git log -L subprocess; ~5 ms without
peak memory, full index 224 MB
store size 47 MB (33% of a 144 MB working tree)

A full index took 78 seconds until the full-text index was keyed by node id. uid is UNINDEXED in FTS5, so DELETE ... WHERE uid = ? scanned the whole table once per node — quadratic, and invisible until it was timed per stage. Editing one file took 5.9 seconds until the repository-wide stages learned to skip when their inputs are provably unchanged.

Reindexing was 2× slower until two things stopped being done repository-wide for a one-line edit. Discovery read and hashed all 5,285 files on every run — 222 ms of reading to find the handful that moved — and now stats past anything whose size and modification time are unchanged, hashing the rest across all cores. Reference resolution reloaded and re-resolved all 144,309 references, 167 ms to resolve and 145 ms to commit, regardless of how little changed; it now re-resolves only references whose name the edit added or removed, plus those inside the edited files, which is provably the whole affected set. Measured against the previous build on the same machine: full index 6.75 s → 4.25 s, no-op reindex 256 ms → 101 ms, one file edited 974 ms → 486 ms.

reify why was 1.5 seconds on a blobless clone, and returned a worse answer than it does now. git log -L needs the file's blob at every revision it walks, and on a partial clone those blobs are not local — so git was silently fetching them from the remote, one query costing 29.5 s of network and 0.07 s of work. The subprocess now runs with GIT_NO_LAZY_FETCH=1: git answers from local objects or fails, and either way the command returns in milliseconds. Eleven of twelve sampled symbols used to hit the timeout; none do.

That fix is also why the privacy claim below is true of the whole process tree rather than just this binary. Reify never opened a socket; the git it spawned did.

REIFY_TIMING=1 reify index prints the per-stage breakdown that found every one of these.

Reproducing the benchmark

Nothing in the tables above was typed in by hand. The task sets, raw per-task outcomes and the charts are all committed.

# 1. Freeze a task set from real merged commits, ending before a chosen base
reify-bench tasks --repo <repo> --after <base-sha> --out benchmarks/tasks/mine.json

# 2. Index at that base, so the change being asked for is genuinely absent
git worktree add /tmp/base <base-sha>
reify -C /tmp/base init && reify -C /tmp/base index

# 3. Retrieval, then with a model
reify-bench run   --repo /tmp/base --tasks benchmarks/tasks/mine.json --out results/
REIFY_LLM_COMMAND='<your model cli> {prompt}' \
reify-bench agent --repo /tmp/base --tasks benchmarks/tasks/mine.json --out results/

# 4. Report and charts, generated from the raw results
reify-bench report --in results/ --out benchmarks/REPORT.md
reify-bench chart  --results "Mine=results/" --out assets/

The task set is frozen before any condition runs. The report includes a "Where Reify lost" section listing every task the baseline won, and it is a required part of the document rather than an optional one.

Development

cargo fmt --all
cargo clippy --all-targets -- -D warnings
cargo test
cargo bench -p reify

All enforced in CI, along with a full test run under blocked network egress. cargo test includes crates/reify/tests/offline.rs, which fails the build if a networking crate enters the dependency tree.

Fixtures live in fixtures/minierp — a small business system with planted knowledge: a documented rule, code that contradicts it, a magic number, a bilingual concept, cross-module coupling that exists only through a shared table. Every claim Reify makes about it has a known right answer, so a failure there is unambiguous.

Adding a language is a grammar, a node-kind mapping, a classify case and a golden test. See CONTRIBUTING.md for the design rules that are load-bearing rather than stylistic.

FAQ

We have no developer documentation at all. Only BA documents, and they're old. That is the case Reify was built for. It reads DOCX, PDF, XLSX and the rest, splits them into citable sections, and — critically — tells you where they disagree with the code, so an old document becomes evidence rather than a trap. With no documents at all it falls back to the code's own vocabulary, and still gives you why, impact and history.

Our one expert has no time to help set this up. They don't need to. reify init && reify index needs nothing from them. If you can borrow an afternoon, reify concepts --suggest turns what Reify mined into a draft glossary they correct rather than author.

Will this actually let us hire? It removes one specific bottleneck: a new developer, or an agent, being unable to find out why code is the way it is without interrupting someone. That is a real part of the ramp, not all of it. Anyone claiming a tool replaces eleven years of context is selling something.

Is this another RAG thing? No vector database, no embedding model, no chunking. Retrieval is lexical and graph-based, which is why every answer comes with a line number instead of a similarity score.

My repo is 3,000 lines. Should I use it? No. Use ripgrep. Under roughly 20k LOC Reify buys you nothing a grep and a scroll wheel don't.

Does it send my proprietary code anywhere? It cannot. There is no HTTP client in the binary, and a test fails the build if one appears. reify upgrade is the one command that reaches the network, through curl and tar you can see, and REIFY_OFFLINE=1 refuses it.

Conflicts found nothing in my repo. Is it broken? Probably not. Detection requires five conditions at once and is biased hard toward silence, because a conflict detector that cries wolf gets switched off in week two and takes its true positives with it.

Roadmap

The first improvement pass is done. The history prior (every merged commit is a labelled example: message ≈ ticket, changed files = answer), test-to-code edges, iterative refinement and a fourth repository all shipped; the weight fit failed its held-out validation and was reverted per its own pre-registration; and the scorecard stands at one of seven targets met, each number printed next to its bar. The open problem is the modern-TypeScript case, where nothing yet closes the vocabulary gap between how people describe UI changes and how the code spells them.

Status

Early, and measured. Known misses, all documented rather than buried: the store is 33% of the working tree against a 5% target, reify why is 205 ms against 20 ms, and Windows is untested.

License

Apache-2.0. Patent grant included, so an agent vendor can actually ship it.

About

Your coding agent is smart. Your legacy codebase is the problem. Reify gives it the context to understand and safely change large, unfamiliar codebases — 100% locally.

Topics

Resources

Contributing

Stars

2 stars

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages