da684b240d
The decode/prefill PROFILE line splits expert-disk time into service (overlapped async dispatch) and wait (blocking stalls), but every accumulation site wrote t_edisk and nothing ever wrote t_ewait, so the wait column always printed 0.000s. Worse, the accounted sum used the dead t_ewait instead of t_edisk, so the entire disk-read stall was excluded from accounted and silently fell into the other bucket. On a disk-streaming MoE the effect is large: other reads as ~60% of decode when it is really the expert-load stall. Route the three blocking sites (non-PIPE parallel load, the Metal drain barrier, and the per-expert pipe_wait in the CPU matmul loop) to t_ewait, keep the async dispatch in t_edisk, and include both in accounted. Profiling-only; no behavioural change. Before, on a 168-expert model: expert-disk 25.077s service / 0.000s wait | ... | other 28.401s After: expert-disk 0.111s service / 26.948s wait | ... | other 3.390s other now holds only the genuinely-unbucketed work (router, norms).