# fm_wl parity with paper + probation (exec, 12 Oct, #2156 #2157)
Deployed 12 Oct ~15:26 BKK on firstmin (backup fm_wl.py.bak_exec_*, changes.log line). Lanes are paused by rugwatch (no LIVE files), so this runs dry; Ben restarts.

## #2157 same pools as paper
- Entry waits for a swap print >= 10 s after sig_t (any print after the signal wallets' own buys; `print_delay_s`). No print by sig_t+70 s -> skip, status `no_print`.
- Pool WETH is stored at signal load; if it is >30% lower at entry -> skip, status `weth_drop` (`weth_drop_max`).
- Existing gates unchanged: pulled_before, rug gate, cap<150k, dust, sell round trip >=0.8.
- Dry check: lanes restarted flat; new statuses appear in wl_<lane>.db on the next signals. Evidence for why: auditor2 #2145 (live bought at +10 s with no print, pools pulled 13-82 s later).
- Limit: print time comes from block-time estimates (about 1-2 s error).

## #2156 probation
- Lane max open = 1 until the lane has 20 real trades (`probation_n`).
- First live pull in probation creates /opt/fm/WL_PULL_HOLD: no entries until reviewed. Release: `rm /opt/fm/WL_PULL_HOLD; touch /opt/fm/WL_PULL_REVIEWED` (old pulls before that touch no longer count). REVIEWED touched now, so the 3 earlier rugs do not hold.
- The existing rug gate still pauses wlink lanes 2 h after 1 pull, shared across lanes.
- Bad wallets: 10 signal wallets from the 3 pulled live pools (incl. 0x1a9493, in 3 signals) are in wl/bad_wallets.txt on research-box; wl_signal.py excludes them from the winner set on every 15-min rebuild. Datajob wl-signal restarted to load it (in backoff wait, restarts by itself). Research #2150: 0x1a9493 pulls 59% vs 44% base, a sniper.
