Per spec §9.2 (3.5.3). After K consecutive losing trades, force Hold for
M bars. Counter at COOLDOWN_BARS_REMAINING (slot 435) part of state —
model can reason about it.
Initial K=5, M=20 hardcoded sentinels. ISV-driven K via MEDIAN_STREAK_
LENGTH (slot 442) producer using two-heap median tracking is documented
Phase 3.5.3 follow-up. ISV-driven M from vol_normalizer time-to-mean-
reversion is also follow-up.
4 ISV slots: 433 K_THRESHOLD, 434 M_BARS, 435 BARS_REMAINING,
442 MEDIAN_STREAK_LENGTH. New sp15_cooldown_consecutive_losses
MappedF32Buffer tracks streak counter persistent across kernel calls.
5 fold-reset registry entries + dispatch arms (4 ISV slots + scratch
buffer reset).
Per spec post-amendment-2 fix: streak counter only updates on trade-close
events; per-bar non-close calls just decrement the cooldown counter. The
trigger gate fires only when a trade-close lands during an inactive
cooldown — re-arming mid-cooldown would extend the gate every closed
trade during the freeze, which is not the spec.
Per established Phase precedent: kernel + launcher land first; action-
selection wiring (force Hold while cooldown_remaining > 0) deferred to
follow-up commit per feedback_no_partial_refactor.
Anchor test 2.12 cooldown_engagement (Phase 2C / Phase 3.5 paired) —
green via this commit.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>