The extraction schema gains cultivarGroup (typica/bourbon/ethiopian/
hybrid, classified by the LLM from coffee genetics); when the named
variety isn't in the cultivar table, deriveFields now falls back to the
group's first-crack anchor (number still comes only from the reference
table) instead of leaving 1.4 blank and breaking every downstream
calculation. deriveFields exported + unit-tested.
Co-Authored-By: Claude Fable 5 <[email protected]>
- New server/llm.js consolidates ModelRuntime + model selection: admin
setting (app_settings.llm_model) > LLM_MODEL/PREFILL_MODEL env > first
available; used by both prefill and roast evaluation
- GET/PUT /api/admin/llm lists configured models and stores the choice
(validated against the list; empty = auto; audited); admin page gains
an LLM section with a model picker
- All user-facing 'Pi agent' wording is now 'LLM'; no_model error message
no longer references the pi CLI
- /roasts table: Review column removed (review lives in the detail view)
Co-Authored-By: Claude Fable 5 <[email protected]>
- shared/ ports the worksheet's ledger math, time parsing, and reference tables
(cultivars/processes/roast-levels/machine bands) as browser-safe ESM, imported
by both the server and the browser so the arithmetic can't drift between them.
- server/prefill.js runs a zero-tool Pi Coding Agent SDK turn to extract page facts
from a bean product URL, then derives worksheet field IDs deterministically from
reference-data.js — the model never invents a first-crack anchor or a modifier.
- server/alog.js ports the Python alog_parser.py's format handling, including the
tokenizer-based Python-dict-literal-to-JSON conversion the real files need.
- public/ is the worksheet reproduced as a live HTML form: worksheet.css is a
verbatim copy of the paper worksheet's print CSS, print.js bakes values into
the print layout so the same DOM renders both on screen and on paper.
- Ledger math verified against both of the paper worksheet's worked examples;
alog parser verified against all 14 real logs in ref/roasts/.
Co-Authored-By: Claude Sonnet 5 <[email protected]>