# TUTOR CHECKLIST — Trading Engine Mavis

> **Scopo unico**: garantire che le **REGOLE** del progetto siano applicate costantemente.
> **NON** controllo processi (è il Supervisor), **NON** modifico codice (è il Coder),
> **NON** faccio audit tecnico indipendente (è il Verifier).
>
> **Io faccio UNA cosa**: osservo se le REGOLE sono rispettate, e se trovo violazioni
> le **riporto al Verifier** che farà audit indipendente e deciderà se passare a Coder.
>
> **Flusso**: **Mavis (rileva) → Verifier (audit + pass/fail) → Coder (fix) → disciplined-coder (controlla Coder) → Mavis (riverifica)**
>
> **Owner**: Mavis · **Path**: `G:\AI TRADING ENGINE\live_deploy\_TUTOR_CHECKLIST.md`

---

## ⚡ SEZIONE 1 — LE REGOLE DA VIGILARE (le uniche cose che mi riguardano)

### 1.1 I 14 paletti Charter + proposta P015

Per ogni paletto: **dove deve essere applicato** + **dove vado a verificare**.

| Paletto | Regola | Dove viene applicata (punti di controllo) | Dove verifico |
|---|---|---|---|
| **P001 NO_MEDIA_UP** | Se posizione già aperta su Bybit per symbol → no nuova entry, MONITOR mode | `live_engine.py:391-402` + check Bybit pre-exec + `charter_engine.py:BybitClient.place_charter_entry` | `live_engine.py`, `charter_engine.py`, log esecuzioni |
| **P002 NO_DOUBLE_BUY** | No 2 entry live stesso symbol via bot | `live_engine.py:414-424` + anti-doppia candela | `live_engine.py`, `state_live.json` |
| **P003 FEE_PINE_IMPLICITA** | Fee 0.06% per lato (0.0006), MAI 0.1% Bybit std, MAI 0.075% taker | `web_solver_v6.py:34` (CHARTER dict), `charter_config.py:CHARTER.commission_pct` | `web_solver_v6.py`, `charter_config.py`, eventuali override locali |
| **P004 LEVA_3X_CHARTER** | Leva 3x per TUTTI gli asset, mai default simbolo, `set_leverage(3)` prima di market | `live_engine.py:297`, `bybit_demo_client.py:set_leverage`, `charter_config.py:SETUPS[*].leverage` | codice live + log ordini (campo `leverage`) |
| **P005 TP_50_50** | TP1 50% a +3%, TP2 50% a +5%, mai TP singolo a TP2 (safety fallback TP1 ok) | `live_engine.py:237-337 (place_entry_with_tpsl)` | `live_engine.py`, log esecuzioni |
| **P006 SL_ATR_2X_CLAMP** | SL = max(-2*ATR/entry, -0.03) clampato, MAI meno del -3%, MAI più del -3% | `live_engine.py:237-280` + `charter_config.py:SETUPS[*].sl_clamp_min/max` | `live_engine.py`, `charter_config.py` |
| **P007 REGIME_FILTER** | ADX>20 + EMA50 side-aligned, rivalidato pre-exec | `live_engine.py:215-233 + 406 + 427` | `live_engine.py`, log skip-regime |
| **P008 MAX_5_POSITIONS** | `MAX_OPEN_TRADES_PORTFOLIO=5` (deroga 12/07), Charter primary hanno priorità | `live_engine.py` (riferimento `MAX_OPEN_TRADES_PORTFOLIO`) + `charter_config.py` | log skip-max-open + conteggio posizioni aperte Bybit |
| **P009 ANTI_DOPPIA_CANDELA** | `state.last_signal_bar[setup_name]` confrontato con timestamp [-2] | `live_engine.py:354-359` | `live_engine.py`, `state_live.json` |
| **P010 CANDELA_-2** | Segnale sempre su [-2] (chiusa), MAI [-1] (in formazione) | `live_engine.py:151-189 (compute_indicators + detect_signal)` | `live_engine.py` |
| **P011 SET_LEVERAGE_PRIMA** | `set_leverage(symbol, lev, side)` SEMPRE prima di `create_market_order` | `live_engine.py:297` (sequenza fissa) | `live_engine.py`, log webhook (campo `leverage` prima di `ORDER OK`) |
| **P012 CHARTER_PRIMARY_NO_AI_REDUCE** | Setup `is_primary=True`: AI Enhancer NON riduce size, size sempre piena | `live_engine.py:433-435 + 447` | `live_engine.py`, log signal-enhancer |
| **P013 SL_NATIVO_BYBIT** | SL via `set_trading_stop` (mark price trigger), MAI Python locale | `bybit_demo_client.py:129-159` | `bybit_demo_client.py`, log set_trading_stop |
| **P014 NO_FRONT_LEVERAGE_OVERRIDE** | Bypass `set_leverage` solo se già 3x, mai override runtime | `bybit_demo_client.py:set_leverage` con flag bypass | `bybit_demo_client.py` |
| **P015 FIXED_MARGIN_500_3X (proposta)** | Ogni ordine Bybit = margin 500 USDT × leva 3x Charter = nozionale 1500 USDT, **indipendentemente dalla strategia** (Charter/Rettangolo/VPTR3/Square) | `charter_config.py:SETUPS[*].margin_usdt` + `webhook_config.py:MANIFESTO_ORDER_VALUE_USD` + `rettangolo_config.py:ORDER_VALUE_USD` + `square_*` (se esiste) | tutti i config di sizing + `orders.log` (campo `notional` per ogni riga non-audit) |

