code operations
The exact fields each code.* operation takes and returns.
Every op is POST /v1/<op> over HTTP and the MCP tool loom_<op>. The identity fields (org, namespace, agent, user_id, session_id) are filled from the token and the MCP session when a transport can; for an HTTP call with no token on a single-user server, the install's org on every op but code.* and tracker.* (which keep their plane's), and on some ops its namespace and agent; see identities and namespaces. The operations index explains role, kind and the MCP all listing. Unknown input fields are served and named in ignored_args.
code.ask
Ask a QUESTION about this codebase and get a grounded answer with [file:line] citations — 'how does TTL drop old rows', 'where is the memory limit enforced'.
POST /v1/code.ask · MCP loom_code_ask · role viewer · read
| Input field | Type | Default | Meaning |
|---|---|---|---|
org |
str |
'' |
The tenant (first element of the identity tuple). |
namespace |
str |
'' |
The namespace the op reads or writes. |
agent |
str |
'-' |
The writing or reading agent; '-' or '*' means any agent where the op allows it. |
user_id |
str |
'-' |
The end user the row belongs to; '-' for none. |
consumer |
str |
'' |
trace attribution: which integration is calling (clickgap|claude-code|…) |
question |
str |
required | The question to answer about the indexed code (grounded on a code.search of it). |
synthesize |
bool |
True |
False = retrieval-only (agent synthesizes); True = grounded server-side answer with citations, memoized across agents and invalidated when any cited file changes at merge. |
rerank |
str |
'' |
Reranker for the retrieval: "" = the deployment default (LOOM_CODE_SEARCH_RERANK_DEFAULT), "none" = off for this request, "builtin:openai" / "builtin:cohere", or the name of an endpoint in LOOM_RERANK_ENDPOINTS_JSON (not a URL). |
no_cache |
bool |
False |
Skip the cache lookup and synthesize fresh (the fresh answer still refreshes the cache entry). |
token_budget |
int \| None |
None |
Retrieval context handed to synthesis, in tokens. |
| Output field | Type | Meaning |
|---|---|---|
answer |
str |
The grounded answer text; "" on an abstain or when synthesize=false. |
citations |
list[dict[str, Any]] |
The units the answer used (or was shown when none is cited): {path, start_line, end_line, symbol, unit_id} each; the retrieved units when synthesize=false. |
source |
Literal['cached', 'synthesized', 'abstained'] |
cached = served from the answer cache | synthesized = answered now (or retrieval-only when synthesize=false) | abstained = no grounded answer (abstain_reason says why). |
cache_similarity |
float |
Cosine between this question and the served cached question; 0.0 unless source=cached. |
cache |
str |
What the answer cache did. hit (a cached answer whose key, identifiers and files all matched) | miss | stale (the nearest entry's files, prompt version or age invalidated it) | guarded (the nearest cached question names different… |
cache_saved_ms |
int |
On a served entry: the synthesis wall (ms) and upstream cost (USD) the entry recorded when it was written, i.e. what this call did not pay. |
cache_saved_usd |
float |
Upstream LLM cost in USD the served cache entry recorded; 0.0 when nothing was served. |
abstain |
bool |
true when no grounded answer is returned; abstain_reason says why. |
abstain_reason |
str |
Why it abstained (no strong match, off-repository question, ...); "" otherwise. |
retrieval_confidence |
float |
The underlying code.search's calibrated confidence (0-1); 0.0 when it did not run. |
tokens_returned |
int |
Estimated tokens of the answer text (characters / 4); 0 when there is no answer. |
context_tokens |
int |
Retrieval context (tokens) the synthesis was grounded on; 0 for cached hits and abstains. |
trace_run_id |
str |
Id of the loom.code_search_trace row the server writes for this call. |
as_of |
dict[str, Any] |
Provenance + freshness: branch, commit, indexed_at, lag_commits (int, -1 unknown), stale (bool: lag > LOOM_CODE_STALE_AFTER_COMMITS). |
code.backport_gap
Which release branches still carry the bug this fix removed, and the exact PR to cherry-pick there?
POST /v1/code.backport_gap · MCP loom_code_backport_gap · role viewer · read · not listed under the MCP all toolset
| Input field | Type | Default | Meaning |
|---|---|---|---|
org |
str |
'' |
The tenant (first element of the identity tuple). |
namespace |
str |
'' |
The namespace the op reads or writes. |
agent |
str |
'-' |
The writing or reading agent; '-' or '*' means any agent where the op allows it. |
user_id |
str |
'-' |
The end user the row belongs to; '-' for none. |
consumer |
str |
'' |
trace attribution: which integration is calling (clickgap|claude-code|…) |
pr_number |
int |
0 |
The merged trunk fix to check; 0 = take it from issue_number. |
issue_number |
int |
0 |
An issue the fix closes: the tracker graph's fixes edges name the PR. |
branches |
list[str] |
(computed) | Release branches to check, as namespaces or versions (26.4), at most 8; empty = every configured release branch of the repository the caller can read. |
max_symbols |
int |
8 |
At most this many touched functions (1–8) are looked up on each branch. |
exact |
bool |
False |
Hunk-level presence per branch, on request (one chunk read per branch and the fix's diff sections from the tracker record) |
history |
bool |
False |
For the branches the lines leave undecided, the fix's removed lines on the branch's own history in the mirror (git grep at the tip, git log -S over the first-parent history; at most 3 lines, 2 s per branch) — the pre-image at the tip is… |
| Output field | Type | Meaning |
|---|---|---|
skipped_branches |
list[dict[str, str]] |
Configured release branches this caller cannot read, skipped (never silently): [{namespace, reason}]. |
verdict |
str |
gap | pending | covered | not_affected | unknown — the worst branch's word |
causes |
list[str] |
tracker_unbound | tracker_unavailable | fix_not_found | no_fix | no_branches | per-branch unknown reasons (deadline, no_index, no_branch_version, …) |
fix |
dict[str, Any] |
{pr_number, title, url, base_branch, minor_version, merged_at, merge_sha, changelog_category, src_components, files, hunk_contexts, ledger} plus, under exact, patch: {files, hunks, added, removed, symbols} |
issue |
dict[str, Any] |
from issue_number: |
fixes |
list[dict[str, Any]] |
every PR the issue's fixes edges name, with merged / backport flags |
symbols |
list[str] |
the touched functions presence was tested with (from the hunk headers) |
files |
list[str] |
the fix's source files (the file leg when no hunk named a function) |
branches |
list[dict[str, Any]] |
one row per branch, gaps first, newest branch first: {namespace, branch, verdict, epistemic exact|lower_bound, basis, reason, backport, presence, cherry_pick {pr_number, merge_sha}, evidence [...]}; under exact, presence.patch = {mode… |
summary |
dict[str, list[str]] |
verdict → [branch versions] |
fix_candidate |
dict[str, Any] \| None |
When no fixes edge named a trunk PR, the link pass's top candidate above LOOM_TRACKER_LINKS_MIN_SCORE stood in as the fix ({pr_number, score, rank, why, features, …, epistemic candidate}) and fix.source reads candidate; absent… |
tracker_namespace |
str |
The tracker namespace bound to the trunk namespace that was read; "" when none is bound. |
tracker_unavailable |
bool |
True when a tracker is bound but its read failed. |
ms |
int |
Wall time of the whole read, in milliseconds. |
stage_ms |
dict[str, int] |
{fix: ms of the record + ledger stage, presence: ms of the presence stage, patch: ms of the hunk-level stage (under exact only)} |
trace_run_id |
str |
Id of this call's trace row; pass it to code.outcome. |
code.backport_gaps
The set-wide backport report: which merged fixes labelled for backport does a release branch still owe?
POST /v1/code.backport_gaps · MCP loom_code_backport_gaps · role viewer · read · not listed under the MCP all toolset
| Input field | Type | Default | Meaning |
|---|---|---|---|
org |
str |
'' |
The tenant (first element of the identity tuple). |
namespace |
str |
'' |
The namespace the op reads or writes. |
agent |
str |
'-' |
The writing or reading agent; '-' or '*' means any agent where the op allows it. |
user_id |
str |
'-' |
The end user the row belongs to; '-' for none. |
consumer |
str |
'' |
trace attribution: which integration is calling (clickgap|claude-code|…) |
branch |
str |
'' |
One release branch, as a namespace or a version (26.6); "" = every configured release branch the caller can read. |
wanted_only |
bool |
True |
Keep only the fixes labelled for backport; false also returns unlabelled fixes. |
days |
int |
90 |
Only fixes merged in the last this many days (1–365). |
limit |
int |
500 |
At most this many rows (1–5000). |
| Output field | Type | Meaning |
|---|---|---|
skipped_branches |
list[dict[str, str]] |
Configured release branches this caller cannot read, skipped (never silently): [{namespace, reason}]. |
branch |
str |
the branch asked for ('' = every configured release branch) |
branch_namespace |
str |
The namespace of the branch asked for; "" when every branch was read. |
branches |
list[str] |
the release-branch namespaces the rows cover, newest first |
rows |
list[dict[str, Any]] |
one row per (fix, branch), gaps first, wanted-on-this-branch first, newest fix first: {pr_number, title, merged_at, minor_version, branch, branch_namespace, verdict, epistemic, basis, reason, cherry_pick {pr_number, merge_sha}… |
counts |
dict[str, int] |
verdict → rows returned |
counts_by_branch |
dict[str, dict[str, int]] |
branch version → verdict → rows |
fixes |
int |
How many distinct fixes the returned rows cover. |
wanted_only |
bool |
Echo of the request's wanted_only. |
since |
str |
The merge-time lower bound applied (ISO-8601 UTC): now minus days. |
computed |
dict[str, Any] |
the table's state for this trunk: |
stale |
bool |
no pass has written this trunk yet, or the last pass is older than two intervals |
ms |
int |
Wall time of the read, in milliseconds. |
code.bisect_candidates
Rank PRs that may have introduced a bug; Loom does not test or reproduce it.
POST /v1/code.bisect_candidates · MCP loom_code_bisect_candidates · role viewer · read · not listed under the MCP all toolset
| Input field | Type | Default | Meaning |
|---|---|---|---|
org |
str |
'' |
The tenant (first element of the identity tuple). |
namespace |
str |
'' |
The namespace the op reads or writes. |
agent |
str |
'-' |
The writing or reading agent; '-' or '*' means any agent where the op allows it. |
user_id |
str |
'-' |
The end user the row belongs to; '-' for none. |
consumer |
str |
'' |
trace attribution: which integration is calling (clickgap|claude-code|…) |
symbols |
list[str] |
(computed) | Crashing frames from the stack trace (qualified symbol names, at most 12); the code index resolves them to files, and their specific bare names rank the diffs. |
paths |
list[str] |
(computed) | Repo-relative source paths to scan (at most 20), beside the frames' files. |
patterns |
list[str] |
(computed) | Greppable literals from the report (an error code, an identifier in the message, a setting name); with issue_number they are also derived from the issue's text. |
issue_number |
int |
0 |
A tracker issue number: Loom reads but does not verify its previously recorded triage observations for the release range, its text for patterns, and its caused_by / fixes edges for the named culprit and fix. 0 = none. |
text |
str |
'' |
The report's own words (title, body, error) when there is no tracker issue to read them from — they feed the fusion's vector and lexical legs and the suspects the report names. |
rerank |
bool |
False |
One LLM call reranks the fused top 20 (+~2 s); a weak fused top reranks without asking |
deadline_ms |
int \| None |
None |
Answer within this many milliseconds with the best candidates found so far. |
fix_pr |
int |
0 |
The PR that fixed the regression, when one exists — its rewritten lines, blamed at its parent, name the change that broke them. |
bad_version |
str |
'' |
The first release on which the caller or an upstream test observed the bug (26.3, or a full version cut to its minor); Loom does not test it, and the value wins over the issue's reproduces_on. "" = from the issue. |
before |
str |
'' |
The inclusive upper bound of an approximate merge-time investigation window when release observations are unavailable; it narrows candidate history and does not mean Loom reproduced the bug. |
after |
str |
'' |
Optional lower bound of the merge-time window (ISO-8601); must be earlier than before. |
bad_sha |
str |
'' |
A commit (hex) whose commit time on the code mirror becomes before when before is unset; a sha the mirror lacks is refused with BAD_SHA. |
good_version |
str |
'' |
The newest release that the caller or an upstream test observed as clean; Loom does not test it, and the value wins over the issue's clean_on. "" = from the issue, or a lookback from bad_version. |
widen_to_directories |
bool |
True |
widen the candidate set from the frames' files to their directories when frames or patterns can rank within it |
wideners |
list[str] |
(computed) | What may bound the scan when no frame resolves to a file — patterns (the window's diffs carrying the issue's rarest identifiers), component (the directories the issue's component touches), fix_candidate (the fix's own files: the… |
rescan |
bool |
False |
Run the scan even when the record already names the culprit (an introducing commit or a caused_by edge) — to check a pin; introduced_commit / named_by_graph still say what the record holds |
limit |
int |
10 |
At most this many candidates (1–25). |
marks |
bool |
True |
Marks on the candidates (backport, revert, reverted, re-land, whitespace / rename-only, touches_symbol, named); false returns the ranked candidate dicts unmarked |
| Output field | Type | Meaning |
|---|---|---|
verdict |
str |
candidates | no_candidates | already_bisected | graph_named | unknown |
candidates_from |
str |
Where the candidates came from — tracker (its PR diff scan), code_history (loom's own PR ledger of the repository, when no tracker is linked or it holds no changed files), or none |
causes |
list[str] |
Why the answer is thin or empty: tracker_unbound | tracker_unavailable | no_failing_version | no_resolved_paths | introduced_commit_known | caused_by_edge. |
epistemic |
str |
always lower_bound: the upstream file list and the diff text are what was searched; an empty answer excludes nothing |
candidates |
list[dict[str, Any]] |
{pr_number, title, author, merged_at, minor_version, matched_paths, matched_symbols, matched_patterns, added_patterns, kind change|meta, has_test, url, score, merge_commit_sha, merge_sha_source stored|mirror|"", named_by?}; with marks… |
marks |
dict[str, Any] |
what the marks stage did: |
named_by_graph |
list[int] |
PR numbers the tracker graph's caused_by edges name for the issue; when set, the candidates are these and no scan ran |
fix_blame |
dict[str, Any] |
What blaming the fix's rewritten lines found — the fix, its parent, the ranges blamed and the PRs they name; absent without a fix |
fusion |
dict[str, Any] |
What the fusion read — {window_prs, signals: {name: count}, suspects: {named, mentioned}, rerank?}; each fused candidate carries why (the signals that ranked it in their top 10); absent when fusion did not run. |
patterns |
list[str] |
the greppable literals the ranking used (given ∪ derived from the issue) |
pattern_weights |
dict[str, float] |
IDF over the issue corpus per pattern — what each is worth in the ranking; absent when the vocabulary was not read |
scope |
str |
file | directory | patterns — how wide the candidate set was drawn |
widened_by |
list[str] |
Which frameless wideners bounded the scan — patterns | component | fix_candidate — in the order they applied; absent when a frame or a path resolved |
dupcheck_fix |
dict[str, Any] |
With no fix_pr and no issue, the duplicate check matched the report to a reported issue whose linked merged fix became fix_pr — {issue, fix_pr, match: duplicate, namespace}; absent otherwise |
component |
str |
the issue's QA component and the directories it widened the scan to |
component_dirs |
list[str] |
The directories the issue's component widened the scan to; absent when none did. |
dropped_after_report |
int |
Scanned PRs merged AFTER the issue was opened — the fix, or nothing — left out of the list; absent when none was |
versions_searched |
list[str] |
The release minors whose PRs were scanned; empty when a time window bounded it. |
bad_version |
str |
The failing release the range used (given, else the issue's); "" when unknown. |
good_version |
str |
The clean release the range used (given, else the issue's); "" when unknown. |
window |
str |
clean_to_bad_plus_slack | lookback_from_bad | master_after_clean — how the release range was drawn |
hub_paths_dropped |
list[str] |
hub files (Settings.cpp, CMake, docs, …) left out of the file filter |
resolved |
list[dict[str, Any]] |
[{symbol, paths}] — what the code index resolved each frame to |
paths |
list[str] |
The files the scan filtered on: fix files, given paths, the frames' files and the widening's, with hub files removed. |
frames |
list[str] |
The bare frame names the diffs were ranked by: distinct, at least 6 characters, generic names dropped. |
issue |
dict[str, Any] |
the issue's QA fact, as the tracker serves it, when issue_number was given |
introduced_commit |
str |
The introducing commit the issue record holds; "" when none. |
fix_candidate |
dict[str, Any] \| None |
The issue's probable fix from the link pass when no caused_by edge and no introducing commit exist (score above the floor) — or the record's own fixes edge (source: record); paths_used on it when its source files became the scan's… |
tracker_namespace |
str |
The tracker namespace bound to this code namespace that was read; "" when none is bound. |
tracker_unavailable |
bool |
True when a tracker is bound but its read failed. |
trace_run_id |
str |
Id of this call's trace row; pass it to code.outcome. |
partial |
bool |
deadline_ms cut an optional stage: the candidates are the best found in the budget, and partial_reason names the stages that did not run or finish. |
partial_reason |
str |
|
before |
str |
The time window the scan ran under, when no release versions bounded it ("" otherwise). |
after |
str |
The window's lower bound (ISO-8601 UTC); "" when releases bounded the scan or no lower bound was given. |
code.blame_range
Which merged PRs last touched these lines, between release A and B?
POST /v1/code.blame_range · MCP loom_code_blame_range · role viewer · read · not listed under the MCP all toolset
| Input field | Type | Default | Meaning |
|---|---|---|---|
org |
str |
'' |
The tenant (first element of the identity tuple). |
namespace |
str |
'' |
The namespace the op reads or writes. |
agent |
str |
'-' |
The writing or reading agent; '-' or '*' means any agent where the op allows it. |
user_id |
str |
'-' |
The end user the row belongs to; '-' for none. |
consumer |
str |
'' |
trace attribution: which integration is calling (clickgap|claude-code|…) |
path |
str |
required | The repo-relative file to blame (a leading / is stripped). |
start_line |
int |
required | First line of the range, 1-based, at the window's upper end. |
end_line |
int |
required | Last line, inclusive; a range over 400 lines is cut to 400 from start_line. |
from_version |
str |
'' |
Window start as a release (26.3 or a full tag version); "" with no from_sha = the oldest release cut. |
to_version |
str |
'' |
Window end as a release; "" with no to_sha = this namespace's head. |
from_sha |
str |
'' |
Window start as a commit sha; give a version or a sha, not both. |
to_sha |
str |
'' |
Window end as a commit sha; give a version or a sha, not both. |
limit |
int |
10 |
At most this many candidates (1–25). |
reviews_per_pr |
int |
3 |
review comments per candidate inside the range (0 = none) |
stage |
Literal['introduced', 'last_touched'] |
'introduced' |
introduced: rank toward the change that introduced the behaviour; last_touched: the blame order only |
mentions |
str |
'' |
what misbehaves, in words: a candidate whose linked issue or title names them ranks first |
| Output field | Type | Meaning |
|---|---|---|
verdict |
str |
candidates | no_candidates | unknown | introduced_unknown (stage introduced: blame saw no in-window line; the list is the file-touching fallback) |
causes |
list[str] |
window_unresolved | path_not_indexed | blame_failed | ledger_failed | tracker_unavailable |
epistemic |
str |
exact when the blame leg ran (line attribution), lower_bound when only the ledger answered (file-level) or the introduced stage is blameless |
stage |
Literal['introduced', 'last_touched'] |
the order candidates is in |
note |
str |
What the answer can and cannot claim (last touched, not introduced), plus lines blame could not map to a PR. |
path |
str |
The path blamed, normalized. |
path_indexed |
bool |
True when the code index holds the path as a live file. |
range |
dict[str, Any] |
{start, end, requested_end, truncated} |
window |
dict[str, Any] |
{from_ref, to_ref, from_sha, to_sha, base_sha, from_time, to_time, sources{from,to: namespace_head|mirror_ref|sha|default}, error} |
candidates |
list[dict[str, Any]] |
ranked: {pr_number, title, author, merged_at, first_release, lines_blamed, share_of_range, touches_file, evidence blame|ledger|both, kind, merge_commit_sha, merge_sha_source stored|mirror|"", url, has_test?, caused_by?[], fixes?[]}; stage… |
last_touched |
list[dict[str, Any]] |
the first stage's order, always: |
symbol |
dict[str, Any] |
the enclosing function of the range when the index has one: |
latest_pr |
int |
the newest PR among those blame named (0 when none) |
lines |
dict[str, Any] |
{total, attributed, noise, outside_window, unmapped} |
legs |
dict[str, Any] |
{blame{status, warm, ms, window_commits, graph_truncated}, ledger{status, skipped: [{namespace, reason: not_readable}] when the trunk is unreadable}, introduced{status ok|skipped, ms, git_calls, demoted, promoted, blameless}} |
first_release_basis |
str |
How first_release was derived; "" when the mirror has no branch-cut tags. |
tracker_namespace |
str |
The tracker namespace bound to this code namespace; "" when none is bound. |
tracker_unavailable |
bool |
True when a tracker is bound but its read failed; the candidates stand without has_test / caused_by / fixes. |
trace_run_id |
str |
Id of this call's trace row; pass it to code.outcome. |
code.calibrate
Derive code-specific abstention thresholds from the authored probe corpus (query/positive/hard-distractor triples over the indexed repo) and persist them as this namespace's calibration.
POST /v1/code.calibrate · MCP loom_code_calibrate · role admin · write · audited · not listed under the MCP all toolset
| Input field | Type | Default | Meaning |
|---|---|---|---|
org |
str |
'' |
The tenant (first element of the identity tuple). |
namespace |
str |
'' |
The namespace the op reads or writes. |
agent |
str |
'-' |
The writing or reading agent; '-' or '*' means any agent where the op allows it. |
user_id |
str |
'-' |
The end user the row belongs to; '-' for none. |
consumer |
str |
'' |
trace attribution: which integration is calling (clickgap|claude-code|…) |
| Output field | Type | Meaning |
|---|---|---|
noise_floor |
float |
Cosine below which a hit is noise: the distractors' 90th percentile plus 0.02. |
abstain_threshold |
float |
Cosine below which the search abstains: noise_floor plus 0.05. |
embedder_model |
str |
The embedding model the probes ran against; the calibration applies to it. |
positives |
int |
Query/positive pairs read from the probe corpus. |
distractors |
int |
Query/distractor pairs read from the probe corpus. |
code.callees
What does this symbol call — forward call edges (depth<=3), tier-marked like code.callers.
POST /v1/code.callees · MCP loom_code_callees · role viewer · read · not listed under the MCP all toolset
| Input field | Type | Default | Meaning |
|---|---|---|---|
pr_files |
dict[str, str] |
(computed) | Repo-relative path -> the file's full text at the PR's head, for the files the PR adds or modifies (at most 50, 1,000,000 characters each). |
pr_diff |
str |
'' |
The PR's unified diff against its merge-base (at most 1,500,000 characters): its hunks say which functions the PR modifies, and its paths name the files it deletes. |
pr_head_sha |
str |
'' |
The PR's head and base commits as the caller knows them; they label the answer (overlay_head_sha) and never reach git. '' = derived from the text. |
pr_base_sha |
str |
'' |
|
org |
str |
'' |
The tenant (first element of the identity tuple). |
namespace |
str |
'' |
The namespace the op reads or writes. |
agent |
str |
'-' |
The writing or reading agent; '-' or '*' means any agent where the op allows it. |
user_id |
str |
'-' |
The end user the row belongs to; '-' for none. |
consumer |
str |
'' |
trace attribution: which integration is calling (clickgap|claude-code|…) |
name |
str |
'' |
Bare, qualified or partly qualified name of the seed symbol, or path:line for the innermost function containing that line. |
symbol_id |
str |
'' |
An index symbol id for the seed; wins over name. |
depth |
int |
1 |
How many hops to walk out from the seed (1–3); 1 = direct callers / callees. |
max_nodes |
int |
200 |
At most this many edges across all hops (1–500); truncated says when it held. |
min_confidence |
float |
0.0 |
Drop parser-tier edges below this confidence. |
include_ambiguous |
bool \| None |
None |
Widen the answer from "what calls it" to "what MAY call it". |
candidate_min_confidence |
float \| None |
None |
Unset = on; candidates below candidate_min_confidence (default the deployment floor, 0.2) are counted in the block's note and not returned. 0 shows every site. |
pr_number |
int |
0 |
An OPEN pull request whose head the mirror holds (refs/pull/N/head). |
edge_kinds |
list[str] |
(computed) | The edge kinds the walk follows — a subset of calls | inherits | overrides | fixture_use | reads | writes. |
| Output field | Type | Meaning |
|---|---|---|
edges |
list[CodeEdgeWire] |
The call-graph edges found, hop by hop; the far end (from_* for callers, to_* for callees) is the answer. |
seed_symbols |
list[str] |
Qualified names of the definitions the walk started from; empty when refused as ambiguous. |
overlay |
bool |
On the wire only when pr_number was given. |
overlay_head_sha |
str |
The PR head commit whose post-image was parsed; "" when there is no overlay. |
overlay_added |
int |
How many functions the PR adds in its parsed files. |
overlay_note |
str |
Why the overlay is off: head_not_in_mirror, no_merge_base or no_repo_entry; when it is on, "" or how many changed files it did not fully read. |
resolved_by |
str |
How an over-qualified name bound when the exact form missed — anonymous_namespace ((anonymous namespace):: segments stripped) or tail (a namespace the definition does not carry dropped; one definition fit), or registration when a… |
ambiguous |
bool |
A bare short name that resolves to many unrelated definitions (setColumns on 60 classes) is not walked: ambiguous is set, candidates lists the qualified names to pick from, and edges is empty. |
candidates |
list[str] |
With ambiguous: up to 20 qualified names to pick from. |
dispatch_seeds |
list[dict[str, str]] |
Virtual dispatch: when the seed is an override, calls in the code go to the BASE declaration, so its callers are included and listed here as {"symbol", "via": "overrides" | "inherits" | "virtual_by_name"}. |
note |
str |
Plain-text notes on how the walk ran: dispatch or member folding, the ambiguity refusal, declined call sites, stale compiler-tier files; "" when none apply. |
truncated |
bool |
True when the walk stopped short: max_nodes held or a hop's edge read hit its cap. |
counts_floor |
bool |
Epistemic contract: edge counts are FLOORS, never totals. |
unresolved_calls |
int |
HOW LOW the floor may be (callers direction): call sites in the fast tier's files whose callee is NAMED like the seed but which the resolver declined to bind — unresolved (no definition of that name in the index) or ambiguous (several… |
ambiguous_calls |
int |
Declined call sites named like the seed with several same-named definitions, none pinned (see unresolved_calls). |
epistemic |
str |
Epistemic envelope. |
causes |
list[str] |
Why epistemic is lower_bound, from the set above; empty when it is exact. |
by_hop_counts |
dict[int, int] |
Distinct symbols reached per hop BEFORE any slicing: {1: n, 2: m}. |
candidate_sites |
CodeCandidateSitesWire \| None |
Declined call sites as ranked candidates, on request only (include_ambiguous). |
trace_run_id |
str |
Id of this call's trace row; pass it to code.outcome. |
code.callers
Who calls this symbol — exact reverse call edges (depth<=3), compiler-resolved where available; edge_kinds: ['inherits'] narrows the walk to what implements or extends a type.
POST /v1/code.callers · MCP loom_code_callers · role viewer · read
| Input field | Type | Default | Meaning |
|---|---|---|---|
pr_files |
dict[str, str] |
(computed) | Repo-relative path -> the file's full text at the PR's head, for the files the PR adds or modifies (at most 50, 1,000,000 characters each). |
pr_diff |
str |
'' |
The PR's unified diff against its merge-base (at most 1,500,000 characters): its hunks say which functions the PR modifies, and its paths name the files it deletes. |
pr_head_sha |
str |
'' |
The PR's head and base commits as the caller knows them; they label the answer (overlay_head_sha) and never reach git. '' = derived from the text. |
pr_base_sha |
str |
'' |
|
org |
str |
'' |
The tenant (first element of the identity tuple). |
namespace |
str |
'' |
The namespace the op reads or writes. |
agent |
str |
'-' |
The writing or reading agent; '-' or '*' means any agent where the op allows it. |
user_id |
str |
'-' |
The end user the row belongs to; '-' for none. |
consumer |
str |
'' |
trace attribution: which integration is calling (clickgap|claude-code|…) |
name |
str |
'' |
Bare, qualified or partly qualified name of the seed symbol, or path:line for the innermost function containing that line. |
symbol_id |
str |
'' |
An index symbol id for the seed; wins over name. |
depth |
int |
1 |
How many hops to walk out from the seed (1–3); 1 = direct callers / callees. |
max_nodes |
int |
200 |
At most this many edges across all hops (1–500); truncated says when it held. |
min_confidence |
float |
0.0 |
Drop parser-tier edges below this confidence. |
include_ambiguous |
bool \| None |
None |
Widen the answer from "what calls it" to "what MAY call it". |
candidate_min_confidence |
float \| None |
None |
Unset = on; candidates below candidate_min_confidence (default the deployment floor, 0.2) are counted in the block's note and not returned. 0 shows every site. |
pr_number |
int |
0 |
An OPEN pull request whose head the mirror holds (refs/pull/N/head). |
edge_kinds |
list[str] |
(computed) | The edge kinds the walk follows — a subset of calls | inherits | overrides | fixture_use | reads | writes. |
| Output field | Type | Meaning |
|---|---|---|
edges |
list[CodeEdgeWire] |
The call-graph edges found, hop by hop; the far end (from_* for callers, to_* for callees) is the answer. |
seed_symbols |
list[str] |
Qualified names of the definitions the walk started from; empty when refused as ambiguous. |
overlay |
bool |
On the wire only when pr_number was given. |
overlay_head_sha |
str |
The PR head commit whose post-image was parsed; "" when there is no overlay. |
overlay_added |
int |
How many functions the PR adds in its parsed files. |
overlay_note |
str |
Why the overlay is off: head_not_in_mirror, no_merge_base or no_repo_entry; when it is on, "" or how many changed files it did not fully read. |
resolved_by |
str |
How an over-qualified name bound when the exact form missed — anonymous_namespace ((anonymous namespace):: segments stripped) or tail (a namespace the definition does not carry dropped; one definition fit), or registration when a… |
ambiguous |
bool |
A bare short name that resolves to many unrelated definitions (setColumns on 60 classes) is not walked: ambiguous is set, candidates lists the qualified names to pick from, and edges is empty. |
candidates |
list[str] |
With ambiguous: up to 20 qualified names to pick from. |
dispatch_seeds |
list[dict[str, str]] |
Virtual dispatch: when the seed is an override, calls in the code go to the BASE declaration, so its callers are included and listed here as {"symbol", "via": "overrides" | "inherits" | "virtual_by_name"}. |
note |
str |
Plain-text notes on how the walk ran: dispatch or member folding, the ambiguity refusal, declined call sites, stale compiler-tier files; "" when none apply. |
truncated |
bool |
True when the walk stopped short: max_nodes held or a hop's edge read hit its cap. |
counts_floor |
bool |
Epistemic contract: edge counts are FLOORS, never totals. |
unresolved_calls |
int |
HOW LOW the floor may be (callers direction): call sites in the fast tier's files whose callee is NAMED like the seed but which the resolver declined to bind — unresolved (no definition of that name in the index) or ambiguous (several… |
ambiguous_calls |
int |
Declined call sites named like the seed with several same-named definitions, none pinned (see unresolved_calls). |
epistemic |
str |
Epistemic envelope. |
causes |
list[str] |
Why epistemic is lower_bound, from the set above; empty when it is exact. |
by_hop_counts |
dict[int, int] |
Distinct symbols reached per hop BEFORE any slicing: {1: n, 2: m}. |
candidate_sites |
CodeCandidateSitesWire \| None |
Declined call sites as ranked candidates, on request only (include_ambiguous). |
trace_run_id |
str |
Id of this call's trace row; pass it to code.outcome. |
code.context_pack
Briefing at the START of a task, instead of exploring file by file.
POST /v1/code.context_pack · MCP loom_code_context_pack · role viewer · read
| Input field | Type | Default | Meaning |
|---|---|---|---|
org |
str |
'' |
The tenant (first element of the identity tuple). |
namespace |
str |
'' |
The namespace the op reads or writes. |
agent |
str |
'-' |
The writing or reading agent; '-' or '*' means any agent where the op allows it. |
user_id |
str |
'-' |
The end user the row belongs to; '-' for none. |
consumer |
str |
'' |
trace attribution: which integration is calling (clickgap|claude-code|…) |
pr_number |
int |
0 |
Indexed merged PR -> precomputed pack; 0 -> orientation map; unknown PR -> explicit abstention. ge=0 because a negative number would reach ClickHouse as a UInt32 bind and surface as a 500. |
task |
str |
'' |
The change about to be made ("add a new tracker op"). |
token_budget |
int |
2500 |
Token budget for context (200..8000): a precomputed pack is cut to it, a task briefing or orientation map is built within it. |
sections |
list[Literal['symbols', 'co_change', 'tests', 'reviews', 'prs', 'qa', 'files']] |
(computed) | Precomputed packs only. |
| Output field | Type | Meaning |
|---|---|---|
context |
str |
The pack as Markdown text; for unavailable, a short note saying the PR has no pack yet. |
tokens_used |
int |
Estimated tokens of context. |
source |
Literal['precomputed', 'task', 'orientation', 'unavailable'] |
precomputed (the PR's stored pack) | task (a briefing for task) | orientation (the repository map) | unavailable (no pack for the PR). |
truncated |
bool |
True when a precomputed pack was cut to token_budget; false for the other sources. |
merge_commit_sha |
str |
The PR's merge commit, for a precomputed pack; '' otherwise. |
trace_run_id |
str |
Id of this call's trace row; pass it to code.outcome. |
code.context_packs
List the stored per-PR context packs of a repository, optionally for one PR.
POST /v1/code.context_packs · MCP loom_code_context_packs · role viewer · read · not listed under the MCP all toolset
| Input field | Type | Default | Meaning |
|---|---|---|---|
org |
str |
'' |
The tenant (first element of the identity tuple). |
namespace |
str |
'' |
The namespace the op reads or writes. |
agent |
str |
'-' |
The writing or reading agent; '-' or '*' means any agent where the op allows it. |
user_id |
str |
'-' |
The end user the row belongs to; '-' for none. |
consumer |
str |
'' |
trace attribution: which integration is calling (clickgap|claude-code|…) |
limit |
int |
50 |
At most this many packs per page, newest first (1..200). |
offset |
int |
0 |
Packs to skip before the page starts. |
pr_number |
int |
0 |
Optional exact PR filter (0 = all). |
| Output field | Type | Meaning |
|---|---|---|
rows |
list[CodeContextPackRow] |
Live packs, newest built first; title, author and merged_at are '' when the PR history lacks the PR. |
total |
int |
Every live pack matching the filter, not only this page. |
code.conventions
The repository's recurring maintainer checks as facts over one PR's diff: a setting added or re-defaulted without a SettingsChangesHistory entry; the same setting's docs mention; a new…
POST /v1/code.conventions · MCP loom_code_conventions · role viewer · read · not listed under the MCP all toolset
| Input field | Type | Default | Meaning |
|---|---|---|---|
org |
str |
'' |
The tenant (first element of the identity tuple). |
namespace |
str |
'' |
The namespace the op reads or writes. |
agent |
str |
'-' |
The writing or reading agent; '-' or '*' means any agent where the op allows it. |
user_id |
str |
'-' |
The end user the row belongs to; '-' for none. |
consumer |
str |
'' |
trace attribution: which integration is calling (clickgap|claude-code|…) |
pr_number |
int |
0 |
A merged PR in the ledger: its title, labels and merge commit's diff are checked; 0 = none. |
head_sha |
str |
'' |
A commit the mirror holds: the diff from its merge-base with the branch tip is checked; falls back to the ledger's merge commit when the mirror lacks it. |
files |
list[str] |
(computed) | An open PR's changed paths; with diff they replace any ledger file list. |
diff |
str |
'' |
An open PR's unified diff; its hunks are what the rules check (with files). |
rules |
list[str] |
(computed) | The rules to run (names from the conventions rule table); empty = every rule. |
| Output field | Type | Meaning |
|---|---|---|
pr_number |
int |
The PR asked about; 0 when none was named. |
source |
str |
ledger | head_sha | supplied |
title |
str |
The ledger PR's title; '' when the PR is not in the ledger or none was named. |
labels |
list[str] |
The ledger PR's labels. |
category |
str |
bug_fix | improvement | new_feature | performance | not_for_changelog | build | ci | documentation | backward_incompatible | experimental | '' |
category_source |
str |
Where category came from: label:<name>, changelog_bullet (the PR body), or ''. |
merged_at |
str |
When the ledger PR merged; '' without a ledger row. |
merge_commit_sha |
str |
The ledger PR's merge commit; '' without a ledger row. |
head_sha |
str |
The commit the diff was read at when source is head_sha; otherwise the head_sha sent. |
files_total |
int |
Changed paths known for the change (name-status list plus the diff's files). |
files_in_diff |
int |
Files whose hunks were parsed from the diff; fewer than files_total when it was cut. |
diff_bytes |
int |
Size of the diff text read, in characters; 0 without a diff. |
diff_truncated |
bool |
True when the mirror diff hit code_conventions_diff_max_bytes and its last file was dropped; notes says how many files were parsed. |
rules |
list[dict[str, Any]] |
[{rule, verdict: violated|satisfied|not_applicable|unknown|unusual, evidence: [{path, line, text, ...}], epistemic: exact|lower_bound, note}] |
summary |
dict[str, int] |
verdict -> count over rules |
control |
dict[str, Any] |
{coverage_symbol, ok, ran}: the coverage control rule 7 depends on |
notes |
list[str] |
Why part of the answer is weaker: PR not in the ledger, merged into another branch, commit not in the mirror, diff cut, supplied-diff pre-image; empty when none applies. |
trace_run_id |
str |
Id of this call's trace row; pass it to code.outcome. |
code.coverage
Report how much of a repository the index covers at its head: per language, per tier, and the gaps.
POST /v1/code.coverage · MCP loom_code_coverage · role viewer · read
| Input field | Type | Default | Meaning |
|---|---|---|---|
org |
str |
'' |
The tenant (first element of the identity tuple). |
namespace |
str |
'' |
The namespace the op reads or writes. |
agent |
str |
'-' |
The writing or reading agent; '-' or '*' means any agent where the op allows it. |
user_id |
str |
'-' |
The end user the row belongs to; '-' for none. |
consumer |
str |
'' |
trace attribution: which integration is calling (clickgap|claude-code|…) |
| Output field | Type | Meaning |
|---|---|---|
org |
str |
The tenant (first element of the identity tuple). |
namespace |
str |
The namespace the op reads or writes. |
as_of_commit |
str |
git_head |
languages |
list[CodeLanguageCoverage] |
One row per language, the most files first. |
tiers |
list[CodeTierCoverage] |
Call-graph edge counts per tier. |
gaps |
CodeCoverageGaps \| None |
None when the gap queries failed — absence, never a fabricated zero. |
pr_history_from |
str |
The oldest merge time among the stored merged PRs; '' when none are stored. |
pr_history_to |
str |
The newest merge time among the stored merged PRs; '' when none are stored. |
pr_history_last_fetch_at |
str |
When the PR-history poller last wrote a row; '' never. |
pr_history_enabled |
bool |
Whether the PR-history poller is enabled on this deployment. |
pr_history_auth |
str |
token | anonymous (60 req/h GitHub limit) |
context_packs_last_at |
str |
When the newest live PR context pack was built; '' when none exists. |
summaries_last_at |
str |
When the newest chunk context description was written; '' when none exists. |
code.coverage.unwatch
Cancel a coverage watch on a commit.
POST /v1/code.coverage.unwatch · MCP loom_code_coverage_unwatch · role viewer · idempotent · not listed under the MCP all toolset
| Input field | Type | Default | Meaning |
|---|---|---|---|
org |
str |
'' |
The tenant (first element of the identity tuple). |
namespace |
str |
'' |
The namespace the op reads or writes. |
agent |
str |
'-' |
The writing or reading agent; '-' or '*' means any agent where the op allows it. |
user_id |
str |
'-' |
The end user the row belongs to; '-' for none. |
consumer |
str |
'' |
trace attribution: which integration is calling (clickgap|claude-code|…) |
commit |
str |
required | The watched commit: a full 40-hex SHA, or a 7..39-hex abbreviation the mirror resolves. |
inbox |
str |
required | The inbox the watch posts to; the caller must be a writer on its owner namespace. |
| Output field | Type | Meaning |
|---|---|---|
commit |
str |
The full SHA the abbreviation resolved to. |
inbox |
str |
The inbox, as sent. |
removed |
bool |
False when no live watch existed. |
code.coverage.watch
Ask for a task-inbox message when the index covers a commit, instead of polling for it.
POST /v1/code.coverage.watch · MCP loom_code_coverage_watch · role viewer · idempotent · not listed under the MCP all toolset
| Input field | Type | Default | Meaning |
|---|---|---|---|
org |
str |
'' |
The tenant (first element of the identity tuple). |
namespace |
str |
'' |
The namespace the op reads or writes. |
agent |
str |
'-' |
The writing or reading agent; '-' or '*' means any agent where the op allows it. |
user_id |
str |
'-' |
The end user the row belongs to; '-' for none. |
consumer |
str |
'' |
trace attribution: which integration is calling (clickgap|claude-code|…) |
commit |
str |
required | Merge commit SHA to watch. |
inbox |
str |
required | Task inbox that receives the code.coverage.ready event; the caller must be a writer on its owner namespace. |
| Output field | Type | Meaning |
|---|---|---|
org |
str |
The tenant (first element of the identity tuple). |
namespace |
str |
The namespace the op reads or writes. |
commit |
str |
the full SHA |
inbox |
str |
The inbox the event is posted to, as sent. |
ready |
bool |
True once every tier covers the commit; the event is then on the inbox. |
emitted |
bool |
True when this call posted the event (an already-covered commit). |
delivered_at |
datetime \| None |
When the ready event was posted to the inbox; None while the commit is not covered. |
event_id |
str |
The event's task_id on the inbox, fixed per (namespace, commit, inbox). |
commit_coverage |
CodeCommitCoverage \| None |
The commit's per-tier coverage at this call, as code.index_status reports it. |
code.coverage_claim
Is this already tested?
POST /v1/code.coverage_claim · MCP loom_code_coverage_claim · role viewer · read · not listed under the MCP all toolset
| Input field | Type | Default | Meaning |
|---|---|---|---|
org |
str |
'' |
The tenant (first element of the identity tuple). |
namespace |
str |
'' |
The namespace the op reads or writes. |
agent |
str |
'-' |
The writing or reading agent; '-' or '*' means any agent where the op allows it. |
user_id |
str |
'-' |
The end user the row belongs to; '-' for none. |
consumer |
str |
'' |
trace attribution: which integration is calling (clickgap|claude-code|…) |
symbol |
str |
'' |
The subject as a symbol name (qualified or bare) or a SQL-level function name. |
path |
str |
'' |
The subject as a repository-relative source path. |
setting |
str |
'' |
The subject as a setting name. |
limit |
int |
20 |
At most this many tests rows (at most 100). |
| Output field | Type | Meaning |
|---|---|---|
subject |
str |
The subject as given (the one of symbol, path, setting that was set). |
subject_kind |
str |
symbol | path | setting |
verdict |
str |
covered_by | weak_evidence | uncovered | unknown |
tests |
list[dict[str, Any]] |
{test_path, methods: [...], tier, confidence, evidence} |
tests_total |
int |
Tests found before limit (the larger of the rows and the grep's match count). |
src_paths |
list[str] |
The source files the subject lives in: the path itself, the files defining the resolved symbol (first 20), or [] for a setting. |
epistemic |
str |
exact when a test names the subject or the include graph reaches it; lower_bound when only mined co-occurrence or a path convention says so |
strongest_tier |
str |
The strongest evidence tier among the rows (executed | exact_scoped | pr_cooccurrence | short_name_grep | file_reference | path_convention), '' when no test was found. |
search_terms |
dict[str, str] |
The literals the grep ran, each with the tier a hit counts as — the SQL names the class registers and the qualified form are exact_scoped, the bare method name short_name_grep. |
resolved_by |
str |
registration when the subject was a SQL-level name bound to its implementing class through the registration statement; '' and off the wire otherwise. |
control |
dict[str, Any] |
{symbol, ok[, via]}: the positive control this call ran; ok=False ⇒ unknown. |
measured |
dict[str, Any] |
What the newest imported coverage run measured, {} when no run covered the subject's files: {measured, executed, paths, hits: {path: [[start, end], ...]}, commit}. |
trace_run_id |
str |
Id of this call's row in loom.code_search_trace. |
code.enclosing
Batched path:line -> enclosing function.
POST /v1/code.enclosing · MCP loom_code_enclosing · role viewer · read
| Input field | Type | Default | Meaning |
|---|---|---|---|
org |
str |
'' |
The tenant (first element of the identity tuple). |
namespace |
str |
'' |
The namespace the op reads or writes. |
agent |
str |
'-' |
The writing or reading agent; '-' or '*' means any agent where the op allows it. |
user_id |
str |
'-' |
The end user the row belongs to; '-' for none. |
consumer |
str |
'' |
trace attribution: which integration is calling (clickgap|claude-code|…) |
locations |
list[str] |
required | "src/Foo.cpp:123" — repo-relative path, 1-based line. |
include_body |
bool |
False |
include_body: ship the enclosing function's whole body with each resolved location, so a grep hit becomes the function it sits in without a follow-up code.symbol or a file read (most index answers are otherwise followed by a read of the… |
token_budget |
int |
4000 |
With include_body: token budget for the bodies (200..12000); bodies past it ship elided. |
neighbours |
bool \| None |
None |
neighbours: a graph evidence block per distinct enclosing function: up to neighbour_k callers, callees (compiler tier preferred, symbols outside the repo dropped, parser guesses below 0.8 confidence dropped) and mapped tests, the module… |
neighbour_k |
int |
5 |
With neighbours: at most this many callers and callees per function (1..20). |
| Output field | Type | Meaning |
|---|---|---|
results |
list[dict[str, Any]] |
one entry per input location, input order preserved: {path, line, symbol, symbol_id, qualified_name, signature, tier, kind, start_line, end_line} kind is "function" / "method" / "fixture" for a line inside a function body; "class"… |
resolved |
int |
Locations that landed inside a function, type, or document section. |
paths_indexed |
int |
distinct input paths that have any symbol rows |
paths_total |
int |
Distinct paths among the parseable input locations. |
took_ms |
int |
Server-side wall time of the call, in milliseconds. |
as_of |
dict[str, Any] |
Provenance + freshness: branch, commit, indexed_at, lag_commits (int, -1 unknown), stale (bool: lag > LOOM_CODE_STALE_AFTER_COMMITS). |
bodies_returned |
int |
include_body accounting: distinct bodies served / withheld for budget |
bodies_elided |
int |
Distinct bodies withheld because token_budget ran out. |
tokens_returned |
int |
include_body bodies + the neighbours block, in tokens |
neighbours |
list[dict[str, Any]] |
neighbours=true: one entry per distinct enclosing function in first- appearance order, at most 20: {symbol_id, qualified_name, path, module, callers: [qualified names], callees: [...], tests: [paths], epistemic, causes}. |
anchors |
int |
distinct enclosing functions the block covers |
anchors_capped |
bool |
more resolved functions than the 20 cap |
neighbour_tokens |
int |
Tokens of the neighbours block alone; 0 when neighbours is off. |
code.examples
Real call sites of a symbol, ranked test-covered-first — a current, tested usage example beats the deprecated one grep finds first.
POST /v1/code.examples · MCP loom_code_examples · role viewer · read · not listed under the MCP all toolset
| Input field | Type | Default | Meaning |
|---|---|---|---|
org |
str |
'' |
The tenant (first element of the identity tuple). |
namespace |
str |
'' |
The namespace the op reads or writes. |
agent |
str |
'-' |
The writing or reading agent; '-' or '*' means any agent where the op allows it. |
user_id |
str |
'-' |
The end user the row belongs to; '-' for none. |
consumer |
str |
'' |
trace attribution: which integration is calling (clickgap|claude-code|…) |
name |
str |
'' |
The symbol: a qualified name or a path:line inside it; ignored when symbol_id is set. |
symbol_id |
str |
'' |
The symbol's id from an earlier code.* answer; wins over name. |
top_k |
int |
3 |
At most this many call sites (1..10). |
| Output field | Type | Meaning |
|---|---|---|
examples |
list[dict[str, Any]] |
Call sites, test-covered callers first: {caller, path, line, tier, test_covered, body}, body = the smallest chunk around the line (up to 4,000 chars, '' when none). |
trace_run_id |
str |
Id of this call's trace row; pass it to code.outcome. |
code.files
Which indexed files have this NAME — an rg-style glob (tests/queries/0_stateless/05138_*, /*Parquet*.cpp), a basename stem (05138_with_fill matches the stem exactly or as its leading prefix…
POST /v1/code.files · MCP loom_code_files · role viewer · read · not listed under the MCP all toolset
| Input field | Type | Default | Meaning |
|---|---|---|---|
org |
str |
'' |
The tenant (first element of the identity tuple). |
namespace |
str |
'' |
The namespace the op reads or writes. |
agent |
str |
'-' |
The writing or reading agent; '-' or '*' means any agent where the op allows it. |
user_id |
str |
'-' |
The end user the row belongs to; '-' for none. |
consumer |
str |
'' |
trace attribution: which integration is calling (clickgap|claude-code|…) |
glob |
str |
'' |
An rg-style glob over the repo-relative path (/*Parquet*.cpp); '' = no glob filter. |
stem |
str |
'' |
A basename without extension, matched exactly or as its leading prefix; exact matches sort first. '' = no stem filter. |
path_prefix |
str |
'' |
Only paths under this prefix; '' = no prefix filter. |
limit |
int |
50 |
At most this many files (1..500). |
| Output field | Type | Meaning |
|---|---|---|
files |
list[dict[str, Any]] |
{path, lang, size_bytes, loc, indexed_commit}; exact stem matches first, then path order. |
total |
int |
matching files before limit |
truncated |
bool |
True when total is larger than the files returned. |
as_of |
dict[str, Any] |
Provenance + freshness: branch, commit, indexed_at, lag_commits (int, -1 unknown), stale (bool: lag > LOOM_CODE_STALE_AFTER_COMMITS). |
not_covered |
bool |
True when path_prefix lies outside the indexed prefixes; files is then empty. |
note |
str |
With not_covered: which prefixes the index holds; '' otherwise. |
trace_run_id |
str |
Id of this call's trace row ('' on a not_covered answer); pass it to code.outcome. |
code.first_build
Which CI build first carried this commit?
POST /v1/code.first_build · MCP loom_code_first_build · role viewer · read · not listed under the MCP all toolset
| Input field | Type | Default | Meaning |
|---|---|---|---|
org |
str |
'' |
The tenant (first element of the identity tuple). |
namespace |
str |
'' |
The namespace the op reads or writes. |
agent |
str |
'-' |
The writing or reading agent; '-' or '*' means any agent where the op allows it. |
user_id |
str |
'-' |
The end user the row belongs to; '-' for none. |
consumer |
str |
'' |
trace attribution: which integration is calling (clickgap|claude-code|…) |
sha |
str |
'' |
A commit sha, 7–40 hex characters; an abbreviated one is expanded on the mirror. |
pr_number |
int |
0 |
A merged PR; the ledger supplies its merge commit and time. 0 = use sha. |
| Output field | Type | Meaning |
|---|---|---|
verdict |
str |
built | not_yet_built | unknown |
causes |
list[str] |
tracker_unbound | tracker_unavailable | sha_unknown | candidates_exhausted | pr_not_merged |
epistemic |
str |
exact: a run names the sha (or the PR's own head builds); lower_bound: the earliest of ≤ 10 checked bases descends from it |
sha |
str |
The full commit sha the answer is about (from the input, the mirror or the ledger). |
pr_number |
int |
The PR the commit merged, from the input or the ledger; 0 when unknown. |
merged_at |
str |
When the PR merged, from the ledger (ISO-8601); "" when the ledger has no row. |
commit_time |
str |
The commit's time on the mirror (ISO-8601); "" when the mirror lacks the sha. |
ledger_known |
bool |
True when the PR ledger knows the subject. |
mirror_known |
bool |
True when the code mirror holds the commit. |
first_build |
dict[str, Any] |
{kind named|carrier|own, check_start_time, version, docker_tag, minor_version, git_ref, pull_request_number, commit_sha, base_sha} |
lag_hours |
float \| None |
hours from the merge (or commit) to the first carrying run |
later_builds |
int |
runs started after it inside the window (later bases not individually checked) |
window_hours |
int |
How many hours after the merge (or commit) runs are read for carriers. |
candidates_checked |
int |
How many run bases were checked on the mirror for descent from the commit. |
candidates_total |
int |
How many candidate run bases the window held. |
own_builds |
list[dict[str, Any]] |
the PR's own head builds, oldest first (≤ 8) |
containing_branches |
list[str] |
mirror branches whose head contains the sha, and the namespaces on them |
containing_namespaces |
list[str] |
The repository's namespaces whose branch contains the commit. |
nearest_namespace |
str |
the lowest release-branch namespace containing it, else the own branch's |
note |
str |
What the tracker's build view can show; "" when the tracker was not read. |
tracker_namespace |
str |
The tracker namespace bound to this code namespace; "" when none is bound. |
tracker_unavailable |
bool |
True when a tracker is bound but its read failed. |
trace_run_id |
str |
Id of this call's trace row; pass it to code.outcome. |
code.grep
Exact-match lookup over the indexed corpus.
POST /v1/code.grep · MCP loom_code_grep · role viewer · read
| Input field | Type | Default | Meaning |
|---|---|---|---|
org |
str |
'' |
The tenant (first element of the identity tuple). |
namespace |
str |
'' |
The namespace the op reads or writes. |
agent |
str |
'-' |
The writing or reading agent; '-' or '*' means any agent where the op allows it. |
user_id |
str |
'-' |
The end user the row belongs to; '-' for none. |
consumer |
str |
'' |
trace attribution: which integration is calling (clickgap|claude-code|…) |
pattern |
str |
required | The text to find: a literal substring, or an RE2 expression with regex. |
regex |
bool |
False |
True reads pattern as RE2; an invalid expression is a 422. |
case_sensitive |
bool |
True |
False matches pattern regardless of letter case. |
path_prefix |
str |
'' |
Only paths under this repo-relative prefix; '' = the whole index. |
cursor |
str |
'' |
Continuation (matches mode): the next_cursor of an earlier response to this pattern; the next page of matching lines is one point read of what the first call extracted. |
exclude_unit_ids |
list[str] |
(computed) | The caller's seen-set. |
mode |
Literal['matches', 'files', 'presence', 'message'] |
'matches' |
matches: up to limit matching LINES with text + enclosing scope. files: up to limit matching FILES (path, matching chunk count, first line) and no line text — the coverage question ("which files mention X?") that a 20-line cap cannot… |
limit |
int \| None |
None |
Default depends on mode: 20 lines, or the 500-file ceiling — a files answer capped at 20 reads like a complete coverage answer to a caller that did not know to send a limit. matches mode is clamped to 200 lines. |
path_globs |
list[str] |
(computed) | File filters, rg -g / -t style: keep paths matching any glob, drop paths matching any exclude, restrict to a language's extension set. |
exclude_globs |
list[str] |
(computed) | Drop paths matching any of these rg-style globs. |
langs |
list[str] |
(computed) | Keep only files with these languages' extensions (rg -t names: cpp, py, ts, go, …); an unknown name is a 422 that lists the known ones. |
namespaces |
list[str] |
(computed) | Several namespaces, mode="presence" only: at most 8, trimmed, duplicates removed; namespace, when set and absent, leads the list. |
neighbours |
bool \| None |
None |
The neighbours graph block in the SAME call, matches mode only: the hits' enclosing functions become anchors (at most 20, first appearance) and each carries up to neighbour_k callers, callees and mapped tests at edge confidence >= 0.8… |
neighbour_k |
int |
5 |
With neighbours: at most this many callers and callees per anchor (1..20). |
deadline_ms |
int \| None |
None |
The request's wall-clock budget in ms, from arrival (values under 200 read as 200). |
| Output field | Type | Meaning |
|---|---|---|
matches |
list[dict[str, Any]] |
{path, line, text, scope, scope_start_line, scope_end_line} per matching LINE, path/line ordered. scope_* is the span of the enclosing unit named by scope (0/0 when the line sits in no unit) — enough to decide whether to fetch the body… |
next_cursor |
str |
Continuation: cursor for the next page of matching lines, "" when the extracted set is exhausted. has_more mirrors it. |
has_more |
bool |
True when next_cursor is set. |
files |
list[dict[str, Any]] |
mode=files: {path, chunks, first_line} per matching file, path ordered. |
files_total |
int |
distinct matching files before limit (mode=files) |
chunks_matched |
int |
Indexed chunks read that contain the pattern (matches mode over-fetches up to 200). |
truncated |
bool |
True when more lines or files match than were returned, or the chunk read hit its cap. |
coverage_floor |
bool |
Chunk coverage is not byte-complete for a file: absence here cannot prove absence in the repo (same floor contract as code.verify). |
as_of |
dict[str, Any] |
Provenance + freshness: branch, commit, indexed_at, lag_commits (int, -1 unknown), stale (bool: lag > LOOM_CODE_STALE_AFTER_COMMITS). |
not_covered |
bool |
True when path_prefix lies outside the indexed prefixes (hits are then empty by construction, not by absence). |
neighbours |
list[dict[str, Any]] |
The neighbours graph block: one entry per anchor — symbol_id, qualified_name, path, module, callers, callees, tests, epistemic, causes; empty unless neighbours ran. |
anchors |
int |
distinct enclosing functions the block covers |
anchors_capped |
bool |
more resolved functions than the 20 cap |
neighbour_tokens |
int |
Tokens of the neighbours block alone; 0 when it did not run. |
note |
str |
A caveat on the answer: the pattern was re-read as a regex or matched literally, the prefix is outside the index, or the embedding coverage is low; '' when none. |
verdict |
str |
mode=message only (dropped from the wire otherwise): raised_at | no_template_match; the message's {} template; the ErrorCodes name for a Code: N prefix ("" when unmapped); the best statement's coverage (matched message characters… |
template |
str |
mode=message: the message with {} where arguments stood. |
error_code |
str |
mode=message: the ErrorCodes name for a Code: N prefix; '' when unmapped. |
coverage |
float |
mode=message: the best statement's matched share of the message characters (0..1). |
presence |
list[dict[str, Any]] |
mode=presence: one row per requested namespace, in request order — {namespace, verdict: present | absent | unknown, path, start_line, end_line, tier: "", files_total, indexed_commit, index_status, ms, reason}. |
summary |
dict[str, list[str]] |
mode=presence: {present, absent, unknown}, each the namespaces with that verdict. |
trace_run_id |
str |
Id of this call's trace row ('' on a not_covered answer); pass it to code.outcome. |
partial |
bool |
deadline_ms stopped the scan (or skipped a later read): the hits are those found in the budget and partial_reason says what was cut. |
partial_reason |
str |
What the deadline cut, as deadline N ms: <stage>; <stage>. |
fallback |
Literal['', 'literal'] |
mode=message whose pattern matched no statement template: "literal" when the same pattern was then run as a plain matches grep and matches are its lines (the verdict fields stay the message read's). |
code.history
The merged PRs that most recently touched a symbol or path: number, title, author, labels, and what reviewers said about that file — up to reviews_per_pr (default 3, 0 = none) human review comments…
POST /v1/code.history · MCP loom_code_history · role viewer · read
| Input field | Type | Default | Meaning |
|---|---|---|---|
org |
str |
'' |
The tenant (first element of the identity tuple). |
namespace |
str |
'' |
The namespace the op reads or writes. |
agent |
str |
'-' |
The writing or reading agent; '-' or '*' means any agent where the op allows it. |
user_id |
str |
'-' |
The end user the row belongs to; '-' for none. |
consumer |
str |
'' |
trace attribution: which integration is calling (clickgap|claude-code|…) |
name |
str |
'' |
A symbol name or path:line; the PRs over its definitions' files are returned. |
symbol_id |
str |
'' |
An index symbol id; wins over name. |
path |
str |
'' |
A repo-relative file; wins over name / symbol_id. |
numbers |
list[int] |
(computed) | Issue / PR numbers: the item facts and the merged PRs that are or close them, from the same reads code.search's history section uses. |
limit |
int |
5 |
At most this many PRs (1–20). |
reviews_per_pr |
int |
3 |
review comments per PR row on the queried file (0 = none) |
| Output field | Type | Meaning |
|---|---|---|
prs |
list[dict[str, Any]] |
Merged PRs, newest first: {pr_number, title, author, merged_at, labels, body_excerpt} plus reviews / review_count when asked; number lookups return the history rows. |
paths |
list[str] |
The files the PRs were read for; for number lookups, the files the returned PRs touched. |
items |
list[dict[str, Any]] |
number lookups only: what each number is (issue / pr, state, title) |
trace_run_id |
str |
Id of this call's trace row; pass it to code.outcome. |
code.impact
Symbol-shaped (name/symbol_id) or diff-shaped (files/diff) blast radius.
POST /v1/code.impact · MCP loom_code_impact · role viewer · read
| Input field | Type | Default | Meaning |
|---|---|---|---|
pr_files |
dict[str, str] |
(computed) | Repo-relative path -> the file's full text at the PR's head, for the files the PR adds or modifies (at most 50, 1,000,000 characters each). |
pr_diff |
str |
'' |
The PR's unified diff against its merge-base (at most 1,500,000 characters): its hunks say which functions the PR modifies, and its paths name the files it deletes. |
pr_head_sha |
str |
'' |
The PR's head and base commits as the caller knows them; they label the answer (overlay_head_sha) and never reach git. '' = derived from the text. |
pr_base_sha |
str |
'' |
|
org |
str |
'' |
The tenant (first element of the identity tuple). |
namespace |
str |
'' |
The namespace the op reads or writes. |
agent |
str |
'-' |
The writing or reading agent; '-' or '*' means any agent where the op allows it. |
user_id |
str |
'-' |
The end user the row belongs to; '-' for none. |
consumer |
str |
'' |
trace attribution: which integration is calling (clickgap|claude-code|…) |
name |
str |
'' |
Symbol shape: the seed's bare, qualified or partly qualified name, or path:line. |
symbol_id |
str |
'' |
Symbol shape: an index symbol id for the seed; wins over name. |
depth |
int |
2 |
How many caller hops the radius walks from the seeds (1–2). |
files |
list[str] |
(computed) | Diff shape: repo-relative changed paths, and/or a unified diff whose hunk line ranges narrow the touched set from whole files to the symbols actually edited. |
diff |
str |
'' |
A unified diff (at most 200,000 chars); its hunk ranges pick the edited functions as seeds. |
exclude_authors |
list[str] |
(computed) | Left out of owners: the change's own author(s) are not its reviewers. |
summary_only |
bool |
False |
Hub-safe ergonomics. |
per_hop_limit |
int |
200 |
At most this many impacted_symbols rows from each hop (1–500). |
offset |
int |
0 |
Rows to skip within each hop before per_hop_limit applies; pages a hub's radius. |
pr_number |
int |
0 |
An OPEN pull request whose head the mirror holds. |
| Output field | Type | Meaning |
|---|---|---|
impacted_symbols |
list[dict[str, Any]] |
Each row {qualified_name, path, hop, tier}; a row whose function is a registration function (REGISTER_FUNCTION(X), registerStorageFoo) carries via: "registration" — the seed is reached through a registry; the key is absent otherwise. |
impacted_tests |
list[dict[str, Any]] |
Tests the test map ties to the seed and impacted paths: {test_path, src_path, confidence}. |
co_change_files |
list[dict[str, Any]] |
Files changed in the same merged PRs as the seed paths, most often first ({path, prs}, at most 20): the last 10 PRs for the symbol shape, 50 for the diff shape. |
blast_radius_score |
float |
impacted/50 + tests/40, capped at 1. |
touched_symbols |
list[dict[str, Any]] |
Diff shape only: the symbols the change touches (hunk-overlap when a diff was given, else every function in the files), and the files that historically co-change with the touched set but are absent from it — the "did you forget to update… |
co_change_missing |
list[dict[str, Any]] |
Diff shape: co-change files absent from the change ({path, prs, of}, at most 5, support at least 4 PRs and 15%); empty for the symbol shape. |
owners |
list[dict[str, Any]] |
Who to ask: {author, share, prs, reviews, last_merged_at} from merged PRs over the seed paths — the PRs a person AUTHORED (prs) and the ones they REVIEWED (reviews, inline comments), recency-decayed (120-day half-life), share floor, at… |
reverts |
list[dict[str, Any]] |
Merged PRs over the seed paths that were REVERTS ({pr_number, title, merged_at}, newest first, <=5): the one kind of history that says what not to do, invisible to symbol lookups (the code is back) and to co-change (same files as the… |
counts_floor |
bool |
Same epistemic contract as code.callers: radius counts are floors. |
unresolved_calls |
int |
Symbol shape: call sites named like the seed(s) that the fast tier declined to bind — the size of the floor. |
ambiguous_calls |
int |
Declined call sites with several same-named definitions (see unresolved_calls). |
epistemic |
str |
Epistemic envelope. |
causes |
list[str] |
Why epistemic is lower_bound, from the set above; empty when it is exact. |
by_hop_counts |
dict[int, int] |
Distinct symbols reached per hop BEFORE any slicing: {1: n, 2: m}. |
truncated |
bool |
True when impacted_symbols is a page of the radius (per_hop_limit / offset sliced it, or the per-hop edge read hit its cap). |
resolved_by |
str |
anonymous_namespace | tail when the symbol shape's name bound through symbol-form tolerance; "" and off the wire otherwise. |
verdict |
str |
Why the radius is empty, '' when it is not. |
paths_seen |
list[dict[str, str]] |
Diff shape: every path the request named, with its class — test | doc | config | unindexed (outside the indexed prefixes, or a source path the index holds no file row for) | src — so the verdict is actionable without re-deriving… |
overlay |
bool |
On the wire only when pr_number was given — see CodeCallersOutput. |
overlay_head_sha |
str |
The PR head commit whose post-image was parsed; "" when there is no overlay. |
overlay_added |
int |
How many functions the PR adds in its parsed files, each a touched_symbols seed. |
overlay_note |
str |
Why the overlay is off: head_not_in_mirror, no_merge_base or no_repo_entry; when it is on, "" or how many changed files it did not fully read. |
trace_run_id |
str |
Id of this call's trace row; pass it to code.outcome. |
code.index_errors
List the files the code index failed to parse or ingest, with the error and the commit.
POST /v1/code.index_errors · MCP loom_code_index_errors · role viewer · read
| Input field | Type | Default | Meaning |
|---|---|---|---|
org |
str |
'' |
The tenant (first element of the identity tuple). |
namespace |
str |
'' |
The namespace the op reads or writes. |
agent |
str |
'-' |
The writing or reading agent; '-' or '*' means any agent where the op allows it. |
user_id |
str |
'-' |
The end user the row belongs to; '-' for none. |
consumer |
str |
'' |
trace attribution: which integration is calling (clickgap|claude-code|…) |
limit |
int |
100 |
At most this many files, newest first (1..1000). |
| Output field | Type | Meaning |
|---|---|---|
rows |
list[CodeIndexErrorRow] |
Files whose last ingest recorded an error, newest first. |
total |
int |
Every errored live file in the namespace, not only the rows returned. |
code.index_status
Health of the code index: indexed head commit, compiler-tier commit, row counts, watermarks, and the weekly tables' state (symbol_stats_rows/at, unit_risk_rows/at; 0 = not written yet).
POST /v1/code.index_status · MCP loom_code_index_status · role viewer · read
| Input field | Type | Default | Meaning |
|---|---|---|---|
org |
str |
'' |
The tenant (first element of the identity tuple). |
namespace |
str |
'' |
The namespace the op reads or writes. |
agent |
str |
'-' |
The writing or reading agent; '-' or '*' means any agent where the op allows it. |
user_id |
str |
'-' |
The end user the row belongs to; '-' for none. |
consumer |
str |
'' |
trace attribution: which integration is calling (clickgap|claude-code|…) |
commit |
str |
'' |
Optional merge commit SHA: report whether every index tier covers it (commit_coverage.ready). |
paths |
list[str] |
(computed) | With commit: the PR's changed paths; the answer lists those a later merge changed. |
brief |
bool \| None |
None |
Compact answer without state/op catalogue/workers. |
| Output field | Type | Meaning |
|---|---|---|
repo |
str |
The repository identity. |
branch |
str |
The branch this entry indexes. |
org |
str |
The tenant (first element of the identity tuple). |
namespace |
str |
The namespace the op reads or writes. |
provider |
str |
|
profile |
str |
|
compiler_candidates |
list[str] |
Compiler tiers inferred from the indexed tree, even before a compiler worker has produced its first watermark. |
quality_warnings |
list[str] |
Actionable readiness gaps. |
git_head |
str |
The fast tier's watermark: the last commit whose files are ingested; '' before the first pass. |
scip_commit |
str |
scip_commit / scip_lag are the ENTRY'S compiler tier — the one scip_producer names — not the C++ key by name; a TypeScript repository reports its scip-typescript watermark here. |
scip_commit_py |
str |
The scip-python watermark by name, whatever the entry's primary tier; '' when unset. |
scip_producer |
str |
The primary compiler tier's producer (clang | typescript | go | python); '' when no tier has a watermark. |
compiler_tiers |
list[CodeCompilerTier] |
Every compiler tier with a watermark or configured for the entry, the primary first. |
tier_health |
list[CodeTierHealth] |
The last recorded outcome of each tier that has one (fetch, ingest, the compiler tiers and the weekly C++ full run): a failing tier names its error kind, since when, and the fix. |
pr_cursor |
str |
The PR-history poller's cursor: the newest updated_at (ISO-8601) of the merged PRs it fetched; '' before its first pass. |
commit_coverage |
CodeCommitCoverage \| None |
Set when the request named a commit. |
clone_head |
str |
Freshness. clone_head is the bare clone's branch tip as of the last poller fetch (<= interval old); *_lag = first-parent commits between a watermark and that tip, -1 when a watermark is unset or the clone is unreadable. 0 everywhere ==… |
clone_fetched_at |
str |
When the ingest pass last fetched this entry's mirror (the clone_head row's updated_at, ISO-8601 UTC; '' unknown) and whether that is older than code_fetch_stale_after_seconds. |
fetch_overdue |
bool |
True when clone_fetched_at is older than code_fetch_stale_after_seconds. |
fast_tier_lag |
int |
First-parent commits between git_head and clone_head; -1 when either is unknown. |
scip_lag |
int |
First-parent commits between scip_commit and clone_head; -1 when either is unknown. |
scip_py_lag |
int |
First-parent commits between scip_commit_py and clone_head; -1 when either is unknown. |
last_refresh_at |
str |
Last code.refresh request (the CI hook). |
last_refresh_detail |
str |
The caller of that request, as agent=<agent> expected_head=<first 12 hex>; a field the caller left empty is left out. |
org_readable |
bool |
Deployment-level read rule (LOOM_CODE_ORG_READABLE / per-entry): when true every org principal reads this entry regardless of visibility. |
path_prefixes |
list[str] |
The path prefixes the entry indexes; [""] = the whole tree. |
counts |
dict[str, int] |
Live row counts per code table (code_files, code_chunks, code_symbols, …); empty in the brief answer. |
state |
dict[str, dict[str, str]] |
Every code_index_state row: {key: {value, detail, updated_at}}. |
workers |
dict[str, CodeWorkerStatus] |
Per code_* worker, its enabled flag, interval and last pass; empty in the brief answer. |
build_commit |
str |
Capability catalogue: the build this server runs and every served code.* operation with the request fields its input model accepts, so a client checks for a route or a field instead of probing for a 404 or a 422. |
ops |
list[str] |
Every served code.* operation, sorted; empty in the brief answer. |
request_fields |
dict[str, list[str]] |
Per served op, the request fields its input model accepts; empty in the brief answer. |
op_maturity |
dict[str, str] |
Per served op, its maturity (stable | experimental) and the reach kinds a caller has to it. |
op_reach |
dict[str, list[str]] |
Per served op, its reach kinds (mcp_core | mcp_atomic | mcp_all | sdk_method | sdk_example | plugin_hook | dashboard | http_only); empty in the brief answer. |
op_toolsets |
dict[str, list[str]] |
Per served op, every MCP toolset whose listing carries it (core | coding | atomic | all; empty when hidden). |
symbol_stats_rows |
int |
The weekly symbol fan-in table for this namespace — live rows with callers and the newest pass stamp (ISO 8601, UTC). 0 / "" = the pass has not written it: every fan_in field, the fan-in sort and the rank prior answer empty. |
symbol_stats_at |
str |
The newest fan-in pass stamp (ISO-8601 UTC); '' when the pass has not written the table. |
unit_risk_rows |
int |
The precomputed risk table for this namespace — live rows and the newest stamp (ISO 8601, UTC), so an operator sees the weekly leg's progress and a resumed pass's remainder. 0 / "" = no row written (every served unit is read live). |
unit_risk_at |
str |
The newest risk-table stamp (ISO-8601 UTC); '' when no row is written. |
chunks_total |
int |
Live chunks, those carrying a vector, and their ratio (0..1; reference fixtures unembedded by design are outside the denominator). |
chunks_embedded |
int |
Live chunks that carry an embedding vector. |
embedding_coverage |
float |
Embedded share of the embeddable chunks (0..1); 1.0 when the counts do not carry it. |
code.map
PageRank-ordered orientation map of the indexed repository with per-file summary cards, token-budgeted.
POST /v1/code.map · MCP loom_code_map · role viewer · read · not listed under the MCP all toolset
| Input field | Type | Default | Meaning |
|---|---|---|---|
org |
str |
'' |
The tenant (first element of the identity tuple). |
namespace |
str |
'' |
The namespace the op reads or writes. |
agent |
str |
'-' |
The writing or reading agent; '-' or '*' means any agent where the op allows it. |
user_id |
str |
'-' |
The end user the row belongs to; '-' for none. |
consumer |
str |
'' |
trace attribution: which integration is calling (clickgap|claude-code|…) |
token_budget |
int |
1000 |
Token budget for the map (200..4000); entries past it are dropped. |
module_prefix |
str |
'' |
Only modules and hubs under this repo-relative prefix; '' = the whole repository. |
| Output field | Type | Meaning |
|---|---|---|
map |
str |
The repository map as Markdown: module cards and call-graph hubs, then the most-called symbols when the fan-in stats exist. |
tokens_used |
int |
Estimated tokens of map. |
commit_sha |
str |
The fast-tier watermark (git_head) the map reflects; '' before the first pass. |
trace_run_id |
str |
Id of this call's trace row; pass it to code.outcome. |
code.outcome
Tell loom what you did with a code answer, by its trace_run_id: 'used_in_answer', 'opened_file' (targets = the paths), 'fell_back_grep' or 'ignored'.
POST /v1/code.outcome · MCP loom_code_outcome · role viewer · idempotent · not listed under the MCP all toolset
| Input field | Type | Default | Meaning |
|---|---|---|---|
org |
str |
'' |
The tenant (first element of the identity tuple). |
namespace |
str |
'' |
The namespace the op reads or writes. |
agent |
str |
'-' |
The writing or reading agent; '-' or '*' means any agent where the op allows it. |
user_id |
str |
'-' |
The end user the row belongs to; '-' for none. |
consumer |
str |
'' |
trace attribution: which integration is calling (clickgap|claude-code|…) |
trace_run_id |
str |
'' |
Required for retrieval outcomes; optional (empty) for shunt_* only. |
action |
Literal['opened_file', 'used_in_answer', 'fell_back_grep', 'ignored', 'shunt_hit', 'shunt_pass'] |
required | What happened after the answer: opened_file (a returned file was read), used_in_answer, fell_back_grep, ignored; or a batch of shunt-hook decisions (shunt_hit | shunt_pass). |
targets |
list[str] |
(computed) | opened_file: the paths read (matched to the trace's returned paths); shunt_*: one tool name per decision. |
source |
str |
'' |
Who / why. |
tokens_saved |
int |
0 |
shunt_hit: bytes of the file/grep result the model did not ingest ÷ 4. shunt_pass: the same estimate for what the pass LET IN (the addressable tokens, summed per reason). 0 when unknowable (grep). |
spans |
list[str] |
(computed) | Aligned with targets: the line span each decision / open covered, as path:start-end (shunt rows: the file and the lines the Read would cover), start-end (opened_file: the Read's offset/limit against the target path) or '' when… |
reason |
str |
'' |
fell_back_grep / ignored: WHY, from OUTCOME_REASONS. |
| Output field | Type | Meaning |
|---|---|---|
recorded |
bool |
True when the row was written; false when the trace log is disabled or the write failed. |
code.outline
"What is in this file?" — the question a whole-file read answers at the price of the whole file.
POST /v1/code.outline · MCP loom_code_outline · role viewer · read
| Input field | Type | Default | Meaning |
|---|---|---|---|
org |
str |
'' |
The tenant (first element of the identity tuple). |
namespace |
str |
'' |
The namespace the op reads or writes. |
agent |
str |
'-' |
The writing or reading agent; '-' or '*' means any agent where the op allows it. |
user_id |
str |
'-' |
The end user the row belongs to; '-' for none. |
consumer |
str |
'' |
trace attribution: which integration is calling (clickgap|claude-code|…) |
path |
str |
required | repo-relative path ("src/Foo.cpp"); a leading ./ is tolerated |
kinds |
list[str] |
(computed) | Declaration kinds to list (function, class, job, …); the default covers every kind the symbol table records for code, SQL tests, build files and data models. |
token_budget |
int |
1500 |
Whole-row budgeted: an entry ships complete (signature included) or not at all; the first elided entry names its own code.symbol call. |
| Output field | Type | Meaning |
|---|---|---|
path |
str |
The repo-relative path read, normalised from the request. |
entries |
list[dict[str, Any]] |
source order: |
total |
int |
declarations found for the requested kinds |
returned |
int |
Entries in entries. |
elided |
int |
Declarations left out because token_budget ran out (total - returned). |
next |
str |
code.symbol name=<qualified_name> of the first elided entry ("" when nothing was elided); a larger token_budget re-fetches the whole list. |
indexed |
bool |
False when the path has no live symbol rows: unindexed, renamed, or the index has not caught up — read the file. |
verdict |
str |
Why entries is empty, '' when it is not. |
tokens_returned |
int |
Estimated tokens of the entries (and head) returned. |
took_ms |
int |
Server-side wall time of the call, in milliseconds. |
head |
str |
A reference fixture (lang reference) declares nothing; its indexed head (first 4,000 chars) is returned here instead, with head_truncated when the file is longer. |
head_truncated |
bool |
True when the fixture is longer than the head returned; omitted with head. |
as_of |
dict[str, Any] |
Provenance + freshness: branch, commit, indexed_at, lag_commits (int, -1 unknown), stale (bool: lag > LOOM_CODE_STALE_AFTER_COMMITS). |
trace_run_id |
str |
Id of this call's trace row; pass it to code.outcome. |
code.path_guards
The conditions that stand on the call path from from_symbol to to_symbol: the verify(reaches) chain, and for each hop the guards the call site sits under inside its caller…
POST /v1/code.path_guards · MCP loom_code_path_guards · role viewer · read · not listed under the MCP all toolset
| Input field | Type | Default | Meaning |
|---|---|---|---|
org |
str |
'' |
The tenant (first element of the identity tuple). |
namespace |
str |
'' |
The namespace the op reads or writes. |
agent |
str |
'-' |
The writing or reading agent; '-' or '*' means any agent where the op allows it. |
user_id |
str |
'-' |
The end user the row belongs to; '-' for none. |
consumer |
str |
'' |
trace attribution: which integration is calling (clickgap|claude-code|…) |
from_symbol |
str |
required | The symbol the call path starts from. |
to_symbol |
str |
required | a symbol name, or a path prefix (contains '/') like verify(reaches) |
mentions |
str |
'' |
the identifier the question asks about ('' lists the guards only) |
depth |
int |
4 |
The most call hops the walk follows (1..4). |
| Output field | Type | Meaning |
|---|---|---|
verdict |
Literal['guarded_by', 'no_guard_named', 'path_found', 'path_not_found', 'unknown'] |
guarded_by a guard on some hop names mentions no_guard_named the path was found, no guard on it names mentions path_found the path was found and mentions was empty (listing) path_not_found the bounded walk emptied its frontier… |
causes |
list[str] |
Machine-readable causes behind unknown, and the standing floors of a syntactic read otherwise (empty on guarded_by/no_guard_named/path_found only when nothing further limited the answer). |
epistemic |
Literal['lower_bound'] |
Always lower_bound: guards are read syntactically inside each caller only. |
explanation |
str |
A human-readable account of how the verdict was reached. |
hops |
list[dict[str, Any]] |
One entry per hop, seed first. |
named_at |
list[str] |
The hops whose guards name mentions, as "path:line" — the places to read |
visited_symbols |
int |
Symbols the bounded call walk visited. |
trace_run_id |
str |
Id of this call's trace row; pass it to code.outcome. |
code.pr_check
A PR draft asks whether a PR like it already exists.
POST /v1/code.pr_check · MCP loom_code_pr_check · role viewer · read · not listed under the MCP all toolset
| Input field | Type | Default | Meaning |
|---|---|---|---|
org |
str |
'' |
The tenant (first element of the identity tuple). |
namespace |
str |
'' |
The namespace the op reads or writes. |
agent |
str |
'-' |
The writing or reading agent; '-' or '*' means any agent where the op allows it. |
user_id |
str |
'-' |
The end user the row belongs to; '-' for none. |
consumer |
str |
'' |
trace attribution: which integration is calling (clickgap|claude-code|…) |
title |
str |
'' |
The draft's title; its tokens (with the symbols') are matched against PR titles. |
body |
str |
'' |
The draft's description: Fixes #N links and #N mentions add issues, and its words (template boilerplate stripped) add match tokens. |
paths |
list[str] |
(computed) | repository-relative paths the draft changes |
symbols |
list[str] |
(computed) | symbols the draft adds or changes (function / class / method names) |
issues |
list[int] |
(computed) | issues the draft closes, beside the ones its text names (Fixes #123, #123) |
pr_number |
int |
0 |
the PR already opened for this draft: excluded from the candidates |
top_k |
int |
5 |
At most this many candidates in items (1..20). |
| Output field | Type | Meaning |
|---|---|---|
verdict |
str |
duplicate_of | related | none — none carries no items (open it) |
items |
list[dict[str, Any]] |
[{pr_number, state: open|merged|closed, title, author, opened_at, merged_at, closed_at, relation: duplicate|related, score, evidence: [str], shared_paths, files_total, linked_issues, labels, found_by: [leg], features}] |
undecided |
bool |
the top candidate sits in the upper related band: a human should look |
epistemic |
str |
heuristic (every leg read) | lower_bound (a leg was unavailable) | unavailable |
thresholds |
dict[str, float] |
The score cut-offs the verdict used: {duplicate, related}. |
legs |
dict[str, Any] |
rows read per leg, or "unavailable: |
draft |
dict[str, Any] |
what the draft became: title_tokens, paths, symbols, issues |
trace_run_id |
str |
Id of this call's trace row; pass it to code.outcome. |
code.recent_commits
List the most recently indexed commits of a repository, decorated with subject and time from the clone.
POST /v1/code.recent_commits · MCP loom_code_recent_commits · role viewer · read
| Input field | Type | Default | Meaning |
|---|---|---|---|
org |
str |
'' |
The tenant (first element of the identity tuple). |
namespace |
str |
'' |
The namespace the op reads or writes. |
agent |
str |
'-' |
The writing or reading agent; '-' or '*' means any agent where the op allows it. |
user_id |
str |
'-' |
The end user the row belongs to; '-' for none. |
consumer |
str |
'' |
trace attribution: which integration is calling (clickgap|claude-code|…) |
limit |
int |
20 |
At most this many commits, newest ingest first (1..100). |
| Output field | Type | Meaning |
|---|---|---|
rows |
list[CodeRecentCommitRow] |
Commits the fast tier wrote files at, newest ingest first. |
code.refresh
CI calls this right after a merge lands: run one ingest pass now instead of waiting for the poll interval.
POST /v1/code.refresh · MCP loom_code_refresh · role writer · write · audited · not listed under the MCP all toolset
| Input field | Type | Default | Meaning |
|---|---|---|---|
org |
str |
'' |
The tenant (first element of the identity tuple). |
namespace |
str |
'' |
The namespace the op reads or writes. |
agent |
str |
'-' |
The writing or reading agent; '-' or '*' means any agent where the op allows it. |
user_id |
str |
'-' |
The end user the row belongs to; '-' for none. |
consumer |
str |
'' |
trace attribution: which integration is calling (clickgap|claude-code|…) |
expected_head |
str |
'' |
The commit CI just merged; advisory, recorded in last_refresh_detail and never checked. |
wait |
bool |
False |
wait=True blocks until the pass completes (CI wants a sync signal); default fire-and-forget returns immediately. |
wait_timeout_seconds |
int |
300 |
With wait: seconds to wait for the pass (10..900); the call fails when the pass outlasts it. |
| Output field | Type | Meaning |
|---|---|---|
triggered |
bool |
True when this call started an ingest pass; false when one was already running. |
already_running |
bool |
True when a pass for this namespace was already in flight; this call started none. |
head_before |
str |
The fast-tier watermark (git_head) before the pass; '' when the namespace has none. |
head_after |
str |
With wait: the fast-tier watermark after the pass; '' otherwise. |
code.reindex
Operator repair: move the git watermark (e.g. back N commits after a bad pass, or to a specific sha).
POST /v1/code.reindex · MCP loom_code_reindex · role admin · write · audited · not listed under the MCP all toolset
| Input field | Type | Default | Meaning |
|---|---|---|---|
org |
str |
'' |
The tenant (first element of the identity tuple). |
namespace |
str |
'' |
The namespace the op reads or writes. |
agent |
str |
'-' |
The writing or reading agent; '-' or '*' means any agent where the op allows it. |
user_id |
str |
'-' |
The end user the row belongs to; '-' for none. |
consumer |
str |
'' |
trace attribution: which integration is calling (clickgap|claude-code|…) |
git_head |
str |
required | full 40-char sha to move the ingest watermark to |
| Output field | Type | Meaning |
|---|---|---|
previous_head |
str |
The fast-tier watermark before the move; '' when it was unset. |
new_head |
str |
The watermark now set; the ingest worker re-walks from it. |
code.repo.add
Add a repository's branch as a new read-only index.
POST /v1/code.repo.add · MCP loom_code_repo_add · role viewer · write · audited
| Input field | Type | Default | Meaning |
|---|---|---|---|
org |
str |
required | The tenant (first element of the identity tuple). |
repo |
str |
required | GitHub owner/name or an HTTPS/SSH Git URL. |
branch |
str |
'' |
Blank asks the remote for its symbolic default branch. |
join_policy |
Literal['open', 'approval'] |
'open' |
open: any org member joins at once; approval: a maintainer approves each request. |
classification |
Literal['standard', 'restricted'] |
'standard' |
standard or restricted (a reader needs an approved grant and a token that names the namespace). |
access_token |
str |
'' |
Token for a private HTTPS remote; stored encrypted, never returned. |
path_prefixes |
list[str] |
(computed) | Path prefixes to index (src/, lib/); blank entries are dropped, [] indexes the whole tree. |
exclude |
list[str] |
(computed) | Globs never indexed for this repository (vendor/, *.generated.go); [] keeps the deployment's default exclude list. |
exclude_generated |
bool |
True |
Refuse generated content (Go's // Code generated … DO NOT EDIT. header, the @generated marker, the repository's .gitattributes linguist rules) — on unless the maintainer says otherwise |
scip_producer |
Literal['', 'go', 'typescript', 'clang', 'python'] |
'' |
The compiler tier's producer; "" infers it from the tree's manifests (go.mod → go, tsconfig / package.json → typescript, a root CMakeLists.txt → clang, pyproject → python) |
branches |
list[str] |
(computed) | More branches chosen at add time, each its own index sharing the mirror and inheriting rule, token and paths; per-branch refusals come back in skipped, never undoing the ones registered. |
| Output field | Type | Meaning |
|---|---|---|
org |
str |
The tenant (first element of the identity tuple). |
namespace |
str |
The namespace the op reads or writes. |
repo |
str |
Stable repository identity. |
remote |
str |
|
provider |
str |
|
branch |
str |
The branch the new index follows. |
join_policy |
str |
The join policy as registered (approval for a restricted repository). |
classification |
str |
The classification as registered: standard or restricted. |
index_stage |
str |
queued at creation; the worker moves it (see CodeRepoSummary.stage) |
my_role |
str |
admin when the caller became the index's first maintainer; '' for a caller with no subject. |
remote_head |
str |
The branch head SHA the remote answered with at add time. |
also |
list[dict[str, str]] |
The other branches registered in the same call ({branch, namespace, remote_head}) |
skipped |
list[dict[str, str]] |
The extra branches refused, per branch {branch, reason}; the others stay registered. |
code.repo.add_branch
Index another branch of a repository the caller maintains.
POST /v1/code.repo.add_branch · MCP loom_code_repo_add_branch · role admin · write · audited
| Input field | Type | Default | Meaning |
|---|---|---|---|
org |
str |
required | The tenant (first element of the identity tuple). |
namespace |
str |
required | The namespace the op reads or writes. |
branch |
str |
required | The branch to index as a new namespace; it must exist on the remote. |
| Output field | Type | Meaning |
|---|---|---|
org |
str |
The tenant (first element of the identity tuple). |
namespace |
str |
The namespace the op reads or writes. |
repo |
str |
Stable repository identity. |
remote |
str |
|
provider |
str |
|
branch |
str |
The branch the new index follows. |
join_policy |
str |
The join policy as registered (approval for a restricted repository). |
classification |
str |
The classification as registered: standard or restricted. |
index_stage |
str |
queued at creation; the worker moves it (see CodeRepoSummary.stage) |
my_role |
str |
admin when the caller became the index's first maintainer; '' for a caller with no subject. |
remote_head |
str |
The branch head SHA the remote answered with at add time. |
also |
list[dict[str, str]] |
The other branches registered in the same call ({branch, namespace, remote_head}) |
skipped |
list[dict[str, str]] |
The extra branches refused, per branch {branch, reason}; the others stay registered. |
code.repo.remote_branches
What a Git remote shows before anything is written — every branch with its head, the default branch, the ones that look like release branches, and the ones indexed here already — so the add dialog…
POST /v1/code.repo.remote_branches · MCP loom_code_repo_remote_branches · role viewer · read
| Input field | Type | Default | Meaning |
|---|---|---|---|
org |
str |
required | The org adding the repository. |
repo |
str |
required | GitHub owner/name or an HTTPS/SSH Git URL. |
access_token |
str |
'' |
Token for a private HTTPS remote; used once. |
query |
str |
'' |
Case-insensitive substring of the branch name to match. |
limit |
int |
60 |
How many matching branches to return (default 60). |
| Output field | Type | Meaning |
|---|---|---|
org |
str |
The tenant (first element of the identity tuple). |
repo |
str |
Stable repository identity. |
remote |
str |
|
provider |
str |
|
warnings |
list[str] |
|
default_branch |
str |
The branch the remote reports as its default. |
branches |
list[dict[str, str]] |
[{name, sha}] — default first, then release-shaped, then the rest |
suggested |
list[str] |
release-shaped branches not indexed yet (26.8, release/1.2, stable-x) |
indexed |
list[dict[str, str]] |
[{branch, namespace}] already indexed in this org |
cap |
int |
how many more indexes the org may add (code_self_service_max_repos − active) |
total |
int |
branches is the first limit matches of query over total heads (the default and the indexed ones always included); truncated says a search is needed to see the rest |
matched |
int |
How many heads match query (all of them when it is empty). |
truncated |
bool |
True when some matching heads are not in branches. |
query |
str |
The filter as applied: trimmed and lower-cased; '' = no filter. |
code.repo.remove
Retire a repository index a person added.
POST /v1/code.repo.remove · MCP loom_code_repo_remove · role admin · idempotent · audited
| Input field | Type | Default | Meaning |
|---|---|---|---|
org |
str |
required | The tenant (first element of the identity tuple). |
namespace |
str |
required | The namespace the op reads or writes. |
confirm |
str |
'' |
Must equal namespace, or the call is refused with CONFIRM_REQUIRED. |
| Output field | Type | Meaning |
|---|---|---|
org |
str |
The tenant (first element of the identity tuple). |
namespace |
str |
The namespace the op reads or writes. |
repo |
str |
The retired index's GitHub owner/name. |
branch |
str |
The branch the retired index followed. |
registry_deactivated |
bool |
True when the registry row went inactive by this call. |
directory_deactivated |
bool |
True when the namespace's directory row was deleted. |
purged_tables |
int |
How many code tables keyed by the namespace the erasure saga purges. |
erasure_id |
str |
The erasure saga that purges them — follow it with erasure.status; erasure_recovery resumes it. |
mirror_removed |
bool |
True when the bare mirror was deleted because no other branch of the repository uses it. |
sources_deactivated |
list[str] |
The document sources registered on the namespace (knowledge.source.add), now inactive with their credentials cleared. |
code.repo.set_access
A maintainer sets a repository's access — its classification (standard | restricted) and join policy (open | approval | closed).
POST /v1/code.repo.set_access · MCP loom_code_repo_set_access · role admin · idempotent · audited · not listed under the MCP all toolset
| Input field | Type | Default | Meaning |
|---|---|---|---|
org |
str |
required | The tenant (first element of the identity tuple). |
namespace |
str |
required | The namespace the op reads or writes. |
classification |
str |
required | standard or restricted (case-insensitive); anything else is BAD_CLASSIFICATION. |
join_policy |
str |
required | open, approval or closed (case-insensitive); open with restricted is refused. |
confirm |
str |
'' |
Must equal namespace when the call widens restricted to standard, which also needs an admin grant of the caller's own there (a copy that does not come from one of the repository's operator entries does not count); else unused. |
| Output field | Type | Meaning |
|---|---|---|
org |
str |
The tenant (first element of the identity tuple). |
namespace |
str |
The namespace the op reads or writes. |
repo |
str |
The repository's GitHub owner/name. |
classification |
str |
The classification as written (lower-cased). |
join_policy |
str |
The join policy as written (lower-cased). |
previous_classification |
str |
The entry's classification before this call: restricted when either the entry, as this process last read it, or its directory row said so. |
previous_join_policy |
str |
The directory row's join policy before this call (when it had none: open for a public entry, else approval). |
directory_updated |
bool |
True when the namespace's directory row got the new access too, a branch added from the page with no row yet getting its first one; False for an operator entry with no directory row. |
effective_within_s |
int |
every process re-reads the access row within this many seconds |
code.repo.set_source
A maintainer sets the trackers this repository reads (records of issues, PRs, tests and incidents registered with tracker.source.add), in order.
POST /v1/code.repo.set_source · MCP loom_code_repo_set_source · role admin · idempotent · audited · not listed under the MCP all toolset
| Input field | Type | Default | Meaning |
|---|---|---|---|
org |
str |
required | The tenant (first element of the identity tuple). |
namespace |
str |
required | The namespace the op reads or writes. |
tracker_namespaces |
list[str] |
required | Tracker namespaces of this org, primary first (duplicates dropped; [] unlinks all); a new link needs the tracker's admin. |
| Output field | Type | Meaning |
|---|---|---|
org |
str |
The tenant (first element of the identity tuple). |
namespace |
str |
The namespace the op reads or writes. |
tracker_namespaces |
list[str] |
the links as written (primary first) |
previous_tracker_namespaces |
list[str] |
The links before this call, primary first ([] = none). |
effective_within_s |
int |
Seconds within which every process re-reads the links. |
not_covering |
list[str] |
Linked trackers that do not list this repository (they read only the repositories they name, so they answer nothing here), and the sentence that says so |
warning |
str |
One clause per not_covering tracker naming the repositories it reads, and one naming the registered branches that read these links too; '' when neither. |
code.repos
Lists the code namespaces (repo@branch entries) configured on this deployment that the caller is authorized to read, across orgs — each row carries its org.
POST /v1/code.repos · MCP loom_code_repos · role viewer · read
| Input field | Type | Default | Meaning |
|---|---|---|---|
org |
str |
'' |
The tenant (first element of the identity tuple). |
namespace |
str |
'' |
The namespace the op reads or writes. |
agent |
str |
'-' |
The writing or reading agent; '-' or '*' means any agent where the op allows it. |
user_id |
str |
'-' |
The end user the row belongs to; '-' for none. |
consumer |
str |
'' |
trace attribution: which integration is calling (clickgap|claude-code|…) |
repo |
str |
'' |
A caller standing in one checkout (the plugin's code shunt, from the origin remote) names it, and the answer is that repository's entries only — one status read instead of one per configured repository. |
repos |
list[str] |
(computed) | The checkout's remotes as ordered candidates (origin, upstream, then the rest; each owner/name or a URL, as repo). |
fields |
list[str] \| None |
None |
The output fields the caller reads (a whitelist resolved against the row model; an unknown name is a 422); unset, every field. |
| Output field | Type | Meaning |
|---|---|---|
repos |
list[CodeRepoSummary] |
One row per entry the caller reads (plus unreadable rows an org admin may adopt), narrowed to the repo / repos match when either was given; [] when none. |
code.review_brief
A merged PR's review brief: the point read of what the ingest built at merge — touched symbols with callers and fan-in, coverage verdicts, setting facts, regression history, blame of the deleted…
POST /v1/code.review_brief · MCP loom_code_review_brief · role viewer · read · not listed under the MCP all toolset
| Input field | Type | Default | Meaning |
|---|---|---|---|
pr_files |
dict[str, str] |
(computed) | Repo-relative path -> the file's full text at the PR's head, for the files the PR adds or modifies (at most 50, 1,000,000 characters each). |
pr_diff |
str |
'' |
The PR's unified diff against its merge-base (at most 1,500,000 characters): its hunks say which functions the PR modifies, and its paths name the files it deletes. |
pr_head_sha |
str |
'' |
The PR's head and base commits as the caller knows them; they label the answer (overlay_head_sha) and never reach git. '' = derived from the text. |
pr_base_sha |
str |
'' |
|
org |
str |
'' |
The tenant (first element of the identity tuple). |
namespace |
str |
'' |
The namespace the op reads or writes. |
agent |
str |
'-' |
The writing or reading agent; '-' or '*' means any agent where the op allows it. |
user_id |
str |
'-' |
The end user the row belongs to; '-' for none. |
consumer |
str |
'' |
trace attribution: which integration is calling (clickgap|claude-code|…) |
pr_number |
int |
0 |
The PR to brief; 0 = find it by merge_sha. |
merge_sha |
str |
'' |
The PR's merge commit (hex, up to 40 chars); '' = find it by pr_number. |
sections |
list[Literal['paths', 'symbols', 'tests', 'settings', 'history', 'blame', 'qa', 'risk', 'do_not_flag', 'rationale']] |
(computed) | Serve only these of the tier's sections; empty = every section the tier carries. |
tier |
Literal['trivial', 'standard', 'full'] |
'standard' |
Which sections and default budget: trivial (paths, symbols), standard (+ tests, settings, history, risk, rationale) or full (+ blame, qa). |
token_budget |
int |
0 |
Token budget for the served sections; 0 = the tier's (700 / 2,500 / 4,000). |
store |
bool |
True |
Whether a brief this call builds on a miss is stored for the next reader (the default). |
open |
bool |
False |
The PR is OPEN — brief its head (refs/pull/N/head on the mirror) diffed against its merge-base with the indexed branch, with the post-image overlay on the impact read (added functions are seeds). |
| Output field | Type | Meaning |
|---|---|---|
pr_number |
int |
The PR the brief is of (from the stored brief when the request named only merge_sha). |
merge_sha |
str |
The PR's merge commit; '' on an open brief or when no brief was found. |
source |
Literal['precomputed', 'built', 'built_from_mirror', 'missing'] |
precomputed (the ingest built it) | built (this call built it from the ledger's row) | built_from_mirror (no ledger row; the merge commit, title and files came from the mirror's first-parent chain and the reviewers from the tracker record)… |
ledger |
Literal['', 'present', 'absent'] |
what the ledger said: present (this build read its row) | absent (this or the stored build came from the mirror because the ledger had no row) | "" (not consulted: the ingest built the row) |
stored |
bool |
True when this call built the brief and stored it |
provenance |
dict[str, Any] |
A mirror-built brief's disclosure — source, ledger, merge_commit, files, title (qa | mirror), qa status, reviewers, author, has_test, is_backport_pr; {} for a ledger- or ingest-built brief |
overlay |
bool |
On the wire only for open: true. |
overlay_head_sha |
str |
The open PR's head the brief was read or built at; '' when the mirror lacks it. |
overlay_added |
int |
Functions the open PR adds (the symbols section's via: added rows). |
overlay_note |
str |
Why no open brief exists (head_not_in_mirror | no_merge_base | no_repo_entry); when one was served, '' or how many changed files its overlay did not fully read (a brief whose overlay left files unreached is not stored). |
tier |
str |
The tier served. |
built_at |
str |
When the brief was built (ISO-8601 UTC); '' when source is missing. |
indexed_commit |
str |
The fast-tier watermark the brief was built against; '' when it was unread. |
build_ms |
int |
How long building the brief took, in milliseconds (at build time, not this call). |
tokens_used |
int |
Estimated tokens of the sections served. |
token_budget |
int |
The budget the sections were cut to: the request's, else the tier's. |
decisions |
dict[str, bool] |
one-bit answers read off the section verdicts: test_only, symbol_with_regressions, uncovered_symbol, randomized_setting, deleted_lines_blamed |
sections |
dict[str, dict[str, Any]] |
name -> |
trace_run_id |
str |
Id of this call's trace row; pass it to code.outcome. |
code.scip_ingest
Accept one part of a SCIP index upload (compiler-tier symbols and references) for a batch.
POST /v1/code.scip_ingest · MCP loom_code_scip_ingest · role writer · idempotent · audited · not listed under the MCP all toolset
| Input field | Type | Default | Meaning |
|---|---|---|---|
org |
str |
'' |
The tenant (first element of the identity tuple). |
namespace |
str |
'' |
The namespace the op reads or writes. |
agent |
str |
'-' |
The writing or reading agent; '-' or '*' means any agent where the op allows it. |
user_id |
str |
'-' |
The end user the row belongs to; '-' for none. |
consumer |
str |
'' |
trace attribution: which integration is calling (clickgap|claude-code|…) |
batch_id |
str |
required | The staging tables key on a UUID column: a malformed id is refused here, not by the insert. |
seq |
int |
required | This part's position in the batch, 0-based (0 <= seq < total_parts). |
total_parts |
int |
required | How many parts the batch has; capped by code_scip_max_parts. |
commit_sha |
str |
'' |
The commit the index was built at; once applied it becomes the producer's tier watermark. |
base_sha |
str |
'' |
The commit the delta was computed from; recorded on the batch row. |
producer |
str |
'' |
The indexer that built the delta (scip-clang, scip-python, scip-typescript, scip-go); it picks the watermark key the batch advances, '' = the C++ key scip_commit. |
payload |
str |
required | one part of the JSON-encoded ScipDelta |
entry_lease_holder |
str |
'' |
The holder of the entry's lease the delta was built under (loom code entry-lock hands it to its command); when set, the part is refused unless that holder still holds the lease. '' = unfenced (CI pushes). |
| Output field | Type | Meaning |
|---|---|---|
batch_id |
str |
The batch this part was stored under, as sent. |
parts_received |
int |
Distinct parts of the batch stored so far. |
total_parts |
int |
The batch's part count, as sent. |
complete |
bool |
True once every part is stored; the apply worker then picks the batch up. |
code.scip_status
Report the progress of a SCIP upload batch: parts received and apply status.
POST /v1/code.scip_status · MCP loom_code_scip_status · role viewer · read · not listed under the MCP all toolset
| Input field | Type | Default | Meaning |
|---|---|---|---|
org |
str |
'' |
The tenant (first element of the identity tuple). |
namespace |
str |
'' |
The namespace the op reads or writes. |
agent |
str |
'-' |
The writing or reading agent; '-' or '*' means any agent where the op allows it. |
user_id |
str |
'-' |
The end user the row belongs to; '-' for none. |
consumer |
str |
'' |
trace attribution: which integration is calling (clickgap|claude-code|…) |
batch_id |
str |
required | The UUID the parts were uploaded under. |
| Output field | Type | Meaning |
|---|---|---|
batch_id |
str |
The batch asked about. |
status |
str |
pending | applied | failed |
parts_received |
int |
Distinct parts of the batch stored so far. |
total_parts |
int |
The batch's part count, as uploaded. |
error |
str |
Why the apply failed (exception type and message); '' unless status is failed. |
commit_sha |
str |
The commit the batch was built at. |
applied_at |
str |
When the apply worker applied the batch; '' until then. |
code.search
Search the shared code index of this repository (fresh to the last merged PR).
POST /v1/code.search · MCP loom_code_search · role viewer · read
| Input field | Type | Default | Meaning |
|---|---|---|---|
org |
str |
'' |
The tenant (first element of the identity tuple). |
namespace |
str |
'' |
The namespace the op reads or writes. |
agent |
str |
'-' |
The writing or reading agent; '-' or '*' means any agent where the op allows it. |
user_id |
str |
'-' |
The end user the row belongs to; '-' for none. |
consumer |
str |
'' |
trace attribution: which integration is calling (clickgap|claude-code|…) |
query |
str |
required | The question, identifier or phrase to search for; a symbol-shaped query tries the symbol table first (route says which path answered). |
top_k |
int |
5 |
At most this many results per page (1-25). |
token_budget |
int \| None |
None |
Response budget in tokens; results are whole units, overflow elides. |
path_prefix |
str |
'' |
Keep only units whose path starts with this prefix; "" = the whole namespace. |
cursor |
str |
'' |
Continuation: the next_cursor of an earlier response to this query. |
exclude_unit_ids |
list[str] |
(computed) | The caller's seen-set: unit ids not to serve again. |
rerank |
str |
'' |
Reranker over the fused pool: "" = the deployment default (LOOM_CODE_SEARCH_RERANK_DEFAULT, for prose questions of its kinds), "none" = off for this request, "builtin:openai" / "builtin:cohere", or the name of an endpoint in… |
expand |
bool |
False |
Vocabulary bridge: one LLM hop proposes codebase identifiers for the lexical leg (natural-language wording often misses the implementing subsystem's vocabulary). |
annotate |
bool |
True |
Risk annotations + one-hop callee context per result (churn/amp/tested/ callees on each unit). |
bodies |
Literal['auto', 'none'] \| None |
None |
"auto" (default): granularity scales with budget-per-slot — cards when the budget can't fit any body (~<200 tok/slot), whole units in the normal range, and top hits expand toward their WHOLE FILE when the budget is generous. "none": cards… |
kind_prior |
Literal['off', 'default', 'flat', 'structural'] \| None |
None |
Chunk-kind prior override for A/B: None = the served "flat" table; "default" / "flat" pick a table, "structural" applies only the phrasing rule, "off" disables. |
pr_leg_before |
datetime \| None |
None |
Only PRs merged strictly before this instant may vote — the time-travel pin a bench mined from merged PRs needs so the fix PR cannot vote for its own files. |
embedding_model |
str |
'' |
Bench-only override of the embedding_model label the legs read: "" = the deployment embedder's model name. |
fresh |
bool |
False |
true = bypass the served-response memo and compute. |
min_fan_in |
int |
0 |
Symbol fan-in (loom.code_symbol_stats, weekly). |
sort_by |
Literal['score', 'fan_in'] |
'score' |
"score" = ranked relevance order; "fan_in" = order the pool by fan_in, most-called first. |
pattern |
str |
'' |
Constrained search: a literal (default) or RE2 regex that every returned chunk must contain — applied to BOTH legs' pools before ranking, so one call replaces grep-then-search. |
regex |
bool |
False |
true = pattern is an RE2 regex (an invalid one is a 422); false = a literal substring. |
case_sensitive |
bool |
False |
true = pattern matches case-sensitively; false (default) ignores case. |
path_globs |
list[str] |
(computed) | Indexed-route file filters, rg -g / -t style: keep paths matching any glob (*.cpp, src/Parsers/), drop paths matching any exclude, restrict to a language's extension set (cpp, python, sql, ...). |
exclude_globs |
list[str] |
(computed) | Drop paths matching any of these globs (same syntax as path_globs); at most 8. |
langs |
list[str] |
(computed) | Keep only files of these languages by extension (cpp, c, python/py, js, ts, go, rust, java, sql, md, ...); an unknown name is a 422 listing the known ones. |
legs |
Literal['hybrid', 'lexical', 'vector'] \| None |
None |
Leg ablation for A/B: None/"hybrid" = both legs; "lexical" skips the vector leg AND the embedding call; "vector" skips the lexical leg. |
track_path |
str |
'' |
Developer diagnostic, not exposed to the shunt: the path of the file the caller EXPECTED to see. |
vector_model |
str |
'' |
Second vector model: the spec of an embedder the deployment lists in LOOM_CODE_SEARCH_VECTOR_MODELS. |
vector_shortlist |
int \| None |
None |
With vector_model set: > 0 = the second model shortlists this many chunk ids and the served model's vectors rescore them exactly; 0 = the second model's own distances rank the pool; None = the deployment's code_search_vector_shortlist. |
llm_legs |
Literal['auto', 'none'] \| None |
None |
none skips the model-backed legs — HyDE (an LLM passage, a second embed and a full scan) and a model-named concept source; auto (None = the deployment default, LOOM_CODE_SEARCH_LLM_LEGS_DEFAULT) runs what the deployment configures. |
deadline_ms |
int \| None |
None |
The request's wall-clock budget in ms, from arrival (values under 200 read as 200). |
namespaces |
list[str] |
(computed) | Several namespaces at once: the single-namespace search runs once per entry, concurrently, and the rankings are interleaved by RANK in this order — scores are not comparable across namespaces (the lexical idf is per namespace). |
| Output field | Type | Meaning |
|---|---|---|
results |
list[CodeUnit] |
The ranked units served on this page, cut to top_k and the token budget; empty on an abstain with no pool or a not-covered path. |
route |
str |
symbol_exact | hybrid | symbol_miss_hybrid |
next_cursor |
str |
Continuation: opaque cursor for the next page of the ranked pool, "" when nothing ranked remains past this page (symbol routes issue none). has_more mirrors it. |
has_more |
bool |
true when next_cursor is set, i.e. more ranked results remain past this page. |
history |
dict[str, Any] |
History section: {intent: number|phrase, numbers, items: [{number, kind, state, title, ...}], prs: [{pr_number, title, author, merged_at, files, files_total, role}], anchored: [{path, placed}], tokens}. |
abstain |
bool |
true = the server does not stand behind these results (they may still be listed); abstain_code says why. |
abstain_code |
Literal['', 'no_match', 'below_threshold', 'low_calibrated_confidence', 'not_covered', 'pattern_too_broad', 'identifier_absent', 'off_domain'] |
Why it abstained: no_match (nothing survived) | below_threshold (top cosine under the abstain threshold) | low_calibrated_confidence | not_covered (path outside the index) | pattern_too_broad | identifier_absent (no file names it) |… |
abstain_reason |
str |
Human-readable reason for the abstain, with what to do instead; "" when not abstaining. |
retrieval_risk |
Literal['low', 'medium', 'high', 'abstain'] |
Calibrated risk band from retrieval_confidence: low (>= 0.75), medium (>= 0.55), high, or abstain (below the abstain cut-off or the top cosine under its threshold). |
retrieval_confidence |
float |
Calibrated confidence 0-1 from the top similarity, its margin over the second hit, route_agreement and the pool size; 0.0 on an abstain with no results. |
route_agreement |
float |
Share (0-1) of the retrieval routes that ran and agreed: the primary hit, lexical and vector legs sharing a top-10 chunk, a fuzzy-symbol hit; 1.0 on an exact symbol hit. |
calibration_explanation |
str |
The calibration inputs as text (top_similarity, margin, route_agreement, ...), plus the legs the answer ranked without past the deadline. |
tokens_returned |
int |
Estimated tokens of the served page (results, history section and annotations). |
constrained |
bool |
Constrained search: true when a pattern / path filter narrowed the pool; matched_files is the pre-count of files the constraint admits (0 when unconstrained or not counted). |
matched_files |
int |
How many files the pattern / path constraint admits; 0 when unconstrained or not counted. |
as_of |
dict[str, Any] |
Provenance + freshness: branch, commit, indexed_at, lag_commits (int, -1 unknown), stale (bool: lag > LOOM_CODE_STALE_AFTER_COMMITS). |
score_explanation |
str |
How the answer was reached as text: fusion kind and leg row counts, legs agreement, the constraint and matched_files, priors and history votes that applied. |
retrieval_work |
dict[str, int \| str] |
Counters per stage, plus risk_source — "table" | "live" | "mixed": where the served risk block came from when the precomputed table is on. |
trace_run_id |
str |
Id of the loom.code_search_trace row the server writes for this call. |
top_similarity |
float |
Raw cosine of the top vector-leg hit (0.0 when the vector leg did not run or the route was symbol_exact). |
tracked |
dict[str, Any] |
track_path diagnostic: {path, verdict, chunks, pool, best: {chunk_id, scope, start_line, lexical_rank, vector_rank, lex_score, distance, served_rank}, lexical_floor, vector_ceiling}. |
fanout |
dict[str, Any] |
Fan-out disclosure: {namespaces, interleave: "rank", timeout_ms, per_namespace: {ns: {ms, results, abstain, route, commit, trace_run_id}}, dropped: [ns...]}. |
note |
str |
e.g. "lexical only until embeddings finish (41% embedded)" while the namespace's vector leg covers less than LOOM_CODE_READY_EMBED_COVERAGE of its chunks (a first index still embedding, a backfill without --embed); "" otherwise. |
legs_timed_out |
list[str] |
The legs the deadline (or the model-leg grace) dropped — their rows are not in the ranking — and epistemic "partial" then, or when a content leg failed (retrieval_work names it). |
epistemic |
Literal['', 'partial'] |
"partial" when a leg timed out or a content leg failed; off the wire otherwise. |
partial |
bool |
deadline_ms cut something (a leg, rerank, a late stage): the page is the best found in the budget, and partial_reason names what did not finish. |
partial_reason |
str |
What the deadline cut, as deadline N ms: <stage>; <stage>; off the wire otherwise. |
code.setting_facts
One ClickHouse setting, the four places that define it: its declaration and tier (production / important / beta / experimental / obsolete), every default change with the release it shipped in…
POST /v1/code.setting_facts · MCP loom_code_setting_facts · role viewer · read · not listed under the MCP all toolset
| Input field | Type | Default | Meaning |
|---|---|---|---|
org |
str |
'' |
The tenant (first element of the identity tuple). |
namespace |
str |
'' |
The namespace the op reads or writes. |
agent |
str |
'-' |
The writing or reading agent; '-' or '*' means any agent where the op allows it. |
user_id |
str |
'-' |
The end user the row belongs to; '-' for none. |
consumer |
str |
'' |
trace attribution: which integration is calling (clickgap|claude-code|…) |
name |
str |
required | The setting name as declared (max_threads); a name that cannot be a setting answers not_a_setting. |
history_limit |
int |
10 |
At most this many default changes in history, newest release first (1..50). |
| Output field | Type | Meaning |
|---|---|---|
name |
str |
The setting asked about, trimmed. |
verdict |
str |
known | not_a_setting | unknown |
causes |
list[str] |
control_failed | no_declaration | invalid_name | history_unread |
declaration |
dict[str, Any] |
{file, line, type, default, description, tier, alias} |
tier |
str |
The declaration's tier (production | important | beta | experimental | obsolete); '' without a declaration. |
history |
list[dict[str, Any]] |
[{version, old, new, reason, line}], newest release first |
randomized_in_ci |
dict[str, Any] |
{randomized, file, line, sampler, randomizer} |
tests_total |
int |
test files under tests/ whose chunks name the setting (a floor) |
control |
dict[str, Any] |
{setting, ok}: the positive control this call ran; ok=False ⇒ unknown |
trace_run_id |
str |
Id of this call's trace row ('' for an invalid name); pass it to code.outcome. |
code.symbol
Exact symbol lookup: definition, signature, doc comment, and body of a function/class/enum by (qualified) name — compiler-grade where available (tier='scip'), resolved across C++ overloads…
POST /v1/code.symbol · MCP loom_code_symbol · role viewer · read
| Input field | Type | Default | Meaning |
|---|---|---|---|
org |
str |
'' |
The tenant (first element of the identity tuple). |
namespace |
str |
'' |
The namespace the op reads or writes. |
agent |
str |
'-' |
The writing or reading agent; '-' or '*' means any agent where the op allows it. |
user_id |
str |
'-' |
The end user the row belongs to; '-' for none. |
consumer |
str |
'' |
trace attribution: which integration is calling (clickgap|claude-code|…) |
name |
str |
'' |
bare, qualified, or partially qualified name — or path:line ("src/Foo.cpp:123"), which resolves to the innermost function containing that line: a grep hit or review comment becomes the whole function in one call. |
symbol_id |
str |
'' |
An index symbol id (a definition's unit_id, an edge's *_symbol_id); when set it wins over name and resolves exactly that definition. |
include_body |
bool |
True |
Read each definition's body; a 200+ line class ships its skeleton plus member outline instead. |
include_history |
bool |
True |
Attach recent_prs (merged PRs over the definitions' paths) to the first definition. |
include_examples |
bool |
True |
Attach examples (call sites that use the symbol) to the first definition. |
include_lessons |
bool |
True |
Attach lessons to the first definition: the memories linked to the symbol from lesson_namespaces (over MCP the caller's memory home by default) and the repository's team namespace, each with its code_state (fresh, moved, or… |
lesson_namespaces |
list[str] |
(computed) | The memory namespaces whose linked memories lessons reads besides the repository's team rules (over MCP the caller's memory home by default); one the caller cannot read is skipped. |
token_budget |
int |
2500 |
Estimated-token budget for the answer; definitions past it are served elided (signature, doc, pointer), and the uses_brief block is paid out of it first. |
min_fan_in |
int |
0 |
Definitions carry fan_in when the weekly stats are enabled; min_fan_in drops the rest, sort_by='fan_in' puts the most-called definition of an overloaded/ambiguous name first. |
sort_by |
Literal['score', 'fan_in'] |
'score' |
score keeps the resolver's order; fan_in puts the most-called definition first. |
uses |
bool \| None |
None |
uses=true returns the definition AND the lines that mention its bare name — what a separate code.grep on the name would return, read beside the definition from the same chunk index — minus the definition's own span(s). |
uses_limit |
int |
50 |
At most this many uses lines (1–200) when uses is true. |
uses_brief |
bool |
False |
Serve the compact uses block when the lookup resolves to one definition; ignored when uses is true. |
near_paths |
list[str] |
(computed) | When several definitions match, rank them by the change at hand — the files in near_paths (<= 20) or the merged PR's file list for pr_number from the ledger: same file, same directory, co-change in code_pr_history, then path distance. |
pr_number |
int |
0 |
A merged PR whose file list (from the PR ledger) ranks several matching definitions; 0 = no PR ranking. |
namespaces |
list[str] |
(computed) | Presence on several namespaces: presence: true runs the resolve once per entry of namespaces (at most 8; namespace, when set and absent, leads the list; unset list = the addressed namespace alone), concurrently under… |
presence |
bool |
False |
Answer per namespace in namespaces whether the definition is there (the presence / summary blocks) instead of returning definitions. |
neighbours |
bool \| None |
None |
The neighbours graph block for the resolved definitions themselves — k callers, callees, tests and citing documents per definition, in the same call. |
neighbour_k |
int |
5 |
How many callers, callees, tests and citing documents (each) the neighbours block lists per definition. |
| Output field | Type | Meaning |
|---|---|---|
definitions |
list[CodeUnit] |
The resolved definitions (at most 10), fitted to token_budget; empty when nothing resolved (see candidates) or on a presence answer. |
ambiguous |
bool |
True when the served definitions carry more than one distinct name/signature pair. |
hierarchy |
dict[str, list[dict[str, Any]]] |
For a class / interface / enum definition, its type hierarchy from the inherits edges of both tiers, folded by qualified name: {"supertypes": [...], "subtypes": [...]} of {symbol, kind, via (extends | implements), tier, confidence, path… |
candidates |
list[dict[str, Any]] |
When nothing resolved: cheap fuzzy candidates (names + paths only). |
tokens_returned |
int |
Estimated tokens of the answer: definitions, uses, cited documents, neighbours and hierarchy blocks together. |
trace_run_id |
str |
Id of this call's trace row; pass it to code.outcome. |
uses |
list[dict[str, Any]] \| dict[str, Any] |
uses=true: {path, line, text, scope, scope_start_line, scope_end_line, kind} per line mentioning the symbol's bare name, path/line ordered, the definition span(s) excluded. |
uses_truncated |
bool |
True when the uses list stopped at uses_limit. |
uses_tokens |
int |
Estimated tokens the compact uses block cost out of token_budget. |
picked_by |
str |
Which context key ranked the definitions when near_paths / pr_number was given — same_file | same_dir | co_change | path_distance | none. "" and off the wire when no context was given. |
resolved_by |
str |
anonymous_namespace | tail when an over-qualified name bound through symbol-form tolerance; "" and off the wire otherwise. |
documented_in |
list[dict[str, Any]] |
The document sections that cite the definition (the Markdown lane's reads edges) — section qualified name, path, line; at most five distinct sections, first by confidence. |
neighbours |
list[dict[str, Any]] |
The neighbours graph block on the definitions (one entry per definition anchor); empty unless neighbours ran. |
anchors |
int |
How many definitions the neighbours block was built for; 0 when it is off. |
neighbour_tokens |
int |
Estimated tokens the neighbours block cost (counted in tokens_returned). |
presence |
list[dict[str, Any]] |
presence=true: one row per requested namespace, in request order — {namespace, verdict: present | absent | unknown, path, start_line, end_line, tier, indexed_commit, index_status, ms, reason, definitions}. |
summary |
dict[str, list[str]] |
Presence summary: {present, absent, unknown} lists of namespaces; also filled from the entry's depends_on namespaces when the name is not defined here. |
code.symbol_history
The regression history of one function: the merged PRs that touched it (with linked issues, reverts, inline review comments inside its span), and — through the tracker namespace bound to this code…
POST /v1/code.symbol_history · MCP loom_code_symbol_history · role viewer · read · not listed under the MCP all toolset
| Input field | Type | Default | Meaning |
|---|---|---|---|
org |
str |
'' |
The tenant (first element of the identity tuple). |
namespace |
str |
'' |
The namespace the op reads or writes. |
agent |
str |
'-' |
The writing or reading agent; '-' or '*' means any agent where the op allows it. |
user_id |
str |
'-' |
The end user the row belongs to; '-' for none. |
consumer |
str |
'' |
trace attribution: which integration is calling (clickgap|claude-code|…) |
name |
str |
'' |
A qualified symbol name or path:line. |
symbol_id |
str |
'' |
An index symbol id; wins over name. |
limit |
int |
15 |
At most this many PR rows (1–60). |
| Output field | Type | Meaning |
|---|---|---|
verdict |
str |
history | no_history | unknown |
causes |
list[str] |
symbol_unresolved | symbol_ambiguous | tracker_unavailable |
epistemic |
str |
Always lower_bound: the PRs are those the ledger holds over the definition's file. |
symbol |
dict[str, Any] |
{qualified_name, path, start_line, end_line, tier} |
ambiguous |
bool |
As on code.callers: the name resolved to several distinct definitions; no history was read, candidates are their qualified names (qualify the name or pass symbol_id). |
candidates |
list[str] |
With ambiguous: up to 20 qualified names to pick from. |
prs |
list[dict[str, Any]] |
newest first: {pr_number, title, author, merged_at, is_revert, is_fix, touches_symbol true|named|false|unknown, linked_issues[{number,title,state}], comments_on_symbol, qa{has_test, ci_result, first_release, caused[], names[]}} |
review_comments |
list[dict[str, Any]] |
inline review comments inside the symbol's span, newest first (≤5) |
open_issues_naming |
list[dict[str, Any]] |
open issues whose text names the function (QA), most severe first (≤5) |
summary |
dict[str, Any] |
{prs_total, named_prs, fix_prs, named_fix_prs, reverts, caused_issues[], open_issues_naming, last_touched, oldest_in_window, authors[], note} |
tracker_namespace |
str |
The tracker namespace that answered the QA side; "" when none is bound or its read failed. |
tracker_unavailable |
bool |
True when a tracker is bound but its read failed. |
trace_run_id |
str |
Id of this call's trace row; pass it to code.outcome. |
code.test_gate
The pre-PR question in one call: for THIS change, which tests must run, and which touched code no test reaches.
POST /v1/code.test_gate · MCP loom_code_test_gate · role viewer · read · not listed under the MCP all toolset
| Input field | Type | Default | Meaning |
|---|---|---|---|
org |
str |
'' |
The tenant (first element of the identity tuple). |
namespace |
str |
'' |
The namespace the op reads or writes. |
agent |
str |
'-' |
The writing or reading agent; '-' or '*' means any agent where the op allows it. |
user_id |
str |
'-' |
The end user the row belongs to; '-' for none. |
consumer |
str |
'' |
trace attribution: which integration is calling (clickgap|claude-code|…) |
files |
list[str] |
(computed) | Changed file paths; a test file here is itself a test to run. |
diff |
str |
'' |
A unified diff; its hunks (line spans, hunk-header names) pick the touched functions. |
depth |
int |
2 |
Reverse-edge hops to look for tests through. |
limit |
int |
30 |
At most this many rows in each of tests and untested (at most 200). |
| Output field | Type | Meaning |
|---|---|---|
tests |
list[dict[str, Any]] |
{test_path, why, evidence, run, run_unknown, [src_path], [confidence], [hop]} why in {changed_test, stem_partner, test_map, graph_hop}, strongest first. |
untested |
list[dict[str, Any]] |
Touched source symbols no test reaches by any evidence class: {qualified_name, path, start_line}. |
changed_files |
list[str] |
The change as the gate saw it. |
touched_symbols |
list[dict[str, Any]] |
The source symbols the change touches, {qualified_name, path, start_line, tier}, by path and line (first 200). |
obligations |
bool |
True while either list is non-empty: run the tests, then rely on green; write a test for (or explain) the untested rows. |
tests_total |
int |
Rows of tests before limit. |
untested_total |
int |
Rows of untested before limit. |
tests_capped |
bool |
True when limit cut tests short of tests_total. |
untested_capped |
bool |
True when limit cut untested short of untested_total. |
counts_floor |
bool |
Same epistemic contract as code.callers: the graph is a floor, so "no test reaches this" means none the index can see. |
epistemic |
str |
Epistemic envelope, as on code.callers: "exact" when the compiler tier covers every seed file, no call site named like a seed was declined, and no override seed lacks its base; otherwise "lower_bound" with causes from {unresolved_calls… |
causes |
list[str] |
Why epistemic is lower_bound (values above); [] when it is exact. |
by_hop_counts |
dict[int, int] |
Distinct symbols reached per hop BEFORE any slicing: {1: n, 2: m}. |
trace_run_id |
str |
Id of this call's row in loom.code_search_trace. |
code.test_home
Where does a new test case belong?
POST /v1/code.test_home · MCP loom_code_test_home · role viewer · read · not listed under the MCP all toolset
| Input field | Type | Default | Meaning |
|---|---|---|---|
org |
str |
'' |
The tenant (first element of the identity tuple). |
namespace |
str |
'' |
The namespace the op reads or writes. |
agent |
str |
'-' |
The writing or reading agent; '-' or '*' means any agent where the op allows it. |
user_id |
str |
'-' |
The end user the row belongs to; '-' for none. |
consumer |
str |
'' |
trace attribution: which integration is calling (clickgap|claude-code|…) |
file_stems |
list[str] |
(computed) | Source file stems the change affects (a path or extension is stripped); matched in test content and against indexed source paths. |
settings |
list[str] |
(computed) | Setting names the test uses (lower snake_case); others are dropped. |
engine |
str |
'' |
The engine class (MergeTree; parameters stripped), matched as ENGINE = <name>. |
symbols |
list[str] |
(computed) | Symbols the test exercises; the part after the last :: is what is matched. |
limit |
int |
10 |
At most this many candidates (at most 50). |
| Output field | Type | Meaning |
|---|---|---|
verdict |
str |
add_case_to | new_file_justified | unknown |
home |
str |
The top candidate's path when the verdict is add_case_to; '' otherwise. |
candidates |
list[dict[str, Any]] |
{path, matched: ["setting:x", "engine:MergeTree", …], map_confidence, score, reference: the candidate's indexed expectation file or null} |
parts |
list[str] |
The fingerprint as normalized, kind:value per part (stem, setting, engine, symbol). |
src_paths |
list[str] |
Indexed source files whose stem is one of file_stems (first 20). |
next_free_stateless_number |
int |
The highest stateless test number in the index plus one; 0 when none was found. |
control |
dict[str, Any] |
{symbol, ok}: the positive control this call ran; ok=False ⇒ unknown |
trace_run_id |
str |
Id of this call's row in loom.code_search_trace. |
code.tests_for
Which stateless tests carry EVERY named facet: the tests that SET a setting, call a function, create an ENGINE, read a system.* table, use a FORMAT, carry a -- Tags: tag, or expect an error…
POST /v1/code.tests_for · MCP loom_code_tests_for · role viewer · read · not listed under the MCP all toolset
| Input field | Type | Default | Meaning |
|---|---|---|---|
org |
str |
'' |
The tenant (first element of the identity tuple). |
namespace |
str |
'' |
The namespace the op reads or writes. |
agent |
str |
'-' |
The writing or reading agent; '-' or '*' means any agent where the op allows it. |
user_id |
str |
'-' |
The end user the row belongs to; '-' for none. |
consumer |
str |
'' |
trace attribution: which integration is calling (clickgap|claude-code|…) |
facets |
list[dict[str, str]] |
required | {kind, name} per facet (kinds above; an unknown kind or an empty name is refused); duplicates are dropped. |
limit |
int |
50 |
At most this many tests rows (at most 500). |
closest |
bool |
False |
closest: true answers "the existing test most like this one" instead of "the tests carrying every facet": candidates share at least one facet and rank by a weighted per-kind Jaccard over their whole facet sets; each row carries… |
| Output field | Type | Meaning |
|---|---|---|
tests |
list[dict[str, Any]] |
{path, ordinals, lines, confidence, same_statement}, keyword-bound matches (confidence 1.0) before call-shaped ones (0.8), then by path; with closest: {path, similarity, shared, missing, extra_facets} by similarity descending. |
total |
int |
matching tests before limit |
truncated |
bool |
True when total exceeds the rows returned. |
facets |
list[dict[str, str]] |
as resolved |
verdict |
str |
'' when rows were returned; no_match when the namespace holds facet rows of every asked kind but none carry these names (an answer); not_covered when some asked kind has no row in the namespace at all (its lanes never wrote that kind… |
abstain |
bool |
True only for not_covered (the index cannot answer; grep instead). |
uncovered_kinds |
list[str] |
the kinds behind not_covered |
as_of |
dict[str, Any] |
Provenance + freshness: branch, commit, indexed_at, lag_commits (int, -1 unknown), stale (bool: lag > LOOM_CODE_STALE_AFTER_COMMITS), status. |
tokens_returned |
int |
Estimated tokens of the returned paths (about 4 characters per token). |
took_ms |
int |
Server time spent on the call, in milliseconds. |
trace_run_id |
str |
Id of this call's row in loom.code_search_trace. |
code.trace
Paste a stack trace / backtrace; get each frame resolved to its definition in one call — the incident-workflow entry point.
POST /v1/code.trace · MCP loom_code_trace · role viewer · read
| Input field | Type | Default | Meaning |
|---|---|---|---|
org |
str |
'' |
The tenant (first element of the identity tuple). |
namespace |
str |
'' |
The namespace the op reads or writes. |
agent |
str |
'-' |
The writing or reading agent; '-' or '*' means any agent where the op allows it. |
user_id |
str |
'-' |
The end user the row belongs to; '-' for none. |
consumer |
str |
'' |
trace attribution: which integration is calling (clickgap|claude-code|…) |
trace |
str |
required | The stack trace or backtrace text; qualified a::b names and C/C++ dir/file.cpp:N locations are read as frames (std::, boost::, absl::, __* frames skipped). |
max_frames |
int |
15 |
Resolve at most this many distinct frames, in trace order (1..40). |
token_budget |
int |
3000 |
Token budget for definitions (200..12000); units past it are dropped. |
| Output field | Type | Meaning |
|---|---|---|
frames |
list[dict[str, Any]] |
One entry per recognized frame, trace order: {frame, qualified_name, path, line, symbol_id, resolved}. |
definitions |
list[CodeUnit] |
The resolved definitions, whole units within token_budget. |
tokens_returned |
int |
Estimated tokens of definitions. |
trace_run_id |
str |
Id of this call's trace row; pass it to code.outcome. |
code.verify
Verify one closed-form claim against the index and return a three-valued verdict.
POST /v1/code.verify · MCP loom_code_verify · role viewer · read
| Input field | Type | Default | Meaning |
|---|---|---|---|
org |
str |
'' |
The tenant (first element of the identity tuple). |
namespace |
str |
'' |
The namespace the op reads or writes. |
agent |
str |
'-' |
The writing or reading agent; '-' or '*' means any agent where the op allows it. |
user_id |
str |
'-' |
The end user the row belongs to; '-' for none. |
consumer |
str |
'' |
trace attribution: which integration is calling (clickgap|claude-code|…) |
kind |
Literal['calls', 'unused', 'defines', 'contains', 'reaches'] |
required | The claim's shape: calls | unused | defines | contains | reaches (see above). |
subject |
str |
required | What the claim is about: a symbol name, or a repo-relative path for defines/contains. |
object |
str |
'' |
The claim's other end: a symbol, a literal (contains) or a path prefix (reaches); '' for unused. |
depth |
int |
4 |
For calls and reaches: the most call hops the walk follows (1..6). |
| Output field | Type | Meaning |
|---|---|---|
verdict |
Literal['confirmed', 'refuted', 'not_established'] |
A subject or object that resolves no symbol is a RESOURCE_NOT_FOUND refusal, not a verdict; its detail carries role (subject | object) and did_you_mean, up to 5 of code.symbol's near misses {qualified_name, path, kind, tier… |
reason |
str |
Machine-readable cause, stable for bots to branch on. |
explanation |
str |
A human-readable account of how the verdict was reached. |
evidence |
list[dict[str, Any]] |
Positive rows behind the verdict: edges (a call chain, in order), symbol rows, or content excerpts — shape depends on kind. |
floors |
dict[str, Any] |
Why refutation was unavailable when the verdict is not_established: what was searched, how far, and which blind spots apply. |
index_verdict |
str |
The index's own verdict behind a not_established claim ('' otherwise). |
trace_run_id |
str |
Id of this call's trace row; pass it to code.outcome. |
code.verify_citations
Every citation a draft carries, resolved against the index before the draft is posted somewhere public and irreversible.
POST /v1/code.verify_citations · MCP loom_code_verify_citations · role viewer · read · not listed under the MCP all toolset
| Input field | Type | Default | Meaning |
|---|---|---|---|
pr_files |
dict[str, str] |
(computed) | Repo-relative path -> the file's full text at the PR's head, for the files the PR adds or modifies (at most 50, 1,000,000 characters each). |
pr_diff |
str |
'' |
The PR's unified diff against its merge-base (at most 1,500,000 characters): its hunks say which functions the PR modifies, and its paths name the files it deletes. |
pr_head_sha |
str |
'' |
The PR's head and base commits as the caller knows them; they label the answer (overlay_head_sha) and never reach git. '' = derived from the text. |
pr_base_sha |
str |
'' |
|
org |
str |
'' |
The tenant (first element of the identity tuple). |
namespace |
str |
'' |
The namespace the op reads or writes. |
agent |
str |
'-' |
The writing or reading agent; '-' or '*' means any agent where the op allows it. |
user_id |
str |
'-' |
The end user the row belongs to; '-' for none. |
consumer |
str |
'' |
trace attribution: which integration is calling (clickgap|claude-code|…) |
text |
str |
required | The draft to check: a review comment, PR body or answer, as plain text or Markdown. |
at_commit |
str |
'' |
The commit the draft was written against; '' = check against the index head only (or the PR's merge commit with pr_number). |
pr_number |
int |
0 |
The reviewed PR; 0 = no PR-diff leg |
base_namespace |
str |
'' |
Namespace read after the addressed one for citations it did not resolve; '' = the mirror's default-branch entry when the addressed one is a release branch. |
limit |
int |
200 |
citations verified per call, first-appearance order; the rest are counted in truncated |
| Output field | Type | Meaning |
|---|---|---|
verdict |
str |
all_resolved | has_unresolved | has_stale | no_citations. |
counts |
dict[str, int] |
total, resolved, unresolved, stale, ambiguous, kind_ |
citations |
list[dict[str, Any]] |
one per distinct citation, first-appearance order: {kind, text, verdict, reason, epistemic, occurrences, path?, start_line?, end_line?, number?, name?, rev?, form?, in_pr_diff?, in_code_block?, target?, candidates?}. form: basename |… |
skipped |
list[dict[str, Any]] |
names not verified because their outermost scope is an external library (std::, boost::, …): |
truncated |
bool |
True when the draft held more distinct citations than limit; the rest are unchecked. |
epistemic |
dict[str, str] |
per check: path / number / name / commit -> exact; line -> lower_bound |
at_commit |
dict[str, Any] |
{requested, sha, known, calls, capped, ms, error} — the mirror leg |
pr_diff |
dict[str, Any] |
only with pr_number: |
namespaces |
list[str] |
The namespaces read, in order: the addressed one, then the base one if any. |
took_ms |
int |
Server-side wall time of the call, in milliseconds. |
as_of |
dict[str, Any] |
Provenance + freshness: branch, commit, indexed_at, lag_commits (int, -1 unknown), stale (bool: lag > LOOM_CODE_STALE_AFTER_COMMITS). |
note |
str |
How far the checks can be trusted, plus why a leg was cut (unknown commit, capped mirror leg, PR not found, truncated citations). |
trace_run_id |
str |
Id of this call's trace row; pass it to code.outcome. |