Skip to content

run operations

The exact fields each run.* 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.

run.begin

Open a RUN — one execution of a task — BEFORE you start working on it.

POST /v1/run.begin · MCP loom_run_begin · role writer · 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.
agent str required 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.
session_id str '-' The conversation this run belongs to.
run_id str '' The run's id; empty or "-" = the server mints one.
goal str required What the run sets out to do, in the agent's words; stored on the run row.
user_request str '' The original request that started the run, verbatim; empty when not given.
expected_outcome str '' What a successful run should produce; stored for later review, empty when not given.
environment str '' Free-text label of where the run executes (e.g. ci, local); stored as given.
model str '' The model the agent runs on; stored as given, empty when not given.
consumer str '' The calling integration's tag, recorded on the ledger row.
role str '' The agent's role in a multi-agent run — planner, executor, critic, or the team's own word.
metadata dict[str, Any] (computed) Free-form key/values stored on the run; role, when set, is added to it.
budget_usd float 0.0 Model spend in USD the run may reach; needs a session_id (0 = none, kept on a re-sent begin of the same run_id).
budget_seconds int 0 Seconds the run may take (0 = none, kept on a re-sent begin of the same run_id).
Output field Type Meaning
run_id str The agent run (task scope) the call belongs to; '-' for none.
status Literal['active', 'completed', 'failed', 'cancelled'] Always active for a run just opened.
started_at str When the run started, ISO UTC with a Z; a re-sent run_id keeps the first start.
next str Protocol nudge: what to do with the run_id.

run.complete

Close a run opened with run.begin — call EXACTLY ONCE when the task ends.

POST /v1/run.complete · MCP loom_run_complete · role writer · 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.
user_id str '-' The run's user and conversation, as run.begin took them: a token narrowed to one session resolves its scope from these, and completes only its own run.
session_id str '-' The session or conversation the row belongs to; '-' for none.
run_id str required The agent run (task scope) the call belongs to; '-' for none.
status Literal['completed', 'failed', 'cancelled'] required How the run ended: completed, failed or cancelled; also picks the default outcome.
final_response str '' The agent's final answer; stored on the run row.
confidence float 0.0 The agent's confidence in the result (0–1), stored on the run; 0 records the session outcome label at full confidence.
memories_used list[str] (computed) memory_keys the agent actually relied on (a subset of what it recalled).
recalled_keys list[str] (computed) The memory keys the session's Loom tools SERVED (the plugin's PostToolUse hook stashes them from loom_search / memory.get results and hands them over at SessionEnd).
outcome Literal['', 'positive', 'negative', 'none'] '' Outcome applied to memories_used. "" derives from status: completed → positive, failed → negative, cancelled → none.
weight int 1 Event count each usage, evidence or harm event for memories_used carries (1–100).
duration_ms int 0 Wall-clock override; 0 = computed from started_at.
metadata dict[str, Any] (computed) Key/values merged into the run's stored metadata; keys given here win.
reflection RunReflection \| None None Optional process learning, written as a reflection memory (see RunReflection).
retain Literal['', 'keep', 'demote', 'expire'] '' What happens to the rows this run wrote. '' = the server default (settings.memory_run_complete_retain, keep).
Output field Type Meaning
run_id str The agent run (task scope) the call belongs to; '-' for none.
status Literal['active', 'completed', 'failed', 'cancelled'] The status the run was closed with.
duration_ms int Run length in milliseconds: duration_ms from the call, else now minus started_at.
used_applied int memories_used keys that resolved to a live memory row (each got used).
evidence_applied int rows that also received a positive-outcome evidence event.
harm_applied int rows that received a negative-outcome harm event.
memories_written list[str] memory_keys written under this run_id (derived from loom.memory).
recalled int distinct memory_keys memory.search returned under this run_id — needs LOOM_SEARCH_TRACE_LOG_ENABLED; -1 when the trace log is off.
observations int episodic observations (observe.record) tagged with this run_id.
procedure_runs_recorded int procedural memories in memories_used that got a procedure.record_run row (path empty, ok = the run's outcome) — the ledger procedure.evolve reads. 0 on a none outcome.
reflection_key str memory_key of the reflection written from reflection; "" when none.
retain str Retention counts over the rows this run wrote.
retained int Rows this run wrote that the demote/expire mode left alone (pinned, verified, …); 0 under keep.
demoted int Rows whose confidence was lowered by retain=demote.
expiring int Rows given an expiry by retain=expire.

run.get

Replay one run: goal, status, final response, the memories it relied on, the memory_keys it wrote, how many memories it recalled and observed, and what its model turns cost.

POST /v1/run.get · MCP loom_run_get · role viewer · read

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.
run_id str required The agent run (task scope) the call belongs to; '-' for none.
Output field Type Meaning
found bool False when no run with this id exists in the namespace; every other field is then empty.
run RunRow \| None The run row; None when not found.
recalled int Live derivations (not stored on the row): what the run recalled, wrote, observed and cost.
recalled_keys list[str] Keys memory.search returned under the run plus keys the hooks reported as served; empty when neither is known.
memories_written list[str] Keys written under this run's id, read live from loom.memory.
observations int Episodic observations (observe.record) tagged with this run's id.
turns int The session's turns in loom.agent_turn_usage (the plugin's Stop hook writes them) made while the run was open; 0 when the run has no session or the hook is not installed.
unpriced_turns int Those turns whose model the price table does not know: each costs 0, so cost_usd and a cost budget leave them out.
cost_usd float Summed model cost in USD of those turns; 0 as for turns.
elapsed_seconds int Seconds from started_at to completed_at (to now while active), on the server's clock; not duration_ms.
over_budget list[Literal['cost', 'time']] The budgets the run has gone past: cost (cost_usd > budget_usd) and time (elapsed_seconds > budget_seconds).

