Ask a commercial interaction checker about a three-drug problem and you'll get, at best, three separate two-drug answers. That's not a limitation of the vendor's diligence — it's a limitation of the data structure. A pairwise severity table is drug × drug → severity. It has one shape, and that shape is a pair. A risk that only exists when three drugs stack has no cell to live in.
The clinical literature is blunt about this: 3+-drug interactions are excluded from the standard commercial knowledge bases. Not deprioritized — structurally excluded.
Why the third drug matters
Consider three real mechanisms a pair table drops on the floor:
- Additive QT prolongation. Amiodarone, clarithromycin, and haloperidol are each somewhat QT-prolonging. No single pair is the story; the stack is. Three "moderate" pairs can compose into a genuinely dangerous cumulative burden — and the pairwise view never sees it, because there is no pair that carries the finding.
- Cumulative organ load. Amiodarone + simvastatin + isoniazid — three drugs each taxing the liver. The hazard is the sum of the loads, a property of the regimen, not of any edge in it.
- A shared-enzyme hub. Two CYP3A4 inhibitors plus a CYP3A4 substrate is a super-additive problem. The hub is a first-class thing;
C(n,2)rows can't represent "these all point at the same enzyme."
We store the mechanism, so we can compose it
Instead of storing pairs, we store the mechanism: drug → enzyme/transporter edges (clarithromycin —inhibits→ CYP3A4, simvastatin —substrate_of→ CYP3A4). An interaction is then something we derive by composing edges along a graph — and the path we walked is the proof.
Because the representation is a graph, the third drug isn't a special case. A polypharmacy reasoner takes a whole medication list and emits a regimen risk profile, with a cited proof per finding, catching the loads a pairwise table can't hold.
The evidence — and the honest boundary
Here's the number and where it lives. In the polypharmacy battery (expr5798-polypharmacy-battery.json), the reasoner produced 8 findings with zero fabrications — false_additive, false_competition, and false_joint counts all zero — and it abstains on a drug whose properties it doesn't have. It surfaces the amiodarone + clarithromycin + haloperidol QT stack as a three-contributor finding, not as any single pair.
Now the boundary, because honesty is the whole point: this is a demonstrated capability, proven on a curated battery of real documented drug properties. It is not a claim of coverage-at-scale — the real, cited property facts that would drive this across the full formulary come from an extraction pipeline that's still growing, gated behind our own ratification bar. So: the reasoner can do the thing a pair table structurally cannot; how much of the formulary it does it over is labeled growing, and you can watch that number move on our honesty dashboard.
The capability is the moat. The coverage is the work.
Coverage is labeled growing, never parity. Every number here traces to an on-disk evaluation that regenerates from cargo test. Public naming and launch timing are not yet decided.