diff --git a/HANDOFF.md b/HANDOFF.md index d668c8f1..a14dfcb0 100644 --- a/HANDOFF.md +++ b/HANDOFF.md @@ -1,4 +1,28 @@ -# Session handoff — 2026-07-15 (rev 13: paper FAK parity; rev 12: chain-seed) +# Session handoff — 2026-07-17 (rev 14: +$44 bankroll, exact paper-parity config; rev 13: FAK parity; rev 12: chain-seed) + +## 2026-07-17: bankroll top-up + USER DIRECTIVE — live mirrors paper EXACTLY +- **User deposited +$44.14** (Cash App → BTC → bridge, 70241 sats; ~$6 lost + to Cash App spread + BTC conversion — Polygon USDC is the cheap route). + Book rebased: cash = chain $50.53, bankroll $22.28 → **$61.21** (= equity + at rebase, per the config rule). Adjustment logged as deposit-not-P&L. + 4%-sizing now ≈ $2.45/bet. +- **USER DIRECTIVE (2026-07-16): the live bot mirrors the paper test + EXACTLY.** Caps were already off (retired 07-10). Parity sync applied: + risk.max_price 0.95 → **0.99** (paper's), wallet floors synced to paper's + current pins, dead `follow.per_wallet_min_usd` block removed (overwritten + at load by wallets[] — it had gone stale). DELIBERATE exception: + min_order_usd stays $1 (venue physical minimum; paper's $5 never binds at + its equity — copying it would force $2.45 signals up to $5 = 8% of equity, + DIVERGING from the 4% rule). NOTE: nothing auto-writes the live config — + floors drift from paper's nightly sync until manually re-synced; check at + each Friday bench review. +- **Ops lesson (now README gotcha 15, third corollary)**: `flyctl machine + stop` reported stopped while the process ran 25 more minutes — the rebase + boot came up stale with ⚠ CASH≠CHAIN −$44.12 (alarm correct, money safe). + A plain restart after the push landed picked everything up cleanly. Before + state surgery: watch heartbeats actually CEASE. +- Docs sweep: README follow-set (Set E rev 4), chain-seed + FAK-parity + + edge.py coverage, stale "tiny test caps" pointer fixed. ## Operating boundary set by the user (2026-07-13, "away for a while") **Full autonomy on BOTH bots**; real-money bot **stays ARMED**. Never touch diff --git a/README.md b/README.md index ee0af7fb..1658cc6d 100644 --- a/README.md +++ b/README.md @@ -24,7 +24,7 @@ Three deployed pieces + one static dashboard: | piece | where it runs | what it does | |-------|--------------|--------------| | **daily pipeline** (`live/daily.sh`) | this Mac, launchd **08:00** (a `pmset repeat wakeorpoweron` RTC wake at **07:58** makes this run on time even from sleep — set 2026-07-08, undo with `sudo pmset repeat cancel`; job wrapped in `caffeinate -i` so mid-run idle-sleep can't kill it. Heads-up: the wake fires even lid-closed-in-a-bag — cancel it if the Mac travels) | 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`) and verifies the clone against `git ls-remote` (stale-replica guard) | **T0 = the RTDS trade stream** (gotcha 18): every platform trade, wallet-attributed, **~1s detection** (measured p50 0.8s over 22k msgs), silent-stale guard force-reconnects a quiet socket. Backstops: the Alchemy address-activity webhook (~3s, `POST /alchemy`, signature-verified), a 5-min backstop poll, and the reconcile janitor. Per-wallet **trade cursor** paginates the activity feed so clip bursts can't scroll past a fetch (H3). 60s heartbeat settles/publishes; paper-copies with real fees/lag/slippage; commits its book back to the repo | +| **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`) and verifies the clone against `git ls-remote` (stale-replica guard) | **T0 = the RTDS trade stream** (gotcha 18): every platform trade, wallet-attributed, **~1s detection** (measured p50 0.8s over 22k msgs), silent-stale guard force-reconnects a quiet socket. Backstops: the Alchemy address-activity webhook (~3s, `POST /alchemy`, signature-verified — **T0b chain seed** 2026-07-14: its tx hashes decode straight from the receipt's OrderFilled logs when the data-api indexer lags, so RTDS-silent markets still copy at push speed), a 5-min backstop poll, and the reconcile janitor. Per-wallet **trade cursor** paginates the activity feed so clip bursts can't scroll past a fetch (H3). 60s heartbeat settles/publishes; paper-copies with real fees/lag/slippage AND live-FAK thin-book reality (**paper FAK parity** 2026-07-16: a quote with no ask inside the protected band books a MISS, not a fill — keeps the live-vs-paper per-signal ratio honest; `live/edge.py` turns it into the daily bankroll-decision verdict in `history/edge.csv` + the Discord digest footer); commits its book back to the repo | | **REAL-MONEY worker** (same code, `COPYBOT_ROLE=live`) | **Fly.io app `wwf-copybot-live`, `arn`, 24/7, ARMED 2026-07-10** — separate app so the two books never share a process, state file, or failure mode. Trades the signer's **Deposit Wallet** `0x455e…45a1` (pUSD collateral) via the unified SDK (`polymarket-client`) | Same T0 RTDS detection (`RTDS_DETECT=1`) + Alchemy/poll backstops; **own-fill push** via the CLOB user channel (`userws` in the heartbeat) makes in-play pending holds adopt the moment they match — ws events only *trigger* the resolver, `get_order` stays the arbiter (gotcha 17). Paper-parity sizing (4% of equity, $1 venue floor, no price floor, hard caps retired — the **depth gate** is the scaling rail: skip spread>0.08 or ask5c<$50, stake ≤10% of 5c depth). Every placement/exit/settle pings Discord. Disarm: `flyctl secrets unset LIVE_CONFIRM -a wwf-copybot-live` | | **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 for PAPER; the LIVE book pings every real placement/exit/settle) | | **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` — live since 2026-07-10). Both pages share `trading/copybot-section.js` — one renderer, no drift | @@ -32,14 +32,16 @@ Three deployed pieces + one static dashboard: **The calibration experiment (running now):** a fresh $1,000 paper book, **reset 2026-07-08** so it measures exactly one thing — the follow set in **`live/copybot.paper.json`** (the single source of truth) from a clean start, -with every bookkeeping fix live from day one. The follow set is **Set E rev 2** -(2026-07-13, curated on the 5-day forward sample): five volume wallets — -**Kruto2027 (floor lowered to $80 — +$736 from 2 copies at z=19.3), -0xbadaf319, gkmgkldfmg, AIcAIc, 1kto1m**. Dropped: imwalkinghere (his flow -is 5-min BTC Up/Down markets that resolve faster than any copy — 0 copies, -misses would have LOST) and LSB1 (worst forward P&L, −$397 — demoted to -`backtest.json` to re-prove). The backtest additionally proves a bench: -Vahan88, 42021, BikesAreTheBikes, EdwardIN. All are copied on their +with every bookkeeping fix live from day one. The follow set is **Set E rev 4** +(2026-07-16, weekly bench review — HANDOFF logs each revision's evidence): +six volume wallets — **Kruto2027 (floor 80 PINNED — `floor_pin` survives the +nightly p80 sync), 0xbadaf319, gkmgkldfmg, 1kto1m, BikesAreTheBikes +(promoted 07-13), AIcAIc (dropped 07-13, re-added 07-16 on +22%-since-drop +forward + the Esports World Cup catalyst)**. Out: imwalkinghere (his flow is +5-min BTC Up/Down markets that resolve faster than any copy), LSB1 (−$438 +all-time paper). The backtest additionally proves the bench: Vahan88, +EdwardIN (both negative forward at the 07-16 review — not promoted). All +followed wallets are copied on their **conviction bets only** (top-20%-by-stake, floor pinned daily from the trusted cache p80 via `sync_floors.py`), 4% of equity/bet, **capped at the signal's own bet size** and by the **depth gate** (≤10% of visible 5c ask @@ -182,7 +184,7 @@ in [`live/README.md`](live/README.md). |------|-------| | `live/copybot.paper.json` | **committed** (no secrets): the live paper bot's wallet set + classes + follow/risk params — deploy with `live/deploy_bot.sh` | | `config.json` | `daily_webhook` (Discord digest) · `alchemy_notify_token` + `alchemy_webhook_id` (webhook address sync) · `alchemy_signing_key` (local push-mode runs) · Alchemy RPC key · a legacy curated watchlist + floors (`sync_floors.py`) | -| `config.live.json` | live-trading credentials (`private_key`, `funder_address`) + tiny test caps — see `LIVE_TEST.md` | +| `config.live.json` | live-trading credentials (`private_key`, `funder_address`); the Fly worker instead reads committed `config.live.example.json` + env secrets. Risk block is **paper-parity** (caps retired 2026-07-10 by user decision; bands/floors mirror `live/copybot.paper.json` — kept in sync MANUALLY, nothing auto-writes it) | | Fly `wwf-copybot` secrets | `GITHUB_TOKEN` (fine-grained PAT, contents-RW on this repo — the bot commits its state/feed back) · `ALCHEMY_SIGNING_KEY` (presence = push mode; remove it to fall back to 60s polling) · `DISCORD_WEBHOOK`. The webhook ingress is `https://wwf-copybot.fly.dev/alchemy` (Alchemy webhook `wh_blf4qjjvfdbqs9mc`, address list auto-synced by `deploy_bot.sh`) | --- @@ -388,6 +390,13 @@ runner is retired (GitHub throttled `*/5` to ~2h in practice — it copied 1 of corollaries: a state push while the bot runs WILL be overwritten, and a boot clone seconds after a push can read a stale GitHub replica — after any surgery, verify the first heartbeat shows the book you wrote. + THIRD corollary (2026-07-17 bankroll rebase): `flyctl machine stop` can + report "stopped" while the process keeps running for many more minutes + (heartbeat cycle numbers kept incrementing 25 min past the "stop") — the + machine then boots on whatever it cloned at ITS OWN restart moment, not + yours. Before editing state, WATCH the heartbeats actually cease; if a + surgery boot shows stale numbers, just restart again once your push is + on origin (second boot picked it up cleanly). 16. **The 2026 exchange stack: pUSD collateral + the unified SDK.** py-clob-client is ARCHIVED (May 2026) — reads/auth still work but the CLOB rejects its orders globally ('invalid order version'). Placement diff --git a/config.live.example.json b/config.live.example.json index 4e7154ba..6ce432ab 100644 --- a/config.live.example.json +++ b/config.live.example.json @@ -9,13 +9,6 @@ "follow": { "buy_only": true, "min_their_usd": 25.0, - "per_wallet_min_usd": { - "0xe8ca3f758c93f44f3ec210542ab78afb7c0bcccb": 80.0, - "0xbadaf319415c17f28824a43ae0cd912b9d84d874": 44.98, - "0xd7d36345c4aab150e59577e360696b01d01d698b": 304.34, - "0xa1d57d329227c75b12b09f927fb3d6d6ef8f1343": 320.95, - "0x215adbb63b47d0ca92f849fe2c2dc1adb0f6254c": 158.0 - }, "min_entry": 0.0, "max_entry": 0.95, "class_pct": { @@ -31,7 +24,7 @@ "max_open_positions": 1000, "max_per_event": 0, "min_price": 0.0, - "max_price": 0.95, + "max_price": 0.99, "min_order_usd": 1.0 }, "live": { @@ -53,25 +46,25 @@ "wallet": "0xbadaf319415c17f28824a43ae0cd912b9d84d874", "name": "0xbadaf319", "class": "volume", - "floor": 44.98 + "floor": 41.21 }, { "wallet": "0xd7d36345c4aab150e59577e360696b01d01d698b", "name": "gkmgkldfmg", "class": "volume", - "floor": 304.34 + "floor": 470.51 }, { "wallet": "0xa1d57d329227c75b12b09f927fb3d6d6ef8f1343", "name": "1kto1m", "class": "volume", - "floor": 320.95 + "floor": 328.77 }, { "wallet": "0x215adbb63b47d0ca92f849fe2c2dc1adb0f6254c", "name": "BikesAreTheBikes", "class": "volume", - "floor": 158.0 + "floor": 227.2 }, { "wallet": "0x921433c93558b9a4ba807ec824d02aad7ea2ddbf",