Intent-Task Catalog
Canonical intent taxonomy mapped to versioned task templates and Decision Specs.
The Intent-Task Catalog is the routing layer of the Decision plane: it maps every supported intent to a risk-classified task template and the Decision Specs that template produces. Without it, every team writes ad-hoc workflows for the same business intent.
Definition
A versioned, governed registry of Intent entries (canonical intent name with metadata) and TaskTemplate entries (parameterized plan blueprints bound to one or more Decision Specs). Each intent declares its risk class, accepted channels, locale support, and the task templates eligible to handle it.
Why it exists
Intents are how the runtime understands what the user wants. If different teams classify “refund” differently or build different workflows for it, decisions become incomparable across teams, audit becomes impossible, and improvement loops stall. The catalog gives intents a single name, single risk classification, single set of approved templates.
How it works
- Author an
Intentwith name, description, risk class, accepted channels. - Author one or more
TaskTemplateentries that handle that intent. - Bind each task template to its Decision Specs (e.g.,
support.refund.eligibilityandsupport.refund.execute). - Resolve at runtime — the Compiler’s intent classification stage maps a raw input to one canonical intent; the Planner picks an eligible task template by Run Context and risk.
- Emit decisions — every Decision Record carries its
intent_reffor downstream evaluation and improvement.
Intent
{
"intent_id": "support.refund",
"version": "3.0.0",
"owner_role": "support_ops",
"description": "Customer requests a refund on a prior order.",
"risk_class": "destructive",
"accepted_channels": ["app_chat", "email", "voice"],
"locale_support": ["en-IN", "en-US", "hi-IN"],
"eligible_task_templates": ["task_refund_with_eligibility", "task_refund_self_serve"]
}Intent fields are tightly governed because they decide which workflow runs and what risk tier applies.
TaskTemplate
{
"task_template_id": "task_refund_with_eligibility",
"version": "2.1.0",
"intent_id": "support.refund",
"owner_role": "support_ops",
"decision_bindings": [
{ "decision_key": "support.refund.eligibility", "checkpoint_after_step": "s2" },
{ "decision_key": "support.refund.execute", "checkpoint_after_step": "s2" }
],
"default_plan": {
"steps": [
{ "id": "s1", "tool": "adp_orders.lookup", "params_schema": "schema://adp_orders.lookup.in" },
{ "id": "s2", "tool": "adp_policy.eval", "depends_on": ["s1"] },
{ "id": "s3", "tool": "adp_payments.issue_refund","depends_on": ["s2"], "approval_mode": "destructive" }
]
},
"eligibility_rules": {
"and": [
{ "==": [{ "var": "request.channel" }, "app_chat"] },
{ ">=": [{ "var": "user.tenure_days" }, 30] }
]
}
}Task templates are not scripts. They are versioned, owned, schema-validated blueprints the Planner expands into a concrete Plan.
Risk classification
Every intent declares one of the approval-mode tiers as its risk_class. Effects:
- the Compiler refuses to surface tools whose
approval_modeexceeds the intent’s risk_class without explicit policy permission, - the Critic verifies plan steps respect the intent’s risk class,
- the Trust plane stratifies sampling and release gates by risk class.
Routing
For an inbound invokeAgent request:
- Intent classification produces one canonical intent.
- Eligibility rules across templates are evaluated against the Run Context; ties broken by template version recency.
- The selected template is the Planner’s blueprint.
- The Run Context records the selected
intent_idandtask_template_idso the Critic and the Decision Record can reference them.
Interfaces
Inputs
- Raw user input (message, channel, locale, attachments)
- Run Context (user, agent, tenant, claims)
Outputs
intent_id,task_template_id- Decision-binding map for the planner
- Risk class for downstream sampling and release gates
Failure modes
- Multiple intents match — runtime requires a deterministic tiebreaker (highest specificity, then most recent version).
- Selected template binds to a non-existent decision spec — fail closed at compile time.
- Task template plan references a tool not in the pack’s
tooling_layer— caught by the Critic’s verify pass. - Intent risk class lower than the highest tool’s approval_mode — prevents safe execution; raise the intent’s risk class.
Operational concerns
- Owner role accountable for every intent and template; orphans flagged.
- Versioned changes; deprecation windows for breaking changes.
- Per-tenant routing overlays cannot grant new tools, only constrain.
- Routing latency budget folded into the planner timeout.
Evaluation metrics
- Intent-classification precision/recall on golden requests.
- Template-selection consistency across replays.
- Risk-class drift detection (intent changing risk class across versions).
- Mean templates per intent (target: low).
Example
Two templates handling the same intent at different risk levels:
{
"intent_id": "support.refund",
"templates": [
{ "task_template_id": "task_refund_self_serve",
"decision_bindings": [{ "decision_key": "support.refund.execute" }],
"eligibility_rules": { "<=": [{ "var": "request.context.refund_amount" }, 200] },
"highest_approval_mode": "delegated" },
{ "task_template_id": "task_refund_with_eligibility",
"decision_bindings": [{ "decision_key": "support.refund.eligibility" }, { "decision_key": "support.refund.execute" }],
"eligibility_rules": { ">": [{ "var": "request.context.refund_amount" }, 200] },
"highest_approval_mode": "destructive" }
]
}Common misconceptions
- Intents are not user phrases. They are canonical, governed names; classification maps phrases to intents.
- Task templates are not scripts. They are blueprints; the Planner expands them into a Plan.
- Risk class is not optional. Without it, the Compiler cannot apply approval-mode filtering correctly.