Setup
The base graph was graphify’s AST extraction ofsrc/ (199 code nodes). The intent layer was
whyfile’s own enrichment of its docs/adr/ trail (the decisions, mechanisms, constraints,
and trade-offs behind the pipeline). Every query below is whyfile why / explain /
coverage / list-intent, read-only and LLM-free, run against that enriched graph.
The loop, gap by gap
Gap: the pre-flight time estimate is optimistic
graphify.llm discards usage. That decided the shape of two fixes: the honest estimate
had to stay an estimate (we made the constants and the concurrency divisor honest instead of
pretending precision), and the “honest cost” fix had to report estimated tokens, not real ones.
Gap: throughput / concurrency does not help
--max-concurrency is a latency lever. Our pressure test
found it delivers no latency on the subscription backend (a short investigation confirmed
graphify’s upstream _call_llm holds a Lock around the claude-cli subprocess, serializing calls).
So the intent named the promise, and reality broke it. The tool also pointed at the real lever:
“per-section fan-out multiplies the call count.” That reframed gap #1 entirely: the fix is not
“make it parallel” (impossible from here, the Lock is upstream) but “make fewer calls” (batch
Pass B), plus correcting the docs to say concurrency only helps the API backend.
Gap: honest cost (subscription is not “$0”)
Gap: Pass C is one giant call
The guardrails we had to respect
Two things this demonstrates about the product
- The intent layer answered “why is the code like this?” for real, un-cherry-picked work. The fixes were designed from the tool’s output: the estimate stayed an estimate because the tool said real tokens are upstream-blocked; gap #1 became “batch, do not parallelize” because the tool named the upstream serialization and the call-count lever; the cost-honesty fix was validated by a constraint the tool had already recorded.
-
Coverage and silence are findings too.
whyreturning no strong match for Pass C told us, correctly, that its design was undocumented, so we knew the change was safe and that it needed a new ADR. A tool that surfaces where the recorded reasoning is thin is as useful as one that surfaces where it is rich.