Skip to content

decision operations

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

decision.chain

Trace a decision's causal chain: upstream (what caused or influenced it) and/or downstream (what it went on to cause), up to 4 hops over the authored graph.

POST /v1/decision.chain · MCP loom_decision_chain · 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.
memory_key str required The key to start the walk from, usually a decision's.
direction Literal['upstream', 'downstream', 'both'] 'both' upstream follows what led here, downstream what it led to, both walks each.
max_hops int 3 How many edges away to walk, 1-4.
Output field Type Meaning
seed str The starting key, echoed.
seed_decision DecisionRow \| None The seed's decision record; null when the seed is not an active decision.
nodes list[ChainNodeRow] Every key reached over caused, influenced or derived_from edges, each once, nearest hop first.

decision.outcome

Close the loop on a decision once reality has answered: record what actually happened and whether it worked (success).

POST /v1/decision.outcome · MCP loom_decision_outcome · role writer · write · 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.
memory_key str required The active decision to update; answers 404 when there is none, or when the record's writer has no live decision row under the key.
realized_outcome str required What actually happened, stored on the decision record.
success bool \| None None None keeps the record's verdict; True/False sets it and credits (or marks) the deciding run's memories.
agent str '*' The writing or reading agent; '-' or '*' means any agent where the op allows it.
Output field Type Meaning
memory_key str The decision's key, echoed.
updated bool Always true: a missing decision answers 404 instead.
memories_credited int memories credited through the run ledger (run.complete memories_used).

decision.precedents

BEFORE deciding, ask what was decided in similar situations: semantic search over past decisions (optionally within a category), each with its reasoning, rejected alternatives, and — when known…

POST /v1/decision.precedents · MCP loom_decision_precedents · 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 '*' The writing or reading agent; '-' or '*' means any agent where the op allows it.
query str required The scenario at hand, phrased as the deciding agent sees it.
category str '' Only decisions in this category (case-insensitive); "" searches every category.
top_k int 5 At most this many precedents, 1-25.
with_outcome_only bool False Only decisions whose realized outcome is known (decision.outcome called).
Output field Type Meaning
precedents list[DecisionRow] Active past decisions, the most similar decision statement first.
embedding_model str The embedder the underlying memory search used.

decision.record

Record a DECISION as a first-class object — call it whenever you choose between options that matter later (a vendor, a design, a fix, a rollback).

POST /v1/decision.record · MCP loom_decision_record · 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.
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 session or conversation the row belongs to; '-' for none.
run_id str '-' The run this decision was made in (run.begin).
category str required category + scenario identify the decision: re-deciding the same scenario supersedes the earlier record (history keeps it).
scenario str required The situation that needed deciding; decision.precedents matches a query against the decision's statement, which opens with the scenario.
reasoning str required Why this outcome was chosen.
outcome str required What was decided.
alternatives list[str] (computed) What was considered and not chosen — the field every "why not X" question needs and most decision logs omit.
confidence float 0.0 The decider's confidence, 0-1; 0 records none (the memory row and edges then carry 1.0).
stage Literal['decided', 'proposed'] 'decided' "decided" (default), or "proposed" for an option put forward and not yet chosen or built (a proposal, a plan, an action item); unrelated to memory.set's proposed, a fact on trial.
decision_maker str '' Who decided, a person or an agent; "" records the calling agent.
caused_by list[str] (computed) memory_keys (decisions, facts, procedures) that CAUSED or INFLUENCED this decision; each becomes an authored edge (memory.link) with this call as its evidence.
influenced_by list[str] (computed) Keys that shaped the decision without causing it; each becomes an influenced edge.
tags list[str] (computed) Extra tags on the memory row, beside decision and decision:category:<category>; a decision:proposed tag here is dropped (set it with stage).
valid_at datetime \| None None Real-world time the decision took effect; None = now.
files list[str] \| None None The repo files this decision governs (repo-relative path or bare filename); memory.for_file serves it before an edit of them.
source_class Literal['derived', 'external', 'imported'] \| None None Declare that this decision was derived from other content (derived) or came from outside (external, imported).
source_resource_id str '' The file path, document id or URL this decision was taken from, cited on its hits.
Output field Type Meaning
memory_key str The decision's key, derived from category + scenario; pass it to decision.outcome and decision.chain.
record_id str The id of the decision record version written.
superseded_prior bool True when an active decision for the same category + scenario existed and is now superseded by this one.
edges_written int How many caused / influenced edges were written; a failed link is skipped.
next str Plain-text hint naming the follow-up operations.