Who calls this, and what breaks if I change it

Call graph around one symbol, and the blast radius of a diff — without reading a single whole file.

Prompt#

Who calls ResolveAgentCmd, and what breaks if I change it?

What the Chair does#

Queries the workspace's own symbol index: callers first, then the reach of the files you are about to touch.

MCP calls#

trace_path({ "symbol": "ResolveAgentCmd", "direction": "callers", "depth": 2 })

Then the blast radius of the change itself:

impact({ "paths": ["client/internal/config/config.go"] })

Or against a branch range instead of the working tree:

impact({ "git_range": "main...HEAD" })

And read only the body you actually need:

code_snippet({ "symbol": "ResolveAgentCmd", "max_lines": 120 })

CLI equivalents: orch symbols trace <name>, orch symbols impact, orch symbols snippet <name>, orch symbols arch.

Expected response#

trace_path returns {root, nodes, edges}, one confidence per edge. impact returns {paths, touched, callers, edges}touched: [] when the diff reaches nothing indexed. architecture returns {dirs, edges}, a directory-level map worth reading before you decide where a change belongs.

Gotchas#

  • Read the confidence. 1.0 means the resolver matched an import or the file itself; 0.7 matched a receiver type; 0.4 is the generic tokenizer matching a bare Name( against same-language symbols. A 0.4 edge is a lead, not a fact.
  • Not indexed is an error, not an empty result. Languages orch has no parser for contribute no edges at all.
  • The graph only sees symbols with a signature. Constants, table names, schema flags, feature codes and anything that lives inside a string are invisible to trace_path — grep for those. This is the one case where reading files still wins.
  • impact with no arguments uses your working-tree git diff --name-only. With paths given, git_range is ignored.
  • depth is capped at 5 and defaults to 2. Depth is where these queries get expensive; widen it once, not by habit.
  • Untagged code is still visible here. Unlike search_shared_symbols, which answers with orch:export symbols only, the graph tools read local definitions too — so a private helper that nobody exported still shows up as a caller.
  • Pass session on any of these when you want the bytes-saved accounting to land under your seat in usage_status.