Controller chains
Trace the conditions and branches that guard a decision, including the recovery arms around it.
Follow the pathCode intent, grounded
Your past investigations, attached to the functions they describe, down to every branch — with proof.
DesignGraph keeps your past investigations, pins them to the functions they describe, and zooms into every branch — every condition, caller, and state write with evidence.
The graph
Trace the conditions and branches that guard a decision, including the recovery arms around it.
Follow the pathFind the canonical write sites behind a state variable and see who truly owns its behavior.
Find the sourceIntent doesn't die with the session — the next session starts from accumulated intent, not from memory.
Continue the threadKeep durable claims close to the functions they describe, across sessions and reviews.
Read the claimsDeep dive
A call graph shows who calls whom. Ours shows the decisions guarding every call: the enclosing if/for/try chain from the call site inward — and the callers above whose guards reach down to you.
fn approve(order) {
if signed_in(user) // guard
&& within_limit(order) { // guard
charge(order) // branch
} else {
queue_review(order) // recovery arm
}
}Illustrative example — real output shows the actual guards in your code.
Follow the pathAsk who owns a field and get the canonical write sites — the functions that actually set it — not every passing mention.
state order.status
written-by: checkout.confirm (canonical)
written-by: support.refund (canonical)
read-by: reporting.summaryExample output — real queries return the actual writers for your field.
Find the sourceIntent doesn't die with the session. Session groups carry a direct link to the session file — chat_ref — so the next session starts from accumulated intent, not from memory.
group: session:2026-08-31-001
intent: "Preserve the session's ordinary function-group intent"
members: alpha, beta
chat_ref: 2026-08-31-001/chat.json (cross-session link)
claims: R1 "Both session members remain covered by the same claim contract"Continue the thread Raw code is a raster — tokens without meaning. Intent is the vector: the semantic layer built on top. You can't convert one into the other; intent has to be constructed. DG builds it: every function carries a durable summary, from a one-line label to the full decision path, that survives across sessions.
intent support.refund
L0: "refunds always queue a review"
L3: decision path + recovery arm
claim: "refunds always queue a review"
verified-by: block_ids [12, 47], call_keys, sot_vars
status: validatedIllustrative — intent labels require the LLM labeling pass; the data layer is not yet populated in this build. Block IDs and validation status shown are example shapes, not real output.
Read the claimsTry the journey
One group, three functions, one job — then zoom from what it is for into how it decides.
L0 · group intent — quoted verbatim
What this means: one group, one job, in words — before a single line of code.
media-encode-decode
"the low-latency media path: benchmark driver,
D3D11 encode bridge, and ffmpeg decoder"
M1 "encode_frame_d3d11 writes base_qsv_encode_ms
alongside the per-frame encode rows"
M2 "main writes the all_key/bitrate/case_name
accumulation rows of the low-latency bench"
members:
scripts/libvpx_low_latency_bench.c::main
layer3_driver/src/bridge.rs::encode_frame_d3d11
layer3_driver/src/ffmpeg/decoder.rs::push_to_decoder
Authored group intent from an archived benchmark corpus — quoted verbatim. Project name withheld; member paths unchanged.
Three functions, one job: get frames through the pipe fast. The claims say why they belong together — each one verified against the code. Now watch one member decide. Zoom into the controller
Intent above from the archive; decisions below from a live run on DesignGraph itself — the same zoom works on your code.
L1 · controller — illustrative
What this means: a group member, opened into its decision paths.
What this means: one decision, with its guard and proof attached.
{
"call_site": {
"callee": "sort_by",
"column": 4,
"line": 158,
"source_line": "sorted.sort_by(|a, b| a.file_path.cmp(&b.file_path))"
},
"caller": {
"file_path": "src/db/mod.rs",
"function_name": "sorted_manifest_and_hash",
"language": "rust"
},
"chain": [],
"direction": "down",
"freshness": {
"manifest_hash": "2e00f20d83d601d7bac3cc9b25eee287fafecfda91b7e1fa853711badec999e0",
"pin_provenance": {
"manifest_hash": "2e00f20d83d601d7bac3cc9b25eee287fafecfda91b7e1fa853711badec999e0"
},
"source": "daemon-freshness.json",
"state": "fresh"
},
"line_ref": "working_tree"
}Live capture — controller_chain on DesignGraph itself (sorted_manifest_and_hash, src/db/mod.rs), 2026-09-04. An empty chain: no guard above this call. 1 of 11 emitted entries, shown complete.
L3 · source — src/db/mod.rs:158 (call-site line from the live run; line_ref: working_tree).
{"branch": "body", "caught_exceptions": [], "condition": null, "end_line": 165, "is_negated": false, "iteration_max": null, "iteration_min": null, "iteration_range": null, "level": 0, "polarity": "positive", "scope_depth": 1, "source_text": "for r in &sorted {\n hasher.update(r.file_path.as_bytes());\n hasher.update([0u8]);\n hasher.update(r.content_hash.as_bytes());\n hasher.update([0u8]);\n }", "start_line": 160, "type": "for"}Live capture — the guard level from the same run, 2026-09-04. Single-line form; keys, order, and values identical to the emitted level (same shape shown on /features/controller-chains.html).
L3 · source — src/db/mod.rs:160–165 (for-guard start/end lines from the live run; line_ref: working_tree).
{
"call_site": {
"callee": "update",
"column": 8,
"line": 161,
"source_line": "hasher.update(r.file_path.as_bytes())"
},
"caller": {
"file_path": "src/db/mod.rs",
"function_name": "sorted_manifest_and_hash",
"language": "rust"
},
"chain": [
{
"branch": "body",
"caught_exceptions": [],
"condition": null,
"end_line": 165,
"is_negated": false,
"iteration_max": null,
"iteration_min": null,
"iteration_range": null,
"level": 0,
"polarity": "positive",
"scope_depth": 1,
"source_text": "for r in &sorted {\n hasher.update(r.file_path.as_bytes());\n hasher.update([0u8]);\n hasher.update(r.content_hash.as_bytes());\n hasher.update([0u8]);\n }",
"start_line": 160,
"type": "for"
}
],
"direction": "down",
"freshness": {
"manifest_hash": "2e00f20d83d601d7bac3cc9b25eee287fafecfda91b7e1fa853711badec999e0",
"pin_provenance": {
"manifest_hash": "2e00f20d83d601d7bac3cc9b25eee287fafecfda91b7e1fa853711badec999e0"
},
"source": "daemon-freshness.json",
"state": "fresh"
},
"line_ref": "working_tree"
}Live capture — same run, 2026-09-04. The chain carries the for-guard above with its source text. 1 of 11 emitted entries, shown complete.
L3 · source — src/db/mod.rs:161 (call-site line from the live run; line_ref: working_tree).