CASE 02 · ITAD intake + routing

An item identity is only the start. The app still has to decide where the thing goes.

A warehouse photo starts the item record. Vision and OCR propose an identity, pricing code checks the evidence, and routing rules decide what the evidence allows. A manager owns the exception, and a technician gets a physical From → To move.

12 minute case studyReal systemNames and identifiers removed
POPULATED PRODUCTION SCREEN
Populated production ITAD capture screen with item identity and routing instruction
A captured Kenwood CD player has a parsed identity, a route, a labor rule, and a prominent destination for the technician.
ReactTypeScriptExpressSQLiteCloudflare R2OpenAI visionFly.io
38

manager decisions in the first shadow comparison

A dated production sample

42%

manager agreement in that sample

16 agreements and 22 overrides

5

physical handling classes

Compact through oversized

180d

private photo retention

ITAD photos stay out of Google Drive

The next person needs an instruction, not an AI paragraph.

Mixed electronics arrive faster than a manager can research every item. The technician needs a short answer: what is it, should anyone spend time on it, and where should it go now?

The item begins on the captured holding cart. A route sends it to process/batch, lot staging, parts, scrap, or manager review. Technician Work shows the move. A manager decision can create a second move from the review rack to the final shelf.

A correct value in a database is useless when the item is still sitting on the wrong cart.

PRODUCTION TECHNICIAN QUEUE
Populated production Technician Work queue with physical From and To destinations
The queue converts a routing result into a shelf move and a placed confirmation.

Capture keeps moving while identification and pricing run behind it.

The Capture tab keeps the camera action above the fold. Stream, bin, and operator are defaults. A technician can take the next photo without waiting for the previous item to finish identification and pricing.

If the connection drops, the browser stores captures in IndexedDB and replays them in order. Each capture has a client request id, so a reconnect cannot create a second item from the same request.

The background path sends up to four photos for structured extraction. It asks for identity, visible text, physical handling class, missing evidence, data risk, and exceptions. Invalid structured output does not erase the raw OCR. Reprocessing keeps the stronger prior identity instead of replacing it with a confident-looking regression.

  1. 01

    Capture

    One photo creates the record. More photos can be attached when the label needs another angle.

  2. 02

    Identify

    Vision and OCR propose category, brand, model, family, visible text, handling class, and missing evidence.

  3. 03

    Price

    A query ladder searches sold evidence, removes mismatches, and records why results were accepted or rejected.

  4. 04

    Route

    Handling thresholds, identity grade, comp quality, data risk, and exception rules decide what can happen automatically.

  5. 05

    Move

    Technician Work shows the current location and final destination. The operator confirms placement.

A $30 phone and a $30 server do not deserve the same labor rule.

I rejected one universal price threshold because physical handling changes the economics. Compact and portable items can qualify for individual processing at $30. Shelf items use $50, bulky items $55, and oversized items $125. The scrap ceiling is one-third of the processing threshold.

Those numbers are operating rules for this warehouse. They are not universal appraisal advice. A manual handling classification outranks inference, and data-bearing risk blocks automatic scrap.

When the evidence is weak, Process as Lot gives us a reversible place to put the item. Unknown identities, weak comp sets, and consequential exceptions go to Manager Review.

Compact / portable
$30 process · $10 scrap ceiling
Shelf
$50 process · $16.67 scrap ceiling
Bulky
$55 process · $18.33 scrap ceiling
Oversized
$125 process · $41.67 scrap ceiling

The manager sees the guess and the reason it is still blocked.

The review screen keeps identity grade, handling threshold, pricing distribution, query attempts, accepted-comp count, auto guess, confidence, and blockers together. The manager changes route, testing instruction, labor limit, and destination as one decision.

The screenshot below shows an exploratory identity with two accepted comps. The system has a medium-confidence scrap guess, but the identity grade and comp count do not authorize it. The route remains Manager Review.

The manager gets final say. Late pricing or reprocessing cannot silently overwrite that decision. The comparison event keeps both the proposal and the human route for later analysis.

REAL MANAGER REVIEW
Production Manager Review screen with identity grade, price evidence, handling threshold, blockers, and route controls
A guess can exist without becoming an authorized route. The blockers stay visible beside the decision.

After 38 decisions, the manager still had to stay in the loop.

In the first dated shadow comparison, managers agreed with 16 of 38 proposals and overrode 22. The system proposed Lot Candidate 32 times. Managers chose Process/Batch 17 times, Lot Candidate 15 times, and Scrap 6 times.

The largest correction was Lot to Process/Batch, with 14 cases. Thirty-two items had zero accepted comps and low-confidence guesses. With those results, I kept the system in shadow mode and started collecting better outcome data.

A separate 30-item test found that higher-effort vision improved several identities and moved zero items out of review under the rules at the time. Better recognition changed some identities and zero routes. The routing policy still lacked enough coverage.

Production found problems that a happy-path demo never would.

The first state design embedded full photo data. With 16 items, the store reached about 44 MB and state calls took 5–9 seconds. Separating photo blobs reduced the observed production store to about 83 KB, with repeated state calls in the 1–3 ms range during that deployment window.

At 326 items and 367 photos, the UI requested nearly every thumbnail at once. Short caching caused request storms, and disabled retries could leave the page stuck. The fix loads thumbnails near the viewport, uses long caching on versioned URLs, retries state queries, and gives the operator a visible Retry action.

Reprocessing caused a different class of failure: bogus year-like models, weaker price queries, duplicated OCR, and timeouts. Generic-model rejection, OCR caps, prior-identity preservation, and controlled batches turned the next 29-item run into six identity-grade improvements with zero grade regressions.

One capture starts the research. The labor baseline is still missing.

One capture creates the record and starts background work. Defaults remove repeated stream, bin, and operator entry. Offline replay prevents recapture after a connection loss. Technician Work shows one From → To move and supports bulk confirmation.

The number labeled “Min to Route” measures elapsed wall time. It does not measure hands-on labor or time saved, so I am not using it as an ROI metric.

WHAT I WOULD NOT CLAIM

Here is what remains unmeasured or unresolved.

Next: Device specs reportI wanted one device report I could trust more than a pile of screenshots. →