From ec9f660f97fcdff31ffb6a0e89754cfcc45908be Mon Sep 17 00:00:00 2001 From: jgrusewski Date: Wed, 8 Jul 2026 20:49:32 +0200 Subject: [PATCH] =?UTF-8?q?feat(cockpit):=20"ref"=20badge=20=E2=80=94=20ma?= =?UTF-8?q?rk=20reference-only=20(non-active-venue)=20tracks?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Binance is no longer an active execution venue (deploy = Bybit, equities = Alpaca). FleetRow.reference_only = venue not in the active set {bybit-perp, alpaca-paper}, computed in DashboardService. The All-forward-tracks table shows a subtle bordered "ref" tag next to the venue for reference-only tracks — the Binance discovery tracks (crypto_tstrend/unlock/xsfunding/stablecoin/combined) + the glbx 60/40 benchmark — so it is clear at a glance which tracks are observed-only vs traded live. Verified in a real browser against the prod DB: ref on the 6 Binance/glbx tracks, none on the 4 Bybit/Alpaca tracks. Full suite green (1833). Co-Authored-By: Claude Opus 4.8 --- src/fxhnt/adapters/web/templates/cockpit.html | 1 + src/fxhnt/application/dashboard_service.py | 5 +++++ src/fxhnt/ports/dashboard.py | 3 +++ 3 files changed, 9 insertions(+) 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)