Phase 7 — Learning Loop
Verdict: Static book with manual quarantine updates. Automated learning is DEAD in production.
What code claims vs runs
| Component | Location | Runs in daemon? |
|---|---|---|
| Strategy IC tracker | qgtm_portfolio/ic_tracker.py |
Yes — Redis-backed |
| Signal aggregator weights | signal_aggregator.py |
Regime + IC hooks |
| Decay monitor | scripts/dead_ml_loop/ |
No |
| Auto-retrain | scripts/dead_ml_loop/auto_retrain.py |
No |
| Model registry | scripts/dead_ml_loop/model_registry.py |
No |
| Self-learning orchestrator | moved | No |
| Auto-research workflow | .github/workflows/auto-research.yml |
Batch only |
| AISC staleness warning | qgtm_data/aisc.py |
Yes (#81) |
What actually learns today
- Operator quarantine — edit
QUARANTINED_STRATEGIESafter backtests. - IC tracker — stores rolling IC if signals fire (verify Redis keys).
- Drawdown manager — mechanical de-lever, not alpha learning.
- Rejection tracker — symbol kill after repeated compliance rejects.
Revival plan (minimal viable learning)
| Step | Action | Owner |
|---|---|---|
| 1 | Nightly job: per-strategy paper PnL + rolling Sharpe → JSON | Eng |
| 2 | Auto-demote to quarantine if 63d Sharpe < 0 and PBO rerun fails | Eng + PM |
| 3 | Re-import decay monitor only (no auto-retrain) into daemon post-close | Eng |
| 4 | Shadow bucket for ml_ensemble — no OMS until DSR pass |
PM |
Monitoring dashboard scaffold
Minimal operator dashboard:
Writes audit_data/daily_snapshot.json and prints book health.
Implementation: scripts/monitoring_dashboard.py (stdlib HTTP or print-only if deps missing).
Static = dying — scorecard
| Criterion | Score 0–10 |
|---|---|
| Automated decay handling | 1 |
| Model promotion | 0 |
| Feature drift alerts | 4 (alert_feature_drift exists) |
| Post-trade analytics feedback to weights | 3 |
| Overall learning | 2/10 |