Roasting & QC
Every roast, recorded at one sample a second
Live curves from any bridge, cupping panels that report the spread as well as the mean, and gradings that actually quarantine a lot.
The problem
A roast log that a Wi-Fi dropout can silently truncate is not a record. Neither is a cupping score of 85 that came from an 80 and a 90.
A roast survives the network
Bridges stream to a session that buffers durably. When the uplink drops, the bridge replays from its own ring buffer and the curve comes back byte-identical to one that never dropped.
- Rate of rise as a least-squares slope, not finite differencing — noise becomes ±6 °C/min of garbage otherwise
- First crack is an operator mark, because it is a sound somebody hears
- A roaster who walks away from a crashed bridge finds the batch in the log, flagged, not vanished
Scores with their spread
An 85 where every cupper was within half a point is a confident result. The same 85 from an 80 and a 90 is not, and reporting only the mean hides which one you have.
- Blind protocols with per-cupper scores
- Outliers found by median absolute deviation — standard deviation is inflated by the very outlier it should catch
A failed grading stops the coffee
Physical grading quarantines the lot and blocks it from being reserved. Releasing it requires a reason, recorded — a decision someone should have to own.
Everything here is in the API
This area is production.roast.* — the same operations the console calls.