Patterns
These are Jev's four patterns. They work unchanged on our answers; the difference is that the numbers come from a model that learned your decision, and your rules are already applied.
Speculative fan-out
Ask every question in one request. They're answered together, and you only pay one round trip.
res = decide(model="triage@latest", state=ticket, questions={
"team": team_q, "priority": priority_q, "churn_risk": churn_q,
})
a = res["answers"]
route(a["team"]["choice"], priority=a["priority"]["score"], flag=a["churn_risk"]["noul"] > 0.7)Pricing is flat, so asking more questions costs nothing extra.
Confidence-gated routing
Act on confident answers; send the rest somewhere smarter or to a person.
d = res["decision"]
if d["route"] == "act": do(d["action"])
elif d["route"] == "review": do(d["action"]); review_later(res["id"])
else: escalate(res["id"])The safety bar sets itself after every training run, so route already says which answers are automatic. See Confidence.
Composite scoring
Combine several answers with weights, in your code:
a = res["answers"]
risk = 0.5 * a["fraud_likely"]["noul"] + 0.3 * (a["urgency"]["score"] / 2) + 0.2 * a["new_payee"]["noul"]
if risk > 0.6:
hold(txn)Keep the weights in code where you can test them. If the combination is itself a decision you make every day, make it a domain's decision question instead, and let it learn from outcomes.
Intent routing
Classify first, then hand each case to the right handler: code, a specialist LLM, or a person.
topic = res["answers"]["topic"]["choice"]
handler = {"refund": refunds_flow, "lost_stolen": block_and_replace, "info": faq_bot}.get(topic, human)
handler(ticket)Your rules still apply to the decision question, whatever the handler does next.