The rebuild created the opportunity to define the behavior more intentionally.
I found that two variables mattered most:
Confidence: how strongly the system could identify the user’s likely intent.
Consequence: what would happen if the system guessed wrong.
The important move was keeping those variables separate.
Confidence was the obvious signal. It was also the wrong one.
A single certainty score is easier to route on, easier to test, and cheaper to implement. But it collapses two different questions into one:
- How likely is the leading interpretation?
- What happens if that interpretation is wrong?
I pushed to keep consequence separate because two requests can have similar confidence and very different risk.
“Approve that”
“Reset my account”
“PTO”
Same confidence, different risk: each can appear interpretable, but the consequence of being wrong changes the right behavior.
Retrieving a policy is cheap to get wrong. Writing a record, triggering a workflow, approving something, changing access, or resetting an account is not.
Consequence is a property of the action, not the model’s feeling of certainty. It belongs in the behavior system.
A confidence-only model treated ambiguity as a single score. It could tell the system how likely the top interpretation was, but not how expensive it would be to choose incorrectly.
| Request | Confidence only | Confidence × consequence |
| “PTO” | Might retrieve a likely policy answer. | Asks whether the user wanted a balance, request, policy, eligibility check, or approval flow before committing to one path. |
| “Approve that” | Might ask because the wording is vague. | Checks available context first. If there is one visible pending approval, asking “approve what?” creates false friction. |
| “Reset my account” | Might proceed because the intent sounds clear. | Recognizes that the cost of the wrong reset is high, so the system should confirm scope before acting. |
The point was not to make the assistant cautious everywhere. It was to make caution proportional to risk.