### 1.2 Coerenza naming & semantica

| Cosa | Cosa è "regola rispettata" | Dove verifico |
|---|---|---|
| Naming 500/1500 tra `webhook_config.py` e `rettangolo_config.py` | `webhook_config.MANIFESTO_ORDER_VALUE_USD` = 500 = MARGIN (commento esplicito) · `rettangolo_config.ORDER_VALUE_USD` = 1500 = NOZIONALE (commento esplicito). Stesso numero non può indicare cose diverse. | `webhook_config.py`, `rettangolo_config.py` |
| Drift `charter_config.py` vs `CHARTER.md` sub-repo | Qualsiasi modifica a `charter_config.py` riflessa in `GIT_REPOS\trading-engine-mavis\CHARTER.md` entro stesso commit | `charter_config.py` ↔ `CHARTER.md` |
| Drift `charter_config.py` vs `STRATEGY_RULES.md` | `charter_config.py:SETUPS` riflesso in `STRATEGY_RULES.md` (tabella) | `charter_config.py` ↔ `STRATEGY_RULES.md` |
| Drift `paletti.py` vs `CHARTER.md` | Qualsiasi modifica a `paletti.py` riflessa in `CHARTER.md` sezione "Vincoli Charter" | `paletti.py` ↔ `CHARTER.md` |

### 1.3 Strategie attive: devono essere TUTTE Charter-izzate

| Cosa | Cosa è "regola rispettata" | Dove verifico |
|---|---|---|
| Strategie con processi live attivi | Ogni strategia (rettangolo, vptr3, square, ecc.) DEVE essere documentata in Charter (paletti + SETUPS + CHARTER dict) OPPURE essere `enabled=false` ovunque | processi attivi (elenco Python) ↔ `charter_config.py` + `STRATEGY_RULES.md` |
| Rettangolo (5 asset a 30m) | Documentato in `STRATEGY_RULES.md` sezione "📐 RETTANGOLO" + Charter compliance per sizing (P015) | `STRATEGY_RULES.md`, `rettangolo_config.py`, `sltp_engine.py` |
| VPTR3 (8 setup, 1 attivo) | Documentato in `STRATEGY_RULES.md` sezione "📐 VPTR3" + sizing via `webhook_config.py` (P015) | `STRATEGY_RULES.md`, `webhook_config.py`, `vptr3_assets.csv` |
| Square (se attivo) | Documentato Charter (attualmente NON lo è — vedi CRIT/WARN del primo report) | `square_monitor.py`, `square_strategy.py`, Charter |

---

## 🔄 SEZIONE 2 — COME VERIFICO (metodo, non azione)

Per ogni regola sopra, il mio **metodo** è:

1. **Leggo** il file di riferimento (codice o config)
2. **Confronto** con la regola dichiarata
3. **Se trovo scostamento**: raccolgo evidenza (file:riga, log, ID ordine)
4. **Se trovo scostamento**: scrivo report `🔴 CRIT-[N]` o `🟡 WARN-[N]`
5. **Invio** al **Verifier** per audit indipendente
6. **Attendo** pass/fail dal Verifier
7. **Se pass**: Verifier decide se passare a Coder per fix
8. **Dopo fix Coder**: riverifico che la regola sia ora rispettata

**Cosa NON faccio** (anti-pattern):
- ❌ NON controllo se Supervisor è vivo (è il suo mestiere)
- ❌ NON killo/riavvio processi (è il Supervisor)
- ❌ NON modifico codice (è il Coder)
- ❌ NON faccio audit tecnico indipendente (è il Verifier)
- ❌ NON correggo drift documentale da solo (lo segnalo, decide Mattia)

---

## 🚨 SEZIONE 3 — TRIGGER DI ESCALATION (regole violate, non processi morti)

