Migration log · entry 014 · October 2026

Reading the mail.

A quote request can arrive as a clean typed purchase order, a handwritten phone-order form, a scrawled requisition — or a photo of a sewing machine with a ruler held against the blades. We built an AI module that reads them all. The hard part was teaching it which ones it shouldn’t answer.

Before writing a line of module code, we did what this series keeps preaching: tested against reality. A stack of scanned quote requests our salespeople had actually received — a handwritten phone order, an apparel maker’s genuinely messy handwritten requisitions, and a boot manufacturer’s clean typed fifteen-line purchase order as the gold standard. On that benchmark we raced two models: the lighter one read twelve of fifteen part numbers correctly; the heavier one read all fifteen — at a cost difference of roughly two cents per document. Accuracy won. Six cents to read a purchase order is the cheapest clerical labor in company history.

Handwriting got its own machinery. A handwritten document triggers three independent reading passes, and the passes vote — part numbers and quantities are normalized and tallied, and consensus wins. The re-read pass that runs when a part number finds no catalog match goes back to the original image carrying a confusion guide for exactly the mistakes handwriting invites: zero versus the letter O, five versus S. It’s the same trick a careful human uses — “that can’t be right, look again” — made systematic.

Extraction is only half the job; the other half is finding what the customer meant in a 79,000-product catalog. Every extracted item runs through four search strategies at once — normalized part number, raw part number with its punctuation preserved, description plus machine model, description alone — and the pooled results are scored: exact matches near the top, known alternates close behind, and a clever third place for superseded numbers, which in our data hide inside product descriptions as “REPLACES:” notes rather than living in any proper field. Items with “OR” between two part numbers get split and searched both ways, because customers write down every number they’ve ever been given. On the typed benchmark list, 23 of 30 items auto-resolved to catalog products — 77% of a salesperson’s lookup work done before they see the request.

Incoming requests are classified as structured or consultative; structured requests flow through extraction and catalog matching, consultative ones get candidate suggestions, and both land in the same salesperson review screen A quote request arrives typed PO · handwriting · email · photos What kind of ask is this? structured list, or a problem to solve? Structured: extract & match consensus reads · 4-way catalog search scored matches, re-read on misses Consultative: interpret machine identified, specs gathered, candidate products suggested — no auto-quote One salesperson review screen confidence-coded · accept becomes a quote Two kinds of request, one human gate: the machine prepares, the salesperson decides.
The fork that made the module honest: extractable lists get matched; problems get interpreted; everything gets a human.

Then a real request taught the module its most important lesson. A salesperson forwarded one containing no part numbers at all: photos of a twin-needle industrial machine’s model plate, a ruler held against the knives showing the spacing, a competitor catalog page for visual reference, and instructions in two languages. Nothing to extract — this customer wasn’t sending a list, they were describing a problem: I have this machine, here’s what it needs to do, figure out the parts. Running that through an extract-and-match pipeline would produce confident nonsense. So the design grew a fork: the module now classifies each request as structured — extractable line items, full pipeline — or consultative — where it identifies the machine, gathers the specs, suggests candidate products, and explicitly flags the request as requiring a salesperson’s interpretation. Both kinds land in the same review screen, confidence-coded, where accepted lines become a quote. The machine prepares; the human decides. Regular readers will recognize the shape — it’s the enrichment pipeline’s philosophy applied to sales: the most valuable thing an AI can know is which jobs aren’t its.

Status, honestly: the module is built and has been exercised against real requests — upload, extraction, matching, and the review screen all working — while its public debut waits its turn behind the launch work that has filled this log for months. Email-in processing and the consultative lane’s deeper catalog knowledge are the designed next steps. When it goes live, a customer will be able to photograph the parts list on their workbench and get back a quote a human has checked — which is, when you think about it, just the 1970s mail-order counter with a very fast clerk.