A client in the food industry needed a daily retail price survey across Canada.
Every morning, the system had to read promotional flyers from major retailers in every province and extract prices for more than 250 food products. Those prices would feed analytics by retailer, region, product category, promotion, and time.
The source material looked simple at first: retail flyers.
In practice, it was some of the most difficult visual material we had encountered.
Retail flyers are not conventional documents. They are long horizontal layouts, often only a few thousand pixels tall but sometimes approaching forty thousand pixels wide. They contain dense promotional graphics, changing layouts, inconsistent typography, overlapping visual elements, and thousands of individual prices.
Conventional OCR failed badly. Vision models were the obvious alternative, but they also performed poorly.
We needed to understand why.
Agreement Is Not Verification
The first version of the system did not try to make the model smarter. It changed how the model was measured.
Every flyer was read twice.
The first pass read the flyer as a whole and extracted every price it could find. The second pass ignored the first pass completely. It divided the same flyer into a grid and read each section independently.
Only after both reads were complete were their outputs compared.
The load-bearing idea was independence.
A verification derived from the first result is only the model agreeing with itself. It can repeat the same mistake with confidence. It can rationalize an error. It can confirm a hallucination that came from its own earlier output.
Two independent reads are different. Each begins again from the source image. When both reads find the same product and price, the agreement carries evidence. When only one read finds a record, the disagreement becomes a review signal.
Nothing is discarded automatically. Records confirmed by both reads move through. Records found by only one read are queued for review. Disagreement tells us where to look, not what to delete.
That changed the economics of the task. Instead of reviewing every extracted price, a human reviewer looked only at the small fraction of records where the two reads disagreed.
Disagreement Became the Measurement System
The corroboration layer solved the immediate operational problem by reducing review workload.
Then it became useful for something else.
Every disagreement was logged. After several thousand flyers, those records formed a map of the model’s failures.
When we grouped disagreements by flyer width, the pattern was unmistakable.
The close read examined small regions at their original resolution, so its accuracy stayed relatively stable. The wide read faced a different constraint. The complete flyer had to fit inside the model’s fixed input window, whether the flyer was five thousand pixels wide or forty thousand pixels wide.
The wider the flyer, the more the image had to be shrunk before the model could read it.
Eventually, the prices became too small to resolve reliably. At that point, the model did not simply fail cleanly. It began filling in what it could no longer clearly see.
The disagreement data matched that explanation almost exactly.
The important discovery was not just that the model made mistakes. We already knew that. The important discovery was that independent disagreement made the failure mode observable.
Survey, Then Drill
Once the failure mode was understood, the architecture changed.
The new approach borrowed from mineral exploration. First, a survey covers a large area quickly and cheaply, identifying the places worth drilling. Only then is the expensive work carried out.
The first pass became the survey. It scanned the entire flyer and identified regions likely to contain products of interest.
The second pass became the drill. Those regions were revisited at full resolution, recovering detail that had always been present in the original image but was lost when the complete flyer was reduced to fit inside the model.
In practice, roughly one eighth of each flyer received a second pass. The remaining seven eighths were never revisited.
That mattered. A full-resolution pass over the entire flyer would have been too expensive and too slow. A single wide pass was fast but unreliable. The survey-then-drill architecture gave us both: broad coverage where we needed it, and high-resolution precision where it mattered.
Result
The system now produces a national daily survey of retail food pricing.
Every day, it reads promotional flyers from retailers across every province in Canada and extracts prices for more than 250 food products. Those observations feed analytics across retailer, region, product category, promotion, and time.
The architecture changed the economics of the problem.
The first pass is fast. The second pass is precise. Human review is limited to records where the independent reads disagree.
The result is faster than manual review, less expensive to operate, and more accurate than a single AI model working alone.
The broader lesson is that reliability does not always come from making one model better. Sometimes it comes from changing the shape of the system around the model.
When source material is too large, dense, or irregular for a single pass, a broad read can identify candidates, focused reads can recover detail, and independent disagreement can define the human review queue.
The system does not rely on the model being perfectly reliable.
It relies on making uncertainty observable.