fix(cpu): the nominal clock was reported as the current one, on every core
`cpu.core.{n}.frequency` read 4400 for all 24 logical processors of a 9900X,
identically, idle and under load, across repeated samples. It is declared
`Measured` and described as "Current core clock", and it was neither.
`CallNtPowerInformation` returns `CurrentMhz == MaxMhz` on Windows 10 and
later whatever the cores are doing. WMI agrees with the wrong answer —
`CurrentClockSpeed` and `MaxClockSpeed` are both 4400. Meanwhile
`\Processor Information(*)\% Processor Performance` showed those same cores
at 105–119% of nominal, boosting past 5GHz and differing from one another.
This is why Task Manager reads the performance counter instead.
So the value was a specification wearing a measurement's provenance, on
every core of every Windows machine, and it is exactly what the ontology
exists to prevent. Every conformance test passed, because none of them asks
whether a value claiming to be current ever changes.
`CurrentMhz == MaxMhz` is now reported as no current reading, using the zero
the resolver already reads as "not measured" — the same idiom `min` uses two
lines below. The absence names the cause rather than saying "no per-core
clock reported": on Windows this is not a missing reader, the API answers
and its answer is the wrong quantity.
This does suppress the genuine case of a core sitting exactly at nominal.
That trade is deliberate and the comment says so: the two are
indistinguishable through this API, and an absence that is occasionally too
cautious beats a number that is wrong on every boosting core.
The test module above this already carried "Per-core figures must be
genuinely per-core, not one number replicated" — the same class, caught for
utilization when `GetSystemTimes` made 24 identical bars look measured.
Frequency had it too and nobody looked.
`a_nominal_clock_is_not_reported_as_the_current_one` covers the three cases
without hardware.
Open work item 2 records what reporting the real figure needs:
`PdhGetFormattedCounterArrayW` over the wildcard instance, two collections
with an interval between them because it is a rate counter — which is why it
was not simply done, since it puts a sleep in the snapshot path.
`src/hwmon/cpu_temp.rs` has the single-value PDH pattern to copy, and the
provenance would be `Derived`, not `Measured`.
Also renumbers the two ordered lists in HANDOFF, which had drifted; the
7.0.0 list's own references to "items 1 and 2" still resolve.
Verified: `simon get cpu.core.0.frequency` exits 2 with the reason. fmt,
clippy, both cross-target checks, 7 platform::windows unit tests and 59
conformance tests pass.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> A
Adam Erickson committed
661702053d12698d2e7a6527dfae1e8b57592162
Parent: 00ffef8