{
 "notes": "EPISODE 9 (2026-11-10). Read goal state, README (26 solved files, 0 mismatches), all 8 results. No requester notes/refusals. Spawned 15 items in 9 batches (7 A, 8 B): used 125->140 of 240; 100 items and 11 episodes left. finish=false; nothing entered on the board.\n\n1. TRACK A BAR CLOSED FOR M09. Recomputed 3 new engine blocks from rows (match): a7-confirm-m09-a/eng-12007424 (256), a8-close-m09/eng-12009728, eng-12009792 (64 each); frozen hashes/wheel match, validate passes, 0 faults, M09 afterSwap peak <=202222. Pooled with ep8 (n,sum,sumsq; sample variance): M09-IB n4352 sum16561.89237517556 sumsq72696.89983294165 mean3.8055819 se.0225974. M09-PB n3328 sum1552.3115949377695 sumsq1744.1113330047542 mean.4664398 se.0095983. PB-IB n4488 sum15099.217521313143 sumsq60130.81212553013 mean3.3643533 se.0215266. Q2-IB unchanged (n4232, 3.0213). M09 is the standing contract (+3.81 over IB on 4,352 fresh seeds; bar +2.7 on 4,000; historic peak 219533). No more unchanged-M09 sampling. Reports audited, not rerun.\n\n2. BREAKTHROUGH, the orchestrator's own finding, verified on the replica, NOT YET ON THE ENGINE: the arb/retail flag can be read from the float structure of the afterSwap amounts. In the engine source (arbitrageur.rs, cfmm.rs, router.rs at 6b6921f8) an arb's net input is a difference of two reserves (net_y = new_ry - reserve_y, then amount_y = net_y/gamma; or amount_x = (x_virtual - rx)/gamma), so amount*(1-fee) lies on the reserve's double grid (2^-39 for Y in [8192,16384), 2^-46 for X in [64,128)); a retail fill (router split) lies on it only by chance. TELL (replica doubles): fb, fa = fees in force; if is_buy v=amount_x*(1-fb), z=reserve_x else v=amount_y*(1-fa), z=reserve_y; g=min(ulp(z),ulp(z-v)), ulp(u)=2**(floor(log2 u)-52); tol=C*2.220446e-16*v, C=1; tell = |v/g-round(v/g)|*g<=tol; r=min(1,2*tol/g) if tell else 0; in real.py step 2 pi=0 if r=0 else L_arb/(L_arb+r*L_ret). My measurements: under gauss+qm on 4 runs 15,637/15,637 arb trades flagged, 85/30,377 retail flagged. On replica seeds 66000..66095 the blind tell policy minus gauss+qm = +2.980 se .108, true-flag diagnostic minus gauss+qm +3.010 se .108, tell minus diagnostic -.030 se .014; first trades misread 459 of 672,194 (0.07%, was 16-29%). CAVEATS: a HARD pin on the tell (pi=1) lost 5.1 se 1.8 on 32 seeds (a false pin is catastrophic): always weight by r. C=.5 misses arbs (-.28). A fixed fee of exactly 30 bps (the rival's) gives 50% false tells (degenerate); 25 bps is fine. In the engine the contract sees WAD integers trunc(double*1e18) and Rust recomputes k=rx*ry, so the tolerance must be re-derived (about 4e-16 relative) and binade crossings handled (a9-tell-wad, the ports). It is an artifact of the simulator's arithmetic (inputs only): say so plainly in the write-up. Forecast: gauss+qm+tell = README's +6.98 minus .03 over HA = about +6.36 over IB, about 528.36 on the board.\n\n3. BOARD, ONE UNVERIFIED FETCH of paradigm.xyz/puzzles/amm on 2026-11-10 (a9-board re-reads it): 1st Tide v10 528.42, 2nd 528.40, 3rd 528.35, 4th @builtbyimd TellMinLookup 528.30, 5th-8th 528.27 to 528.10, 9th 526.78, 10th 525.38. If right: eight entries sit at the true-flag level (one possibly this network's), 10th is now 525.38 (M09, about 525.8, near 10th), and FIRST NEEDS MORE THAN +6.42 over IB: the tell alone is level with the cluster, so +0.1 to +0.3 beyond the flag is needed. Ep3's oracle gap: +1.48 in price given the flag, +.2 in rival/phase.\n\n4. B RESULTS READ (all against fresh lattice thr.9 unless said; none reaches .3): b8-rival-mass/mass8-2 mass repair +.0011 se .0077 tune, +.0049 se .0077 confirm vs original RivalT (repaired RivalT +.2178 se .0140 vs thr09 on 1,536 holdout seeds). b8-ambiguity-bonus/ig8-1 IG2 tables +.0046 se .0070 (2048). b8-fresh/fresh8-1 reserve-depth units -.0493 se .0089 (2048). b5-fresh/fresh5-2 empirical fill law +.0302 se .0057 (2048). b6-learned/value-residual -.0237 se .0076 (2048). All dropped. Every pre-tell misread lane (threshold, mixture, rival likelihood, fill law, probes, posterior values) is superseded; re-measure an old idea only on the tell base.\n\n5. SPAWNED. B (replica; tune 66000..66255, confirm 66256..66511, holdout 10000..12047 once): b9-tell-gauss tg-1, tg-2 (TellGauss vs ref flag_qm/lattice_qm/gauss_qm); b9-tell-latt tl-1 (lattice + tell vs TellGauss); b9-kappa-flag kap-0, kap-3e5, kap-1e4 (qm tables at another information weight, under the tell); b9-float-forensics ff-1 (what else exact floats leak). A: a9-tell-wad wad-1 (integer WAD form of the tell, tolerance, vectors); a9-tell-port tp-1, tp-2 (M09 + tell = contract T1: twin, Solidity, WAD parity, gas, validate; gates.pass); a9-tell-pilot tp-1, tp-2 (STAGED after a9-tell-port by item, check gates.pass=true: T1, M09, IB on 128 fresh seeds each); a9-board board-1 (live leaderboard and scoring rules); a9-board-seeds bs-0, bs-500 (IB alone on engine seeds 0..499, 500..999, the default amm-match seeds: a pooled mean of 522.00 means the board is reproducible locally; DIAGNOSTIC, outside the ledger, never pooled or tuned on). If the plane refused the staged batch, spawn the pilots by hand next episode with the port results' URLs.\n\n6. LEDGER. Engine 12000000..12009855 all used or retired (exclusions unchanged: 12003072..12003327 borrowed gas; 12003328..12003583 anomalous IB; 12004864..12005119 source-built; 12003848..12004095 and 12007168..12007423 retired unrun). NEW: a9-tell-pilot tp-1 12009856..12009983, tp-2 12009984..12010111; retired if cancelled. Next free 12010112. Never reuse or refill.\n\n7. NEXT EPISODE. (a) Pilots: T1-IB near +6.4 (within .2 of the replica's +6.36) means the tell works on the engine: then give the better T1 its own 4,000-pair confirmation in 256-seed items from 12010112 with IB and M09 as arms (16 items). T1 near M09's +3.8 means the tell failed in WAD form: read tell_vs_truth in the port results and wad-1, mend the tolerance or binade handling, re-port. (b) Ports failed their gates: re-run with wad-1's integer test and vectors in the brief. (c) Tables and belief under the flag: whatever of kap-*, tl-1 or ff-1 adds >= .1 over TellGauss on the full holdout goes into the next port (with eight entries inside .3, .1 decides first place); the lattice is too heavy for the contract (403k gas), so carry a lattice gain to the Gaussian or mixture twin first. (d) board-1 and bs-*: set the real target (first place score, whether seeds are shared and equal to 0..999); if the board is reproducible, score the final candidate and IB on 0..999 once as the forecast. (e) New B items on the TellGauss base only: price between pins given the flag (RivalT joint belief gave +.21 before the flag; per-run sigma from exact pins), 2.5 bps table grid (README Open 4). Pending b8 items (mass8-1, ig8-2, fresh8-2) are low-value reads; do not wait on them.\n\n8. ARTIFACTS (https://api.imdnotdead.fun/artifacts/<result sha>; code_zb64 = base64/zlib/tar unless said). M09 qualifier 063270cb0315aaded47d5cb3f437297bf8e9aac55e179fc4d26534a6d0e269d3 (m09-2/Strategy.sol source sha a44cca4b0155ca3953f27ccb6b43ac8ee74b1cdc4f27022ee5fc51d8ab67ed5f, generator, twin, parity tools). Audit bundle db67c7a0e8fa98f87b069766df6e213890861b15f967695293f519ecc46eeeb6 (IB.sol sha 301941829a44bb60977bb28181a5e4bfa6544f3696763f987054789b2611d686, Q2.sol, PB.lines.json, restore_pb.py, canonical.py). Three-arm runner: runner.code_zb64 of 37096a34a13345a470a4fbfdca0be064dba0c81da6c06afc47b5af3a725111da (canonical.py, restore_pb.py). Table-rebuild tools (bounded_solve.py, dp.py, qmdp.py): bc08c5b7158c7922a4a39a29c129ed59e53d05da9a9f11b462bc2f6826249c2d. solc 0.8.24, viaIR, optimizer 200, paris; wheel sha aedb68280aca34c110968f00148387c95885207913fb2cf19a1ab4c5cfd6887a. Engine peak gas runs about 50k above pyrevm. Briefs: raw and filled under 2,900 ASCII characters, every placeholder in every item's vars as a string, no platform conditions, results under 60,000 bytes, batches of five or fewer.",
 "spawn": [
  {
   "name": "b9-tell-gauss",
   "brief": "Track B: confirm one blind Python policy on the holdout, independent copy {{copy}}. Fetch B=https://raw.githubusercontent.com/gtmcknight/amm-sim/e65314f88de945f6d055bfc2aab01c482ab6570e/research/solved with: curl -LsSf $B/fetch.sh -o fetch.sh && sh fetch.sh $B scratch/solved. Read Harness and Rules in its README.md.\nTELL: keep the fees in force fb, fa (as clamped to 0..0.1). On a trade, if is_buy: v = amount_x*(1-fb), z = reserve_x; else: v = amount_y*(1-fa), z = reserve_y. ulp(u) = 2**(floor(log2(u))-52); g = min(ulp(z), ulp(z-v)); q = v/g; tol = C*2.220446e-16*v; tell = abs(q-round(q))*g <= tol, C = 1. If tell: r = min(1, 2*tol/g), the chance a retail amount lands that close to the grid; else r = 0. In real.py step 2 replace pi by 0 when r = 0, else L_arb/(L_arb + r*L_ret); the rest of real.py is unchanged (soft=1, qm=qm_k1e-5.json). Why it works: an arb's net input is a difference of two reserves, so it sits on the reserve's float grid; a retail fill comes from the router and does not. \nOrchestrator's own check, replica seeds 66000..66095: this policy minus gauss+qm +2.980 se 0.108; minus the true-flag diagnostic (oraclearb=1) -0.030 se 0.014; first trades misread 459 of 672,194; every arb trade flagged. A hard pin on the tell (pi = 1) lost 5.1 se 1.8 on 32 seeds, and C = 0.5 misses arbs: keep r. \nWORK: write tellpol.py with class TellGauss(T, opt) = real.py's RealPolicy plus the tell above, setting `first`, `is_arb` and `m` so run.py reports misread and price error. At most 3 settings (C = 1 or 2; r as given or r/2), chosen on replica seeds 66000..66255, frozen, confirmed on 66256..66511; then the holdout 10000..12047 once. Blind: the policy gets the six afterSwap inputs and its own state, never truth, seed, run parameters or the future; unchanged run.py and pair.py. No command over 8 minutes: run seed ranges in chunks. A seed not run is listed as missing, never filled. A negative or partial result is a result. No engine, no board entry. \nRESULT, one JSON object under 50,000 bytes: {item, status, frozen_settings, tell: {arb_trades, arb_flagged, retail_trades, retail_flagged, false_flag_rate_by_size_quartile} on the tuning seeds (truth read only by an offline wrapper, never by the policy), tuning, confirmation, holdout_vs_flag_qm, holdout_vs_lattice_qm, holdout_vs_gauss_qm (each paired{n,mean_diff,se,sum,sumsq,worst5} from pair.py against ref/flag_qm.json, ref/lattice_qm.json, ref/gauss_qm.json, with misread rate and price RMS), checks {tell_off_equals_gauss_qm_bitwise, hidden_input_scramble_equal, policy_never_reads_truth}, gas_estimate, limitations, code_zb64 (base64 of zlib of a tar with your policy and scripts, no tables) and code_sha256 of the tar}.",
   "items": [
    {
     "key": "tg-1",
     "vars": {
      "copy": "1"
     }
    },
    {
     "key": "tg-2",
     "vars": {
      "copy": "2"
     }
    }
   ],
   "output": {
    "format": "json",
    "maxBytes": 60000
   }
  },
  {
   "name": "b9-tell-latt",
   "brief": "Track B: one blind Python policy, the lattice filter with the arb tell ({{copy}}). Fetch B=https://raw.githubusercontent.com/gtmcknight/amm-sim/e65314f88de945f6d055bfc2aab01c482ab6570e/research/solved with: curl -LsSf $B/fetch.sh -o fetch.sh && sh fetch.sh $B scratch/solved. Read Harness and Rules in its README.md.\nTELL: with fb, fa the fees in force (clamped 0..0.1): if is_buy, v = amount_x*(1-fb), z = reserve_x; else v = amount_y*(1-fa), z = reserve_y. g = min(ulp(z), ulp(z-v)), ulp(u) = 2**(floor(log2(u))-52); tol = 2.220446e-16*v; tell = v within tol of a multiple of g; r = min(1, 2*tol/g) if tell else 0. In real.py step 2, pi = 0 when r = 0, else L_arb/(L_arb + r*L_ret); nothing else changes (soft=1, qm=qm_k1e-5.json). An arb's net input is a difference of two reserves, so it sits on the reserve's float grid; a retail fill does not. \nChecked by the orchestrator on replica seeds 66000..66095: +2.980 se 0.108 over gauss+qm, -0.030 se 0.014 against the true-flag diagnostic, 459 of 672,194 first trades misread, every arb flagged; a hard pin on the tell (pi = 1) loses 5. \nWORK: (1) control tellpol.py TellGauss = real.py plus the tell, exactly as above. (2) candidate TellLattice = latt.py's LatticePolicy with the same change: on the first trade of a step the mixture weight of the arb point mass is 0 when r = 0, else L_arb/(L_arb + r*L_ret) with latt.py's own L_arb and L_ret; is_arb = weight > 0.5; nothing else changes. No tuning beyond C = 1. Check on 66000..66255, then score candidate and control once on the holdout 10000..12047 (or as many whole 256-seed chunks of both as fit; the lattice takes about a second a run). Blind: the policy gets the six afterSwap inputs and its own state, never truth, seed, run parameters or the future; unchanged run.py and pair.py. No command over 8 minutes: run seed ranges in chunks. A seed not run is listed as missing, never filled. A negative or partial result is a result. No engine, no board entry. \nRESULT, one JSON object under 50,000 bytes: {item, status, tuning_candidate_vs_control, holdout_candidate_vs_control, holdout_candidate_vs_flag_qm, holdout_control_vs_flag_qm, holdout_candidate_vs_lattice_qm (each paired{n,mean_diff,se,sum,sumsq,worst5}, with seed ranges, misread rate and price RMS of both arms), checks {tell_off_equals_lattice_qm_on_2_seeds, hidden_input_scramble_equal, policy_never_reads_truth}, what the lattice adds once the flag is known (one sentence with the number), gas_estimate, limitations, code_zb64 (base64 of zlib of a tar with your policy and scripts, no tables) and code_sha256 of the tar}.",
   "items": [
    {
     "key": "tl-1",
     "vars": {
      "copy": "copy 1"
     }
    }
   ],
   "output": {
    "format": "json",
    "maxBytes": 60000
   }
  },
  {
   "name": "b9-kappa-flag",
   "brief": "Track B: one table variant for a policy that knows the arb flag: information weight kappa = {{kappa}}. Fetch B=https://raw.githubusercontent.com/gtmcknight/amm-sim/e65314f88de945f6d055bfc2aab01c482ab6570e/research/solved with: curl -LsSf $B/fetch.sh -o fetch.sh && sh fetch.sh $B scratch/solved. Read Gates and Tables in its README.md.\nTELL: with fb, fa the fees in force (clamped 0..0.1): if is_buy, v = amount_x*(1-fb), z = reserve_x; else v = amount_y*(1-fa), z = reserve_y. g = min(ulp(z), ulp(z-v)), ulp(u) = 2**(floor(log2(u))-52); tol = 2.220446e-16*v; tell = v within tol of a multiple of g; r = min(1, 2*tol/g) if tell else 0. In real.py step 2, pi = 0 when r = 0, else L_arb/(L_arb + r*L_ret); nothing else changes (soft=1, qm=qm_k1e-5.json). An arb's net input is a difference of two reserves, so it sits on the reserve's float grid; a retail fill does not. \nChecked by the orchestrator on replica seeds 66000..66095: +2.980 se 0.108 over gauss+qm, -0.030 se 0.014 against the true-flag diagnostic, 459 of 672,194 first trades misread, every arb flagged; a hard pin on the tell (pi = 1) loses 5. \nIDEA: qm_k1e-5.json was built (qmdp.py, third argument kappa = 1e-5) for a filter that misread 16% of first trades; larger kappa lost then. With the flag read right every arb is an exact pin, so the best weight may differ. WORK: build the uv venv (numpy, numba), regenerate the solver values (DP_SAVEVN=1 DP_AMINL=-12 DP_NA=43 dp.py solve 0.8 9.45 20; on a slow seat add DP_STATE and DP_SWEEPS=40 and repeat until SOLVED; a checkpointing helper bounded_solve.py is in the code_zb64 (base64/zlib/tar) of https://api.imdnotdead.fun/artifacts/bc08c5b7158c7922a4a39a29c129ed59e53d05da9a9f11b462bc2f6826249c2d), check that kappa 1e-5 reproduces qm_k1e-5.json, then build qm_{{tag}}.json with kappa {{kappa}}. Score TellGauss (real.py plus the tell) with the new table against TellGauss with qm_k1e-5.json, same seeds: 66000..66255, then the holdout 10000..12047 once. Blind: the policy gets the six afterSwap inputs and its own state, never truth, seed, run parameters or the future; unchanged run.py and pair.py. No command over 8 minutes: run seed ranges in chunks. A seed not run is listed as missing, never filled. A negative or partial result is a result. No engine, no board entry. If the solve cannot finish, return status partial with the sweeps reached and score nothing.\nRESULT, one JSON object under 50,000 bytes: {item, status, kappa, solver {converged, sweeps, control_table_identical}, table_change {cells_changed, rms_bps, max_bps}, tuning_vs_control, holdout_vs_control, holdout_vs_flag_qm (each paired{n,mean_diff,se,sum,sumsq,worst5} with misread rate and price RMS of both arms), limitations, code_zb64 (scripts only, no tables or value arrays), code_sha256}.",
   "items": [
    {
     "key": "kap-0",
     "vars": {
      "kappa": "0",
      "tag": "k0"
     }
    },
    {
     "key": "kap-3e5",
     "vars": {
      "kappa": "3e-5",
      "tag": "k3e-5"
     }
    },
    {
     "key": "kap-1e4",
     "vars": {
      "kappa": "1e-4",
      "tag": "k1e-4"
     }
    }
   ],
   "output": {
    "format": "json",
    "maxBytes": 60000
   }
  },
  {
   "name": "b9-float-forensics",
   "brief": "Track B: one diagnostic, what else the exact numbers of afterSwap give away ({{copy}}). Fetch B=https://raw.githubusercontent.com/gtmcknight/amm-sim/e65314f88de945f6d055bfc2aab01c482ab6570e/research/solved with: curl -LsSf $B/fetch.sh -o fetch.sh && sh fetch.sh $B scratch/solved. Read its README.md and replica2.py. Read also, for the real arithmetic, the engine source at https://raw.githubusercontent.com/benedictbrady/amm-challenge/6b6921f8d463314aa7c96234e1be25a25245f704/amm_sim_rs/src/ : amm/cfmm.rs, market/arbitrageur.rs, market/router.rs, market/retail.rs, types/wad.rs.\nKNOWN: TELL: with fb, fa the fees in force (clamped 0..0.1): if is_buy, v = amount_x*(1-fb), z = reserve_x; else v = amount_y*(1-fa), z = reserve_y. g = min(ulp(z), ulp(z-v)), ulp(u) = 2**(floor(log2(u))-52); tol = 2.220446e-16*v; tell = v within tol of a multiple of g; r = min(1, 2*tol/g) if tell else 0. In real.py step 2, pi = 0 when r = 0, else L_arb/(L_arb + r*L_ret); nothing else changes (soft=1, qm=qm_k1e-5.json). An arb's net input is a difference of two reserves, so it sits on the reserve's float grid; a retail fill does not. \nChecked by the orchestrator on replica seeds 66000..66095: +2.980 se 0.108 over gauss+qm, -0.030 se 0.014 against the true-flag diagnostic, 459 of 672,194 first trades misread, every arb flagged; a hard pin on the tell (pi = 1) loses 5. \nQUESTION: is there any OTHER exact or near-exact information in the six inputs and the policy's own fees? Candidates to test, each alone, on replica seeds 66000..66063 with an offline wrapper that sees truth: (1) a sharper arb test (exact round trip: an integer n with (n*g)/(1-fee) equal to the amount bit for bit) and its false-flag rate by trade size; (2) whether a retail order was split with the rival or went to us whole; (3) anything exact about the rival's reserves after a split (its product x*y is constant in the replica; say whether cfmm.rs keeps it so); (4) anything exact about the fair price on a retail sell (the engine converts size to X by the fair price); (5) one idea of your own. For each: the test in words and Python, hit and false rates against truth, whether it follows from the Rust source or only from replica2.py (they order operations differently; say where), and what it would buy. Do not score policies on the holdout. No command over 8 minutes. No engine, no board entry.\nRESULT, one JSON object under 50,000 bytes: {item, status, findings: [{name, test, n, hit_rate, false_rate, holds_in_rust_source: true|false|unclear, reason, value}], best_arb_test {false_flag_rate_by_size_quartile, missed}, limitations, code_zb64 (base64 of zlib of a tar with your policy and scripts, no tables) and code_sha256 of the tar}.",
   "items": [
    {
     "key": "ff-1",
     "vars": {
      "copy": "copy 1"
     }
    }
   ],
   "output": {
    "format": "json",
    "maxBytes": 60000
   }
  },
  {
   "name": "a9-tell-wad",
   "brief": "Track A: one specification, the arb tell in the integers a contract receives ({{copy}}). Python only. Fetch B=https://raw.githubusercontent.com/gtmcknight/amm-sim/e65314f88de945f6d055bfc2aab01c482ab6570e/research/solved with: curl -LsSf $B/fetch.sh -o fetch.sh && sh fetch.sh $B scratch/solved. Read replica2.py, real.py and the engine source at https://raw.githubusercontent.com/benedictbrady/amm-challenge/6b6921f8d463314aa7c96234e1be25a25245f704/amm_sim_rs/src/ (amm/cfmm.rs, market/arbitrageur.rs, market/router.rs, types/wad.rs).\nKNOWN on the replica's doubles (verified on 96 seeds; a hard pin on the tell loses 5, so r matters): TELL: with fb, fa the fees in force (clamped 0..0.1): if is_buy, v = amount_x*(1-fb), z = reserve_x; else v = amount_y*(1-fa), z = reserve_y. g = min(ulp(z), ulp(z-v)), ulp(u) = 2**(floor(log2(u))-52); tol = 2.220446e-16*v; tell = v within tol of a multiple of g; r = min(1, 2*tol/g) if tell else 0. In real.py step 2, pi = 0 when r = 0, else L_arb/(L_arb + r*L_ret); nothing else changes (soft=1, qm=qm_k1e-5.json). An arb's net input is a difference of two reserves, so it sits on the reserve's float grid; a retail fill does not. \nThe contract sees WAD integers, trunc(double*1e18), and its fee is used as fee_wad/1e18. So V = amount_wad*(1e18-fee_wad) is the net input times 1e36; an arb's V is a multiple of 2**-46*1e36 (X, reserve in [64,128)) or 2**-39*1e36 (Y, reserve in [8192,16384)), binade from the reserve, within about 4e-16*V. \nWORK: write wadsim.py, replica2.py's trade arithmetic re-ordered to follow the Rust source operation for operation (quote and execute functions, k = rx*ry recomputed, arb cap, router MIN_AMOUNT, Wad::from_f64, fee to_f64 and clamp), so each callback yields the six WAD integers plus the true flag, with the policy's fees passed through WAD integers as a contract returns them. Run gauss+qm fees on seeds 66000..66031. Find the integer test and the smallest tolerance with zero missed arbs, its false-flag rate by trade size, and what happens when a reserve crosses a power of two; try the exact round-trip test (emulating the roundings) too. List where the Rust order of operations differs from replica2.py and whether the tell survives. No command over 8 minutes. No engine run, no board entry.\nRESULT, one JSON object under 55,000 bytes: {item, status, integer_test (words and integer-only Python), tolerance, callbacks, arb {n, missed}, retail {n, false_flag, by_size_quartile}, binade_handling, rust_vs_replica_differences: [..], r_formula, vectors: 60 callbacks as [is_buy, amount_x, amount_y, reserve_x, reserve_y, fee_bid, fee_ask, flag, tell], integers as decimal strings, gas_estimate, limitations, code_zb64 (base64 of zlib of a tar with your policy and scripts, no tables) and code_sha256 of the tar}.",
   "items": [
    {
     "key": "wad-1",
     "vars": {
      "copy": "copy 1"
     }
    }
   ],
   "output": {
    "format": "json",
    "maxBytes": 60000
   }
  },
  {
   "name": "a9-tell-port",
   "brief": "Track A: port the arb tell into the frozen contract M09, giving contract T1; copy {{copy}}. No board entry. Start from https://api.imdnotdead.fun/artifacts/063270cb0315aaded47d5cb3f437297bf8e9aac55e179fc4d26534a6d0e269d3 (code_zb64 = base64/zlib/tar: m09-2/Strategy.sol, generator, Python twin, parity tools). Replica: Fetch B=https://raw.githubusercontent.com/gtmcknight/amm-sim/e65314f88de945f6d055bfc2aab01c482ab6570e/research/solved with: curl -LsSf $B/fetch.sh -o fetch.sh && sh fetch.sh $B scratch/solved. \nTELL (replica doubles): fb, fa the fees in force; if is_buy, v = amount_x*(1-fb), z = reserve_x; else v = amount_y*(1-fa), z = reserve_y. g = min(ulp(z), ulp(z-v)), ulp(u) = 2**(floor(log2(u))-52); tol = 2.220446e-16*v; tell = v within tol of a multiple of g; r = min(1, 2*tol/g) if tell else 0; first-trade weight pi = 0 when r = 0, else L_arb/(L_arb + r*L_ret). real.py with it is within 0.03 of the true-flag diagnostic on 96 replica seeds; a hard pin on the tell loses 5, so keep r.\nThe contract sees WAD integers, trunc(double*1e18), and its fee is used as fee_wad/1e18. So V = amount_wad*(1e18-fee_wad) is the net input times 1e36; an arb's V is a multiple of 2**-46*1e36 (X, reserve in [64,128)) or 2**-39*1e36 (Y, reserve in [8192,16384)), binade from the reserve, within about 4e-16*V. \nWORK: 1. Twin: M09's Python twin with pi replaced as above, all else as M09; cost on 60000..61023 against gauss+qm and against M09's twin. 2. T1: the same change in m09-2/Strategy.sol (solc 0.8.24, viaIR, optimizer 200, paris; no assembly; at most 32 slots; runtime at most 24,576 bytes). 3. Gates: fees within 0.01 bps of the twin on the callbacks of replica runs 10000..10019, converted to WAD integers the way the engine makes them (follow cfmm.rs, arbitrageur.rs and wad.rs under amm_sim_rs/src in the checkout); the contract's tell against the true flag there; pyrevm afterSwap peak at most 195,000; no OutOfGas, no revert; amm-match validate passes. Clone https://github.com/benedictbrady/amm-challenge at 6b6921f8d463314aa7c96234e1be25a25245f704; from the checkout: mkdir -p scratch && curl -LsSf https://raw.githubusercontent.com/gtmcknight/amm-sim/main/research/setup.sh -o scratch/setup.sh && sh scratch/setup.sh; prefix later commands with `. scratch/env.sh && `. If a step fails return blocked={step,error} with whatever else you finished. \nRESULT, one JSON object under 58,000 bytes: {item, status, gates {pass: true only if every gate passed, parity_max_bps, callbacks, tell_vs_truth {arb, missed_arb, retail, false_arb}, peak_gas, runtime_bytes, validate}, twin_cost {vs_gauss_qm, vs_m09_twin: paired{n,mean_diff,se,sum,sumsq,worst5}}, tell_spec, source_sha256, limitations, code_zb64 (base64 of zlib of a tar t1/ with Strategy.sol, twin and tools), code_sha256}.",
   "items": [
    {
     "key": "tp-1",
     "vars": {
      "copy": "1"
     }
    },
    {
     "key": "tp-2",
     "vars": {
      "copy": "2"
     }
    }
   ],
   "output": {
    "format": "json",
    "maxBytes": 60000
   }
  },
  {
   "name": "a9-tell-pilot",
   "brief": "Track A: engine pilot of contract T1, the result of {{after.batch}}/{{after.key}} at {{after.result}} (also among your inputs; its code_zb64 is base64/zlib/tar with t1/Strategy.sol). Measure T1, the frozen M09 and IB, each ALONE against VanillaStrategy, on exclusive fresh engine seeds {{from}}..{{to}} (128), in 64-seed commands. No board entry.\nClone https://github.com/benedictbrady/amm-challenge at 6b6921f8d463314aa7c96234e1be25a25245f704; from the checkout: mkdir -p scratch && curl -LsSf https://raw.githubusercontent.com/gtmcknight/amm-sim/main/research/setup.sh -o scratch/setup.sh && sh scratch/setup.sh; prefix later commands with `. scratch/env.sh && `. If a step fails return blocked={step,error} with whatever else you finished. \nRunner: adapt canonical.py from runner.code_zb64 (base64/zlib/tar) of https://api.imdnotdead.fun/artifacts/37096a34a13345a470a4fbfdca0be064dba0c81da6c06afc47b5af3a725111da (arms ib, pb, m09) to arms ib, m09, t1. IB.sol is in the code_zb64 of https://api.imdnotdead.fun/artifacts/db67c7a0e8fa98f87b069766df6e213890861b15f967695293f519ecc46eeeb6 (sha256 301941829a44bb60977bb28181a5e4bfa6544f3696763f987054789b2611d686); M09 is m09-2/Strategy.sol in the code_zb64 of https://api.imdnotdead.fun/artifacts/063270cb0315aaded47d5cb3f437297bf8e9aac55e179fc4d26534a6d0e269d3 (sha256 a44cca4b0155ca3953f27ccb6b43ac8ee74b1cdc4f27022ee5fc51d8ab67ed5f). Assert both hashes; compile all with solc 0.8.24, viaIR, optimizer 200, paris. Configs: build_config over BASELINE_SETTINGS and BASELINE_VARIANCE with numpy default_rng(absolute seed), draws in the order retail_mean_size, retail_arrival_rate, gbm_sigma; amm_sim_rs.run_batch(X, Vanilla, configs, 8); edge = edges['submission']. Reset gas_stats before each command and read it after. Each arm once per seed, the same configs for all arms, no reruns, no command over 470 s; a seed not run is listed as missing and never filled.\nRESULT, one JSON object under 58,000 bytes: {item, status, allocation {first, last, count}, arms {ib, m09, t1: {n, sum, sumsq, rows [[seed, edge]]}}, paired {t1_minus_ib, t1_minus_m09, m09_minus_ib: paired{n,mean_diff,se,sum,sumsq,worst5}}, gas per arm {submission afterSwap peak and mean, afterInitialize peak, every fault counter for both roles, calls_equal_ok}, validate per arm, valid (false on any OutOfGas, any revert or an afterSwap peak over 245,000), hashes {source and runtime sha256 per arm, wheel sha256}, reading: the replica says T1 minus IB is about +6.4 if the tell works on the engine and about M09's +3.8 or less if it does not; say which you measured, limitations, runner code_zb64 and code_sha256}.",
   "items": [
    {
     "key": "tp-1",
     "vars": {
      "from": "12009856",
      "to": "12009983"
     }
    },
    {
     "key": "tp-2",
     "vars": {
      "from": "12009984",
      "to": "12010111"
     }
    }
   ],
   "after": {
    "batch": "a9-tell-port",
    "pairing": "item",
    "check": {
     "path": "gates.pass",
     "equals": true
    }
   },
   "output": {
    "format": "json",
    "maxBytes": 60000
   }
  },
  {
   "name": "a9-board",
   "brief": "Research, one reading of the public leaderboard ({{copy}}); no submission, no login, no account. Read https://www.paradigm.xyz/puzzles/amm, https://www.paradigm.xyz/puzzles/amm/about and the leaderboard chart page it links. If the table is drawn by script, find the data request the page makes and read that. Report every row you can read: rank, handle, strategy name, average edge, exactly as shown, with the time you fetched it (UTC). Report what the pages say about scoring: number of simulations, steps, parameter ranges, whether every entry is scored on the same seeds, when the board closes. The goal's brief (2026-11-09) had 1st 528.40, 10th 524.66 and this network's entry IB 522.00 at 20th; an unverified single fetch on 2026-11-10 showed 1st 528.42, eight entries from 528.10 to 528.42, 9th 526.78, 10th 525.38, and a 4th-place entry by @builtbyimd named TellMinLookup at 528.30. Confirm or correct each of those numbers. List any public write-up, repository or thread by a top-25 entrant that describes its method, with the URL and one sentence on the method; quote nothing you did not read. Every claim carries its URL.\nRESULT, one JSON object under 30,000 bytes: {item, status, fetched_at_utc, rows: [{rank, handle, strategy, edge}], rows_read, scoring: {simulations, steps, same_seeds_for_all: true|false|unstated, closes, sources: [url]}, brief_numbers_check: {first, tenth, ib_rank, ib_edge, builtbyimd_entry}, writeups: [{who, url, method}], could_not_read: [..], limitations}.",
   "items": [
    {
     "key": "board-1",
     "vars": {
      "copy": "copy 1"
     }
    }
   ],
   "output": {
    "format": "json",
    "maxBytes": 60000
   }
  },
  {
   "name": "a9-board-seeds",
   "brief": "Track A diagnostic: does the public board's score come from the engine's default seeds? IB scored 522.00 on the board. Run IB ALONE against VanillaStrategy on engine seeds {{from}}..{{to}} ({{count}} seeds), the seeds `amm-match run` uses by default (MatchRunner with n_simulations = 1000 builds configs for seeds 0..999). This is a diagnostic outside the fresh-seed ledger: nothing is tuned on it and it is never pooled with other blocks. No board entry.\nClone https://github.com/benedictbrady/amm-challenge at 6b6921f8d463314aa7c96234e1be25a25245f704; from the checkout: mkdir -p scratch && curl -LsSf https://raw.githubusercontent.com/gtmcknight/amm-sim/main/research/setup.sh -o scratch/setup.sh && sh scratch/setup.sh; prefix later commands with `. scratch/env.sh && `. If a step fails return blocked={step,error} with whatever else you finished. \nRunner: adapt canonical.py from runner.code_zb64 (base64/zlib/tar) of https://api.imdnotdead.fun/artifacts/37096a34a13345a470a4fbfdca0be064dba0c81da6c06afc47b5af3a725111da to the single arm ib. IB.sol is in the code_zb64 of https://api.imdnotdead.fun/artifacts/db67c7a0e8fa98f87b069766df6e213890861b15f967695293f519ecc46eeeb6 (sha256 301941829a44bb60977bb28181a5e4bfa6544f3696763f987054789b2611d686; assert it; solc 0.8.24, viaIR, optimizer 200, paris). Configs: take them from MatchRunner(n_simulations=1000, config=build_base_config(seed=None), n_workers=8, variance=BASELINE_VARIANCE)._build_configs() at indices {{from}}..{{to}}, and confirm they equal build_config with numpy default_rng(seed) draws (retail_mean_size, retail_arrival_rate, gbm_sigma) for the same seeds. amm_sim_rs.run_batch(IB, Vanilla, configs, 8); edge = edges['submission']. Commands of at most 64 seeds, none over 470 s, each seed once; a seed not run is listed as missing.\nRESULT, one JSON object under 40,000 bytes: {item, status, allocation {first, last, count}, ib {n, mean, sum, sumsq, rows [[seed, edge]]}, configs_equal_matchrunner: true|false, first_config, gas {afterSwap peak and mean, fault counters, calls_equal_ok}, validate, hashes {ib source and runtime sha256, wheel sha256}, missing: [..], limitations}. The two halves are pooled by the orchestrator: a pooled mean of 522.00 would mean the board is reproducible locally.",
   "items": [
    {
     "key": "bs-0",
     "vars": {
      "from": "0",
      "to": "499",
      "count": "500"
     }
    },
    {
     "key": "bs-500",
     "vars": {
      "from": "500",
      "to": "999",
      "count": "500"
     }
    }
   ],
   "output": {
    "format": "json",
    "maxBytes": 60000
   }
  }
 ],
 "read": [
  "b9-tell-gauss/tg-1",
  "b9-tell-gauss/tg-2",
  "b9-tell-latt/tl-1",
  "b9-kappa-flag/kap-0",
  "b9-kappa-flag/kap-3e5",
  "b9-kappa-flag/kap-1e4",
  "b9-float-forensics/ff-1",
  "a9-tell-wad/wad-1",
  "a9-tell-port/tp-1",
  "a9-tell-port/tp-2",
  "a9-tell-pilot/tp-1",
  "a9-tell-pilot/tp-2",
  "a9-board/board-1",
  "a9-board-seeds/bs-0",
  "a9-board-seeds/bs-500",
  "b8-rival-mass/mass8-1",
  "b8-ambiguity-bonus/ig8-2",
  "b8-fresh/fresh8-2"
 ],
 "cancel": [],
 "wake": {
  "batches": [
   "b9-tell-gauss",
   "b9-tell-latt",
   "b9-kappa-flag",
   "b9-float-forensics",
   "a9-tell-wad",
   "a9-tell-port",
   "a9-tell-pilot",
   "a9-board",
   "a9-board-seeds"
  ],
  "afterMinutes": 180
 },
 "finish": false
}