- 6edge kinds extracted from source by the parser
- 3languages with edge extractors: Rust, Python and TypeScript
- 294,033of the index's 294,362 code chunks covered by the graph
- ~19,000files in the monorepo the graph is built over
Edges from a parser, not from a model
In FAFOHive, my agents had to know the blast radius of a symbol before changing it, and a language model asked for call paths invents some.
Structure must come from a parser and a database; a model may only put that structure into words.
tree-sitter extracts calls, imports, implements, references, definitions and re-exports from source, and they land in partitioned PostgreSQL edge tables. An edge whose endpoint is not indexed yet stays pending, and a resolver promotes it only once both endpoints are indexed. Graph generations let me rebuild an index without serving a half-built graph, and each request is pinned to one generation.
Two tools over one graph
trace_symbol_dependencies is plain traversal: a bounded breadth-first search in SQL with a Redis fast path, returning edges and nodes with file and line. explain_code_path walks the same graph between two points and only then hands the proven path to a model to describe.
A standing rule before every change
I also made the graph part of how agents work. Their operating doctrine requires a sequence before any change, told in A code explainer that is not allowed to invent.