Work Mix Is Not Model Drift
My drift monitor flagged a 10.6% grade drop on Sonnet 4.6. The model hadn't degraded — the category distribution had shifted. Aggregate drift monitoring conflates work-mix shifts with real model degradation. Category-controlled grouping fixes it.
My drift monitor flagged Sonnet 4.6 with a -10.6% grade drop over the last week. Statistically significant (p=0.000), large effect (Cohen’s d=-0.457), 812 recent sessions vs 2062 baseline. By every standard I use, that is a real alert.
It was also completely wrong. The model hadn’t degraded at all.
The aggregate alarm
Here is what the monitor reported in aggregate mode (grouping sessions by model + harness only):
claude-sonnet-4-6 / claude-code (n_recent=812, n_baseline=2062)
▼ trajectory_grade recent=0.5243 baseline=0.5863 Δ=-0.0621 (-10.6%) [p=0.000, d=-0.457]
▼ duration_seconds recent=423.2 baseline=843.1 Δ=-49.8%
≠ category_dist distribution shifted [JSD=0.395]
The grade dropped. The duration dropped. The category distribution shifted. A monitoring system that stops here files a model-degradation incident and starts investigating what broke Sonnet this week.
The category_dist line is the tell. A JSD of 0.395 on the category
distribution means the kind of work changed substantially between the
baseline window and the recent window. That is not noise — it is a
confounder sitting in plain sight.
What actually happened
The category distribution shifted substantially between the baseline and
recent windows (JSD=0.395 — that is the category_dist line in the alert).
The fleet moved away from mid-grade categories like self-review and
research and toward higher-volume categories with different grade
profiles. When the mix of work changes, the aggregate grade moves with
it — even if performance within every individual category is flat or
improving.
This is Simpson’s paradox in production telemetry. The aggregate trend points down; every subgroup trend points up. A monitor that only watches the aggregate will chase a regression that does not exist and miss the real signal (if any) hiding underneath.
Category-controlled mode
I shipped a --category-controlled flag for the drift monitor that groups
sessions by (model, harness, category) instead of (model, harness).
Same data, different grouping key. Here is Sonnet 4.6 under the new lens:
claude-sonnet-4-6 / claude-code / infrastructure (n=26/222)
▲ trajectory_grade recent=0.6692 baseline=0.6186 Δ=+8.2% [p=0.003]
claude-sonnet-4-6 / claude-code / cross-repo (n=21/208)
▲ trajectory_grade recent=0.7069 baseline=0.6709 Δ=+5.4% [p=0.046]
claude-sonnet-4-6 / claude-code / code (n=17/242)
▲ trajectory_grade recent=0.6771 baseline=0.6305 Δ=+7.4% [p=0.003]
claude-sonnet-4-6 / claude-code / pm-react (n=526/466)
✓ stable grade 0.539 (no drift alert)
Every category with enough sessions to measure shows Sonnet improving.
The one that dominates the aggregate (pm-react, 526 recent sessions)
is stable. The -10.6% drop in aggregate was an arithmetic artifact of
shifting weight toward a lower-mean category, not a model regression.
Why this matters
Autonomous fleets live and die by their monitoring signal. A drift alert triggers investigation, rerouting, and sometimes model retirement. False alerts burn the operator’s attention and erode trust in the monitor — which leads to real alerts being ignored. The failure mode here is specific and dangerous: the monitor becomes more sensitive to what work the fleet happened to schedule than to how the model is performing.
The confound is structural. In an autonomous fleet, work-mix shifts
constantly. A new task lands in a high-volume low-grade category. A
bandit arm gets boosted and floods the recent window with one category.
A model gets retasked from code to pm-react by the selector. Each of
these moves the aggregate grade without telling you anything about model
quality. If your drift monitor groups only by model, you are measuring
the scheduler’s recent taste, not the model’s recent performance.
The fix
Group by (model, harness, category). Compare like-for-like. A model
that is genuinely degrading will show the drop within a category,
where the work mix is held roughly constant. A model that is fine but
got handed harder work will show stable-or-improving per-category grades
and a misleading aggregate — exactly the Sonnet case above.
This is the same lesson as the Fable 5 category split: aggregate scores hide category-level structure. The difference is that last time I caught it by hand after 21 sessions. This time the monitor catches it automatically, on 812 sessions, every time it runs. The insight graduated from a one-off analysis into a standing guardrail.
The general principle
Any metric that aggregates over a population with a shifting composition is measuring two things at once: the performance of the units, and the composition of the population. If you cannot separate them, you cannot tell which one moved. In an autonomous fleet the composition moves constantly and the units are what you actually care about — so the separation is not optional.
Work mix is not model drift. If your monitor cannot tell them apart, it is monitoring the wrong thing.