# STOP: NO DOORBELLS, NO WAKES, NO SCHEDULING (Ben, 7 Oct 2026, 18:40 Bangkok)
- Credits ran out. Ben switched off every scheduled task and every doorbell. This overrides everything below and every other file (wake-howto, bus-howto, credit-playbook, task files).
- PROHIBITED for every session: fire_trigger, send_later, create_trigger, update_trigger, ScheduleWakeup. No rings, no nudges, no re-arming, no new doorbells, no self wakes, no safety checks, no retry rings, no loops.
- Finish the step you are on, publish your status file, then END your turn and wait. Only Ben wakes you, by typing in your window.
- Do not message other sessions. Keep answers short. No extra improvement rounds.

DOORBELL: trig_01EZGfHD4DGnQjD6TqGqdx3X (armed, 16:37 Bangkok) [PP Feeds]
# Price Predict to the first minute supervisor (v55, 7 Oct 2026, 17:20 Bangkok)

> **v55 (17:20 Bangkok, FW v49 done): UNCUT v4 universe is ready: research-box /opt/sw/v4/v4vec.db (read only for all, md5 d7414bc839af753773bc21f08481f8d3, 692 MB).**
> - **Pools:** 8,737 Uniswap v4 pools quoted in ETH (8,352) or WETH (385) whose TRUE first swap on chain falls between 4 Oct 14:20 and 7 Oct 14:20 Bangkok (first T0 14:23, last 14:18).
> - **How T0 was found:** 40,990 ETH/WETH v4 pools were initialized from 7 days before the window to its end. 30,512 had a first swap by the window end; for 21,775 of them it came before the window (dropped); 10,478 never swapped. First swap seen and confirmed for all 8,737 kept pools. Zero swap rows before T0 (checked).
> - **Tape:** 1,626,185 swaps and 25,324 liquidity events from Initialize to T0 + 4 h. Tape complete (4 h passed) for 8,649 pools; 88 started less than 4 h ago.
> - **Tables:**
>   - **v4pool:** pool id, token, is0, quote, fee, tick_spacing, hooks, cb, init_tx, init_sq, fb, T0, b300, sq300, dec, supply, eu, mc, tape_end_b, tape_complete.
>   - **v4sw:** pool, b, li, t, a0, a1 (POOL deltas, same sign as v3 vec.db), sq, liq, tick, fee (dynamic fee per swap), sender, tx.
>   - **v4lp:** pool, b, li, t, kind m/b, tl, tu, liq, a0/a1 (amounts computed at the pool price just before the event, since v4 ModifyLiquidity has no amounts), salt, sender, tx.
>   - **v4bt:** block times. **kv:** the counts above.
> - **Cap at +300 s** (same formula as vec.py, ETH/USD from CoinGecko hourly): under $100k 4,330 pools; $100k to $250k 1,561; **$250k to $1M (the mc5 band) 759**; $1M and up 2,087.
> - **Hooks:** none 7,985 pools; 0x4e3468951d49f2eea976ed0d6e75ffcb44a9a544 87; Pons 0xe5e702641ea86f4ae6cc3cdaed2b886f976be044 71; 0x75a54357d9c78a2db19004a5fdc76c50f9242aec 32; 0x2c668601193e4a081dd82604785e436aff6a2acc 19.
> - **Limits:** pools initialized more than 7 days before the window that first trade inside it are not included. Pool WETH balance is not stored (the v4 PoolManager holds all pools' tokens in one contract), so the dust guard has to use swap and liquidity flows.
> - Build script /opt/sw/v4build.py (paid dRPC, 97,537 calls, 39 min). Sanity script /opt/sw/v4/v4check.py.

> **v54 (16:47 Bangkok, FW v51 speed fix): new code ready, md5 c69090a40e504d40245cf58bc3d76834 (old e3ad18065c262e097b69813145411a58). INSTALLED 16:41:44 Bangkok at 0 open: SELFTEST_OK 16:41:45, LIVE_RESUME same session, feed_ok every minute since (0 failed calls); gmgnd active. The next stop shows the real time in its STOP_PATH line (sender named there).**
> - **The last 3 stops:**

| stop | cross to seen | gmgn-cli | total cross to sent |
|---|---|---|---|
| 13:31 pool 0x86303aff9563213a7c5f877bbe15eacde98d7c50 | not logged (before v44) | about 2.0 s | 2.70 s |
| 14:42 pool 0x4d2f7469c43a7d0e0dd4f6bbba8289e4624ca5f2 | 1.24 s | 1.13 s | 1.51 s |
| 15:35 pool 0x644eac7020466c554369e0592637f24dd95fbb13 | 0.77 s | 2.00 s | 2.90 s |

> - **Cause:** each sell started a new gmgn-cli process. Node start alone measures 0.55 to 1.8 s on firstmin (it gets slower when the box is busy), plus a new TLS handshake. gmgn-cli has NO quote or confirm step (the swap is one signed POST /v1/trade/swap), so there was nothing to skip there.
> - **Fix 1, warm sender:** new service gmgnd (/opt/fm/gmgnd.mjs, systemd gmgnd, unix socket 0600). It runs gmgn-cli's own OpenApiClient.swap, the same signed request, but stays up with a kept-alive connection (pinged every 20 s). Measured round trip of a signed request: 0.25 to 0.35 s (vs 1.35 to 1.8 s just to start the CLI).
> - **Fix 2:** feed poll is 0.25 s while a trade is open (was 0.5 s). This cuts the cross-to-seen step.
> - **Safety:** if the daemon is down, the bot uses the old CLI. Once a request is sent to the daemon there is never a CLI retry, so a sell can never go out twice. Same key path, no new signer; the key stays in gmgn-cli's own config file.
> - **Tests:** sender test 5 of 5 PASS (/opt/fm/t52.py: params identical to the CLI's, API error, no-reply, daemon down → CLI). Vector replay on the new file: 869 of 869 PASS, so the decisions are unchanged.
> - **Expected:** total cross to sent about 0.3 + 0.4 + 0.1 = under 1 s. The STOP_PATH line now names the sender (gmgn-daemon or gmgn-cli).

> **v53 (16:25 Bangkok, FW v49 started): UNCUT v4 universe build running on research-box** (/opt/sw/v4build.py, flock + nice + ionice + timeout, 6 threads, paid dRPC).
> - Size: 68,909 v4 Initialize logs from 7 days before the window to the window end; 40,990 are ETH or WETH quoted. Each needs one first-swap lookup, then a 4 h tape (swaps + liquidity) for the ones whose TRUE first swap is in the window.
> - Why per pool: v4 has about 2.3 swaps per block chain-wide (23,301 swaps in 10,000 blocks), so a full window swap scan would be about 6M logs; per-pool queries by pool id are far cheaper.
> - Limit: pools initialized more than 7 days before the window that first trade inside it are not checked (rare; can widen if A1 wants).
> - Output: /opt/sw/v4/v4vec.db, tables v4pool, v4sw, v4lp, v4bt (block times), kv (counts). Same columns as A1's v3 vec.db (pool deltas, sq, liq, tick) plus quote, hooks, tick_spacing, dynamic fee per swap.
> - ETA 17:35 Bangkok (why: about 41,000 first-swap lookups plus about 2 calls per kept pool at about 6 calls a second per thread, 6 threads; measured 51 s for the Initialize scan).

> **v52 (16:08 Bangkok, FW v48 done): full vector replay PASS 869 of 869 checks, 0 mismatches. v46 is live since 14:42.**
> - **Install landed 14:42:16 Bangkok** at a 0-open moment: md5 e3ad18065c262e097b69813145411a58 (backup fm_mc5.py.bak_v44_ef15ce50). SELFTEST_OK 14:42:18, LIVE_RESUME same session, feed_ok every minute since (0 failed calls). Guard script ended.
> - **First stop on the new code** (pool 0x4d2f7469c43a7d0e0dd4f6bbba8289e4624ca5f2, 14:42:16): STOP_PATH cross->seen 1.24 s, state 0.09 s, walk none (off now), gmgn-cli 1.13 s, total cross->sent 1.51 s (was 2.7 s on the 13:31 sell). gmgn-cli is 1.13 of 1.51 s, so it is now the biggest step; one sample only. Signer design goes to you after 3 more stops confirm it.
> - **Replay** (research-box /opt/sw/rp48.py, the live file's own entry(), on_log(), cap_from_sqrt(), stop_m(); lab tape vec.db, read only):
>   - Entry: 54 of 54 pools with a tape match (38 BUY, 16 dust SKIP, same reason).
>   - Band: 777 of 777 SKIP. These have no tape in vec.db, so the bot's cap formula ran on lab's own inputs (sqrt at +300 s, supply, ETH/USD).
>   - Exits at $10: stop 30 of 30, time 6 of 6, pull 2 of 2 (same kind, exit time within 2 s).
>   - Negative test: stop 0.6x makes 25 exits fail, so the replay does catch changes.
> - **Live vs lab inputs (not code):** the bot reads supply and ETH/USD live, and pool WETH by balanceOf (a Burn only leaves the balance on Collect). Only a coin right at the $250k / $1M edge or the 0.1 WETH dust line could flip. No install needed.

> **v51 (14:40 Bangkok, FW v45 queue done + WAKE RULE v2 done):**
> - **Doorbell:** trig_01EZGfHD4DGnQjD6TqGqdx3X is line 1 of this file (also sw/dc/rot status files). Nudge it with update_trigger.
> - **Stop value now copies lab.py.** Trigger = (one-range constant-product quote x 0.99 minus sell gas) / ticket, ticket = eth_in minus buy gas. Old bot divided by ticket + gas (0.5% low) and confirmed with a tick walk lab.py does not use; walk is now off (config `stop_walk`, default false), which also cuts a step from the stop path. Stop slip is now measured against the per-ticket trigger.
> - **Replay of fw/lab/mc5-vectors.csv through the bot's own code** (sell_value + stop_m pulled from the new fm_mc5.py, our buy kept): **PASS 30 of 30 stop rows**, same block and same value (within 0.002) as `stop_block_lab_10` / `stop_value_lab_feein_10`. Pool 0x86303aff9563213a7c5f877bbe15eacde98d7c50: bot block 82262763, value 0.4952 = lab. Script: research-box /opt/sw/rp46.py.
> - **Install:** new md5 e3ad18065c262e097b69813145411a58 (old ef15ce505783f939cc06384a566ba331, backup kept). NOT installed yet: live trade on pool 0x4d2f7469c43a7d0e0dd4f6bbba8289e4624ca5f2 is open (bought 14:28). Guard /opt/fm/guard46.sh on firstmin installs it at the first 0-open moment (checks every 20 s, log /opt/fm/v46_install.log); I post the restart check (SELFTEST_OK, LIVE_RESUME, feed_ok) when it lands.

> **v50 (13:46 Bangkok, FW v41 rebuild done):** v3mc5 rows of pools born before the feed start (block 81388553) checked against the chain: 147 rows, **145 were not at their true first swap** (83 book rows, 62 watch rows), all now marked not_first. **Only 1 of them was a paper BUY: 0xd27657e890fc13ac8a3b9f2e197bbc4ef3afe742 (x0.929)**, voided. Every other fake row was a skip, so the book's trade results change by that one trade. The 2 old-born pools that passed were truly first-swapping inside the feed. Full list: research-box /opt/sw/v3rebuild2.log (FAKE rows with the block of the earlier swap). Board republished.

> **v49 (13:42 Bangkok, FW v44 + v42 live):**
> - **v42 is live:** the guard installed it at 13:31 when the live trade closed (fm_sim c360d0a8ed536b7a73c49e54c2f1024b, fm_mc5 a05678a3873dbfd61d8be1f564cd85e7), SELFTEST PASS, LIVE_RESUME same session.
> - **v44 measured (last 4 live stop sells; only 4 exist):** bot log has trigger->SELL_SENT 2.7 s (0x86303aff9563213a7c5f877bbe15eacde98d7c50, 13:31) and 1.4 s (0xa6caf95634d4bcffdfb535eec889c9c928ff13d5); the two older sells (0x4fc807391d8dd76992043950248b26a610231075, 0xe507152250372fadb2c6cb50f2b5ff5e89dd8d21) predate the SELL_SENT line. Tx inclusion after SELL_SENT: same second both times. The old log had no stage stamps, so the cross->trigger part could not be split cleanly (block timestamps are 1 s on a 0.1 s chain).
> - Where the 2.7 s went (code path): after the trigger, close() did 3 RPC reads in a row before the sell (pool state for the log-only quote, token balance, ETH balance), then gmgn-cli (quote+sign+send in one subprocess). Before the trigger: the feed polls every 1.5 s, then pool state + quick value + a tick-walk confirm.
> - **Fix (fm_mc5 md5 ef15ce505783f939cc06384a566ba331):** (1) the pool-state snapshot runs in parallel and is no longer on the sell path; (2) token and ETH balance read at the same time; (3) feed poll 0.5 s while a live trade is open (1.5 s otherwise); (4) new STOP_PATH log line on every stop: cross->seen | state | walk | ->close | prep | gmgn-cli | total, so A2 gets exact before/after numbers from the next stop. Stop rule, slips, sizes unchanged. Stubbed self test PASS (close path + STOP_PATH line).
> - Not done: pre-build/pre-sign. gmgn-cli quotes, signs and sends in one call and has no prepared-transaction mode we can use (its order quote endpoint returns 401 for our key), so pre-signing needs our own signer for the bot wallet. That is a bigger change on the live wallet: say if you want it.
> - Restarted 13:42 Bangkok with 0 open: SELFTEST PASS, LIVE_RESUME same session (drawdown kept), feed 0 failed calls, max gap 1.9 s. LIVE. Next live stop prints STOP_PATH in /opt/fm/mc5.log.

> **v48 (13:34 Bangkok, FW v43 done):**
> - v3mc5 now calls paid dRPC first, public last (v3mc5.py md5 a0bda5954b5698aa037f1e37d339b7d9, restarted 13:34). Test: state() of 0x86303aff9563213a7c5f877bbe15eacde98d7c50 via dRPC in 0.08 s. Cause of no_state: the public RPC batch failed 4 times (rate limit), not missing state. v3first.py already used dRPC only.
> - Backfill (v3bf.py, research-box /opt/sw/v3bf.log). Old block state is not kept by any RPC we have (about 10 min of history), so rows are replayed from the v3live swap tape: cap at +5 min = last swap mcap, entry/exit at swap prices with GMGN 1% each way, stop 0.5x, pull = 0, no depth or slippage model; every row is noted 'BACKFILL approx'. 5 pools:
>   - 0x86303aff9563213a7c5f877bbe15eacde98d7c50 (today's live coin): cap $414k at +5 min, paper BUY, stopped x0.488 (tape). This is the twin for A2 B2.
>   - 0x49f0f93e45a52f2d9699f764cad5ab3936df7883: cap $50k, cap_out.
>   - 0x114f6d6ada33fb51a5fb64293ae69c9e517221c6: cap $16k, cap_out.
>   - 0xc2dd35106ec9cf58ee51b659fa30c84c68bb3b38 (outage window): cap $63k, cap_out.
>   - 0x85b3abf1dd315a9485523fd8b0d1be388b1363b9 (outage window): cap $7k, cap_out.
> - Outage window 12:38 to 13:04 Bangkok had 2 new v3 pools at +5 min (both above), none in band, so the outage cost the book 0 paper trades. The watch table (+10 min cells) was not backfilled.
> - v41 old-row rebuild count still running (posted when done).

> **v47 (13:30 Bangkok, FW v42 + v41 ACK):**
> - **v41 ACK:** done in code since 12:20: v3mc5.py md5 427267a741073ae401a6e20f9c57ee80 checks every pool born before the feed start (block 81388553) for any earlier Swap on chain (v3first.py, paid dRPC) and skips it as not_first. The rebuild of old rows is running (rebuild2, about 125 of 147 rows done; count with pool addresses posted when it ends). Note: rebuild v1 held a db write lock and the v3mc5 book was DOWN 12:38 to 13:04 Bangkok (restart loop 'database is locked'); coins at +5 min in that window were not seen. rebuild2 never holds a lock.
> - **v42 RPC:** the late-pool side thread called the PUBLIC RPC (fm_sim res fast=False), which is what returned the 429s; it was not Alchemy. Separately the 'fast' path in fm_sim (pool lookup, sell sim, entry quote) tried Alchemy first; with Alchemy at its monthly cap every fast call paid a 429 then fell back to public. Fix: fm_sim.py now tries paid dRPC first, then Alchemy, then public (new md5 c360d0a8ed536b7a73c49e54c2f1024b); fm_mc5 late thread uses that fast path (md5 a05678a3873dbfd61d8be1f564cd85e7, still throttled 0.25 s a call). Test: fast call through dRPC 0.10 s.
> - Other services: fmw1pp, fmwethpp, fmlane1pp use the public RPC on purpose (every 2 s) and never the Alchemy key; fmlane1 and fmtrader import fm_sim and get dRPC-first on their next restart (not restarted by me).
> - Restart: 1 live trade open (pool 0x86303aff9563213a7c5f877bbe15eacde98d7c50, time stop 17:25 Bangkok), so NOT restarted. A guard on firstmin (/opt/fm/inst42.sh) installs both files and restarts once, the first minute fmmc5 has 0 open live trades; result in /opt/fm/v42_install.log. Until then the old build runs (late thread on public RPC, fast path Alchemy then public).

> **v46 (11:54 Bangkok, FW v40):** fm_mc5.py md5 **b24d1986c1a73aaade33e6ca319f5980** (was c0210cc1676246ff10569b4e6080cdea). First build 2e53cfe97f2195d139c7f74ba42f1fb4 ran 11:55 to 11:56 and its side thread hit dRPC 429s (busy old pools); b24d1986 throttles the side thread (0.25 s a call), checks the last 100k blocks first, and pauses 60 s on any 429. Live feed had 0 failed calls throughout.
> - (1) Missed trade fix: every round the bot now also reads ALL Swap logs on the chain. A Swap from a pool it does not watch goes to a side thread (never the feed): factory 0x1f7d7550b1b028f7571e69a784071f0205fd2efa + WETH check, then the pool's whole history is scanned for any earlier Swap (10M-block chunks, one topic per call). No earlier Swap = this is the first swap: the pool joins with T0 = this swap, its old Mint/Burn logs are replayed (so the pull rule sees its liquidity), log LATE_POOL. Also re-opens pools that timed out as no_trade after 6 h with no swap. Everything else is cached as not new.
> - Proof on the missed pool 0xd27657e890fc13ac8a3b9f2e197bbc4ef3afe742 replayed at its real first swap (block 78550157): registered (fee 10000, token 0x8fda554d8bd5b3aee699b2502c7248bf4205bbcd), its earlier Mint replayed. At its 2nd swap block: rejected (earlier Swap found). Non-factory address: rejected. PASS.
> - (2) Uptime proof: one row a minute in /opt/fm_pp/mc5_uptime.csv (Bangkok time, unix, last block, blocks in 60 s, max gap, failed calls, first RPC, live, feed_ok), kept 7 days. Public copy every 2 min: http://159.223.88.168/hx-c9ois/fw/mc5-uptime.csv . A missing minute = the bot loop was down.
> - Entry, exits, size $10, kill rules unchanged.
> - Restarted 11:56 Bangkok with 0 open: SELFTEST PASS, LIVE_RESUME same session, feed 0 failed calls, max gap 1.9 s. Test re-run on b24d1986: PASS. Uptime rows live (first rows 11:55 and 11:57).

> **v45 (11:45 Bangkok, FW v39):** fm_mc5.py patch md5 **c0210cc1676246ff10569b4e6080cdea** (was 1f6ac6995934ff0547464850d6656a34). Logged before restart.
> - A failed sell on a pulled or empty pool (pool WETH under 0.1) never kills now. The trade becomes open_unsold, booked 0x (as paper), log PULL_UNSOLD, retried with backoff (60 s doubling to 1 h), and it no longer counts toward max open, so new buys go on.
> - Failed sell on a LIVE pool (WETH 0.1+) = broken sell path, not a pull: kill only on the 3rd failed try (was the 1st). Say if you want that kill gone too.
> - Drawdown kill and 60-trade kill unchanged. Size $10 unchanged.
> - Self test on a copy (stubbed close()): PASS on 4 cases (empty pool try 1 and try 6: no kill, backoff 60 s and 1920 s; live pool try 1: no kill; live pool try 3: kill).
> - Dry quote on burned pool 0x4fc807391d8dd76992043950248b26a610231075 (token 0x313e89b7798d0ec8b755fd46a9da9a14a4ece708): gmgn-cli `order quote` returns HTTP 401 (error 40101600) with our key, and its chain list has no robinhood. So no gmgn dry quote exists for us; the bot's own on-chain sell sim stays the quote.
> - Restarted 11:44 Bangkok with 0 open: SELFTEST PASS, LIVE_RESUME same session (drawdown kept), feed 0 failed calls, max gap 1.9 s. LIVE.

> **v44 (11:31 Bangkok, FW v38 done):** research-box RAM fixed at 11:30 Bangkok. Cause: E1 ran 20 workers on 8 cores (over the worker count <= cores rule). All 20 stopped; E1 now runs as a queue of max 6 workers in systemd unit e1run (MemoryMax 6G, Nice 10, low CPU and IO weight, flock + timeout), resumed from saved progress, not from zero. Available RAM 9.0 GB (was 141 MB). liqbuild2 untouched. E1 csv ETA moves later; exact time posted at 16:45 Bangkok.

> **v43 (PP, FW v36 elite prep):** fm_mc5.py patch md5 **1f6ac6995934ff0547464850d6656a34** (was 072e520d1f3b149d159939bf22f3cf40). Logged before restart. 0 open live trades at check.
> - Size stays $10. Nothing switched. Entry, band, stops, kill unchanged.
> - (1) Size steps from one value: size_usd. New config table slip_by_size: per size tier buy / sell / emergency slip and min round trip. Tiers $10 / $100 / $300 / $1k set to today's values (5 / 10 / 30, 0.80) so behaviour is identical. A2 tunes them. Round trip at the live size is already checked before every buy; $1k round trip is logged for every coin. Sells use the tier of the trade's own size.
> - (2) Board: new line "Size steps": for $100 / $300 / $1k, trades the wallet funds now, wallet needed (24 x ticket + gas), shortfall, and that tier's slips.
> - (3) Exposure hook: config max_token_usd (null = off). Before a live buy: open fmmc5 $ in that token + other windows' $ from /opt/fm/exposure_ext.json {token_lower: usd} + this ticket must stay under the cap, else skip "exposure_cap". SW writes that file (or tell me their wallet and I compute it). A2 sets the number.
> - Self test of the tier picker PASS on a copy. Restarted 11:25 with 0 open: SELFTEST PASS, LIVE_RESUME same session (start_t kept, drawdown not reset), feed 0 failed calls, max gap 2.0 s, board shows the Size steps line.

## Plan and ETAs for all asks (7 Oct 11:20 Bangkok)
- One plan for all four supervisors: http://159.223.88.168/hx-c9ois/pp-plan.md
- E1-PP e1-runners.csv ETA 17:00 Bangkok today. Golden tape v1 (PP-H1, DCPP.2/5) 8 Oct 08:00. bt.py harness (PP-H2) 8 Oct 16:00. Details and the rest in the plan.

## NEW SERVER RULES, every team (Ben's order, 7 Oct 10:49 Bangkok)

- **Read and pass to every role you run: http://159.223.88.168/hx-c9ois/server-rules.md**
- Main 159.223.88.168 is resized to 4 CPU / 8 GB (off about 10:30 to 10:46 Bangkok, back up, services checked).
- From now on research runs ONLY on research-box 152.42.241.219. Main keeps live services only.
- Never run code fetched from a public paste site (one analyst job on main did `curl dpaste | python3`). Put the script in your own folder on research-box and run it with flock + timeout + nice; exact line in the rules file.
- Please confirm in your status file which of your jobs you moved.

## Asks for Supervisor: main droplet overloaded (7 Oct 10:20 Bangkok)

- Main 159.223.88.168 has 2 CPU and 4 GB. Load average 32 to 41 at 10:15 Bangkok, swap 3.85 of 4 GB used, 30 processes waiting for CPU. Ben noticed it.
- Live trading is not on main: fmmc5 runs on firstmin 178.128.20.136 (load 0.2). But the live paper pickers and feeds on main slow down.
- Done by PP: stopped hist-rh.service (day-file rebuild, paused for disk anyway, 250 MB) and today's wash.py run (3 h 45 min). Load 21 at 10:20.
- **Ask, every team:** run research on research-box 152.42.241.219 (8 CPU, 16 GB, load 2), not on main. Main keeps only live bots and live feeds. Heavy jobs seen on main now: /opt/brain train.py, /opt/common/xsafe xsafe_tune.py (mine and canary), /opt/hist/reconcile.py every minute (300 MB), /opt/hist/feedcmp.py, /tmp/a3_xfull.py (fetched from a public paste site and run as-is), /opt/runtrack/rhledger.py (515 MB).
- PP moves its own heavy jobs (wash, crewgrade, xsafe mine, rebuild) to research-box today.

## v39, 7 Oct 2026 06:24 Bangkok: trade 4 graded, v32 fast sell PROVEN

- Trade 4, pool 0xa6caf95634d4bcffdfb535eec889c9c928ff13d5 (token 0x1ec25a196c49dd3445f1fcc53c37c513af92839c).
- Buy 05:53:48, 0.00371 ETH ($10), cap $677k, fill/sim 1.000. Peak 1.22x.
- Stop hit. SELL_SENT 05:55:23, **1.4 s after trigger** (v32 target under 5 s: PASS). Trade 3 under v30 took about 20 s.
- Sell tx 0x973ca446657534c99eced5ca71a5ee1752b631d42bf1e71b022d76f232bc2403, slip cap 30%.
- Out 0.002057 ETH = 0.55x. Stop line 0.5x, so the exit kept 0.05x above the stop.
- Quote (taken after the sell, log only) 0.001771, gap -0.161: not a fill grade: the post-sell quote includes our own sell. Per A2 v33, grade fast stops on stop_slip: -0.173 (fill 17% above trigger value).
- Loss on trade 4: 0.001653 ETH.
- walk_err on trade 4: zero (all 6 in the log are trade 3 at 02:41:32). One walk per pool works.
- Feed through the trade: max gap 2.4 s, 0 failed calls, 0 flips. kill check 0.7 s max, on its own thread.
- No KILL, SELL_FAIL, SWAP_ERR, loop_err since the v32 restart at 03:43:17.
- Bot md5 072e520d1f3b149d159939bf22f3cf40 unchanged. LIVE_MC5 present. 0 open trades.
- Live book: T1 29.43x, T2 0.47x, T3 0.004x, T4 0.55x.
- Nothing to change. Idle watch every 30 min.


## Read this first (TRADE 1 SOLD 29.43x + v32 stop fix DEPLOYED, 03:44 Bangkok 7 Oct)

- **Trade 1 time stop sell, 03:40:27 Bangkok** (time stop due 03:40:25, sent 2 s later): pool 0x8da021f34c2f2a95696c4fd842b0cd0cc4e18468, token 0x717d38587504b79e2e888c860bd1569c0d5984af. In 0.003721 ETH ($10) at 23:40:25, **out 0.109531 ETH = 29.43x** (peak 32.30x). Quote 0.110049 ETH, **fill 0.5% under quote** (sell gap 0.005). Sell tx 0xdebc14f88d03ce9b32bd5646a16df68005c45f2206babf525b37795ee8948db7. No SELL_FAIL, no SWAP_ERR.
- **Live book since LIVE_ON 17:26:37 (4 fills, 3 closed):** 29.43x, 0.47x, 0.004x. Realised equity +0.10011 ETH (~$270), drawdown 0.0 tickets. Wallet 0x0184ef9b23476ed84107cc5e15485a4a7ee6b286 now 0.14389 ETH ($388), was 0.04373 at start.
- **v32 stop fix deployed** (sup-to-pp v32 re-read 03:43, still v32): 0 open/buying/checking rows checked in mc5.db first, backup fm_mc5.py.bak32, **fm_mc5.py md5 072e520d1f3b149d159939bf22f3cf40** (posted v37, diff http://159.223.88.168/hx-c9ois/fw/pp-v32-diff.txt). Restart 03:43:17: restore "8 pools rebuilt, 0 open trades"; SELFTEST_OK 03:43:18; LIVE_RESUME same LIVE_MC5 (mtime 1791282397), session 17:26:37 kept. 03:44:19 feed_ok: max gap 1.9 s, max round 0.4 s, 0 failed, 0 flips.
- **Proof still owed:** the next real stop or pull must log SELL_SENT under 5 s after trigger. I grade it the moment it happens.
- A2: diff is public at the link above for your audit. Entry, band, time stop, sizing, kill rules untouched.

## Read this first (v32 stop fix READY on copy, NOT deployed, 02:48 Bangkok 7 Oct)

- **fm_mc5.py candidate md5 072e520d1f3b149d159939bf22f3cf40** (from live 53a62ac892b8ab6bcf7dbcf1de0242b4, 34 diff lines). Staged as /opt/fm/fm_mc5_v32.py. Diff for A2: http://159.223.88.168/hx-c9ois/fw/pp-v32-diff.txt
- **(1) Sell first on stop / pull (live only):** close() takes state, wallet balances, then sends the swap with emerg_slip (30%) right away; quotes() (tick walk + SimV3) runs AFTER the sell, for the log only (from the pre-sell state snapshot). New log line SELL_SENT "<why> X s after trigger, slip, tx". Time stop, trail and retry paths unchanged (quote first, as before).
- **(2) No walk fan-out:** on_swap walks only when the quick value is still ABOVE the stop (quick value at or under the stop closes at once, no walk). One walk per pool at a time (WALKING set + lock); after a 429 that pool skips walks for 5 s. The walk never blocks a sell.
- close() takes a trigger time (on_swap passes it), so SELL_SENT measures trigger to sent.
- **Copy test PASS** (/opt/fm/t_v32.py: copied db, every RPC, swap, log and kill stubbed, no real call possible):
  - T1 quick value 0.27x (under stop), 6 parallel swaps: 0 walks, 1 swap at 30% slip, SELL_SENT 0.0 s after trigger, slow quotes (10 s stub) started after the swap; row closed stop_0.5x with quote logged.
  - T2 quick value 0.55x (inside the 15% band), 6 parallel swaps with a 2 s walk that 429s: 1 walk (was 6), back-off set, 0 swaps; next swap inside back-off: still 1 walk.
- **Deploy plan (v32 rules):** only after trade 1 (pool 0x8da021f34c2f2a95696c4fd842b0cd0cc4e18468) closes on its 03:40:25 time stop AND that close is logged, 0 open, A2 has the diff. I re-read sup-to-pp right before the restart. Then: md5 check, restart, LIVE_RESUME, self test, and the next real stop must show SELL_SENT under 5 s.
- Entry, band, time stop, sizing, kill rules untouched.

## Read this first (LIVE TRADE 3: one-block dump, 02:45 Bangkok 7 Oct)

- **Trade 3, pool 0x4fc807391d8dd76992043950248b26a610231075, token 0x313e89b7798d0ec8b755fd46a9da9a14a4ece708.** First swap 02:33:30, cap at +5 min $712k, pool 15.28 WETH. LIVE_BUY 02:38:31 $10 (0.00374 ETH), fill delay 1.9 s, fill/sim 0.961, buy tx 0x89da0e7097e8a2fea2b1287f38262acb0d7cd9b122f0d1e4a416e0d8a89272aa. Peak 1.20x.
- **02:41:32: one swap took the coin to ~0.** stop_trigger_value 0.000000825 ETH = the position was already worth about 0.0002x at the first swap the bot saw after the dump. Not a slow slide; one block.
- **SELL 02:41:52**, stop_0.5x, out 0.0000145 ETH = 0.004x, quote 0.0000194 (sell gap 0.254 on dust). Sell tx 0x2cf3c8f72295d561ee72ba0e453b64ad28e673bba0cc5dc3ff0c62fe3a08a5bf. Board "stop slip -16.6" is that dust ratio, not a mis-priced stop. No SELL_FAIL, no SWAP_ERR.
- **PULL 02:42:33:** the LP burned 100% of in-range units 41 s after our sell. Dump then pull = the operator exit pattern A1.25 named ("cheap losers = pulls and one-block dumps, no slow signal"). Loss = one full ticket (~$10). Nothing in our exit path could have saved it.
- **Two things for A2 (no change made, trade 1 still open):**
  - 6 x walk_err 429 at 02:41:32: on_swap fires per swap in parallel and each confirm walk hit the public RPC at once. The quick value already screened the stop, so it did not block the exit here.
  - Trigger to sell took 20 s (close() re-quotes with sell_walk + simv3 before the swap; with 429s that is slow). Here the coin was already at 0, so it cost nothing; on a slow slide toward 0.5x it would. Possible fix after 0 open: on a stop, skip the slow re-quote and sell with the emergency slippage, quote after. Your call.
- **Live book since LIVE_ON 17:26:37:** 3 fills. Trade 1 open (pool 0x8da021f34c2f2a95696c4fd842b0cd0cc4e18468, peak 30.66x, time stop 03:40:25); trade 2 0.47x; trade 3 0.004x. Equity +0.08608 ETH (open trade at quote). Wallet 0.03436 ETH.
- Feed since 02:27: no feed_gap, no FEED_FLIP, no loop_err.

## Read this first (v30 15 min PROOF + FIRST LIVE SELL, 00:30 Bangkok 7 Oct)

- **v30 proof, 17 minutes after the 00:12:15 restart (md5 53a62ac892b8ab6bcf7dbcf1de0242b4), 1 to 2 live trades open the whole time:**
  - 17 feed_ok lines: max gap 2.8 s (median 2.1 s), max round 1.3 s, 0 feed_gap lines, 0 FEED_FLIP, 0 loop_err, 0 kill_check_err, first RPC drpc all along.
  - Before the fix, same situation: gaps 10 to 16.7 s every ~20 s and 7 flips in 30 min.
  - Kill check (own thread) took up to 19.7 s in one minute, 0.8 s in the latest. It no longer touches the feed, so a slow quote now only delays the drawdown kill by that much, never a stop or pull.
- **FIRST LIVE SELL (sell path now proven end to end):** trade 2, pool 0xe507152250372fadb2c6cb50f2b5ff5e89dd8d21, token 0xd273ef9fba402603d9f583e848a0708ed0efa55b.
  - Bought 00:12:36 $10 (0.00371 ETH), peak 1.52x, then dumped. Stop fired 00:19:06: SELL stop_0.5x, out 0.001756 ETH = 0.47x.
  - **Sell fill vs quote:** quote 0.001698 ETH, got 0.001756 = 3.4% BETTER than quote (sell gap -0.034). Stop slip -0.107 on the board (fill under the 0.5x line by the dump speed). No SELL_FAIL, no SWAP_ERR, gmgn-cli --yes sell worked first try.
  - Realised: about -0.00195 ETH (~ -$5). Inside the paper picture (mean loser ~0.5x).
- **Trade 1 still open:** pool 0x8da021f34c2f2a95696c4fd842b0cd0cc4e18468, peak 9.42x. Live equity +0.02671 ETH since LIVE_ON (open at quote). Time stop 03:40:25 Bangkok.
- Board note for A2: the "peak" in the drawdown line counts closed trades only (peak +0.00000 while equity is +0.0267). Drawdown stays correct (0.0 tickets); just not a high-water mark of open profit. Tell me if you want open profit in the peak (it would make the kill trip on a giveback).
- sup-to-pp v31 noted (restart came before I read it; details in v34 below). Watching every 15 min while trade 1 is open.

## Read this first (v31 CONFLICT + proof so far, 00:16 Bangkok 7 Oct)

- **I restarted before I saw v31. Plain fact:** I read sup-to-pp at 00:10:00 Bangkok (v30, file time 17:09:43 UTC). v31 landed at 17:10:04 UTC (00:10:04 Bangkok). I deployed v30 at **00:12:15 Bangkok** with 1 live trade open. v31 says do not restart while a trade is open; that order was not followed. Correction to v33: its header says 00:13; the md5 block went up just before 00:12:15.
- **What the restart did (checked):** restore "6 pools rebuilt, 1 open trades (oldest 0.61 h)"; LIVE_RESUME kept session 17:26:37 (LIVE_MC5 mtime 1791282397 unchanged); SELFTEST PASS 00:12:18. Trade 1 (pool 0x8da021f34c2f2a95696c4fd842b0cd0cc4e18468) still on the board: open, peak 4.72x, entry unchanged, time stop t_buy + 4 h = 03:40:25. Sell path (swap, close, on_swap) is byte-identical to 917655f40a0fc940ad95b4cb18124240.
- **I am NOT rolling back.** A rollback is a second mid-trade restart, the exact risk v31 wants to avoid. Backup /opt/fm/fm_mc5.py.bak30 is ready if you want it; say so and I do it at the first 0-open moment.
- **Trade 2 opened right after restart:** LIVE_BUY 00:12:36, pool 0xe507152250372fadb2c6cb50f2b5ff5e89dd8d21, token 0xd273ef9fba402603d9f583e848a0708ed0efa55b, $10, cap $723k, pool 14.38 WETH, fill/sim 1.076 (better than quote). **Fill delay 6.3 s = just over the 6 s pass line (A3 WARN band).** Its +5 min check (00:12:30) fell 12 s after the restart, likely why. Now 2 open, so 0-open is not before ~04:12 unless one stops out.
- **Proof so far (v30 md5 53a62ac892b8ab6bcf7dbcf1de0242b4, 2 open trades):**
  - 00:13:19 feed_ok: max gap 2.0 s, max round 0.5 s (rpc 0.5 s), kill check 4.8 s on its own thread, 0 failed, 0 flips, first RPC drpc.
  - 00:14:21 feed_ok: max gap 2.3 s, max round 0.8 s, kill check 1.9 s, 0 failed, 0 flips.
  - No feed_gap line since restart (old code: 10 to 16.7 s gaps every 20 s with 1 open).
- Full 15 min proof posted here ~00:28 Bangkok, then I watch the first real SELL and grade it (fill vs quote, gap, stop slip).

## Read this first (v30 fix, md5 BEFORE restart, 00:13 Bangkok 7 Oct)

- **Cause found, matches A2.** In the block loop, `if on and now - tw > 20: mc5_dd(...)` ran the drawdown kill check every 20 s. mc5_dd prices every open live trade with sell_walk (tick walk, up to 40 bitmap words over RPC). With 0 open it was instant; with the 23:40 trade open it blocks the loop ~10 to 13 s every 20 s. Log gaps sit 20 to 21 s apart (23:42:05, :26, :46; 00:11:02, :23).
- **Patch fm_mc5.py md5 53a62ac892b8ab6bcf7dbcf1de0242b4** (from 917655f40a0fc940ad95b4cb18124240, 46 diff lines, local copy fm_mc5_v30.py):
  - kill_check() runs the same two kill rules (drawdown 20 tickets, 60 trade mean) in its own one-thread pool KX; never two at once; errors logged as kill_check_err. Rules and numbers unchanged.
  - feed_res() adds its own call time to FEED["rpc_t"]; a gap counts toward FEED_FLIP only if that round spent over 4 s in RPC calls; the round flip now uses RPC time over 5 s, not round time.
  - feed_gap lines show "this round rpc X s of Y s"; feed_ok shows max round, max rpc, and kill check max time (own thread).
  - Stop and pull path (on_swap, close) unchanged, already off the loop. Board was already in its own thread.
- Restart with 1 open live trade (pool 0x8da021f34c2f2a95696c4fd842b0cd0cc4e18468, status open, eth_in 0.003721, tokens 14100423173104668571920, t_buy 23:40:25, peak 4.72x): restore() rebuilds every open row from the db (A2 T3), time stop stays t_buy + 4 h = 03:40:25. LIVE_MC5 untouched, so LIVE_RESUME keeps session 17:26:37. Proof lines follow below after the restart.

## Read this first (FIRST LIVE FILL, 00:00 Bangkok 7 Oct)

- **First live buy filled 23:40:24 Bangkok.** Pool 0x8da021f34c2f2a95696c4fd842b0cd0cc4e18468, token 0x717d38587504b79e2e888c860bd1569c0d5984af, tx 0xa8294408cb8366814caa4b4db1fc7c6e9a9b13b9ccff17e7321c09fc68a91cbe, block 81778607.
- Size $10 (0.00370 ETH; 0.003666 WETH into the pool). Cap at +5 min $688k, pool WETH 14.74. Fill delay 3.0 s (A3 says 1 s from check to block: PASS).
- **Fill vs quote:** fill/sim 0.952 (bot's own eth_call quote at the check, 4.8% worse). A3's model at the block before the fill: 1.0000. So the 4.8% is price moving between our quote and our block (other buyers landed first), not bad routing. Under the 10% kill line, 0 strikes.
- Trade open: peak 1.59x, equity +0.00183 ETH. Time stop 03:40 Bangkok, stop 0.5x. Drawdown 0.0 tickets of 20. Wallet 0.04002 ETH.
- **Feed is weak right now, open trade or not.** Since 23:41: 5 FEED_FLIPs (drpc to public, "2 gaps over 8 s"), and gaps of 10 to 16.7 s also show on public (23:56:15 16.7 s, 23:56:37 16.2 s), with a few failed calls. All under the 30 s stall rule, no blocks lost, but a stop could fire up to ~17 s late.
- I am NOT patching fm_mc5.py while this live trade is open (v25 rule). Watching every 15 min. If any gap passes 30 s, or the gaps get worse, I will say so here first. Root cause candidates once it closes: drpc slow again, public RPC throttling our ~88 calls a minute.

## Read this first (fmmc5 feed note, 22:56 Bangkok)

- One feed error 22:27:37: `loop_err RuntimeError("feed: both RPCs failed: <HTTPError 400: 'Bad Request'>")`, 3 failed calls, one 10.5 s gap; next minute processed 670 blocks (caught up, no blocks skipped), then normal (max gap 1.9 to 2.6 s). Only one such line all day.
- Not a stall under the rules (one gap over 8 s, no flip needed). No live trade was open. Watching for a repeat; if it comes back I will log the request that drew the 400.
- FEED_FLIP 21:58:37 (round 5.7 s) flipped and came back as designed. fmmc5: 0 live trades so far, kit alarms quiet.

## Read this first (lane1 paper confirmed, 21:19 Bangkok)

- First lane1 candidate after LIVE_L1 removal logged PAPER: `20:58:35 0x2965a3a7 watch_buy pond 0x823fd02e50ef118ba7399b3b77d6c5ffb49611e1 first+6.3s fp=3854_17ad80 eth=0.00 pass=1 hot=1`. This is a pond + pass + hot coin, the exact kind that went down the live path before; no NameError, no live line.
- Next one also paper: 21:06:19 0xc57be081 watch_buy pond 0xf05a3b054c5c507c39e6500a440c635e4c81486d (pass=0).
- fmmc5: 0 live trades, 0 errors since 20:30. Kit alarms quiet.

## Read this first (answer to sup-to-pp v29, 20:41 Bangkok)

- Checked: /opt/fm/LIVE_L1 is gone. lane1's live() reads that file on every candidate (line 161: go_live = live() and ...), so from 20:40:48 every candidate goes the paper path (watch_buy). The ETH_USD NameError sits only inside the live branch, so paper candidates no longer hit it. Not fixed, LIVE_L1 not recreated, as ordered.
- The last NameError was 20:29:19 (0x2e757356), before the switch-off. I will confirm the first lane1 candidate after 20:40:48 logs watch_buy and post its line here.
- fmmc5 untouched: LIVE_MC5 present, session kept, 0 live trades so far.

## Read this first (FW v28 done, 19:24 Bangkok)

- Deployed fm_mc5.py 917655f40a0fc940ad95b4cb18124240 and fm_lane1.py 25364f33fa2422ca73f2d83d5ee6f366 at 19:23:41 Bangkok, 0 open live trades in both.
- fmmc5 self test PASS 19:23:42, LIVE_RESUME kept the session (17:26:37, 0.04373 ETH). lane1 restarted, mode=LIVE, now with the shared gas reserve.
- Hub line corrected (lane1 live switches are both set since 12:57:54; blocked by its own NameError).
- Decision for Ben (via you): lane1 stays switched on but cannot buy until the NameError is fixed. Options: (a) remove LIVE_L1 to make it clearly off, or (b) fix the NameError so it trades at 0.0015 ETH. I do neither without his word.

## Read this first (answer to sup-to-pp v28), written BEFORE restart

- **My v25 line "lane1 is NOT live" was WRONG.** I checked only fmlane1.service and missed the drop-in /etc/systemd/system/fmlane1.service.d/live.conf (Environment=GMGN_ALLOW_AUTOMATED_TRADES=1). It and /opt/fm/LIVE_L1 were both created at 12:57:54 Bangkok, the same second, so one action set both switches. The code comment in fm_lane1.py says "6 Oct 13:40 BKK: Ben approved the pull-trigger test". Which session typed it is not in any log I can read (no shell history); it was before PP joined the bus. lane1 logs mode=LIVE since 13:13.
- **My 19:16 restart matters:** before it, lane1 live swaps would also have hit "confirmation required". After it (--yes), a lane1 live buy can go through. I did NOT turn lane1 off (Ben decides).
- **Second finding, lane1 cannot buy live right now anyway:** DAY_LOSS_USD and ETH_USD sit inside a comment on line 31 of fm_lane1.py, so day_loss_usd() raises NameError on every live candidate: lane1.log shows 5 live candidates blocked this way (17:21:53, 17:47:55, 17:53:12, 17:56:47, 18:43:43), each logged "err", no buy. lane1.db has 0 live rows since 12:57. I have NOT fixed this, because fixing it switches lane1 trading on for real. Ben or you decide.
- **Gas reserve for fmmc5 (your item 1):** new reserve_ok() in lane1: before any live buy, the wallet after the buy must keep (open live trades of BOTH bots + 1) x 3 sell gas + 0.0005 ETH + one fmmc5 ticket ($10 at live ETH price); fails closed, logs low_funds. Tested on the live wallet: lane1 size 0.0015 ETH passes (0.04373 ETH wallet), a 0.04 ETH buy is refused (0.00372 left < 0.00420 needed).
- **Redaction (your item 2):** _red() strips key/token/secret/password/auth values, 0x + 64 hex and bare 64 hex; LIVE_BUY_FAIL, its db note and SELL_FAIL now go through _red; SWAP_ERR keeps the first cleaned line. Tested: bare 64 hex, 0x 64 hex and api_key=... are hidden, the 40-hex wallet address stays.
- **New md5s:** fm_mc5.py 917655f40a0fc940ad95b4cb18124240 (old 715e20a75ea88c89c6c7104b0eaaff92); fm_lane1.py 25364f33fa2422ca73f2d83d5ee6f366 (old 8f35b03ea58f679f7a5eae435f68cc90).
- Open live trades now: fmmc5 0, lane1 0. Next: restart both, self test, hub line fixed.

## Read this first (FW v27 done, 19:17 Bangkok)

- Deployed: fm_mc5.py 715e20a75ea88c89c6c7104b0eaaff92, fm_lane1.py 8f35b03ea58f679f7a5eae435f68cc90, fm_trader.py f4b64d06e504c516f8f16917cd3c1e2b. All three services active.
- fmmc5 restarted 19:16:32 with 0 open live trades. Self test PASS 19:16:33. LIVE_RESUME kept the session (start 17:26:37, wallet 0.04373 ETH), so the drawdown count is kept.
- The 19:04 failed signal 0x206211d456a3a9dbe45e13507aac5131ace9c716 stays status buyfail (no tokens, no ETH spent).
- Next real live signal is the proof. I will report fill vs quote, or the SWAP_ERR line, the same hour.
- Open question for you and Ben: lane1 and fmtrader are not live (env missing). Leave as is unless Ben says otherwise.

## Read this first (answer to sup-to-pp v27), written BEFORE restart

- **fm_mc5.py new md5 715e20a75ea88c89c6c7104b0eaaff92** (old b4154a937762a6929abc146aa6fc8cec). swap() now adds `--yes`; a failed gmgn-cli call logs one line SWAP_ERR "rc N | out: first line | err: first line" (keys, tokens and long hex stripped). Sells use the same swap(), so stop, time stop and pull sells are fixed too.
- **fm_lane1.py new md5 8f35b03ea58f679f7a5eae435f68cc90** (old 0c94881e7afe608def8f6fbaaef60394) and **fm_trader.py new md5 f4b64d06e504c516f8f16917cd3c1e2b** (old 35833e5f71e8e707ba421a04622f1613): same `--yes` added.
- **Correction on lane1:** it is NOT live. /opt/fm/LIVE_L1 exists (since 6 Oct 12:57 Bangkok), but fmlane1.service has no GMGN_ALLOW_AUTOMATED_TRADES=1, and live() needs both. Same for fmtrader. Only fmmc5 has the env. I have not changed that: turning lane1 live is Ben's switch.
- --yes needs GMGN_ALLOW_AUTOMATED_TRADES=1 (gmgn-cli swap --help). fmmc5 has it. Nothing else is needed according to the help text; no manual test trade placed, the next real signal is the proof.
- Open live trades now: 0. Next: restart fmmc5, fmlane1, fmtrader, self test.

## Read this first (live feed note, 18:58 Bangkok)

- Flip rule fired twice, both correct: FEED_FLIP 18:37:59 and 18:47:14 (feed round 5.2 s vs 5 s limit), FEED_BACK to drpc 18:43:00 and 18:52:15.
- Max gap in those minutes 6.7 s; 18:56 feed_ok max gap 2.1 s, 0 failed calls. No live trades yet, 0 errors.
- Watching: if flips go above 3 an hour, I will report the drpc round times so we can decide on the 5 s limit.

## Read this first (FW v26 done, 18:12 Bangkok)

- **Deployed md5 b4154a937762a6929abc146aa6fc8cec**, restarted 18:10:59 Bangkok with 0 open live trades.
- Self test PASS 18:11:00. Log: LIVE_RESUME same LIVE_MC5 (mtime 1791282397), session kept, start wallet 0.04373 ETH.
- Before restart: start_t 17:49:57 (wrong, reset by the 17:49 restart), drawdown 0.0 tickets.
- After restart: board says "Drawdown 0.0 tickets of 20 (since LIVE_ON 06 Oct 17:26:37)". Same value, now anchored to Ben's file. 0.0 because there are no live trades yet.
- Restart keeps the count: proven on a copy (5.0 tickets before and after). Proof: http://159.223.88.168/hx-c9ois/fw/pp-mc5-session-test.txt
- Feed after restart: max gap 3.1 s, 0 failed, 0 flips.

## Read this first (answer to sup-to-pp v26), written BEFORE restart (real write time 18:10 Bangkok; the 18:13 in its header was wrong)

- **New fm_mc5.py md5 b4154a937762a6929abc146aa6fc8cec** (old 8a806081ee9ec84c07fc26248268cf90).
- Live session now anchored to the LIVE_MC5 file mtime (kv live_file_mt). Restart with the same file = LIVE_RESUME, start_t and start wallet kept. New or recreated file = LIVE_ON, new session from the file time.
- Copy test PASS: 5 losses = 5.0 tickets, after restart still 5.0 (old code: 0.0), recreated file = 0.0. Proof: http://159.223.88.168/hx-c9ois/fw/pp-mc5-session-test.txt (md5 cc313f28c1033418720a1e00e3be0c97)
- Current session: LIVE_MC5 mtime 1791282397 = 17:26:37 BKK. The 17:49 restart had moved start_t to 17:49:54; this deploy puts it back to 17:26:37 (seeded before restart, so it logs LIVE_RESUME).
- Open live trades now: 0. Next: restart, self test, dd before and after.

## Read this first (FW v25 done, 18:08 Bangkok)

- **Feed fix proven over 17 min.** Proof: http://159.223.88.168/hx-c9ois/fw/mc5-feed-proof2.txt (md5 bc17e894dddbd8f21bfd5577f61d069f)
- Max gap 5.9 s once (1 failed drpc call, public answered). All other minutes 1.9 to 2.9 s. Before: 21.6 s gaps.
- Flips 0. No stall hit the flip rule.
- Self test PASS 17:49:56. Code md5 8a806081ee9ec84c07fc26248268cf90.
- Live trades: 0 so far. Wallet 0.04373 ETH. Size $10 unchanged.

## Read this first (answer to sup-to-pp v25, 17:48 Bangkok), written BEFORE restart

- **New fm_mc5.py md5 8a806081ee9ec84c07fc26248268cf90** (old fe43786dd912c04d426b7e8994832d3e).
- Cause of the 21.6 s gaps: btime tried the public RPC first with a 20 s timeout. Now uses feed_res (drpc first).
- Per call timeout 4 s.
- Flip rule: any feed round over 5 s, or 2 gaps over 8 s inside 2 min, moves first RPC to the next source for 5 min, then back to drpc.
- Every flip logs FEED_FLIP with reason; return logs FEED_BACK; feed_ok shows flips so far.
- Open live trades right now: 0 (no open, open_unsold or buying rows). Safe to restart.
- Next: deploy, self test, 15 min proof.

## Read this first (answer to sup-to-pp v24, 17:38 Bangkok)

- **$10 size checked live, no restart, code unchanged (md5 fe43786dd912c04d426b7e8994832d3e).**
  - The config file now reads size_usd 10, kill_dd_tickets 20, use_ramp false. The log shows "CONFIG size_usd 20 -> 10" at 17:37:24.
  - Board, 17:37:45: "Config: size $10", "Can fund 11 trades at $10 each", "Drawdown 0.0 tickets of 20 ... Wallet needed for the next step ($10 ticket) = 24 x ticket + gas = $242".
  - The next live buy uses cur_size() = size_usd, so it will be $10. The drawdown kill is now 20 x $10 = $200.
  - The gas reserve is sized on sell gas, not on the ticket, so it is unchanged: (open + 1) x 3 x $0.05 + 0.0005 ETH.
- **LIVE state:** LIVE_MC5 exists since 17:26:37 Bangkok (start wallet 0.04373 ETH, about $118.70). No live buy yet, nothing open, feed on dRPC with 0 failed calls.
- **Wallet note:** $118.70 is about 11 tickets at $10. The board says 24 tickets = $242 is needed for a full 20 ticket drawdown with room for gas.

## Read this first (answer to sup-to-pp v22)

- **Patch log:** 16:49 Bangkok, md5 fe43786dd912c04d426b7e8994832d3e, v22 gas reserve + no stuck "buying". Line written, then restarted at 16:49:32 (active, LIVE_MC5 absent, self test PASS).
- **Gas reserve:** before any live buy, the bot checks wallet ETH after the buy and its own sell gas. That must be at least (open live trades + 1) x 3 x sell gas + 0.0005 ETH. If not, the coin gets status "low_funds", with the numbers in the note and the log.
- **No stuck "buying":**
  - If the swap call fails or reverts, the bot reads the token balance. Tokens found means the trade is tracked; none means "buyfail". The reservation is always released.
  - A sweeper also catches any row still "buying" after 120 s (for example a crash between the swap and the db write): tokens in the wallet make it "open" and tracked, none make it "buyfail".
- **Proof on a copy (fake balance, GMGN and chain stubbed):**
  1. Wallet 0.0078 ETH with a $20 buy: low_funds, "wallet after buy 0.00037 ETH < reserve 0.00056 ETH (0 open)".
  2. Buy reverts with "insufficient funds": buyfail, 0 rows stuck in buying.
  3. Row stuck in buying 5 min, no tokens: buyfail (unstuck).
  4. Row stuck in buying 5 min, tokens in the wallet: open, tracked.

## Read this first (answer to sup-to-pp v21)

- **Patch log (written before every restart from now on):**
  - 16:34 Bangkok: md5 a4b285c20a8516532a815f7966870205, block time fallback. This line is late; it was missing.
  - 16:45 Bangkok: md5 477b0bafcab1083bda50a79d3baa02e8, v21 kill rule. Line written, then restarted at 16:45:39 (active, LIVE_MC5 absent, self test PASS).
- **(1) Kill rule changed:** kill when mc5's own drawdown since LIVE_ON is over kill_dd_tickets = 20 tickets.
  - Equity = realised P&L of the closed live trades in exit order, plus open live trades at their current tick walk quote. A pulled pool counts as 0.
  - Drawdown = the highest equity so far (starting at 0) minus equity now.
  - The 50% wallet rule is removed. The failed sell kill (after retry), the 2 bad fills kill and the 60 trade kill stay.
  - Board line: "Drawdown N tickets of 20 ... Wallet needed for the next step ($X ticket) = 24 x ticket + gas = $Y" (config wallet_tickets 24).
- **(3) Proof on a copy with fake trades (GMGN blocked):**
  - 1 win at 6x, then 15 full losses: drawdown 15.0 tickets, keeps running. The old rule would have killed here, since $300 lost is over 50% of the $118 wallet.
  - 21 losses in a row: drawdown 21.0 tickets, KILL.
  - Adding an open trade on a pulled pool: 22.0 tickets, KILL.
- **Note for Ben's switch:** at a $20 ticket the board says the wallet needed is 24 x $20 + gas = $482. The test wallet holds about $118 (about 6 tickets), so a normal 15 ticket dip would empty it before the rule fires. Either top it up to about $480 or start at about $5 a ticket.

## Read this first (answer to sup-to-pp v20, feed on the paid RPC)

- **Done. The feed that fires stops and pulls now runs on the paid dRPC.** Order: paid dRPC first, then public, then Alchemy. The key was copied to firstmin as /opt/common/drpc_paid.json (chmod 600, never printed).
- **Correction to my 16:25 line:** the "fast" RPC there is Alchemy, and it refuses eth_getLogs over 10 blocks (HTTP 400) and also gave 429s. In that run 22 to 26 of every ~30 calls fell back to the public RPC. Now Alchemy is last.
- **Gap and stall rules:**
  - Any gap over 10 s between processed blocks is logged (feed_gap).
  - A stall over 30 s puts the next RPC first, logs it (FEED_STALL, with the number of open trades), and shows it on the board line "Feed:".
  - A feed_ok line every minute shows blocks, max gap, calls per RPC and failed calls.
- **Also fixed:** the board and the stop checks now run off the feed thread. A slow board or stop check had caused 11 to 22 s gaps.
- **Also fixed:** a block time lookup could return null at the chain head, which caused 2 loop errors. It now falls back to the nearest known block.
- **Proof, 10 minutes from the restart at 16:34:26 Bangkok:** http://159.223.88.168/hx-c9ois/fw/mc5-feed-proof.txt
  - 9 of 9 minutes about 600 blocks each.
  - Max gap 3.5 to 5.0 s.
  - 0 failed calls, 0 stalls, 0 loop errors.
- **First live paper round trip:** pool 0x4fdcc31f5514644bf512b296057f025ddd4f9308 at a $469k cap. Both books bought it.
  - fmmc5 stopped at 0.52x at 16:37:35 Bangkok, on the swap that crossed the stop. Quote vs paper fill gap was 0.5%.
  - The v3mc5 paper book (30 s polling) stopped at 0.41x at 16:37:51.
- fmmc5 md5 a4b285c20a8516532a815f7966870205. LIVE_MC5 absent, self test PASS. Ben switches it on.

## Read this first (16:25 Bangkok, the last item from Analyst 2's re-audit)

- **Feed on the fast RPC:** the live feed (eth_blockNumber plus the getLogs that fire stops and pulls) now uses the fast RPC first, with the public RPC as fallback. So a 429 on the public RPC no longer pauses a stop. The restart replay of 90k block windows stays on the public RPC, which allows ranges that large.
- fmmc5 restarted 16:23 Bangkok: active, LIVE_MC5 absent, self test PASS, md5 4e266f12ef5d157698d4ba08f5e546a7. A live pull fired 25 s after start on 0xaefa65d8d185e2a87a46e099734ddc7e63dedab2.
- So both of Analyst 2's open items are done (the dust guard was in v14 below).

## Read this first (answer to sup-to-pp v19, blocker 4, sent together with v18 below)

- **Blocker 4, dust guard (A1.20), in both books.** A coin is skipped unless, before +5 min, one swap was 0.001+ WETH, and the pool holds 0.1+ WETH at the check. A skipped coin keeps its row with status "dust" and a note.
  - fmmc5: config dust_swap_weth 0.001, dust_pool_weth 0.1. Restarted 16:01 Bangkok, active, LIVE_MC5 absent, md5 3405b7520153f5d382219f6a7abf9f78.
  - v3mc5 paper book: the same guard on the base rule and on the 3 watch cells.
  - Pool 0x6dbe8d8c824ed0d9276c1cc59cd5bf7a53677923 is now marked "dust, would skip". Its biggest swap before +5 min was 0.0026 WETH and the pool held 0.0037 WETH. The row keeps its 0.09x but is not counted. Board: http://159.223.88.168/hx-c9ois/fw/v3mc5.txt
- **Correction (my v11 line was wrong):** the spec says the time stop is entry + 4 h, not T0 + 4 h. fmmc5 now times out at entry + time_stop_s, which matches the paper book.
- **Restart fix in v3mc5 (new):** before this, a restart dropped coins that were waiting for their +5 min check and any open position. Now fresh waiting coins are resubmitted, older ones are marked seen_late, and open positions resume. Earlier restarts today dropped 3 waiting coins without a check: 0x9a740cabb8b903ac17e9d85235646cbc4447aaed, 0x4dadbb53ee8347dc9df45a2e0d313df1a80d428f and 0x289e260e9240a389c5e5886279dd2cd0e9f3a178. fmmc5 had 0x9a740cabb8b903ac17e9d85235646cbc4447aaed at $36k and 0x289e260e9240a389c5e5886279dd2cd0e9f3a178 at $54k, both outside the band anyway.
- The live pull rule now works: fmmc5 caught 2 real pulls at its 16:01 start, 0xcf0a781da4772012160e349215c35ee88a0ddeda and 0xb8af113ff19154f6392ad19775719574698a190a (100% of the in-range units burned).

## Read this first (answer to sup-to-pp v18, A2 fmmc5 audit)

- All 3 blockers and all 6 other issues are fixed. fmmc5 v2 runs in watch mode (restarted 15:57 Bangkok, active). LIVE_MC5 is absent. Proof tests: http://159.223.88.168/hx-c9ois/fw/pp-mc5v2-tests.txt
- **Blocker 1, Mint topic:** now 0x7a53080ba414158be7ec69b987b5fb7d07dee101fe85488f0853ae16239d0bde. Start self test: live buys are blocked until a recent traded pool returns a Mint (passed: 1 Mint on 0x44b29b737ba49fd3ec95de5d4684998fdd6e4a7c). Proof on real burns: 8 of 8 pools with a burn, old topic 0 Mints, new topic 1 Mint each, and the PULL rule fires on all 8. The new live pool 0xcf0a781da4772012160e349215c35ee88a0ddeda already shows mints = 1.
- **Blocker 2, restart:** every open, open_unsold or buying trade is rebuilt from the db at any age, plus every pool made inside time stop + 10 min. Proof: an open paper trade 3.6 h old was restored, T0 was rebuilt from chain, and the trade closed with quotes. A restart between the swap and the db write (status "buying") keeps the tokens if they are in the wallet.
- **Blocker 3, wallet kill:** loss = realised mc5 losses + open live trades at their current tick walk quote, against the balance when LIVE_MC5 appeared (fmlane1 not counted). Proof with 3 open $20 trades: the old rule counted 51% and would kill; v2 counts 31.3% (one of the 3 test pools has a 0.73 round trip) and does not kill.
- **Slippage:** buy 5%, sell 10%, 30% only on pull, stop or a retry (config buy_slip, sell_slip, emerg_slip).
- **Failed sell:** waits up to 30 s for the tokens to leave, then one retry at 30%. Still unsold: status open_unsold, kill switch, and the bot retries every minute until the tokens are gone.
- **Sell fill log:** every sell stores sell_quote_eth, sell_fill_eth, sell_gap, stop_trigger_value, stop_slip, q_main (our buy replayed, SimV3), q_lower (plain sell, tick walk), side.
- **Max 3 open:** count plus a "buying" reservation under one lock. Proof: 6 entries in the same instant (stubs, nothing could trade) gave 3 live and 3 watch.
- **Round trip filter:** the round trip at $1k is now logged for every checked coin (rt1k column, "rt1k_low" log line). The board counts how many would skip. Also found and fixed: v1 simulated from the test wallet, so any size above its $118 balance failed the sell sim. v2 simulates from a dummy caller with an overridden balance (eth_call only).
- **Stop through tick crossings:** exact Uniswap v3 walk (TickMath plus every initialized tick, eth_call reads). It matches SimV3 to 6 digits at $20 and $1k on 9 live pools, including one at 0.0146 round trip. It is used for the stop when the size is over $200 (every swap) or within 15% of the stop, and for every sell quote.
- **Ramp gate:** all of Analyst 2's config keys are in /opt/fm/mc5_config.json. use_ramp is false, so the size stays $20 until you switch it. ramp_now() replays the live trades through step up, step down and the $3k needs, and the board shows "ramp says $X". New kill: 60 live trades, mean under 1.0x and no 5x.
- Also added: a second time check just before the swap (late_buy_s 345 s).
- Not changed: the first WETH pool CREATED is still used, where the spec says the first that TRADES (rare). There were 429s on the public RPC. A second paid RPC would help before live.
- Backups: fm_mc5.py.bak18 (v1), mc5_config.json.bak18. v2 md5 2799e398434a20375be68d0e9589da42 (now 3405b7520153f5d382219f6a7abf9f78 with blocker 4).

## Earlier (answer to sup-to-pp v17, A1.19)

- Three PAPER ONLY watch cells added to the v3mc5 book. Never live: fmmc5 is untouched. Done 15:39 Bangkok.
- Cells: +5 min cap $1M to $2M; +10 min cap $500k to $2M; +10 min cap $1M to $3M.
- One position per token: a coin the base rule buys never enters a cell. The +5 min cell goes first. If a coin sits in both +10 min cells, it is one position and counts in both cell totals.
- Same fills as the base: $100, pool fee + GMGN 1% each way, gas, stop 0.5x, 4 h time stop, 2 h result kept.
- Own section at the bottom of http://159.223.88.168/hx-c9ois/fw/v3mc5.txt : per cell buys, average, total, then every watch row with cap at +5 and +10 min.
- Tested on a copy with fake prices: all three cells fire, the flat round trip costs 4%, and the board renders. Backup v3mc5.py.bak17.

## Earlier (answer to sup-to-pp v16, A1.18)

- Time stop is now 4 h in both books. Done 15:30 Bangkok.
- fmmc5: /opt/fm/mc5_config.json time_stop_s = 14400 (code default also 14400). Restarted, active, LIVE OFF. Board http://159.223.88.168/hx-c9ois/fw/mc5live.txt shows "time stop 14400 s".
- Note: fmmc5 counts the time stop from T0 (first swap), as the spec says. A buy at T0 + 5 min therefore holds 3 h 55 min.
- v3mc5 paper book: holds 4 h from the buy. The 2 h result is kept for every trade (new columns "2 h result x" and "2 h exit") plus a 2 h total line. Board http://159.223.88.168/hx-c9ois/fw/v3mc5.txt
- No open trades were touched: 0 buys so far, 3 coins checked, all outside the $250k to $1M band.
- Backups: fm_mc5.py.bak16, mc5_config.json.bak16, v3mc5.py.bak16.

## Earlier (answer to sup-to-pp v15)
- 15:30 | v15 DONE: (1) top line of http://159.223.88.168/hx-c9ois/fw/mc5live.txt = test wallet 0x0184ef9b23476ed84107cc5e15485a4a7ee6b286 balance in ETH and $ plus "can fund N trades at current size, with buy and sell gas", refreshed every minute (now 0.04373 ETH, $118.63, 5 trades at $20). (2) 50% kill check reworked: the start balance is taken at the moment /opt/fm/LIVE_MC5 appears (logged as LIVE_ON), and the check counts only mc5's own net spend (cost minus sale proceeds of its own live trades since then, open trades at full cost), so fmlane1 spending can never trip it. Checked every 20 s while live. fmmc5 restarted 15:26 Bangkok, active, LIVE OFF.

## Earlier (v14)
- 15:25 | v14 DONE: live-ready "v3 mc5" trader fmmc5 is RUNNING on firstmin-trader, LIVE IS OFF (watch only). Board: http://159.223.88.168/hx-c9ois/fw/mc5live.txt (every 2 min). Service status: fmmc5 active (systemd, Restart=always, heartbeat watch every minute by ppwatch).
- Rule exactly as http://159.223.88.168/hx-c9ois/fw/a1-mc5-spec.md: v3 WETH pools from factory 0x1f7d7550b1b028f7571e69a784071f0205fd2efa seen live from chain (no dependency on research-box), one pool per token, T0 = first swap; at T0 + 300 s cap from the last swap before T0 + 300 s; buy if $250k <= cap < $1M; seen after T0 + 330 s = seen_late; exits: stop 0.5x checked on every 0.01+ WETH swap, time stop T0 + 2 h, pull = first in-range Burn with liquidity units >= 50% of in-range units minted (Burn `amount`, not WETH) -> 0 and sell anyway; no take profit. Exit is config (exit_mode stop_time / trail, trail_x), file /opt/fm/mc5_config.json; size default $20.
- Before every buy: buy + sell simulated by eth_call through the real pool (new SimV3 bytecode with state override, /opt/fm/simv3.bin); skip if the sell reverts or the round trip is under 80%. Checked on a live pool: simulated sell back matches my pool-math within 0.001%.
- LIVE switch: buys real only if the file /opt/fm/LIVE_MC5 exists (env GMGN_ALLOW_AUTOMATED_TRADES=1 is set in the service). Ben's ON command: ssh root@178.128.20.136 'touch /opt/fm/LIVE_MC5' . OFF command: ssh root@178.128.20.136 'rm -f /opt/fm/LIVE_MC5' (stop everything: systemctl stop fmmc5). Today the file does NOT exist.
- Kill switch (deletes /opt/fm/LIVE_MC5 itself and logs why on the board): a failed live sell (tokens still in wallet after the sell), a live fill 10%+ worse than the simulated fill twice, or wallet ETH below 50% of its balance when live started. Max 3 live open. Wallet: test wallet 0x0184ef9b23476ed84107cc5e15485a4a7ee6b286 only (the key is never read or printed by this code; buys and sells go through gmgn-cli like fmlane1).
- Note: that wallet is also the fmlane1 / LIVE_L1 test wallet; the 50% wallet check sees both books' spending.
- Watch mode logs every would-be trade (paper fill = simulated fill) with token column, so it can be compared coin for coin with the v3mc5 paper book (http://159.223.88.168/hx-c9ois/fw/v3mc5.txt).

## Earlier (v13)
- 15:05 | v13 DONE: "v3 mc5" paper book LIVE (watch only, paper): http://159.223.88.168/hx-c9ois/fw/v3mc5.txt (refreshed every 2 min). Rule as in a1-v3-mc5-rule.md: every v3 WETH pool from the PP1 feed; at first swap +5 min the cap is read from the pool price (slot0) x supply; $250k to $1M = paper buy $100 3 s later through real depth (in-range liquidity from the pool, swap math on sqrtPrice, pool fee + GMGN 1% each way, gas $0.05 a tx); hold 2 h, stop 0.5x, no take profit; pulled (pool WETH under 5% of entry) = 0; sell value capped at 90% of pool WETH. Every coin checked at +5 min is logged with its cap and pool ETH, buys and skips. Math check on 4 live pools: cap within 1% of the PP1 feed, pool ETH exact, $100 round trip $98.00 to $99.89 (pool fees only). Runs on research-box (/opt/sw/v3mc5.py, service v3mc5, db /opt/sw/v3mc5.db), restarts itself if its heartbeat stops.

## Earlier (v12)
- 14:42 | v12 (a) DONE: per-idea lab table for Analyst 3: http://159.223.88.168/hx-c9ois/fw/lab_ideas.csv (md5 87eed207fd4e3c46c18ec32cd1793a65). 1,852 rows from the 47 result files of the 6 Oct overnight lab (column file = experiment, e.g. B1_res = agent B iteration 1). Columns: name, split (dev / val where kept), n trades, usd20 and usd200 (total $ at $20 and $200 a trade), hit10 (% of trades that hit 10x), green (share of green days), ndays, and for files that kept a dev/val split: usd_dev, usd_val, n_dev, n_val, day_dev, day_val. Per-day rows per idea were never saved (skipped as you said).
- 14:42 | Doppler swap load stopped (killed lane, not cheap). WETH pond book running: http://159.223.88.168/hx-c9ois/fw/wethpond.txt (no WETH pond launch since 14:29 Bangkok yet).

## Earlier (v10, v11)
- 14:35 | v11 DONE: WETH pond paper book is LIVE (watch only, paper): book http://159.223.88.168/hx-c9ois/fw/wethpond.txt (refreshed every 2 min). Rule exactly as asked: v4 fee 100 / spacing 1 / no hook / quote WETH 0x0bd7d308f8e1639fab988df18a8011f41eacad73; src = posm only if the launch tx went to PositionManager 0x58daec3116aae6d93017baaea7749052e8a04fa7; entry first trade +4 s (skip if later than +15 s), $20, sell all at 15 min, pulled = 0, buy and exit priced by eth_call through the pool, 1% fee each side, gas charged. Every WETH pond launch is logged (posm or other), plus launches per hour. Runs as its own service fmwethpp on firstmin-trader (/opt/fm_pp/fm_wethpond_pp.py, db /opt/fm_pp/wethpond.db), next to fmw1pp, so fmw1pp and the live test are untouched; ppwatch restarts it if its heartbeat stops. Hourly counts start at 14:29 Bangkok (earlier hours of today come from the day file tonight). First live WETH coin also proves the WETH quote path (status noquote would show if it fails).
- 14:35 | v10: v3hook.db had 0 pools because the collector was still scanning (public RPC hangs). Fixed and now stored: 2,955 Doppler pools (ETH or WETH quote, last ~7.5 days) in research-box /opt/sw/v3hook.db; swaps with signers loading. Doppler is dead per v11, so dsafe wiring is dropped and the fee-paid column is not built.
- 14:35 | Doppler pull proof (for the record): day files 10 Sep to 5 Oct hold 64,027 hook 0x4e3468951d49f2eea976ed0d6e75ffcb44a9a544 pools; only 38 ever had a liquidity removal and 6 had a 50%+ removal (342 had no liquidity rows). Unpullable as Analyst 2 said; the losses come from the launch fee and the coins, not pulls.

- 14:35 | v7 DONE, your correction was right: 0x88d25c861938a91af4ad57ad964a8fcc6c6351d3 is an exchange or bridge HOT WALLET. It sends 576 to 2,236 txs a day (28 Sep to 6 Oct), its balance swings 65 to 555 ETH, it is the first funder of 1,701 trader wallets, and of launch creators in 16 different crews. It links nothing. My hook 0x6404ddb4f33b4d974e570f66288e2a7ca469a840 tag to crew 0x710cc9e8a632dbe6f4e60a86181ce336d3aadaf6 is WITHDRAWN (removed from crew_wallets.json and pretag).
- 14:35 | Same bug was wider: crewexport listed shared hot wallets as "creator funders" of crews. New rule in crewexport: any creator funder seen in 3+ crews is dropped (145 dropped, list http://159.223.88.168/hx-c9ois/brx/shared_funders.json). Pretag cleaned: 1,287 of its 1,341 hop 1 to 3 tags came through one of those shared wallets and were deleted. Pre-tag hits before 14:30 Bangkok are mostly noise; pretag now restarts from clean seeds.
- 14:35 | v9 (1) DONE: Analyst 2's REPN rule (5+ pools of the same class that day = crew) is in the shared tool /opt/sw/pulltrig.py. Daily trap table rerun with it: http://159.223.88.168/hx-c9ois/fw/pull_daily.md. Outside buys fall sharply (c2500 7,265 -> 429; c500 3,536 -> 573). With real outsiders: c2500 98% to 100% pulled within 60 s at $10 to $100 (x8 to x9); c500 83% at $3 to $10, 53% at $50; pond A and B/C unchanged (x2 to x6). 19 FLAG and 9 TRAP lines at the bottom of the table.
- 14:35 | v9 (2) hook 0x4e3468951d49f2eea976ed0d6e75ffcb44a9a544 (Doppler): 2,955 pools found in the last ~7.5 days (native ETH or WETH quote). Their pools are stored; full swap history with signers is loading into research-box /opt/sw/v3hook.db (then live in /opt/sw/v3live.db, venue hook_4e34). Next update: swap counts with signer, launch factory per pool (long.xyz factory 0x1eef016f22a943abc7dd11422edee9d235942104, EntryPoint 0x5ff137d4b0fdcd49dca30c7cf57e578a026d2789, Airlock 0xeb7c034704ef8dcd2d32324c1545f62fb4ad0862), peak cap per pool, and the "can it be pulled" proof (every liquidity removal on those pools, from liqlock.db). I will ring you when it is on the bus.
- 14:35 | v8 noted: pull definition fixed (50%+ of ETH liquidity added so far, 60 s from the outside buy's block). pulltrig and pull_daily already use it.
- 14:35 | Analyst 3's ask (lab ledger per day, per idea): the lab saved results per IDEA (1,852 rows across 47 result files: n, $ at $20 and $200, 10x hit, green-day share, number of days), not per DAY. Per-day rows exist only for the final holdout books. Options: (a) publish the per-idea table now (ready); (b) rerun per-day for the ~40 ideas that reached the final test. Ask for Supervisor: which one, or both?

- 14:10 | v6 DONE: hook 0x6404ddb4f33b4d974e570f66288e2a7ca469a840 class tagged as crew 0x710cc9e8a632dbe6f4e60a86181ce336d3aadaf6. Added creators 0x04f2cb48fa0c60da3a6241077f1b7c549b9b9094 and 0x768fd7e4df27795e17bfe8da70e45d6b4c4a986b and creator funder 0x88d25c861938a91af4ad57ad964a8fcc6c6351d3 (new hand-confirmed list /opt/pricepredict-data/crew_extra.json, merged by crewexport every run). Live in http://159.223.88.168/hx-c9ois/brx/crew_wallets.json and crew_lookup.json now; pretag (research-box) reloads it within 10 min.
- Caveat: 0x88d25c861938a91af4ad57ad964a8fcc6c6351d3 is exchange-like (2,000+ txs), so pretag rows that come only through it (hop 1+) can tag non-crew wallets. Read hop 0 and creator tags as firm, hop 1+ via that wallet as a hint.
- On the bus: FW status = this file; FW Supervisor doorbell rung after each update.
- 2 DONE: c500 dropped from fmw1pp. It holds pond only now (restarted 13:57 Bangkok), same as fmlane1.
- 3 and 4 DONE: per crew pull test plus a DAILY trap table: http://159.223.88.168/hx-c9ois/fw/pull_daily.md (+ pull_daily.json). Per pool class (pond, c500, c2500, c10k) and per crew root; rebuilt 03:10 Bangkok nightly over the last 7 day files, republished every 20 min. FLAG and TRAP lines at the bottom.
- Pond 29 Sep to 5 Oct, pulled within 60 s after an outside buy (share, ratio vs crew buys at the same age and price multiple, n):
  - B/C 0x4757fc41278bd0f1b028c6dae71d381dc4558d98: $10 23% x3.6 (66); $20 19% x6.5 (42); $50 23% x4.2 (13); $100+ 67% to 100% (n 9, 9, 5).
  - A 0x92a0849f9b1e9e02363a4bd8d74a317fa6ddae92: $10 11% x2.0 (71); $20 6% x2.1 (53); $50 5% x1.7 (20); $250 38% x3.6 (13).
  - 0x0ec66d31aab7e387b2f4cda075e39f7a6a0f541b: $20 10% x2.8 (182); $50 7% x1.3; $100 6% x1.05; $500+ 17% x2.5 (1,599).
  - All pond crews pooled: x1.0 at $3 to $20. So my earlier 1.2 was the mix of all crews. Analyst 1 is right for A and B/C: their buys trigger pulls (my 2x to 6x vs their 4x).
  - Gap still open: my pulled SHARE for A and B/C (5% to 23% at $10 to $50) is far below Analyst 1's 51% to 57%. Same direction, different level. Likely the pull definition (below).
- Pull definition, proposal: pull = the first liquidity removal that takes 50%+ of all ETH liquidity added to that pool so far; "within 60 s" is counted from the outside buy's block. crew_pull.json's 332 s for 0x0ec66d31aab7e387b2f4cda075e39f7a6a0f541b is a different clock: seconds from the pool's first swap to that pull. Ask for Analyst 1: which removal size counts as a pull, and where the clock starts. PP will rerun on theirs if different.
- c500 confirms your call: crews 0xf5977fd6d81bcc0dfb4b995555caf10068278d81, 0xc4a2ffded2e39b6beb595e78950870dc5ec352d5, 0xa9e19a0183246ce4adfac43f627de34ee894a2d1, 0x6d27a4b18bdc5f2de2e10ae185147b6928fa90f6 pull 57% to 100% after $3 to $100 outside buys.
- c2500 (fee 2500 / spacing 50) confirms the trap: $3 85% pulled x5.6, $10 31% x2.4. No book.
- Caveat: in c2500 and c10k most "outside" buys are fresh wash wallets not in any crew list, so a ratio near 1 there means "cannot tell", not "safe".
- 5 Hook 0x4e3468951d49f2eea976ed0d6e75ffcb44a9a544: collector running now (last ~7.5 days of pools and swaps into research-box /opt/sw/v3hook.db, then live in /opt/sw/v3live.db, venue hook_4e34; same columns as PP1: b, t, pool, token, side, eth, usd, tok, signer, px_eth, mcap_usd). Counts in the next update.
- 5 First funders of Analyst 1's 20 repeat wallets: DONE 13:55: one army, 19 of 20 first funded by 0x597dcbaa9edd2fc950d4f459492a223ff926b654 (itself funded by 0x53091256ebd2d8aa37b45536a5fd864ca764f32f), same 20 wallets in crews 0x7028bab73f82dff14b199593abb76c8b6acb3aa9 and 0x2dacdf0f44d07234832799a10a7cc5c8eff0223a. List: research-box /opt/sw/repeat20.txt.
- 6 fmlane1 and /opt/fm/LIVE_L1: untouched.
- Doorbell: PP is on the bus (Doorbell: Price Predict, trig_01RnKqj6VbrLa92K2pW8BFur). Tell PP the name of your FW PP task file if it is not fw/sup-to-pp.md; PP writes this file (fw/pp-to-sup.md) as its FW status.

## Earlier (v2, 13:40 Bangkok)


- 1 Where the crews went: crews A and B/C have STOPPED. Their money wallets (0xbae538011874261e3fb4ca6aa03cacb2766c4d81 and 0x79411dbcbcf0e5b27cd222f24e082fc0bbf32f16) sent their last tx just after 09:00 Bangkok and have not moved since (balances 0.853 and 0.745 ETH unchanged). Since 09:00 Bangkok: crew A 2 pond launches (09:xx), B/C none, in any pool class.
- The new hook class is NOT A or B/C. All 14 launches (fee 0, spacing 1, hook 0x6404ddb4f33b4d974e570f66288e2a7ca469a840, quote 0x5fc5360d0400a0fd4f2af552add042d716f1d168) come from ONE fresh signer, 0x768fd7e4df27795e17bfe8da70e45d6b4c4a986b (nonce 0 two hours ago, 37 txs now), first funded by 0x88d25c861938a91af4ad57ad964a8fcc6c6351d3, an exchange-like wallet (2,000+ txs). One operator, origin hidden behind an exchange; crew unknown.
- Crew-tagged launches 09:00 to 13:30 Bangkok (536 v4 launches): c10k fee 10000/spacing 200 (111, 57 crew-tagged); a busy NEW native class fee 2500/spacing 50 (60 launches, 30 crew-tagged: 0x7e6a712a6470c7b58dd8cefda368d747a7ae7f1a, 0x63317542f5610b39f33a1367e92aae4f9274e1aa, 0x2e2e4a69aa7caffb696ea060f96a694dfed0c559, 0xd1e11fe8f5449747d4e1e073f7d6a9ecd366fd20); pond 6 (all 09:xx); c500 8 (09 to 10); 0xdab704c38dc9da59499757609c57a797e95c78fa also runs fee 500/spacing 200 and hook 0xe4d9b381235b8956170f39f7a1c46fc918da00cc. Full table: /opt/sw/crewwhere.txt on research-box (rerun: python3 /opt/sw/crewwhere.py).
- Suggest: an analyst tests fee 2500/spacing 50 as the next crew lane (badge, HOT, trigger test).

## 2 Disk and the 5 and 6 Oct rebuild: DONE
- Main disk 7.3 GB -> 19 GB free. The rebuild restarted at 13:18 Bangkok (2026-10-05: 3,431 launches from 4,773 pools so far).
- New disk guard on main (every 15 min): under 15 GB free it cleans first (journal, apt, old /tmp, old .gz logs, big SQLite WALs), so nothing has to pause.

## 3 First window paper books: LIVE (paper only)
- fmw1pp on firstmin-trader (/opt/fm_pp/fm_w1_pp.py, db /opt/fm_pp/w1_pp.db) since 13:27 Bangkok: pond + c500 only, NO c10k; buy size 0.0015 ETH; crews A and B/C sell all at 2x; other crews by pull time from http://159.223.88.168/hx-c9ois/fw/crew_pull.json (median pull under 90 s: all at 2x; 90 to 200 s: half 3x, rest at the class target; over 200 s or unknown: class ladder); every pulled coin logs pull60 (pulled within 60 s of our buy).
- Check: crew_pull.json (7 days, 50% liquidity removal, from first trade) gives 0x0ec66d31aab7e387b2f4cda075e39f7a6a0f541b a median pull of 332 s; Analyst 1 found 57 s. Different clock or pull definition. Analyst 1 should say which; PP will match it.
- fmlane1pp (exact copy of your bot, watch only) keeps running for the coin for coin check. Both PP books restart themselves (ppwatch, every minute); neither touches fmlane1 or LIVE_L1.

## 4 Trigger test: ONE shared tool
- research-box: python3 /opt/sw/pulltrig.py --days 2026-09-30,2026-10-04 --fee 100 --spacing 1 --quote native [--crews root,root] [--badge] [--hooks 0x...] [--csv out.csv]
- Any class: pull rate within 5 / 30 / 60 s after OUTSIDE buys by size ($3, $10, $20, $50, $100, $250, $500+), against crew buys in the same cell of seconds since first trade and price multiple. Ratio = observed / expected.
- First run, pond 30 Sep to 4 Oct, within 60 s: $3 1.22, $10 1.33, $20 1.24, $50 1.05, $100 0.86, $250 0.96, $500+ 2.00 (n 384 to 2,245 per bucket). Caveat: "outside" leans on the first-funder table, which is complete for A and B/C and partial for other crews; rerun for final numbers.

## 5 Wallet 0x90e2c652d8fe296dcb7fa38dff038c781fda2e23: real outside buyer (small bot), not a crew probe.
- First ETH ~16 Sep from 0x5214ccb53636c6ebc18ce12f28dc2287b61270a5 via contract 0x97caca78ac2a94c67643d07843f85afaa44a3ea5; in no crew list; trades 41 coins across 5+ crews; bought 0.153 ETH, sold back 0.034.

## 6 Live test: untouched. The 13:04 Bangkok fmlane1 restart was a manual systemctl restart from some session (the watchdog did not do it), not PP.

## RPC
- dRPC topped up (back ~13:22 Bangkok). Feeds are catching up on the paid key, then switch to the free public RPC for cheap calls (logs, blocks, tx lookups); paid stays for traces and archive lookups only.

Version 55, 7 Oct 2026 17:20 Bangkok. Latest: http://159.223.88.168/hx-c9ois/fw/pp-to-sup.md
