# TODO przed zakupem bare metal (RPC+Geyser) — żeby dzień 0 poszedł gładko Cel: zanim kupisz bare metal, dopinamy wszystko, co nie wymaga własnego RPC, żeby po zakupie: - tylko postawić RPC+Geyser wg runbooka, - przepiąć endpointy w k3s i zrobić rollout, - zweryfikować stabilność feedu i gotowość do live. --- ## Status (staging / `trade.mpabi.pl`) + TODO bieżące - [x] **Precomputed candles cache (TF: `1s..1d`, target `1024`/TF)** na backendzie (k3s) + worker liczący “ciągle”. - [x] **DLOB slippage v2** (tabele v2 + dual-write), żeby obsłużyć “rozmiary USD” z częściami dziesiętnymi. - [x] **Frontend (visualizer)**: dodane TF: `1s 3s 5s 15s 30s 1m 3m 5m 15m 30m 1h 4h 12h 1d` + szybkie przełączanie (abort poprzednich requestów). - [x] **Wdrożenie na k3s**: zbudowany i wypchnięty nowy obraz `trade-frontend` + zaktualizowany `trade-deploy` (Argo rollout). **Do zrobienia teraz (żeby „lokalny frontend” i staging działały spójnie):** - [ ] **Sprawdzić `/graphql` (Hasura proxy) po sesji**: potwierdzić, że po `POST /auth/login` zapytania GraphQL działają i nie ma `Malformed Authorization header`. - [ ] **Sprawdzić czasy przełączania TF w UI**: czy klik w TF tylko czyta cache i nie czeka na liczenie (ma być natychmiast). - [ ] **Naprawić „kafelek” w headerze market** na 100% skali (overflow/ellipsis, czytelność liczb). - [ ] **DLOB fullscreen w stack/layers**: upewnić się, że działa tak jak chart (fullscreen / exit) i że w stack mode jest czytelne. - [ ] **Panel warstw**: dopracować UX (auto-hide + lock, DnD kolejności, suwaki opacity/brightness na warstwach) + skrócić formatki (więcej miejsca na wykresy). - [ ] **“New contract estimate” live**: dodać toggle “auto refresh” i rysować wykresy time-series (1 px ~ 1s) tylko dla zmiennych (cena/impact/total), a stałe (fee) jako stałe wartości. --- ## A) Decyzje i parametry (bez kodu, ale blokują implementację) - [ ] **Docelowe porty i adresacja WireGuard**: - WG subnet (np. `10.8.0.0/24`), IP bare metal i IP k3s/VPS - port WG (np. `51820/udp`) - private bind dla: RPC `8899`, WS `8900`, gRPC `10000` - [ ] **Polityka dostępu**: - allowlist IP do SSH - czy gRPC wymaga auth/token dla klientów - [ ] **Retencja danych (start)**: - TS: 7 dni “gęsto” (np. 1–5s) + czy robimy downsample 1m na dłużej - [ ] **Model intent**: - potwierdzone: offset (ticks/bps) + desired-state (jest w `doc/drift-perp-contract.md`) - [ ] **Ryzyko (hard caps)**: - max position USD, max reprices/min, max slippage/spread, freshness --- ## B) Dane i historia (żeby warstwy działały live+history) - [ ] **DLOB TS tables**: `dlob_stats_ts`, `dlob_depth_bps_ts`, `dlob_slippage_ts` - indeksy `(market_name, ts)` i retencja 7 dni - [ ] **Archiver/collector**: - worker, który zapisuje TS (z `*_latest` do `*_ts`), albo rozszerzenie istniejących workerów - [ ] **Downsample (opcjonalnie, ale pro)**: - continuous aggregates (Timescale) lub job 1m/5m - [ ] **Hasura bootstrap**: - track tabel TS + uprawnienia `select` (public) dla UI history --- ## C) Kontrakty bota i audyt (must-have przed live) - [ ] **Schema**: - `bot_contracts` (desired-state + status) - `bot_events` (audit log) - mapowanie: `decision_id`, `client_order_id`, `drift_order_id`, `tx_sig` - [ ] **Observe-only executor** (k3s): - buduje features i zapisuje `decision` do `bot_events`, bez składania tx - [ ] **Reconcile logic (no trade yet)**: - start → odczyt observed state z Drift → porównanie do DB → log “diff” - [ ] **Kill-switch w executorze**: - env var + DB flag + safety triggers (feed stale, RPC lag) --- ## D) Vast (GPU tylko na kilka godzin) — przygotowanie pod ephemeral training - [ ] **Dataset export** (z k3s/DB): - jeden plik `parquet/jsonl.zst` + `dataset_version` (hash) - minimalny “train split / eval split” - [ ] **Training entrypoint** (jedna komenda): - skrypt/komenda, która: download dataset → train → eval → export - [ ] **Artifact upload**: - preferowane: scp na VPS/k3s albo Gitea Packages - wersjonowanie: `model_version` + `dataset_version` - [ ] **Predictor contract test**: - walidator JSON schema `trade_intent` - test: “intent TTL expired” + “gates fail” + “panic” --- ## E) UI (warstwy + live/history, bez liczenia w JS) - [ ] **Tryb Live/History**: - Live: subscriptions na `*_latest` - History: query na `*_ts` + timeframe `tf` - [ ] **Warstwy/Panele z `doc/stats.md`**: - mapowanie 1:1 na tabele (brak obliczeń w UI) - [ ] **Podgląd kontraktów**: - panel “Contracts” z `bot_contracts` + “Event timeline” z `bot_events` --- ## F) Operacje (żeby bare metal nie stał się snowflake) - [ ] **Sekrety i endpointy**: - w k3s: secret `trade-dlob-rpc` / analogiczny na nowy endpoint (WG) - fallback endpoint (np. public provider) jako opcjonalny drugi URL - [ ] **Monitoring/alerty na k3s**: - freshness DLOB/ticks, error rate workerów, restart loops - [ ] **Checklist “Day 0”**: - przejście krok po kroku wg `doc/solana-rpc-geyser-setup.md` - smoke test: `dlob-publisher` bez reconnect storm