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