| Trigger | Tipo | Azione |
|---|---|---|
| `orders.log` riga con `notional < 500` (escluso `strategy=audit_test`) | 🔴 CRIT | Report immediato al Verifier, con ID ordine e timestamp |
| `orders.log` riga con `leverage != 3` (eccetto `bypassed`) | 🔴 CRIT | idem |
| `orders.log` riga con `strategy` non documentata in Charter | 🔴 CRIT | idem |
| `charter_config.py:SETUPS[*].margin_usdt != 500` (con P015 attivo) | 🔴 CRIT | idem |
| `webhook_config.MANIFESTO_ORDER_VALUE_USD` o `rettangolo_config.ORDER_VALUE_USD` con commento che mente sulla semantica (es. "nozionale" su numero che è margin) | 🔴 CRIT | idem |
| Drift `charter_config.py` vs `CHARTER.md` non risolto entro 24h | 🟡 WARN | idem |
| Drift `paletti.py` vs `CHARTER.md` non risolto entro 24h | 🟡 WARN | idem |
| Strategia live attiva (processo) NON documentata in Charter/STRATEGY_RULES.md | 🟡 WARN | idem |
| `CHARTER.md` sezione "Compliance MEMORY Mattia" contiene leva 1x o fee 0.1% | 🔴 CRIT | idem (è una bugia documentale che inganna il Coder) |
| Qualsiasi paletto P001-P015 violato nel codice (rilevato da diff vs spec) | 🔴 CRIT | idem |

---

## 👁️ SEZIONE 4 — VIGILANZA SUL SUPERVISOR (unica eccezione)

Per **esplicita istruzione Mattia 18/07 16:54**: il Supervisor è il guardiano dei processi. Io devo solo **vigilare che il Supervisor sia vivo e funzionante**. Se muore, **allertare Mattia**.

| Cosa | Come | Trigger escalation |
|---|---|---|
| Supervisor process è vivo? | 1 sola riga: `Get-Process \| Where-Object Name -match "python"` e cerco PID noto | Se non c'è → 🔴 CRIT → notifica Mattia con priorità |
| Supervisor ha loggato errori recenti? | Lettura ultimi 20 righe del log Supervisor | Se errori ripetuti → 🟡 WARN → Verifier |

**NON faccio**: riavvio Supervisor, modifico config Supervisor, killo/riavvio processi gestiti da Supervisor.

---

## 📝 SEZIONE 5 — FORMAT OUTPUT per il team (sempre uguale)

Ogni report del tutore:

```
## 🔴 CRIT-[N] — [titolo regola violata]
- Regola: [ID paletto o "Regola Mattia 500/3x"]
- File: [path assoluto]
- Riga: [numero se applicabile]
- Evidenza: [snippet codice o log o config]
- Scostamento: [cosa dice la regola vs cosa c'è]
- Destinatario: Verifier per audit indipendente
- ATTESA: Verifier → pass → Coder → Mavis riverifica

## 🟡 WARN-[N] — [titolo]
- idem struttura

## 📊 STATO REGOLE (snapshot)
| Paletto | File di applicazione | Rispettato? | Note |
| P001 | live_engine.py:391-402 | ✅/❌ | ... |
| P002 | live_engine.py:414-424 | ✅/❌ | ... |
| ... | ... | ... | ... |
```

---

## 📋 SEZIONE 6 — FREQUENZA

| Quando | Cosa faccio |
|---|---|
| **Ad ogni sessione** | Verifico le 15 regole (P001-P015) sui punti di applicazione dichiarati (1.1) — lettura file |
| **Dopo ogni ordine** (via log fresco) | Verifico che l'ordine rispetti P003/P004/P005/P006/P011/P015 |
| **Settimanale** | Verifico drift Charter vs CHARTER.md vs STRATEGY_RULES.md (1.2) |
| **Mensile** | Verifico che TUTTE le strategie live siano Charter-izzate (1.3) |
| **Real-time** | Verifico che Supervisor sia vivo (Sez 4) — 1 check per sessione |

---

## 🔁 SEZIONE 7 — FLUSSO CHIUSURA (riverifica dopo fix Coder)

Dopo che Coder fa un fix su segnalazione mia → Verifier:

1. Mavis **riverifica** che la regola ora è rispettata
2. Se sì: chiude CRIT-[N] con ✅
3. Se no: riapre CRIT-[N] con nota "fix Coder non risolutivo"
4. Aggiorna `MEMORY.md` sezione compliance con data del fix
5. Report successivo: riepilogo CRIT chiusi nel periodo

---

**CHECKLIST VIVA** — si aggiorna ad ogni:
- Nuovo paletto Charter aggiunto a `paletti.py`
- Nuova regola Mattia dichiarata
- Nuova strategia live introdotta
- Modifica struttura team (Supervisor/Coder/disciplined-coder/Verifier)

**Ultima revisione**: 2026-07-18 16:54 Europe/Rome (Mavis, dopo correzione Mattia)
