# HANDOFF — the living state of the world

**The work queue lives in GitHub Issues** (migrated 2026-07-19):
`gh issue list` · labels = silo (`copybot`/`recorder`/`pipeline`/`dashboard`)
× type (`hardening`/`bug`/`research`/`strategy`/`ops`/`user-todo`/
`pre-registered`/`post-mortem`) · milestones = the standing rhythms (audit
backlog, Friday bench reviews, verdict gates). Commits that resolve one say
`closes #N`. The July-2026 narrative/evidence log is FROZEN in
[HANDOFF_ARCHIVE.md](HANDOFF_ARCHIVE.md) — incident post-mortems, decision
rationale, the whole story. This file stays ~a page: boundary, snapshot, ops.

## Issue burndown 2026-07-19 (audit → shipped)
Migrated the queue to GitHub Issues (labels/milestones; `closes #N` in
commits). Closed same day: #3 webhook rotated · #5 listeners start after
seed · #6 dead-code sweep (retired copytrade CLI + LiveExecutor) · #7
chain-balance gate in reconcile_exits + retry (kills the BetBoom zombie
class) · #8 rpc-down heartbeat flag · #9 memory caps (skipped recency-
bounded, settled bets >30d spool to an archive with drift-invariant
compensation — TESTED identical drift) · #10 publish-failure alarm · #11
tape ingest sftp-first (base64 fallback) · #12 reconcile_entries 5m→30m.
REOPENED #4: the redeemer's phantom-cash BOOBY TRAP is fixed + proven
(on-chain sim SUCCESS; live fails honestly), but actually redeeming needs a
Builder API Key (SDK gasless relay) the runtime bot deliberately lacks —
LOW urgency, the platform auto-redeems winners itself. auto_redeem OFF.
Open now: #1 Signal A, #2 tape research, #4 redeem builder-key, #13 Fri
bench, #14 edge verdict, #15 tape-pull batching (Stage-0 fold+mirror
superseded the bulk path; sync now sftp-with-base64-fallback), #16 surge
momentum **CLOSED 2026-07-23** (kill executed as pre-registered — both
instruments chain-true; A2 runs through Friday's #19 read), #17 oracle fair
value (E0.04 killed; higher tiers ledger-positive but harness-vetoed —
taker arm evidence-dead, decision Friday), #19 surge sprint plan (Friday:
disposition), #20/#21 execution flips **FLIPPED LIVE 2026-07-23 18:36Z**
(windows open, bars at n≥30 each), #22 Study C lean-follow
(pre-registered, frozen 052eda0; window opens with the first nightly
lean rows), #23 Study D sibling lead-lag (pre-registered;
**wwf-lagbot DEPLOYED 2026-07-23 20:56Z**, shakedown numbers on the
issue), #24 three-book reconciliation (v0: backtest absolutes =
decoration, 82-112% unseen+missed; reject-logging + tick-size retry
LIVE 2026-07-24 @d4fff27), #25 Study E position-scope conviction
(pre-registered; dark flag @85954d8 — conviction_scope trade|position,
rolling net-USD aggregate; flip = operator's call). #18 (empty-cond copies unsettleable) closed same day: RTDS seed
enrichment + falsy-cond repair pass + 1h alarm.

## LIVE BOT PAUSED (user, 2026-07-27)
`LIVE_CONFIRM` UNSET — wwf-copybot-live reboots into `geocheck --idle`
(no clone, no book, no orders). Key + funder secrets untouched; re-arm =
`flyctl secrets set LIVE_CONFIRM="TRADE LIVE" -a wwf-copybot-live`.
State at pause: book $48.55 · $22.48 free · 15 open ($26.07, five at
93-98c) · realized −$27.31. Open positions now ride to resolution
UNMANAGED (no >=90c band exits; platform auto-redeems winners). /live
feed is frozen at this state until re-armed.

**WHY it was paused — the finding that triggered it:** Polymarket enforces
a **5-share minimum per order** ("Size (1.47) lower than the minimum: 5").
That is a PRICE-dependent dollar floor: at the book's $1 braked stake
(4% of $48.55, halved by the drawdown brake, floored to the $1 venue
min) only <=20c markets are reachable, so every 40-90c signal fired an
order that could not succeed — 25 venue rejections in 3 days, while 204
other signals were correctly floor-rejected as sub-conviction. Fixed at
the gate (copytrade.MIN_SHARES=5.0 blocks with the shares/dollars
needed instead of firing doomed orders), but the CAPITAL fact stands:
**~$113 equity at 4%, or ~$225 under the drawdown brake, is the minimum
viable size to trade 90c markets.** Sizing/funding is the USER's call.

## Operating boundary (user, 2026-07-13 — standing)
**Full autonomy on the bots**; the real-money bot **stays ARMED**. Never
touch the private key, Discord alerts webhook ROTATED 2026-07-19 (#3 closed),
sizing/caps/deposits are the USER's call. USER DIRECTIVE 2026-07-16: the
live bot mirrors the paper test EXACTLY (one deliberate exception:
min_order_usd $1 = venue reality). If something looks genuinely dangerous,
DISARM (`flyctl secrets unset LIVE_CONFIRM -a wwf-copybot-live`) rather than
push through.

## Snapshot (2026-07-23)
- **wwf-copybot-live** (REAL, ARMED): ~$62 equity ($66.42 contributed,
  realized −$12.17 lifetime — day-one incident + honest recognitions),
  **7-wallet Set E rev 5** (JuiceFarm promoted 2026-07-23 off the #13
  bench method run early: +17%/+34% both windows, insider z 2.5, 1%
  refunds; auto p80 floor $753), 4% of working equity/bet.
  **#20 LIVE at 0108cca; #21 SUPERSEDED at 54f4c51 (2026-07-23 22:35Z)**
  — both books run `entry_mode maker` (GTC at the sharp's price, 60s
  registry TTL — T11: 60s is already optimal) + **band-guarded mirror**:
  `exit_mode mirror` + `mirror_sell_min_p 0.90`. Sell-band study: every
  band <90¢ LOSES by mirroring, ≥90¢ SAVES — so ≥90¢ sells mirror
  (profit-locks, frees capital), sub-band sells are ignored + ledgered
  (reason:"band") to copybot_ignored_exits[.live].jsonl. Backtest parity
  reads +41% band-mirror vs +36% pure-hold. #20 window open (bars at
  n>=30); #21's ~28h pure-hold sample preserved in the ledgers; revert =
  one config flip back. **wwf-copybot** (paper $1k): same set, same modes.
  Both on the audit-hardened build (locks, chain-gated sweep, boot-id
  single-writer guard, TLS'd user-ws — HANDOFF_ARCHIVE rev 16). 2026-07-20:
  FAK no-match OPENs get one re-quote retry on both bots, PER-NICHE waits
  from measured crater-refill times (crypto 4s / esports 10s / sports+slow
  25s — research/params/requote_timing.json; `fak_retry_niche_s` override,
  `fak_retry_s` fallback+kill-switch; second rejection tags "twice").
- **wwf-recorder**: the FULL firehose (trades + order matches + comments
  + crypto ticks, ~8M events/day, dual-socket ~99.9% capture, 25GB volume).
  **Stage-0 warehouse 2026-07-21**: the box folds its own segments →
  zstd Parquet partitions on the volume (fold.py sidecar, row-parity
  verified, manifest + Mac-ack deletion protocol — invariant STRONGER than
  before); the Mac mirrors + appends into `live/rtds.duckdb` every 15 min
  (`com.jaxperro.tape-sync` → recorder/sync_tape.py). Tape freshness:
  nightly → ~15 min; the box no longer needs the Mac to stay healthy.
  `live/parquet/` = complete durable layer (Stage-1 MotherDuck feedstock).
- **VALUE experiment: CLOSED 2026-07-19** — sub-2¢ hypothesis refuted
  (1W/993L, 0.075x); post-mortem in archive/value/PLAN.md; app destroyed.
- **research/ (SILO — never touches the bots)**: tape-era edge factory.
  Sharp screen (`live/tape_sharps.py`, proxy chain-validated 742/742, 25
  copyable candidates); execution sim fitted on 29 labeled live attempts.
  **2026-07-22 SCORER LAW (FINDINGS round-3): every arm scores through
  payouts_for() — tape proxy + mandatory CTF chain overlay. "Pending" is
  never outcome-neutral on Polymarket (market liveness encodes the
  outcome: losses hide behind the still-trading winning sibling).** Study
  A surge (#16): KILLED by that correction (−$6.03/fill × 1,108 forward
  fills; identity-null stands). Study B oracle (#17): E0.04 killed,
  E≥0.07 accumulating slightly positive. Verdicts ONLY from
  research/forward_ledger.jsonl.
- **wwf-surgebot (PAPER, ~$3/mo)**: THE instrument that caught the scorer
  bug (its 57.5% refused to match the ledger's 81%). v1 cash-gated book
  halted 2026-07-22 at its pre-registered −50% line (state + ledger frozen
  as audit artifacts); relaunched same day as **A2 measurement arm** —
  every trigger paper-FAK'd at $100, attempts/markouts/settles append-only
  on the volume, the $100/5% spec replayed OFFLINE nightly
  (surge_book_replay.py → surge_book.json). Runs through Friday's read;
  its capture/depth/latency streams feed successor hypotheses per #19.
- **wwf-oraclebot (PAPER, ~$3/mo, live 2026-07-22)**: Study B real-time
  harness — fair value tick-by-tick on the venue's own settlement feed,
  all E-tiers tracked, $100 FAK walks, three settle layers ending in
  nightly chain truth (grade_oracle.py → oracle_paper_ledger.jsonl).
  **First chain grade (2026-07-23): E≥0.07 −$8.51/fill (n=235), E≥0.10
  −$5.90 (n=127), ~40% hit — real execution loses at every tier while the
  sim ledger reads positive. Both instruments share the scorer now, so the
  divergence is the sim's 6.7s-lag FILL model flattering the tiers (round
  3's lesson recurring in the fill model). Taker arm is evidence-dead;
  formal tier bars keep accruing; maker pivot (T1 sim) KILLED at Stage 1
  same night — staleness IS the adverse selection.**
- **wwf-lagbot (PAPER, ~$3/mo, deployed 2026-07-23 20:56Z)**: Study D #23
  — T9's sibling lead-lag edge (+$9.73/$100 tape, n=2,028, stale-print
  optimism stated) at real books. Leader bursts ≥10¢/120s → paper-FAK
  $100 on ≤2 lagging same-outcome siblings at ≤ stale+4¢; down-moves buy
  the sibling's COMPLEMENT token; cooldown 600s/event. Attempts log every
  standing ask premium — the observational kill-switch (median ≥+8¢ over
  3 days = mirage) can kill without a paper sample. Shakedown 07-23: first
  8 attempts' median +8.5¢ (AT the bar — mirages concentrate in
  handicap/spread siblings with ancient prints); the 3 fills were +1-2¢,
  one $0.55-of-$100 partial → grade_lag reports $/episode AND %-of-staked.
  PASS ≥+$4/$100 @ n≥400/≥5d · KILL ≤0 @ n≥300. Nightly grade_lag.py →
  lag_paper_ledger.jsonl.
- **Data moat (2026-07-22, DATA LAW in research/README)**: all raw streams
  append-only and Mac-independent (Fly volumes + daily snapshots; recorder
  has ~3+ weeks offline headroom); forward.py backfills ledger-missing
  days after any Mac gap; meta_snap.py snapshots ~12k active markets
  nightly (τ-at-trigger + token→outcome for every future study). Markout
  study (chain-true): NO scalp inside the dead surge signal — hidden-loss
  cohort bleeds from minute one; taker case closed at every horizon.
- **Verdicts pending**: edge/size-up (#14, ~end of July, pre-registered) ·
  Friday's combined read (#13 bench + #16 formal close [A2 chain grade
  −$7.54/fill × 1,344 independently confirms the kill; virtual book's
  +26% on n=46 is the variance footnote, not a signal] + #17 taker-arm
  decision + #19 disposition + early #20/#21 window check — every number
  chain-true) · **#22 lean-follow** (PASS ≥+$2/lean & hit≥.56 @ n≥1,500;
  KILL ≤0 @ n≥1,000) · **#23 lead-lag** (bars above). Ten tandem tests
  2026-07-23 (scripts + verdicts in research/): batch one — T3 maker
  entries +$17.45 vs +$12.86 taker → #20; sells anti-signal → #21;
  673-wallet maker-sharp species → inventory-lean line; sibling-sum =
  print artifact; T5 esports concentration → #14 tension. Batch two —
  T6 lean-follow → #22 (fade arm FAILED its concentration gate,
  report-only); T9 lead-lag → #23; T1 maker-quote Stage-1 KILL; T7
  settlement-discount industrialized, parked; T8 crater-rejects were
  good misses; T10 age gradient needs sample. Batch three (same night)
  — T11: #20's 60s TTL already optimal, patience past 60s = adverse
  selection; T12: maker-sharp unwinds NOT exit signals (STAY
  +$5.95/unwind n=265; Study C keeps no exit rule; #22 comment); T14:
  balanced-book imbalance band (0.25-0.47) = portable fill-guard
  candidate for #23; T15: sharp-screen churn 49%/1d, ~10%/28d
  (EV-by-age grade pending its chain-ensure).
- **Backtest = paper-execution parity (2026-07-23, 004911b)**:
  live/portfolio.py replays the PAPER book's follow flags (maker
  feeless entries — declared optimistic bound; hold-through exits;
  sold-unresolved carry as open at the exit print). The backtest is NO
  LONGER a taker control — it tracks whatever copybot.paper.json runs.
  First maker/hold run: equity +36%, 0 fees, 86 resolved (vs 390 under
  mirror) — hold-mode LOCKS capital, misses swell to 1,588; that is
  #21's cost side, visible. /trading gained a "Profitable bench"
  section (realized + would-be-missed > 0): 12/15 clear it; JuiceFarm
  trimmed (+$33 realized, −$72 would-be). JuiceFarm's conviction floor
  pins at the next 08:00 sync_floors run (whole-book copies until
  then — flagged 2026-07-23 evening). TWO backtest books daily now:
  portfolio.json (15-wallet bench → "Profitable bench" section) +
  portfolio_follow.json (--follow-only, followed 7 → "Back Test") —
  follow-only reads +312% vs +41% bench at the same $1k: bench
  crowding was starving the follow set's capital in the shared
  replay. Bank sweep (1/2/5/10k): missed COUNT barely moves
  (1,569→1,501) — %-of-equity sizing self-throttles, so capturing
  the missed pool is a sizing-fraction question (user's call), not
  a bank-size question. All /trading wallet cards open the detail
  modal (bench-only wallets fall back to replay rows).
- Dashboards: jaxperro.com/{trading,live,test,value} — /test = all four
  studies on one page (old /surge + /oracle URLs redirect) · daily pipeline
  on the Mac at 08:00 (launchd, lockfile) — floors, bench forward table,
  edge row, tape sync, Discord digest · tape mirror every 15 min
  (com.jaxperro.tape-sync → sync_tape.py, sftp + base64-console fallback)
  · research nightly fires 09:15 then WAITS for fresh tape
  (com.jaxperro.research-nightly; self-commits ledger + lean rows, informed
  set, surge/oracle/lag grades, virtual book, meta snapshot). All launchd agents
  removable with `launchctl unload ~/Library/LaunchAgents/<label>.plist`.

## OFFLINE PAUSE (2026-07-23 evening — user traveling)
All three Mac launchd agents UNLOADED at user request (bandwidth):
tape-sync, research-nightly, skilled-daily. T15 (sharp_halflife) killed
mid-ensure — resumable. Re-enable: `launchctl load
~/Library/LaunchAgents/com.jaxperro.<name>.plist` x3, rerun
sharp_halflife.py. pmset 07:58 wake still armed (user sudo to cancel).
Fly side fully autonomous: recorder (~3+ weeks headroom), 3 harnesses,
both copybots — nothing depends on the Mac while paused. On return the
tape mirror + nightly self-heal (freshness wait + ledger backfill).

## Studies A + B DECOMMISSIONED (user directive 2026-07-25)
#17 formally KILLED (final grades: oracle −$12.89/fill n=3,308 at E≥.04;
surge A2 final −$2.17/fill n=8,700) · #19 closed · **wwf-surgebot +
wwf-oraclebot scaled to 0** (machines destroyed, apps + volumes +
ledgers retained frozen; full teardown = flyctl apps destroy). /test
dash = Study C + Study D only. Study D first chain grade 07-25:
**+$22.33/ep (+27.1% of staked) n=140, mirage KILLED (+4.0¢ median,
n=321), ex-top-5 +$8.99/ep, edge concentrates in 15-40¢ complements**
— PASS-track, bars n≥400/5d. Study C day-4: pooled +$0.007/lean
n=12,542 — flat; neither bar met.

