Any router that fires on two candidate signals is making an implicit claim: that each signal adds information beyond the other. That claim is testable. The cleanest way to check it is to reduce each signal to a yes or no at the moment of routing, then cross the two answers against whether the route actually produced a correct or accepted outcome.
The 2x2 table is the right container because it separates four populations: neither signal present, only the first, only the second, and both. Standard treatments of the 2x2 table note that the row and column margins carry the base rates while the interior cells carry the joint behavior, and that the odds ratio is the usual index of association between two binary quantities (the tutorial on 2x2 tables). You are using the same structure, but the outcome column is "did the chosen route succeed" rather than "did the disease occur."
Two definitions matter before you count anything, because sloppy definitions produce fake interactions:
- Signal presence. Fix the threshold in advance. If a signal is a score, pick the cut from a prior calibration run and freeze it. Moving the cut after you see the table is how people manufacture interactions.
- Outcome. Use a label you would accept in an A/B test: resolved without escalation, judged correct by a rubric, or a human accept/retry decision. Ticket escalation prediction work at IBM trained on over 2.5 million tickets and 10,000 escalations to reach 87.36% recall, which shows the label is tractable at scale but also that escalation is rare (the IBM field study). Rare outcomes shrink your cells fast.
The reason this matters for routing specifically: a router is a pre-generation decision about where to send work, and the AI Engineer taxonomy separates model selection (a decision made before generation) from quality escalation (a decision made after inspecting an answer) (the routing overview). Your two signals may be one of each. The interaction test does not care, but the interpretation does.



