Skip to main content

Route Contract Reference

Blueprint · Route contract · Route table lifecycle →

Bookmark this page when you need the field dictionary for a route row. Ops (version, promote, rollback) live in Route table lifecycle. Tool entry shape lives in Manifest registry. PEP payload shape lives in Policy contracts.

THE CLAIM

A route row is a governed execution contract. It points at versioned artifacts (manifest, policy, memory, workflow, prompt) and at which agentic app to start (activation_target). It does not embed secrets, full chat history, or PDP prose.

Route row fields

FieldRequiredExampleWhy it matters
route_idYeslegal_contract_reviewStable id; tied to change records and audit
activation_targetOptionalhttps://assistant-app.internal/v1/runsWhich agentic app the router starts. Omit to use the shared runtime. See Activation target
intent / intent_labelYescontract_reviewClassifier / eval fixture target
descriptionOptionalContract review for counselHuman-readable scope
tool_manifestYescontract_review_staged_v3 or noneTool schemas the LLM may propose. See Manifest registry
policy_profileYesread_only_standardPEP rules, limits, attestation profile id
model_profileYesreasoning-standardCapability and cost tier at the gateway
retrievalOptional{ "mode": "tool", "scope": ["accounts"] }Who retrieves, and from which corpora
memory_profileOptionalSee Memory profileSession / working / loop policy; long-term is retrieve-only unless write tools are allowlisted
workflow_idPatterns 2-3contract_review_v3Fixed outer stages
prompt_idUsualcontract_review_v3Host / system prompt artifact
output_schema_idUsualcounsel_memo_v1Structured output validation
eval_suite_idUsualcontract_review_goldenOffline golden suite
max_loop_stepsPattern 112Bounds Observe → Decide → Tool (omit on Pattern 0)
fallbackOptionalclarify / escalate_humanWhen entities missing or OOD
required_claimsOptional["accounts:read"]Entitlement filter for eligible routes

Fields appear when the autonomy pattern needs them. Pattern matrix: Agents Blueprint.

Activation target

activation_target tells Plane ① which agentic app (runtime) to call after outcome=route. It is not a tool, not a model, and not a second classifier. The UI never uses this URL.

ValueMeaning
Omit (default)Shared agentic app. Hundreds of routes, one runtime. Prefer this.
HTTP(S) URLPOST /v1/runs on that app (async 202 + correlation_id)
Queue ide.g. kafka:agent.commands.fraud for an event worker pool

Pin it on the route pin with correlation_id. Resume ("yes") starts the same target. Do not re-resolve from active. How the POST looks: Wire agentic app.

A new use case is still a new row, not a new runtime. Set activation_target only when isolation cannot live in the pin (PCI enclave, separate release cadence). Same router either way.

Retrieval

modeWho retrievesTypical use
omit / noneNobodyChat, handoff, no knowledge path
deterministic_prefetchAgentic app, before the LLM. Model never sees retrieve tools.Pattern 0 Q&A; or Pattern 2 if retrieve → generate is a fixed workflow
toolA search tool runs inside scope. PEP still gates it.Pattern 1: LLM proposes. Pattern 2: workflow names the stage. Pattern 3: LLM proposes inside the stage allowlist.

scope is a list of corpus / index ids the route may touch. One retrieval object per row; multiple corpora go in that list, not a second retrieval block. The route pins mode and scope for the session. How the app branches on each mode, including more than one retrieve: RAG retrieval.

Memory Profile

Memory is route policy + session state, not a workflow step. The row declares what is allowed; the agentic app owns read, write, and assembly.

FieldValuesMeaning
conversationnone / sessionUser / assistant turns for this session
workingnone / sessionTask slots, route entities, stage outputs
loopnone / checkpointStep count, proposals, observations
long_termnone / retrieve_onlyDurable facts via retrieval or allowlisted tools; not stuffed into the system prompt. Permission only: who starts recall follows the pattern. See Autonomy shape · Memory
ttl_hoursnumberSoft lifetime for session-scoped stores
isolatione.g. ["tenant", "user", "session"]Partition keys so Session A cannot read Session B
ArtifactOwned byPlaybook
Tool entries (name, schema, pdp_action, risk_tier)Manifest storeManifest registry · Manifest lifecycle
SARAC / PEP payloadPolicy planePolicy contracts
Workflow stages / stage allowlistsWorkflow storeAgents Blueprint (Patterns 2-3)
Prompt / output schema / eval suiteSeparate versioned storesLoaded by id from the row

Canonical single-route shape

