Fix field-help review findings (Fable review + Opus verification)
Test and deploy / test-and-deploy (push) Successful in 1m25s
Test and deploy / test-and-deploy (push) Successful in 1m25s
Highest severity: injected "?" buttons were hijacking the implicit <label> association on 14 fields, so clicking the label text opened the help dialog instead of focusing the input and screen readers lost the input's accessible name. ensureLabelAssociation() now gives each affected input an explicit id/for pairing before the button lands. Also: milestones-ror/actuators topic placement is now text-matched with a warning fallback instead of blind array indexing; every topic warns if it resolves zero containers; dialog temperatures (milestone table, RoR budget, worked example, both charge-setting tables) now respect the °C/°F toggle instead of being stuck in °C; the print worksheet's duplicate curve chart was missing the data-tempc attributes its live counterpart had, so only its title/caption (not its axis numbers) converted; the "?" trigger's touch target grew from 15px to a WCAG-conformant ~25px without changing the visual dot; two genuine coverage gaps closed (a roast-log checklist topic, a curve-reading topic); a worked feasibility example was restored; two claims that didn't trace back to the source worksheet were corrected (an invented "±15 seconds" sweet-spot tolerance, a wrong moisture-to-time mapping); three cultivar cells regained detail lost in the original transcription; a data-transcription footnote no longer leaks into an unrelated topic; checklist items keep their list semantics under VoiceOver. Co-Authored-By: Fable <[email protected]> Co-Authored-By: Opus <[email protected]>
This commit is contained in:
@@ -59,7 +59,7 @@ export const CULTIVARS = [
|
||||
{ name: "SL-28", group: "bourbon", fcAnchor: "8:00-9:00", profile: ["4:45-5:00", "3:45-4:00", "1:20-1:25"],
|
||||
sweetSpot: null,
|
||||
cup: "Red currant, strawberry, passionfruit, floral, intense sweetness",
|
||||
watch: "Belongs with Bourbon despite the Kenyan-fast reputation. A 5:00 yellow / 9:00 FC made it thin and starchy. Naturals do well pushed to 8:00 with 1:15 dev." },
|
||||
watch: "8:00 for naturals, 8:30–9:00 for washed. Belongs with Bourbon despite the Kenyan-fast reputation. A 5:00 yellow / 9:00 FC made it thin and starchy — naturals do well pushed to 8:00 with 1:15 dev." },
|
||||
|
||||
{ name: "Ethiopian Heirloom", group: "ethiopian", fcAnchor: "7:30", profile: ["4:15", "3:15", "1:30"],
|
||||
sweetSpot: null,
|
||||
@@ -89,7 +89,10 @@ export const CULTIVARS = [
|
||||
{ name: "Tabi", group: "hybrid", fcAnchor: "8:00", profile: ["4:15", "3:45", "1:30"],
|
||||
sweetSpot: "narrow",
|
||||
cup: "Orange, melon, tropical/deep fruit, botanical, baking spice, perfumed floral",
|
||||
watch: "Centred on 8:00. Slower → savory + herbaceous; faster → papery and thin." },
|
||||
watch: "Centred on 8:00. Slower → savory + herbaceous; faster → papery and thin.",
|
||||
// Data-transcription note, not tasting/timing guidance — kept separate so it only surfaces
|
||||
// in the cultivar table (via sourceNote below), not wherever `watch` gets reused (sweet-spot).
|
||||
sourceNote: "The source prints the third profile number as ~3:00, which would sum to 7:15 and contradict its own 8:00 anchor; 3:45 is used here to match the stated first crack." },
|
||||
{ name: "H1 / Centroamericano", group: "hybrid", fcAnchor: "7:00", profile: ["4:15", "2:45", "1:30"],
|
||||
sweetSpot: null,
|
||||
cup: "Red fruit / pomegranate / passionfruit, cedar-like woody, nutty, caramel",
|
||||
@@ -97,7 +100,7 @@ export const CULTIVARS = [
|
||||
{ name: "Catimor", group: "hybrid", fcAnchor: "8:30", profile: ["4:45", "4:15", "1:30-2:00"],
|
||||
sweetSpot: null,
|
||||
cup: "Sharp acidity, herbal/woody/vegetal, caramel, red fruit",
|
||||
watch: "Caturra parentage → slow. Before 8:30 expect papery and dry. Naturals and honeys are far better than washed." },
|
||||
watch: "Caturra parentage → slow, 8:30 or later. Before 8:30 expect papery and dry. Naturals and honeys are far better than washed." },
|
||||
{ name: "Sarchimor", group: "hybrid", fcAnchor: "8:30-9:00", profile: ["4:45", "4:15", "1:30-2:00"],
|
||||
sweetSpot: null,
|
||||
cup: "Pleasant acidity, caramel, mild herbal/botanical/woody",
|
||||
@@ -236,11 +239,13 @@ export const SYMPTOM_FIXES = [
|
||||
];
|
||||
|
||||
// Step 9 — charge probe & starting settings by batch, from the operator's own logs.
|
||||
// chargeCLo/chargeCHi are numeric (°C) so dialog renderers can convert them to the current
|
||||
// display unit.
|
||||
export const CHARGE_SETTINGS = [
|
||||
{ batch: "200 g, fast target (FC 7:30–8:15)", chargeC: "133–163 °C", heat: "100%", fan: "30–50%",
|
||||
{ batch: "200 g, fast target (FC 7:30–8:15)", chargeCLo: 133, chargeCHi: 163, heat: "100%", fan: "30–50%",
|
||||
observed: "Four logged roasts landed first crack 7:55–8:13 from here, all holding full heat ~3:00." },
|
||||
{ batch: "200 g, standard (FC 8:45–9:30)", chargeC: "134–182 °C", heat: "89–100%", fan: "40–50%",
|
||||
{ batch: "200 g, standard (FC 8:45–9:30)", chargeCLo: 134, chargeCHi: 182, heat: "89–100%", fan: "40–50%",
|
||||
observed: "Your default; first reduction comes earlier, around 1:00–2:00." },
|
||||
{ batch: "225 g (FC 9:30–11:15)", chargeC: "187–195 °C", heat: "92–100%", fan: "20–30%",
|
||||
{ batch: "225 g (FC 9:30–11:15)", chargeCLo: 187, chargeCHi: 195, heat: "92–100%", fan: "20–30%",
|
||||
observed: "Larger mass pushes everything later — batch size is the strongest correlate with first-crack time in your data." },
|
||||
];
|
||||
|
||||
Reference in New Issue
Block a user