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.0means the resolver matched an import or the file itself;0.7matched a receiver type;0.4is the generic tokenizer matching a bareName(against same-language symbols. A0.4edge 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. impactwith no arguments uses your working-treegit diff --name-only. Withpathsgiven,git_rangeis ignored.depthis 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 withorch:exportsymbols only, the graph tools read local definitions too — so a private helper that nobody exported still shows up as a caller. - Pass
sessionon any of these when you want the bytes-saved accounting to land under your seat inusage_status.