run.grade

A verdict on a CLOSED run, usually days after it — a maintainer confirmed the finding, CI passed, a reviewer rejected it.

POST /v1/run.grade · MCP loom_run_grade · role writer · 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.
run_id str '' The run to grade; "" or "-" = none.
session_id str '' Every closed run of this session; "" or "-" = none.
grade Literal['pass', 'fail'] required The verdict: pass (the result held up) or fail.
source str 'caller' Who graded: maintainer, ci, reviewer, judge… (free text, short).
reason str '' Why the grade was given; stored on the run as grade_reason.
ref str '' What the grade rests on: a URL, a finding key, a check run id.
Output field Type Meaning
graded int Runs whose grade was written (a closed run whose verdict changed).
run_ids list[str] Ids of the runs whose grade was written.
skipped_active int Runs of the target left alone because they are still active (not closed).
unchanged int Closed runs that already carried this grade, source, reason and ref.
memories_counted int Distinct memories the graded runs relied on (memories_used).
proposals_decided list[RunGradeProposal] Proposals the owner-set policy decided on this grade (auto mode only).

run.list

A page of a namespace's agent runs and their match count (total), filtered and sorted.

POST /v1/run.list · MCP loom_run_list · role viewer · read · 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.
agent str '' Only this agent's runs; "", "*" or "-" = every agent.
session_id str '' Only this session's runs; "", "*" or "-" = every session.
status Literal['', 'active', 'completed', 'failed', 'cancelled'] '' Only runs in this status; "" lists every status.
limit int 50 At most this many runs, in order_by order; the server caps it at 200.
offset int 0 Runs to skip before the page (0-100,000); default 0, the first page.
order_by Literal['started_desc', 'started_asc', 'duration_desc', 'duration_asc', 'relied_on_desc', 'relied_on_asc'] 'started_desc' Sort by start time, duration (0 while active) or memories relied on; default newest first.
q str '' Only runs whose goal, run id or agent holds this text, in any case; "" is no filter.
memory_activity Literal['', 'with', 'without'] '' The Runs page folds runs that neither relied on nor wrote a memory.
grade Literal['', 'ungraded', 'graded', 'pass', 'fail'] '' ungraded / graded / a verdict (pass, fail); "" = every run.
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
runs list[RunRow] Matching runs in order_by order (newest started_at first by default), projected to fields when given.
total int \| None How many runs match the filters; null on a full page after the first.