diff --git a/api/main.py b/api/main.py index 56977c2..6028d80 100644 --- a/api/main.py +++ b/api/main.py @@ -391,6 +391,12 @@ class DashboardHandler(BaseHTTPRequestHandler): symbol = (q.get("symbol") or [""])[0] minutes = int((q.get("minutes") or ["60"])[0]) self._send_json(self.state.bars(symbol, minutes)) + elif route == "/api/attribution": + # per-component stage ratings (research/attribution.py); computed on + # demand — a handful of indexed event queries, fine per click + from research.attribution import compute_attribution + days = int((self._query().get("days") or ["7"])[0]) + self._send_json(compute_attribution(days=days)) elif route == "/api/health": self._send_json({"ok": True, "mode": self.state.execution_mode}) else: diff --git a/api/static/dashboard.html b/api/static/dashboard.html index 6401fa2..6f3d4dd 100644 --- a/api/static/dashboard.html +++ b/api/static/dashboard.html @@ -506,8 +506,46 @@

Order Lifecycle 0

+ +
+

Component Attribution per-stage ratings: discovery → signals (early vs late) → gates → execution → P&L · loads on open

+
Open to load the last 7 days.
+