The Problem

Coding agents burn tokens grepping a repository and reading whole files to answer one question: what do I touch, what breaks, and which tests prove it? ripwire replaces that pass with a ranked, deterministic call graph — signatures at 80% fewer bytes than bodies, roughly 5% of a grep-and-read pass's tokens — so the agent gets a map before it reads anything.

What This Does

ripwire is a zero-dependency C++23 CLI plus an optional MCP server. It parses 21 languages via vendored tree-sitter grammars (src/, 154 files) and emits a ranked symbol list with per-symbol risk: complexity, git churn, change amplification (touch ingest and 266 graph nodes feel it), purity, and test coverage. Output is a token-budgeted answer or a self-contained HTML call-graph (--html, no CDN).

The skills/ folder (24 files) installs task-shaped agent skills so Claude Code, Codex, Cursor, Windsurf, Gemini, opencode, and aider know when to invoke the tool. bench/ (299 files) is a serious evaluation harness — head-to-head runs against other repo tools with preregistered protocols (bench/headtohead/r3-headroom-2026-08-03/PREREGISTRATION.md) and an agent-loop edit suite (bench/agentloop/editsuite/).

How It Is Wired

The static analysis mapped 189 internal modules but resolved only 13 import edges — all in test/ fixtures, zero circular dependencies. That means the core src/ call graph has not been traced by this pipeline; I won't invent it. What is grounded: the install script (scripts/install.sh) drops a single binary and activates skills for every agent on the machine; the MCP endpoint is configured via .mcp.json and .codex-plugin/plugin.json; CMakeLists.txt builds the binary. The bench fixtures (bench/h4fixtures/*/main.*) are language parsers' test inputs, not the product entry point.

How To Use It

The README documents both steps verbatim:

RIPWIRE_REPO=redhat-et/ripwire bash -c "$(curl -fsSL https://raw.githubusercontent.com/redhat-et/ripwire/main/scripts/install.sh)"
ripwire . --for="incremental cache invalidation"

That second line answers in ~4.3K tokens: ranked symbols with doc comments quoted in place, risk annotated, and one-hop call context. No API key, no embeddings, no daemon. The MCP server is the optional second interface.

Real-World Use

Before editing ingest in this repo, an agent runs ripwire . --for="incremental cache invalidation". The output ranks kCacheMagic first, flags ingest as high-churn (128 recent edits) with 266 downstream graph nodes affected, and names the tests that reach it. The agent edits with a blast-radius map instead of guessing.

Code Health & Issues

Static analysis found 1,009 findings (250 high, 758 medium, 1 low), one kind: deep nesting ×60 in three bench files (bench/bench_sort_large.cpp, bench/bench_svector_diff.cpp, bench/bench_svector_wave.cpp), max indentation depth 17. Fix: early returns and extracted inner blocks.

SDLC audit (7 findings, 0 critical):

  • High — GitHub Actions pinned to tags, not commit SHAs (.github/workflows, e.g. softprops/action-gh-release@v2). Tags can be moved; pin to SHA.
  • High — continue-on-error on a correctness step (.github/workflows/ci.yml:107) lets failing tests report green.
  • Med — No least-privilege GITHUB_TOKEN declaration in CI.
  • Med — No Dependabot/Renovate; advisories sit unpatched.
  • Med — No dependency vulnerability scan in CI.
  • Med — 12 blobs over 5MB in third_party/deps/csharp/src/parser.c (28.3MB, 26.9MB, 19.7MB); every clone pays for them.
  • Low — No timeout-minutes on CI jobs.

Tests, CI, license, and lockfile are present; no committed secrets. present/ declares typescript (2 majors behind) and react (1 major behind), but that's the showcase deck, not the product.

The Bottom Line

Serious engineering: honest benchmarks with preregistered protocols, a real token-budget story, and a clean zero-dependency design. The CI hygiene gaps are exactly the kind a consultant flags before production. Use it if your agents spend real tokens mapping unfamiliar repos; the bench suite alone is worth reading.