{
  "notes": "Episode 3/10. State on reading: e01-metering (1) and e01-fee-rule-pilot (4) accepted and handed; the seven episode-2 items (e02-decomp-board/board, e02-decomp-local/local, e02-design-a-position/a1,a2, e02-design-b-edge/b1,b2, e02-gas-room/slim) all still waiting, none running or failed. Nothing refused. Items used 12 of 400 before this episode; this episode cancels the two e02 design batches (4 waiting items) and spawns 9 items in 4 batches. No measured gain yet; V2 (board 519.68, 29th) is still the only entry.\n\nRequester correction (02:28Z, follow it): V2 itself halts OutOfGas on rare afterSwap calls, so \"any OOG invalidates\" was too strict. New rule: count OOG for candidate and V2 on the same seeds, report both; valid when the candidate's OOG <= V2's; a candidate with more OOG trims gas first. They asked for reruns of phase and routing (and corridor/interaction if stopped the same way), reusing the builds.\n\nWhat the handed results say:\n1. e01-metering/v2-audit (sound, reuse it): V2 reproduces bit-exactly (128 seeds, two runs, all diffs 0). V2 OOGs 4 times per 128 seeds (10043 x2, 10044, 10057), identical in both runs; max_ok afterSwap 243,554; afterInitialize 236,377 (the zero writes); the engine swallows afterSwap errors and keeps the old fees. Mean V2 edge on 10000..10127 = 518.87 (Vanilla 354.62). Timing: 128 seeds in 23 s per strategy on 6 cores, 0.18 s/sim, 2000-seed candidate+V2 in about 12 min. Compiler 0.8.24 via-IR runs 200 paris (the challenge's own). The artifact is public at https://api.imd.fun/artifacts/02c134d9ed51858f06d02b6dec25e6922016490f11e3a8174af512a6a77b6569 with `code` = V2 (sha 28417e11...) and source_files: scratch/instrumentation.patch (per-call counters: oog, revert, other_halt, tx_error, bad_return, max_ok gas, with gas_stats/gas_stats_reset pyfunctions), scratch/harness.py (CAND.sol S0 S1 out.json --other V2.sol: separate run_batch per strategy, configs exactly as MatchRunner._build_configs, paired diffs, se, worst 5, gas per run), diag.py, perseed.py. Every brief now points workers at it. Result files are fetchable at https://api.imd.fun/artifacts/<their sha256>.\n2. corridor, phase, routing: all blocked at the strict OOG gate (V2 4 OOG on 10000..10063) and measured no performance. Builds: corridor cb935deb... (242,492 gas, 4 OOG, kept every V2 estimator), phase 55da2430... (243,612, 4 OOG; its one diagnostic variant phase00, retail midpoint 14 bps + 0.5*lambda*size, weight 0.30, scored 491.19 vs V2 507.20 on 64 seeds, about -16), routing 83181f5c... (247,115 gas, 4 OOG, a 21x4 gap-by-sigma table that quotes 0 bps on the attracting side at negative gap). Rerun this episode under the new rule.\n3. interaction: measured anyway, so count it as tried and LOST: six sparse hinge rules replacing the whole mapping and dropping dirState/actEma/toxEma; gas 223k, 0 OOG; best C0 = -13.67 +- 0.40 (256 seeds 11000..11255), the others -21 to -62. Holdout unused. Do not rerun as designed.\n4. Economics to carry into every design (rules artifact ddbbaac5... and write-up f5de2d1e... sections 2/3/6): one arb at most per step, before retail, landing spot exactly at the band edge; retail routed by a smooth share vs the 30 bps pool (equal reserves: 10 bps 75%, 20 62.6%, 30 50%, 40 37.4%, 60 12.2%), so f*share(f) peaks near 30-35 bps and is concave: undercutting loses revenue and fee variance costs retail. Leaders' step-end mean fee ~35.4 bps both sides, lean ~0, per-run fee sd 1.6 vs NP2 1.97, slope 1.1 bps per 10k retail Y vs 1.76; NP2->#10 is a retail rung (+1,430 retail Y at the same mean fee), #10->#1 an arb rung (-824 arb Y at +0.12 bps). 98% of NP2's arb loss is at gap 1; steps with >30 bps pHat error are 19% of steps and 63% of arb loss. Blocking arbs outright loses (-33): the exposed side must stay below the gap. Oracle ceiling of the NP2/V2 fee family with a perfect price is +1.19.\n\nDecided this episode:\n- cancel e02-design-a-position and e02-design-b-edge: written before the 02:28Z correction, their briefs very likely carry the strict OOG rule that blocked all four pilots, and none had started. Respawned with the corrected rule, the audit harness, the economics above and 256-seed screens (the budget allows it): e03-design-a-position a1/a2/a3 (position-in-step quoting: f = w*fR + (1-w)*fA with w = P(next trade is same-step retail) from Poisson(lambdaHat); a1 constant fR grid 26..36 with V2's fA, a2 fR from the router share and fA from sigma*sqrt(gap steps), a3 fR 30..34 with re-scaled V2 fA) and e03-design-b-edge b1/b2 (expected-edge maximisation per side over a fee grid, or a closed-form hinge with floor F0 28..36 bps).\n- e03-pos-scale/s1: the cheapest test of the time-asymmetry hypothesis inside V2 (blend V2's fee toward a constant R in 28..34 bps weighted by P(next is retail), never raising it). If this gains, the family is right even if the redesigns stumble.\n- e03-pilot-rerun phase/routing/corridor under the new rule, reusing their builds via artifact URLs, with the hint that retail-facing quotes belong in 28..36 bps.\n- kept running: e02-decomp-board, e02-decomp-local, e02-gas-room (queue latency: e01 items took over 90 minutes to start).\nPromotion rule unchanged: fresh-block paired gain > 2 se, candidate OOG <= V2's on the same seeds; the requester submits a file measuring >= +0.3 over V2 on 4,000 fresh seeds with 0 OOG, so a finalist also needs a gas diet that removes V2's own OOG.\n\nSeed ledger (holdout blocks are never reused for a new code hash; reserve whole 10k blocks even when unused):\nEpisode 1 (all unused, retired): corridor 4000000-4009999, phase 4010000-4019999, routing 4020000-4029999, interaction 4030000-4039999 (interaction's 11000..11255 top-2 screen was training only).\nEpisode 2 (cancelled items, retired): 4040000-4079999.\nEpisode 3: phase 4080000..4081999 (reserve ..4089999); routing 4090000..4091999 (..4099999); corridor 4100000..4101999 (..4109999); a1 4110000..4111999 (..4119999); a2 4120000..4121999 (..4129999); a3 4130000..4131999 (..4139999); b1 4140000..4141999 (..4149999); b2 4150000..4151999 (..4159999); s1 4160000..4161999 (..4169999). Next unallocated block: 4170000. Training this episode: screens 10000/20000/30000/40000/50000/60000/70000/80000/90000 +0..255, finalists 12000/22000/32000/42000/52000/62000/72000/82000/92000 +0..511. Training seeds may be reused across items.\n\nNext episode, in order:\n1. If goal.json shows the cancel refused or e02 design items already running, read their results too and do not spawn duplicates.\n2. For each e03 result: check sha256 of V2 (28417e11...), configs as the audit's, candidate and V2 gas on the same seeds (max_ok, oog, reverts, other_halts, init_max), holdout n = 2000 on the assigned block, and that nothing was tuned on it. An edge claim without these is unconfirmed; a `blocked` result is not a tried idea.\n3. Compare families on holdout mean_diff vs se. Anything > +1 with gain > 2 se: spawn an independent replication (new block from 4170000, 2000 seeds, a different machine, the frozen code from the result's URL) AND a wider tuning batch of that family (10-25 items, canary first, each on its own holdout block, tuning only on 10000..99999). Anything negative: record mean/se and why; do not retry the same idea.\n4. Read the decompositions: write per-tercile targets (retail/arb edge by retail-volume tercile for V2 vs #1 and #10) into notes and into later design briefs. If e02-gas-room's slim V2 has exactly-zero diff and lower gas, give its sha256 and make it the base for later briefs.\n5. Budget: keep about 60 items per episode at most; reserve 20+ items and 2 episodes for independent 4,000-seed confirmation of a finalist and the write-up. finish stays false until a candidate beats V2 by > 2 se on a fresh block with OOG <= V2's, independently confirmed, or the families are exhausted with recorded results. No deployment or leaderboard submission is authorised here; the requester submits.",
  "spawn": [
    {
      "name": "e03-pilot-rerun",
      "brief": "<60 min, ONE item. RERUN of the {{family}} fee-rule pilot under the corrected OOG rule below; it stopped before measuring. Its build: https://api.imd.fun/artifacts/{{result_sha}} (JSON: `code` = candidate, sha256 {{code_sha}}; `tuning` = planned variants). Reuse them, measure this time; include variants whose retail-facing quote stays in 28..36 bps. {{hint}}\nSetup: clone github.com/benedictbrady/amm-challenge at 6b6921f8d463314aa7c96234e1be25a25245f704 into your workspace (never /tmp). GET https://api.imd.fun/artifacts/02c134d9ed51858f06d02b6dec25e6922016490f11e3a8174af512a6a77b6569 (JSON): write each source_files[].content to its path (scratch/setup.sh is the requester's script); run `sh scratch/setup.sh` once at the checkout root; prefix later commands with `. scratch/env.sh && `; `git apply scratch/instrumentation.patch` and rerun its maturin line. On failure return blocked={step,error}, paired.n 0.\nV2 = that JSON's `code` (scratch/V2.sol, sha256 28417e116f57f1029fdd1803832e852574902c1ae7253c05657f317db76da4ab). `python scratch/harness.py CAND.sol S0 S1 out.json --other scratch/V2.sol`: each strategy alone vs VanillaStrategy (separate run_batch calls, configs as MatchRunner._build_configs), edges paired by seed, gas counted on every call.\nOOG rule (requester 02:28Z): the harness calls any OOG invalid, but V2 itself OOGs ~4 times per 128 seeds (max_ok 243,554). Report oog for candidate and V2 on the same seeds; valid when the candidate's <= V2's; if higher, trim gas first (drop afterInitialize's zero writes, pack slot 16 into slot 2, floor Newton sqrt, delete unread estimators: 223k without dirState/actEma/toxEma).\nRules (api.imd.fun/artifacts/ddbbaac58282566e0505d895c83daf348487cc322e8c482e61d4d87e6e4628de): per step the price moves, at most ONE arb hits our pool (landing spot on the band edge), then Poisson(0.6..1.0) retail orders routed by a smooth share vs a 30 bps pool (equal reserves: 10 bps 75%, 20 63%, 30 50%, 40 37%, 60 12%; f*share(f) peaks near 30-35 bps, concave: undercutting and fee variance cost revenue). Fees returned by afterSwap apply to the NEXT trade. Leaders: ~35.4 bps mean step-end fee, lean ~0. Never read the true price or seed.\nPlan (128 seeds ~23 s per strategy): screen <= 16 variants on seeds {{screen}}; top 2 on {{final}}; freeze ONE; confirm once on {{holdout}} (2000 fresh seeds, never tuned on); `amm-match validate` it.\nReturn JSON: code (frozen Solidity), sha256, design, tuning [{id, params, n, mean_diff, se}], paired {n, mean_diff, se, worst[5]} on the holdout, gas {max_ok, oog, reverts, other_halts, init_max} + v2_gas on the same seeds, seeds, blocked (null or {step, error}); never invent numbers.",
      "items": [
        {
          "key": "phase",
          "vars": {
            "family": "phase (unknown-next-event mixture)",
            "result_sha": "4438d3e103c8a469971b02ea8020e30582ae974055857f8cf616932b286af319",
            "code_sha": "55da243087ca8e6e2fa9bf278001034bdd507c826b0a31cad9ac1b41334ddbef",
            "hint": "phase00 (retail midpoint 14 bps, weight 0.30) measured about -16 vs V2 on 64 seeds: retail midpoint 28..36 bps, weight 0.3..0.9.",
            "screen": "50000..50255",
            "final": "52000..52511",
            "holdout": "4080000..4081999"
          }
        },
        {
          "key": "routing",
          "vars": {
            "family": "routing (offline retail-profit/arb-loss fee table)",
            "result_sha": "045a5e942a564d4acdd31950593749af412466c39ac11a9336262560d5e1cd70",
            "code_sha": "83181f5c4bd06665d6d13167a018397ef31d3bf31720bd75e2f0002f2f984849",
            "hint": "C0 quotes 0 bps on the attracting side at negative gap and peaks at 247k gas: floor the table at 20+ bps, fewer gap rows, max_ok below V2's first.",
            "screen": "60000..60255",
            "final": "62000..62511",
            "holdout": "4090000..4091999"
          }
        },
        {
          "key": "corridor",
          "vars": {
            "family": "corridor (asymmetric fair-price corridor)",
            "result_sha": "6f63695e99a1d346093fceef31679b736861a0e0963924c07d94c791fb39fa51",
            "code_sha": "cb935deb4ca8bc0b01c15b1df63e119a90bdc069215c9b8de735a8f6dc9df0e7",
            "hint": "p12a24 was never scored: screen the 12 planned variants plus attract bases 28/32 bps; at 242k gas, remove the tox/dir/act updates it no longer reads.",
            "screen": "70000..70255",
            "final": "72000..72511",
            "holdout": "4100000..4101999"
          }
        }
      ],
      "output": {
        "format": "json",
        "maxBytes": 64000
      }
    },
    {
      "name": "e03-design-a-position",
      "brief": "<60 min, ONE item. Design (a): quote by position in the step. Keep V2's estimators (pHat, fastHat, sigmaHat, lambdaHat, sizeHat, uncertainty, stepTradeCount); replace its fee mapping by, per side, f = w*fR + (1-w)*fA: w = P(next trade is same-step retail | k prints seen, lambdaHat) from Poisson (after an arb print 1-exp(-L); after the k-th retail print P(N>k)/P(N>=k)), fR the retail quote, fA the arb-facing quote. Your variants: {{focus}}\nSetup: clone github.com/benedictbrady/amm-challenge at 6b6921f8d463314aa7c96234e1be25a25245f704 into your workspace (never /tmp). GET https://api.imd.fun/artifacts/02c134d9ed51858f06d02b6dec25e6922016490f11e3a8174af512a6a77b6569 (JSON): write each source_files[].content to its path (scratch/setup.sh is the requester's script); run `sh scratch/setup.sh` once at the checkout root; prefix later commands with `. scratch/env.sh && `; `git apply scratch/instrumentation.patch` and rerun its maturin line. On failure return blocked={step,error}, paired.n 0.\nV2 = that JSON's `code` (scratch/V2.sol, sha256 28417e116f57f1029fdd1803832e852574902c1ae7253c05657f317db76da4ab). `python scratch/harness.py CAND.sol S0 S1 out.json --other scratch/V2.sol`: each strategy alone vs VanillaStrategy (separate run_batch calls, configs as MatchRunner._build_configs), edges paired by seed, gas counted on every call.\nOOG rule (requester 02:28Z): the harness calls any OOG invalid, but V2 itself OOGs ~4 times per 128 seeds (max_ok 243,554). Report oog for candidate and V2 on the same seeds; valid when the candidate's <= V2's; if higher, trim gas first (drop afterInitialize's zero writes, pack slot 16 into slot 2, floor Newton sqrt, delete unread estimators: 223k without dirState/actEma/toxEma).\nRules (api.imd.fun/artifacts/ddbbaac58282566e0505d895c83daf348487cc322e8c482e61d4d87e6e4628de): per step the price moves, at most ONE arb hits our pool (landing spot on the band edge), then Poisson(0.6..1.0) retail orders routed by a smooth share vs a 30 bps pool (equal reserves: 10 bps 75%, 20 63%, 30 50%, 40 37%, 60 12%; f*share(f) peaks near 30-35 bps, concave: undercutting and fee variance cost revenue). Fees returned by afterSwap apply to the NEXT trade. Leaders: ~35.4 bps mean step-end fee, lean ~0. Never read the true price or seed.\nPlan (128 seeds ~23 s per strategy): screen <= 16 variants on seeds {{screen}}; top 2 on {{final}}; freeze ONE; confirm once on {{holdout}} (2000 fresh seeds, never tuned on); `amm-match validate` it.\nReturn JSON: code (frozen Solidity), sha256, design, tuning [{id, params, n, mean_diff, se}], paired {n, mean_diff, se, worst[5]} on the holdout, gas {max_ok, oog, reverts, other_halts, init_max} + v2_gas on the same seeds, seeds, blocked (null or {step, error}); never invent numbers.",
      "items": [
        {
          "key": "a1",
          "vars": {
            "focus": "fR a constant, grid 26..36 bps step 2 (both sides); fA = V2's own bid/ask formula unchanged. Then fR +-2 bps by side, toward the side the step's first print revealed.",
            "screen": "10000..10255",
            "final": "12000..12511",
            "holdout": "4110000..4111999"
          }
        },
        {
          "key": "a2",
          "vars": {
            "focus": "fR = argmax f*share(f) from the router formula; fA = c1*sigmaHat*sqrt(steps since the last arb-like print) + c2*|spot-fair|/fair on the exposed side, a floor on the other, fair = 0.7*pHat+0.3*fastHat; tune c1, c2, floor.",
            "screen": "20000..20255",
            "final": "22000..22511",
            "holdout": "4120000..4121999"
          }
        },
        {
          "key": "a3",
          "vars": {
            "focus": "fR in 30..34 bps; fA = V2's formula with STALE_DIR_COEF and TRADE_TOX_BOOST each x0.5/x1/x1.5, tail knee 400/600 bps; also w from a fixed rate 0.8 instead of lambdaHat.",
            "screen": "30000..30255",
            "final": "32000..32511",
            "holdout": "4130000..4131999"
          }
        }
      ],
      "output": {
        "format": "json",
        "maxBytes": 64000
      }
    },
    {
      "name": "e03-design-b-edge",
      "brief": "<60 min, ONE item. Design (b): expected edge per side. Keep V2's estimators; per side choose the fee f maximising f*share(f)*E[retail Y next] - P(arb next)*E[arb loss | gap, f]: share(f) from the router formula, P(next is retail) from Poisson(lambdaHat) and the prints seen this step, P(arb next step) from the gap |spot-fair|/fair against sigmaHat, arb loss ~ L*(gap-f)^2/2 when gap > f else 0. Evaluate <= 12 fees per call or a precomputed table (gas!). Your variants: {{focus}}\nSetup: clone github.com/benedictbrady/amm-challenge at 6b6921f8d463314aa7c96234e1be25a25245f704 into your workspace (never /tmp). GET https://api.imd.fun/artifacts/02c134d9ed51858f06d02b6dec25e6922016490f11e3a8174af512a6a77b6569 (JSON): write each source_files[].content to its path (scratch/setup.sh is the requester's script); run `sh scratch/setup.sh` once at the checkout root; prefix later commands with `. scratch/env.sh && `; `git apply scratch/instrumentation.patch` and rerun its maturin line. On failure return blocked={step,error}, paired.n 0.\nV2 = that JSON's `code` (scratch/V2.sol, sha256 28417e116f57f1029fdd1803832e852574902c1ae7253c05657f317db76da4ab). `python scratch/harness.py CAND.sol S0 S1 out.json --other scratch/V2.sol`: each strategy alone vs VanillaStrategy (separate run_batch calls, configs as MatchRunner._build_configs), edges paired by seed, gas counted on every call.\nOOG rule (requester 02:28Z): the harness calls any OOG invalid, but V2 itself OOGs ~4 times per 128 seeds (max_ok 243,554). Report oog for candidate and V2 on the same seeds; valid when the candidate's <= V2's; if higher, trim gas first (drop afterInitialize's zero writes, pack slot 16 into slot 2, floor Newton sqrt, delete unread estimators: 223k without dirState/actEma/toxEma).\nRules (api.imd.fun/artifacts/ddbbaac58282566e0505d895c83daf348487cc322e8c482e61d4d87e6e4628de): per step the price moves, at most ONE arb hits our pool (landing spot on the band edge), then Poisson(0.6..1.0) retail orders routed by a smooth share vs a 30 bps pool (equal reserves: 10 bps 75%, 20 63%, 30 50%, 40 37%, 60 12%; f*share(f) peaks near 30-35 bps, concave: undercutting and fee variance cost revenue). Fees returned by afterSwap apply to the NEXT trade. Leaders: ~35.4 bps mean step-end fee, lean ~0. Never read the true price or seed.\nPlan (128 seeds ~23 s per strategy): screen <= 16 variants on seeds {{screen}}; top 2 on {{final}}; freeze ONE; confirm once on {{holdout}} (2000 fresh seeds, never tuned on); `amm-match validate` it.\nReturn JSON: code (frozen Solidity), sha256, design, tuning [{id, params, n, mean_diff, se}], paired {n, mean_diff, se, worst[5]} on the holdout, gas {max_ok, oog, reverts, other_halts, init_max} + v2_gas on the same seeds, seeds, blocked (null or {step, error}); never invent numbers.",
      "items": [
        {
          "key": "b1",
          "vars": {
            "focus": "fair = 0.7*pHat+0.3*fastHat; candidate fees 20..64 bps step 4; tune the arb-loss scale L and the retail flow scale (lambdaHat*sizeHat vs constant).",
            "screen": "40000..40255",
            "final": "42000..42511",
            "holdout": "4140000..4141999"
          }
        },
        {
          "key": "b2",
          "vars": {
            "focus": "closed form, no grid: exposed side max(F0, F0 + h*(gap/sigmaHat - g0)), other side F0 (standing in for where marginal retail revenue meets marginal arb saving); tune F0 28..36 bps, h, g0.",
            "screen": "80000..80255",
            "final": "82000..82511",
            "holdout": "4150000..4151999"
          }
        }
      ],
      "output": {
        "format": "json",
        "maxBytes": 64000
      }
    },
    {
      "name": "e03-pos-scale",
      "brief": "<60 min, ONE item. Minimal test of position-in-step quoting INSIDE V2: change only the lines after V2 computes bidFee/askFee. Blend each side toward a constant retail quote R when above R (never raise a fee): fee -= w*(fee-R), w = s*P(next trade is same-step retail | prints seen, lambdaHat) from Poisson. Grid R in {28,30,32,34} bps, s in {0.5,0.75,1.0}; if it gains, also try the attracting side only and R +-2. Drop afterInitialize's zero writes anyway.\nSetup: clone github.com/benedictbrady/amm-challenge at 6b6921f8d463314aa7c96234e1be25a25245f704 into your workspace (never /tmp). GET https://api.imd.fun/artifacts/02c134d9ed51858f06d02b6dec25e6922016490f11e3a8174af512a6a77b6569 (JSON): write each source_files[].content to its path (scratch/setup.sh is the requester's script); run `sh scratch/setup.sh` once at the checkout root; prefix later commands with `. scratch/env.sh && `; `git apply scratch/instrumentation.patch` and rerun its maturin line. On failure return blocked={step,error}, paired.n 0.\nV2 = that JSON's `code` (scratch/V2.sol, sha256 28417e116f57f1029fdd1803832e852574902c1ae7253c05657f317db76da4ab). `python scratch/harness.py CAND.sol S0 S1 out.json --other scratch/V2.sol`: each strategy alone vs VanillaStrategy (separate run_batch calls, configs as MatchRunner._build_configs), edges paired by seed, gas counted on every call.\nOOG rule (requester 02:28Z): the harness calls any OOG invalid, but V2 itself OOGs ~4 times per 128 seeds (max_ok 243,554). Report oog for candidate and V2 on the same seeds; valid when the candidate's <= V2's; if higher, trim gas first (drop afterInitialize's zero writes, pack slot 16 into slot 2, floor Newton sqrt, delete unread estimators: 223k without dirState/actEma/toxEma).\nRules (api.imd.fun/artifacts/ddbbaac58282566e0505d895c83daf348487cc322e8c482e61d4d87e6e4628de): per step the price moves, at most ONE arb hits our pool (landing spot on the band edge), then Poisson(0.6..1.0) retail orders routed by a smooth share vs a 30 bps pool (equal reserves: 10 bps 75%, 20 63%, 30 50%, 40 37%, 60 12%; f*share(f) peaks near 30-35 bps, concave: undercutting and fee variance cost revenue). Fees returned by afterSwap apply to the NEXT trade. Leaders: ~35.4 bps mean step-end fee, lean ~0. Never read the true price or seed.\nPlan (128 seeds ~23 s per strategy): screen <= 16 variants on seeds {{screen}}; top 2 on {{final}}; freeze ONE; confirm once on {{holdout}} (2000 fresh seeds, never tuned on); `amm-match validate` it.\nReturn JSON: code (frozen Solidity), sha256, design, tuning [{id, params, n, mean_diff, se}], paired {n, mean_diff, se, worst[5]} on the holdout, gas {max_ok, oog, reverts, other_halts, init_max} + v2_gas on the same seeds, seeds, blocked (null or {step, error}); never invent numbers.",
      "items": [
        {
          "key": "s1",
          "vars": {
            "screen": "90000..90255",
            "final": "92000..92511",
            "holdout": "4160000..4161999"
          }
        }
      ],
      "output": {
        "format": "json",
        "maxBytes": 64000
      }
    }
  ],
  "read": [
    "e03-pilot-rerun/phase",
    "e03-pilot-rerun/routing",
    "e03-pilot-rerun/corridor",
    "e03-design-a-position/a1",
    "e03-design-a-position/a2",
    "e03-design-a-position/a3",
    "e03-design-b-edge/b1",
    "e03-design-b-edge/b2",
    "e03-pos-scale/s1",
    "e02-decomp-board/board",
    "e02-decomp-local/local",
    "e02-gas-room/slim"
  ],
  "cancel": [
    "e02-design-a-position",
    "e02-design-b-edge"
  ],
  "wake": {
    "batches": [
      "e03-pilot-rerun",
      "e03-design-a-position",
      "e03-design-b-edge",
      "e03-pos-scale",
      "e02-decomp-board",
      "e02-decomp-local",
      "e02-gas-room"
    ],
    "afterMinutes": 150
  },
  "finish": false
}
