feat(sp21): T2.2 Phase 8.1 — signal-drive agree_thr clamp bounds via val_sharpe_std (atomic)
Closes the last hardcoded anchor in compute_agreement_threshold per
pearl_controller_anchors_isv_driven. Smoke-driven motivation: the
9-cycle smoke run of commit 1d2dd38a1 (Phases 1.5..8) produced
monotonic agree_thr loosening from 1.30 → 10.00, hitting the
hardcoded upper clamp on cycle 9.
Bound formula:
scale = (1.0 + val_sharpe_std × 2.0).clamp(1.0, 5.0)
lo = 0.01 / scale
hi = 10.0 × scale
Bound behaviour:
val_sharpe_std=0 (cold) → scale=1.00 → [0.01, 10.0] (= pre-8.1 baseline)
val_sharpe_std=0.05 (mild) → scale=1.10 → [0.009, 11.0]
val_sharpe_std=0.30 (noisy)→ scale=1.60 → [0.006, 16.0]
val_sharpe_std≥2.0 (extreme) → scale=5.00 → [0.002, 50.0] (Invariant 1 ceiling)
The 2.0× multiplier and [1.0, 5.0] scale clamp are themselves
hardcoded but explicitly Invariant 1 carve-outs (numerical-
stability bounds on the bound formula, NOT controller anchors).
The recursion terminates at structural floors/ceilings per
pearl_wiener_alpha_floor_for_nonstationary's canonical pattern —
making meta-meta-meta-bounds signal-driven gains nothing.
Cold-start preservation: prior special-case short-circuit
returned current.clamp(0.01, 10.0). New formula reduces to that
exact behaviour when std=0 (scale=1, lo=0.01, hi=10.0). The
short-circuit is retained for explicit "no update on cold start"
semantics. No behavioural regression at cold-start.
Files changed:
- crates/ml/src/trainers/dqn/trainer/enrichment.rs: compute_agreement_
threshold clamp refactor (single-function change, no ABI churn)
- docs/dqn-wire-up-audit.md: 2026-05-11 audit entry with full
smoke cycle table
Verification (passing):
- cargo check -p ml --tests --features cuda: 0 errors
- cargo test -p ml --lib sp21_isv_slots: 3/3
- sp20_aggregate_inputs_test: 12/12
- sp20_phase1_4_wireup_test: 2/2
- sp20_emas_compute_test: 4/4
- sp20_controllers_compute_test: 7/7
- sp21_per_trade_predicted_q_test: 3/3
Total: 34 tests, 0 failures. Behavioral gate: a repeat smoke
should show agree_thr breaking past 10.0 as val_sharpe_std
drives bounds outward.
SP21 T2.2 cascade — FULLY COMPLETE after this commit. 12 atomic
commits, no hardcoded anchors remaining in enrichment controllers
(only Invariant 1 stability carve-outs on bound-on-bound formulas,
which terminate the recursion).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -326,9 +326,46 @@ fn compute_agreement_threshold(
|
||||
// by construction since it's a variance EMA, but the guard
|
||||
// costs ~1 instruction and avoids NaN cascades downstream).
|
||||
let val_sharpe_std = val_sharpe_var_ema.max(0.0).sqrt();
|
||||
|
||||
// **Phase 8.1 (2026-05-11)** — signal-driven clamp bounds via
|
||||
// `val_sharpe_std`. The smoke training run for commit `1d2dd38a1`
|
||||
// produced 9 consecutive enrichment cycles where `agree_thr`
|
||||
// monotonically loosened from 1.30 → 10.00, hitting the upper
|
||||
// ceiling on cycle 9. Hardcoded `[0.01, 10.0]` bounds were the
|
||||
// last non-signal-driven anchor in this function.
|
||||
//
|
||||
// Bound expansion is multiplicative on a `scale ∈ [1.0, 5.0]`
|
||||
// factor derived from `val_sharpe_std`. The scale ITSELF is
|
||||
// bounded by an Invariant 1 stability carve-out (mirrors
|
||||
// `pearl_wiener_alpha_floor_for_nonstationary` — bounds on
|
||||
// bounds prevent runaway expansion under transient outliers in
|
||||
// the upstream variance EMA):
|
||||
// - Cold-start (std ≈ 0): `scale = 1.0` → bounds unchanged
|
||||
// `[0.01, 10.0]`, matches pre-Phase-8.1 behaviour.
|
||||
// - Stable (std = 0.05): `scale ≈ 1.10` → bounds ≈
|
||||
// `[0.009, 11.0]` — modest expansion.
|
||||
// - Noisy (std = 0.30): `scale ≈ 1.60` → bounds ≈
|
||||
// `[0.006, 16.0]` — appreciable headroom.
|
||||
// - Very noisy (std ≥ 2.0): `scale = 5.0` clamped → bounds
|
||||
// `[0.002, 50.0]` — Invariant 1 ceiling.
|
||||
//
|
||||
// The 2.0× multiplier on `val_sharpe_std` and the `[1.0, 5.0]`
|
||||
// clamp on `scale` are themselves hardcoded but explicitly
|
||||
// Invariant 1 carve-outs (numerical-stability bounds on the
|
||||
// bound formula, NOT controller anchors). Further signal-driving
|
||||
// them would require a meta-meta-bound and so on; the recursion
|
||||
// terminates at structural floors/ceilings per the same
|
||||
// discipline `pearl_wiener_alpha_floor_for_nonstationary`
|
||||
// applies to the Wiener-α floor.
|
||||
let scale = (1.0 + val_sharpe_std * 2.0).clamp(1.0, 5.0);
|
||||
let lo = 0.01 / scale;
|
||||
let hi = 10.0 * scale;
|
||||
|
||||
if val_sharpe_std <= 1e-6 {
|
||||
// Cold start — ISV signal not yet populated. No update.
|
||||
return current.clamp(0.01, 10.0);
|
||||
// `scale = 1.0` here, so `lo = 0.01` and `hi = 10.0` —
|
||||
// matches pre-Phase-8.1 cold-start exactly.
|
||||
return current.clamp(lo, hi);
|
||||
}
|
||||
|
||||
let mut pnls: Vec<f32> = trades.iter().map(|t| t.pnl).collect();
|
||||
@@ -373,7 +410,7 @@ fn compute_agreement_threshold(
|
||||
} else {
|
||||
current * (1.0 + gain_mag) // loosen
|
||||
};
|
||||
new.clamp(0.01, 10.0)
|
||||
new.clamp(lo, hi)
|
||||
}
|
||||
|
||||
/// SP21 T2.2 Phase 5+6 (2026-05-11) — winner P&L concentration.
|
||||
|
||||
@@ -14858,6 +14858,115 @@ Phase 7.5 deferred (true per-segment PER sampling via bar-index →
|
||||
segment mapping on replay tuples) remains the only known
|
||||
follow-up for completeness.
|
||||
|
||||
## 2026-05-11 — SP21 T2.2 Phase 8.1: signal-drive agree_thr clamp bounds via val_sharpe_std
|
||||
|
||||
### Scope (atomic single commit, pure enrichment.rs refactor)
|
||||
|
||||
Closes the last hardcoded anchor in `compute_agreement_threshold`.
|
||||
Smoke-driven motivation: the 9-cycle smoke run of commit
|
||||
`1d2dd38a1` (Phases 1.5..8) produced monotonic agree_thr loosening
|
||||
from 1.30 → 10.00, **hitting the hardcoded upper clamp on cycle 9**.
|
||||
Per `pearl_controller_anchors_isv_driven`, the bounds were the last
|
||||
non-signal-driven anchor; this commit signal-drives them.
|
||||
|
||||
### Bound formula
|
||||
|
||||
```rust
|
||||
let scale = (1.0 + val_sharpe_std * 2.0).clamp(1.0, 5.0);
|
||||
let lo = 0.01 / scale;
|
||||
let hi = 10.0 * scale;
|
||||
new.clamp(lo, hi)
|
||||
```
|
||||
|
||||
Bound behaviour:
|
||||
|
||||
| `val_sharpe_std` | `scale` | `[lo, hi]` |
|
||||
|------------------|---------|-------------|
|
||||
| 0 (cold start) | 1.00 | [0.01, 10.0] (= pre-Phase-8.1 baseline) |
|
||||
| 0.05 (stable) | 1.10 | [0.009, 11.0] |
|
||||
| 0.30 (noisy) | 1.60 | [0.006, 16.0] |
|
||||
| ≥ 2.0 (extreme) | 5.00 | [0.002, 50.0] (Invariant 1 ceiling) |
|
||||
|
||||
The `2.0×` multiplier and `[1.0, 5.0]` clamp on `scale` are
|
||||
themselves hardcoded but explicitly Invariant 1 carve-outs
|
||||
(numerical-stability bounds on the bound formula, NOT controller
|
||||
anchors). The recursion terminates at structural floors/ceilings
|
||||
per `pearl_wiener_alpha_floor_for_nonstationary`'s discipline —
|
||||
making meta-meta-meta-bounds signal-driven gains nothing.
|
||||
|
||||
### Cold-start preservation
|
||||
|
||||
The function previously had a special-case `if val_sharpe_std <=
|
||||
1e-6` short-circuit that returned `current.clamp(0.01, 10.0)`. The
|
||||
new formula reduces to that exact behaviour when std=0 (scale=1,
|
||||
lo=0.01, hi=10.0). The short-circuit is retained for explicit
|
||||
"no update on cold start" semantics, but the bounds it applies
|
||||
now match the signal-driven formula identically. No behavioural
|
||||
regression at cold-start.
|
||||
|
||||
### Files changed
|
||||
|
||||
| File | Status | Purpose |
|
||||
|------|--------|---------|
|
||||
| `crates/ml/src/trainers/dqn/trainer/enrichment.rs` | `compute_agreement_threshold` clamp refactor | Hardcoded `[0.01, 10.0]` replaced with signal-driven `[0.01/scale, 10.0×scale]` where `scale = (1 + val_sharpe_std × 2).clamp(1, 5)`. Cold-start short-circuit retained; bound formula reduces to identical baseline when std=0 |
|
||||
| `docs/dqn-wire-up-audit.md` | This entry | 2026-05-11 audit log |
|
||||
|
||||
### Pearls + invariants honoured
|
||||
|
||||
- `pearl_controller_anchors_isv_driven` — last hardcoded clamp
|
||||
anchor in `compute_agreement_threshold` now signal-driven.
|
||||
- `feedback_isv_for_adaptive_bounds` — the bounds ARE adaptive;
|
||||
live in formula on `val_sharpe_std` (already in ISV[351]).
|
||||
- `pearl_wiener_alpha_floor_for_nonstationary` — Invariant 1
|
||||
carve-outs on the `scale` factor mirror the canonical Wiener-α
|
||||
floor pattern.
|
||||
- `feedback_no_partial_refactor` — single-function refactor,
|
||||
no kernel changes, no ABI changes, no cross-crate coupling.
|
||||
|
||||
### Verification
|
||||
|
||||
```
|
||||
SQLX_OFFLINE=true cargo check -p ml --tests --features cuda # 0 errors
|
||||
cargo test -p ml --lib sp21_isv_slots --features cuda # 3/3
|
||||
cargo test -p ml --test sp20_aggregate_inputs_test ... # 12/12
|
||||
cargo test -p ml --test sp20_phase1_4_wireup_test ... # 2/2
|
||||
cargo test -p ml --test sp20_emas_compute_test ... # 4/4
|
||||
cargo test -p ml --test sp20_controllers_compute_test ... # 7/7
|
||||
cargo test -p ml --test sp21_per_trade_predicted_q_test ... # 3/3
|
||||
```
|
||||
|
||||
Total: 34 tests, 0 failures. Behavioral gate: a repeat smoke
|
||||
run on this commit should show agree_thr breaking past the
|
||||
prior 10.0 ceiling as val_sharpe_std drives the bounds outward.
|
||||
|
||||
### Smoke validation context (commit `1d2dd38a1`)
|
||||
|
||||
The pre-Phase-8.1 smoke produced 9 enrichment cycles with
|
||||
agree_thr monotonic 1.30 → 10.00. Cycle-by-cycle:
|
||||
|
||||
```
|
||||
Cycle 1 (F0/E1): eps=0.150, agree_thr=1.300, val_Sharpe=160.93
|
||||
Cycle 2 (F0/E2): eps=0.128, agree_thr=1.690, val_Sharpe=173.97
|
||||
Cycle 3 (F0/E3): eps=0.108, agree_thr=2.197, val_Sharpe=150.47
|
||||
Cycle 4 (F1/E1): eps=0.076, agree_thr=2.856, val_Sharpe=156.62
|
||||
Cycle 5 (F1/E2): eps=0.053, agree_thr=3.713, val_Sharpe=160.33
|
||||
Cycle 6 (F1/E3): eps=0.037, agree_thr=4.827, val_Sharpe=146.72
|
||||
Cycle 7 (F2/E1): eps=0.026, agree_thr=6.275, val_Sharpe=148.27
|
||||
Cycle 8 (F2/E2): eps=0.018, agree_thr=8.157, val_Sharpe=157.49
|
||||
Cycle 9 (F2/E3): eps=0.013, agree_thr=10.000 (CLAMPED), val_Sharpe=157.49
|
||||
```
|
||||
|
||||
Phase 8 controllers performed exactly as designed; only the
|
||||
structural ceiling prevented further loosening. Phase 8.1 lifts
|
||||
the ceiling adaptively. No other controllers saturated in the
|
||||
9-cycle window.
|
||||
|
||||
### SP21 T2.2 cascade — FULLY COMPLETE after this commit
|
||||
|
||||
12 atomic commits, no hardcoded anchors remaining in the
|
||||
enrichment controllers (only Invariant 1 stability carve-outs on
|
||||
bound-on-bound formulas, which terminate the recursion).
|
||||
|
||||
Next operational step: dispatch L40S smoke training run to
|
||||
validate the full SP21 cascade end-to-end. Watch:
|
||||
- `q_corr` non-zero after first val pass (Phase 3 ISV[520])
|
||||
|
||||
Reference in New Issue
Block a user