# Paper test legitimacy audit, round 1 (Test Manager, 9 Oct 2026 ~22:00 BKK, board #172)
Verdict up front: **no test is verified yet.** Three real problems found; two fixed today, one needs a feed. Registry stays `verified: false` for all.

## A. Grid replay (live mc5 rule) vs real live  -  "+$2,860 replay vs live down"
Numbers (grid LIVE csv, 158 trades 13 Sep - 8 Oct, $10 a trade): total +$2,860, median trade 0.48x (the stop), 22% win, 31 trades >= 2x, 15 trades >= 10x. **Without the top 3 trades +$1,877, without the top 8 +$926.** Two thirds of the profit is 8 runners out of 158.
- **Same coins, same fills (check 5):** A1 (fw/a1-live-vs-harness.md) matched 18 closed pairs: live sum 55.2x vs replay 48.0x; live 25 trades 6-8 Oct mean 2.31x (+$328) reproduced by the replay. 3 of 3 strict MATCH in fw/a1-live-match.txt (stop fills 0.50-0.52x vs 0.50-0.52x). Replay stop fills 0.49x vs live 0.22-0.52x: replay about 0.05-0.1x per loser too kind (known gap, small next to the runners).
- **Why live is down while replay is up:** (1) *Missed entries, not fill errors:* of 25 replay trades in 6-8 Oct, 6 never happened live (429 on the 19.5x coin, 2 "submitted, no hash", 1 confirmation-required, 1 cap-floor, 1 feed miss). The one winner lost to the 429 is worth more than the whole stop-loss column. The 429 retry went live 8 Oct 15:23. (2) *Tail luck:* with the replay's own distribution (19.6% of trades >= 2x), P(no 2x+ in 14 closed live trades since the restart) = 4-5%; P(mean <= 0.6x over 10 trades) = 13%. Unlucky, not proof of a broken model, not proof it is fine. (3) Rugs: pool emptied in one tx, replay books ~0, live got 0.01x: same.
- **Verdict:** replay fill model is accepted for stops and normal exits (3 hand-matched coins + 18 pairs), NOT as evidence for the mean: that rests on ~8 runners. Do not read +$2,860 as expected profit; expect live to run below it by execution misses. Still open before `verified`: rebuild 3 trades from chain blocks myself (A1's match is the proxy), and live needs >= 2 runner-days to compare. Re-check weekly with fw/a1-live-match.txt.

## B. h100 (hooked fee-100) and busy60 (unhooked fee-100): found a real bug, fixed
- **Bug (check 4/1): silent pulls looked like wins.** v4tape has no ModifyLiquidity (liq.jsonl is empty, ppfeeds #162). When a pool stopped swapping, the test closed at the last price, which was still high. Proof: the control arm Z of the new busy60 test (every unhooked fee-100 pool, sim 0.98x) showed **16 trades, mean 2.40x, 0 losers**; after counting a pool that goes quiet before the hold ends as a pull (0), Z is **mean 2.00x with 5 zeros**; h100 arm C (tp20, no stop) went from 7 of 8 "quiet" exits at last price to 0.00 for std-init. h100 arm A 7/7 -> 8 trades, 1 loser (2.55x). Fix in h100.py and busy60.py (backups not needed, h100 cron picks it up); column `x_if_quiet_sold` keeps the old value.
- **Still too generous:** a pull while swaps continue is only caught through the swap liq field; true pulls need ModifyLiquidity. Waiting on ppfeeds #162.
- **Check 2 (outside sellers):** script /root/tm/audit_out.py. Every tp exit (h100 A/B 11 of 11; h3k A/C/D 9 of 9) has sells at >= 80% of the target price within +-60 s, 6-9 sells / 0.3-2 ETH for the 3x/4x exits, 17-51 sells / 5-24 ETH for the h3k 20x/30x exits. **But tape has no tx.from**, so these cannot be split into outside holders vs the operator's own churn. A2 #138: no outside wallet sold above 5x in 113 H3000 pools. So: h100 A/B (3x/4x) plausible, **h3k arms C, D, F (20x, 30x, ladder) are not proven sellable and should be read as unrealistic.** Needs ppdata tx.from (board #91/#134).
- **Check 1 (sellability): not tested.** No hook code read, no eth_call sell. Needs Ben's decision on the $5 sell test (#138). Until then hook skim/blocks can zero any of these.
- **Check 3 (look-ahead):** entry uses first swap + 63 s, reserve gate from swaps up to entry, pull-before-entry check from swaps up to entry only. h3k "shared hook" filter uses pool counts that are known only later (a hook reused by a second pool): look-ahead small, being removed as soon as n is large. busy60 up/down counts use swaps until first+60 s only.
- **Check 4:** size 0.04 ETH vs pool reserve gates (0.3/0.4 ETH) = 10-13% of the reserve with 3% slippage assumed flat: probably too kind for the thin pools. Not hand-rebuilt yet.
- **Verdict h100 / h3k / busy60:** fix applied (bug), **not verified**; wait for ModifyLiquidity, tx.from and Ben's $5 sell. Arms C/D/F of h3k: treat as invalid.

## C. p204 (V3 P204 nightly replay)
Only 2 closed 5x trades, both at 4.77-4.87x with real bt.py fills (the harness walks ticks on real depth, 1% each way + gas). Too few to audit; sample is 3 of 86 pools surviving to +66 s. Not verified; kill rule at 100 trades unchanged.

## D. New today (all unverified, listed on the tests page)
- busy60 (A2-BUSY60 #173, arms A/B/Z + h100 arm E low-FDV): cron */10, fw/tm-busy60.md. Selection risk flagged by A2 (41/6 from 12 tries); the control arm Z is there to catch exactly that.
- v2ramp (#169), v3005 (#168): added to the register. v3005: zero trades is correct (A1); retire if no gated pool by 14 Oct.

## E. What I need
- ppfeeds #162: ModifyLiquidity in v4tape (pulls). ppdata: tx.from for v4/v3 swaps (outside-seller check). Ben: $5 real sell on a hooked pool (#138).
