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), at which agentic app to start (activation_target), and at which IdP client is acting (agent_client_id). It does not embed secrets, tokens, 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
agent_client_idYespayments-agent-v2Which IdP-registered software principal acts on this route. Pointer only. See Agent client id
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_v3Versioned prompt pack. One id on the row; multiple templates inside. See 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.

Agent client id​

agent_client_id is which robot this route is. It is an IdP client pointer on the catalogue row. It is not a secret, not a token, and not activation_target.

ValueMeaning
IdP client_id stringRegister this agent in the IdP. After freeze, the agentic app requests a token for this client, downscoped to this route's manifest.

Pin it on the route pin and the run pin with route_id and versions. Resume re-mints the same client. Route change mid-session: new downscoped token for the new row's agent_client_id. Do not derive the id from route_id. Do not put the client on NAR / activation_target config (shared runtime would become one fat identity). Do not inline scopes or client secrets on the row. The IdP holds registration, secret, allowed scopes, and status.

A new use case is a new row and usually a new agent client. Two rows may share a client only when they are the same software principal; prefer 1:1 so revoke does not take unrelated routes.

How the freeze carries it: Session custody · Wire agentic app. Token boundary: Token and session boundary.

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

Prompt artifact​

prompt_id names one pack, not one string. The agentic app loads it after the route pin, then picks a template by llm_role (Patterns 2-3) or uses host alone (Pattern 0). Conversation and working memory are assembled at inference time. They are not extra prompt_ids.

PatternWhat the pack holds
0host only. One call.
1host plus loop instructions. Same pack for every step.
2-3host plus templates keyed by llm_role. none means no LLM call.

Two stages may share one template. Key by role, not by stage_id. Do not put PEP limits in the pack.

Worked example: MSA risk review. This pack is prompt_id on route msa_risk_review. That row's manifest is msa_risk_review_v1. Full row and workflow: RAG retrieval. How llm_role is assigned: Autonomy shape. Assembly: Inference handoff. Manifest entry shape: Manifest registry.

This packUsed by
prompt_idmsa_risk_review_v1 (this artifact)
Routeroute_id: msa_risk_review
Manifesttool_manifest: msa_risk_review_v1
Workflowworkflow_id: msa_risk_review_v1
Route row: msa_risk_review (JSON)

Pattern 2. Shared runtime (no activation_target). No max_loop_steps: the workflow owns the budget. Same ids as the MSA row in RAG retrieval. The prompt pack does not list tools. The manifest does.

{
"route_id": "msa_risk_review",
"intent": "msa_risk_review",
"agent_client_id": "msa-risk-review-v1",
"description": "Fixed-stage MSA risk review for counsel: OCR, clause search, playbook, risk, memo",
"model_profile": "reasoning-standard",
"tool_manifest": "msa_risk_review_v1",
"policy_profile": "read_only_standard",
"retrieval": {
"mode": "tool",
"scope": ["clause-index", "legal-playbook"]
},
"memory_profile": {
"conversation": "session",
"working": "session",
"loop": "checkpoint",
"long_term": "retrieve_only",
"ttl_hours": 24,
"isolation": ["tenant", "user", "session"]
},
"workflow_id": "msa_risk_review_v1",
"prompt_id": "msa_risk_review_v1",
"output_schema_id": "msa_memo_v1",
"eval_suite_id": "msa_risk_review_golden",
"fallback": "clarify",
"required_claims": ["legal:msa_review"]
}
FieldWhat it means on this route
route_id / intentThis turn is MSA risk review. Classifier target and audit id.
agent_client_idIdP client msa-risk-review-v1. NAR requests a token for this robot after freeze.
descriptionHuman-readable scope. Not sent to the model.
model_profileReasoning tier at the gateway. Not a vendor model id.
tool_manifestLoad msa_risk_review_v1. Tool schemas and pdp_action live there.
policy_profilePEP uses read_only_standard. The registry does not grant permission.
retrievalSearch tools may run, only against clause-index and legal-playbook.
memory_profileSession conversation, stage working slots, checkpointed loop. Long-term is retrieve-only.
workflow_idPattern 2 stage order. The LLM does not pick the next stage.
prompt_idThis pack: host plus query_formulation and synthesis.
output_schema_idCounsel memo shape (msa_memo_v1). App validates before return.
eval_suite_idGolden checks: stage order, required stages, memo grounded.
fallbackClarify when entities are missing or the turn is out of domain.
required_claimsIngress must carry legal:msa_review or this row is not eligible.
Stagellm_roleTemplate from this pack
ocrnoneNone. No LLM call.
clause_searchquery_formulationby_llm_role.query_formulation
policy_searchquery_formulationSame template. Corpus comes from the workflow, not the prompt.
risk_enginenoneNone. No LLM call.
memosynthesisby_llm_role.synthesis
Prompt pack msa_risk_review_v1 (JSON)

One pack. The route msa_risk_review points here and at tool_manifest: msa_risk_review_v1. Five stages. Two templates. task_type is what Plane ③ sees (plan / synthesize). It is not a second prompt_id.

{
"prompt_id": "msa_risk_review_v1",
"prompt_version": "2026.08.1",
"host": "You are counsel's MSA risk-review worker. Do only the current stage. Do not choose the next stage. Do not invent tools.",
"by_llm_role": {
"query_formulation": {
"task_type": "plan",
"text": "Write the search query for this stage's corpus only. Do not pick a different index."
},
"synthesis": {
"task_type": "synthesize",
"text": "Draft the counsel memo from validated stage outputs only. Ground claims in retrieved clauses and playbook hits."
}
}
}

Changing prompt text under the same prompt_id does not bump route_table_version. Pointing the row at a new prompt_id does. Same rule as other artifact ids: When the row changes.

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 pack (host, by_llm_role)Prompt storePrompt artifact
Output schema / eval suiteSeparate versioned storesLoaded by id from the row
IdP agent registration (secret, allowed scopes, status)IdP / agent securityPointer on the row is agent_client_id only. See Agent client id

Canonical single-route shape​

Worked Pattern 2 row: MSA risk review. Same contract as Prompt artifact. Fields appear when the autonomy pattern needs them.

Canonical route row: msa_risk_review (JSON)
{
"route_id": "msa_risk_review",
"intent": "msa_risk_review",
"agent_client_id": "msa-risk-review-v1",
"description": "Fixed-stage MSA risk review for counsel: OCR, clause search, playbook, risk, memo",
"model_profile": "reasoning-standard",
"tool_manifest": "msa_risk_review_v1",
"policy_profile": "read_only_standard",
"retrieval": {
"mode": "tool",
"scope": ["clause-index", "legal-playbook"]
},
"memory_profile": {
"conversation": "session",
"working": "session",
"loop": "checkpoint",
"long_term": "retrieve_only",
"ttl_hours": 24,
"isolation": ["tenant", "user", "session"]
},
"workflow_id": "msa_risk_review_v1",
"prompt_id": "msa_risk_review_v1",
"output_schema_id": "msa_memo_v1",
"eval_suite_id": "msa_risk_review_golden",
"fallback": "clarify",
"required_claims": ["legal:msa_review"]
}

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",
"agent_client_id": "accounts-agent-v3",
"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",
"agent_client_id": "payments-agent-v2",
"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",
"agent_client_id": "policy-qa-agent-v1",
"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",
"agent_client_id": "chat-agent-v1",
"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",
"agent_client_id": "escalate-agent-v1",
"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​

Every row carries agent_client_id. Patterns below are the extra refs.

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, agent_client_id, 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