Quasar-Executo / README.md
KarlQuant's picture
Update README.md
1367f8f verified
---
title: K1RL QUASAR Executo Hub
emoji: πŸ›°οΈ
colorFrom: indigo
colorTo: blue
sdk: docker
pinned: false
---
# K1RL QUASAR β€” Executo Hub
**Central WebSocket hub for the K1RL QUASAR system.**
Receives live training and voting metrics from all Asset Spaces, normalizes them, and broadcasts snapshots to the Ranker Space in real time.
---
## Architecture Role
```
Asset Space A ──┐
Asset Space B ──┼──► /ws/publish/{space_name} ──► HUB ──► /ws/subscribe ──► Ranker Space
Asset Space C β”€β”€β”˜ β”‚
└──► /rankings (REST fallback)
```
The hub sits between publishers (Asset Spaces) and subscribers (Ranker Space). It is **strictly one-way** β€” the hub never writes back to publishers, and subscribers never send data to publishers.
---
## What This Space Does
- Accepts WebSocket connections from Asset Spaces on `/ws/publish/{space_name}`
- Accepts WebSocket connections from the Ranker Space on `/ws/subscribe`
- Validates and normalizes every inbound payload against a strict data model
- Stores the **latest snapshot only** per asset (no history)
- Broadcasts each update immediately to all connected subscribers
- Serves a live dashboard at `/` and a REST fallback at `/rankings`
---
## Endpoints
| Endpoint | Protocol | Direction | Description |
|---|---|---|---|
| `/ws/publish/{space_name}` | WebSocket | Asset Space β†’ Hub | Publishers send metrics here |
| `/ws/subscribe` | WebSocket | Hub β†’ Ranker | Subscribers receive broadcasts here |
| `/` | HTTP GET | β€” | Live dashboard UI |
| `/rankings` | HTTP GET | β€” | Latest snapshot for all assets |
| `/metrics/{space_name}` | HTTP GET | β€” | Latest snapshot for one asset |
| `/health` | HTTP GET | β€” | Hub health and publisher status |
| `/api/state` | HTTP GET | β€” | Full state polled by dashboard every 2s |
---
## Data Model
Only these fields are permitted through the hub. All others are **silently dropped**.
**Training**
```
training_steps int
actor_loss float
critic_loss float
avn_loss float
avn_accuracy float (0.0 – 1.0)
```
**Voting**
```
dominant_signal str ("BUY" | "SELL" | "NEUTRAL")
buy_count int
sell_count int
last_price float
signal_source str
```
---
## Accepted Publisher Message Types
Asset Spaces may send any of the following JSON message formats:
```jsonc
// Combined payload
{ "type": "metrics", "training": { ... }, "voting": { ... } }
// Training only
{ "type": "training", "data": { ... } }
// Voting only
{ "type": "voting", "data": { ... } }
// Keep-alive (silently acknowledged, no reply)
{ "type": "heartbeat" }
{ "type": "identify", "space": "space-name" }
{ "type": "ping" }
```
---
## Subscriber Message Types
Newly connected subscribers receive a full current state dump, then live updates as they arrive:
```jsonc
// Sent once on connection
{ "type": "initial_state", "snapshots": { ... }, "hub_timestamp": 1234567890.0 }
// Sent on every inbound publish
{ "type": "metrics_update", "space_name": "...", "snapshot": { ... }, "hub_timestamp": 1234567890.0 }
```
---
## AXRVI Ranking Formula
The `/rankings` and `/api/state` endpoints rank assets using:
```
signal_confidence = max(buy_count, sell_count) / (buy_count + sell_count)
score = signal_confidence - avn_accuracy
```
Assets are sorted **descending by score**.
---
## Connecting an Asset Space
Asset Spaces connect using `log_metrics_reader.py`. The hub URL is resolved automatically from the `SPACE_ID` environment variable β€” no configuration is needed inside the asset space files.
The hardcoded target for all asset spaces is:
```
wss://karlquant-quasar-executo.hf.space/ws/publish/{space_name}
```
If the hub restarts, asset spaces **auto-reconnect within 30 seconds** via the built-in exponential back-off in `AssetSpacePublisher._run_loop`. No intervention is needed.
---
## Deploying a New Hub Version
To update the hub without triggering any asset space restarts:
1. Upload the new `websocket_hub.py` to **this Space only**
2. This Space restarts and begins accepting connections on the same URL
3. Asset spaces detect the disconnection and reconnect automatically
No changes are needed to `log_metrics_reader.py` or any asset space env vars.
---
## Files
| File | Purpose |
|---|---|
| `websocket_hub.py` | Hub server β€” FastAPI + WebSocket engine |
| `hub_dashboard.html` | Live dashboard UI served at `/` |
| `requirements.txt` | `fastapi`, `uvicorn`, `websockets` |
---
## Runtime
| Setting | Value |
|---|---|
| Default port | `7860` (override via `PORT` env var) |
| Dashboard HTML path | Override via `DASHBOARD_HTML` env var |
| Host | `0.0.0.0` |
---
## Version
`v2.0-arch-strict` β€” strict data model, event-driven broadcast, deep-copy safe ingestion pipeline.