intent = classify(message, history_version)
plan = build_plan(intent)
assert plan.tools subset_of allowed_tools(user_scope)
assert plan.max_steps <= policy.max_steps
validate_schema(step.arguments)
result = execute_with_idempotency(step)
record_trace(step, result, policy_version)
answer = compose_only_from(results, approved_sources)
return output_guardrail(answer)