Replace OpenRouter (openai SDK) with OpusAgent REST API (httpx + polling).
LLMClient now creates topics per system prompt, submits async requests,
and polls for completion. Model tiers map to Claude model IDs
(opus-4-7, sonnet-4-6, haiku-4-5) configurable via env vars.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
corr_signal: frazione di entries A con match in B entro +/-tolerance_bars
(default 36 barre = 3h su 5m TF, env GA_INVARIANCE_TOLERANCE_BARS).
apply_invariance_bonus: fitness * (1 + alpha * invariance_score), alpha=0.3
(env GA_INVARIANCE_ALPHA). Spec plan Pythagoras §4.
GA integration approach (Step 5 findings):
- multi_swarm_core.ga.fitness.compute_fitness e compute_combined_fitness
NON espongono callback/hook per post-processing della fitness.
- orchestrator.run.run_phase1(...) -> str ritorna solo il run_id; le
evaluations (incl. fitness scalare) vengono persistite via
repo.save_evaluation dentro al loop GA (run.py:264-277).
- I winner sono recuperati dopo il run con repo.list_evaluations(run_id)
e ri-ordinati per fitness (vedi pattern run.py:302-310 per WFA re-eval).
- Pattern (b) confermato: il runner Task 6.1 chiamera' run_phase1 due
volte (BTC, ETH), poi per ogni coppia di evaluations matchera' i
genome_id, calcolera' corr_signal sulle entries dei rispettivi
backtests e applichera' apply_invariance_bonus per ri-rankare
esternamente i winner. Nessuna modifica a multi_swarm_core necessaria
in questo task.
Tests: 6/6 PASS (perfect alignment, no overlap, within tolerance, bonus
formula, alpha=0, zero entries).
Base per l'esecuzione del sub-project strategy_pythagoras:
- docs/superpowers/specs/2026-05-19-strategy-pythagoras-design.md (spec)
- docs/superpowers/plans/2026-05-19-strategy-pythagoras.md (14 task, 72 step TDD)
- src/strategy_pythagoras/Pythagoras/*.summary.md (riassunti numerici dei 2 PDF)
- src/strategy_pythagoras/Pythagoras/_extracted/*.txt (estrazione testo grezzo via pypdf)
I PDF stessi non vengono committati (vedi .gitignore).
L'assert su btc_fb63e851.json/eth_facd6af85d5d.json era diventato
stale dopo i swap dei paper winner (commit 8b767da, 23b7273).
Verifica strutturale (almeno un btc_*.json e un eth_*.json) evita
il fail ad ogni futuro swap di winner.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Bug principale: in scripts/run_paper_trading.py il fetch usava
end = now.replace(minute=0,...), troncando sempre all'ora. ETH è
dichiarato timeframe=5m (commit 23b7273) ma di fatto veniva
valutato 1 volta ogni 60 min — 502 poll del run 39e027df hanno
prodotto solo 43 evaluazioni/asset, tutte a HH:00. Il commento
in load_assets segnala esplicitamente che a 1h la strategia
perde -33% su 7y: regressione vs backtest.
Fix: helper _align_end_to_timeframe(now, timeframe) snappa end
al boundary nativo dell'asset. Mappa 1m/5m/15m/30m/1h/4h/1d.
Test regression in src/strategy_crypto/tests con 9 casi.
Hardening accessorio incluso nello stesso commit:
- docker-compose.yml: state/ in RW per strategy-crypto-gui
(SQLite WAL richiede SHM writable anche da reader).
- multi_swarm_core/dashboard/nicegui_app.py: ui.timer ora
deactivate on_disconnect su 3 pagine (index/convergence/genomes)
per evitare leak di timer dopo client disconnect.
- strategy_crypto/frontend/data.py: retry 5s su sqlite.connect
per cold-start race quando GUI parte prima del paper writer.
- state/validation-hardened-001.json: output WFA tooling
multi-fold del run phase1-hardened-001.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
scripts/run_paper_trading.py: AssetConfig ETH ora usa timeframe="5m" invece
del default 1h. Il winner c04dff7086 e' stato trovato dal GA su dati 5m
e a 1h la strategia perde:
- ETH @ 5m (native): +359.50% cum 7y, 77% winrate, max DD/yr 19%
- ETH @ 1h (precedente): -33.03% cum 7y, 67% winrate, max DD 74%
BTC resta a 1h (winner 238e4812 native a 1h, +104% 7y, Sharpe 2+ in 3 anni).
Nuovi script di analisi:
- scripts/yearly_strategies.py: breakdown per anno (2019-2025) di 4
strategie su tick di discovery (trade/winrate/return/maxDD/Sharpe).
- scripts/multi_tick_strategies.py: confronto cross-tick (5m/15m/1h)
per i 2 winner correnti. Documenta la divergenza tick-paper di ETH.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Aggiunge 2 script di analisi per validare i top-K genomi cross-fold:
- scripts/analyze_btc_winners.py: per-trade dump (wins/losses/winrate/
avg_win/avg_loss/return/maxDD/Sharpe) per ogni top-K × 4 fold
expanding-window WFA. Usato per identificare i winner robusti vs
i lucky-shot overfit.
- scripts/compare_winners.py: cross-run comparison di 5 winner
candidate (BTC 1h + ETH 1h + BTC 5m + ETH 5m) sui medesimi 4 fold,
con totali cumulativi.
Risultati WFA freezati:
- validation-btc-100-001.json: BTC 1h baseline (undertrading=10)
- validation-btc-100-001-thr3.json: BTC 1h con threshold=3 (rilassato
per strategie ultra-selettive)
- validation-btc-100-5m-thr3.json: BTC 5m con threshold=3
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Sostituisce btc_fb63e851 (in produzione dal 13 maggio, net +$9.9k su 7y BTC,
Sharpe medio -0.20) con btc_9cf506b8, vincitore del run phase1-hardened-001
(K=50 G=15 7y, fitness-v2 con hard-kill su fees_eat_alpha + negative_net_pnl).
Performance comparate su 7y BTC continui:
- btc_fb63e851: Net +$9,951 Sharpe medio -0.20 4/8 anni positivi
- btc_9cf506b8: Net +$30,538 Sharpe medio +0.31 5/8 anni positivi
Best year 2021: +$18,938 (vs prod +$6,835)
Best Sharpe annuale: 2023 +1.27 (vs prod 2024 +1.16)
Zero adversarial findings su 7y continui.
Performance cross-asset (test su ETH 6.8y):
- btc_fb63e851 su ETH: -$120 (pseudo-flat, nessun segnale)
- btc_9cf506b8 su ETH: +$2,059 (4/7 anni positivi)
La strategia generalizza out-of-asset, indicatore di robustezza non-ETH-overfit.
DSL: physicist style, lookback 150 bar (~6 giorni). Triple-AND condition su
realized_vol + atr_pct + sma_pct per entry (long o short). Exit su sma_pct=0
o vol collasso (<0.1%). Selettivo: 502 trade in 7y = 1.4 trade/giorno medio.
btc_fb63e851 archiviato in strategies/archive/ per consultazione futura.
Il glob loader `btc_*.json` e' non-ricorsivo, quindi archive/ non viene
caricato automaticamente.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
PromptLibrary e' un frozen dataclass non JSON-serializable. Quando passata in
cfg.prompt_library e poi spread via **cfg.__dict__ in config_dict, faceva
fallire repo.create_run() con TypeError al primo run dopo refactor.
Fix: filtra cfg.__dict__ escludendo prompt_library, e salva separatamente la
lista degli stili (prompt_library_styles) per reproducibility.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Incident: extended run elite (Sharpe IS 1.93) net-negativo su 7y
continuous (fees=101% del gross). Multi-fold validation NON sufficiente:
ogni fold restarta equity, mascherando accumulo fees compound.
Correzioni:
1) Default --start esteso a 2018-09-01 (7.3 anni)
- Copre bear 2018-19, halving 2020, COVID, ATH 2021, winter 2022,
ETF rally 2024, regime corrente.
- Una finestra corta (2y) lasciava il GA libero di overfit single-regime.
2) fees_eat_alpha promosso a hard-kill in fitness v2
- Da soft-penalty 0.4x a hard-kill 0 fitness.
- Una strategia con fees > 50% del gross non e' recuperabile via
selection: il prodotto del GA non puo' deployare con quel cost burden.
3) Nuovo finding negative_net_pnl (HIGH, hard-kill)
- Fires quando sum(trade.net_pnl) < 0 sul training window.
- Cattura: gross negativo (no edge direzionale) E gross positivo ma
fees > gross (edge insufficiente).
- Sintesi del net-after-fees su finestra continua come "deal-breaker"
non negoziabile via soft penalty.
CLI:
- --fitness-hard-kill <csv> per override esplicito.
- Default v2: no_trades,degenerate,undertrading,fees_eat_alpha,negative_net_pnl.
Test:
- 252 pass (251 + 1 nuovo: test_negative_net_pnl_fires_on_negative_gross).
- Test e2e WFA aggiornato: passa fitness_hard_kill_findings=('no_trades',)
perche' il fixture sintetico non produce strategie profittevoli.
- test_no_findings_on_reasonable_strategy rinominato:
test_rsi_mean_reversion_loses_money_on_synthetic_data (riflette
semantica reale: RSI mean-rev su synthetic ohlcv ha net negativo).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
- backtest/engine.py: state machine numpy invece di pd.iterrows()
- 16.8x speedup su 2y (470ms -> 28ms), 11.3x su 7y (1744ms -> 154ms)
- 7 parity test parametrici vs reference iterrows assicurano equivalenza
- orchestrator/run.py + run_phase1.py: --llm-concurrency N
- ThreadPoolExecutor parallelizza hypothesis_agent.propose() per generazione
- 5-8x speedup wall time GA loop (OpenRouter qwen-2.5 regge 6-10 concorrenti)
- default 1 = backward-compat sequenziale
- scripts/validate_run.py: validation multi-fold standalone
- prende run_id + top-K + N-folds expanding-window su dataset esteso (7y)
- rivela overfitter mascherati da fitness IS alta (vedi
phase1-extended-001: elite IS Sharpe 1.93 collassa OOS a -1.00)
- ranking per robust_score = min(fitness_oos) su tutti i fold
Test 250/250 pass.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Patch di consolidamento post-diagnosi v3.1, divisa in REGRESSIONI ripristinate
+ MIGLIORAMENTI opportunistici + INVARIANTI permanenti.
Regressioni v3.0 -> v3.1 ripristinate:
1. ASCII-strict: caratteri circa-uguale (U+2248) sostituiti con 'vicino a' in 3 stili
(historian, engineer, psychologist). Critico per encoding robustness.
2. 'Archetipo dominante: <metafora>': chiusa identitaria reintrodotta in
tutte le 7 directive. Ancora semantica resistente a mutate_prompt_llm.
3. 'Lookback consigliato: X-Y barre': hint range differenziato per stile
(physicist 150-300, biologist 80-200, historian 200-500, meteorologist
50-150, engineer 60-120, military 100-200, psychologist 50-120) per
orientare il parametro evoluto lookback_window del genoma.
Miglioramenti opportunistici:
4. Voce attiva rinforzata: +verbi generativi ('costruisci', 'combina',
'cattura', 'diagnostica', 'preferisci') in tutte le directive
5. anti_patterns 5 -> 7 voci: aggiunti (6) chattering crossover same-type
same-lookback, (7) soglie hard senza isteresi entry/exit
6. output_priorities 4 -> 5 voci: aggiunta in cima (#1) 'coerenza con
lente cognitiva' (fondamento del design swarm)
7. domain_warnings: +frase 'seasonality > 0 non significa significativa, gate a 0.05'
8. NEW _design_invariants metadata: documenta gli invarianti che future
versioni DEVONO preservare (utile per chi edita + mutate_prompt_llm)
NEW invariant tests (regression guards permanenti):
- test_strategy_crypto_directives_ascii_safe
- test_strategy_crypto_directives_have_archetype_marker
- test_strategy_crypto_directives_have_lookback_hint
Statistiche v3.2:
- directive: 800-950 char (era 545-614 in v3.1, troppo snellite)
- physicist 890, biologist 867, historian 887, meteorologist 884,
engineer 904, military_strategist 898, psychologist 909
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Pulizia contenuto prompts.json risolvendo le 9 debolezze identificate
in diagnosi v3.0 -> v3.1:
- agent_role: + frase swarm awareness ("la diversita e' asset critico,
esplora territori meno ovvi")
- pattern_guidance: riscritto astratto (rimossi tutti i nomi di
indicatori; SMA(short)>SMA(long), RSI>70, ecc -> "trend strutturale",
"compressione vol", "mean reversion strutturale"). Il GA scopre
l'incarnazione, le directive sono BIAS non template.
- domain_warnings: riformulato come "NON assumere" (rimosso hint
inferenziale su funding rate che avrebbe indotto hallucination)
- directive: trimmate tutte sotto 900 char (era 922-975)
- focus_metrics: standardizzati a 4 per stile (era 4-5, asimmetria
estetica); rimosse ridondanze:
* historian: rimosso autocorr_baseline (gia' visibile in
Regime recente -> usare solo autocorr_recent come delta proxy)
* psychologist: kurt/skew (gia' in base statistics) sostituiti
con autocorr_recent + spectral_entropy (piu informativi)
- NEW anti_patterns: lista esplicita (5 voci) per ridurre overfitting
nel design della strategia (no > 4 AND, no singolo evento, no
correlazione=causalita, no stazionarieta perfetta, no temporal
features con seasonality < 0.05)
- NEW output_priorities: trade-off espliciti (robustezza > ottimalita,
semplicita > complessita, selettivita > attivita)
- NEW _focus_metrics_design metadata: documenta l'intento delle scelte
Effetto atteso al prossimo Phase 1/2 run: ipotesi piu robuste
(meno overfitting cross-regime), strategie piu semplici (no 5+ AND),
maggior diversita di esplorazione (swarm awareness nel role), zero
inferenze su feature non accessibili.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Estende il compositor del SYSTEM con 2 sezioni opzionali iniettate
DOPO i VINCOLI core e PRIMA dell'EXAMPLE:
ANTI-PATTERN DA EVITARE: lista esplicita di cose da evitare (overfitting,
correlazione=causalita, > 4 AND, singolo evento estremo, ecc.)
PRIORITA' DI OUTPUT: trade-off come "robustezza > ottimalita su singolo
regime", "semplicita > complessita raffinata", "selettivita > attivita"
Razionale: ridurre la varianza non-utile nelle strategie generate
quando il LLM affronta trade-off, e prevenire overfitting nel design.
Entrambi i campi sono opzionali (skip se "") -> backward-compatible
con prompts.json v3.0.
PromptLibrary v3.1: +2 fields top-level (default "").
_build_system_prompt: 2 sezioni condizionali post-VINCOLI.
Test: +3 unit (compositor inject/skip + from_json parsing).
Tot: 235 test pass.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Refactor architetturale: il prompt non e' piu' un template hardcoded ma viene
COMPOSTO at-runtime da scaffold core + contenuto strategy.
CORE scaffold (universal, fisso):
- Grammar JSON spec (legato al protocol/compiler)
- UNITA' regole semantiche
- VINCOLI del validator
- Esempio output
STRATEGY content (tunable in prompts.json):
- agent_role: "Sei un agente generatore di ipotesi ... [crypto/forex/equity]"
- pattern_guidance: sezione di archetipi tecnici, ora crypto-specific
- instruction: frase finale del USER ("Genera una strategia ... [crypto]")
- domain_warnings: NEW opzionale, per disclaimer di dominio (es. crypto 24/7)
Implementazione:
- PromptLibrary v3.0: 4 nuovi campi top-level (agent_role, pattern_guidance,
instruction, domain_warnings), parsati da prompts.json, default fallback in default()
- hypothesis.py: SYSTEM_TEMPLATE constant rimossa, sostituita da
_build_system_prompt(lib, genome) che compone scaffold + content
- USER_TEMPLATE: ultima riga ora ha placeholder {instruction}
- prompts.json v3.0 in strategy_crypto: agent_role + pattern_guidance +
instruction + domain_warnings popolati con flavor crypto-specific
Pattern: "core = framework, strategy = contenuto". Per future strategie
(forex, equity), basta creare un prompts.json con flavor diverso, zero
modifiche al core. Universal scaffold (grammar, vincoli, units) e'
condiviso e mantiene la garanzia di parse/validate.
Test: +5 unit (compositor + PromptLibrary fields).
Tot: 232 test pass.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Bug introdotto in b6f48e4: HypothesisAgent(prompt_library=prompt_library) era
chiamato a riga 109, ma prompt_library veniva definito a riga 123 -> NameError
a runtime quando run_phase1 viene eseguito.
Spostato il blocco di setup prompt_library + set_cognitive_styles PRIMA della
istanziazione di HypothesisAgent.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Aggiunge al MarketSummary 5 metriche regime-aware:
- efficiency_ratio (Kaufman): discriminatore trending/ranging
- tail_index_left/right (Hill): pesantezza code, robust vs kurtosis
- structural_uptrend (HH/HL Dow-style): trend strutturale senza lag MA
- compression_ratio: vol coil pre-breakout
- spectral_entropy + dominant_cycle (gated): struttura ciclica nel FFT
Architettura "Style-aware focus, no filtering":
- Tutte le 5 metriche restano visibili a tutti gli stili (landscape GA smooth)
- prompts.json v2.2: ogni stile dichiara focus_metrics: list[str]
- USER_TEMPLATE renderizza "Focus per la tua lente: ..." con i valori prioritari
- Mutation cognitive_style preserva accesso a tutte le metriche (no discontinuita)
PromptLibrary esteso con focus field (parsato da JSON entry styles).
HypothesisAgent accetta prompt_library nel costruttore; orchestrator lo passa.
7 directive aggiornate per interpretare i 5 nuovi input attraverso la lente:
- physicist: efficiency_ratio + dominant_cycle (modi armonici)
- engineer: efficiency_ratio < 0.2 = no signal
- psychologist: tail_left/right = paura/euforia ricorrente
- ecc.
Test: +19 unit (metriche + focus rendering), +smoke MarketSummary.
Tot: 216 test pass.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Aggiunge al USER_TEMPLATE dell'HypothesisAgent 4 metriche calcolate su rolling
window 500 barre (no backward bias del full sample):
- autocorr_lag1_recent vs autocorr_lag1_baseline (AR(1) delta vs storico)
- hurst_recent (R/S analysis, persistenza di scala)
- vol_percentile (0-100, posizione vol corrente nella distribuzione storica)
- seasonality_hour, seasonality_dow (0-1, varianza spiegata da feature temporali)
Razionale: skew/kurt da soli sono ambigui — un AR(1) discrimina momentum vs
mean-reversion meglio di tutta la guidance sui momenti.
NEW funzioni in metrics/basic.py:
- autocorr_lag1(returns)
- hurst_exponent(returns) via R/S a scale multiple
- vol_percentile_historical(returns, current_window=24, ref_window=2000)
- seasonality_strength(returns, by={"hour"|"dow"})
MarketSummary esteso con 6 nuovi campi (con default); build_market_summary calcola
rolling-500 per "recent", full sample per "baseline".
prompts.json v2.1: tutte le 7 directive estese con frase di interpretazione
style-specific dei 4 nuovi input (no style collapse). Es:
- physicist: "AR(1) sopra baseline = sistema con memoria fuori equilibrio"
- engineer: "AR(1) > 0.05 con std contenuta = SNR favorevole"
- psychologist: "AR(1) recente >> baseline = euforia coordinata"
Tests: +16 unit per le metriche, +1 smoke per MarketSummary populated.
Verifica: 207 test pass.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
- NEW src/multi_swarm_core/multi_swarm_core/dashboard/ con theme.py + data.py + nicegui_app.py
- theme.py condiviso (CSS + colors + _apply_theme + _json_to_html + _build_header parametrico)
- core GUI: pagine /, /convergence, /genomes — legge SOLO runs.db
- strategy GUI slim: solo /, legge SOLO strategy_crypto.db — importa theme dal core
- Aggiunto nicegui+plotly al core pyproject (uv.lock rigenerato)
- docker-compose: nuovo servizio multi-swarm-core-gui su /multi_swarm_core_gui
(Traefik PathPrefix + replacepathregex, NO stripprefix per evitare doppio root_path)
- .env.example: DASHBOARD_ROOT_PATH ora per-servizio
Pattern: ogni modulo possiede la sua GUI, ogni GUI legge solo il proprio DB.
N strategie future = duplica lo scheletro strategy_crypto/frontend/.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Bug: la dashboard NiceGUI mostrava "Your browser does not support ES modules"
perche' le asset URL nell'HTML erano doppio-prefissate:
/strategy_crypto_gui/strategy_crypto_gui/_nicegui/...
Root cause: il middleware traefik.stripprefix aggiunge automaticamente
X-Forwarded-Prefix header. uvicorn/Starlette legge il header e setta
root_path automaticamente, raddoppiando con quello passato esplicitamente
a ui.run(root_path="/strategy_crypto_gui").
Fix: traefik.replacepathregex strippa il prefix senza propagare il header.
uvicorn vede solo il root_path da ui.run -> asset prefissati una sola volta.
- replacepathregex.regex=^/strategy_crypto_gui(/.*|$)
- replacepathregex.replacement=$1
Verifica end-to-end:
- page: HTTP 200, asset prefix singolo
- /strategy_crypto_gui/_nicegui/3.12.0/static/socket.io.min.js: 200
- / (root): 404 (atteso)
NB: dopo cambio label, necessario `docker restart traefik-traefik-1` per
forzare refresh discovery (problema noto Traefik con label durante recreate
container nello stesso ciclo). Annotare per future modifiche middleware.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Tre fix di deploy emersi al primo build/up del nuovo compose:
1. Dockerfile: rimosso PYTHONPATH=/app/src
Con layout uv workspace doppio-nest, PYTHONPATH=/app/src faceva ombra
alla venv risolvendo le member-dir (multi_swarm_core/, strategy_crypto/)
come namespace packages PEP 420 senza i sub-package del codice
(cerbero, persistence, frontend, ecc.). I package sono installati come
editable dal `uv sync --frozen` nella venv: niente PYTHONPATH necessario.
2. pyproject root: aggiunto [project] dependencies = [multi-swarm-core, strategy-crypto]
I due member workspace erano in [dependency-groups.dev], escluse da
`uv sync --frozen --no-dev` del builder Docker -> "ModuleNotFoundError:
No module named multi_swarm_core". Spostati come dipendenze runtime del
deployable app root; dev group ora contiene solo pytest/ruff/mypy.
uv.lock rigenerato.
3. docker-compose.yml: aggiunto Traefik middleware StripPrefix
NiceGUI con root_path="/strategy_crypto_gui" assume che il proxy
strippi il prefix prima di girare al container (FastAPI route restano
"/", "/paper", ecc.). Senza StripPrefix, NiceGUI riceveva
"/strategy_crypto_gui/" e rispondeva 404. Aggiunte 2 label:
- strategy-crypto-stripprefix middleware
- router.middlewares = strategy-crypto-stripprefix
Verifica end-to-end:
- https://swarm.tielogic.xyz/strategy_crypto_gui/ -> HTTP 200 (31KB)
- https://swarm.tielogic.xyz/ -> HTTP 404 (root libera, atteso)
- paper run phase3-baseline-001 (fcf271d0...) tick=1 OK, $1000 equity
- state/strategy_crypto.db creato con 5 tabelle paper_trading_*
NB: permission fix per `src/strategy_crypto/strategy_crypto/strategies/`
fatto manualmente (chown 1000:1000) — i JSON migrati da git mv erano
root:root, container gira come uid 1000. Annotare per future strategies.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Il LLM ora genera strategie sapendo distinguere quando usare atr (unità
prezzo) vs atr_pct (frazione del close) per evitare il bug protocol_unit.
agents/hypothesis.py:
- Lista indicatori: aggiunto atr_pct con annotazione unità inline
- NEW sezione "UNITÀ — REGOLA CRITICA": esempi positivi/negativi su
literal frazionali (atr_pct > 0.02 ✓) vs literal in unità prezzo
(atr > 0.02 ✗ sempre TRUE su asset >$1)
- PATTERN GUIDANCE: "Compressione di volatilità" ora suggerisce atr_pct(N) < 0.01
invece di "ATR(N) < soglia bassa" generico
- "Espansione di volatilità": atr_pct(N) > 0.03 OPPURE confronto relativo
genome/mutation_prompt_llm.py:
- _VALID_KEYWORDS: aggiunti atr_pct + realized_vol (per validazione prompt mutato)
Closes open item da commit f875df3. Prima del prossimo Phase 2.x run il
modello qwen-2.5-72b ricevera' il prompt aggiornato e genera strategie
unit-aware. Vedi src/multi_swarm_core/docs/decisions/2026-05-15-atr-pct-fix.md.
Verifica: 188 test pass.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
- Sezione "Layout monorepo (uv workspace)": ridisegna la struttura per chiarire
i due workspace member (multi-swarm-core + strategy-crypto), DB separati,
pattern per N strategie future.
- Comandi aggiornati: paper runner ora importa da strategy_crypto.backend,
dashboard via 'python -m strategy_crypto.frontend.nicegui_app'.
- Backtest cmd punta al nuovo path strategie src/strategy_crypto/strategy_crypto/strategies/.
- Variabili .env: GA_DB_PATH + STRATEGY_CRYPTO_DB_PATH + DASHBOARD_ROOT_PATH.
Mantenuto nota backcompat su DB_PATH legacy.
- Dashboard: nuova pagina /paper + URL prod /strategy_crypto_gui/.
- Deploy: servizi rinominati strategy-crypto-paper / strategy-crypto-gui,
bind strategies dal package, image rinominata multi-swarm-coevolutive:dev.
- Rimossi link a doc cancellati (poc_trading_swarm.md, superpowers/, phase1-technical-report).
- Doc rimanenti riposizionati sotto src/multi_swarm_core/docs/.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
NEW src/strategy_crypto/tests/test_imports.py:
- test_backend_imports — verifica re-export PaperExecutor/Portfolio/PaperRepository + schema
- test_frontend_imports — strategy_crypto.frontend.{data,nicegui_app} importabili
- test_strategies_json_loadable — i JSON sono in importlib.resources e ben formati
- test_init_schema_creates_tables — PaperRepository.init_schema() crea 5 tabelle
Fix pytest collection: add --import-mode=importlib agli addopts per evitare
collisione dei due tests/__init__.py (core + strategy_crypto) sotto stesso
nome module 'tests'.
Verifica: uv run pytest → 186 passed (182 core + 4 strategy_crypto)
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
- git mv strategies/{btc,eth}_*.json → src/strategy_crypto/strategy_crypto/strategies/
- Cancellata directory root strategies/ (ora package data del member strategy_crypto)
- I JSON sono inclusi nella wheel via force-include nel pyproject del member
- scripts/run_paper_trading.py:
* Import paper_trading.* → strategy_crypto.backend
* Default --strategies-dir letto da importlib.resources.files('strategy_crypto') / 'strategies'
* PaperRepository(settings.strategy_crypto_db_path) + init_schema()
* Rimosso Repository(settings.db_path).init_schema() (GA init non e' responsabilita' del paper)
- Verifica: importlib.resources trova i 2 JSON nel package
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
- multi_swarm_core/persistence/schema.py: rimuove tabelle paper_trading_*
(5 CREATE TABLE + 3 indici idx_paper_*). Restano solo le tabelle GA universali
(runs, generations, genomes, evaluations, cost_records, adversarial_findings).
- strategy_crypto/backend/schema.py NEW: PAPER_SCHEMA_SQL standalone + init_schema()
con mkdir parent, scrive su state/strategy_crypto.db.
Ownership: ogni strategia possiede il proprio schema, isolato dal core.
Pattern replicabile per strategy_forex, strategy_equity, ecc.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
- mv src/multi_swarm → src/multi_swarm_core/multi_swarm_core (member layout)
- sed-replace globale degli import: from/import multi_swarm.* → multi_swarm_core.*
- 115 occorrenze aggiornate in src/ scripts/ tests/
- multi_swarm_coevolutive (nome repo) preservato dal word boundary
Pre-condizione per il setup uv workspace della Fase 3.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>