Compute first, narrate second
Engineers act on a model's explanation of how code works, and a fluent explanation can include call paths that do not exist. In FAFOHive I decided the explainer would compute first and narrate second, with that order enforced in code: explain_code_path does every structural step before a language model is called, using the parser-built code graph and the index, so every structural statement in an answer comes from a computation that already ran. Each request is pinned to one graph generation, so the path, the code and the narrative all describe the same version.
Filtering in the data layer, refusing in the open
Filtering happens in the data layer, so the model never sees an unresolved edge it could build on. When the graph does not fully cover the files a query touches, the tool returns a typed "coverage incomplete" result and has no fallback to free-form explanation. I refused a caveated fallback on purpose.
A caveat attached to a plausible guess is the first thing a reader stops seeing.
Citations, and the same contract for every provider
Every answer carries file and line references, so a reader can check the prose against the code it cites in seconds. Any of the language-model providers the service supports can do the narration, including a local open model; the contract binds every one of them, so swapping a frontier model for a local one changes the prose and leaves the structure untouched.
The full account, including why I refused a fallback, is A code explainer that is not allowed to invent.