D88 — Per-phase work counters and route CPU time¶
Decision¶
The router counts its work per phase (expansions, flood cells, searches, cell and fixed-copper checks, cost-field cells, commits, rips) and reports it in the route JSON; bench/run.py records each route's CPU time, and compare_runs.py reports CPU changes at equal work beyond the noise band of the byte-identical boards. The --work budget is unchanged. Quality is judged at equal work, speed at equal wall time (doc 10 §5, gate 5)
Alternatives¶
A work budget weighted by calibrated per-operation costs; weights fitted at build time; CPU time as a gate
Reason¶
Counting is deterministic and explains where a budget went. Weighted work narrows the gap between work and time but cannot close it: the cost field took 3 s on Metal and 13 s on the CPU for the same board, so no single set of weights is time-faithful on every platform, and each re-fit shifts every stored result. Weights fitted per build would make output depend on the machine. CPU time is too noisy for a gate: byte-identical boards moved +9 % to +14 % between two runs (doc 10 §6)