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.