Skip to main content
These are the complete prompts the engine assembles, one per situation, with each snippet inlined in production order. They are published so you can see exactly what the model is told. Each situation also lists the framework tools offered on that call. Prompt text and tool availability are kept in step, so a prompt never advertises a tool the model was not given. Your own skill tools are additional and are gated by their own requires: conditions. Read System Prompt first for the assembly order and which agent.yml keys override which section.
{{ ... }} and {% ... %} are Jinja2. Most resolve from live conversation state or your agent.yml. Two are different: ack_enabled and render_scope_handling appear as template conditions but are Python-side gates in the engine, not values you can set.Each situation lists the gates that are already resolved in it, so what you see is what is present at that point in the conversation.

Values in the templates

The same handful of values fill every template. Everything else is literal prompt text.

Main turn

Each of these five is a complete system prompt. A pending tool confirmation can appear on top of any of them. Bracketed sections are conditional.
When. No skill is on the stack.Sections. Header, skill glossary, channel rules, [acknowledgement], lifecycle tools, [out-of-scope handling], routing catalogue, [pending confirmation].Already resolved. has_active_skill is false, so there is no skill-completion, cancel, or referenced-skills guidance.Framework tools offered (what each one does)
  • activate, when at least one skill is startable. A skill is startable when it is not disabled, not engine-managed, and its requires: condition holds
  • search_knowledge, when a references index is packaged
  • cannot_help, immediately when no knowledge base exists; with one, only after a search has run
  • resolve_tool_confirmation, when a tool is paused on requires_confirmation:
The list stops there. complete_skill, cancel_skill, set_fields, and correct all act on an active skill, and there is none.
01_routing_no_skill_active.jinja2
When. A prose skill is on top of the stack.Sections. Header, skill glossary, channel rules, [acknowledgement], lifecycle tools, [out-of-scope handling], active skill, [pending confirmation].Already resolved. has_active_skill is true.Framework tools offered (what each one does)
  • activate, when at least one target is startable. That means another skill, or one of this skill’s own blocks reached with @block.<id>. The skill on top is never offered
  • search_knowledge, when a references index is packaged
  • cannot_help, immediately when no knowledge base exists; with one, only after a search has run
  • resolve_tool_confirmation, when a tool is paused on requires_confirmation:
  • complete_skill and cancel_skill
  • set_fields, when the skill still has settable entries this turn
  • correct, when an earlier user-provided value is correctable
Plus the skill’s own tools whose requires: gate currently holds.
02_skill_active_prose.jinja2
When. An ordered block is on top of the stack. Its activate target id is {skill_id}__{block_id}.Sections. Same as a prose skill: header, skill glossary, channel rules, [acknowledgement], lifecycle tools, [out-of-scope handling], active skill, [pending confirmation].Already resolved. has_active_skill is true, and the skill-level Instructions section is omitted because the block supplies the steps.Framework tools offered (what each one does)
  • activate, when at least one target is startable. That means another skill, or another block of this skill. The block on top is never offered
  • search_knowledge, when a references index is packaged
  • cannot_help, immediately when no knowledge base exists; with one, only after a search has run
  • resolve_tool_confirmation, when a tool is paused on requires_confirmation:
  • complete_skill and cancel_skill
  • set_fields, when the skill still has settable entries this turn
  • correct, when an earlier user-provided value is correctable
Plus the skill’s own tools whose requires: gate currently holds.
03_skill_active_ordered_block.jinja2
When. A skill is on the stack and search_knowledge has already run this turn.Sections. Header, skill glossary, channel rules, [acknowledgement], lifecycle tools, [out-of-scope handling], knowledge answering, [pending confirmation].Already resolved. has_active_skill is false for the lifecycle section, matching the trimmed tool list, so skill-completion and cancel guidance is dropped.Framework tools offered (what each one does)
  • activate, when at least one target is startable
  • search_knowledge, to re-query with a refined search
  • cannot_help
  • resolve_tool_confirmation, when a tool is paused on requires_confirmation:
This is the shortest list of any situation. Once a search has run, the schema builder returns these four and stops, so the skill’s lifecycle tools and its own tools are withheld for the rest of the turn and return on the next one. search_knowledge and cannot_help are unconditional here: a knowledge base exists by definition, and a search has run.
04_after_knowledge_search.jinja2
When. The bundled unsupported-request handler is the active skill.Sections. Header, skill glossary, channel rules, [acknowledgement], lifecycle tools, active skill, [pending confirmation].Already resolved. The out-of-scope handling section is omitted, since the decline is already underway.Framework tools offered (what each one does)
  • activate, when at least one target is startable. The handler itself is engine-managed, so it is never in its own list
  • search_knowledge, when a references index is packaged
  • cannot_help, immediately when no knowledge base exists; with one, only after a search has run
  • resolve_tool_confirmation, when a tool is paused on requires_confirmation:
  • complete_skill and cancel_skill
  • set_fields, when the skill still has settable entries this turn
  • correct, when an earlier user-provided value is correctable
The model therefore cannot re-enter the decline it is delivering.
05_scope_handler_active.jinja2

Separate calls

These use their own, much smaller prompts rather than the main one.
When. A response opted into metadata.rephrase: true.Sections. A system message of header, rephrase task, and channel rules, then the history and user turn, then a trailing system message carrying the text to rephrase.Already resolved. No glossary, lifecycle, out-of-scope, routing, or active-skill sections.Framework tools offered (what each one does)None. The call is made with no tool schemas at all, so the model can only return text. That is what makes it safe for wording you declared verbatim.System message:
06_rephrase_only.jinja2
Trailing system message, sent after the history and the user turn:
06_rephrase_only.jinja2 (trailing)
When. A collect: step confirms a value that is already filled.Sections. The same shell as the rephrase call, with a trailing message that names the field and its captured value.Already resolved. No glossary, lifecycle, out-of-scope, routing, or active-skill sections.Framework tools offered (what each one does)None, the same as the rephrase call.System message:
07_confirm_rephrase.jinja2
Trailing system message, sent after the history and the user turn:
07_confirm_rephrase.jinja2 (trailing)
When. The first LLM iteration of a turn, when ack_enabled is set and no collect step is active.Sections. Inserted as its own system message directly after the last user message.Already resolved. Not part of the main system prompt. Uses prompts.ack_reminder when set, otherwise the default below.Framework tools offered (what each one does)Whatever the turn it is injected into offers. This is a message added to an existing call, not a call of its own.
08_ack_reminder_injected.jinja2
When. Once the agent’s reply has been sent, on turns that changed which skill is active. It runs off the customer’s latency path and is best-effort: a failure is logged and the turn still succeeds.Sections. This task text alone, appended after the conversation so far. None of the main-turn sections are included.Already resolved. Not part of the main system prompt, and not part of the turn’s response loop.Framework tools offered (what each one does)One purpose-built tool, record_discovered_facts, and nothing else. It is not one of the eight framework tools offered during a turn.
discover_facts_task.jinja2

See also