Selective PnL Overhaul
Standing law: profitable selective long+short — phases, kill criteria, Phase 0 levers.
OVERHAUL_PLAN.md
# Selective PnL Overhaul (standing law) **Updated:** 2026-07-30 **Status:** Phase 0 done; Phase 1 observe (regime v1.1 + reclaim gates seasoning). **Dashboard:** `overhaul.html` + Overview banner (source: `config/overhaul_board.json`). **Archive:** Jul-9 codebase audit → [`docs/archive/plans/OVERHAUL_PLAN_2026-07-09_audit.md`](docs/archive/plans/OVERHAUL_PLAN_2026-07-09_audit.md). ## Binding goal Make money with **selective** long **and** short trades on Kraken `PF_XBTUSD`. Empty days are success. Frequency is not a KPI. ## Binding principles (non-negotiable) 1. Profit > frequency (target ≤1–2 fills/day). 2. Bidirectional: longs in clear uptrends; shorts only in `strong_downtrend` with stricter gates. 3. Flat in `range_or_weak_trend` live until a dedicated book clears OOS. 4. ATR-only initial stops — no S/R tighten while early amputators are off. 5. No early partial / gain-lock until ≥1.5–2R MFE (Phase 0: both disabled). 6. Promote only on shadow + harness OOS evidence (`promote_anything=false` until Phase 3 gate). 7. Kill new entries if rolling live PF < 0.8 over ≥8 closed trades. 8. Never re-expand density to 5 trades/day + 60m cooldown without operator gate + PF ≥1.2 over ≥10 trades. Agents must follow [`.cursor/rules/09-selective-pnl-overhaul.mdc`](.cursor/rules/09-selective-pnl-overhaul.mdc). Any phase/lever change updates **both** this file and `config/overhaul_board.json`. ## Phase 0 — live safety (done) | Lever | Target | |-------|--------| | `MAX_TRADES_PER_DAY` | 1 | | `COOLDOWN_MINUTES` | 360 | | Size / daily loss | ~$40 position / $2 risk / $5 daily on ~$100 equity | | `SCORING_RANGE_THRESHOLD` | 999 (flat in range) | | Short gates | th 82, sep 24, ext ≤1.2 ATR, short net R 1.60 | | Shorts outside SD | blocked (`SCORING_SHORT_ONLY_STRONG_DOWNTREND=true`) | | `PRE_PARTIAL_STOP_LOCK_ENABLED` | false | | `PROFIT_TAKING_ENABLED` | false | | `ENTRY_SR_STOP_ENABLED` | false (ATR-only stops) | | Regime v1.1 | ADX momentum, structure demotion, breakout, hysteresis, B13 promote bypass (bot 5.2.19) | **Apply:** `tools/apply_kraken_selective_risk_env.sh` + `tools/apply_kraken_strategy_phase_env.sh`. Do **not** use the old expanded micro-live profile (5/day, 60m). **Accept:** `status.risk_limits.max_trades_per_day=1`; range threshold 999; no gain-lock/partial; no S/R stop; health ok; `overhaul.html` live. ## Phase 1 — observe (7–14d, in progress) Measure trades/day, MAE/MFE R, long vs short PF, regime flip rate (`regime_raw` vs committed), primary blockers. No new live levers until regime v1.1 seasons. **Accept:** ≤2 trades/day actual; no range fills; rolling n≥5 with PF≥1.0 or flat-with-controls; regime flips below Jul 26–30 baseline. ## Phase 2 — shadow / harness queue (≤3 candidates) 1. `short_discipline_only` 2. `tight_short_no_range` (confirmation) 3. Bidirectional swing paper (not Strategy 2.0 long-only as the path) **Accept:** ≥5 shadow cycles, ≥1 real short sample, shadow PF > prod +0.2 **and** harness `oos_summary.profit_factor` same bar. ## Phase 3 — one-lever live promote One lever at a time (never density first). Operator gate only. `promote_anything` stays false for auto. ## Kill / rollback - Rolling PF < 0.8 over ≥8 closed trades → halt new entries / connection-only. - Daily loss cap hit >1×/week → cut risk or trades/day to 1. - Any range fill or short outside `strong_downtrend` after Phase 0 → treat as config regression; revert env block. - Rollback: restore prior markers in `/etc/crypto-bot-kraken.env`; restart `cryptobot-kraken`; verify health. ## Explicit non-goals (Phase 0) - No Strategy 2.0 long-only promotion to live. - No auto `promote_anything=true`. - No Android offload / async rewrite in Phase 0. - No raising position size until PF recovers.