{
 "notes": "EPISODE 3: ROUND 2 DEVELOPMENT RE-SPAWNED (100 items). Items used after this: 125 of 600. Episodes 4..10 remain.\n\nEPISODE 2's r2-deepen, r2-fresh and r2-remove were refused (\"the merge brief asks for a command's verbatim output\"), so round 2's development never ran; only r2-measure-blocks and r2-diagnose did. Lesson: never ask a worker or a merge for what a command printed; ask for fields of the result JSON only. The same lanes are spawned now under new names. T2 and H2 were never exposed.\n\nBEST (starting incumbent, not a promotion): combine-cash B, code SHA-256 baef955ec10728839f7c3357016ec9eb0550e7ec689bbd5171b1cdd5c9e37273, 14588 bytes, `code` field of https://api.imd.fun/artifacts/ecbc9087b4f238fc1b5b0d52f55af073f676c038bfb6756172b1e51480ac1741 (re-verified). PROMOTIONS: none. F = 900000..903999 run by nobody. Streak of completed rounds without promotion: 0 (rounds 1+2 are one round; it completes with its finalist decision).\nFACT: a result file is served at https://api.imd.fun/artifacts/<SHA-256 of the result file>; each task lists its inputs' SHA-256, so a candidate is handed on as \"`code` field of the JSON at that URL, SHA-256 = code_sha256\" (verified for both pilots this episode).\n\nSCOREBOARD, paired, candidate minus B:\n- stock-entry-gate, code a709c7e85c7dc5200cba83d854cc7ecc9cee8a70915ca79798504da648e9ebed, result https://api.imd.fun/artifacts/212361fa9b3fba7425c5a32b661c5ae2a9604c7f515cce4195912f642dd438c3 (q1 bank condition `ptick < P['g1'] + 1.0` -> `cb <= 1`): T1 n=2000 +0.059 se 0.164; H1 200000..201999 n=2000 +0.341 se 0.232 (retail -0.378, arb +0.719), 0 failures. Plane flagged its sources; r2-confirm replicates it on 250000..253999.\n- side-jump-budget, code 3b7236c98d52efed9617e4cf6d8183012c98b8b61b18eb59b5afae937c99c724, result https://api.imd.fun/artifacts/5a936ac2b2047b10b73dd9c0c92702e8b9bc5c76e508188e1b16d3c0e854a227 (per-side jump charge at main sizing): T1 +0.634 se 0.559; H1 n=2000 +0.312 se 0.432 (retail -1.702, arb +2.014). Replicated on 254000..257999; multiplier searched by r2-deepen-b/jump-charge-scale.\n- reserve-release d44dc5cc...: H1 -0.089 se 0.017. Dead. remove-premium-cover 4eb683ab...: H1 -0.903 se 0.177. Dead.\n- flow-cover 3df87ccd...: pooled 220000..223999 N=4000 +0.0016 se 0.0034 (differs from B on 83 of 4000 seeds). Dead.\n- simplify bd69d748...: pooled 224000..225499 N=1500 -1.902 se 0.523 (retail -4.8, arb +2.9); blind-reference H1 -1.284 se 0.633; pairing-audit -2.265 se 0.561. Dead as a whole.\nB's means: T1 93.893; H1 99.534 (retail 129.106, arb -29.572). No candidate clears 2 se; F is not spent this episode. stock-entry-gate at +0.34 needs se about 0.17, which H1 plus the 4000 confirm seeds give: episode 4 decides.\n\nDIAGNOSTICS (B on 1000-seed blocks 230000..242999):\n- Oracles: next-step probability +16.5 se 2.9 (arb +17.6) on 500 seeds; last-step probability +5.6 se 1.1 (retail +3.2, arb +2.5); exact jump parameters -1.2 se 1.2; exact retail parameters +1.06 se 0.56. The lever is predicting the next move and not resting through it.\n- Arb loss by class (of -25.1): main ask -11.3, main bid -7.4, tick-1 bank -4.2 (retail +0.09 only), premium cover -0.76, probes -0.46.\n- Jump steps carry half of arb loss (moves over 3 ticks 10.7/sim on 0.12% of steps); sub-tick diffusion 10.3/sim; bid exposure on jump steps five times ask exposure.\n- Spread 1 edge 39.5 (arb -21) vs spread 4 170.6. Steps 1800-1999 at 5-80c net -1.57. Below 5c: retail 85.7, arb -11.5.\n- phat MAE 0.30 tick; a one-tick competitor retreat is a crossing 98.4% of the time and B ignores it. Collateral relaxations +0.85 local, mostly infeasible (reserve +0.26, uncovered +0.19). Spread-1 mid-range p: B takes 0.2% of retail notional, competitor earns 9.1/sim; spread 2: 21.5%, 8.1/sim. Paired se 0.56 vs unpaired 6.6 per 1000 seeds. Submission audit: no failures.\n\nSEED LEDGER (never reuse a holdout for tuning): T1 100000..101999, H1 200000..201999 (exposed; fresh items use 200000..200999 as holdout against the B fixture). Round 2: T2 110000..110499, H2 210000..210999; fresh T 115000..115499. Used: 220000..225999, 230000..242999, confirm 250000..257999. Free: confirm blocks from 258000; T3 120000..120999, H3 260000..260999; T4 130000.., H4 270000..; T5 140000.., H5 280000... F only in finalist measure batches.\nB fixture (code-free per-seed total_edge, T1 and H1): https://api.imd.fun/artifacts/04e37cd4e1a420b91cd7a012f416e6ebf1002c5c56867981741a3a77c72b9c48.\n\nROUND 2 BATCHES (all against B; one idea per item, named in vars; keys in the merges' rows):\n- r2-deepen-b (46, groupSize 12, merges 01..04): one change to B, up to 4 variants on T2, frozen, H2 (sum_d, sum_d2 reported). Lanes: arbitrage loss (jump charges, spread-1 kA, endgame shrink, fill pullback, jump reset, two-tier ask, tail nodes), probability (retreat soft cut, competitor-mid likelihood, grid, probes), retail capture (join-spread1, mid-size-floor, retail-flow-online), stock and cash (reserve, xu, fu, bank gate and size), constant searches, and gate-plus-jump = both pilots combined.\n- r2-fresh-b (30, groupSize 10, merges 01..03): blind; S1 = own baseline S0 + one mechanism; mechanism_diff (S1-S0) and reference_diff (S1-B fixture). Rank by mechanism_diff; graft the best into B in round 3. 10 estimation, 8 quoting regimes, 7 decision rules, 5 engine audits (keys f-...).\n- r2-remove-b (16, groupSize 8, merges 01..02): one deletion each on H2, no retuning (keys remove-...).\n- r2-confirm (8, item by item): seg-a..d = stock-entry-gate on 250000..253999, sjb-a..d = side-jump-budget on 254000..257999. Pool: mean = sum(sum_d)/N; se = sqrt((sum(sum_d2) - N*mean^2)/(N-1))/sqrt(N).\nCanaries: if a batch pauses, mend the brief and rerun with itemsFrom under a new name, or resume if the failures were not the brief's.\n\nNEXT EPISODE (4), in order:\n1. Scoreboard from the merges' rows: key, code_sha256, h_n, h_diff, h_se, flag. Drop rows with n < 500, a flag, a missing hash, or an h_incumbent_mean unequal to the other full-H2 rows'. Pool r2-confirm per candidate; combine with H1 by sum_d/sum_d2 when both are complete.\n2. Finalists: at most 3 frozen candidates, largest paired gain first, preferring gain > 2 se; the best of about 60 on 1000 seeds is inflated by selection (about +1), so F decides. If none clears 2 se, still send the best one or two with gain > se.\n3. Spawn r2-final: each finalist 4 items on 900000..900999, 901000..901999, 902000..902999, 903000..903999 (the r2-confirm brief with the candidate's URL and hash). Also r2-confirm-2: ranks 4 to 10 on blocks from 258000 (2 x 1000 each), never on F. Ask in `read` for every item of both.\n4. Episode 5: promote the finalist with the largest pooled F gain if gain > 2 se with N = 4000, all blocks complete, 0 failures, hashes as frozen. Record the promotion row: round, key, code hash, artifact URL, F gain, se, retail and arb differences, B's F mean. Then spawn round 3 (at least 100 items, about 40/30/15/15) against the new best: combine lane = grafts of confirmed deepen gains and of the best fresh mechanisms (each pair once); deepen what diagnostics and the remove lane point at; remove = deletions found neutral, jointly; measure = block replications. If nothing is promoted the streak becomes 1 and round 3 runs from B.\n5. Rhythm: 4 finalists, 5 promote + round 3, 6 finalists, 7 promote + round 4, 8 finalists, 9 promote + write-up prep, 10 finishes. Nothing spawned in episode 10 can be read. Stop early after two completed rounds in a row without promotion. Budget: rounds 3 and 4 at about 110 each plus 2 x 26 finalist/confirm items fit in 600.\n\nLIMITS FOR THE WRITE-UP: F is reused across rounds and by up to 3 finalists a round, so its 2-se gate is weaker than on untouched seeds; H2 is common to all round-2 items, so its ranking is selected; local paired gains are not a leaderboard result; --sandbox was not run. The best's full code must be in a result handed to the last episode (a merge's `top` carries full code): ask in `read` for it.",
 "spawn": [
  {
   "name": "r2-deepen-b",
   "brief": "One item builds ONE frozen candidate: B with exactly one change, and measures it paired against B. Idea ({{key}}): {{idea}}. Change: {{change}} Change nothing else in B.\nB, the current best: the `code` field of the JSON at https://api.imd.fun/artifacts/ecbc9087b4f238fc1b5b0d52f55af073f676c038bfb6756172b1e51480ac1741 ; the SHA-256 of its UTF-8 bytes must be baef955ec10728839f7c3357016ec9eb0550e7ec689bbd5171b1cdd5c9e37273.\nSimulator: https://github.com/danrobinson/prediction-market-challenge at commit b244530ee2a6247b5f930830eeca9dd950da0e7e, unmodified, default ChallengeConfig() and ParameterVariance(), 2000 steps; load_strategy_factory(path) and run_batch(factory, base_config=ChallengeConfig(), variance=ParameterVariance(), n_simulations=1, seed_start=seed, workers=1) per seed, in process, without --workers and without --sandbox (several OS processes on disjoint seed ranges are fine). A simulation costs 0.3 to 1.3 s: time 20 seeds first and size the work to finish in your time; a seed set you cannot finish is reported as unfinished with the seeds you did finish, never as the measurement.\nTune on T = seeds 110000..110499 only: at most 4 variants of the change (constants or forms), each paired against B on all of T; keep the variant with the largest T mean_diff and freeze it. Then run the frozen candidate and B on H = seeds 210000..210999 (all 1000; if timing forces fewer, 210000..210499 and say so). No other seeds, and never 900000..903999. Never revise the candidate after seeing H; H is reported as it came out.\nPaired difference d_i = candidate total_edge minus B total_edge on seed i, likewise for retail_edge and arb_edge; mean_diff = mean of d; se = sample standard deviation of d divided by sqrt(n); sum_d and sum_d2 are the sums of d and of d squared. Keep every seed; a simulation that raises is a failure listed with its seed, never a dropped seed.\nResult: one JSON object with approach (the idea in one paragraph), tried (each variant: its constants, T n, T mean_diff, T se), next (what to try after this), code (the frozen candidate's full source, ready to submit), code_sha256 (SHA-256 of that exact UTF-8 text), incumbent_code_sha256, tuning_score {seeds, n, mean_diff, se}, paired {seeds, n, complete, mean_diff, se, sum_d, sum_d2, candidate_mean, incumbent_mean, retail_diff, retail_se, arb_diff, arb_se, failures}, seconds_per_simulation.",
   "items": [
    {
     "key": "gate-plus-jump",
     "vars": {
      "key": "gate-plus-jump",
      "idea": "combine the two pilot candidates that each cut arbitrage loss, the tick-1 bank gate and the per-side jump charge",
      "change": "Start from side-jump-budget, the `code` of the JSON at https://api.imd.fun/artifacts/5a936ac2b2047b10b73dd9c0c92702e8b9bc5c76e508188e1b16d3c0e854a227 (code SHA-256 3b7236c98d52efed9617e4cf6d8183012c98b8b61b18eb59b5afae937c99c724; B plus a per-side jump charge at the main bid and ask sizing), and add the stock-entry-gate edit: in the q1 condition replace `ptick < P['g1'] + 1.0` with `cb <= 1`. Variants: the jump charge's multiplier 0.5 and 1.0."
     }
    },
    {
     "key": "jump-charge-scale",
     "vars": {
      "key": "jump-charge-scale",
      "idea": "the per-side jump charge of pilot side-jump-budget gave arb +2.0 for retail -1.7 at multiplier 1.0; find the multiplier that nets most",
      "change": "Start from side-jump-budget, the `code` of the JSON at https://api.imd.fun/artifacts/5a936ac2b2047b10b73dd9c0c92702e8b9bc5c76e508188e1b16d3c0e854a227 (SHA-256 3b7236c98d52efed9617e4cf6d8183012c98b8b61b18eb59b5afae937c99c724), not from B. Vary only its extra_jump_charge_multiplier over 0.35, 0.6, 1.5, 2.0."
     }
    },
    {
     "key": "bid-only-jump-charge",
     "vars": {
      "key": "bid-only-jump-charge",
      "idea": "jump losses fall mostly on bids (bid exposure on jump steps is five times ask exposure); charge the jump tail on bids only",
      "change": "In AB(), multiply the bid's jump term `lj * ja` by a constant cjb when called from qbid (asks unchanged). Variants cjb 1.5, 2.0, 3.0."
     }
    },
    {
     "key": "spread1-ka",
     "vars": {
      "key": "spread1-ka",
      "idea": "spread-1 markets carry the largest arbitrage share of retail edge; raise the arbitrage-loss multiplier there",
      "change": "kA = P['kA'] * c1 when self.s == 1, else unchanged; kL unchanged. Variants c1 1.3, 1.6, 2.0, 2.5."
     }
    },
    {
     "key": "endgame-halve",
     "vars": {
      "key": "endgame-halve",
      "idea": "late steps with a mid-range belief lose net edge (steps 1800-1999, 5 to 80 cents: -1.57 per simulation); shrink main quotes there",
      "change": "Multiply qb and qa by c when H <= Hw and 0.05 <= phat <= 0.80; probes, ammo and q1 untouched. Variants (c, Hw): (0.5, 200), (0.3, 200), (0.7, 200), (0.5, 100)."
     }
    },
    {
     "key": "subtick-loss-split",
     "vars": {
      "key": "subtick-loss-split",
      "idea": "sub-tick diffusion steps carry 10.3 of arbitrage loss per simulation; weight the Gaussian loss term separately from the jump term",
      "change": "In AB() return ((1 - lj) * a * kG + lj * ja, (1 - lj) * b * kG + lj * jb) with a new constant kG; qsize's kA still applies to the whole. Variants kG 1.2, 1.5, 2.0, 0.8."
     }
    },
    {
     "key": "retreat-soft-cut",
     "vars": {
      "key": "retreat-soft-cut",
      "idea": "a one-tick retreat of the competitor's best quote is evidence p crossed it (only 1.6% of retreats are not), which B ignores",
      "change": "In the jumpinfo block also handle ca == self.pca + 1 and cb == self.pcb - 1: multiply the belief weights ws of cells below ca - 1 (or above cb + 1) by w after the predict step, then renormalise; do not cut lo/hi. Variants w 0.016, 0.05, 0.15."
     }
    },
    {
     "key": "bank-spread-gate",
     "vars": {
      "key": "bank-spread-gate",
      "idea": "the tick-1 bank costs 4.2 of arbitrage loss per simulation; allow it only when the competitor spread leaves room",
      "change": "Add `and self.s > 1` to the q1 condition `if P['ydf1'] > 0 and P['m1'] < ptick < P['g1'] + 1.0 and amt != 1`. Variants: self.s > 1; self.s > 2."
     }
    },
    {
     "key": "bank-size",
     "vars": {
      "key": "bank-size",
      "idea": "the tick-1 bank's size is a guess; find the ydf1 that nets most",
      "change": "Vary only P['ydf1'] (the q1 bank's quantity scale) over 0.3, 0.45, 0.9, 1.2."
     }
    },
    {
     "key": "ask-two-tier",
     "vars": {
      "key": "ask-two-tier",
      "idea": "the main ask carries 45% of arbitrage loss; split it across two ticks so a stale quote loses less",
      "change": "Place fraction f of qa at ask_t and the rest at ask_t + 1 when ask_t + 1 < ca (else all at ask_t); manage() keeps orders at both ticks. Variants f 0.5, 0.7."
     }
    },
    {
     "key": "fill-pullback",
     "vars": {
      "key": "fill-pullback",
      "idea": "a main order that vanishes whole in one step was taken by the arbitrageur, so p crossed it; shrink that side's next quotes briefly",
      "change": "Track main order ids per side; when one is gone from own_orders without a cancel, multiply that side's qb or qa by c for the next k steps. Variants (c, k): (0.5, 3), (0.3, 3), (0.5, 8), (0.0, 1)."
     }
    },
    {
     "key": "competitor-mid-likelihood",
     "vars": {
      "key": "competitor-mid-likelihood",
      "idea": "the competitor's quotes sit around p; use their midpoint as a soft likelihood on the belief grid instead of only hard bounds",
      "change": "After the predict step multiply each cell weight by exp(-0.5 * ((c - (cb + ca) / 2) / sdm) ** 2) and renormalise, with sdm in ticks. Variants sdm 0.5, 1.0, 2.0, 4.0 (first check in the simulator how the competitor sets its quotes)."
     }
    },
    {
     "key": "probe-ladder-width",
     "vars": {
      "key": "probe-ladder-width",
      "idea": "probes cost 0.46 per simulation and locate p; find the ladder width that nets most",
      "change": "Vary the probe ladder: rmin 1, 3, 4 (P['rmin']) and the 2.0 in `math.ceil(2.0 * s * 100)` as 1.5 and 3.0, four variants in all."
     }
    },
    {
     "key": "belief-grid",
     "vars": {
      "key": "belief-grid",
      "idea": "the sub-tick belief grid is coarse (8 bins a tick) with a fixed uniform floor; refine it",
      "change": "Vary P['bins'] 12, 16 and P['uni'] 0.003, 0.03 (four variants, one change each)."
     }
    },
    {
     "key": "phat-clamp",
     "vars": {
      "key": "phat-clamp",
      "idea": "phat is clamped to [0.002, 0.998] and floored at pfl below tick 1; the oracle used a tighter clamp",
      "change": "Variants: clamp [0.001, 0.999]; clamp [0.0005, 0.9995]; pfl 0.0002; pfl 0.001."
     }
    },
    {
     "key": "below-tick-decay",
     "vars": {
      "key": "below-tick-decay",
      "idea": "below tick 1 nothing can probe p and B decays the estimate by a fixed rule; tune the decay",
      "change": "Vary P['zd'] 0.5, 1.5, 2.0 and the 0.02 factor in the decay as 0.03."
     }
    },
    {
     "key": "join-spread1",
     "vars": {
      "key": "join-spread1",
      "idea": "in spread-1 markets with 0.2 < p < 0.8 B takes 0.2% of retail notional while the competitor earns 9.1 per simulation; join its queue",
      "change": "When ca - cb <= 1 and 0.2 <= phat <= 0.8, set bid_t = cb and ask_t = ca (join the competitor's tick, behind it) and size them with qbid(cb) and qask(ca). Variants: that; and only when H > 200."
     }
    },
    {
     "key": "mid-size-floor",
     "vars": {
      "key": "mid-size-floor",
      "idea": "in spread-2 markets with mid-range p B's retail share is 21%; a minimum main quote size may capture more than it loses",
      "change": "When 0.2 <= phat <= 0.8 and self.s >= 2 raise qb and qa to at least qmin shares (collateral and cash checks unchanged). Variants qmin 20, 50, 100."
     }
    },
    {
     "key": "retail-flow-online",
     "vars": {
      "key": "retail-flow-online",
      "idea": "knowing retail arrival and notional is worth +1.06; estimate them online from fills on own quotes",
      "change": "Track retail fill notional on own main orders over the last Wn steps (a partial decrease of remaining_quantity); scale rho by observed/expected clamped to [0.5, 1.5]. Variants Wn 200, 400, 800."
     }
    },
    {
     "key": "reserve-low-p",
     "vars": {
      "key": "reserve-low-p",
      "idea": "the cash reserve binds when p is below one cent and the local relaxation showed +0.22; halve the reserve there",
      "change": "C['reserve'] = R when phat < 0.01 else 200. Variants R 100, 50, 150."
     }
    },
    {
     "key": "xu-low-p",
     "vars": {
      "key": "xu-low-p",
      "idea": "the uncovered-ask price floor xu binds at 5 to 10 cents (+0.19 local); lower it there",
      "change": "P['xu'] = x when 0.05 <= phat < 0.10 else 0.1. Variants x 0.05, 0.03, 0.07."
     }
    },
    {
     "key": "fu-search",
     "vars": {
      "key": "fu-search",
      "idea": "the uncovered-ask cash fraction fu caps asks; find the fu that nets most",
      "change": "Vary P['fu'] 0.15, 0.35, 0.5, 0.6."
     }
    },
    {
     "key": "release-window",
     "vars": {
      "key": "release-window",
      "idea": "the reserve is released over the last 50 steps; tune the release window",
      "change": "Vary C['release'] 25, 100, 200, 400."
     }
    },
    {
     "key": "maxpay-search",
     "vars": {
      "key": "maxpay-search",
      "idea": "the premium cover purchase pays up to 2 cents over p and costs 0.76 directly but 0.90 when removed; tune what it pays",
      "change": "Vary P['ammo_maxpay'] 0.01, 0.03, 0.04, 0.015."
     }
    },
    {
     "key": "rest-below-gap",
     "vars": {
      "key": "rest-below-gap",
      "idea": "the rest-just-under-p purchase triggers within g_lo of a tick; tune the gap",
      "change": "Vary P['g_lo'] 0.1, 0.25, 0.35, 0.05."
     }
    },
    {
     "key": "jump-constants",
     "vars": {
      "key": "jump-constants",
      "idea": "B's jump constants are guesses (exact per-simulation values did not help, fixed ones may be off); search them",
      "change": "Vary (P['lam_j'], P['sig_j']): (0.0019, 0.5), (0.0025, 0.35), (0.0012, 0.35), (0.0019, 0.25)."
     }
    },
    {
     "key": "sig-diffusion",
     "vars": {
      "key": "sig-diffusion",
      "idea": "B's diffusion constant sig sets the one-step sd; search it",
      "change": "Vary P['sig'] 0.015, 0.025, 0.03, 0.012."
     }
    },
    {
     "key": "ka-search",
     "vars": {
      "key": "ka-search",
      "idea": "the arbitrage-loss multiplier kA sets every main size; search it",
      "change": "Vary P['kA'] 0.5, 0.9, 1.1, 1.4 (kL unchanged)."
     }
    },
    {
     "key": "kl-search",
     "vars": {
      "key": "kl-search",
      "idea": "the low-price regime uses kL below pL; search both",
      "change": "Variants: kL 0.1; kL 0.25; pL 0.03; pL 0.08."
     }
    },
    {
     "key": "horizon-size",
     "vars": {
      "key": "horizon-size",
      "idea": "size should fall as the horizon shortens since fewer retail orders can still arrive; add a horizon factor",
      "change": "Multiply qb and qa by min(1, (H / Hs) ** g). Variants (Hs, g): (300, 0.5), (300, 1.0), (600, 0.5)."
     }
    },
    {
     "key": "jump-reset",
     "vars": {
      "key": "jump-reset",
      "idea": "after a move of 3 or more ticks (half of all arbitrage loss comes from jump steps) the belief is stale; reset and quote small",
      "change": "When lo or hi moves by 3 or more ticks in one step, set the belief uniform over [lo, hi] and multiply qb and qa by c for k steps. Variants (c, k): (0.5, 2), (0.5, 5), (0.25, 3)."
     }
    },
    {
     "key": "mid-high-shrink",
     "vars": {
      "key": "mid-high-shrink",
      "idea": "edge is lowest at 50 to 80 cents (net about zero with arbitrage -1.8); shrink main quotes there",
      "change": "Multiply qb and qa by c when 0.5 <= phat <= 0.8. Variants c 0.5, 0.7, 0.3."
     }
    },
    {
     "key": "low-p-ask-boost",
     "vars": {
      "key": "low-p-ask-boost",
      "idea": "below 5 cents the ask earns 85.7 of retail edge per simulation; raise the ask cap there",
      "change": "When phat < 0.05 and self.s >= 3 multiply qa's cap (C['askcap'] and P['qmax'] in qask) by c. Variants c 1.5, 2.0, 3.0."
     }
    },
    {
     "key": "no-uncovered-late",
     "vars": {
      "key": "no-uncovered-late",
      "idea": "uncovered asks late in the game lock cash the reserve rule then fights; forbid them in the last steps",
      "change": "Set ub = 0 (no uncovered ask quantity) when H < Hn. Variants Hn 50, 100, 200."
     }
    },
    {
     "key": "sticky-ahead",
     "vars": {
      "key": "sticky-ahead",
      "idea": "the sticky queue keeps a quote at the competitor's tick when enough of it is ahead; tune min_ahead",
      "change": "Vary P['min_ahead'] 1.0, 5.0, 10.0, 20.0."
     }
    },
    {
     "key": "keep-band",
     "vars": {
      "key": "keep-band",
      "idea": "orders are kept while between keep_lo and keep_hi of the wanted size; tune the band",
      "change": "Vary (P['keep_hi'], P['keep_lo']): (1.2, 0.8), (2.0, 0.5), (1.5, 0.9), (3.0, 0.7)."
     }
    },
    {
     "key": "ammo-target",
     "vars": {
      "key": "ammo-target",
      "idea": "the YES stock target ydem*min(H, W) sets how much low-ask cover is held; tune it",
      "change": "Variants: ydem 0.3; ydem 0.6; W 100; W 25."
     }
    },
    {
     "key": "qmax-search",
     "vars": {
      "key": "qmax-search",
      "idea": "the hard size cap qmax may bind on wide-spread markets; search it",
      "change": "Vary P['qmax'] 2000, 4000, 6000, 1500."
     }
    },
    {
     "key": "probe-size",
     "vars": {
      "key": "probe-size",
      "idea": "probe quantity 0.01 is also the threshold that tells probes from main orders; tune it consistently",
      "change": "Vary PROBE 0.005, 0.02, 0.05 (every use of PROBE moves with it)."
     }
    },
    {
     "key": "bid-dmin",
     "vars": {
      "key": "bid-dmin",
      "idea": "a main bid within a fraction of a tick of phat is the most exposed; require a minimum distance for bids only",
      "change": "In qbid return 0 when phat * 100 - t < dmb (asks keep dmin 0). Variants dmb 0.3, 0.5, 1.0."
     }
    },
    {
     "key": "ask-dmin",
     "vars": {
      "key": "ask-dmin",
      "idea": "a main ask within a fraction of a tick of phat is the most exposed; require a minimum distance for asks only",
      "change": "In qask return 0 when t - phat * 100 < dma (bids keep dmin 0). Variants dma 0.3, 0.5, 1.0."
     }
    },
    {
     "key": "belief-var-weight",
     "vars": {
      "key": "belief-var-weight",
      "idea": "the belief variance var_t enters the loss sd s; weight it",
      "change": "s = sqrt(sp * sp + kv * var_t / 1e4 + 1e-8). Variants kv 0.5, 2.0, 4.0, 0.0."
     }
    },
    {
     "key": "jump-nodes-tail",
     "vars": {
      "key": "jump-nodes-tail",
      "idea": "the six-node jump distribution has no tail beyond 2.2 sigma, yet moves over 3 ticks cause 40% of arbitrage loss; add tail nodes",
      "change": "Replace NODES with a seven- or eight-node set adding +-3.5 sigma nodes of weight wt (reweighting the rest to sum 1). Variants wt 0.01, 0.02, 0.04."
     }
    },
    {
     "key": "final-steps-rule",
     "vars": {
      "key": "final-steps-rule",
      "idea": "the exact final-step payoff rule applies only at H == 1; extend it to the last few steps",
      "change": "Use the H == 1 AB override when H <= Hf. Variants Hf 2, 3, 5."
     }
    },
    {
     "key": "scarcity-search",
     "vars": {
      "key": "scarcity-search",
      "idea": "the ask scarcity charge below 10 cents is 0.0025 per share; search it and its threshold",
      "change": "Variants: C['scar'] 0.001; 0.005; 0.01; C['scar_p'] 0.05."
     }
    },
    {
     "key": "jump-horizon",
     "vars": {
      "key": "jump-horizon",
      "idea": "the jump nodes jp are spread with the sd of the whole remaining horizon (sd1), though a quote rests only a few steps; shorten that horizon",
      "change": "In sd1 = sqrt(max(1.0, H - 1.0) * var) replace H - 1.0 by min(H - 1.0, Hj). Variants Hj 20, 50, 200, 500."
     }
    }
   ],
   "output": {
    "format": "json",
    "maxBytes": 64000
   },
   "merge": {
    "groupSize": 12,
    "brief": "Merge the items into one JSON object. rows: one per item, every field copied from the item's result as written: key, idea (approach cut to 200 characters), code_sha256, t_n, t_diff, t_se, h_seeds, h_n, h_complete, h_diff, h_se, h_sum_d, h_sum_d2, h_incumbent_mean, h_retail_diff, h_arb_diff, failures, next (cut to 300 characters), flag (null, or why the row is unusable: n under 500, no code_sha256, failures, or an h_incumbent_mean unequal to the other full-H rows'). Rank rows by h_diff descending. top: the two unflagged rows with the largest h_diff, each with its full code and code_sha256. notes: what the group learned about which ideas moved retail and arbitrage edge, at most 1500 characters. Compute nothing beyond the ranking and the flags."
   }
  },
  {
   "name": "r2-fresh-b",
   "brief": "One item builds ONE mechanism from scratch for a passive limit-order strategy on Paradigm's prediction-market challenge, blind. Mechanism ({{key}}): {{mech}} Read only the simulator, its README and rules: https://github.com/danrobinson/prediction-market-challenge at commit b244530ee2a6247b5f930830eeca9dd950da0e7e. Do not look for, read or reuse any other strategy for this challenge, leaderboard entry or earlier result of this network: the point is a mechanism nobody here has.\nBuild S0, a simple baseline of your own under 150 lines (quotes around your probability estimate, sized by expected retail flow against adverse selection), and S1 = S0 plus the mechanism, the only difference. Tune both on seeds 115000..115499 only, at most 4 variants each, then freeze. Run S0 and S1 on seeds 200000..200999 (all 1000; if timing forces fewer, 200000..200499 and say so). No other seeds, never 900000..903999.\nReference: the JSON at https://api.imd.fun/artifacts/04e37cd4e1a420b91cd7a012f416e6ebf1002c5c56867981741a3a77c72b9c48 holds under fixture.H the per-seed total_edge of this network's current best strategy B on seeds 200000..201999, encoded as fixture.H.decoding says (base64, zlib, little-endian float64, check fixture.H.scores_sha256); value i is seed 200000+i. Use it as numbers only; it contains no strategy.\nRun the simulator unmodified: default ChallengeConfig() and ParameterVariance(), 2000 steps, run_batch(factory, base_config=ChallengeConfig(), variance=ParameterVariance(), n_simulations=1, seed_start=seed, workers=1) per seed, no --workers, no --sandbox (several OS processes on disjoint seed ranges are fine). A simulation costs 0.3 to 1.3 s: time 20 seeds first and size the work to finish; an unfinished seed set is reported as unfinished, never as the measurement.\nPer seed: mechanism d_i = S1 total_edge minus S0 total_edge (also retail_edge and arb_edge), reference r_i = S1 total_edge minus B's reference value; se = sample sd / sqrt(n). Keep every seed; a raising simulation is a failure with its seed.\nResult: one JSON object with approach, tried (variants with their tuning scores), next, code (S1 full source, ready to submit), code_sha256 (SHA-256 of that exact UTF-8 text), code_s0 (S0 full source), tuning_score {seeds, n, s1_mean, s0_mean}, paired {seeds, n, complete, mechanism_diff, mechanism_se, mechanism_retail_diff, mechanism_arb_diff, reference_diff, reference_se, s1_mean, s0_mean, b_mean, failures}, graft (how to add the mechanism to another strategy, at most 400 characters), seconds_per_simulation.",
   "items": [
    {
     "key": "f-particle-filter",
     "vars": {
      "key": "f-particle-filter",
      "mech": "a particle or grid filter over the latent score that models the exact process (diffusion plus compound-Poisson jumps) and updates on every observable (competitor quotes, own fills, orders the arbitrageur removed)."
     }
    },
    {
     "key": "f-jump-param-online",
     "vars": {
      "key": "f-jump-param-online",
      "mech": "causal online inference of the jump intensity and jump size from observed moves, feeding a per-simulation adverse-selection estimate."
     }
    },
    {
     "key": "f-competitor-replay",
     "vars": {
      "key": "f-competitor-replay",
      "mech": "reconstruction of the competitor's quoting rule from the history of its quote replacements, used to read the true price off its quotes more finely than a tick."
     }
    },
    {
     "key": "f-censored-nofill",
     "vars": {
      "key": "f-censored-nofill",
      "mech": "a censored-observation likelihood: each step without a fill on a resting order is evidence about where the price is not."
     }
    },
    {
     "key": "f-info-probes",
     "vars": {
      "key": "f-info-probes",
      "mech": "probe orders placed where one step of their outcome most reduces the probability estimate's uncertainty (information value), rather than at fixed offsets."
     }
    },
    {
     "key": "f-kalman-mid",
     "vars": {
      "key": "f-kalman-mid",
      "mech": "a Kalman filter on the competitor's midpoint and own fill prices as noisy readings of the latent price, with a process model that has jumps."
     }
    },
    {
     "key": "f-spread-regime-online",
     "vars": {
      "key": "f-spread-regime-online",
      "mech": "online detection of the competitor's spread and the retail arrival regime in the first steps, switching constants per regime."
     }
    },
    {
     "key": "f-cusum-jump",
     "vars": {
      "key": "f-cusum-jump",
      "mech": "a CUSUM or likelihood-ratio jump detector on observables that pulls every resting order for a few steps after a detected jump."
     }
    },
    {
     "key": "f-transition-table",
     "vars": {
      "key": "f-transition-table",
      "mech": "an empirical next-step move distribution fitted offline from many simulator runs (quantiles by current price), embedded as constants and used to price adverse selection."
     }
    },
    {
     "key": "f-arrival-rate-online",
     "vars": {
      "key": "f-arrival-rate-online",
      "mech": "an online estimate of the retail arrival rate and order size from observed fills and book changes, scaling quote sizes."
     }
    },
    {
     "key": "f-inventory-dp",
     "vars": {
      "key": "f-inventory-dp",
      "mech": "a finite-horizon dynamic programme over inventory and steps remaining giving the value of one more YES share, used to size and skew quotes."
     }
    },
    {
     "key": "f-reservation-skew",
     "vars": {
      "key": "f-reservation-skew",
      "mech": "a reservation price skewed by inventory and remaining horizon (Avellaneda-Stoikov style), with quotes set around it."
     }
    },
    {
     "key": "f-queue-aware",
     "vars": {
      "key": "f-queue-aware",
      "mech": "queue-position-aware quoting: join the competitor's tick when expected queue ahead is short, improve by a tick only when it is long."
     }
    },
    {
     "key": "f-geometric-ladder",
     "vars": {
      "key": "f-geometric-ladder",
      "mech": "a ladder of several price levels per side with geometrically decreasing sizes, replacing one quote per side."
     }
    },
    {
     "key": "f-adverse-timer",
     "vars": {
      "key": "f-adverse-timer",
      "mech": "an adverse-selection timer: after any fill, quotes on that side are withdrawn for a few steps and reposted at a wider distance."
     }
    },
    {
     "key": "f-horizon-schedule",
     "vars": {
      "key": "f-horizon-schedule",
      "mech": "a quoting schedule over the horizon: size and distance as explicit functions of steps remaining, including settlement at the end."
     }
    },
    {
     "key": "f-spread-switch",
     "vars": {
      "key": "f-spread-switch",
      "mech": "a different quoting policy per competitor spread (1 to 4 ticks), chosen once the spread is seen."
     }
    },
    {
     "key": "f-boundary-asymmetry",
     "vars": {
      "key": "f-boundary-asymmetry",
      "mech": "asymmetric quoting near the 0 and 1 boundaries that exploits the bounded price: the side towards the boundary is sized by the boundary distance."
     }
    },
    {
     "key": "f-variance-kelly",
     "vars": {
      "key": "f-variance-kelly",
      "mech": "quote size from a Kelly-like rule on the estimate's variance: size inversely proportional to the variance of the probability estimate."
     }
    },
    {
     "key": "f-breakeven-size",
     "vars": {
      "key": "f-breakeven-size",
      "mech": "size chosen where the marginal expected retail profit equals the marginal expected arbitrage loss, both estimated from observed flow."
     }
    },
    {
     "key": "f-improve-when-queue-long",
     "vars": {
      "key": "f-improve-when-queue-long",
      "mech": "improve the competitor's price by one tick only when the competitor's resting size at its best is large, otherwise rest behind it."
     }
    },
    {
     "key": "f-collateral-allocator",
     "vars": {
      "key": "f-collateral-allocator",
      "mech": "a collateral allocator that splits free cash between bids and uncovered asks by expected edge per unit of cash locked."
     }
    },
    {
     "key": "f-one-sided",
     "vars": {
      "key": "f-one-sided",
      "mech": "one-sided quoting: quote only the side where the estimate's skew favours the market maker, the other side only as a probe."
     }
    },
    {
     "key": "f-order-age-refresh",
     "vars": {
      "key": "f-order-age-refresh",
      "mech": "an order age policy: cancel and repost any order older than k steps so stale sizes and prices do not rest."
     }
    },
    {
     "key": "f-complete-set",
     "vars": {
      "key": "f-complete-set",
      "mech": "complete-set arbitrage: buy YES and NO (or their equivalents on this book) when their prices sum below one, as a riskless edge source."
     }
    },
    {
     "key": "f-audit-fill-priority",
     "vars": {
      "key": "f-audit-fill-priority",
      "mech": "an engine audit of how fills are allocated among orders at one tick (priority, pro-rata, competitor first), turned into one quoting rule that exploits it."
     }
    },
    {
     "key": "f-audit-retail-gen",
     "vars": {
      "key": "f-audit-retail-gen",
      "mech": "an engine audit of how retail orders are generated (size distribution, side, how they walk the book), turned into one sizing rule."
     }
    },
    {
     "key": "f-audit-arbitrageur",
     "vars": {
      "key": "f-audit-arbitrageur",
      "mech": "an engine audit of exactly what the arbitrageur does each step (which orders it takes, at what price, how much), turned into one exposure rule."
     }
    },
    {
     "key": "f-audit-scoring",
     "vars": {
      "key": "f-audit-scoring",
      "mech": "an engine audit of the edge scoring formula (what is counted, when, against which probability), turned into one rule that improves scored edge."
     }
    },
    {
     "key": "f-audit-competitor",
     "vars": {
      "key": "f-audit-competitor",
      "mech": "an engine audit of the competitor's behaviour (where it quotes relative to the true probability, when it replaces quotes), turned into one estimator of the true price."
     }
    }
   ],
   "output": {
    "format": "json",
    "maxBytes": 64000
   },
   "merge": {
    "groupSize": 10,
    "brief": "Merge the items into one JSON object. rows: one per item, every field copied from the item's result as written: key, mechanism (approach cut to 200 characters), code_sha256, h_seeds, h_n, h_complete, mechanism_diff, mechanism_se, mechanism_retail_diff, mechanism_arb_diff, reference_diff, reference_se, b_mean, failures, graft, next (cut to 300 characters), flag (null, or why the row is unusable: n under 500, no code_sha256, failures, or a b_mean unequal to the other full rows'). Rank rows by mechanism_diff descending. top: the two unflagged rows with the largest mechanism_diff, each with its full code and code_sha256. notes: which mechanisms reduced arbitrage loss and which raised retail edge, at most 1500 characters. Compute nothing beyond the ranking and the flags."
   }
  },
  {
   "name": "r2-remove-b",
   "brief": "One item measures ONE deletion from B, with no retuning and no other change. Deletion ({{key}}): {{what}} Make it the smallest edit that disables that mechanism (a constant set to its off value where one exists, else the branch removed), and keep everything else byte for byte.\nB, the current best: the `code` field of the JSON at https://api.imd.fun/artifacts/ecbc9087b4f238fc1b5b0d52f55af073f676c038bfb6756172b1e51480ac1741 ; the SHA-256 of its UTF-8 bytes must be baef955ec10728839f7c3357016ec9eb0550e7ec689bbd5171b1cdd5c9e37273.\nSimulator: https://github.com/danrobinson/prediction-market-challenge at commit b244530ee2a6247b5f930830eeca9dd950da0e7e, unmodified, default ChallengeConfig() and ParameterVariance(), 2000 steps; load_strategy_factory(path) and run_batch(factory, base_config=ChallengeConfig(), variance=ParameterVariance(), n_simulations=1, seed_start=seed, workers=1) per seed, in process, without --workers and without --sandbox (several OS processes on disjoint seed ranges are fine). A simulation costs 0.3 to 1.3 s: time 20 seeds first and size the work to finish in your time; a seed set you cannot finish is reported as unfinished with the seeds you did finish, never as the measurement.\nRun the deletion candidate and B, paired, on H = seeds 210000..210999 (all 1000; if timing forces fewer, 210000..210499 and say so). No tuning seeds, no other seeds, never 900000..903999.\nPaired difference d_i = candidate total_edge minus B total_edge on seed i, likewise for retail_edge and arb_edge; mean_diff = mean of d; se = sample standard deviation of d divided by sqrt(n); sum_d and sum_d2 are the sums of d and of d squared. Keep every seed; a simulation that raises is a failure listed with its seed, never a dropped seed.\nResult: one JSON object with approach (what was deleted, with the exact before and after lines), tried, next (what the deletion's retail and arbitrage split suggests), code (the deletion candidate's full source), code_sha256 (SHA-256 of that exact UTF-8 text), incumbent_code_sha256, tuning_score null, paired {seeds, n, complete, mean_diff, se, sum_d, sum_d2, candidate_mean, incumbent_mean, retail_diff, retail_se, arb_diff, arb_se, failures}, seconds_per_simulation.",
   "items": [
    {
     "key": "remove-scarcity",
     "vars": {
      "key": "remove-scarcity",
      "what": "the ask scarcity charge: C['scar'] = 0.0."
     }
    },
    {
     "key": "remove-reserve",
     "vars": {
      "key": "remove-reserve",
      "what": "the cash reserve on uncovered asks: C['reserve'] = 0."
     }
    },
    {
     "key": "remove-sticky",
     "vars": {
      "key": "remove-sticky",
      "what": "the sticky queue at the competitor's tick: P['sticky'] = 0."
     }
    },
    {
     "key": "remove-jump-term",
     "vars": {
      "key": "remove-jump-term",
      "what": "the jump term in AB(): lj = 0 there (the variance constant var unchanged)."
     }
    },
    {
     "key": "remove-last-step",
     "vars": {
      "key": "remove-last-step",
      "what": "the H == 1 override of AB() (the exact final-step payoff)."
     }
    },
    {
     "key": "remove-low-bid-rescale",
     "vars": {
      "key": "remove-low-bid-rescale",
      "what": "the inventory-dependent bid rescale in qbid under phat < P['pL'] (the kLb/kLf branch); kL still applies through kA."
     }
    },
    {
     "key": "remove-tick1-bank",
     "vars": {
      "key": "remove-tick1-bank",
      "what": "the tick-1 bank q1: P['ydf1'] = 0."
     }
    },
    {
     "key": "remove-rest-below",
     "vars": {
      "key": "remove-rest-below",
      "what": "ammo branch 3, the purchase resting one tick under p (the `1.0 - g <= P['g_lo']` branch)."
     }
    },
    {
     "key": "remove-crossing-purchase",
     "vars": {
      "key": "remove-crossing-purchase",
      "what": "ammo branch 1, the purchase at the tick p has just crossed (the `g <= P['g_hi']` branch)."
     }
    },
    {
     "key": "remove-below-tick-decay",
     "vars": {
      "key": "remove-below-tick-decay",
      "what": "the below-tick-1 decay of phat: P['zd'] = 0."
     }
    },
    {
     "key": "remove-jumpinfo",
     "vars": {
      "key": "remove-jumpinfo",
      "what": "the competitor-move bounds on the belief: P['jumpinfo'] = 0."
     }
    },
    {
     "key": "remove-belief-filter",
     "vars": {
      "key": "remove-belief-filter",
      "what": "the belief carry-over between steps: P['filt'] = 0 (uniform over [lo, hi] each step)."
     }
    },
    {
     "key": "remove-late-uncovered",
     "vars": {
      "key": "remove-late-uncovered",
      "what": "the late uncovered-ask rule `if H < P['Hu'] and phat < 0.05: ub = ...`."
     }
    },
    {
     "key": "remove-low-price-regime",
     "vars": {
      "key": "remove-low-price-regime",
      "what": "the low-price regime: kA = P['kA'] always (no kL below pL)."
     }
    },
    {
     "key": "remove-probe-inference",
     "vars": {
      "key": "remove-probe-inference",
      "what": "the probe inference on lo/hi: P['pinf'] = 0 (probes still placed)."
     }
    },
    {
     "key": "remove-ammo",
     "vars": {
      "key": "remove-ammo",
      "what": "all ammo purchases: P['ammo'] = 0 (q1 bank unchanged)."
     }
    }
   ],
   "output": {
    "format": "json",
    "maxBytes": 64000
   },
   "merge": {
    "groupSize": 8,
    "brief": "Merge the items into one JSON object. rows: one per item, every field copied from the item's result as written: key, idea (approach cut to 200 characters), code_sha256, h_seeds, h_n, h_complete, h_diff, h_se, h_sum_d, h_sum_d2, h_incumbent_mean, h_retail_diff, h_arb_diff, failures, next (cut to 300 characters), flag (null, or why the row is unusable: n under 500, no code_sha256, failures, or an h_incumbent_mean unequal to the other full-H rows'). Rank rows by h_diff descending. top: the two unflagged rows with the largest h_diff, each with its full code and code_sha256. notes: what the group learned about which ideas moved retail and arbitrage edge, at most 1500 characters. Compute nothing beyond the ranking and the flags."
   }
  },
  {
   "name": "r2-confirm",
   "brief": "One item measures ONE frozen candidate against the current best B on ONE block of seeds. No development, no tuning: change no code.\nCandidate {{name}} ({{idea}}): the `code` field of the JSON at {{url}} ; the SHA-256 of its UTF-8 bytes must be {{sha}}.\nB, the current best: the `code` field of the JSON at https://api.imd.fun/artifacts/ecbc9087b4f238fc1b5b0d52f55af073f676c038bfb6756172b1e51480ac1741 ; the SHA-256 of its UTF-8 bytes must be baef955ec10728839f7c3357016ec9eb0550e7ec689bbd5171b1cdd5c9e37273.\nSimulator: https://github.com/danrobinson/prediction-market-challenge at commit b244530ee2a6247b5f930830eeca9dd950da0e7e, unmodified, default ChallengeConfig() and ParameterVariance(), 2000 steps; load_strategy_factory(path) and run_batch(factory, base_config=ChallengeConfig(), variance=ParameterVariance(), n_simulations=1, seed_start=seed, workers=1) per seed, in process, without --workers and without --sandbox (several OS processes on disjoint seed ranges are fine). A simulation costs 0.3 to 1.3 s: time 20 seeds first and size the work to finish in your time; a seed set you cannot finish is reported as unfinished with the seeds you did finish, never as the measurement.\nBlock: seeds {{seeds}}, every seed, candidate and B on each; no other seed, never 900000..903999. Check both hashes before anything runs; stop and say so if one differs.\nPaired difference d_i = candidate total_edge minus B total_edge on seed i, likewise for retail_edge and arb_edge; mean_diff = mean of d; se = sample standard deviation of d divided by sqrt(n); sum_d and sum_d2 are the sums of d and of d squared. Keep every seed; a simulation that raises is a failure listed with its seed, never a dropped seed.\nResult: one JSON object with approach, tried (timing, how the block was run, what was checked), next, code_sha256 (the candidate's), incumbent_code_sha256, tuning null, paired {seeds, n, complete, mean_diff, se, sum_d, sum_d2, candidate_mean, incumbent_mean, retail_diff, retail_se, arb_diff, arb_se, nonzero_diff_seeds, failures}, seconds_per_simulation.",
   "items": [
    {
     "key": "seg-a",
     "vars": {
      "name": "stock-entry-gate",
      "idea": "the tick-1 bank only when the competitor's best bid is at most tick 1",
      "url": "https://api.imd.fun/artifacts/212361fa9b3fba7425c5a32b661c5ae2a9604c7f515cce4195912f642dd438c3",
      "sha": "a709c7e85c7dc5200cba83d854cc7ecc9cee8a70915ca79798504da648e9ebed",
      "seeds": "250000..250999"
     }
    },
    {
     "key": "seg-b",
     "vars": {
      "name": "stock-entry-gate",
      "idea": "the tick-1 bank only when the competitor's best bid is at most tick 1",
      "url": "https://api.imd.fun/artifacts/212361fa9b3fba7425c5a32b661c5ae2a9604c7f515cce4195912f642dd438c3",
      "sha": "a709c7e85c7dc5200cba83d854cc7ecc9cee8a70915ca79798504da648e9ebed",
      "seeds": "251000..251999"
     }
    },
    {
     "key": "seg-c",
     "vars": {
      "name": "stock-entry-gate",
      "idea": "the tick-1 bank only when the competitor's best bid is at most tick 1",
      "url": "https://api.imd.fun/artifacts/212361fa9b3fba7425c5a32b661c5ae2a9604c7f515cce4195912f642dd438c3",
      "sha": "a709c7e85c7dc5200cba83d854cc7ecc9cee8a70915ca79798504da648e9ebed",
      "seeds": "252000..252999"
     }
    },
    {
     "key": "seg-d",
     "vars": {
      "name": "stock-entry-gate",
      "idea": "the tick-1 bank only when the competitor's best bid is at most tick 1",
      "url": "https://api.imd.fun/artifacts/212361fa9b3fba7425c5a32b661c5ae2a9604c7f515cce4195912f642dd438c3",
      "sha": "a709c7e85c7dc5200cba83d854cc7ecc9cee8a70915ca79798504da648e9ebed",
      "seeds": "253000..253999"
     }
    },
    {
     "key": "sjb-a",
     "vars": {
      "name": "side-jump-budget",
      "idea": "a per-side marginal jump charge at the main bid and ask sizing",
      "url": "https://api.imd.fun/artifacts/5a936ac2b2047b10b73dd9c0c92702e8b9bc5c76e508188e1b16d3c0e854a227",
      "sha": "3b7236c98d52efed9617e4cf6d8183012c98b8b61b18eb59b5afae937c99c724",
      "seeds": "254000..254999"
     }
    },
    {
     "key": "sjb-b",
     "vars": {
      "name": "side-jump-budget",
      "idea": "a per-side marginal jump charge at the main bid and ask sizing",
      "url": "https://api.imd.fun/artifacts/5a936ac2b2047b10b73dd9c0c92702e8b9bc5c76e508188e1b16d3c0e854a227",
      "sha": "3b7236c98d52efed9617e4cf6d8183012c98b8b61b18eb59b5afae937c99c724",
      "seeds": "255000..255999"
     }
    },
    {
     "key": "sjb-c",
     "vars": {
      "name": "side-jump-budget",
      "idea": "a per-side marginal jump charge at the main bid and ask sizing",
      "url": "https://api.imd.fun/artifacts/5a936ac2b2047b10b73dd9c0c92702e8b9bc5c76e508188e1b16d3c0e854a227",
      "sha": "3b7236c98d52efed9617e4cf6d8183012c98b8b61b18eb59b5afae937c99c724",
      "seeds": "256000..256999"
     }
    },
    {
     "key": "sjb-d",
     "vars": {
      "name": "side-jump-budget",
      "idea": "a per-side marginal jump charge at the main bid and ask sizing",
      "url": "https://api.imd.fun/artifacts/5a936ac2b2047b10b73dd9c0c92702e8b9bc5c76e508188e1b16d3c0e854a227",
      "sha": "3b7236c98d52efed9617e4cf6d8183012c98b8b61b18eb59b5afae937c99c724",
      "seeds": "257000..257999"
     }
    }
   ],
   "output": {
    "format": "json",
    "maxBytes": 16000
   },
   "merge": {
    "groupSize": 25,
    "brief": "Merge the items into one JSON object: rows, one per item, with key, name, code_sha256, seeds, n, complete, mean_diff, se, sum_d, sum_d2, incumbent_mean, retail_diff, arb_diff, failures, copied as written; and for each candidate name the pooled result over its rows: N = sum of n, mean = sum of sum_d / N, se = sqrt((sum of sum_d2 - N * mean^2) / (N - 1)) / sqrt(N)."
   }
  }
 ],
 "read": [
  "r2-deepen-b/merge-01",
  "r2-deepen-b/merge-02",
  "r2-deepen-b/merge-03",
  "r2-deepen-b/merge-04",
  "r2-fresh-b/merge-01",
  "r2-fresh-b/merge-02",
  "r2-fresh-b/merge-03",
  "r2-remove-b/merge-01",
  "r2-remove-b/merge-02",
  "r2-confirm/seg-a",
  "r2-confirm/seg-b",
  "r2-confirm/seg-c",
  "r2-confirm/seg-d",
  "r2-confirm/sjb-a",
  "r2-confirm/sjb-b",
  "r2-confirm/sjb-c",
  "r2-confirm/sjb-d"
 ],
 "cancel": [],
 "wake": {
  "batches": [
   "r2-deepen-b",
   "r2-fresh-b",
   "r2-remove-b",
   "r2-confirm"
  ],
  "afterMinutes": 420
 },
 "finish": false
}