Addresses 5 IMPORTANT items from A13 code-quality review:
1. apply_pearls_to_slot helper extracted into sp4_wiener_ema.rs.
Collapses ~30 lines of read_volatile / pearls_ad_update / write_volatile
per-slot block into a single unsafe fn. 12 launchers now consume the
helper (5 SP4 producers A5-A9, 6 A13 retrofits A13.0-A13.5, plus the
inline label-scale block in aux_heads_forward Step 2b — including 2
apply_pearls closures inside multi-slot launchers and the cross-boundary
GpuExperienceCollector consumer). Pearl C rate_deficit site untouched
(different mapped-pinned buffer + Rust ema array, doesn't share the
helper's pointer-based contract).
2. REWARD_COMPONENT_COUNT named constant added next to
REWARD_POPART_EMA_INDEX in gpu_dqn_trainer.rs. Replaces 3 hardcoded `6`
literals across collector launcher (block_dim, Pearls A+D loop) and
training_loop fold-reset range arithmetic. Mirrors MOE_NUM_EXPERTS /
SL_NUM_FEATURE_GROUPS invariant-guard pattern with debug_assert_eq! in
the collector launcher. Kernel literal `6` retained (allows nvcc full
unroll); kernel comment now documents the host-side invariant.
3. SP4_PRODUCER_COUNT, SP4_WIENER_FLOATS_PER_SLOT, SP4_WIENER_TOTAL_FLOATS
promoted from fn-local consts inside `pub fn new` to module-level
`pub const`s in gpu_dqn_trainer.rs, re-exported via cuda_pipeline::mod.
All 13 redeclarations in tests/sp4_producer_unit_tests.rs replaced
with single `use ml::cuda_pipeline::SP4_PRODUCER_COUNT;` import. Future
buffer growth requires single-file edit.
4. _ema_alpha_unused: f32 caller-compat shim removed from 6 retrofitted
launchers (launch_h_s2_rms_ema, launch_aux_heads_loss_ema,
launch_vsn_mask_ema, launch_moe_expert_util_ema, launch_iqn_quantile_ema,
launch_reward_component_ema_inplace) and the FusedTrainingCtx proxy.
All callers in training_loop.rs + fused_training.rs updated to drop
the unused argument per feedback_no_legacy_aliases (no soft-deprecated
wrappers; rename all call sites directly). Doc-comments updated from
"α dropped per SP4 — argument preserved so callers compile unchanged"
to "α derived adaptively from per-slot Pearls A+D Wiener state — see
sp4_wiener_ema::pearls_ad_update".
5. Stale doc reference fixed at gpu_aux_heads.rs:391 — comment referenced
non-existent launch_label_scale_ema_with_pearls function. Now correctly
points at the inline Pearls A+D block in GpuDqnTrainer::aux_heads_forward
Step 2b (which now consumes apply_pearls_to_slot).
Pure refactor — no spec or behaviour change. Same kernel launches, same
Pearls A+D semantics, same ISV slot writes.
cargo check -p ml --offline clean (12 pre-existing warnings, no new);
cargo test -p ml --lib --offline sp4_wiener_ema 7/7 passing
(6 originals + apply_pearls_to_slot_pearl_a_bootstrap_path);
cargo test -p ml --lib --offline state_reset_registry 3/3 passing.
Refs: A13 review (commits aada419de..c5add566d).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>