Full page · 02 · Moat
Session memory:
intent that survives the session.
Intent does not die with the session. Session groups carry a direct link to the session file, so the next session starts from accumulated intent — not from memory.
Core
Function groups are the memory layer, and session groups bridge the harness and the tools. The up-context answers — who calls this, with what guards — arrive inside an honesty envelope that labels its own incompleteness with explicit reasons. No silent gaps.
Live example
$ callers({ "function": "handle_controller_chain" })
{
"callers": [{"callee_file": "src/bin/mcp.rs", "caller_file": "src/bin/mcp.rs", "caller_function": "handle_request", "start_line": 2138}],
"excluded_count": 0,
"excluded_paths": [],
"freshness": {...},
"function": "handle_controller_chain",
"incomplete_reasons": ["no_edge_grammar_in_corpus(dart,nix,objc,pascal,svelte,vbnet,vue)", "unknown_callee_name_class_in_corpus(java,kotlin,lua,luau,ruby,swift)"],
"line_ref": "working_tree",
"possibly_incomplete": true,
"total": 1
}
Real MCP tool output — verbatim excerpt. Field names and values are byte-identical to the live response; only the freshness block is collapsed to {...}. One caller (handle_request); the possibly_incomplete flag with explicit incomplete reasons is part of the output. Captured live against the DesignGraph codebase.
Fixture (verified format), not live output — the session-group shape below is byte-verbatim from tests/fixtures/group/groups.yaml (session:2026-08-31-001 with chat_ref):
version: 2
groups:
- id: session:2026-08-31-001
intent: "Preserve the session's ordinary function-group intent"
claims:
- id: R1
text: "Both session members remain covered by the same claim contract"
members:
- "src/lib.rs::alpha"
- "src/lib.rs::beta"
rationale: "ordinary multi-member session group"
chat_ref: "2026-08-31-001/chat.json"
git_base: "opaque-base-2026-08-31"
git_head: "opaque-head-2026-08-31"
findings:
- id: F1
text: "Session fixture finding"
evidence_refs:
- label: "valid evidence"
path: "evidence.json"
sha256: "407909bb02651ad34e2d37d0d8d1d634e61a3321ea9bedc42ef574a2884166fd"
- label: "broken evidence"
path: "missing-evidence.json"
sha256: "0000000000000000000000000000000000000000000000000000000000000000"
API surface
- Tool
callers(up-context) +groups_manifest(session groups)- Parameters
callers:function(required),file,limit,include_all·groups_manifest:project- Returns
- Callers with the honesty envelope (
possibly_incompleteplus reasons); group manifest rows including session groups
Use cases
- Old codebase: the understanding persists across sessions instead of being reconstructed.
- Handoff: the next session — or reviewer — starts from the manifest, not from recall.
- Up-context checks: see whose guards reach down to the function you are changing.
Honesty: every up-context answer labels its own incompleteness. Session-file links are internal mechanism, shown above only as a labeled illustration.