diff --git a/app/igneum-app/src/ember.rs b/app/igneum-app/src/ember.rs index 0dfbd87a..9a9f5a35 100644 --- a/app/igneum-app/src/ember.rs +++ b/app/igneum-app/src/ember.rs @@ -906,6 +906,21 @@ pub fn tuned_line(mhs: f64, watts: f64, eff: f64) -> String { format!("Tuned: {mhs:.1} MH/s at {watts:.0} W ({eff:.3} MH/W)") } +/// The row's line for a baseline (measure-only) result: the card was measured as it runs, nothing was set. +/// (6 October 2026: PC 1's rows read "Tuned: 114.2 MH/s at 305 W" for a baseline, which is not a tune.) +pub fn measured_line(mhs: f64, watts: f64, eff: f64) -> String { + format!("Measured: {mhs:.1} MH/s at {watts:.0} W ({eff:.3} MH/W)") +} + +/// The row's line for a plan's result. +pub fn result_line(kind: PlanKind, mhs: f64, watts: f64, eff: f64) -> String { + if kind == PlanKind::Baseline { + measured_line(mhs, watts, eff) + } else { + tuned_line(mhs, watts, eff) + } +} + /// Why a card cannot be tuned beyond measuring, or None when both knobs are available. pub fn control_reason(vendor: &str, limits: &Limits, device: &str, power_control: bool, amd_helper: bool) -> Option { match vendor { @@ -992,6 +1007,13 @@ mod tests { assert!(Run::applied(&step, Readback { limit_w: 90.0, acked: false }, 100.0)); } + #[test] + fn a_baseline_result_reads_measured_and_a_tune_reads_tuned() { + assert_eq!(result_line(PlanKind::Baseline, 114.2, 305.0, 0.3744), "Measured: 114.2 MH/s at 305 W (0.374 MH/W)"); + assert_eq!(result_line(PlanKind::Full, 127.71, 226.8, 0.5632), "Tuned: 127.7 MH/s at 227 W (0.563 MH/W)"); + assert_eq!(result_line(PlanKind::Confirm, 127.71, 226.8, 0.5632), "Tuned: 127.7 MH/s at 227 W (0.563 MH/W)"); + } + #[test] fn limits_never_exceed_the_vendor_or_undercut_the_floor() { let l = l5090(); diff --git a/app/igneum-app/src/engine.rs b/app/igneum-app/src/engine.rs index 0d391cba..697fb64c 100644 --- a/app/igneum-app/src/engine.rs +++ b/app/igneum-app/src/engine.rs @@ -2749,7 +2749,7 @@ impl Engine { c.tune_clock_mhz = row.point.clock_mhz; c.tune_mem_mhz = row.point.mem_mhz; c.tune_source = kind.name().into(); - c.tune_line = crate::ember::tuned_line(row.mhs, row.watts, row.eff); + c.tune_line = crate::ember::result_line(kind, row.mhs, row.watts, row.eff); c.tune_curve = run.rows.iter().map(|r| r.json()).collect(); let control = c.tune_control; if kind == crate::ember::PlanKind::Baseline { @@ -2792,9 +2792,9 @@ impl Engine { let before = run.rows.first().filter(|_| kind == crate::ember::PlanKind::Full).cloned(); let record = crate::ember::record_json(crate::platform::unix_now_f(), &crate::config::fingerprint8(&self.shared.runtime.machine_id), VERSION, crate::manifest::platform_name(), &name, &vendor, &driver, &class, kind, &run.rows, Some(&row), before.as_ref(), floor); self.sweep_say(&format!("TUNE {record}")); - let line = crate::ember::tuned_line(row.mhs, row.watts, row.eff); + let line = crate::ember::result_line(kind, row.mhs, row.watts, row.eff); match kind { - crate::ember::PlanKind::Baseline => self.shared.event("info", &format!("{name}: measured as it runs: {line}{}", if control { String::new() } else { " (measure only; no control on this card)".into() })), + crate::ember::PlanKind::Baseline => self.shared.event("info", &format!("{name}: {line}{}", if control { String::new() } else { " (measure only; no control on this card)".into() })), _ if pinned => self.shared.event("ok", &format!("{name}: best point {} ({line}); your setting stays pinned", point_words(&row.point))), _ => self.shared.event("ok", &format!("{name}: {line}, {} held", point_words(&row.point))), } diff --git a/docs/plans/ember-tune.md b/docs/plans/ember-tune.md index 5b1398f7..b7d08a92 100644 --- a/docs/plans/ember-tune.md +++ b/docs/plans/ember-tune.md @@ -302,6 +302,7 @@ For the 0.3.14 cut (6 October 2026, after run 6), on ember-tune: | Commit | What | Where | |---|---|---| +| (this cut) | a baseline result's row reads "Measured: ..." not "Tuned: ..." (`ember::result_line`); PC 1's 0.3.13 rows read "Tuned: 114.2 MH/s at 305 W" for a baseline | ember.rs, engine.rs + test | | bd7fcf4 | AMD: a power step with no limit readback is applied on the acknowledgement (run 6 aborted the 9070 XT's ladder at step 1 on "card reports 0 W") | ember.rs `Run::applied` + test | | 200362a | `task_exe` prefers the installed exe for every path that is not itself an install candidate; the helper's `reregister` verb; the clock ladder and floor to 45%; a chosen point on the floor says so; the fleet page's team rows | powertask.rs, ember.rs, engine.rs, site | | 5165de7, 9fba504, 5b0968f | Ember 2's Settings (goal, price, climb), £/day and the curve on the card; the playbook's AMD watts source and kit-7 preference; run 6 notes | ui, relay/playbooks, docs |