- Execute deterministic steps first: ordered-block steps that need no
model call (
execute_tool:,noop:,set_memory:,action:, andcollect:steps whose value is already known). The framework also narrows what the LLM may do next, filtering routable skills byrequires:and hiding gated tools, though the routing choice itself is made by the LLM in step 3. - Build a scoped prompt from live state: the active skill’s instructions
filtered by
if:markers, the tools whoserequires:conditions currently hold, and the memory values readable in scope. - Call the LLM.
- If the LLM returns a tool call: dispatch it, apply any memory writes the tool makes as it runs, check for newly-available deterministic steps, and loop back to step 1.
- Otherwise: send the response and wait for the user.
State tracked per control level
These coexist. A hybrid skill, meaning prose with
if: markers that also
references an ordered block, tracks both a step pointer and memory state at
once.
Tool execution
A tool may be invoked by the LLM (a tool call) or by the framework (anexecute_tool: step). The function does not know or care which.
tool_constraints are checked in both cases, and in two places:
- when the tool schema is built, deciding whether the LLM sees the tool at all
- again at dispatch, before the function runs
requires: condition that cannot be evaluated hides
and blocks the tool rather than allowing it.
Knowledge search changes the loop
Whensearch_knowledge runs during a turn, the tool list for the remainder of
that turn collapses to activate, search_knowledge, and cannot_help, plus
resolve_tool_confirmation when a confirmation is pending so the pending gate
is never stranded. The active skill’s lifecycle, collect, and builder tools are
dropped so a grounded answer does not re-drive the skill. They return on the
next turn.
Relatedly, cannot_help is withheld until a search has run whenever a knowledge
base is configured, so the model cannot decline before retrieval could have
answered.
Where conditions are evaluated
See Conditions.
Tracker events
Mantle appends these events to the conversation tracker. They are what Inspector and Copilot read; you do not author them in YAML.
Skill-level
flow_* events are still written beside skill_*. Internals and
ordered blocks emit flow_* only.
Each tool run also appends mcp_tool_executed (same name, arguments, result, and
error fields; that copy has no replay metadata). Each memory write also appends
slot_set with the same key and value. Session-start metadata uses slot_set
only. Trackers that stored MCP tool runs or slot_set memory still replay.
See also
- The Runtime Loop: the same loop, explained
- Skills & Routing: how Inspector shows these events
- Constraint Table: framework vs. LLM at each level
- Tools reference: the built-in framework tools