architect
FreeRun a full dev cycle on one change: clarify, plan, execute, lint, fix. Start every change here.
The English summary is being prepared. Showing the original description.
Locate and understand code through the project's graft graph before reading: where-is-X, how-does-Y or what-calls-Z.
The English summary is being prepared. Showing the original description.
See how to installReview the instructions the agent will receive before you install.
graft/ holds a graph of this repo: small markdown nodes that each explain one
part in prose and name the exact file:line spans they cover, plus a wiring
graph of who-calls-what. Querying a node costs a few hundred tokens; rebuilding
that understanding by reading source costs thousands, and misses the edges.
Run every command through the project's runtime:
cd "$(git rev-parse --show-toplevel)" # the graph is at the repo root
bin/harness graft ask "<question>" --source
bin/harness graft <args…> resolves the backend, builds the graph if there is
none, and passes everything after graft straight through. A bare graft is a
different command with a different failure mode: in a repo whose graph has not
been built it answers "no matching nodes — try different words" and exits 0,
which reads like a bad question rather than a missing index. bin/harness graft
builds one first.
Every command below is $0, needs no API key, and returns in under a second.
There are six of them. Pick the one that fits the task, run it, act on the
answer; don't chain tools hoping for more. Most tasks need one call.
If several repos are checked out side by side, each has its own graft/.
Neither knows about the other's files, so run every command from the repo whose
code you are working on.
bin/harness graft ask "<question>" --source: locate + understand (the default)Ranked retrieval over the graph, routed automatically between prose nodes and
the wiring graph, returning the top hits with exact file:line.
--source inlines the code at each hit, the ≤8-line crux of each
definition, so the result IS the code you need, no follow-up file read. Add
--full only when the crux is too small to act on.--in <dir>/ narrows to a subtree before ranking; -n N caps results (default 8).bin/harness graft grep "<pattern>": exhaustive findRegex (or --fixed for a literal) over every indexed file, hits grouped by
enclosing symbol and ranked by coupling; it also reports files it couldn't read.
ask is ranked top-N and will miss instances;
grep won't. One grep replaces a spray of asks.func (s *Server) GenerateHandler) returns nothing even
when the code is indexed. If a grep misses, loosen it (drop the receiver
and signature, keep the bare name) and retry — do NOT switch to raw
grep -rn, which is slower and unranked.-i case-insensitive; --in <dir>/ scopes to a subtree. Raw grep -rn is
only for files graft genuinely doesn't index (docs, configs, brand-new files).bin/harness graft skeleton <file>: a file's API at a glanceSignatures-only view of one file (every function / method / type with its span) in ~200 tokens, ~10x cheaper than reading the file.
map already named.bin/harness graft callers <symbol>: the exact edgesPrecomputed call/reference edges, not a text search. Symbol can be bare
(Foo), qualified (Class.method), or package-qualified (pkg.Fn).
--direction in: who calls/references this; run before you
rename, delete, or change its signature.--direction out: what this symbol itself calls/depends on (the old callees).--depth N: walk transitively N hops for the full blast radius (the old
impact); --depth 2 is the usual "what breaks if I touch this".--depth all: the entire connected closure — every source reachable
through the edges. Reach for this before a refactor, rename, or any
multi-file change: it surfaces the sibling and downstream files (platform
variants, a module you must split out) that a single-file edit would miss.bin/harness graft map: orientation for an unfamiliar repo or areaA token-budgeted tour: directory clusters, per-directory hubs, and global hotspots, straight from the wiring graph.
map alone is the answer: read the hub cards it names; do NOT then skeleton
or ask your way through every subsystem it lists. --max-dirs N widens it.bin/harness graft build / bin/harness graft checkEvery tool above refreshes the graph itself before answering, so what those tools
return always describes the code as it is right now — including edits you just made
and have not committed. You do not need to run build after editing.
bin/harness graft build is for the LLM layer (--deep adds a concept map;
skip unless asked). bin/harness graft check refreshes and then verifies, and
fails when the graph cannot be rebuilt — the pre-push hook runs it. bin/harness graft ensure builds only when there is no graph at all, which is what
pre-commit runs, and bin/harness setup builds one on a fresh clone.
graft/ is a local, gitignored cache, never a commit.
One caveat, if you grep the markdown under graft/ directly: those cards are a
projection, rebuilt at the end of the turn rather than on each query, so after an edit
they can lag. The tools above never do — prefer them, and treat a card's spans as
stale if you have edited that file this turn.
| When you're… | Reach for | Calls |
|---|---|---|
| Onboarding / "explain this codebase" | bin/harness graft map, then read the named hub cards | 1 |
| Understanding a flow ("how does X work") | bin/harness graft ask "<flow>" --source | 1 |
| Finding where a change belongs | bin/harness graft ask "where is <behavior>" --source | 1 |
| Editing a symbol you can already name | bin/harness graft grep "<symbol>", edit at the file:line (skip ask — you know where it is) | 1 |
| Renaming / deleting / changing a signature | bin/harness graft callers <sym> --depth 2 first | 1 |
| Refactor / multi-file change (before editing) | bin/harness graft callers <sym> --depth all — map every connected file, don't stop at the first | 1 |
| "What does this depend on?" | bin/harness graft callers <sym> --direction out | 1 |
| Finding every occurrence of a pattern | bin/harness graft grep "<literal>" | 1 |
| "What's the API of this file?" | bin/harness graft skeleton <file> | 1 |
| Debugging a failure in area X | bin/harness graft ask "<symptom>" --source, then callers on the suspect | 1–2 |
| Judging a diff's risk before merge | bin/harness graft callers <changed sym> --depth 2 | 1 / symbol |
| Working inside one area of a large repo | add --in <dir>/ to ask / grep / callers | n/a |
covers: list already gives exact file:line for every symbol, so
cite straight from it. The spans are generated from source and authoritative;
don't re-open or re-grep files to "double-check".bin/harness graft grep "<symbol>" for the exact file:line, then edit.
Reserve ask for when you don't yet know where the code lives — an ask
round-trip is wasted on a target you can already name.bin/harness graft grep the symbol to find where it lives now, or bin/harness graft build
to refresh.Each retrieval tool opens its output with a [graft] tokens saved ≈ N line:
the estimated tokens that call saved versus reading the files it covers whole.
Whenever you used any graft tool in a turn, close your reply with a one-line
tally summing those numbers across every graft call you made, e.g.
🌱 graft saved ~12,400 tokens this turn (3 calls). A call with no such line
(tiny files, where the pointers cost as much as the source) saved nothing, so
skip it.
Never pipe a graft command through head, tail, or sed -n. Every tool
is already capped and states what it dropped; clipping it costs you hits you
asked for and silently drops the savings line.
file:line, never a whole file to rebuild understanding graft gives.graft/ directly (plain markdown;
graft/INDEX.md indexes the nodes), but the tools above are faster and
exhaustive where it matters, so reach for them first.No reviews yet. Tell others what you thought.
No login needed. Share how it worked for you, ask a question, or note where it did not run.
No comments yet. Be the first to write one.
Run a full dev cycle on one change: clarify, plan, execute, lint, fix. Start every change here.
The English summary is being prepared. Showing the original description.
Write a document an agent consumes — a skill, an AGENTS.md, a README, a docblock, or any file reached by a pointer.
The English summary is being prepared. Showing the original description.
Stress-test the owner's plan, decision or idea by interviewing them to a shared understanding before any work starts.
The English summary is being prepared. Showing the original description.
Remove AI tells from French prose without lowering its register — a reply, a `.po` target, a French post.
The English summary is being prepared. Showing the original description.
Remove AI tells from English prose — a README, a comment, a user-facing string, a review. French is `humaniseur-fr`.
The English summary is being prepared. Showing the original description.
Turn surviving mutants into better tests or bug reports: on a survivor, a red MSI gate, or before a threshold drops.
The English summary is being prepared. Showing the original description.