Canonical route row (JSON)
{
"route_id": "example_route",
"intent": "example_intent",
"activation_target": "https://assistant-app.internal/v1/runs",
"model_profile": "reasoning-standard",
"tool_manifest": "example_v1",
"policy_profile": "read_only_standard",
"retrieval": { "mode": "tool", "scope": ["example-corpus"] },
"memory_profile": {
"conversation": "session",
"working": "session",
"loop": "checkpoint",
"long_term": "retrieve_only",
"ttl_hours": 24,
"isolation": ["tenant", "user", "session"]
},
"workflow_id": "example_workflow_v1",
"prompt_id": "example_v1",
"output_schema_id": "example_out_v1",
"eval_suite_id": "example_golden",
"max_loop_steps": 12,
"fallback": "clarify",
"required_claims": ["example:read"]
}

Full route table shape

One published artifact: table metadata plus one object per route row. Entitlements are enforced at runtime from ingress claims, not stored per user.

Route table (JSON): versioned route contracts
{
"route_table_version": "2026.07.1",
"product": "corporate-assistant",
"routes": [
{
"route_id": "agent-account-v3",
"intent_label": "account_history",
"description": "Read-only account and transaction history",
"tool_manifest": "accounts-readonly-v2",
"policy_profile": "read_only_standard",
"model_profile": "reasoning-standard",
"retrieval": { "mode": "tool", "scope": ["accounts"] },
"memory_profile": {
"conversation": "session",
"working": "session",
"loop": "checkpoint",
"long_term": "retrieve_only",
"ttl_hours": 24,
"isolation": ["tenant", "user", "session"]
},
"max_loop_steps": 6,
"fallback": "clarify",
"required_claims": ["accounts:read"]
},
{
"route_id": "agent-payments-v2",
"intent_label": "payment_initiate",
"description": "Initiate outbound transfer",
"activation_target": "https://payments-app.internal/v1/runs",
"tool_manifest": "payments-readwrite-v3",
"policy_profile": "high_risk_step_up",
"model_profile": "reasoning-standard",
"retrieval": { "mode": "tool", "scope": ["policy-engine", "accounts"] },
"memory_profile": {
"conversation": "session",
"working": "session",
"loop": "checkpoint",
"long_term": "none",
"ttl_hours": 8,
"isolation": ["tenant", "user", "session"]
},
"max_loop_steps": 8,
"fallback": "escalate_human",
"required_claims": ["payments:initiate"]
},
{
"route_id": "agent-policy-qa-v1",
"intent_label": "policy_qa",
"description": "Policy and procedure Q&A via RAG",
"tool_manifest": "none",
"policy_profile": "read_only_standard",
"model_profile": "reasoning-standard",
"retrieval": {
"mode": "deterministic_prefetch",
"scope": ["policy-engine"]
},
"fallback": "clarify",
"required_claims": ["policy:read"]
},
{
"route_id": "agent-chat-v1",
"intent_label": "general_chat",
"description": "Lightweight chat with no tools",
"tool_manifest": "none",
"policy_profile": "low_risk_chat",
"model_profile": "lightweight-chat",
"max_loop_steps": 2,
"fallback": "clarify",
"required_claims": []
},
{
"route_id": "agent-escalate-v1",
"intent_label": "escalate_human",
"description": "Hand off to human agent",
"tool_manifest": "handoff-v1",
"policy_profile": "read_only_standard",
"model_profile": "lightweight-chat",
"max_loop_steps": 3,
"fallback": "clarify",
"required_claims": []
}
]
}

Pattern cheat sheet

PatternTypical row refs
0prompt_id, output_schema_id, eval_suite_id (tool_manifest: "none"); optional retrieval with mode: "deterministic_prefetch"; optional lean memory_profile
1tool_manifest, prompt_id, max_loop_steps, memory_profile, eval / output ids; optional retrieval with mode: "tool"
2workflow_id, tool_manifest, plus prompt / output / eval ids; memory_profile for stage working state; optional retrieval (prefetch as a named stage, or tool with fixed order)
3workflow_id (stage allowlists), tool_manifest, memory_profile, plus prompt / output / eval ids; optional retrieval with mode: "tool"

Worked JSON per pattern: Agents Blueprint.

When the row changes

Bump route_table_version when a route row changes (pointers or policy fields), not on every artifact publish behind a stable id.

ChangeBump route_table_version?
New or removed route_idYes
Row points at a new workflow_id, tool_manifest, prompt_id, schema, or eval idYes
model_profile, policy_profile, retrieval, memory_profile, max_loop_steps, activation_target, or entitlements on the rowYes
New manifest_version under the same manifest_idOften no (promote + pin on session)
Prompt / eval content bump while the route still references the same artifact idOften no

Full promote / rollback: Route table lifecycle.

Route table lifecycle → · Layered classifier · Manifest registry