From 3f4e01ec4593eb27f665449158ae41327a8186ac Mon Sep 17 00:00:00 2001 From: jaxperro Date: Wed, 8 Jul 2026 17:44:56 -0400 Subject: [PATCH] docs: watchdog + caffeinate + engine relocation Co-Authored-By: Claude Fable 5 --- HANDOFF.md | 7 ++++++- README.md | 3 ++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/HANDOFF.md b/HANDOFF.md index 7fa3fde1..7760c613 100644 --- a/HANDOFF.md +++ b/HANDOFF.md @@ -27,7 +27,12 @@ The repo is authoritative; project memory has deeper history. = REAL MONEY page (NOT STARTED until Phase 2). Shared renderer: `jaxperro/trading/copybot-section.js`. `?botFeed=`/`?rmFeed=` query params override feeds for local testing. -- **Daily pipeline** (Mac launchd 08:00, fires on wake — typically ~10:00) +- **Watchdog live (2026-07-08)**: Fly `/health` check auto-restarts a dark + machine; GH Actions `watchdog.yml` probes from GitHub's infra and pings + Discord after 3 failed probes. `copytrade.py` now lives at repo root + (archive/ is 100% retired code again). +- **Daily pipeline** (Mac launchd 08:00, fires on wake — typically ~10:00, + caffeinate-wrapped) appends one live-vs-model row/day to `live/history/calibration.csv` and re-derives everything under the new rules: entries cursors now invalidate daily, `_open_split` folds by the `redeemable` flag, `rtally` splits SOLD. diff --git a/README.md b/README.md index 1f322ec7..d48feea8 100644 --- a/README.md +++ b/README.md @@ -23,7 +23,7 @@ Three deployed pieces + one static dashboard: | piece | where it runs | what it does | |-------|--------------|--------------| -| **daily pipeline** (`live/daily.sh`) | this Mac, launchd **08:00** (runs on wake if the Mac was asleep) | refresh the bet cache → 5-gate skill scan → fee-aware sharp selection → conviction floors → backtest book → publish JSON feeds to GitHub | +| **daily pipeline** (`live/daily.sh`) | this Mac, launchd **08:00** (runs on wake if the Mac was asleep; wrapped in `caffeinate -i` so mid-run idle-sleep can't kill it) | refresh the bet cache → 5-gate skill scan → fee-aware sharp selection → conviction floors → backtest book → publish JSON feeds to GitHub | | **copybot worker** (`copybot.py` via `host/start.sh`) | **Fly.io app `wwf-copybot`, region `arn` (Stockholm), 24/7** — migrated off Railway 2026-07-06: Railway ran it in a US region, which Polymarket's IP geoblock would 403 the moment orders got real; Stockholm is unrestricted AND ~25ms from the CLOB's eu-west-2 primaries. Every boot self-checks the geo-gate (`host/geocheck.py`) | **push mode**: an Alchemy address-activity webhook (`copybot follow set`, Polygon) pings `POST /alchemy` the moment a followed wallet trades (~2–5s detection), signature-verified; a 60s heartbeat settles/publishes and a 5-min backstop poll catches dropped pushes. Paper-copies with real fees/lag/slippage, settles at CLOB resolution, commits its book back to the repo | | **Discord digest** (`live/discord_daily.py`) | end of the daily pipeline | one message/day: the sharp list with profile links + 30-day conviction stats (per-trade pings retired 2026-07-04; the old Alchemy watcher lives in `archive/webhook_receiver.py`) | | **dashboard** | [jaxperro.com/trading](https://jaxperro.com/trading) + [jaxperro.com/live](https://jaxperro.com/live) (static, in the `jaxperro` repo) | `/trading` renders the paper book, backtest book and sharp table; `/live` is the REAL MONEY page (reads `live/copybot_live_real.json`, NOT STARTED until Phase 2). Both pages share `trading/copybot-section.js` — one renderer, no drift | @@ -70,6 +70,7 @@ for the phased path; Phase 1 code prep is complete, Phase 2 is funding). | **watch the live bot** | `flyctl logs --app wwf-copybot` (one summary line per 60s heartbeat); the book is also committed as `live/copybot_live.json` and rendered on the dashboard | | **restart / redeploy the bot** | `flyctl apps restart wwf-copybot` (config/code changes: the worker clones the repo fresh at boot, so a restart IS the deploy). **Changes to `host/` or `fly.toml` need an image rebuild: `flyctl deploy --remote-only`.** Secrets: `flyctl secrets set K=V` (applies with an automatic restart). Keep it ONE machine — Fly loves creating a second for "high availability", and two bots = two writers on one book (`flyctl scale count 1`) | | **reset the paper book** | **stop the machine FIRST** (`flyctl machine stop --app wwf-copybot`), then write a fresh `new_state()` into `copybot_state.json`, archive `copybot_fills.jsonl`, commit+push, then `flyctl apps restart`. Order matters: the running bot's memory is the book's single writer and its publish flow will re-commit its own book over yours (by design — see gotcha 15). Verify the first heartbeat reads `free $1,000/$1,000 · realized $+0` | +| **watchdog** | two layers, both automatic: fly.toml's http `/health` check (Fly restarts a dark machine) + `.github/workflows/watchdog.yml` (GitHub-hosted probe every ~30-150 min → Discord alert via the `DISCORD_WEBHOOK_URL` repo secret when 3 probes fail). Test: `gh workflow run watchdog` | | **run the daily pipeline manually** | `cd live && bash daily.sh` (launchd runs it 08:00; ~40 min, mostly collect). Never run two at once — the cache is single-writer | | **refresh just the sharp list** | `cd live && python3 conviction_scan.py && python3 validate_timing.py` | | **daily Discord digest** | sent by `live/discord_daily.py` at the end of `daily.sh`; webhook = `daily_webhook` in gitignored `config.json` |