A graph instead of a guess: AI Architect Codebase, traced through its source
An agent asked who calls this function has two options: grep and hope, or read a graph. This server builds the graph. It parses a repository with tree-sitter, resolves relationships across files, and answers structural questions from an in-process property store, without ever writing code, opening a pull request or calling a language model.231 It is version 0.11.1, MIT-licensed, and pinned to one Rust toolchain.1 What follows is its architecture, the constants it computes with, and the places where its own documentation and its own code disagree.
One process, one loop, and two different products
There is no daemon, no port and no SDK. The host writes one JSON line to standard input, a single thread dispatches it against a short list of implemented methods, and the answer goes back on standard output.345 The protocol layer is hand-written on purpose, and the file says why: so that the agents know exactly what is happening.3 Two endpoints answer politely for capabilities the server never declares, because some clients probe them on connect and read the resulting error as a broken connection.6
The more consequential decision is the tool profile. Resolved once at startup, it decides whether the host sees twenty-six tools or eight.789 The same binary is therefore two different products depending on who launched it, and the launchers disagree: Codex and Gemini are started with the core profile, Claude Code and the desktop bundle pass no flag at all and get everything, while all three bundled skills tell the agent to use the eight-tool profile.12
From a source tree to something you can query
The walk is bounded before anything is parsed: a hundred thousand files, ten mebibytes each, two gibibytes in total, sixty-four levels deep, five seconds of parsing per file.1314 Those are not round numbers picked for comfort; the first one records the trees it was sized against.13 Eleven languages are recognised, ten with a deep specification and Ruby with a shallow one, and the ambiguous extensions are resolved by a fixed table so that a mis-detection is observable rather than silent.1516
What comes out is a property graph of twenty-four node labels and ninety-eight relationship tables, written as a directory rather than a file, with a search index and four sidecars beside it.1719 Search fuses a lexical and a vector ranking by reciprocal rank at K = 60.20 Communities come from Louvain, followed by a repair pass, because phase one alone leaves the graph over-fragmented — and the file records the measurement that showed it.21 Impact walks the graph to depth twenty.22
What each answer admits about itself
Most tools answer a question. This one also answers how much of the question it could actually settle. A completeness marker reading exact or lower-bound rides on four answers.27 A freshness block saying whether the graph still matches your working tree rides on exactly three tools, and no more.28
The interesting part is how that block is attached. An earlier revision set it at each named return, which covered the exits its author could see and silently missed every early failure that propagated before them; it is now attached at the single exit, and the file explains that history rather than hiding it.28 The same instinct runs through the coverage report, which carries a caveat stating it is a best-effort signal and not a guarantee,29 and through the indexer, where a file whose parser panics is quarantined and counted rather than dropped.30
Measured, chosen, or merely claimed
The repository sets itself a rule: a named constant records its source or its measured rationale, and where a value was chosen by judgment the comment says so.44 It largely keeps it. The change-risk score is labelled in its own file as heuristic and not paper-backed, with arbitrary weights.43 The response budget is the opposite case, derived step by step from the host's own cap, extracted from the binary and checked against a real rejected response.42
The measured column is genuinely measured: a pre-registered head-to-head over twenty questions, an incremental index timed against a full one, a coverage figure with its tool and its date.363738 The head-to-head even states its own weakness: the corpus informed the fixes it measures, so it is a regression benchmark and not a generalisation test.36 The claimed column is where a reader should slow down. “1500+ tests” appears on the badge and three more times; counting test attributes in the tree gives 1 127, and the true figure cannot be settled without running the suite.39 The 91 % coverage badge has no committed report behind it.40 A 38× speedup sits in the same document as a measured 76×, unreconciled.41 And the graph-schema line in the README undercounts the code by a factor of one and a half to nearly three.18
The verdict the project gives itself
The repository ships its own evaluation harness, and keeps its runs. The most recent one, dated 2026-08-08, scores 0.694 against a target of 0.85 and a per-language floor of 0.75, and prints the verdict NOT PRODUCTION-GRADE.34 The weakest questions are the ones a code-intelligence tool exists to answer: which classes implement an interface, at 0.250, and what a function calls, at 0.451. A second run is committed beside it and agrees, to the third decimal.35 None of this appears in the README. It is in the repository because the runs were kept rather than deleted, which is the reason this paragraph can be written at all.