## Floors FROZEN (user directive 2026-07-24)
All 7 conviction floors floor_pin'd at the 07-24 p80s (Kruto 80 ·
0xbadaf319 27.50 · gkm 470.51 · 1kto1m 314.91 · Bikes 227.01 · AIcAIc
379.05 · JuiceFarm 735) across copybot.paper.json + config.live.example
+ backtest.json. sync_floors respects floor_pin — the daily no longer
moves them. Re-pin = REMOVE floor_pin deliberately (a windowed act, not
an 08:00 side effect). Rationale: drifting floors change what gets
copied daily and contaminate open windows (#20/#25/reconcile baselines).

## Ops quick-reference
- Follow-set change: edit live/copybot.paper.json → `./live/deploy_bot.sh`;
  mirror config.live.example.json (nothing auto-writes it) + backtest.json.
- Tape now: `python3 recorder/sync_tape.py` (launchd does it every 15 min);
  box-side fold health: `flyctl logs -a wwf-recorder` (grep `[fold]`).
- State surgery: stop the machine, **watch heartbeats actually CEASE**
  (gotcha 15c — and the boot-id guard now makes a zombie writer yield),
  pull → edit → push → start → verify the first heartbeat.
- Code deploy: push + `flyctl apps restart <app>` (boots clone main,
  clone-guard verifies). Image changes: `flyctl deploy --remote-only -c
  <toml> --ha=false`. Never two machines per app.
- The bots commit their own state — always `git pull --rebase --autostash`
  before pushing from a session.
- Read next: README.md (architecture + gotchas 1-18) · FINDINGS.md (research
  story) · archive/value/PLAN.md (the refutation) · HANDOFF_ARCHIVE.md (history).
