Ask another project how it solved X
Raise a blocking ask against another project's Chair, get a symbol reference back, and fetch the body — no pasted code.
Prompt#
Ask project checkout how it solved idempotent retries before I write ours.
What the Chair does#
Routes a blocking ask to the running Chair of the named project; that Chair answers
with a pointer to the symbol, and your seat fetches the body itself.
MCP calls#
ask({
"question": "How does checkout make provider retries idempotent?",
"context": "we need the same guarantee in billing; found no shared symbol for it",
"to_project": "checkout",
"timeout_sec": 600
})
The other project's Chair answers with a reference, not a paste:
ask_answer({
"id": 41,
"answer": "One idempotency key per attempt, stored before the call. See the symbol.",
"by": "checkout-chair",
"symbol_ref": { "project": "checkout",
"path": "internal/pay/retry.go", "line": 88, "symbol": "RetryIdempotent" }
})
Then you read exactly that body:
code_snippet({ "symbol": "RetryIdempotent", "project": "checkout", "max_lines": 120 })
No Chair running over there? The registry still answers:
search_shared_symbols({ "query": "idempotent retry", "project": "checkout", "limit": 10 })
inspect_symbol({ "name": "RetryIdempotent" })
Expected response#
ask blocks and returns the ask JSON with answer filled in. code_snippet
returns {symbol, start_line, end_line, body, file_bytes}.
search_shared_symbols returns a JSON array — [] when nothing matches — and every
hit carries the registered project it resolves under.
Gotchas#
to_projectneeds that project registered and its Chair running. Otherwise:project "checkout" not registered (orch project list), orno running chair for project "checkout".- Cross-project
code_snippetis shared scope only. A symbol in another project answers only if it carries anorch:export <Name> — <purpose>comment. Untagged code over there is invisible to you by design; inside your own project you see local symbols too. search_shared_symbolsandinspect_symbolanswersharedonly. The graph tools (trace_path,impact,architecture) read local definitions as well.- A timeout is not silence. The ask is marked
timeout, the tool returns an error naming the question, and a late answer is refused. Decide for yourself then, and say so inverify_report. options[], when you pass it, is the whole accepted answer set (case-insensitive). Anything outside it is refused, not recorded.- Answer with
symbol_ref, not pasted code. The pointer is content-free, survives edits, and keeps the other project's source on its own machine.