{
  "key": "seg-a",
  "approach": "Immutable legacy stock-entry-gate transfer audit against current incumbent; prescribed block a only.",
  "tried": [
    "One paired comparison on seeds 420000..420499; no tuning or source edits."
  ],
  "next": "Aggregate this block with the other prescribed transfer-audit blocks; this block is not finalist evidence and cannot authorize promotion.",
  "code": "\"\"\"Stale-quote defence with tick probes, a sub-tick belief and cheap YES stock.\n\nEvery step the arbitrageur removes any order on the wrong side of p, so tiny\ntwo-sided probes around the estimate locate p to a tick; a grid filter narrows\nthat further.  Quotes sit one tick inside the competitor and are sized by the\nmarginal rule: one more share is worth quoting while the chance a retail order\nreaches it, times its edge, exceeds the expected arbitrage loss.  Near p=0 a\nretail buy pays almost its whole notional as edge, so YES is held to cover low\nasks.  That YES is bought when it is cheap: a large bid rests at tick 1 while p\nis above it, so the arbitrageur fills it on the crossing for about 0.1 tick a\nshare instead of nearly a full tick once p is near zero, and smaller bids sit on\nwhichever tick p is within 0.15 of.  Below tick 1 the estimate of p decays with\nthe time spent there, since no probe can see it.\n\"\"\"\nimport math\nfrom orderbook_pm_challenge.strategy import BaseStrategy\nfrom orderbook_pm_challenge.types import CancelOrder, PlaceOrder, Side\n\nP = dict(lam_r=0.25, m=5.0, sig_n=1.2, lam_j=0.0019, sig_j=0.35, sig=0.02,\n         qmax=3000.0, rmin=2, kA=0.7, kL=0.15, pL=0.05,\n         ammo=1.0, ydem=0.4, W=200.0, fy=0.6, ammo_q=60.0, ammo_pmax=0.05, ammo_maxpay=0.02,\n         fb=0.9, fu=0.7, xu=0.1, sticky=1.0, min_ahead=2.0, keep_hi=1.5, keep_lo=0.7, Hu=300.0, bins=8.0, filt=1.0, uni=0.01, jumpinfo=1.0, dmin=0.0, kLb=0.08, kLf=0.08, pinf=1.0, pre=0.0, H1=100.0,\n         ydf=0.6, Wf=2000.0, g_hi=0.15, g_lo=0.15, qf=400.0, pmaxf=0.05, pre_gap=1.0,\n         ydf1=0.6, g1=5.0, f1=0.6, a1=100.0, nb1=0.0, gs=1.0, p1t=1.0, m1=1.0, zd=1.0, pfl=0.0005)\nP.update({'W': 50, 'ammo_pmax': 0.02, 'fy': 0.7, 'fu': 0.25, 'Hu': 500})\nC = {'W': 50, 'ammo_pmax': 0.02, 'fy': 0.7, 'reserve': 200, 'scar': 0.0025, 'fu': 0.25, 'Hu': 500}\nSQ2 = math.sqrt(2.0)\nSQ2PI = math.sqrt(2.0 * math.pi)\ndef cdf(x): return 0.5 * (1.0 + math.erf(x / SQ2))\ndef pdf(x): return math.exp(-0.5 * x * x) / SQ2PI\ndef inv(p):\n    p = min(max(p, 1e-9), 1 - 1e-9)\n    t = math.sqrt(-2.0 * math.log(min(p, 1 - p)))\n    x = t - (2.515517 + 0.802853 * t + 0.010328 * t * t) / (1 + 1.432788 * t + 0.189269 * t * t + 0.001308 * t ** 3)\n    x = -x if p < 0.5 else x\n    for _ in range(2):\n        d = pdf(x)\n        if d < 1e-12:\n            break\n        x -= (cdf(x) - p) / d\n    return x\ndef lpm(k):\n    return pdf(k) + k * cdf(k)\ndef fl(q):\n    return math.floor(q * 100 + 1e-9) / 100\n\nNODES = [(-2.2, .06), (-1.3, .17), (-0.6, .27), (0.6, .27), (1.3, .17), (2.2, .06)]\nPROBE = 0.01\n\n\nclass Strategy(BaseStrategy):\n    def __init__(self):\n        self.n = 0\n        self.ahead = set()     # main orders placed strictly ahead of any competitor order at their tick\n        self.res = {}          # order id -> uncovered quantity at placement\n        self.bc = None         # belief: sub-tick grid centres (ticks)\n        self.bw = None         # belief: weights\n        self.st = 0.5          # last one-step sd in ticks\n        self.pcb = self.pca = None\n        self.pb = set()\n        self.pa = set()\n        self.tb = 0\n        self.s = None          # competitor spread parameter\n\n    def _oid(self, tag):\n        self.n += 1\n        return tag + str(self.n)\n\n    def on_step(self, state):\n        H = max(1, state.steps_remaining)\n        cb = state.competitor_best_bid_ticks or 0\n        ca = state.competitor_best_ask_ticks or 100\n        if self.s is None:\n            self.s = max(1, (ca - cb + 1) // 2)\n        lo, hi = cb, ca\n        for o in state.own_orders:\n            if o.side is Side.BUY:\n                lo = max(lo, o.price_ticks)\n            else:\n                hi = min(hi, o.price_ticks)\n        if P['pinf'] > 0:\n            sb = {o.price_ticks for o in state.own_orders if o.side is Side.BUY and o.remaining_quantity <= PROBE + 1e-9}\n            sa = {o.price_ticks for o in state.own_orders if o.side is Side.SELL and o.remaining_quantity <= PROBE + 1e-9}\n            ea = self.pa - sa\n            eb = self.pb - sb\n            if sa and ea:\n                lo = max(lo, min(max(ea), hi))\n            if eb and (sb or min(eb) <= P['p1t']):\n                hi = min(hi, max(min(eb), lo))\n        if P['jumpinfo'] > 0 and self.pcb is not None:\n            if ca > self.pca + 1:\n                lo = max(lo, ca - 1)\n            if cb < self.pcb - 1:\n                hi = min(hi, cb + 1)\n        self.pcb, self.pca = cb, ca\n        if lo > hi:\n            lo, hi = hi, lo\n        # sub-tick belief over p_(t-1): predict with one-step noise, truncate to [lo, hi]\n        wid = max(hi - lo, 1e-6)\n        nb = max(2, min(48, int(round(wid * P['bins']))))\n        cs = [lo + (i + 0.5) * wid / nb for i in range(nb)]\n        if self.bc is None or P['filt'] <= 0:\n            ws = [1.0 / nb] * nb\n        else:\n            sg = max(self.st, 0.6 * wid / nb)\n            k = -0.5 / (sg * sg)\n            ws = []\n            uni = P['uni'] * sg\n            for c in cs:\n                t = uni\n                for ci, wi in zip(self.bc, self.bw):\n                    d = c - ci\n                    d2 = d * d * k\n                    if d2 > -12.5:\n                        t += wi * math.exp(d2)\n                ws.append(t)\n            tot = sum(ws)\n            ws = [w / tot for w in ws]\n        self.bc, self.bw = cs, ws\n        mean_t = sum(c * w for c, w in zip(cs, ws))\n        var_t = max(sum(c * c * w for c, w in zip(cs, ws)) - mean_t * mean_t, 0.0)\n        phat = min(max(mean_t / 100.0, 0.002), 0.998)\n        var = P['sig'] ** 2 + P['lam_j'] * P['sig_j'] ** 2\n        sd = math.sqrt(H * var)\n        self.tb = self.tb + 1 if hi <= 1 else 0\n        if self.tb > 0 and P['zd'] > 0:\n            # below the last tick there is no probe: the score keeps walking away from it\n            phat = min(phat, max(P['pfl'], cdf(inv(0.01) - P['zd'] * 0.02 * math.sqrt(self.tb) / sd)))\n        z = inv(phat)\n        Z = z * sd\n        sp = pdf(z) / sd * P['sig']\n        self.st = sp * 100.0\n        s = math.sqrt(sp * sp + var_t / 1e4 + 1e-8)\n        sd1 = math.sqrt(max(1.0, H - 1.0) * var)\n        jp = [(cdf((Z + n * P['sig_j']) / sd1), w) for n, w in NODES]\n        lj = P['lam_j']\n\n        def AB(x):\n            k = (x - phat) / s\n            a = s * lpm(k)\n            b = a - (x - phat)\n            ja = sum(w * max(0.0, x - p) for p, w in jp)\n            jb = sum(w * max(0.0, p - x) for p, w in jp)\n            return (1 - lj) * a + lj * ja, (1 - lj) * b + lj * jb\n\n        if H == 1:\n            def AB(x):\n                return (1 - phat) * x, phat * (1 - x)\n        rho = P['lam_r'] * 0.5\n        mu = math.log(P['m']) - 0.5 * P['sig_n'] ** 2\n        kA = P['kL'] if phat < P['pL'] else P['kA']\n\n        def qsize(loss, gain, px):\n            loss *= kA\n            if gain <= 0:\n                return 0.0\n            tail = loss / (rho * gain)\n            if tail >= 1.0:\n                return 0.0\n            return min(P['qmax'], math.exp(mu + P['sig_n'] * inv(1 - max(tail, 1e-6))) / px)\n\n        ptk = phat * 100\n        def qbid(t):\n            if not 1 <= t <= 99:\n                return 0.0\n            a, b = AB(t / 100.0)\n            if phat * 100 - t < P['dmin']:\n                return 0.0\n            if P['nb1'] > 0 and self.s == 1 and t == 1 and ptk < 1.0:\n                return 0.0\n            if phat < P['pL']:\n                ytg = P['ydem'] * min(H, P['W']) / max(ca - 1, ptk + 1) * 100.0\n                a *= (P['kLb'] if state.yes_inventory < ytg else P['kLf']) / P['kL']\n            return qsize(a, b, max(phat, 0.05))\n\n        def qask(t):\n            if not 1 <= t <= 99:\n                return 0.0\n            a, b = AB(t / 100.0)\n            if t - phat * 100 < P['dmin']:\n                return 0.0\n            if phat < C.get('scar_p', .1):\n                a = max(0.0, a - C.get('scar', 0.0) * (1 - min(1.0, state.yes_inventory / C.get('stock', 3000.0))))\n            return min(C.get('askcap', P['qmax']), qsize(b, a, t / 100.0))\n\n        bids = [o for o in state.own_orders if o.side is Side.BUY and o.remaining_quantity > PROBE + 1e-9]\n        asks = [o for o in state.own_orders if o.side is Side.SELL and o.remaining_quantity > PROBE + 1e-9]\n        sticky = P['sticky'] > 0\n        def top(orders, comp, step):\n            if sticky and sum(o.remaining_quantity for o in orders if o.price_ticks == comp and o.order_id in self.ahead) >= P['min_ahead']:\n                return comp\n            return comp + step\n        bid_t = top(bids, cb, 1)\n        ask_t = top(asks, ca, -1)\n        qb = min(C.get('bidcap', 3000.0), qbid(bid_t))\n        qa = qask(ask_t)\n\n        Y = state.yes_inventory\n        if ask_t == 1 and H > P['H1'] and P['pre'] > 0:\n            qa = qa if Y >= P['a1'] > 0 else 0.0          # let the competitor's 2-tick ask erode instead of fronting it for nothing\n        # ammunition: hold YES so that low asks are covered\n        ptick = phat * 100\n        amt = 0\n        qam = 0.0\n        if P['ammo'] > 0 and ask_t >= 2 and phat < max(P['ammo_pmax'], P['pmaxf']):\n            wealth = state.cash + Y * phat\n            x = max(ask_t, ptick + 1) / 100.0\n            capw = P['fy'] * wealth / max(phat, 0.005)\n            target = min(P['ydem'] * min(H, P['W']) / x, capw)\n            full = min(P['ydf'] * min(H, P['Wf']) / x, capw) if phat < P['pmaxf'] else 0.0\n            t = max(1, min(99, int(math.ceil(ptick + 1e-9))))\n            g = t - ptick\n            if Y < full and g <= P['g_hi'] and bid_t <= t < ask_t:\n                amt, qam = t, min(P['qf'], full - Y)     # a tick p has just crossed: nearly free\n            elif Y < target and phat < P['ammo_pmax'] and bid_t <= t < ask_t and t / 100.0 - phat < P['ammo_maxpay']:\n                amt, qam = t, min(P['ammo_q'], target - Y)\n            elif Y < full and t >= 2 and 1.0 - g <= P['g_lo']:\n                amt, qam = t - 1, min(P['qf'], full - Y)  # rest just under p: filled only on the crossing, or by retail\n\n        if P['pre'] > 0 and ca == 2 and phat < 0.01 and H > P['H1'] and Y < P['pre'] and not qam and 1.0 - ptick < P['pre_gap']:\n            amt, qam = 1, min(P['ammo_q'], P['pre'] - Y)\n        q1 = 0.0\n        if P['ydf1'] > 0 and P['m1'] < ptick and cb <= 1 and amt != 1:\n            q1 = max(0.0, P['ydf1'] * min(H, P['Wf']) / (self.s / 100.0) - Y)\n        # order management\n        actions = []\n        free = state.free_cash - 2.0\n        keep_ask = 0.0\n        new_b = []\n        new_a = []\n        def cancel(o):\n            nonlocal free\n            actions.append(CancelOrder(o.order_id))\n            x = o.price_ticks / 100.0\n            if o.side is Side.BUY:\n                free += x * o.remaining_quantity\n            else:\n                free += (1 - x) * min(self.res.get(o.order_id, 0.0), o.remaining_quantity)\n            self.ahead.discard(o.order_id)\n            self.res.pop(o.order_id, None)\n        for o in state.own_orders:\n            if o.remaining_quantity <= PROBE + 1e-9:\n                cancel(o)\n        kept_ids = set()\n        def manage(orders, t, q, comp):\n            kept = 0.0\n            for o in orders:\n                if not (C.get('recover', 0) and o.side is Side.SELL and t < comp and self.res.get(o.order_id, 0.0) > 1 and state.yes_inventory > C.get('recover_yes', 1) and state.free_cash < C.get('recover_cash', 200)) and o.price_ticks == t and q > 0 and kept + o.remaining_quantity <= max(q * P['keep_hi'], 1.0):\n                    kept += o.remaining_quantity\n                    kept_ids.add(o.order_id)\n                else:\n                    cancel(o)\n            return kept\n        kb = manage(bids, bid_t, qb, cb)\n        ka = manage(asks, ask_t, qa, ca)\n        add_b = (qb - kb) if (kb < qb * P['keep_lo'] and bid_t != cb) else 0.0\n        add_a = (qa - ka) if (ka < qa * P['keep_lo'] and ask_t != ca) else 0.0\n\n        budget = P['fb'] * max(free, 0.0)\n        cost = add_b * bid_t / 100.0 + qam * amt / 100.0\n        if cost > budget:\n            f = budget / cost\n            add_b *= f\n            qam *= f\n            cost = budget\n        out = []\n        q1 = min(q1, P['f1'] * max(budget - cost, 0.0) * 100.0)\n        if q1 >= 0.01:\n            out.append(PlaceOrder(side=Side.BUY, price_ticks=1, quantity=fl(q1)))\n            free -= fl(q1) / 100.0 + 1e-6\n        if amt and qam >= 0.01:\n            q = fl(qam)\n            out.append(PlaceOrder(side=Side.BUY, price_ticks=amt, quantity=q))\n            free -= q * amt / 100.0 + 1e-6\n        if bid_t >= 1 and add_b >= 0.01:\n            q = fl(add_b)\n            oid = self._oid('b')\n            out.append(PlaceOrder(side=Side.BUY, price_ticks=bid_t, quantity=q, client_order_id=oid))\n            free -= q * bid_t / 100.0 + 1e-6\n            if bid_t > cb:\n                self.ahead.add(oid)\n        if ask_t <= 99 and add_a >= 0.01:\n            x = ask_t / 100.0\n            covk = sum(o.remaining_quantity - min(self.res.get(o.order_id, 0.0), o.remaining_quantity)\n                       for o in asks if o.order_id in kept_ids)\n            cov = max(0.0, Y - covk - 0.1)\n            unc = max(0.0, add_a - cov)\n            if unc > 0:\n                ub = max(0.0, free - (1 - P['fu']) * max(state.cash, 0.0)) if x >= P['xu'] else 0.0\n                if H < P['Hu'] and phat < 0.05:\n                    ub = max(0.0, free * (1 - H / P['Hu']))\n                ub = min(ub, max(0.0, free - C.get('reserve', 0.0) * min(1.0, H / C.get('release', 50.0))))\n                unc = min(unc, ub / (1 - x))\n            q = fl(min(add_a, cov + unc))\n            if q >= 0.01:\n                oid = self._oid('a')\n                out.append(PlaceOrder(side=Side.SELL, price_ticks=ask_t, quantity=q, client_order_id=oid))\n                r = max(0.0, q - cov)\n                self.res[oid] = r\n                free -= r * (1 - x) + 1e-6\n                if ask_t < ca:\n                    self.ahead.add(oid)\n\n        # probes: tiny orders that the arbitrageur removes when p crosses them\n        f = int(math.floor(ptick + 1e-9))\n        r = max(int(P['rmin']), int(math.ceil(2.0 * s * 100)))\n        self.pb = set()\n        self.pa = set()\n        if free > 1.0:\n            for t in range(f, f + r + 1):\n                if cb < t < ca and 1 <= t <= 99:\n                    out.append(PlaceOrder(side=Side.BUY, price_ticks=t, quantity=PROBE))\n                    self.pb.add(t)\n            for t in range(f + 1 - r, f + 2):\n                if cb < t < ca and 1 <= t <= 99:\n                    out.append(PlaceOrder(side=Side.SELL, price_ticks=t, quantity=PROBE))\n                    self.pa.add(t)\n        return actions + out\n",
  "code_sha256": "a709c7e85c7dc5200cba83d854cc7ecc9cee8a70915ca79798504da648e9ebed",
  "incumbent_code_sha256": "bf0d179f3e47d28819f6fa7e0d25548c2ced43374c216d36460b00a26a26ffae",
  "tuning": null,
  "paired": {
    "n": 500,
    "sum_d": -892.0184195776,
    "sum_d2": 89575.30340327327,
    "mean_diff": -1.7840368391552,
    "se": 0.5938357690197702,
    "C_mean_total_edge": 102.0960918318298,
    "C_mean_retail_edge": 127.6582167411458,
    "C_mean_arb_edge": -25.56212490926,
    "B_mean_total_edge": 103.880128670985,
    "B_mean_retail_edge": 130.576777533975,
    "B_mean_arb_edge": -26.6966488629628,
    "C_mean_edge": 102.0960918318298,
    "B_mean_edge": 103.880128670985,
    "retail_diff": -2.9185607928292012,
    "arb_diff": 1.1345239537028002,
    "seeds": {
      "start": 420000,
      "end": 420499,
      "inclusive": true,
      "completed": [
        420000,
        420001,
        420002,
        420003,
        420004,
        420005,
        420006,
        420007,
        420008,
        420009,
        420010,
        420011,
        420012,
        420013,
        420014,
        420015,
        420016,
        420017,
        420018,
        420019,
        420020,
        420021,
        420022,
        420023,
        420024,
        420025,
        420026,
        420027,
        420028,
        420029,
        420030,
        420031,
        420032,
        420033,
        420034,
        420035,
        420036,
        420037,
        420038,
        420039,
        420040,
        420041,
        420042,
        420043,
        420044,
        420045,
        420046,
        420047,
        420048,
        420049,
        420050,
        420051,
        420052,
        420053,
        420054,
        420055,
        420056,
        420057,
        420058,
        420059,
        420060,
        420061,
        420062,
        420063,
        420064,
        420065,
        420066,
        420067,
        420068,
        420069,
        420070,
        420071,
        420072,
        420073,
        420074,
        420075,
        420076,
        420077,
        420078,
        420079,
        420080,
        420081,
        420082,
        420083,
        420084,
        420085,
        420086,
        420087,
        420088,
        420089,
        420090,
        420091,
        420092,
        420093,
        420094,
        420095,
        420096,
        420097,
        420098,
        420099,
        420100,
        420101,
        420102,
        420103,
        420104,
        420105,
        420106,
        420107,
        420108,
        420109,
        420110,
        420111,
        420112,
        420113,
        420114,
        420115,
        420116,
        420117,
        420118,
        420119,
        420120,
        420121,
        420122,
        420123,
        420124,
        420125,
        420126,
        420127,
        420128,
        420129,
        420130,
        420131,
        420132,
        420133,
        420134,
        420135,
        420136,
        420137,
        420138,
        420139,
        420140,
        420141,
        420142,
        420143,
        420144,
        420145,
        420146,
        420147,
        420148,
        420149,
        420150,
        420151,
        420152,
        420153,
        420154,
        420155,
        420156,
        420157,
        420158,
        420159,
        420160,
        420161,
        420162,
        420163,
        420164,
        420165,
        420166,
        420167,
        420168,
        420169,
        420170,
        420171,
        420172,
        420173,
        420174,
        420175,
        420176,
        420177,
        420178,
        420179,
        420180,
        420181,
        420182,
        420183,
        420184,
        420185,
        420186,
        420187,
        420188,
        420189,
        420190,
        420191,
        420192,
        420193,
        420194,
        420195,
        420196,
        420197,
        420198,
        420199,
        420200,
        420201,
        420202,
        420203,
        420204,
        420205,
        420206,
        420207,
        420208,
        420209,
        420210,
        420211,
        420212,
        420213,
        420214,
        420215,
        420216,
        420217,
        420218,
        420219,
        420220,
        420221,
        420222,
        420223,
        420224,
        420225,
        420226,
        420227,
        420228,
        420229,
        420230,
        420231,
        420232,
        420233,
        420234,
        420235,
        420236,
        420237,
        420238,
        420239,
        420240,
        420241,
        420242,
        420243,
        420244,
        420245,
        420246,
        420247,
        420248,
        420249,
        420250,
        420251,
        420252,
        420253,
        420254,
        420255,
        420256,
        420257,
        420258,
        420259,
        420260,
        420261,
        420262,
        420263,
        420264,
        420265,
        420266,
        420267,
        420268,
        420269,
        420270,
        420271,
        420272,
        420273,
        420274,
        420275,
        420276,
        420277,
        420278,
        420279,
        420280,
        420281,
        420282,
        420283,
        420284,
        420285,
        420286,
        420287,
        420288,
        420289,
        420290,
        420291,
        420292,
        420293,
        420294,
        420295,
        420296,
        420297,
        420298,
        420299,
        420300,
        420301,
        420302,
        420303,
        420304,
        420305,
        420306,
        420307,
        420308,
        420309,
        420310,
        420311,
        420312,
        420313,
        420314,
        420315,
        420316,
        420317,
        420318,
        420319,
        420320,
        420321,
        420322,
        420323,
        420324,
        420325,
        420326,
        420327,
        420328,
        420329,
        420330,
        420331,
        420332,
        420333,
        420334,
        420335,
        420336,
        420337,
        420338,
        420339,
        420340,
        420341,
        420342,
        420343,
        420344,
        420345,
        420346,
        420347,
        420348,
        420349,
        420350,
        420351,
        420352,
        420353,
        420354,
        420355,
        420356,
        420357,
        420358,
        420359,
        420360,
        420361,
        420362,
        420363,
        420364,
        420365,
        420366,
        420367,
        420368,
        420369,
        420370,
        420371,
        420372,
        420373,
        420374,
        420375,
        420376,
        420377,
        420378,
        420379,
        420380,
        420381,
        420382,
        420383,
        420384,
        420385,
        420386,
        420387,
        420388,
        420389,
        420390,
        420391,
        420392,
        420393,
        420394,
        420395,
        420396,
        420397,
        420398,
        420399,
        420400,
        420401,
        420402,
        420403,
        420404,
        420405,
        420406,
        420407,
        420408,
        420409,
        420410,
        420411,
        420412,
        420413,
        420414,
        420415,
        420416,
        420417,
        420418,
        420419,
        420420,
        420421,
        420422,
        420423,
        420424,
        420425,
        420426,
        420427,
        420428,
        420429,
        420430,
        420431,
        420432,
        420433,
        420434,
        420435,
        420436,
        420437,
        420438,
        420439,
        420440,
        420441,
        420442,
        420443,
        420444,
        420445,
        420446,
        420447,
        420448,
        420449,
        420450,
        420451,
        420452,
        420453,
        420454,
        420455,
        420456,
        420457,
        420458,
        420459,
        420460,
        420461,
        420462,
        420463,
        420464,
        420465,
        420466,
        420467,
        420468,
        420469,
        420470,
        420471,
        420472,
        420473,
        420474,
        420475,
        420476,
        420477,
        420478,
        420479,
        420480,
        420481,
        420482,
        420483,
        420484,
        420485,
        420486,
        420487,
        420488,
        420489,
        420490,
        420491,
        420492,
        420493,
        420494,
        420495,
        420496,
        420497,
        420498,
        420499
      ]
    },
    "complete": true,
    "by_spread": {
      "1": {
        "n": 128,
        "sum_d": -282.7681147936,
        "sum_d2": 36325.13844634235,
        "mean_diff": -2.209125896825,
        "se": 1.4819382575150775,
        "C_mean_total_edge": 30.94704737830469,
        "C_mean_retail_edge": 59.030243253963285,
        "C_mean_arb_edge": -28.083195875591407,
        "B_mean_total_edge": 33.15617327512969,
        "B_mean_retail_edge": 62.63382999212578,
        "B_mean_arb_edge": -29.477656716971094,
        "C_mean_edge": 30.94704737830469,
        "B_mean_edge": 33.15617327512969,
        "retail_diff": -3.6035867381624995,
        "arb_diff": 1.3944608413796882
      },
      "2": {
        "n": 127,
        "sum_d": -97.52038719029999,
        "sum_d2": 20250.18469452243,
        "mean_diff": -0.767877064490551,
        "se": 1.122852935284999,
        "C_mean_total_edge": 87.43838527460079,
        "C_mean_retail_edge": 114.7059133587252,
        "C_mean_arb_edge": -27.267528084068502,
        "B_mean_total_edge": 88.20626233909134,
        "B_mean_retail_edge": 118.33318243245354,
        "B_mean_arb_edge": -30.12692009335118,
        "C_mean_edge": 87.43838527460079,
        "B_mean_edge": 88.20626233909134,
        "retail_diff": -3.627269073728349,
        "arb_diff": 2.8593920092826774
      },
      "3": {
        "n": 119,
        "sum_d": -35.66143546600021,
        "sum_d2": 13870.460723580634,
        "mean_diff": -0.2996759282857161,
        "se": 0.9934902002940367,
        "C_mean_total_edge": 134.66109947188403,
        "C_mean_retail_edge": 158.91335862240336,
        "C_mean_arb_edge": -24.252259150484033,
        "B_mean_total_edge": 134.96077540016975,
        "B_mean_retail_edge": 161.7760712180605,
        "B_mean_arb_edge": -26.815295817867227,
        "C_mean_edge": 134.66109947188403,
        "B_mean_edge": 134.96077540016975,
        "retail_diff": -2.8627125956571433,
        "arb_diff": 2.5630366673831935
      },
      "4": {
        "n": 126,
        "sum_d": -476.06848212769984,
        "sum_d2": 19129.51953882786,
        "mean_diff": -3.7783212867277767,
        "se": 1.0489837821272576,
        "C_mean_total_edge": 158.39268321002697,
        "C_mean_retail_edge": 180.91187747175795,
        "C_mean_arb_edge": -22.519194261666666,
        "B_mean_total_edge": 162.17100449675476,
        "B_mean_retail_edge": 182.47295146130634,
        "B_mean_arb_edge": -20.30194696450238,
        "C_mean_edge": 158.39268321002697,
        "B_mean_edge": 162.17100449675476,
        "retail_diff": -1.5610739895484154,
        "arb_diff": -2.2172472971642856
      }
    }
  },
  "failures": [],
  "missing_seeds": [],
  "seconds_per_simulation": 1.1453461425064597,
  "simulator_commit": "b244530ee2a6247b5f930830eeca9dd950da0e7e",
  "first_10_pair_timings": [
    {
      "seed": 420000,
      "C_seconds": 0.813826046185568,
      "B_seconds": 1.0261873970739543,
      "pair_seconds": 1.8400224829092622
    },
    {
      "seed": 420001,
      "C_seconds": 0.85114722000435,
      "B_seconds": 0.8603241618257016,
      "pair_seconds": 1.7114785520825535
    },
    {
      "seed": 420002,
      "C_seconds": 1.0633055169600993,
      "B_seconds": 1.101155994925648,
      "pair_seconds": 2.1644686630461365
    },
    {
      "seed": 420003,
      "C_seconds": 0.9047040529549122,
      "B_seconds": 0.9447074090130627,
      "pair_seconds": 1.8494174019433558
    },
    {
      "seed": 420004,
      "C_seconds": 1.1420273538678885,
      "B_seconds": 1.3009824270848185,
      "pair_seconds": 2.4430153709836304
    },
    {
      "seed": 420005,
      "C_seconds": 0.8336342100519687,
      "B_seconds": 0.9295499189756811,
      "pair_seconds": 1.7631900489795953
    },
    {
      "seed": 420006,
      "C_seconds": 0.8285175249911845,
      "B_seconds": 0.8395917061716318,
      "pair_seconds": 1.6681148209609091
    },
    {
      "seed": 420007,
      "C_seconds": 0.799541681073606,
      "B_seconds": 0.7584800380282104,
      "pair_seconds": 1.5580280791036785
    },
    {
      "seed": 420008,
      "C_seconds": 1.1090674558654428,
      "B_seconds": 1.403741787886247,
      "pair_seconds": 2.5128142749890685
    },
    {
      "seed": 420009,
      "C_seconds": 1.3045816239900887,
      "B_seconds": 1.1423980158288032,
      "pair_seconds": 2.4469850501045585
    }
  ],
  "elapsed_seconds": 1145.5704317889176,
  "reproduction_method": "Python3 standard library, one OS process, serial C then B per seed. Download pinned simulator tarball unmodified; extract JSON.code as UTF-8 and verify the two given SHA256 values. For each seed sample_config(ChallengeConfig(), ParameterVariance(), seed=seed) once, then SimulationEngine(config, fresh observed strategy factory, seed=seed).run() once per strategy. Observer forwards only unchanged StepState and actions, recording first rival quotes; s=max(1,((ask or 100)-(bid or 0)+1)//2), checked against sampled and returned regime. Reload factory and instantiate fresh each simulation. Check returned seeds, finite edges, failed flags, and hashes before/after. Statistics use completed finite pairs including any flagged failure (failures separately disqualify complete); d=C.total_edge-B.total_edge, SE=sample stdev(d)/sqrt(n), fsum for sums. No tuning split: all 500 seeds are the prescribed measurement block, with overall and four spread summaries. No finalist seeds used.",
  "checks": {
    "strategy_hashes_before_after": true,
    "n_steps": 2000,
    "config": "unmodified default ChallengeConfig / ParameterVariance",
    "spread_labels_verified": true,
    "failed_flags_checked": true,
    "stop_limit_seconds": 2700
  }
}
