{
 "notes": "EPISODE 5: nothing to rank yet; the fresh lane and N diagnostics were launched so no episode is lost waiting. Handed one result only (r2-confirm/sjb-d, old comparator). All 70 r3 items of episode 4 were still in their canaries (0 accepted), so no scoreboard row against N exists. Items used after this episode: 214 of 600 (179 + 35). Nothing spawned in episode 10 can be read.\n\nBEST N (adopted on the requester's 18:55Z note, not a promotion of ours): `code` field of https://api.imdnotdead.fun/artifacts/db22aff7167a4798251ed3d20432509f30e511e4958799aba5b17b41bb39b4b6 ; code SHA-256 bf0d179f3e47d28819f6fa7e0d25548c2ced43374c216d36460b00a26a26ffae; artifact digest and code hash re-verified this episode. LOCAL PROMOTIONS: none. F = 900000..903999 run by nobody. Streak of completed rounds without promotion: 0. Requester's standings (not live-checked): 1st 110.00, us 2nd 109.79; promote spread by spread.\nCHECK VALUES (unmodified simulator at b244530e, serial, run here): N's total edge on seeds 310000..310003 = 17.116002, 20.017111, 2.390311, 241.484752; 0.92 s a simulation, so 500 pairs take about 16 minutes. N's class line `class Strategy(BaseStrategy):` occurs once and `Strategy` is named nowhere else. A wrapper returning N's actions unchanged reproduces N exactly; one halving every order ran without failures.\n\nHISTORICAL, versus OLD B baef955e, not N: side-jump-budget 3b7236c9..., r2-confirm/sjb-a..d complete on 254000..257999, N=4000: sum_d 2074.9284962555, sum_d2 884865.5464504361, mean +0.5187, se 0.2351 (2.2 se); retail -1.575, arb +2.094. Its port to N is measured by r3-transfer-measure; only that counts. stock-entry-gate: -0.214 se 0.155 on old B.\n\nDECISION ON THE FRESH LANE. Episode 4 planned 30 blind items fed by score fixtures, an episode later. Changed: they run now as OVERLAYS (batch r3-fresh-overlay). Each item loads N as an unread file, wraps it (calls N.on_step, then drops, resizes, moves or adds orders by one mechanism of its own), guards the mechanism by spread, and is paired directly against N. Why: a from-scratch strategy trails N by tens of points and shows only a mechanism gain of unknown portability; an overlay's paired gain is already a gain on N, per spread, and composes. The 30 mechanisms are episode 4's preassigned list (distinct from the deepen ideas), each given one overlay action.\nOverlay result fields: key, spreads_acted, off_equals_n, code (overlay source only, at most 10,000 bytes), code_sha256 (of that), assembled_sha256, tuning, paired {n, complete, incumbent_mean, mean_diff, se, sum_d, sum_d2, retail_diff, arb_diff, failures}, by_spread {runs, incumbent_mean, mean_diff, se, sum_d, sum_d2, retail_diff, arb_diff}. ASSEMBLY RECIPE for a submittable file: N's text with the line `class Strategy(BaseStrategy):` replaced by `class _N(BaseStrategy):`, a newline, then the overlay source; its SHA-256 must equal assembled_sha256. Merges (groups of 6, merge-01..05) carry `rows` for all items and `top`: the overlay code of the three best rows by per-spread mean_diff/se. The merges' rows name the 30 keys (f-...).\nr3-diagnose-current (5 items, handed one by one, 500 seeds each on 500000..502499, N by spread): d-arb-by-order, d-oracle-sweep (oracle gain from cancelling orders about to be swept, all steps and jump steps only), d-retail-share, d-time-price, d-sweep-signals. Their `finding` for spreads 2 and 3 chooses the next round's ideas.\n\nROUND 3 NOW = 105 items against N: r3-deepen-current 40, r3-fresh-overlay 30, r3-remove-current 15, measure 20 (r3-reference-current 6 fixture blocks, r3-transfer-measure 8, r3-reference-replica 1, r3-diagnose-current 5).\n\nSEED LEDGER (never tune on a holdout): development screen T 310000..310199, H 410000..410499 for deepen, remove and overlay items alike, so every item's N mean on H must be the same number; extension H 410500..411999; SEG/SJB transfer audit 420000..421999; diagnostics 500000..502499; reserved T 320000..320999 / H 430000..431999 and T 330000..330999 / H 440000..441999; confirmation blocks free from 510000. Seeds below 300000 are exposed. F only in finalist measure batches.\n\nRESULTS HANDING. goal.json does not list item keys, and episode 4's decisions are not published, so the keys of r3-reference-current, r3-transfer-measure and r3-reference-replica could not be named in `read`. Items of batches without a merge were handed without being asked for (sjb-d was), so expect them; if they are missing, do not stall: every measure item can run N itself. Asked for: the six r3 merges, the five overlay merges, the five diagnostics.\nPLANE LESSONS: never ask an item or a merge for a command's output, only for fields; a brief is at most 3,000 characters filled; a result at most 64,000 bytes (N alone is 51 KB as JSON, so a result carrying a full composed file must carry little else).\n\nNEXT EPISODE (6), in order:\n1. Integrity: drop rows that are flagged, incomplete, n under 500, hash missing, off_equals_n false, or whose incumbent_mean on H 410000..410499 differs from the majority value (and from the r3-reference-current H-a fixture if handed).\n2. Scoreboard by spread from the deepen, remove and overlay merges: key, code hash, runs_s, mean_diff_s, se_s. About 125 runs a spread at H500: a screen, not a ranking; the best of 85 rows is inflated by selection.\n3. Shortlist per spread: up to 3 candidates with mean_diff_s above 1.5 se_s on the spread they target. Spawn r3-extend: each exact hash, 3 measure items on 410500..410999, 411000..411499, 411500..411999, S and N on every seed, returning overall and per-spread n, sum_d, sum_d2, retail and arb differences and the per-seed arrays (seed, spread, d to 6 decimals), so any two candidates can later be paired with each other. An overlay candidate is given as the merge's SHA URL, its key in `top`, and the assembly recipe; a deepen candidate as its merge's `top` code.\n4. To save an episode: a candidate whose screen gain on its spread is above 3 se_s goes straight to F in the same episode (r3-final: 8 items of 500 seeds over 900000..903999, same fields), at most one per spread, frozen hash.\n5. Also spawn round 4's development in episode 6 (at least 100 items, about 40/30/15/15, against N, each guarded by spread): combine lane = same-spread pairs of round 3's screen winners and overlay-on-deepen grafts; deepen what the diagnostics name for spreads 2 and 3; fresh = new overlay mechanisms not in the list above; remove = deletions the remove lane found neutral, jointly; measure = replications. Use T 320000..320199 and H 430000..430499.\n6. Episode 7: pool H2000 per spread, preselect at most one frozen block per spread, F finals (8 x 500 each). Episode 8: promote spread by spread where the pooled F gain on that spread exceeds 2 se with all 4000 seeds complete and 0 failures; spawn one compose item (guarded composition of the promoted blocks, exact-equality audit against each source on its spread, full code and hash, little else) and round 4's finals. Episode 9: second promotions and the final composed file; ask in `read` for the result that carries the full code. Episode 10: finish. Because a run has one spread and blocks are guarded, the composed file's F gain is the sum of the promoted spreads' sum_d over 4000; no re-measurement is needed, only the equality audit.\n7. Stop early after two completed rounds in a row without a promotion. Round 3 completes with its F decision.\n\nLIMITS FOR THE WRITE-UP: F is reused across rounds and across up to four per-spread finalists, so its 2-se gate is weaker than on untouched seeds; H 410000..410499 is common to all round-3 items, so its ranking is selected; N came from another goal and was adopted, not promoted through our gate; local paired gains are not a leaderboard result; --sandbox was not run. Promotion rows: round, spread, old and new hash, code URL, F runs, gain, se, retail and arb change.",
 "spawn": [
  {
   "name": "r3-fresh-overlay",
   "brief": "One item builds ONE overlay mechanism on top of the incumbent strategy N, blind, and measures it paired against N. Mechanism ({{key}}): {{mech}}\nBlind rule: do not open, print or search N's source, any other strategy for this challenge, a leaderboard entry or an earlier result of this network. Read only the simulator, its README and docs/: https://github.com/danrobinson/prediction-market-challenge at commit b244530ee2a6247b5f930830eeca9dd950da0e7e, unmodified, default ChallengeConfig and ParameterVariance, 2000 steps, one OS process, no --workers, no --sandbox.\nN: by script, save the `code` field of the JSON at https://api.imdnotdead.fun/artifacts/db22aff7167a4798251ed3d20432509f30e511e4958799aba5b17b41bb39b4b6 as n.py; the SHA-256 of its UTF-8 bytes must be bf0d179f3e47d28819f6fa7e0d25548c2ced43374c216d36460b00a26a26ffae. Check: N's total edge on seed 310000 should be 17.116002; say so if it is not.\nBuild S1: a class that owns one N instance, calls its on_step(state) every step and returns N's actions changed only by the mechanism (drop, resize, move or add orders, all valid). The mechanism keeps its own estimates from the StepState history. N sees every own order in state.own_orders, so hide orders you add from it (dataclasses.replace on the state). Act only in runs whose spread s = max(1, (first-step competitor ask - bid + 1)//2) is in a set you choose from 1..4; elsewhere return N's actions untouched. With the mechanism off, S1 must equal N exactly on 10 seeds.\nSeeds: tune on 310000..310199 only, at most 2 variants, choose the spread set there, then freeze. Holdout 410000..410499, once, S1 and N on every seed. Never run 900000..903999. If time runs short, stop early and report complete false with the seeds done; never a partial run as the measurement.\nAssembled file: N's text with the line `class Strategy(BaseStrategy):` replaced by `class _N(BaseStrategy):`, a newline, then your overlay source defining `Strategy` over `_N`; standard library only, overlay at most 10,000 bytes. Check it equals S1 on 5 seeds.\nResult, one JSON object, fields only: key; approach; tried; next; spreads_acted; off_equals_n; code (the overlay source only); code_sha256 (of `code`); assembled_sha256; tuning {n, mean_diff, se}; paired {first_seed, last_seed, n, complete, incumbent_mean, mean_diff, se, sum_d, sum_d2, retail_diff, arb_diff, failures}; by_spread, for each s of 1..4 {runs, incumbent_mean, mean_diff, se, sum_d, sum_d2, retail_diff, arb_diff}; seconds_per_simulation. d = S1 edge minus N edge on a seed; se = sample sd of d / sqrt(n).",
   "items": [
    {
     "key": "f-cp-filter",
     "vars": {
      "key": "f-cp-filter",
      "mech": "Exact compound-Poisson filter. Keep a grid posterior over the latent score from the bounds the competitor's best bid and ask put on p each step (the arbitrageur clears quotes through p), propagated with diffusion plus Poisson-Gaussian jumps and mapped to p by the docs' formula. Overlay: drop any N order priced on the wrong side of the posterior mean by a margin you tune."
     }
    },
    {
     "key": "f-run-class",
     "vars": {
      "key": "f-run-class",
      "mech": "Rao-Blackwellised particles over the run's unknown jump intensity and jump sigma (ranges in ParameterVariance), weighted by the observed competitor-quote moves. Overlay: after a warm-up, class the run as low or high jump loss and apply one run-level size factor to N's orders within k ticks of the competitor's best quotes."
     }
    },
    {
     "key": "f-interval-vol",
     "vars": {
      "key": "f-interval-vol",
      "mech": "Interval-volatility likelihood. From how many ticks the competitor's best quotes moved over the last 1, 5 and 20 steps, estimate the current tick volatility of p, which rises near expiry and near 50c. Overlay: while it exceeds a threshold, move N's orders nearest the market one tick further away."
     }
    },
    {
     "key": "f-jump-hazard",
     "vars": {
      "key": "f-jump-hazard",
      "mech": "Bayesian jump hazard. A Gamma posterior on jump intensity updated by detected jumps (competitor quotes moving 3 or more ticks in a step). Overlay: each step multiply the size of N's orders on both sides by a decreasing function of the posterior mean intensity times the steps remaining."
     }
    },
    {
     "key": "f-jump-scale",
     "vars": {
      "key": "f-jump-scale",
      "mech": "Jump-scale posterior. Estimate jump sigma from the sizes of detected jumps, inverted from the price move to score units, with a prior over the ParameterVariance range. Overlay: set the tick distance inside which N's orders are cut, wider when the expected jump size in ticks is larger."
     }
    },
    {
     "key": "f-post-jump",
     "vars": {
      "key": "f-post-jump",
      "mech": "Hidden-regime detector. A two-state filter, calm or disturbed, driven by recent quote moves and own fills. Overlay: for m steps after a detected jump, drop N's new placements at prices the jump crossed until the competitor's replacement quotes have settled, and keep its resting orders."
     }
    },
    {
     "key": "f-nofill-bounds",
     "vars": {
      "key": "f-nofill-bounds",
      "mech": "Censored no-fill likelihood. An own bid at x left unfilled means p was at least x that step; an unfilled ask at x means p was at most x. Use these bounds with the competitor quotes to keep an interval for p. Overlay: drop N orders priced inside the interval's wrong side, and report how often the interval is narrower than the competitor's spread."
     }
    },
    {
     "key": "f-side-staleness",
     "vars": {
      "key": "f-side-staleness",
      "mech": "Bid/ask observation reliability. A competitor level only moves when it is filled, so its best bid and ask are stale by different ages. Track each side's age and weight the fresher side more in a p estimate. Overlay: when the estimate is off the competitor midpoint by over half a tick, move N's order on the exposed side one tick away."
     }
    },
    {
     "key": "f-entropy-probes",
     "vars": {
      "key": "f-entropy-probes",
      "mech": "Entropy-optimal probes. Add one tiny own order (0.01 to 0.05 shares) per side at the price inside the competitor spread whose fill or non-fill by the arbitrageur most narrows your interval for p. Overlay: add only these probes, and cancel an N order when a probe's fill shows it is stale."
     }
    },
    {
     "key": "f-probe-stopping",
     "vars": {
      "key": "f-probe-stopping",
      "mech": "Sequential probe stopping. A tiny probe order one tick inside N's best quote is placed only while the expected narrowing of the p interval is worth more than its expected arbitrage loss; stop by a sequential test and restart after a detected move. Overlay: use the probe's state to shrink N's order behind it when the probe was just swept."
     }
    },
    {
     "key": "f-endgame-stop",
     "vars": {
      "key": "f-endgame-stop",
      "mech": "Finite-horizon stopping. A small dynamic programme over steps remaining and distance of p from 50c gives, for the last few hundred steps, the step after which resting on a side loses more to the arbitrageur than retail pays. Overlay: stop N's quoting on that side from that step, per side."
     }
    },
    {
     "key": "f-join-timing",
     "vars": {
      "key": "f-join-timing",
      "mech": "Hidden queue-position model. Estimate the quantity ahead of an own order at each competitor level from the competitor's per-level notional (inferred from fills and replacements) and from when you joined. Overlay: add an own order at the competitor's best level only at the step that level is replaced or emptied, when the queue ahead is smallest."
     }
    },
    {
     "key": "f-deep-tranche",
     "vars": {
      "key": "f-deep-tranche",
      "mech": "Survival fill-time model. Estimate online, by tick distance from the competitor's best quote, the time until an own order there is filled and the edge it earns. Overlay: add a second, deeper tranche at the distance with the best expected edge per reserved dollar where N rests nothing."
     }
    },
    {
     "key": "f-cover-stock",
     "vars": {
      "key": "f-cover-stock",
      "mech": "Joint cash and inventory Bellman approximation. Holding YES and NO stock decides how much cash N's asks and bids reserve. Value one more YES or NO share by the collateral it frees over the steps remaining. Overlay: add a small standing order that buys the cheaper cover when that value exceeds its expected arbitrage loss."
     }
    },
    {
     "key": "f-cancel-option",
     "vars": {
      "key": "f-cancel-option",
      "mech": "Cancellation option pricing. A resting order is a one-step option given to the arbitrageur; price it from your one-step predictive for p against one step of retail income, minus the queue place lost by cancelling. Overlay: cancel each N order while its option cost exceeds that income, and re-place it when the sign turns."
     }
    },
    {
     "key": "f-shortfall-cap",
     "vars": {
      "key": "f-shortfall-cap",
      "mech": "Expected-shortfall quoting. For each side compute the mean of the worst 5% one-step losses of N's resting orders under a jump-diffusion predictive for p. Overlay: cap each side's total resting size so that shortfall stays under a budget tuned on the tuning seeds, cutting the nearest orders first."
     }
    },
    {
     "key": "f-ambiguity",
     "vars": {
      "key": "f-ambiguity",
      "mech": "Ambiguity-set robust quoting. Jump intensity and sigma are unknown within the ParameterVariance ranges; keep a credible set that shrinks as the run reveals them. Overlay: early in the run drop N orders whose expected edge is negative under the worst parameters of the set, and relax as the set shrinks."
     }
    },
    {
     "key": "f-toxic-fill",
     "vars": {
      "key": "f-toxic-fill",
      "mech": "Online toxic-fill classification. Class each step's own fills as arbitrage (the competitor's best quote on that side moved too, or a whole order went at once) or retail. Overlay: after a toxic fill on a side, hold back N's placements on that side within k ticks for m steps; tune k and m."
     }
    },
    {
     "key": "f-quote-age",
     "vars": {
      "key": "f-quote-age",
      "mech": "Quote-age hazard. The longer an own order rests while the competitor's quotes drift toward it, the likelier its next fill is a sweep. Overlay: cancel an N order once the drift toward it since its submitted_step passes a limit that depends on its age, and let N place it again."
     }
    },
    {
     "key": "f-boundary",
     "vars": {
      "key": "f-boundary",
      "mech": "Absorbing-boundary filter. At 1 to 5c and 95 to 99c ticks clip p and one side can hardly be swept while the other can only be swept. Model which ticks p can still reach before the end. Overlay: at those prices drop N orders on the side that can only be swept and enlarge those that can only meet retail."
     }
    },
    {
     "key": "f-step-inside",
     "vars": {
      "key": "f-step-inside",
      "mech": "Antithetic posterior loss integration. Integrate the one-step arbitrage loss of an order over your p posterior with antithetic nodes for the diffusion and one-jump terms. Overlay: when the integrated loss one tick inside the competitor's best quote is below the retail edge that priority there earns, move part of N's best order one tick inside."
     }
    },
    {
     "key": "f-retail-reach",
     "vars": {
      "key": "f-retail-reach",
      "mech": "Exact compound-retail tail convolution. Retail arrivals are Poisson with lognormal notional; estimate rate and mean online from own fills and compute how much retail quantity reaches each price level in a step. Overlay: cap N's size at each level to what retail will reach there while the quote is still safe, freeing the collateral."
     }
    },
    {
     "key": "f-fill-imbalance",
     "vars": {
      "key": "f-fill-imbalance",
      "mech": "Bid/ask fill cross-correlation. Retail sides are independent, so a run of own fills on one side signals that p moved that way. Track the signed fill imbalance over a window. Overlay: when it passes a threshold, the opposite side is the safe one: enlarge N's orders there for m steps."
     }
    },
    {
     "key": "f-partial-keep",
     "vars": {
      "key": "f-partial-keep",
      "mech": "Partial-fill continuation value. A partly filled own order keeps its FIFO place, so its remainder is worth more than a new order at that price. Overlay: when N cancels a partly filled order whose price is still on the right side of the competitor's quotes, keep the remainder and cut N's replacement by that quantity."
     }
    },
    {
     "key": "f-drift-skew",
     "vars": {
      "key": "f-drift-skew",
      "mech": "Latent-score trend shrinkage. Apart from the jump mean (within 0.04) the score has no trend, yet p drifts toward 0 or 1 as time runs out; estimate that drift online and shrink it toward zero. Overlay: skew N's two sides by the predicted next-step drift of p, smaller on the side it moves into and larger on the other."
     }
    },
    {
     "key": "f-pit-calibration",
     "vars": {
      "key": "f-pit-calibration",
      "mech": "Calibration by probability integral transform. Build a one-step predictive for the competitor-quote move, track its PIT values in the run, and widen or narrow it when they show miscalibration. Overlay: on steps where the recalibrated chance of a crossing is in its top decile, withdraw N's nearest order on each side for that step."
     }
    },
    {
     "key": "f-info-order",
     "vars": {
      "key": "f-info-order",
      "mech": "Information-budget quote allocation. Some orders mostly earn edge, others mostly reveal p through their fills and non-fills. Give each N order both values. Overlay: keep, per side, the one cheapest informative order resting even when N would cancel it, and report what its presence changes in N's later orders."
     }
    },
    {
     "key": "f-competing-risk",
     "vars": {
      "key": "f-competing-risk",
      "mech": "Competing-risk fills. Each resting order ends by a retail fill or an arbitrage sweep; estimate both hazards per side from the run so far (retail from fills while quotes stood still, sweeps from quote moves through your price). Overlay: rescale each side's total size by its retail hazard over its sweep hazard, total size unchanged."
     }
    },
    {
     "key": "f-flow-scales",
     "vars": {
      "key": "f-flow-scales",
      "mech": "Arrival-rate nonstationarity. Retail sells are notional over max(p, 0.05) shares, so share flow changes with p and with your queue place; track own fill rate in shares per step on a short and a long time scale. Overlay: when the short rate is well above the long one add size at N's best prices, when well below release it."
     }
    },
    {
     "key": "f-cash-order",
     "vars": {
      "key": "f-cash-order",
      "mech": "Uncovered-collateral shadow price. A bid reserves price per share and an uncovered ask 1 minus price; when free cash binds N cannot place everything. Compute each order's expected edge per reserved dollar. Overlay: when cash binds, cancel the worst resting order by that ratio so that N's better new order fits; report how often cash binds by spread."
     }
    }
   ],
   "output": {
    "format": "json",
    "maxBytes": 56000
   },
   "merge": {
    "groupSize": 6,
    "brief": "Merge this group's results into one JSON object with two fields, copying numbers exactly as the items give them and recomputing nothing. `rows`: one per item: key, spreads_acted, off_equals_n, code_sha256, assembled_sha256, tuning mean_diff and se, paired n, complete, incumbent_mean, mean_diff, se, sum_d, sum_d2, retail_diff, arb_diff, failures, and by_spread with runs, mean_diff, se, sum_d, sum_d2 for each spread, plus `flag`: a short word list naming what is wrong (incomplete, n under 500, off_equals_n false, a hash missing, failures, incumbent_mean unlike the other rows') or empty. `top`: for the three unflagged rows with the largest mean_diff divided by se in any one spread of at least 60 runs: key, that spread, and the item's `code` field copied whole and unchanged. Add no ranking, advice or text from outside the items."
   }
  },
  {
   "name": "r3-diagnose-current",
   "brief": "One item measures ONE thing about the incumbent strategy N, by competitor spread. It builds no candidate and changes no strategy. Measurement ({{key}}): {{what}}\nN: the `code` field of the JSON at https://api.imdnotdead.fun/artifacts/db22aff7167a4798251ed3d20432509f30e511e4958799aba5b17b41bb39b4b6 ; the SHA-256 of its UTF-8 bytes must be bf0d179f3e47d28819f6fa7e0d25548c2ced43374c216d36460b00a26a26ffae. You may read it. Simulator: https://github.com/danrobinson/prediction-market-challenge at commit b244530ee2a6247b5f930830eeca9dd950da0e7e, default ChallengeConfig and ParameterVariance, 2000 steps, one OS process, no --workers, no --sandbox. Instrument a copy of the simulator only to record what the measurement needs; N's edge on every seed must stay equal to the unmodified simulator's (check 10 seeds; N's total edge on seed 310000 should be 17.116002).\nSeeds: exactly {{seeds}}, 500 runs. Never run 900000..903999. A run's spread is sample_config(ChallengeConfig(), ParameterVariance(), seed=seed).competitor.spread_ticks. If time runs short, stop early and report complete false with the seeds done; a partial run is never the measurement.\nResult, one JSON object, fields only, no command output: key; approach; tried (checks made); complete; first_seed; last_seed; n; incumbent_mean, retail_mean, arb_mean over all runs; by_spread, for each s of 1..4: runs, incumbent_mean, retail_mean, arb_mean and the measurement's own table for that spread (each cell a mean per run with its standard error where it is a difference); finding: at most five sentences naming, for spread 2 and spread 3 first, the largest loss or missed edge this measurement shows and the one change to N it points at; next; seconds_per_simulation.",
   "items": [
    {
     "key": "d-arb-by-order",
     "vars": {
      "key": "d-arb-by-order",
      "seeds": "500000..500499",
      "what": "Split N's arbitrage edge and retail edge by order class: side (bid, ask), distance in ticks from the competitor's best quote on that side when filled (inside the spread, at it, 1 behind, 2 or more behind), and whether p moved 3 or more ticks on that step (a jump step) or less. Give each class's mean edge per run and its filled quantity."
     }
    },
    {
     "key": "d-oracle-sweep",
     "vars": {
      "key": "d-oracle-sweep",
      "seeds": "500500..500999",
      "what": "Two oracle upper bounds, each paired against N on the same seeds: (a) just before each step, cancel every N order the arbitrageur will sweep on that step (knows the next p); (b) the same, but only on steps where p moves 3 or more ticks. Give each oracle's paired gain with standard error, split into retail and arbitrage change."
     }
    },
    {
     "key": "d-retail-share",
     "vars": {
      "key": "d-retail-share",
      "seeds": "501000..501499",
      "what": "Retail capture: of the retail notional traded each run, the share N's orders take against the competitor's, by price region of p (under 5c, 5 to 20c, 20 to 80c, 80 to 95c, over 95c) and by side, with N's retail edge per unit of notional taken and the edge the competitor's fills would have earned at their prices."
     }
    },
    {
     "key": "d-time-price",
     "vars": {
      "key": "d-time-price",
      "seeds": "501500..501999",
      "what": "Edge by time and price: N's retail edge, arbitrage edge and net, per run, in buckets of steps (0-199, 200-999, 1000-1599, 1600-1899, 1900-1999) crossed with p (under 5c, 5 to 20c, 20 to 80c, 80 to 95c, over 95c). Name every bucket whose net is negative."
     }
    },
    {
     "key": "d-sweep-signals",
     "vars": {
      "key": "d-sweep-signals",
      "seeds": "502000..502499",
      "what": "What a strategy can see before a sweep: for each step where the arbitrageur fills an N order, and for all other steps, the rate of each observable signal one step earlier (competitor best quote on that side moved last step; own fill on that side last step; own fill on the other side; age of the swept order; steps remaining under 200; p within 5c of 0 or 1). Give each signal's sweep rate with and without it, and the share of arbitrage loss it precedes."
     }
    }
   ],
   "output": {
    "format": "json",
    "maxBytes": 24000
   }
  }
 ],
 "read": [
  "r3-deepen-current/merge-01",
  "r3-deepen-current/merge-02",
  "r3-deepen-current/merge-03",
  "r3-deepen-current/merge-04",
  "r3-remove-current/merge-01",
  "r3-remove-current/merge-02",
  "r3-fresh-overlay/merge-01",
  "r3-fresh-overlay/merge-02",
  "r3-fresh-overlay/merge-03",
  "r3-fresh-overlay/merge-04",
  "r3-fresh-overlay/merge-05",
  "r3-diagnose-current/d-arb-by-order",
  "r3-diagnose-current/d-oracle-sweep",
  "r3-diagnose-current/d-retail-share",
  "r3-diagnose-current/d-time-price",
  "r3-diagnose-current/d-sweep-signals"
 ],
 "cancel": [],
 "wake": {
  "batches": [
   "r3-deepen-current",
   "r3-remove-current",
   "r3-reference-current",
   "r3-transfer-measure",
   "r3-reference-replica",
   "r3-fresh-overlay",
   "r3-diagnose-current"
  ],
  "afterMinutes": 360
 },
 "finish": false
}
