Nine fills across both books were followed (tx in seen) and then died
without a trace: _live_price None (no ask — the sharp is the maker on
weekly scalars) and live ORDER FAILED both returned silently. A blocked
or rejected OPEN is a missed bet; now recorded with its true reason.
Allowance ruled out (max-uint on all three exchange contracts).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- start.sh: COPYBOT_ROLE=live — unarmed (missing LIVE_PRIVATE_KEY /
LIVE_FUNDER_ADDRESS / LIVE_CONFIRM) idles in geocheck, no clone, no
book, no orders; armed runs config.live.example.json + own state file
copybot_state.live.json, --live, poll mode (webhook stays on paper).
- confirm_live: accepts the phrase from LIVE_CONFIRM env — the USER
types it into flyctl secrets set (rule 0.7 human checkpoint, headless);
wrong value aborts, unset disarms at next boot.
- config.live.example.json: Set E + pinned floors (mirrors paper),
bankroll $50 @ 10% = $5 stakes, caps untouched (rule 0.6), leaked
Discord webhook URL removed (ROTATE it — was committed publicly).
- fly.live.toml: separate app wwf-copybot-live, arn, no inbound, no
checks, role env baked.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The execution engine was load-bearing from archive/ — the one thing in
there that wasn't retired. Now at repo root next to copybot.py; the two
archived scripts that imported it as a sibling get a parent-path shim.
fly.toml gains an http /health check so Fly restarts a dark machine
(self-heal); the notify half is the GH Actions watchdog (next commit).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Moved the 8 tested-and-failed strategy tools into archive/ (copytrade, backtest,
edge_research, lookback, table_77, lp_screener, lp_paper, xarb) with an
archive/README explaining each. Root now holds the keepers: insider.py (made
self-sufficient — dropped the copytrade load_json dependency) and smart_money.py
(data foundation). New FINDINGS.md is the honest scorecard: six systematic
public-data edges all efficient/illusory, the win-rate survivorship-bias
finding, and the one real signal (z-score improbability + funding clustering).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
The scanner measured win rate over /closed-positions only, but Polymarket
only redeems winning shares — losers sit unredeemed in /positions at
curPrice 0 and never enter closed-positions. That made win rates wildly
inflated (e.g. 90.6% vs a true 48.3%). Win rate now unions both endpoints
over a 90-day window. With the honest metric, ~no top wallet exceeds ~60%;
true rates cluster near 50%.
Also:
- backtest.py: replay a watchlist over a recent window, fill at historical
price, mark outcomes from resolution. A 7d run of 4 top wallets returned
-48%, confirming flat-size entry-copying is -EV at ~50% hit rates.
- copytrade.py: add max_position_usd cap (proportional adds could otherwise
balloon one position to the whole exposure limit) and Discord webhook
alerts on every would-be trade.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Watches a wallet list and copies trades onto your account: % -of-bankroll
sizing, proportional entry/exit mirroring, 5% price guard, and a no-backfill
rule for positions held before start. Paper mode by default; live trading is
gated behind config + --live + a typed confirmation, with hard risk caps
(per-trade, daily, total exposure, open positions, price bounds). Live
execution via py-clob-client (lazy import). Credentials/state gitignored.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>