trelix v1.0 to v2.7: When "It Works" Meets "It Scales" Trelix evolved from v1.0 to v2.7 in thirteen days, fixing a critical config bug and adding a knowledge graph, seven retrieval legs, agentic loops, federated multi-repo search, and a GitHub Actions bot. The knowledge graph module builds a CodeGraph with Louvain community detection and LLM-based concept extraction, while new retrieval legs are grounded in papers like RAPTOR, HyDE, and FLARE. A deliberate breaking change renamed `trelix graph` to `trelix call-graph` to reserve the name for the knowledge graph feature. Twelve days after I shipped trelix v1.0.0, I was staring at a RetrievalConfig object with two conflicting sets of values and no idea which one was actually running. I'd built AdaptiveRouter to accept a retrieval config parameter so callers could override the environment-variable defaults programmatically. Except it didn't. The constructor took the parameter, and then quietly ignored it and built its own instance from env vars anyway. Nobody had wired the plumbing from Retriever through QueryPlanner down to AdaptiveRouter. init . It's the kind of bug that doesn't throw — it just makes your carefully-set config a decoy. That fix landed in v2.7.0, PR 55, thirteen days and seven minor releases after launch. In between, trelix went from "search my repo well" to something closer to a platform: a knowledge graph, seven fused retrieval legs, an agentic loop, federated multi-repo search, and a GitHub Actions bot that reviews your PRs. Here's what actually shipped, grouped by what it was trying to solve rather than by version number. v1.0 already had hybrid BM25 + vector + call-graph search. What it didn't have was any notion of the codebase as a system — which files cluster into modules, which symbols sit at the center of the import graph, which concepts a human would use to describe an architecture. v2.0.0 2026-06-28 and v2.1.0 2026-06-30 fixed that. The new trelix/graph/ module builds a CodeGraph as a NetworkX MultiDiGraph , unifying call, import, and type edges into one traversable structure. On top of that, Louvain community detection clusters the graph into architectural modules — run trelix graph ./repo and you get the top communities, not just a flat symbol list. ConceptExtractor layers an LLM on top of symbol batches to name those communities in plain English, and it's built to fail quietly: any extraction error returns rather than crashing the pipeline. GraphVisualizer.export html renders the whole thing as an interactive Pyvis HTML page with community coloring, gated behind pip install trelix knowledge-graph so the base install doesn't inherit the dependency weight. Graph search became a first-class retrieval leg — graph search enabled=True runs a CodeGraph BFS as a fourth leg after RRF fusion — and pagerank boost enabled uses import-graph centrality to boost symbols that sit at architectural chokepoints. None of this is static: GraphUpdater.update file is wired into trelix watch , so the graph and its communities update incrementally as files change, instead of requiring a full rebuild. This came with the release's one deliberate breaking change: trelix graph — which used to mean "show me callers and callees of this symbol" — got renamed to trelix call-graph . The name trelix graph now means "build the knowledge graph." I made the call that a growing surface area needed the more intuitive name reserved for the bigger feature, and documented the rename explicitly in the changelog rather than let people discover it by trial and error. v1.0 had three retrieval legs. By v2.2.0 it had seven, and every one of them is grounded in a specific paper rather than a hunch. The fourth leg was the graph BFS above. The fifth is RAPTOR-style arXiv:2401.18059 file-level summarization — file summary leg enabled , gated behind TRELIX FILE SUMMARIES ENABLED=true at index time — which lets trelix answer "explain this codebase" questions that no symbol-level chunk could answer alone. The sixth is HyDE arXiv:2212.10496 : instead of embedding your raw natural-language query, hyde fallback enabled generates a synthetic code snippet and embeds that , closing the semantic gap between "how do I validate a JWT" and the actual token-validation code. The seventh is multi-query expansion, which decomposes one query into N variants and RRF-fuses the independent retrievals for broader recall. Layered over all seven is FLARE arXiv:2305.06983 — a confidence-gated re-retrieval loop that watches synthesis output for uncertainty phrases and triggers another retrieval pass when it finds them, rather than committing to a possibly-wrong first answer. None of this is worth shipping without a way to measure whether it's actually better, so v2.1.0 added a CoIR-format eval harness ACL 2025, arXiv:2407.02883 — trelix eval --golden