From 21fa04690a93e2c51fee7bfd6152fd406d191377 Mon Sep 17 00:00:00 2001 From: Alberto Balbo Date: Wed, 23 Sep 2026 11:27:46 +0200 Subject: [PATCH] 5.0: apprendimento in ombra (ADR-0006), skill di progetto, documenti della sessione MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Con il backtest negativo e zero basket chiusi nel forward test, un meta-modello attivo e un bandit che cambia il preset da solo sono rumore: learning.enabled = false di fabbrica lascia il ledger, la calibrazione, la previsione di volatilità e la logistica in ombra, e spegne ciclo settimanale e challenger finché non valgono 300 basket chiusi e un P&L forward non negativo. Le skill in .claude/skills dicono come si comincia, si verifica, si diagnostica, si chiude e si rilascia una sessione. CLAUDE.md, glossario e problemi noti aggiornati alla 5.0; catena Verifica verde con 219 test. Co-Authored-By: Claude Fable 5.1 --- .../.claude/skills/encelado-diagnose/SKILL.md | 16 +++++ .../.claude/skills/encelado-docs/SKILL.md | 13 ++++ .../.claude/skills/encelado-release/SKILL.md | 16 +++++ .../.claude/skills/encelado-start/SKILL.md | 14 +++++ Encelado/.claude/skills/encelado-ui/SKILL.md | 21 +++++++ .../.claude/skills/encelado-verify/SKILL.md | 17 ++++++ Encelado/CHANGELOG.md | 7 +++ Encelado/CLAUDE.md | 7 ++- Encelado/config/strategy.json | 7 +++ Encelado/docs/GLOSSARY.md | 7 +++ Encelado/docs/KNOWN_ISSUES.md | 3 + Encelado/docs/ML_AND_LEARNING.md | 20 ++++++- Encelado/docs/QUESTIONS.md | 2 +- Encelado/docs/STATE.md | 3 +- .../adr/ADR-0006-apprendimento-in-ombra.md | 22 +++++++ .../Baskets/BasketEngine.Snapshot.cs | 3 +- .../src/Encelado.Bot/Baskets/BasketEngine.cs | 5 +- .../Baskets/Backtest/BasketTrials.cs | 1 + .../Baskets/BasketStrategyConfig.cs | 59 ++++++++++++++++++- 19 files changed, 233 insertions(+), 10 deletions(-) create mode 100644 Encelado/.claude/skills/encelado-diagnose/SKILL.md create mode 100644 Encelado/.claude/skills/encelado-docs/SKILL.md create mode 100644 Encelado/.claude/skills/encelado-release/SKILL.md create mode 100644 Encelado/.claude/skills/encelado-start/SKILL.md create mode 100644 Encelado/.claude/skills/encelado-ui/SKILL.md create mode 100644 Encelado/.claude/skills/encelado-verify/SKILL.md create mode 100644 Encelado/docs/adr/ADR-0006-apprendimento-in-ombra.md diff --git a/Encelado/.claude/skills/encelado-diagnose/SKILL.md b/Encelado/.claude/skills/encelado-diagnose/SKILL.md new file mode 100644 index 0000000..5d3a7b5 --- /dev/null +++ b/Encelado/.claude/skills/encelado-diagnose/SKILL.md @@ -0,0 +1,16 @@ +--- +name: encelado-diagnose +description: Riconcilia ledger, registro degli ordini, heartbeat e posizioni del conto eToro e produce un rapporto CSV con separatore ; e colonna motivazione. +--- + +# Diagnosi di una sessione di Encelado + +Cartella dati: `Documenti\Encelado\data` su Windows, `/data/data` nel container. Se l'utente indica un'altra cartella, usa quella. + +1. **Ledger delle decisioni** `data/ledger/decisions.jsonl` (e i mensili `decisions_YYYYMM.jsonl`): conta gli `evento` (`segnale_ingresso`, `rifiuto`, `ingresso`, `pending`, `pending_risolto`, `leg_risk_unwind`, `uscita`, `orfana_adottata`, `orfana_chiusa`, `movimento_di_cassa`, `kill_switch_*`, `recupero_*`, `comando`, `correzione`). Per ogni `rifiuto` riporta `basket`, `ts`, `unitsA`, `unitsB`, `sizing_bound`, `motivazione`. +2. **Registro degli ordini** `data/ledger/orders.jsonl` e `data/state/pending_orders.json`: per ogni `client_ref` prendi l'ultima riga; elenca gli ordini con `esito = Pending` o `stato = Unknown` (sono le anomalie), quelli con `unita_eseguite ≠ unita_richieste` (il server ha ridotto l'ordine), gli slippage oltre 1 pip. +3. **Basket** `data/ledger/baskets.csv`: numero, win rate, P&L netto, `exit_reason` (attenzione a `orphan_closed`, `bonifica_orfana`, `leg_risk_unwind`, `margin_guard`, `kill_switch`). +4. **Heartbeat** `data/state/heartbeat.json` e **stato** `data/state/baskets_state.json`: ultimo battito, run, basket aperti e in attesa, `haltResidue`, `cumulativeCashFlow`, `peakNetEquity`. +5. **Conto eToro** (solo se le chiavi sono disponibili nell'ambiente `ETORO_API_KEY`/`ETORO_USER_KEY` o via collegamento MCP, e solo in lettura): posizioni aperte (`GET api/v1/trading/info/demo/pnl`), storico (`GET api/v1/trading/info/trade/demo/history?minDate=…`). Classifica ogni posizione come `basket` (id nello stato), `orfana-bot` (id nel registro, o strumento + verso + orario entro 90 s da una riga del ledger), `esterna`. +6. Scrivi `reports/diagnosi_.csv` con separatore `;`, intestazione e colonna finale `motivazione`: una riga per anomalia (`tipo;riferimento;quando;dettaglio;motivazione`) e in fondo le righe di riepilogo. Nessuna riga del ledger va modificata: le correzioni sono righe nuove. +7. Riassumi all'utente: cosa non torna, cosa è già stato gestito dal bot, cosa richiede una mano (chiusure su eToro, reset). diff --git a/Encelado/.claude/skills/encelado-docs/SKILL.md b/Encelado/.claude/skills/encelado-docs/SKILL.md new file mode 100644 index 0000000..ef59f2a --- /dev/null +++ b/Encelado/.claude/skills/encelado-docs/SKILL.md @@ -0,0 +1,13 @@ +--- +name: encelado-docs +description: Chiude una sessione di lavoro su Encelado: aggiorna STATE, CHANGELOG, ADR e QUESTIONS, poi propone il messaggio di commit. +--- + +# Chiusura della sessione: documenti e commit + +1. `docs/STATE.md`: data, fase in corso, cosa è stato fatto in questa sessione (con i numeri: test, file, commit), prossimi passi numerati, problemi aperti, domande in attesa. È la memoria fra una sessione e l'altra: chi legge solo questo deve poter ripartire. +2. `CHANGELOG.md`: una voce in alto con la data e il titolo della sessione; punti brevi su cosa cambia e perché, non l'elenco dei file. +3. ADR: una scelta non ovvia = un file `docs/adr/ADR-NNNN-.md` con Contesto, Decisione, Alternative scartate, Conseguenze. Aggiorna la tabella in `CLAUDE.md` se compare un documento nuovo. +4. `docs/QUESTIONS.md`: ogni dubbio è una riga numerata (D-xx) con il default applicato; le risposte arrivate si segnano con la data. +5. Se sono cambiati schema del ledger, rotte dell'API, regole di rischio o file in `Documenti\Encelado`: `docs/LEDGER_SCHEMA.md`, `docs/DATA_SOURCES.md`, `docs/RISK_RULES.md`, `docs/RUNBOOK.md`, `docs/KNOWN_ISSUES.md` (togli ciò che si chiude, aggiungi ciò che resta). +6. Verifica (`/encelado-verify`), poi proponi il messaggio di commit: titolo di una riga che dice cosa cambia, corpo che dice perché; un commit per sessione, un commit per fase se la sessione ne copre più d'una. Il push lo decide l'utente. diff --git a/Encelado/.claude/skills/encelado-release/SKILL.md b/Encelado/.claude/skills/encelado-release/SKILL.md new file mode 100644 index 0000000..3271793 --- /dev/null +++ b/Encelado/.claude/skills/encelado-release/SKILL.md @@ -0,0 +1,16 @@ +--- +name: encelado-release +description: Rilascio di Encelado: verifica, tag, installatore Windows, immagine Docker e template Unraid, in quest'ordine e solo dopo il commit e il push del ramo. +--- + +# Rilascio di Encelado + +Presupposti: albero pulito, ultima sessione committata e pushata, `/encelado-verify` verde, versione decisa dall'utente (semver; la 5.0.0 è la prima con web UI e Docker). + +1. `dotnet msbuild build/Release.proj -t:Verifica`. +2. `dotnet msbuild build/Release.proj -t:Rilascia -p:Versione=`: crea il tag git, l'installatore Inno Setup (`bin/installer/Encelado_.exe`), lo zip e la release su Gitea (`build/gitea.json`, mai committato: vedi `build/gitea.example.json`). La versione viene dal tag, non da un file. +3. Docker (dalla Fase 8 della 5.0): `dotnet msbuild build/Release.proj -t:Docker -p:Versione=` costruisce `encelado:` e `encelado:latest`; poi `docker push /encelado:` verso il registry deciso in D-29. +4. Template Unraid: aggiorna `deploy/unraid/encelado.xml` se sono cambiate variabili, porte o volumi; l'`Icon` punta al PNG raw del repository. +5. `CHANGELOG.md` e `docs/STATE.md` riportano la versione rilasciata; il tag e la release hanno lo stesso testo del CHANGELOG. + +Non modificare `build/Release.proj` o `build/Encelado.iss` se non richiesto: la catena è condivisa con Mimante e AutoBidder. diff --git a/Encelado/.claude/skills/encelado-start/SKILL.md b/Encelado/.claude/skills/encelado-start/SKILL.md new file mode 100644 index 0000000..a897c33 --- /dev/null +++ b/Encelado/.claude/skills/encelado-start/SKILL.md @@ -0,0 +1,14 @@ +--- +name: encelado-start +description: Avvia una sessione di lavoro su Encelado: legge lo stato, compila, riassume fase e problemi aperti, chiede cosa fare. +--- + +# Avvio di una sessione su Encelado + +1. Leggi, in quest'ordine: `CLAUDE.md`, `docs/STATE.md`, `docs/PIANO_5.0.md` (se la 5.0 non è conclusa), `docs/QUESTIONS.md` (le domande in attesa), `docs/KNOWN_ISSUES.md`. +2. Controlla l'albero di lavoro: `git status --short` e `git log --oneline -5`. Un albero sporco va capito prima di toccare qualcosa. +3. Compila: `dotnet build Encelado.slnx`. Se non compila, la prima cosa da fare è farlo compilare, e va detto subito. +4. Riassumi in dieci righe: fase in corso, cosa è stato fatto nell'ultima sessione, prossimi passi, domande senza risposta, problemi aperti, esito della compilazione. +5. Chiedi all'utente cosa fare in questa sessione. Non iniziare una fase del piano senza che sia chiaro quale. + +Regole che valgono sempre: niente pacchetti NuGet nell'applicazione, UTC ovunque, ledger append-only, mai un ordine reale senza flag e frase `CONFERMO LIVE`, un commit a fine sessione dopo la verifica. diff --git a/Encelado/.claude/skills/encelado-ui/SKILL.md b/Encelado/.claude/skills/encelado-ui/SKILL.md new file mode 100644 index 0000000..1f70437 --- /dev/null +++ b/Encelado/.claude/skills/encelado-ui/SKILL.md @@ -0,0 +1,21 @@ +--- +name: encelado-ui +description: Regole per toccare l'interfaccia di Encelado: i token Material 3 e le linee guida di docs/UI_GUIDELINES.md, nessuna libreria, stesse informazioni della dashboard. +--- + +# Lavorare sull'interfaccia di Encelado + +Finché esiste il progetto WPF (`src/Encelado.Bot`, fino alla Fase 7 della 5.0): tema in `Ui/Theme.xaml`, pagine in `Ui/Pages`, nessuna decisione nella UI (legge lo snapshot, manda comandi via `IUiActions`), orari via `UiClock`, test di binding (`UiBindingTests`) e di rendering (`ENCELADO_RENDER_DIR= dotnet test tests/Encelado.Tests --filter UiRenderTests`). + +Dalla web UI (Fase 7): leggi `docs/UI_GUIDELINES.md` prima di scrivere una riga. In sintesi: + +- HTML + CSS + JavaScript vanilla incorporati come `EmbeddedResource` nel server; nessun framework, nessun font remoto, nessun `