# top20-regimes: Paradigm AMM board vs NP2, run by run Board snapshot of 2026-11-07; the board is live. No simulation was run; every figure comes from the fetched files. Only the mechanism ideas are hypotheses. ## table d = submissionEdge(entry) - submissionEdge(NP2), per run. Retail and arb are mean Y per run on the entry's own AMM. Fees are mean step-end quotes in bps. b-a = mean of bid minus ask. | rank | id | board score | mean d | se | worst d | runs lost | retail | arb | bid | ask | b-a | |---|---|---|---|---|---|---|---|---|---|---|---| | 1 | `52df1e42-4219-4931-b014-586d91720298` | 528.399 | 9.570 | 0.063 | 3.59 | 0 | 77878.1 | 23665.2 | 35.350 | 35.481 | -0.131 | | 2 | `c38c9e1f-f458-4d13-963c-9294c3b91c62` | 528.362 | 9.532 | 0.063 | 3.44 | 0 | 77893.8 | 23709.3 | 35.361 | 35.383 | -0.022 | | 3 | `e9362d90-f6b7-4497-835c-dd538d030160` | 528.258 | 9.428 | 0.063 | 3.97 | 0 | 77912.3 | 23789.3 | 35.363 | 35.451 | -0.088 | | 4 | `4aad6b12-aa93-4593-98cc-642e0b9fd006` | 528.206 | 9.377 | 0.062 | 3.60 | 0 | 77494.0 | 23494.6 | 35.502 | 35.557 | -0.055 | | 5 | `88bbb4b5-6f95-45a4-8fd0-d1d8ba43ca52` | 528.099 | 9.270 | 0.062 | -5.73 | 1 | 78056.7 | 23717.1 | 35.219 | 35.272 | -0.053 | | 6 | `8cdc1896-049f-4ae0-8e54-022d4866e4a1` | 526.777 | 7.947 | 0.053 | 2.33 | 0 | 78341.5 | 23750.9 | 34.890 | 35.025 | -0.135 | | 7 | `4f22492b-9643-47d2-82a2-bddb09edaccc` | 525.377 | 6.548 | 0.056 | -0.79 | 1 | 78302.4 | 24416.7 | 35.560 | 35.579 | -0.020 | | 8 | `ff0c41ee-376c-4869-90e4-52b937a2fb61` | 524.899 | 6.070 | 0.051 | 0.14 | 0 | 78935.1 | 24822.8 | 34.468 | 35.039 | -0.571 | | 9 | `2c1b6306-9e54-4f26-9c03-8c2f009ee6db` | 524.810 | 5.981 | 0.052 | -4.97 | 3 | 78259.9 | 24328.7 | 35.325 | 35.553 | -0.229 | | 10 | `65573db6-d287-47b1-928a-bd65eaa4b7a9` | 524.658 | 5.829 | 0.049 | 1.42 | 0 | 77928.1 | 24488.8 | 35.192 | 35.398 | -0.207 | | 11 | `4aa20eb3-f72a-4908-b684-dbdf67717700` | 523.815 | 4.986 | 0.045 | -1.16 | 1 | 77836.0 | 24238.1 | 35.791 | 35.045 | +0.746 | | 12 | `3828a970-8124-4566-87c7-66f33fc36435` | 522.817 | 3.988 | 0.040 | -3.97 | 4 | 77376.7 | 24117.7 | 35.588 | 35.491 | +0.097 | | 13 | `4fce1f40-19bd-4778-8d99-ff67456c1a02` | 522.407 | 3.578 | 0.036 | -2.24 | 1 | 77087.6 | 23646.6 | 36.190 | 35.535 | +0.655 | | 14 | `c221b6dc-dfbf-41cf-97fd-dfe893e02aec` | 522.400 | 3.571 | 0.038 | -0.36 | 2 | 77136.4 | 24114.6 | 35.410 | 36.044 | -0.634 | | 15 | `35de50ab-b1e1-4d2e-b304-d7dec57cbaec` | 522.385 | 3.556 | 0.041 | -0.77 | 3 | 77138.9 | 24246.7 | 35.838 | 35.510 | +0.328 | | 16 | `8e8bbcb9-94e3-4c17-bac7-588d826c708f` | 522.258 | 3.429 | 0.049 | -2.43 | 7 | 77807.7 | 24978.5 | 34.879 | 35.043 | -0.164 | | 17 | `029e616b-4005-4b07-ad1f-bcc5bad09d83` | 522.234 | 3.405 | 0.041 | -2.78 | 3 | 77836.2 | 24572.3 | 35.181 | 35.282 | -0.101 | | 18 | `daeb2f71-8a69-46cc-a63c-35e4b75d2302` | 522.207 | 3.377 | 0.044 | -1.32 | 7 | 76995.6 | 23280.5 | 36.225 | 36.781 | -0.556 | | 19 | `c99f1bc3-d8a7-496a-a7f9-af2145111aa3` | 522.051 | 3.222 | 0.047 | -17.37 | 6 | 77997.5 | 25067.0 | 34.978 | 35.088 | -0.110 | | 20 | `a1731836-9dbc-4c10-8290-6631285030c6` | 521.978 | 3.149 | 0.047 | -3.54 | 11 | 79262.0 | 25782.7 | 34.279 | 33.708 | +0.571 | | 39 | `d5c8f6a9-febd-4cee-898e-3d81bc88038d` (NP2) | 518.829 | - | - | - | - | 76497.6 | 24049.1 | 36.259 | 35.236 | +1.023 | ## analysis **Data check.** All 22 files (top 20, NP2, TWO) have 1,000 runs, 1,000 distinct match ids and all 1,000 outcomes won, and each file's mean submissionEdge equals its board avgEdge. **Mismatch: baselineEdge sequences are not identical.** Every entry other than NP2 differs from NP2's sequence at 1,000 of 1,000 positions, by up to 31.92 (#20). Mean baselineEdge runs from 339.135 (#20) to 352.623 (TWO). The cause is structural: the baseline AMM shares retail flow with the entry. The runs still line up: against NP2, entries correlate at >=0.99766 on baselineEdge, >=0.99985 on submissionEdge and >=0.999978 on baselinePnl, so the paired d is valid. Terciles below use NP2's own sequence only. **What baselineEdge measures.** The challenge page does not define it; it only says scoring is over 1000 simulations. The simulator README says the strategy competes against a normalizer AMM at fixed 30 bps, and that AMM's edge is the baseline side of a match in `match.py`. The API field name is undocumented, so reading it as the normalizer's edge is an inference. It fits: mean(submissionEdge) - mean(baselineEdge) reproduces avgEdgeVsBaseline in all 22 files. **The brief's proxy label does not hold.** In these files baselineEdge tracks retail flow, not volatility. Within NP2, corr(baselineEdge, retail) = 0.992 against corr(baselineEdge, arb) = 0.843, and the baseline and retail cuts put 938 of 1,000 runs in the same tercile (baseline and arb: 677). The API gives no per-run sigma, so I added a fourth cut as the nearest flow-free stand-in: NP2 arb volume after regressing out NP2 retail (the volume-residual cut). It is not validated against sigma. **Terciles.** Sorted on NP2's value: T1 low (333 runs), T2 (334), T3 high (333). Cells: mean d +/- se / retail change / arb change, entry minus NP2. *Cut: NP2 baselineEdge* | entry | T1 | T2 | T3 | |---|---|---|---| | #1 | 8.10 +/- 0.08 / +137 / -1278 | 9.54 +/- 0.08 / +1310 / -428 | 11.07 +/- 0.10 / +2695 / +554 | | #2 | 8.05 +/- 0.08 / -214 / -1333 | 9.53 +/- 0.08 / +1249 / -398 | 11.01 +/- 0.10 / +3153 / +711 | | #3 | 8.00 +/- 0.08 / +83 / -1229 | 9.40 +/- 0.08 / +1255 / -355 | 10.88 +/- 0.10 / +2906 / +804 | | #10 | 4.96 +/- 0.07 / +91 / -330 | 5.84 +/- 0.07 / +1250 / +321 | 6.68 +/- 0.09 / +2951 / +1329 | | #20 | 2.63 +/- 0.07 / +1182 / +986 | 3.26 +/- 0.07 / +2622 / +1674 | 3.56 +/- 0.09 / +4490 / +2542 | *Cut: NP2 retailVolumeY* | entry | T1 | T2 | T3 | |---|---|---|---| | #1 | 8.13 +/- 0.08 / +110 / -1307 | 9.54 +/- 0.09 / +1311 / -421 | 11.04 +/- 0.10 / +2721 / +576 | | #2 | 8.09 +/- 0.08 / -230 / -1354 | 9.52 +/- 0.09 / +1250 / -392 | 10.99 +/- 0.10 / +3169 / +727 | | #3 | 8.03 +/- 0.08 / +97 / -1228 | 9.40 +/- 0.09 / +1263 / -345 | 10.85 +/- 0.10 / +2885 / +794 | | #10 | 5.00 +/- 0.07 / +103 / -317 | 5.85 +/- 0.07 / +1256 / +332 | 6.64 +/- 0.08 / +2933 / +1305 | | #20 | 2.67 +/- 0.07 / +1141 / +955 | 3.28 +/- 0.08 / +2620 / +1665 | 3.49 +/- 0.09 / +4534 / +2581 | *Cut: NP2 arbVolumeY* | entry | T1 | T2 | T3 | |---|---|---|---| | #1 | 8.35 +/- 0.08 / +419 / -1009 | 9.61 +/- 0.10 / +1400 / -368 | 10.75 +/- 0.10 / +2322 / +225 | | #2 | 8.28 +/- 0.08 / +85 / -1083 | 9.60 +/- 0.10 / +1389 / -341 | 10.72 +/- 0.10 / +2715 / +404 | | #3 | 8.23 +/- 0.08 / +348 / -961 | 9.47 +/- 0.10 / +1413 / -260 | 10.58 +/- 0.11 / +2484 / +442 | | #10 | 5.12 +/- 0.07 / +363 / -115 | 5.89 +/- 0.08 / +1412 / +431 | 6.48 +/- 0.09 / +2517 / +1003 | | #20 | 2.75 +/- 0.07 / +1423 / +1093 | 3.25 +/- 0.08 / +2723 / +1710 | 3.44 +/- 0.09 / +4147 / +2397 | *Cut: added: arb residual after retail* | entry | T1 | T2 | T3 | |---|---|---|---| | #1 | 9.53 +/- 0.11 / +1630 / -85 | 9.59 +/- 0.11 / +1296 / -455 | 9.59 +/- 0.11 / +1216 / -612 | | #2 | 9.47 +/- 0.11 / +1581 / -120 | 9.54 +/- 0.11 / +1294 / -408 | 9.58 +/- 0.11 / +1314 / -491 | | #3 | 9.38 +/- 0.11 / +1592 / -11 | 9.45 +/- 0.11 / +1330 / -329 | 9.45 +/- 0.11 / +1323 / -440 | | #10 | 5.78 +/- 0.08 / +1612 / +640 | 5.85 +/- 0.09 / +1334 / +379 | 5.85 +/- 0.08 / +1346 / +301 | | #20 | 3.16 +/- 0.08 / +2876 / +1780 | 3.19 +/- 0.08 / +2663 / +1694 | 3.09 +/- 0.09 / +2755 / +1727 | *NP2 and #1 step-end fees by baselineEdge tercile, bps (bid / ask / mid)* | entry | T1 | T2 | T3 | mid slope per 10k retail | |---|---|---|---|---| | NP2 | 34.18 / 33.24 / 33.71 | 36.27 / 35.22 / 35.74 | 38.33 / 37.25 / 37.79 | 1.755 | | #1 | 34.09 / 34.15 / 34.12 | 35.38 / 35.52 / 35.45 | 36.59 / 36.77 / 36.68 | 1.096 | | #10 | 34.05 / 34.11 / 34.08 | 35.31 / 35.53 / 35.42 | 36.22 / 36.55 / 36.38 | 1.013 | **Which regime carries the gap to 1st: none. It scales with flow.** #1's d rises from 8.10 (T1) to 11.07 (T3), a T3-T1 contrast of 2.96 +/- 0.13, and the shares of the gap are 28.2/33.3/38.5%. NP2's own edge is split 27.1/33.3/39.7%, so as a percentage of NP2's edge the gain is nearly flat: 1.92/1.85/1.79%. Regressed on NP2 retail, #1's d = -0.05 + 1.258 per 10k Y (r 0.624), which is about 1.26 bps of NP2's retail volume with no intercept. On the volume-residual cut #1's d is flat at 9.53/9.59/9.59 (T3-T1 0.065 +/- 0.156), so no flow-free arb regime carries it either. #2, #3, #10 and #20 show this shape too. **How #1 gains depends on the regime** (baselineEdge cut, change vs NP2): - T1: it gives less to arbs. Arb -1278.5 (-5.69%), retail +136.7 (+0.21%), ask +0.91 bps, bid -0.09 bps. - T2: both. Retail +1310.5 (+1.72%), arb -427.6 (-1.78%). - T3: it takes more retail and actually gives arbs more. Retail +2694.7 (+3.07%), arb +554.3 (+2.17%), bid -1.75 bps, ask -0.47 bps, normalizer edge -12.78. #2 and #3 match this, except that #2's T1 retail is slightly negative (-213.6). Across all runs #1 has retail +1380.5 and arb -383.9. Its edge plus baseline edge is 872.156 against NP2's 869.663, so of the +9.57 about 7.08 is taken from the normalizer and 2.49 is new. **The ladder has two separate rungs.** NP2 to #10 is retail: +1430.5 retail with arb +439.7, for d 5.829. #10 to #1 is arbs: retail -50.0, arb -823.6 (-3.4%) and mean mid fee only +0.121 bps, for +3.741 +/- 0.037. By tercile that second rung is +3.14/+3.70/+4.38 with arb -948.8/-748.3/-774.3 and retail +45.8/+60.5/-256.6. Across the top 20, mean d correlates with arb change at -0.525 and with retail change at only 0.197. #20 buys the most retail (+2764.4) but adds arb +1733.6, and its edge plus baseline falls 8.55; its d is 3.149. **Volume explains less than a third of the gap.** OLS across runs: d(#1) = 6.516 + 0.00187 dRetail - 0.00124 dArb, R2 0.43. At #1's mean volume changes that is about 2.58 from retail and 0.48 from arb, leaving the 6.52 intercept. Association only. Sorting runs by NP2's mid fee excess over #1's gives d of 8.41 (+/- 0.09) in the third where NP2's mid is 0.69 bps below #1's, and 10.82 (+/- 0.10) where it is 1.40 above. **NP2's fee shape stands out in two ways.** First, flow sensitivity: its mid rises 1.755 bps per 10k retail, against 0.951 to 1.096 for #1, #2, #3, #10 and #20, and its mid/retail correlation is 0.888 against #1's 0.676. Its mid range T1 to T3 is 33.71 to 37.79, against #1's 34.12 to 36.68. Second, a bid-over-ask bias: mean b-a is +1.023, the highest of any row in the table (top 20 range -0.634 to +0.746, top 5 -0.131 to -0.022), and the median is +0.81 against #1's -0.20, with bid above ask in 606 runs against #1's 475. The path response itself looks right: per-run b-a correlates 0.85 with #1's and has the same sd (3.39 vs 3.38). In the tail NP2's bid sticks: 90 runs have mean bid above 40 bps against #1's 39, and the maximum is 52.95 against 43.33. **Caveat on the fee fields.** Per `engine.rs` they are captured after each step's retail trades and averaged over steps, not over trades. So they are the quote the next step's arb sees; no field measures the fee retail paid. **The 10 runs where #1 beats NP2 by most and by least** (run = 0-based position; values are NP2's, then #1's changes). None lost: minimum d 3.59. Nine of the top 10 are baselineEdge T3 and one T2, with retail up in all 10 (mean +3330) and arb up in 9 (mean +623). Nine of the bottom 10 are T1 and one T3, with mean retail +85 and arb -1143. | set | run | d | baselineEdge | retail | arb | d retail | d arb | |---|---|---|---|---|---|---|---| | most | 476 | 18.41 | 408.96 | 81971 | 24549 | +3544 | +851 | | most | 272 | 18.28 | 448.02 | 90047 | 25192 | +4814 | +902 | | most | 131 | 15.55 | 443.29 | 90340 | 25823 | +4353 | +1755 | | most | 221 | 15.21 | 414.63 | 87964 | 25965 | +2412 | +168 | | most | 498 | 15.05 | 430.58 | 88441 | 25737 | +3233 | +386 | | most | 567 | 15.01 | 428.55 | 89493 | 25639 | +3361 | +853 | | most | 648 | 14.99 | 412.55 | 86153 | 26176 | +2686 | +546 | | most | 722 | 14.93 | 434.20 | 93057 | 24340 | +5178 | +1720 | | most | 996 | 14.92 | 406.17 | 85881 | 24861 | +2653 | +302 | | most | 808 | 14.83 | 325.09 | 69712 | 24353 | +1063 | -1257 | | least | 973 | 5.61 | 289.15 | 67158 | 22063 | +369 | -850 | | least | 943 | 5.58 | 260.62 | 60936 | 21376 | -349 | -1925 | | least | 817 | 5.39 | 315.00 | 71526 | 24027 | +449 | -945 | | least | 987 | 5.37 | 267.15 | 62923 | 21447 | +584 | -515 | | least | 549 | 5.37 | 239.99 | 59327 | 20298 | -459 | -1630 | | least | 852 | 5.30 | 245.70 | 61309 | 21557 | -11 | -1439 | | least | 581 | 5.03 | 400.06 | 83147 | 26319 | +1967 | +223 | | least | 675 | 4.58 | 244.01 | 59341 | 20125 | -1008 | -1545 | | least | 180 | 4.47 | 287.66 | 66039 | 23132 | +39 | -958 | | least | 148 | 3.59 | 305.80 | 67617 | 23239 | -730 | -1842 | Run 476, the largest d (18.41), is also NP2's largest b-a: 18.9 against #1's 3.3. Run 808 repeats this with d 14.83 and b-a 17.0 against 3.8. ## implications Hypotheses, none simulated; each needs a paired test vs NP2. Capitalised names are NP2 constants. Fee targets are step-end quotes. 1. **Flatten the flow response.** Pattern: mid slope 1.755 vs #1's 1.096 bps per 10k retail, T3 mid 37.79 vs 36.68, T3 retail +3.07%. Change the shape, not the constants: make the flow terms (LAMBDA_COEF, FLOW_SIZE_COEF, ACT_COEF) concave, or divide flow by its own slow EMA. Test: local step-end mid slope near 1.1, with T3 retail share up and T1 unchanged. 2. **Find and remove the bid-over-ask offset.** Pattern: mean b-a +1.023 vs -0.131, median +0.81 vs -0.20, 606 vs 475 runs, with per-run correlation 0.85, so the offset is the fault rather than the path response. These files cannot attribute it to a term, so zero skew, staleShift and tradeBoost in turn and see which moves mean b-a, or subtract a slow EMA of (bid - ask). Test: mean b-a near 0 with ask rising in low-flow runs, where #1's ask is +0.91 and arb -5.69%. 3. **Cap a stuck side.** Pattern: runs 476 and 808 (d 18.41 and 14.83, b-a 18.9 and 17.0 vs 3.3 and 3.8), and 90 vs 39 runs with mean bid above 40 bps. Limit |bid - ask| or pull a side back toward fMid after a set number of steps without a trade on that side. Test: runs with mean bid above 40 bps fall toward 39, with no paired loss in T1. 4. **Quote by position within the step.** Pattern: #10 to #1 cuts arb by 823.6 (-3.4%) with retail -50.0 and mean mid +0.121 bps, so mean fee level cannot be what buys it. In `engine.rs` the arb trades first and retail follows, so the quote after the first trade serves same-step retail, and the quote left at step end serves the next arb. NP2 uses one fee formula regardless of position (firstInStep affects only the pHat and sigmaHat updates). Branch on stepTradeCount: lower after the first trade, wider after later trades. Test: arb volume falls about 3% locally with retail flat. 5. **Improve per-trade quality before volume.** Pattern: the 6.52 OLS intercept out of 9.57, d 8.41 even where NP2's mid is below #1's, and #20's arb +1733.6 for retail +2764.4 with edge plus baseline -8.55. NP2 updates pHat as if every first-in-step trade were the arb. Classify it first: a confirmed arb moves pHat more fully through its fee-adjusted spot; a retail-only step does not. Accept a variant only if arb change per unit of retail change is below #20's 0.63. Test: pHat error against fair price in local runs falls, and d stays positive at flat volumes. ## fetch - Leaderboard: `GET https://www.paradigm.xyz/puzzles/api/v1/leaderboard?limit=100` returned 200 and 100 entries. - Per-run: `GET https://www.paradigm.xyz/puzzles/api/v1/submissions/` for the 20 top ids, NP2 and TWO. All 22 returned 200 with 1,000 runs each. - Ids that failed: none. No retries were needed. - User-Agent: `Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0 Safari/537.36` - Definitions: challenge page; simulator README, `engine.rs`, `match.py` at 6b6921f8; NP2's source from the goal's two api.imd.fun artifacts.