The time-share model is falsified by this branch's own measurements (a
GGUF decode at ~1.9 W per GPU-second beside a ~17 W job; contended
figures 3-15x the sole-user figure), so it is no longer a figure:
- apportion(): this process's own GPU time first, from its own clients
(one gone: GpuClientVanished). None spent: 0 uJ, exact, HwShunt, with
no rail, currency or other-client check. Spent, but under 99% of every
client's time: EnergyError::GpuShared { self_ns, all_ns }. ModelBased
is no longer a GPU grade; GpuShare.provenance is now a method
(HwShunt), rail_uj / all_ns are None for an exact zero.
- combine(): CPU figure and no GPU figure is SpanSource::CpuOnly, the CPU
alone, HwShunt, Partial, with why; the fallback meter only when the CPU
counter gives none.
- fabric live tune: only spans metered Whole compete; a Partial one voids
the tune. harness-econ refuses CpuOnly as a dispatch total.
- gguf_energy prints the CPU-only line; the hardware test expects
GpuShared and CpuOnly under contention and exact zeros beside a
burning child and across its exit.
Co-Authored-By: Claude Opus 5.5 <[email protected]>