TL;DR
A contract-review pipeline scores every chunk across twelve legal categories and routes it to eleven specialists. The missing twelfth is not an oversight — it is the control signal the whole cost model depends on.
Twelve scorers, eleven analysts — what happens to the category with no specialist?
Count the agents in a playbook-driven contract reviewer and the numbers do not match.
Twelve categories are scored. Eleven specialists exist. That gap is not an oversight or a backlog item. It is the control signal the entire cost model is built on, and it is the most interesting design decision in the system.
For the engineering lead deciding how a multi-agent system should choose what to run. 7 minute read.
Count them
The scoring pass runs one agent per legal category, and there are twelve: Scope of Supply · Commercial Terms · Delivery & Acceptance · Warranty & Liability · Intellectual Property · Regulatory Compliance · Confidentiality & Data Protection · Insurance · Termination · Force Majeure & Resilience · Dispute Resolution · General Provisions.
The analysis pass runs domain specialists, and there are eleven: Scope · Commercial · Delivery · WarrantyLiability · IPRights · Compliance · Confidentiality · Insurance · Termination · ForceMajeure · Dispute.
Line the lists up and one name is missing from the second. There is no GeneralProvisionsAnalyst.
Neither list is annotated in our own documentation. The asymmetry only appears when you read them against each other — the kind of thing a system diagram hides.
The category that is really a switch
The routing rule explains it. A chunk scoring above threshold on a specific category goes to that category's analyst and no other. A chunk scoring above threshold on General Provisions goes to all of them.
So General Provisions does not select a specialist. It disables selection.
That reframes what the twelfth category is. The other eleven answer "which expert should read this?" The twelfth answers "I cannot tell, so everyone should." It is the escape hatch that makes the other eleven safe to trust — without it, a clause that fits no clean category would simply be dropped by a router doing exactly what it was told.
A catch-all is not a weakness in a routing design. It is what lets the router be aggressive. You can afford narrow, confident routing precisely because ambiguous cases have a documented path.
Why pay twelve to save eleven
Now the arithmetic, because this is where it either pays or it does not.
Scoring is not free. Every chunk is scored by all twelve agents, always, whether or not any analyst ever runs. That cost is paid up front on every chunk in the contract.
What it buys is the avoidance of analysis. Without routing, every chunk goes to every specialist — eleven analyses per chunk, every time. With routing, most chunks go to one.
The trade only works under one condition: scoring must be cheaper than analysing. A scorer emits a relevance judgement. An analyst reads a clause, assesses risk against the playbook's rules, and drafts a suggested revision. Those are different amounts of work and they are correctly priced differently.
On our own pipeline the reduction in analysis calls is roughly three-quarters. That figure is ours, measured against our own brute-force baseline, and it is worth stating plainly what it is not: it is not a customer's saving and it is not a benchmark against anyone else's system.
Invert the condition and the design fails. If your scoring model costs about what your analysis model costs, you have added a full pass over every chunk to save a partial pass over some of them. The routing is then pure overhead wearing the costume of an optimisation.
The routing is free. The signal is not.
This is the part worth being honest about, because it is easy to present as novel and it is not.
Conditional routing is a built-in primitive. LangGraph's Graph API documents add_conditional_edges for when you want to "optionally route to one or more edges", and describes it plainly: the method "accepts the name of a node and a 'routing function' to call after that node is executed".
It also ships Send, returned from a conditional edge, for the map-reduce case — "a first node may generate a list of objects, and you may want to apply some other node to all those objects."
That is the fan-out pattern, provided out of the box. Nobody has to build it.
What no framework hands you is the routing function's input. The documentation is explicit that the method takes a routing function; it has no opinion whatsoever about how that function decides. In a contract reviewer the decision is a twelve-dimensional relevance vector produced by twelve model calls — and producing it is most of the engineering.
So the question is not "how do I route?" It is "what does my router know, and what did that cost?" A cheap heuristic is cheap and wrong. A good signal is accurate and has already spent the budget you were trying to save.
What the router actually acts on
Two inputs, not one
The category vector is the input everybody notices. It is not the only one.
The worker also routes from the term mappings produced by the previous stage — the playbook terms that matched this chunk during retrieval. So a chunk can reach an analyst either because it scored highly on that analyst's category, or because it matched a playbook term that belongs to it.
Those are different kinds of evidence and they fail differently. A category score is a model's judgement about what a clause is about. A term mapping is a retrieval result — this chunk came back when we searched for that specific playbook rule. One generalises, one is precise.
Both are worth the complexity, because a clause can be unmistakably relevant to a specific playbook term while scoring unremarkably on the broad category it sits inside. Category routing alone misses it.
The taxonomy is the customer's, and the router inherits it
The categories are not hard-coded. A playbook defines them, and each definition carries a name, a description, trigger keywords and reference terms. The analyst rules are per-playbook too — low, medium and high risk criteria with worked examples and a rationale.
So two companies send the identical contract through and get different analyses, because the router is acting on their taxonomy and their risk thresholds, not ours.
That is the right design for the problem and it moves a burden. The quality of the routing is now a property of the customer's configuration, and the person best placed to break it is the person writing the playbook. Which leads directly to the failure mode.
And it runs on whatever the scoring pass returned
Here is the subtlety that only appears when routing meets failure handling.
The scoring phase is tolerant: it succeeds if at least a configured minimum of the twelve agents return. It does not require all twelve.
So the router can be handed an incomplete vector and it will route anyway. If two or three scorers failed, the categories they covered score as absent rather than as unknown — and absent looks exactly like not relevant.
A chunk can therefore be under-routed by a failure rather than by a decision, and nothing in the output distinguishes the two. The finding that was never produced looks identical to the finding that was correctly judged unnecessary.
That is not an argument against partial-failure tolerance, which is covered in its own chapter and is the right default at this scale. It is an argument for knowing which chunks routed on a complete signal and which did not — because those are different confidence levels wearing the same output format.
Where it collapses
The failure mode is documented in the sibling article on this pipeline's routing, and it is the right one to worry about: overlapping categories.
If two categories describe substantially the same thing, chunks score above threshold on both. The router does the safe thing and sends the work to both analysts. Do that across enough category pairs and routing degrades toward fanning out to everyone — the saving quietly disappears and the bill returns to the brute-force number.
Note where that failure lives. Not in the model, not in the router, not in the code. It lives in how somebody defined the categories in a playbook. It is a configuration problem that presents as a cost problem, which is the hardest kind to diagnose because the system reports no error at all.
The general lesson holds well beyond contract review: any routed multi-agent system inherits the quality of its taxonomy. If your categories are not mutually exclusive, your router cannot be selective, and you are paying for a scoring pass that buys you nothing.
What we would design differently, and the check worth running
How we build it. Treat category overlap as a measured property rather than an assumption. Score a sample of representative documents, then look at how often pairs of categories both clear the threshold on the same chunk. That number tells you whether your routing is actually routing — and it is available before you have spent anything on analysis.
Then make the catch-all narrow on purpose. The category that fans out is the expensive one, so it should be the hardest to trigger, not the easiest. A broad, generous catch-all is a brute-force pipeline with extra steps.
Status, stated plainly. This is a system we built. It runs, it is demonstrable on a call, and it has zero delivered engagements. We build these on request, against your documents and your playbook. No number here describes anyone's business but our own.
The check worth running on your own system, and it needs nothing from us. Take your routing function and log, for one representative batch, how many destinations each item was sent to. If the average is close to your total number of specialists, your router is a fan-out with extra latency, and the scoring pass in front of it is costing you rather than saving you.
About Cognilium Cognilium is an AI engineering company — agent systems, retrieval, knowledge graphs, voice AI and the production plumbing that makes them survive contact with real workloads. https://cognilium.ai · https://www.linkedin.com/company/37180269/
Want to know whether routing would pay on your workload? Book a 15-minute call — we will walk the arithmetic with you, on your categories if you bring them. No deck.
Sources
Sources
Share this article
The review pipeline these articles describe — extraction, category routing, parallel scoring and human escalation — as an engagement.
