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.
manager decisions in the first shadow comparison
A dated production sample
manager agreement in that sample
16 agreements and 22 overrides
physical handling classes
Compact through oversized
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.
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.
- 01
Capture
One photo creates the record. More photos can be attached when the label needs another angle.
- 02
Identify
Vision and OCR propose category, brand, model, family, visible text, handling class, and missing evidence.
- 03
Price
A query ladder searches sold evidence, removes mismatches, and records why results were accepted or rejected.
- 04
Route
Handling thresholds, identity grade, comp quality, data risk, and exception rules decide what can happen automatically.
- 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.
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.
Here is what remains unmeasured or unresolved.
- Current thresholds encode one operation and should not be presented as universal appraisal rules.
- Price providers and model calls can time out or change behavior.
- Older records can lack usable migrated photos.
- Manager agreement measures agreement, not resale value or profit.
- SQLite on one Fly volume is a deliberate single-machine architecture.
- Current per-item labor, adoption, API cost, and realized financial impact remain unmeasured.