2026-07-08 17:02:33 -04:00
|
|
|
|
# Session handoff — 2026-07-08 (rev 3: books aligned, Set E live, fresh $1k)
|
2026-07-07 22:24:58 -04:00
|
|
|
|
|
2026-07-08 17:02:33 -04:00
|
|
|
|
Self-contained pickup for a fresh session (human or AI). Read
|
|
|
|
|
|
[README.md](README.md) gotchas 1–15, [FINDINGS.md](FINDINGS.md) (especially
|
|
|
|
|
|
the three 2026-07-08 sections at the end), and [LIVE_ROLLOUT.md](LIVE_ROLLOUT.md).
|
|
|
|
|
|
The repo is authoritative; project memory has deeper history.
|
2026-07-07 22:24:58 -04:00
|
|
|
|
|
|
|
|
|
|
## Where things stand (all green)
|
|
|
|
|
|
|
2026-07-08 17:02:33 -04:00
|
|
|
|
- **Live paper bot**: Fly.io `wwf-copybot`, region `arn` (Stockholm), push
|
|
|
|
|
|
mode, ONE machine. Following **Set E** (7 volume wallets): LSB1,
|
|
|
|
|
|
imwalkinghere, Kruto2027, 0xbadaf319, gkmgkldfmg, AIcAIc, 1kto1m.
|
|
|
|
|
|
`flyctl logs --app wwf-copybot`.
|
|
|
|
|
|
- **The book is a fresh $1,000, reset 2026-07-08 ~20:45 UTC** — this is the
|
|
|
|
|
|
CALIBRATION EXPERIMENT: measure the live-to-backtest ratio for Set E with
|
|
|
|
|
|
every fix live from day one; that ratio (not the replay %) sizes real money.
|
|
|
|
|
|
Old book (Jun 25 → Jul 8, +$229.79) is in git history +
|
|
|
|
|
|
`archive/copybot_fills.pre-reset-2026-07-08.jsonl`.
|
|
|
|
|
|
- **The three books agree by construction** (2026-07-08 alignment work):
|
|
|
|
|
|
same W/L/R/S taxonomy (win% = held-to-resolution only), same
|
|
|
|
|
|
sold-vs-redeem price discriminator (redeem prints exactly the payout), same
|
|
|
|
|
|
pinned floors, same follow set. Row-level cross-check bot↔backtest: 7/9
|
|
|
|
|
|
exact, 0 absent, 2 legit execution diffs. Sharps table reproduces PM's
|
|
|
|
|
|
per-position books to the dollar; PM's LEADERBOARD is the biased number.
|
|
|
|
|
|
- **Dashboards**: [jaxperro.com/trading](https://jaxperro.com/trading) =
|
|
|
|
|
|
paper book + backtest + sharps; [jaxperro.com/live](https://jaxperro.com/live)
|
|
|
|
|
|
= REAL MONEY page (NOT STARTED until Phase 2). Shared renderer:
|
|
|
|
|
|
`jaxperro/trading/copybot-section.js`. `?botFeed=`/`?rmFeed=` query params
|
|
|
|
|
|
override feeds for local testing.
|
2026-07-08 17:44:56 -04: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)
|
2026-07-08 17:09:46 -04:00
|
|
|
|
appends one live-vs-model row/day to `live/history/calibration.csv` and
|
2026-07-08 17:02:33 -04:00
|
|
|
|
re-derives everything under the new rules: entries cursors now invalidate
|
|
|
|
|
|
daily, `_open_split` folds by the `redeemable` flag, `rtally` splits SOLD.
|
|
|
|
|
|
- **Backtest**: `portfolio.py` takes `--bank` (backtest.json `"bank"`).
|
|
|
|
|
|
Published feed stays at $1,000 to match the paper book. $500 run: +2728%
|
|
|
|
|
|
(small banks compound faster — their-bet ceilings bind later).
|
2026-07-07 22:59:37 -04:00
|
|
|
|
|
2026-07-09 20:23:17 -04:00
|
|
|
|
## LIVE PLACEMENT — root cause SOLVED, one user action + one port remain
|
|
|
|
|
|
|
|
|
|
|
|
Why the real-money bot placed nothing (2026-07-09/10 investigation, every
|
|
|
|
|
|
link proven): (1) the first two qualifying signals CRASHED the bot inside
|
|
|
|
|
|
the unguarded live order path (machine events: exit_code=1 at 21:21:55 and
|
|
|
|
|
|
21:53:35, seconds after each signal) and boot-baseline then marked the
|
|
|
|
|
|
fresh trades seen — both bugs FIXED (executor never raises; poll guard;
|
|
|
|
|
|
baseline exempts trades younger than the stale window). (2) With crashes
|
|
|
|
|
|
fixed, the probe exposed the real wall: **py-clob-client is ARCHIVED** and
|
|
|
|
|
|
the CLOB rejects its orders ('invalid order version') — reads/auth still
|
|
|
|
|
|
work, placement is dead for everyone on the old client. (3) The successor
|
|
|
|
|
|
is **Polymarket/py-sdk** (`pip install --pre polymarket-client`,
|
|
|
|
|
|
SecureClient). (4) Under it, the account's legacy proxy (0xbb2aC6b8…) is
|
|
|
|
|
|
refused as maker ('use the deposit wallet flow'); bootstrap
|
|
|
|
|
|
(host/wallet_bootstrap.py) minted a Builder API key with existing auth and
|
|
|
|
|
|
DEPLOYED the signer's Deposit Wallet:
|
|
|
|
|
|
**0x455e252e45Ee46d6C4cc1c8fAdD3899d68f245a1**.
|
|
|
|
|
|
|
2026-07-09 20:44:54 -04:00
|
|
|
|
Remaining — WRAP STEP ONLY (status 2026-07-10 early AM): the $24.73 sits
|
|
|
|
|
|
SAFE as native USDC at the deposit wallet (user's key controls it;
|
|
|
|
|
|
recoverable/transferable at any time). Proven working tonight via probes:
|
|
|
|
|
|
auth ✓, gasless execution ✓ (two real relayer txs: USDC approval
|
|
|
|
|
|
0x1044d3c7…, earlier 0x935be727…), setup_trading_approvals ✓ (max-uint on
|
|
|
|
|
|
all spenders), order FORMAT accepted ✓. The one remaining gap: the
|
|
|
|
|
|
exchange's balance view counts only the COLLATERAL token
|
|
|
|
|
|
(0xC011a7… wraps native USDC; UI flows wrap on deposit; our raw transfer
|
|
|
|
|
|
bypassed it). Attempted: public wrapper periphery 0x93070a…
|
|
|
|
|
|
wrap(asset,to,amount) via gasless batch → 'batch would revert' (likely
|
|
|
|
|
|
caller-role-gated); neg-risk adapter ruled out (its mints are redeem
|
|
|
|
|
|
change). NEXT SESSION (do NOT guess with live funds): read the ts-sdk's
|
|
|
|
|
|
deposit/wrap implementation for deposit wallets (Polymarket/ts-sdk — same
|
|
|
|
|
|
unified family, will contain the exact supported call), replicate via
|
|
|
|
|
|
execute_transaction, THEN port LedgerLiveExecutor to the new SDK
|
|
|
|
|
|
(place_market_order: BUY amount=$USD / SELL shares=, FAK; construct
|
|
|
|
|
|
SecureClient(private_key) — wallet resolves, no api_key needed at runtime
|
|
|
|
|
|
once approvals exist), add polymarket-client to fly.Dockerfile, re-probe
|
|
|
|
|
|
(host/order_probe_v2.py — contains the full working onboarding sequence),
|
|
|
|
|
|
re-arm. CLEANUP: several builder API keys were minted by probe runs —
|
|
|
|
|
|
fetch_builder_api_keys/revoke the extras. The armed live bot remains
|
|
|
|
|
|
harmless (ok:False + honest missed rows on every attempt).
|
2026-07-09 20:23:17 -04:00
|
|
|
|
|
2026-07-08 18:05:21 -04:00
|
|
|
|
## Queued next-session work (in value order)
|
|
|
|
|
|
|
2026-07-09 13:53:52 -04:00
|
|
|
|
0. **MORNING FORENSICS — paper-book drift −11.32 (alarm intentionally red).**
|
|
|
|
|
|
The clobber bug is FIXED (settled records archive to token#ts keys on
|
|
|
|
|
|
re-entry; two vanished records recovered from state git history and
|
|
|
|
|
|
restored). What remains: with truth restored, drift reads −11.32 — a
|
|
|
|
|
|
separate cash-outflow-without-ledger-counterpart accumulated during
|
|
|
|
|
|
2026-07-09's 27-copy day. Suspect classes: sell fills drained against
|
|
|
|
|
|
already-settled records (sold_proceeds mutated post-pnl counts nowhere),
|
|
|
|
|
|
settle math on re-entered tokens, trim flows. Method: replay
|
|
|
|
|
|
copybot_fills.jsonl + state-history settles against the invariant
|
|
|
|
|
|
term-by-term until the residual attributes. The fills ledger now has
|
|
|
|
|
|
per-token BUY lines + book snapshots; state history is committed every
|
|
|
|
|
|
few minutes. LIVE BOOK UNAFFECTED (0 trades, drift 0.00) and protected
|
|
|
|
|
|
by the clobber fix before its first re-entry.
|
|
|
|
|
|
|
2026-07-08 18:28:28 -04:00
|
|
|
|
1. **Exact-res_t migration**: plan agreed 2026-07-08 — execute
|
|
|
|
|
|
[ETHERSCAN_MIGRATION.md](ETHERSCAN_MIGRATION.md) phase by phase
|
|
|
|
|
|
(0: chain sweep backfill → 1: shadow audit → 2: validate_timing →
|
|
|
|
|
|
3: portfolio → 4: selection+floors → 5: trust simplification LAST).
|
|
|
|
|
|
One phase per session, before/after diffs, never coupled with
|
|
|
|
|
|
follow-set changes.
|
2026-07-08 18:05:21 -04:00
|
|
|
|
2. **Empirical fill model**: every copy now logs a `book` snapshot (spread +
|
|
|
|
|
|
5c depth) to the fills ledger; once a few weeks accumulate, fit slippage
|
|
|
|
|
|
vs stake/depth and replace portfolio.py's flat SLIP haircut; add a depth
|
|
|
|
|
|
gate before real-money sizing.
|
|
|
|
|
|
3. **Funding-cluster tracer port** to Etherscan logs (Alchemy free tier now
|
|
|
|
|
|
caps getLogs at 10 blocks — insider.py's ring detection is degraded
|
|
|
|
|
|
until then).
|
|
|
|
|
|
|
2026-07-08 17:02:33 -04:00
|
|
|
|
## Watch list (the standing question: does Set E hold up?)
|
2026-07-07 22:59:37 -04:00
|
|
|
|
|
2026-07-08 18:14:10 -04:00
|
|
|
|
- **0xbadaf319** — 2026-07-08 evening revealed his structure: PAIRED YES+NO
|
|
|
|
|
|
clips ($6–37 each, sums ≈ $1.00) = two-sided arb/merge flow, not
|
|
|
|
|
|
directional conviction. Copying one leg of a hedge is a bet HE never took;
|
|
|
|
|
|
his replay P&L rode the larger leg of pairs. Moves to the TOP of the
|
|
|
|
|
|
demotion watch list — judge on forward copies, not his account P&L.
|
2026-07-08 17:02:33 -04:00
|
|
|
|
- **AIcAIc** — held-win only 42%; his edge is sell-timing (most lag-fragile
|
2026-07-08 18:14:10 -04:00
|
|
|
|
class). Second demotion candidate.
|
2026-07-08 17:02:33 -04:00
|
|
|
|
- **1kto1m** (z=2.4) and **gkmgkldfmg** (z=2.05) — near the gate floor;
|
|
|
|
|
|
strong month, shallow statistical edge.
|
|
|
|
|
|
- Re-ranking is cheap: the per-wallet replay harness pattern is in FINDINGS
|
|
|
|
|
|
("Aligning the three books"); `python3 live/portfolio.py --wallets 0x…
|
|
|
|
|
|
--days 30 --out /tmp/w.json` per candidate, then combined-set runs.
|
|
|
|
|
|
- Rejected-with-evidence (don't re-add without new facts): oliman2 (true
|
|
|
|
|
|
lifetime ~$19k), leegunner (negative to copy), 0xb0E43B/ArbTraderRookie
|
|
|
|
|
|
(refund harvesters — real edge, uncopyable margins), lma0o0o0o (negative in
|
|
|
|
|
|
the shared book), Winnertraders (6.6-day capital locks).
|
2026-07-07 22:59:37 -04:00
|
|
|
|
|
2026-07-09 13:56:02 -04:00
|
|
|
|
## Real-money worker — ARMED AND LIVE (2026-07-09 ~04:37 UTC)
|
2026-07-08 23:23:51 -04:00
|
|
|
|
|
2026-07-09 13:56:02 -04:00
|
|
|
|
`wwf-copybot-live` is trading REAL MONEY: $24.73 book, Set E, $5 stakes,
|
|
|
|
|
|
rule-0.6 caps ($5/trade · $25/day · $30 exposure), poll mode 60s, own state
|
|
|
|
|
|
`copybot_state.live.json`, feed `live/copybot_live_real.json` →
|
|
|
|
|
|
jaxperro.com/live. Armed via LIVE_CONFIRM env (user-typed phrase; unset to
|
|
|
|
|
|
disarm at next boot; `flyctl apps stop wwf-copybot-live` = instant stop).
|
|
|
|
|
|
auto_redeem OFF (no POL gas) — after a WIN, redeem manually in the UI;
|
|
|
|
|
|
CASH≠CHAIN nags until done. Discord pings per placement/exit/settle via
|
|
|
|
|
|
DISCORD_WEBHOOK secret. Phase 4 (supervised first fill checklist in
|
|
|
|
|
|
LIVE_ROLLOUT) runs when the first conviction signal lands — zero live
|
|
|
|
|
|
trades so far; fill-split merging (see below) shipped 2026-07-09 evening
|
|
|
|
|
|
after 13h of sub-floor-clip skips. No watchdog on the live app yet (poll
|
|
|
|
|
|
mode, no HTTP) — liveness = flyctl logs + feed freshness.
|
2026-07-08 23:23:51 -04:00
|
|
|
|
|
2026-07-09 13:56:02 -04:00
|
|
|
|
## Venue fork — RESOLVED 2026-07-09 (user funded polymarket.com)
|
2026-07-08 23:48:25 -04:00
|
|
|
|
|
2026-07-09 13:56:02 -04:00
|
|
|
|
The first deposit landed on polymarket.us by mistake (off-chain venue, no
|
|
|
|
|
|
keys — incompatible with the stack; $32 still sits there, user may withdraw).
|
|
|
|
|
|
User then funded a polymarket.com account ($24.73 after fees) and the live
|
|
|
|
|
|
worker armed against it. Residual security to-dos: revoke the polymarket.us
|
|
|
|
|
|
API key f03d9eb5… (secret appeared in a chat screenshot) and rotate the
|
|
|
|
|
|
Discord webhook committed to this repo's history pre-2026-07-09.
|
2026-07-08 23:48:25 -04:00
|
|
|
|
|
2026-07-07 22:59:37 -04:00
|
|
|
|
## Next: Phase 2 — funding (USER ONLY)
|
|
|
|
|
|
|
2026-07-08 17:02:33 -04:00
|
|
|
|
Phase 1 is 8/8 complete (LIVE_ROLLOUT.md). Before funding, the user should
|
|
|
|
|
|
decide the stranding tolerance explicitly: real money turns the primary risk
|
|
|
|
|
|
from P&L into the ACCOUNT (US person routing orders via Stockholm through the
|
|
|
|
|
|
geoblock — a frozen wallet is a different loss category than a losing bet).
|
|
|
|
|
|
Caps stay $5/trade · $25/day · $30 exposure until Phase 6. Then Phase 3
|
|
|
|
|
|
preflight (`preflight_live.py`) → Phase 4 supervised first fill → Phase 5
|
|
|
|
|
|
edge-case matrix. The typed-phrase interlock is the human checkpoint — never
|
|
|
|
|
|
automated.
|
2026-07-07 22:24:58 -04:00
|
|
|
|
|
|
|
|
|
|
## Standing to-dos (user-only or external)
|
|
|
|
|
|
|
2026-07-08 17:27:33 -04:00
|
|
|
|
- **None open.** Alchemy key ROTATED 2026-07-08: old app "Jax's First App"
|
|
|
|
|
|
(key `…OdWgOi`, the one leaked to public git history) deleted; new app
|
|
|
|
|
|
`wwf-rpc-2026-07` (key `…w0BxV5`) wired into gitignored `config.json` +
|
|
|
|
|
|
the `ALCHEMY_RPC_URL` Fly secret. Verified: old key → HTTP 401 (the key
|
|
|
|
|
|
in git history is now dead, so no history rewrite needed), new key serves
|
|
|
|
|
|
Polygon, bot rebooted with settle-fallback ON and made a live copy, Notify
|
|
|
|
|
|
webhook `wh_blf4qjjvfdbqs9mc` survived (app-delete doesn't touch Notify
|
|
|
|
|
|
resources) — 7 addresses in sync. Railway project deleted (purges 07-10).
|
2026-07-07 22:24:58 -04:00
|
|
|
|
|
|
|
|
|
|
## Operational quick-reference
|
|
|
|
|
|
|
2026-07-08 17:02:33 -04:00
|
|
|
|
- **Change the follow set**: edit `live/copybot.paper.json` wallets →
|
2026-07-07 22:24:58 -04:00
|
|
|
|
`./live/deploy_bot.sh` (validates → pins floors → syncs Alchemy webhook →
|
2026-07-08 17:02:33 -04:00
|
|
|
|
restarts Fly → confirms banner). Keep `backtest.json` mirrored.
|
|
|
|
|
|
- **State surgery (reset/repair the book)**: `flyctl machine stop` FIRST,
|
|
|
|
|
|
push the new state, `flyctl apps restart`, then VERIFY the first heartbeat
|
|
|
|
|
|
shows the book you wrote (gotcha 15: the bot's memory wins conflicts by
|
|
|
|
|
|
design, and a boot clone can read a stale GitHub replica for a few seconds).
|
|
|
|
|
|
- Never 2 Fly machines (`flyctl scale count 1`) — one book, one writer.
|
|
|
|
|
|
- Cache is single-writer; don't run cache-touching scripts during the daily
|
|
|
|
|
|
pipeline or a regen. Three cursors per wallet (gotcha 12).
|
|
|
|
|
|
- Bot commits its own state/feed — `git pull --rebase --autostash` before
|
|
|
|
|
|
pushing. Image changes (fly.Dockerfile, host/) need
|
|
|
|
|
|
`flyctl deploy --remote-only`; code/config changes just push + restart.
|