212875ed0d
- .claude/agents/fn-orquestador/SKILL.md - .claude/commands/fn_claude.md - .claude/rules/INDEX.md - .claude/rules/cpp_apps.md - .claude/rules/ids_naming.md - CHANGELOG.md - apps/dag_engine/README.md - apps/dag_engine/api.go - apps/dag_engine/dags_migrated/example.yaml - apps/dag_engine/dags_migrated/example_lineage_tracking.yaml - ... Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2.0 KiB
2.0 KiB
0088f — Trading: capability group risk + kill_switch
Status: pendiente Created: 2026-05-14 Type: feature Parent: 0088 Depends: 0088a Blocks: 0088h (live_runner no arranca sin esto)
Problema
Cualquier intent emitido por una Strategy debe pasar por un risk gate antes de tocar el broker. El kill_switch debe ser invocable desde CLI/cron/UI antes de que exista un broker live — fail-safe absoluto.
Piezas
- Funciones puras:
position_size_kelly_py_finance(edge, variance, bankroll, kelly_fraction).position_size_fixed_risk_py_finance(stop_distance, risk_per_trade_pct, equity).cap_max_loss_per_trade_py_finance(intent, stop_price, equity, max_loss_pct).cap_exposure_py_finance(intent, current_exposure, exposure_limit).filter_correlation_py_finance(intents, current_positions, correlation_matrix, max_corr).apply_risk_pipeline_py_finance(intents, portfolio, risk_config) -> list[OrderIntent](pipeline puro que compone las anteriores).
- Funcion impura
halt_all_strategies_py_finance(reason):- Escribe flag
halted=trueen~/.fn_state/trading_halt.json(o tablasystem_stateen ledger). - Notifica (telegram via 0061 si aplica).
- Idempotente: re-llamar no falla.
- Escribe flag
- Funcion pura
is_halted_py_finance(state_path) -> boolque el live_runner consulta cada ciclo. - Funcion
release_halt_py_finance(reason)(impura, escribe). Solo via CLI manual, NO via API. - Tag
risk. Pagina madredocs/capabilities/risk.md. - Tests deterministicos sobre cada cap/filter.
Aceptacion
./fn run halt_all_strategiesdeja el sistema en estado halted en frio (verificable conis_halted).- Cualquier intent que falle un cap retorna
[](no se emite), motivo logueado en operations.db del live_runner. - Kill_switch invocable sin que el live_runner este corriendo (state file persistente).
No-objetivos
- Risk dinamico aprendido (eso es feature futura). Risk_config se lee de YAML.
- UI para risk_config: editable a mano en YAML primero.