adrRadar
In developmentA Rust tool that detects undocumented architectural decisions across commits and cites the structural evidence for each hypothesis.
At a glance
- Outcome: Diffs commits to propose undocumented decisions like “possible new module boundary.” Cites structural evidence for every hypothesis.
- Status: Runs scan, diff, suggest, accept/reject and MCP in deterministic sequence on a real repository. Version 0.1.0 remains in development on September 11, 2026; public
mainmatches the August 28, 2026 commit. Roadmap pre-v1 hardening gates are met, but no tag, release or v1.0 exists. - Role: Solo. I own the invariants, signature catalog design, acceptance criteria and review; implementation is AI-assisted and reviewed.
- Stack & libraries: Uses 8 Rust crates, tree-sitter import analysis, git notes review state and a JSON-RPC 2.0 MCP server.
- Source: Public, MIT-licensed: github.com/Griffinhale/adrRadar. Includes a contributing guide and script that regenerates all five README figures from live runs.
- Validation: Counts 118 test functions: 67 unit and 51 integration. Integration builds real git repositories and drives the compiled binary through scan, diff, accept and reject using two synthetic Rust packages and golden contracts. CI runs fmt, clippy with warnings denied, tests and figure checks; self-scanning fixed 13 false abandoned-ADR claims, while the corpus script reports unreadable discoveries across six public repositories and 174 ADRs at its last run.
- Limitations: Deep import analysis covers only Rust; Go, TypeScript, Python, timeline mode and decision lineage have not started. Observed limits: only dependency inversion declares a Strong floor, custom signatures use five requirement kinds, and most default views remain silent without
--all; the first tier treatsstd,coreand external crates as boundaries. Boundary identity can duplicate crates across manifest and import-cluster tiers; fixed-root discovery misses nested monorepo ADRs and marks statusless records unsupported.
Detection model
Detects unrecorded decisions beyond existing ADR tools. Models each SHA through files, manifests, module boundaries, dependency edges and coupling metrics. Diffs models into deterministic events and matches clusters against curated signatures while keeping facts separate from hypotheses.
Separates detection and interpretation into crates across three concepts. A structural property describes one model: these clusters disagree with the directory layout right now. A structural event describes a diff: this edge reversed. A signature interprets both as a possible decision. Red-teaming expanded two layers to three because permanent properties would otherwise fire on every scan.
Confidence and evidence
Optimizes for precision over recall and reports how many structural events matched no signature. Quiet means “nothing happened here”; a large unmatched count identifies a catalog gap.
Uses qualitative tiers from distinct signal classes: Strong needs three and Suggestive needs two. Keeps instability and forwarding ratio as numeric evidence, never confidence. Signature floors protect precise single-signal matches; only Strong appears by default, with others behind --all.
Hashes evidence IDs from canonical artifact kind, subject, detail and exact measurement bits. Equivalent evidence keeps one ID across crates and runs. A golden-model contract test re-mints IDs to detect serialization or minting drift; tests require every claim to cite evidence.
Review and rendering
Shares one core through a review CLI and MCP server. Git notes carry accept/reject state with the repository. MCP serves only accepted hypotheses, defaults to Strong and reports counts and reasons for withholding unreviewed, rejected or lower-tier findings. all_confidence widens only the tier filter.
Provides an optional renderer crate that sees only core evidence and removes uncited sentences. A feature-gated backend reaches local loopback Ollama through scan --llm or diff --llm; its host is not configurable. Prompts contain only cited evidence packets.
Links no default backend and tests the renderer with a fake. It has never run against a real model at scale. The renderer checks citation syntax, not whether claims describe their evidence.