The collector was created only in _maybe_init_cp_l3 (enable_cp_l3 path), so a pure-L2-pooling deployment (no L3) got no L2 metrics -- exactly the config under perf investigation. Move creation into _cp_maybe_collect_metrics: lazily create on first emit, gated on enable_metrics + the shared-L2 allocator existing (L2 pooling on). collect() already handles l3_stats=None, so it reports L2 occupancy/commit/evict with or without L3. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>