Find what a change might break

semantic impact, callers, tested-by and types.

Written By Dustin

Last updated About 3 hours ago

semantic diff tells you what you changed. These four tell you what else is downstream of it.

Start with the one that needs no arguments

tovio semantic impact

With no moniker, impact seeds itself from your own change — the symbols this commit removed or altered — and walks the dependency graph backwards from each of them, reporting what depends on them and which tests cover those dependents. It is the closest thing to "what might I have broken".

Additions are deliberately excluded from the seeding: a symbol that did not exist before cannot have prior dependents, so including it would only pad the report.

tovio semantic impact 'greet().' --depth 5

Name a moniker to analyse a specific symbol, and --depth to control how many hops of dependents to follow. The default is three.

The one-hop lookups

CommandDirection
semantic callers <moniker>Who calls it. One hop, not a closure.
semantic tested-by <moniker>Which tests exercise it.
semantic types <moniker>What it extends or implements. Upward only.

callers answers "who calls this", where impact answers "what would break" — reach for callers when you want a short, precise list and impact when you want the blast radius.

types is upward only: it tells you what a type implements, not who implements it. The downward direction needs a reverse index the graph does not carry today.

Read an empty result carefully

This matters more here than anywhere else in the collection, and the command says so on every run:

Call edges are extracted syntactically. No recorded dependents is not proof of no impact.

Concretely, these are invisible to the parsers and will not appear in an impact report: a call made through a trait object or interface value, a call generated inside a macro body, a call reached by reflection or dynamic dispatch, and anything in an unindexed language, a file above the indexer's size cap, or a policy-protected file you cannot read.

Use the report as a strong lead, never as a clearance.

Two other honest limits

The change seeding is file-granular. A symbol counts as changed when the file defining it changed, so every symbol in a file you edited becomes a seed. A caller in the same file will show up as a seed rather than as an affected dependent.

The walk is bounded. It stops at the hop limit and at a node cap, and it prunes anything outside your readable scope. When it cuts short, it says so — treat a truncated report as partial.

For agents

The same impact and relation queries are on the MCP surface, scope-gated identically. An agent about to change a signature can ask what depends on it first, with the same caveat about syntactic edges applying to its answer too.