diff --git a/src/fxhnt/adapters/web/templates/cockpit.html b/src/fxhnt/adapters/web/templates/cockpit.html
index 32f94aa..2c0139f 100644
--- a/src/fxhnt/adapters/web/templates/cockpit.html
+++ b/src/fxhnt/adapters/web/templates/cockpit.html
@@ -44,6 +44,7 @@
| {{ f.display_name }}
· {{ f.venue }} {{ exec_badge(f.execution) }}
+ {% if f.reference_only %}ref{% endif %}
{% if f.status %}{{ f.status }}{% endif %} |
{{ f.tier }} |
diff --git a/src/fxhnt/application/dashboard_service.py b/src/fxhnt/application/dashboard_service.py
index 3648e1a..93fa490 100644
--- a/src/fxhnt/application/dashboard_service.py
+++ b/src/fxhnt/application/dashboard_service.py
@@ -13,6 +13,10 @@ from fxhnt.registry import STRATEGY_REGISTRY
# only if nothing else exists (it is not an alpha edge).
_HEADLINE_PREFERENCE = ("bybit_4edge", "combined")
_BENCHMARK_SLEEVES = frozenset({"beta"})
+# The venues we ACTUALLY execute on: Bybit (the crypto deploy book) + Alpaca (the US-equity leg). Every
+# other venue (Binance discovery/reference tracks, the glbx 60/40 benchmark) is REFERENCE-ONLY — observed
+# on the gate, never traded live. Binance is no longer an active execution venue.
+_ACTIVE_VENUES = frozenset({"bybit-perp", "alpaca-paper"})
def _gate_min_days(gate_spec: dict | None) -> int:
@@ -57,6 +61,7 @@ class DashboardService:
# registry SSOT metadata — drives the Overview's deploy/research grouping + paper/live badge.
venue=reg.venue, tier=str(meta.get("tier", "research")),
execution=str(meta.get("execution", "paper")),
+ reference_only=reg.venue not in _ACTIVE_VENUES, # not an active execution venue → reference
))
return out
diff --git a/src/fxhnt/ports/dashboard.py b/src/fxhnt/ports/dashboard.py
index f376de7..49287a7 100644
--- a/src/fxhnt/ports/dashboard.py
+++ b/src/fxhnt/ports/dashboard.py
@@ -44,6 +44,9 @@ class FleetRow:
venue: str = ""
tier: str = "research"
execution: str = "paper"
+ # True when the track is NOT on an active execution venue (Bybit deploy / Alpaca equities) — e.g. the
+ # Binance discovery/reference tracks + the 60/40 benchmark. Reference-only: observed, never traded live.
+ reference_only: bool = False
@dataclass(frozen=True, slots=True)
|