{"approach":"Competitor-bid gate for the one-cent crossing bank. Starting from verified combine-cash, replace only the main q1 bank upper estimated-probability gate with cb <= 1; cb is the incumbent public competitor_best_bid_ticks-or-0 alias. Keep the existing strict lower bound P[m1] < ptick, ydf1/amt guards, bank quantity, cash cap, secondary purchases, and every other byte of strategy code fixed. No simplify code or other changes are imported.","tried":[{"name":"stock-entry-gate","code_sha256":"a709c7e85c7dc5200cba83d854cc7ecc9cee8a70915ca79798504da648e9ebed","change":{"before":"if P['ydf1'] > 0 and P['m1'] < ptick < P['g1'] + 1.0 and amt != 1:","after":"if P['ydf1'] > 0 and P['m1'] < ptick and cb <= 1 and amt != 1:"},"variants_tried":1,"selection_rule":"The sole candidate is fixed by the brief. Full T is the only decision dataset; the exact same candidate is retained for H without reversion, combination, retuning, or promotion, regardless of H.","screens":[{"purpose":"CPython serial baseline/runtime screen; prefix of T, no alternative code","runtime":"CPython 3.12.3","summary":{"n":10,"seeds":{"start":100000,"end":100009,"inclusive":true,"requested_start":100000,"requested_end":101999},"failures":[],"elapsed_seconds_this_invocation":27.62165788980201,"complete":false,"eligible_for_ranking":false,"candidate":{"total_edge_mean":65.77563539587,"retail_edge_mean":79.55346154417,"arb_edge_mean":-13.777826148399999},"incumbent":{"total_edge_mean":65.66137643571,"retail_edge_mean":79.43920258401,"arb_edge_mean":-13.777826148399999},"components":{"total":{"mean_diff":0.11425896016000081,"se":0.11425896016000081,"sum_diff":1.142589601600008,"sum_squared_diff":1.3055109976844652},"retail":{"mean_diff":0.11425896016000081,"se":0.11425896016000081,"sum_diff":1.142589601600008,"sum_squared_diff":1.3055109976844652},"arbitrage":{"mean_diff":0.0,"se":0.0,"sum_diff":0.0,"sum_squared_diff":0.0}},"mean_diff":0.11425896016000081,"se":0.11425896016000081,"started_utc":"2026-11-06T16:10:36.788461+00:00","finished_utc":"2026-11-06T16:11:04.410950+00:00","ledger_sha256":"2932ec8d0d33aa53c2415bad68e6de333437cb47c43e02d698864c1bafa3d96b","candidate_code_sha256":"a709c7e85c7dc5200cba83d854cc7ecc9cee8a70915ca79798504da648e9ebed","incumbent_code_sha256":"baef955ec10728839f7c3357016ec9eb0550e7ec689bbd5171b1cdd5c9e37273"}},{"purpose":"PyPy runtime parity screen; same frozen code and same T prefix. These 10 PyPy pairs are retained as the prefix of the full T ledger.","runtime":"PyPy 7.3.20 / Python 3.11.13","summary":{"n":10,"seeds":{"start":100000,"end":100009,"inclusive":true,"requested_start":100000,"requested_end":101999},"failures":[],"elapsed_seconds_this_invocation":18.698465583845973,"complete":false,"eligible_for_ranking":false,"candidate":{"total_edge_mean":65.77563539587,"retail_edge_mean":79.55346154417,"arb_edge_mean":-13.777826148399999},"incumbent":{"total_edge_mean":65.66137643571,"retail_edge_mean":79.43920258401,"arb_edge_mean":-13.777826148399999},"components":{"total":{"mean_diff":0.11425896016000081,"se":0.11425896016000081,"sum_diff":1.142589601600008,"sum_squared_diff":1.3055109976844652},"retail":{"mean_diff":0.11425896016000081,"se":0.11425896016000081,"sum_diff":1.142589601600008,"sum_squared_diff":1.3055109976844652},"arbitrage":{"mean_diff":0.0,"se":0.0,"sum_diff":0.0,"sum_squared_diff":0.0}},"mean_diff":0.11425896016000081,"se":0.11425896016000081,"started_utc":"2026-11-06T16:11:34.331818+00:00","finished_utc":"2026-11-06T16:11:53.034023+00:00","ledger_sha256":"2932ec8d0d33aa53c2415bad68e6de333437cb47c43e02d698864c1bafa3d96b","candidate_code_sha256":"a709c7e85c7dc5200cba83d854cc7ecc9cee8a70915ca79798504da648e9ebed","incumbent_code_sha256":"baef955ec10728839f7c3357016ec9eb0550e7ec689bbd5171b1cdd5c9e37273"}}],"runtime_parity":{"seeds":[100000,100009],"n":10,"fields_per_pair":6,"max_absolute_edge_difference":0.0,"exact_ledger_match":true},"full_T_scoreboard":{"current_best_code_sha256":"baef955ec10728839f7c3357016ec9eb0550e7ec689bbd5171b1cdd5c9e37273","promoted":false,"incumbent_code_sha256":"baef955ec10728839f7c3357016ec9eb0550e7ec689bbd5171b1cdd5c9e37273","candidate_code_sha256":"a709c7e85c7dc5200cba83d854cc7ecc9cee8a70915ca79798504da648e9ebed","mean_diff":0.05930335260134999,"se":0.16389496018585648,"n":2000}}],"next":"Return this frozen candidate and its paired evidence to the batch measure/merge item. Do not promote here; do not reuse H for tuning. Any finalist measurement on reserved seeds is solely for an authorized measure item.","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":"baef955ec10728839f7c3357016ec9eb0550e7ec689bbd5171b1cdd5c9e37273","tuning_score":{"n":2000,"seeds":{"start":100000,"end":101999,"inclusive":true,"requested_start":100000,"requested_end":101999},"failures":[],"elapsed_seconds_this_invocation":1637.5132450589444,"complete":true,"eligible_for_ranking":true,"candidate":{"total_edge_mean":93.9512555136245,"retail_edge_mean":117.8642452267869,"arb_edge_mean":-23.9129897131515},"incumbent":{"total_edge_mean":93.89195216102316,"retail_edge_mean":118.1709640703087,"arb_edge_mean":-24.2790119092727},"components":{"total":{"mean_diff":0.05930335260134999,"se":0.16389496018585648,"sum_diff":118.60670520269997,"sum_squared_diff":107399.54255660478},"retail":{"mean_diff":-0.30671884352180007,"se":0.07503340119340128,"sum_diff":-613.4376870436001,"sum_squared_diff":22696.938053953047},"arbitrage":{"mean_diff":0.36602219612119996,"se":0.15857737024571716,"sum_diff":732.0443922423999,"sum_squared_diff":100804.78034758776}},"mean_diff":0.05930335260134999,"se":0.16389496018585648,"started_utc":"2026-11-06T16:12:04.192974+00:00","finished_utc":"2026-11-06T16:39:21.785469+00:00","ledger_sha256":"55682b934b261e53ad3486543dfe9de54b6070e97d094c212d93892d6c6eaf10","candidate_code_sha256":"a709c7e85c7dc5200cba83d854cc7ecc9cee8a70915ca79798504da648e9ebed","incumbent_code_sha256":"baef955ec10728839f7c3357016ec9eb0550e7ec689bbd5171b1cdd5c9e37273","execution_segments":[{"runtime":"PyPy 7.3.20 / Python 3.11.13","seed_start":100000,"seed_end":100009,"n":10,"started_utc":"2026-11-06T16:11:34.331818+00:00","finished_utc":"2026-11-06T16:11:53.034023+00:00","purpose":"Runtime parity screen retained as the full T prefix"},{"runtime":"PyPy 7.3.20 / Python 3.11.13","seed_start":100010,"seed_end":101999,"n":1990,"started_utc":"2026-11-06T16:12:04.192974+00:00","finished_utc":"2026-11-06T16:39:21.785469+00:00","purpose":"Continue the same ledger to full T; no repeated or missing seeds"}],"components_note":"Signed total_edge, retail_edge, and arb_edge from SimulationResult; positive differences favor candidate. SE is sample_stdev(candidate-incumbent)/sqrt(n). No PnL or settlement wealth is scored.","seed_config_pairing":"sample_config(ChallengeConfig(), ParameterVariance(), seed=seed), same immutable config object for the two independent SimulationEngine runs; strategy instances reset each run."},"paired":{"n":2000,"seeds":{"start":200000,"end":201999,"inclusive":true,"requested_start":200000,"requested_end":201999},"failures":[],"elapsed_seconds_this_invocation":1640.299985894002,"complete":true,"eligible_for_ranking":true,"candidate":{"total_edge_mean":99.8777989283339,"retail_edge_mean":128.7287306816253,"arb_edge_mean":-28.85093175330415},"incumbent":{"total_edge_mean":99.53686835155,"retail_edge_mean":129.10654277618445,"arb_edge_mean":-29.56967442464705},"components":{"total":{"mean_diff":0.3409305767839001,"se":0.2316824515429752,"sum_diff":681.8611535678002,"sum_squared_diff":214832.14721151872},"retail":{"mean_diff":-0.37781209455915,"se":0.09888059556574341,"sum_diff":-755.6241891183,"sum_squared_diff":39375.417930975935},"arbitrage":{"mean_diff":0.7187426713429,"se":0.23817838492805682,"sum_diff":1437.4853426858,"sum_squared_diff":227835.49635687482}},"mean_diff":0.3409305767839001,"se":0.2316824515429752,"started_utc":"2026-11-06T16:39:29.549019+00:00","finished_utc":"2026-11-06T17:06:49.950471+00:00","ledger_sha256":"cd4b89f4a38cc036754a79faa32432f79d6fc763eae8f78188ff9b99700c80b3","candidate_code_sha256":"a709c7e85c7dc5200cba83d854cc7ecc9cee8a70915ca79798504da648e9ebed","incumbent_code_sha256":"baef955ec10728839f7c3357016ec9eb0550e7ec689bbd5171b1cdd5c9e37273","execution_segments":[{"runtime":"PyPy 7.3.20 / Python 3.11.13","seed_start":200000,"seed_end":201999,"n":2000,"started_utc":"2026-11-06T16:39:29.549019+00:00","finished_utc":"2026-11-06T17:06:49.950471+00:00","purpose":"One full H evaluation after freeze"}],"components_note":"Signed total_edge, retail_edge, and arb_edge from SimulationResult; positive differences favor candidate. SE is sample_stdev(candidate-incumbent)/sqrt(n). No PnL or settlement wealth is scored.","seed_config_pairing":"sample_config(ChallengeConfig(), ParameterVariance(), seed=seed), same immutable config object for the two independent SimulationEngine runs; strategy instances reset each run."},"evidence":{"status":"complete_not_promoted","promoted":false,"variant_count":1,"simulator_commit":"b244530ee2a6247b5f930830eeca9dd950da0e7e","simulator_unmodified":true,"configuration":"ChallengeConfig() and ParameterVariance() without overrides; process.n_steps asserted equal to 2000. Serial direct SimulationEngine execution; no --workers, --sandbox, private-state access by strategy, seed inference, or replay mechanism in the strategy.","allowed_seed_ranges":{"T":[100000,101999],"H":[200000,201999]},"reserved_finalist_seeds_used":false,"freeze":{"code_sha256":"a709c7e85c7dc5200cba83d854cc7ecc9cee8a70915ca79798504da648e9ebed","incumbent_code_sha256":"baef955ec10728839f7c3357016ec9eb0550e7ec689bbd5171b1cdd5c9e37273","frozen_utc":"2026-11-06T16:39:29.082824+00:00","tuning_complete":true,"tuning_n":2000,"tuning_finished_utc":"2026-11-06T16:39:21.785469+00:00","tuning_ledger_sha256":"55682b934b261e53ad3486543dfe9de54b6070e97d094c212d93892d6c6eaf10","tuning_mean_diff":0.05930335260134999,"tuning_se":0.16389496018585648,"selection":"Retain the sole prescribed candidate after full T. No choice, revision, or promotion will be made using H.","H_evaluations_before_freeze":0},"runtime":{"full_evaluation":"PyPy 7.3.20 / Python 3.11.13","runtime_archive_sha256":"1410db3a7ae47603e2b7cbfd7ff6390b891b2e041c9eb4f1599f333677bccb3e","archive_url":"https://downloads.python.org/pypy/pypy3.11-v7.3.20-linux64.tar.bz2","candidate_dependencies":"Python standard library and the pinned challenge API only; the strategy and evaluator are ordinary Python and do not import PyPy-specific modules. Portable test runtime was kept only in disposable test/scratch scaffolding."},"source_urls":{"incumbent":"https://api.imdnotdead.fun/artifacts/ecbc9087b4f238fc1b5b0d52f55af073f676c038bfb6756172b1e51480ac1741","simulator":"https://github.com/danrobinson/prediction-market-challenge/tree/b244530ee2a6247b5f930830eeca9dd950da0e7e","runtime_checksum":"https://pypy.org/checksums.html","source_files":["https://raw.githubusercontent.com/danrobinson/prediction-market-challenge/b244530ee2a6247b5f930830eeca9dd950da0e7e/orderbook_pm_challenge/config.py","https://raw.githubusercontent.com/danrobinson/prediction-market-challenge/b244530ee2a6247b5f930830eeca9dd950da0e7e/orderbook_pm_challenge/runner.py","https://raw.githubusercontent.com/danrobinson/prediction-market-challenge/b244530ee2a6247b5f930830eeca9dd950da0e7e/orderbook_pm_challenge/engine.py","https://raw.githubusercontent.com/danrobinson/prediction-market-challenge/b244530ee2a6247b5f930830eeca9dd950da0e7e/orderbook_pm_challenge/types.py","https://raw.githubusercontent.com/danrobinson/prediction-market-challenge/b244530ee2a6247b5f930830eeca9dd950da0e7e/orderbook_pm_challenge/market.py","https://raw.githubusercontent.com/danrobinson/prediction-market-challenge/b244530ee2a6247b5f930830eeca9dd950da0e7e/orderbook_pm_challenge/__init__.py","https://raw.githubusercontent.com/danrobinson/prediction-market-challenge/b244530ee2a6247b5f930830eeca9dd950da0e7e/orderbook_pm_challenge/process.py","https://raw.githubusercontent.com/danrobinson/prediction-market-challenge/b244530ee2a6247b5f930830eeca9dd950da0e7e/orderbook_pm_challenge/retail.py","https://raw.githubusercontent.com/danrobinson/prediction-market-challenge/b244530ee2a6247b5f930830eeca9dd950da0e7e/orderbook_pm_challenge/results.py","https://raw.githubusercontent.com/danrobinson/prediction-market-challenge/b244530ee2a6247b5f930830eeca9dd950da0e7e/orderbook_pm_challenge/utils.py","https://raw.githubusercontent.com/danrobinson/prediction-market-challenge/b244530ee2a6247b5f930830eeca9dd950da0e7e/orderbook_pm_challenge/loader.py","https://raw.githubusercontent.com/danrobinson/prediction-market-challenge/b244530ee2a6247b5f930830eeca9dd950da0e7e/orderbook_pm_challenge/strategy.py"]},"commands":["curl -L --fail --max-time 60 https://api.imdnotdead.fun/artifacts/ecbc9087b4f238fc1b5b0d52f55af073f676c038bfb6756172b1e51480ac1741 -o test/scratch/incumbent.json","git clone https://github.com/danrobinson/prediction-market-challenge.git test/scratch/simulator","git -C test/scratch/simulator checkout b244530ee2a6247b5f930830eeca9dd950da0e7e","python3 test/scratch/prepare.py","python3 -u test/scratch/evaluate.py --split T --limit 10 > test/scratch/T_benchmark.log 2>&1","curl -L --fail --max-time 90 https://downloads.python.org/pypy/pypy3.11-v7.3.20-linux64.tar.bz2 -o test/scratch/pypy.tar.bz2","tar -xjf test/scratch/pypy.tar.bz2 -C test/scratch","sha256sum test/scratch/pypy.tar.bz2","mv test/scratch/T.jsonl test/scratch/T_cpython_screen.jsonl","mv test/scratch/T_summary.json test/scratch/T_cpython_screen_summary.json","test/scratch/pypy3.11-v7.3.20-linux64/bin/pypy3 -u test/scratch/evaluate.py --split T --limit 10 > test/scratch/T_pypy_screen.log 2>&1","cp test/scratch/T_summary.json test/scratch/T_pypy_screen_summary.json","test/scratch/pypy3.11-v7.3.20-linux64/bin/pypy3 -u test/scratch/evaluate.py --split T > test/scratch/T_full.log 2>&1","python3 test/scratch/freeze.py","test/scratch/pypy3.11-v7.3.20-linux64/bin/pypy3 -u test/scratch/evaluate.py --split H --freeze test/scratch/freeze.json > test/scratch/H_full.log 2>&1","python3 test/scratch/build_result.py"],"reproduction":"Use offline_reproduction_code with this result JSON to reconstruct the evaluator, candidate, exact incumbent, freeze script, and required unmodified simulator modules under test/scratch. Any compatible Python 3 interpreter can run this evaluator without a network connection or installed third-party Python packages. Run full T, run freeze_code as test/scratch/freeze.py, then run H once. Screen/resume is optional and does not change the full seed list.","simulator_snapshot":{"simulator_commit":"b244530ee2a6247b5f930830eeca9dd950da0e7e","module_sha256":{"__init__.py":"eaa0240d164fdc97cba83d48b0d6d7ed902de7320822f50ce8bb8e41a406b99f","config.py":"2374bdd9627766406080a76b4f5d804db2b4e97408c4c62f90e928782e267492","engine.py":"7e73b6c2ccb38830e9b342b2e3cb13e95f63bedd3d476e47613fe6cebdfcaf34","loader.py":"89910d0757e57457a558f6d105dd307b752a28cb5c67ba15201ffaf45b09714d","market.py":"d470ac6d05b68345cc13733c6cd329231411f1ce46ec0fcd52e2957670db3589","process.py":"4dc93548ecab976ce82acfbf7cb613bc54d715df7a622b069739cb1f7a616be6","results.py":"31a6303cb696525fd7a21246051775f8943bc94a0e0046b5bbbacc7050305163","retail.py":"d09712f4395d120a97b066dcc7c1c63cd22de6bc763404fe7e7c08a016072a55","runner.py":"8edcaf3283f5ae3c7858918926b3b2b7489985b1003a2bfe11b42ff1748c0d94","strategy.py":"d54d8b1752adba7a9510e5f5b8c9bb711ffa429af24560aabfc00ff09d3d466b","types.py":"b84b37bcf00e209793f75dd33289a3a19db497e74ea87ab8ccb7192dbe16a596","utils.py":"6c46bd944c84cb7db04bf385cbbef914065251748869c65183ab3022618cd72f"},"encoding":"UTF-8 JSON filename-to-source map, zlib compressed, Python base64.b85encode","raw_sha256":"a170dc087e0e6dd4a820e6acc5c84116d34c84c596648cfde468ee2cf393782b","compressed_base85":"c-rlK{de0&lHk9Bb$&Qdf*8q@WOw*Nzg05!oo|!aYuR(R&(fno5|l6o0fqo2YjXMDx2pQ9`U?bQc_(-8vTw&?qr1Agy1J^my1MJPC$m{um)&eO-rPT#Jh`O*`>9#vRnnI0U6psuHd(>{cQ-}y;^m81NwZxR+j-M`Og7tMSuVP=sgrfS{aAF#;wG=EqP{N10?=iBS+BOuIvFpTdR1O0<$BX>yCl7=6Zr2(RsBc$n#s~;y(zj9I<|`c=Wf0EOSxL@TIkUF@;cw<>!K^Rf6cdLUM~t+{-)^ivU*W9ce?sW;RC&vb)oRN5JLsP&#7G1+7|7u>RMIphrC<dyrHrTpkJ5k;$pXkvEOG5gs7lF?CQGMDhTjvHb*E~(&p<;Rm=ooRPD{SSro1A&>Hi_qS+R&MTIQsw!2~m)#v%Vtjg|QL1?>e-WAvP2Isc8kY#|S{7cpD?l(p2%*r`UshSL=XLVjx*6&xy1G41RT}?m#S{8R|LaKaG@H!XeQccQ5S8OgiKtjyMWj&h#6U=7GG<h#-Ts{#PTt3NE0VBLsYKF#&HOgKYp~OpV{^MU99%P>ad>H%6XN=Y16l2968}o0PqO8#3K&#y5d-lm=^w1}d&^Uekr<y{m%$o<z>#WRXdQ<LkGk&_dte<30L|q}Ch-qiD)vnuZ3*Z^axOrVS9iiT8iL=bRd{O0XYxr9iWyz{6swLLFtbcy_%k1@=mp?wAy?y!PzX2PbLD~8Lw#)wf=ga!yf1JO0KKu7~=fAvt_cN58j!&WLU!K1>fA`bd*~QDB-~Dv{_T{TzF5uhK(^CQcUv;M`p!N5np1y^l0^?IzNT^K|O-K?0QR^;gk&#Z6aM&nDX_=VCHubE9sc9!k32gw0*(sudUr@%Ec{L+IlVnvjc_)S-zAqIHv$nim=T?oUqRQU@RnQfHPYV-d)j&GvD(fPz13l0;5BNWSE55>D)@2O{b~hk%Z<=Zu0I_MxwgnWCyJu@4pQ&?JoSZ!!L~(a<SmYKTr8YYuO^03F#YvuTx8*J1joi;s{ul8Xi7^A_1j^<WL-(l~Q(OMMaLIBumL#9=?)jqN@Fm^a0%Yf}ySxTjg>}nCF@s9Y)*|1xgDB(5Jc}|~IJMduXmQCclACh5Eb3&TTPIZxC0mD3zwVl@2$14CJ-sd16ZvumFh3d=9)`Is$1TL)Hk*^GxGgGUoWy5SuCPgHT>>^FHPU6V%0WKPR`~)(dp`}-9SLw-VyB76b5T%kMG42ycH+%a6qZ|2!h&Tc`2-2A=xhr?Su_6>s%eQvIdeBTh+|^I-P%m8B`~F&kw~^$+32Yb2vP~X%eP%wU(XhKd&5=<O1JSaG3%*TXVn9N*G0W7mWe^^WSiH^W?lZBekF7G<+6(<RcAn1gWZXdZBDKHQ%C^X($$8A687|8!u4!ur>B4N#H|bKX`qG;<-1cyoO?q%{l=@|Ao2}g0W&ToU3|{I?W=2p{nNKkt-6+YwE;gJfA>vaT@LuW@t^+mox9X#w#0Ivf1{*UPXpe?KR*pL;1W;37fa!6PfY|YYJNi|lGw}~Vj{^>FxnQyJYRf_ZPZ)~SyqzUJz0tD(jQ<)_<Xx<wpsF8?+bsXdWUXqBD=4l8!n;4bt5HF)%RUjRvKo0TWs^|B1?o01zo&s?rI@Zgy?WB=7|<$iP}1+poLdiA}BZUcD0Gxk}1)gB}Y(L6ib@LQF8Ju`K8g2rCMK&rIie`toDfZXBR9~bc?(u&?#1ff0PWvfq<n>V<1#qx^lGC-f|j2Asv~@YPP5GiB9=A6?+KMObx;#j(}7J%qoHoWXthlx7~udJacyw=}3)M=rv;AsmG@lIwQBiSjur^60<VX5K64A<i;suM0?btf;Z^oI61Sh-hh6>ZqO!NmB3(2ZTE2-nO7y_a8KQ`z6FZG)Xg?|2imnN+wMIHtt;G-UvU(=?LA`#{0~h*+;RYz1k~kq5uDMn+?R};){M5>Vug0UP1s^H@*AMlSpaIX;e1zCO9DTmFR9-`v??}J{GTlTy`61~bq=#!Ur+mnk(?wwkOK2F?U}n6K7py5_RVVmPJnnhaeK=o#kdipN{M=-=mh1PO?5w$?Nj-0X6S11sv`o%)WInD{lTl4&m0k>mHZm7FfKlU-Ly>Qkcv;mVh0L4-_FYpwLr=`o3g+8FoQVYG7y_ZTnDtE$Ja$&kO@N{+BC%cv;bG4>9{SIz}HjsYrXrA%O{cQgGMAR9$>drStC=?iTddbDb!0*wM7pSOrTi0GmSUF|7<jpuW^@=+O+ni<2bs_9cBI9S-`AqN>9Vl=aU{0PW8goi*z3&X=w;batRU{G|QsgKx5HoYP!#o2(yNkS&#VHrz|8!Em>VS$39YVi7F}#l1#Q9LUF^0TNm9-S4cU-7M~Wyrc0jFKe$cHTP&L-$yZ6;{F+aaAAWkS{ZmXS@3ysP=>$gNXypLYtYEsK4sJICUkkK|r?_Vv|E($OR2$r5kQwW|n-vQ4SyNZ{Df;76C>v!sjL`_)`6bBC0O&25!&A#D9;1mX+1*mbncjtRwh7uUfv!5(I#jb_d0k8uKY+Gq$EG}pAFTwx75flq2GTgtMwNz;+vZEIC2b7tkMZVOPKKImsTr7l;BcVvuI}uXraUx8vFn&wd_9$=sl60NJ?-;(8)*L?ic{D@?}`y=Ci)XKlMVPP1Q~rkHdK_)=`e`Ew9>yb1sih|q!w<B(T}63g?~pY-WN6|)WRx^Hmw`KB`?cDYrX5LVvVLpv+KYTEpQmo9`1^~>iWiENq7m7yt}8U^j&L*yhF*eBxrg1?r~DjwkgliVv?Iim8ucRf9)O00AbiK2&E8wkpoiBCm{iGf19~N_`gJc9W1*ZAh!;ZS)U=VK0{U=ET=w4MtvFi^aW+pAi4BFne-re6p%&o-yn1;i}(*#Z$wT)*wdrweYlfQ{8N>4a-Hd7q$(5|Um}JQ2+tY%l(0MBKcowUw*h{teGwMmCQv{fzlMM9+9R;B!RlP@+G3lI&^g#tw}skPf<y(}sX5du+s@u`ZSxYu<qMEfzck$oVD}~YD$|uYxyB_@B+I5~2@(OBB)=iV-!GqNVZLsby9$;?PQo18>v)*iW^D%i8?xmMFcA(SCHzOD-|^@`9CZ~7Xl+w=jHNS@fQZVhY8EsXDeE$$5t=a*pt2?ZVS>&W_&pXgt%^M=yrf?B_}|s}90uMsG-bxeCwfhYRU%aIhagd<K_D(E{*Oc#&*G7t+Oh`OQ!ffRuuQPd_-Fd{7XBU?D#^jn{%R)b%VruEP4fl$0IoqycR+Im+=@*giZJr=rZIY*1GI7un>$T1K@P(!!0#ALl<V-CgnY-0UbrH(k95M_Z-NxucMG_1XNlx&;3XQCYJmfjz8mPr*{BP|k(2^w#^t)l^{&;JJ5Hb{zImXUsR7Ai?Pmr7Bc<A725J}?1Qt-&G?h9V0FD8@uj;>qugJt%a#8%cD<ql+oM%{JP$uNbigvOCop_9s2yZfxO~I1}X-_?Weev?ASHDQ<T()$UcU^4hXh)V-`S!YKyV)%)6&MwLn$3%<QSnul!$p?0YaE%|DxWvEN@Y+%*9iBCioUw6U!T8u`|`(^ug`yZo1piJZSYZC{rKwV*U#U+eEaGReKihR{CNK62Py?q2Y<eK{`UOkPgEj|C2>^Bk7rF7MvImk5l}KO3DQ})B()%m?rQjKexr|ULgZHG_3C(993v~<lx|#YN6B+I31l~4mt9u~w=rwiO6IXZfy}yvs`lBlw!8IrumGITqQbv|X}SU4y*F}zkT&Nn)M(-@IBT|qEzCwc8W`(>exzavdasHTc^FZHq|C3cfdXw~&5<GMu#<VkZMb$?iKem6gGAScc;Krty91vb>pEV;4^z=KjKQqVU{CpRp?wybYR8l@bJ~{Ich8^>K3;tA@gZ`w{y4UREZnM=dF!4ai7MQd4cDOk2A;Y(GtPCLs3|<=lLQI#9{4J=qy?T!{r0=thPx#dj{^v>qY=Utomh5$SL}%WfL5X^F#*_FQ=^^6RF<BN{DW5^S`KQYT(b<xZLxv5FWVd38np7buG>N3d!dAYC9mw0yMP2*kX^b*02wanfn;&UK#*3O9@w0v27=~IdLR=k8jukg<Uyxq+@iDn()&={;<h6Vt*Da#`dM;zYMGCgDjL|Cv#H#zQ@+C9E0(_+TfohE7JS34bk7oVchYC4_QsQ$zuTfX1a~H-Bz<fOj64d>xHkS`6av^^hCs9Y7StNru?OIfE)eumCVhNm(PiWlE)v;5YA57llWH-fdgf??&dX&c{>s~rI#@(`@R&HGIuth5?hB-#s8g^>BB2I$SYwu?3K85DpN=S;V&eK(sQtFUQ(9LMq$p0uKfL>oED->0t8sdAW^d8-XiKprbjT7OfokL&dfI`PA=C$=fARdMpZf4;yti+1h!-L(AoLF!L;r`yO<G9)eZ??`4Gd|%`2NOOj{IEM@dd(kW3y==6Zr1KKog7B_R>^;?lv33yJw5_$3$F24eA9bTbd~z^RPmH4MRinE0rrbb;{91XAh$2BuQm2CkbB?Z1pP`f{YdnQFQFU@D~;$!xmPO*Gu!^`=p1K&cbnqws#4ep76u7zI7Vv$q>L3-@c%<mAxMiCB?DaU4?|NZ5`@)-)l!6Y<N1MHWUU%=BJi#ww-E|1|4tl8B4yOChFhe<lZk44T7F9v;vrr{5?@+G!5qGQO2Va<=i-BEU?V|90<vfk~Oostomz-z)j_U8l;XRf}Snm=B}1z5VRo~??^fB5DUakC=*DA9;u(9lUJCUsfmKhLXl$HCm}1cl3?(G>jIL^{0|{~Z1#|tS%v;tZ!{pRZMM)Vjq$5zHMYTUkB`Ouw941>WiB93l1Si<q2rj&!m_?<jEYVqTG=Mrh7iK~WC-CI26D?AicE}CFK{re*xI$#BO#q$D5w3~scj$U1&nB?zIBcl*tOZU=|s_NWW1ARwx5{>w>S=4sV$VKY<5&`MR#$71dxkI3xxg#ASiePv{4=P76^0QAKn@aYaI~IYDCf0{2ALv*`caJZOUI0eL(QOng6X=bXOu4zfY;+S{BW5F)KixMq|fXqE2QG5~Ak&f@;tOXtng6=!vQiG)domz=ie`4Yd#+*o`^li1xC<Dpn_URPcb1QgK@4cuwhLvIPT?q^G3&B>7GJ@lV^|ozpdr2cPqabyBl$vVjbeQX~Y?41`H%n?WrT!$)rZAYRrWh0CS%vj4`Qt1&nSea@MXnmO+LAJX;Z6E557uy2m$Y$Ab&x=#0)Wj-o<jI^Od;t-o%mozJ}LpB6sHTcZ;Mk14ir0Az=jk2DgV4EZw@b~1<9!7QDNRfQgw6L|l1=_FB@k?$S&_m83v^Pmpc~O-Gb0nc3Lq!{${8ksAx-{U7HX#N)w%qbkN$>iwiFqZA7+8N5ZqV)txm%nU1=yVpny6&zoL>c)m@9hjd~^;EEWew3dBt9>%4C6sI_c5007dxD1gb}g35F)WSdX-_Jal@0W&7<$k*-AxSX8O$&uZy3+|`Tbw%F2zEzMLX7Q7*YOflZ@L`=&F2CKnZUO>JrV`c?x&E<hL?6U2%&_RpgB}nkq3andv!~o$YwtpGyj;hM>^u7wM2f8+8PJSE%(B5D8I}18Ip0eX@*BHTF2jid2_2HN;htIyADd+7sVkVHk_4JG+VWLdgB6rV^M!lw_^(%|><COo1xR8S0aF`hSd(bJ|IA1PPW_a*(C}yDurEQ&0hcvWe4360Ny6Dn?X`|#HkC2j^QRI!}pQZ_8kAWibUH!3!<_R0C+L1Xz(WVWs2rN7~So+@(Etn~&4*&uNDHrQ_2AKApKm`5X7CPZsw(*NQh7WQA!`_43NB;iP-ZTe~XF<9~wy7ZVnL`TpD_^1$wEM2S4Jw_%;IOC}jgR)rf(j_`5gqzSc<GN8ef`^LVnG~*-0rRwOUJ-G+JjS^F5yf9bsR6=-3<mnVsu8_l_@Aj1<pCc$lDQdf2vx2s!YsD@@#6|0X$LKCa_7EgZ=T*k7?HTumom`intY30$3ljgq%Mngk^gE=7;D7t$x}FhjN%Uz?c!zNT;?%8Yq*b`Q9eY@uQK(x=W{z$v%TNDil!M_3}BI-A2?b?F85y#Lw25JfCm{G&Q#z%?LznTIj}V09U%cr;&AiuAhypJq00p_hT#XbZ7)+XgEKU8+x>U96UHa()U%4L-9RFiL@%!Z4&<|KH$~VszQZpzPG}9dNf>Lh>zpW!>4c}MvH}?FZ4eby<jNO1F>U5L>~L-7(GIfV<vSh>k3SXWw`{i+UUTL-jlWyIf;WhkN(92u$b#Sd8VY&mFG(^NKAs4FTLY8Pt%6mp*}URvyflh_ftDA>5=bcMjd`Q*b^Tvo5i4P67%WFzoX0vraVx}sHu^AKOGjLIvPFH9&kWEi|C<8vJr-9H*_*Zy*>`YUpqF(K=+Tt&*~}Y2I^73);(%q+g>|__cYq8%n7`pt_dQs`sCU~|J8Ht-(w-6DxBgI*Md88d$n9BG1DMyr-`NEY1_wI8c~j6*Yk(4#zWVSFE#&>Yv^DG^~?UTY|3zVS(UlVK8rhTJMI6o=VNSjK9f6RTb0M)PKuNG<8voNI~tZEZ5D1PX8wtZA8NwGSsbp8$GPn1^2g%s{f9DwX!g5RLsx`4x?qN$;~(eF!)c%MFzTcVus<qRyevtVNd}!v1TS&~qNWYxUI6a(j(DK@@ji^yP9by>5&E_V$H;-PIT%5?;J`&!b`lW+?zxIUj4ep}Y$WhjlWO}cVhTQls{6X#Kh?*H;+XxAd~(HR2tN%Vi6LkoQOrrt;G?O->2Sij*$c$Evc!Q|pN<D1_5jXzQ4J|9`4E!dCl_RWkzj)Y@P-B9JtPp1OaJMfNAE(q_VDNYMt!fa#2gv!Oa*jxMDl4#A7}(BDr`#ms>EEgjRv;1i<^RO*T=$g^{LXH(;l~4)Y91BBRjOSt&QNd#D|5W$IoIMQc;-7G!WT%BD?m_fAN)SshN8Z{-dCe_ku=54-T+a>z+j|kKDUX&iUQ&Y2e<!O|wZI@xb3m*mtzMEZarCT{<8JU9*h0<!;(oFt_6s6(kZyDFu1?cf3QS2nVYWwFell!RtgGQ`@gXCtoM({{6x46drB}2jh!Y{1*SvP@+eR$1s8}6ppbc4kK_o=HZbSeev9f#$Y@+Vj{RQq5%_q&oGK5A@@2u%+=cOu!DN(ybv$_PI@mS1g>*OpB1(bNw5;0HwdIW6^O+{Hb^0yj;ErzDj2kH2x9I-ikzASpU(taATy?86|7)i?1???xqtd1!2lt_X5LR=Z*|+xp1E&ShibDg%r77xSa9m9V*XyV_1uDsiT%}UrX^;unfhw)^2O40T9^-q@Ml;x5T}Hr7>Vx$SuB3S(^5OgL2h_rD?kK@1YjUSCrSLRS2pRu)b?D2=A(ZNxzlj$k4w5p!tcysgR}6O*XBK1zT&8R())mDcsvxf?gKo3^TQ<muBZVu_<@S(gMwn+vzG)(9K@d!RGvWdj$ojHeoRo*)~^T#s=7}JN_?C*1mg|$LxNUA6FqSjcqmUlBN%)+P&_rKo~=Cmt+{pH-RK`80n4CgqQb8|g;KTY2kP*u!xHRI81HtCH=mcQ^iwQ^Lgan9kWCWNB>C|#FOu6bPm1lz$qXYE$LaW66)bT~V;e)&^b<XM4L{mnw_W;ld^#G93|=#p=IX8}uWx|;SVAo@bDi8*#`kKea-Gf!v3M;2CY$vtkwBB(248&3le)OB%IlI|fWw!zodh>4%3$T2n99!zBh#){2|AQRz<j2&X?mk?lb#@KmEve8o*%s}xVcfQ=XIhnSh7>KUlKo=Tx4)z;fv3f87+KJtQuZF)kJnqK<tBx+7WSbghx|Bw6Bv|p-v(K)zWS)QEW#RqrAU^>Y^4ZraRP1vf`Ct4ev#K`Qj2w>Xw;Dm?GCs)jLAre3}u?fBq?7bl7xRN_D_hT6dFoloCw6Q!7xy$0=b$3k#O+$R~d<w#`_P<SkSeG68UdZ60oWQ46k{Wl`aUA0)o0dXoJ2eAl)m&{XHCOVA-led<AqL8~U4Y6tyN*eVJ)y$I^vdJZj{l>v%bj9NZg#{Lc=X(jmUK)&g#-td+CxZYQL1&o^ptoa7nTwGRhx*IuZmdtxib{;4YG7^%t6rs8&O*Aa^qSV++t2bil&{%#3^8^-fXgwpUWs2#6Uke~Dr999q&SR#8_?Lr_t;t_)hJzoy7Pm5E7qoH|v7(&@;v_MQez3tDN3d~Vn6mJ$@1|VQUXoZ~Dp}#AhZT-FO`LNkckIC}K3|RcS!o*&a>xgsiVp0LY-l0nXoKb|%t3eLTnJ)OtWzx{d54bH#6z7k3|`VvOx)(>s#2yCl^mRIQPK&kVf=>v$r7eLNw&e7u_W8S)w}LSO9uhaWIU!PKax$cJ)tx=2n=**3-alv*cJzBOTFq16GXHjjCZ+Ph+L35ZP-q|HfNNfs`t!*<Z*xjGhDR*B?Z(P3u2|VG7{}huvz%=#%MyPXzo&-4T@+tzZb;S38pc~PzS#6+|-dh8cRLgD06AaSV;Zm27gR%)3hCbQ7`Tq1;XHg0Oup&0&=raNw>UQ@#0klTJBcLKYyPAoW$&!&;xD!QTTyxpUJ-V!=#5^6-cuj0?(Zl8_W4*>!v+0XzgYeRapKc-GP0_B$oMS?_-&v29hKa2N(O1h1<v-XuM0oo9D}0lFZ0$G@;1C3LD_<y0{aZ@9;A9q16$(@U^!B*W)$XB<w-2umWQ|NNP#R23H<xxHdG~c5s17ob1#ButsO*-73?md$-6yIQEC-;ULTquUL&SywU)$L%?IxZE&sG5-_xAV9zR(4L<Vo#RFd<9`u$g%absPXLYu}_};>vWX|Cv&XM%Z(VU&3@1Zovd(vmdYI#|Lwa6nnt&8raS@Ks0O+twUrcH`wX*|k$s78{&%ed|fqJ@_a$(p07lh?!gn1vhigcpIbEU*Ce#Jc_2UqelCrh=_#tp*wpPXt@gm#{aC^UKsu^~FDh8(Ylew6?y*-#D>ZZMyH!E)Ixu<Fx-k+kLKN?~0Ek;?%~D+>BA`l}R#h8tDwDj4KqgC(R+X6p?o)wjhbTwj6tBIrzeI-`mQ4uPO)MQ<go1l8@Lpgi?%HHN12oPPZ!KN1)gW&kB6!;X(G(;$GU0Kx>hoLw^{+2|wiB;>KnI%^NeRxF(5u2H57BEE$i-eUAaRy9KUUF$en$!`(WiZKmjSESOJhFwe+J5Fhj<BOlLE4=M-_74A?}&LXIsem*KBNRY|nhM**zxMd}=U`H^6P*As}tU+7_2dldq!QLA*7cVGR3>(+S6dN5|-iHm6AI$vWN2!F>VMElXMSuA5ahY=17_EF^e}Hk45l&kCAAN3Qay1`hpkpJR&_aYK>BI=0`g<HV*8ihkCr(tHiT#NY+*x~!9P43MP+>>qxT${iDwH=4G+$hKWZJ)HS3zOiF17=~1SIERB6=A@xV7~S(KGkv1qK(nP6p|<k2JAtZr*A)t7^q-RdY=TnLrnLDysbJ(x>i(nwk3=hI)ZlXPHwX=#P+rm@=obd3ly|q5FU^#`$okHA$$;Cltr|#C;9YiBUngFjVxKlQ+C8QX)f^xHL5*RcDuMsHq8t(|t@eiT%)B0Z53@U0pvY%^Qqf`rpQ)K^vE#d5gI@GJ57W#}E)l^2(p>{ZJQ3hEW$eY~G9QU*#!+Y6q1tMU`x4%-iQwu4-uwC8{xtIkR^>nYXWEApv43N_T;v@;q-<iSINJRn)o1#2<vLp{`YFfuv4a9e|R1d!&w(rsPYXD*7{*14CEs#xtI7j5{NcS$B1bnTS(02HPbuTbIDPv2Xb&9v<R&9)iH_Iu3OAV*tExHpD^G_Yhe5Apnvb9&v~y+yVeaxq&z0TjsqpBdYPccHAKn#3tZ5aqtS(ut#jWPWt+>YKA*<s(7?8evrNNFjcKvik6dxV{401jabyfLjyRxQT~ZLZ8G;JgLL~ST>`8-05RTlAX;{lAX2s|rHIW)oGGa>RZ>Cn>QwR~o35$(Q+letN=_c{KLjUoJ)Ts>ZBZpRMYWM<uJRo5b<<SO=@K@SrTQgJAOO9VIC^x9v?&hi6NE*5U7;1E^hD|;n$*clGfzj%P%(<sRgQM>zj)e!YS>{nbP-*gGHG<^9pdD!*?t77DP`cCKgqouLewWv;t6SA7c;I6D>(Y1dBXb?jwDiFV>(e>VslJ(i<<?mDx0amHJDabS&wWUK;$@MNv-V&ErkH$>Curpo9{1GK;z{TD=D#DK<*&IAXGv`3j$knE`7sLc=|;PlKoikG|<$p0nK@9>($<1YpaIc+Pbe2YHU@o+sdTOY_YW=2!U!24m^Kd5C<#4oo+j_7pVyUwfPlh!dk;4J1zljf6H#Pq^@e2sSN7cij%yH`Ed59N|tS;Ej;zi;8gV|Tl?Kf*&r<UQ~(--v`ejk8X-1B{$8rM6cS4$m<S(8h=T>X8^r8vpxTmdmm%w8`Q?+5jf$6XUS@<B|6~aO_)_ZU^=@93i{$+E%P*!$P?5}W7vd@pIYU!=9@5z!cnZc2Xvy|(NrDY}HYmaRHD70ez#68%X0)z!DopuB=%!W`pQ#3*q~^^haaaZAFLKygE9K`Oa>yX&9cnuwB}Q#B%ycZN9+iszWb+ZCJ#!NL2-Fk#uQ7&IaAwOhIjcAE$1w6PsbR>)GP%1cn8V`8nztj2Vg-e9TVhRA%SVzNN6E9~44-;Dl7yhD=tLZc=HGOHdCOrh-4$z*CcSG!{FK7+!w1;!fA~Nd%*U_{f8CW^iDj}wYsP^3@IfMjxIh!Y=EDbx4*4?ymOY22?JqiXb^`<luB%j~F#<+#sT9;B<o^~p1h}lKkcx;g56dP`gVMy%{;%{59Z_gmwld>3pY0@HY#TImJUyOlfStxRi<wIQ3#ou3%aS4o9%6PB;Yh}mYz9PYcXI{yuIz5ChsXh|1tueSec#=n8Ac{a`!!|@0@czcDb9A?{tdT)_}Z&_-Fq~)ql?udh9$sF7MKgyW-;ms>S`s0hO(!nMz+V+TEq0dDD*TA=}{K!>=BRWNGH|{zv3g_N~S4PPk(#Owu&t&Ta@UDqP;`u#%Ef5&h*sS8Zn~*k%G;{pfe_rGR2uAHay1pUwDYL@>q9!hNza)=Z)~I<bswPaP)~{Veyg`@_O2A%WI0wpBFdzZQ1P969Ak5$|&(^@Cam5z;XU#q_Ze>@CG0x><1fII-@r^5{<8!p3YpY+M?@mHsi#Q7g)_tax5EhYd>l)%2{@ewqZ7(JF+kw72qbl&5i}g7?UaD)IS59icDbY2>pv$XiCGRAfuH87%_gvdshK(!I$+6ILmc_TcF2h9CsI+aG0>A6|l16RupL%wBa$eh_L>#$Y>VlBb1Cxue1;XT-~!O%!M$}pMhhAabVi;4fUBE&r}IEz=%}4ca4OQa<1#52_UZYr(q{fmIS2hOq^pVDu|U6NajY%n-0c-B<Ay#ySxYrp|_Gp66r`>HKu#U0{biHzQdpe7ucE!$V-uL(e(bs*5rjYl9*ay_7Xbr4F044ilu0bga0emqEKkc_>mfIRo2Uyuo^SkHtIn!?o})!>It<u<xNwg%~>7$t&_UL1Qzcl{3~UuuIPdsY=3@ZEq_lgcTZ2xz7ZRU<kf|A*2>0|!HC`~D5kJA8MhtiXeBtD>qVmHK*tzMB09JF66UqnU((doeYn%dkyo0xz^qB_*nx=agZtbg6X#_uj9GZtVaDff%Ki@Jx{F%0UnS3-jgHFRq&7Sy$SBNVViqs--%vP5&gI)zNxp?m7|Y?)Y>h-;+$Zb2&acJYO>rU0T!xJZ|F_h~Lu9{gol({klKSg>ld5SGWNb%aMr5{~HP0ho#y?0#Go$E9rtRK?uM~9m8)SD`1GHt=EE<pv>QxYPrVcgDq5QebzNZsr@<1Bp&qx)xk#n<MyE{Mxf*mO$->PN-8-|6Fn#4cOg%(^iO>J%!QO0<@1)$Lo3rM|aBCx#jF4Vj+XBRTZB3)3&T#ouS9zMpCbmh9h-WVPxPPQ%7NUY(3xW6sx5)lv^Z&9BO(VSH-QS3Au<mpErDvQVg2BFz|<O?TM1#jZ2Z_nZHAYZ+!rCKrZ=F1|b_lvQO;tza~L<i7_B1#E6Wg#&GqT_h3U~6h#yJ?gJQNhI6G<a7Kq!&z3HP06xo$0VrMe&F`9EggP&@Z*H=yLzbC_9MTe>-egyuOovS*|RyL-iPvO@5EtQDCO36t8AF-aPHq{1A9>=mR+vKZKqd`arT8A+g7W{+kr$^gzlr(p9uluZNYuM1nW4-L^o#K%0o=6}S-32oif`KzxZu&_`qEy;yuZ-<%akuQJrdE(zI5Z@C9MTveyL^{d7+bStAHnw(p*sZLm{LiG7sFyZ-o`OD-nogBjLL8P4Il7X{^K`5~_w3FbX91P>UQmTF<19LBHAwK~h5>@Yc9#_^e%d;!QDr`)uhrd08|EF>uPLs3Z<j-c~0SK=*DJ4wN53*Fv9X`4!f9*CK{mTo)W;bK0l}HXoP0$7esQfI>et62A+Zb^EHs#mJ*{O^m7a;BD3+-{p)7cpAU~E$Tc$l#Y8E!$;6*|TkV1R`u`Z7tZFeu!9-P_JjBtRUgI{FngF$_0Du0<P>*O~C28~ag$XDN=YJT62~a^6z{-f$%Z$FQjK?KR4dTd0p2JZZk>U^?8Tp@eNmG}|-wOeLDV`lkx&wzK(=;e$_)>Me_EWT0Wlbe5c)jcjLa;7QBm`$5^(R1^uG^VeR+9vv%*FC%#4r-xp?==dcJ(;T>J$k?9^N~bn#?DF!N;A;E9qtL=Zrjk|T%ZA;Z5OvkX3Hb{|+wcDgBkIQw","scope":"Unmodified challenge modules required by the serial evaluator; no CLI, sandbox, or third-party Python packages are required."},"per_seed_paired_differences":{"T":{"n":2000,"seed_start":100000,"seed_end":101999,"format":"Increasing seed order; each record is three little-endian IEEE754 float64 values: candidate-incumbent total_edge, retail_edge, arb_edge.","encoding":"zlib-compressed, RFC1924 base85 via Python base64.b85encode","raw_sha256":"84b194e99481d5db8ef37f7c9508a4f1a4870b1b25c46cdf512644123307504d","compressed_base85":"c-rlqdsxibAIFbGxpdE^q}wl~S`8)1<s4lYm+i7hsCFnnOR`DIrTC&<$)%RGN-`0JR#LlC>U&Ts+LbQk+DK^2C8fl#)o*rNGd26nv!pW9oYz0^=lwiA&G-8`=X}oRbG~x{K(wH0&&l>@*24D+#EjGNUmN>Q&f{G-7Vw`6r)HyiPB}zq{<EM8hB3Z7a(!Y{#x&IFH#T!emfS>XgwuBarT_Z(`{y-Hjn0KYI&Jy5M>!BE4$!LA@%#8V<awlrTzdk+wskE^Ac!-o4-UD#<Q=5Gemv*?8}2%C8LN>!<O%(`E@%JK$L!!n6I@fN*0geg2}VEfiSW7fkR}7wUYL`f&v%1>T6rpS$a1dk{ofRsnIxX=4(DF=RJlwVn4i35xF&-J7#jpBxpi1PPwct>v+N#69G?%ohd-EsGpo|yR9RYL68OKF?<qaG_zV>4I|+`>4|3{r3;C~;x2CNZeM-KoD9&tE*%r6;gwFv>>fCrobrnQu9j~(6D1%R*Q#RgsOSALq=XEH(zE2(GDdE%lES<V)e9#cb2dkY`jyA*bb#RM&v<~X7_xn@-;hK3dO1ypPw15{CI3tHlQaLZj8;4Q>PxwgUlehG|T1bNv6LzzMxyo)Hnladm)RP24Hv}C${^i7H1F?2UL4pZa0nj%(Go=Sv@2$3&MR$+1uB-30^`8d*#wGQ+n=(S%zF{s_9E{lWP0(*i4J7^&itOc71z)-UAjRehKc0-!MIh&`X0&%6so(zvs%Te(LW2|rPqWS<^*b~tXBHhYtXbmLk$aw+v&N8x*xqpFKItvf@P?(8x~3_%n9Pt4?(4sL_S1=E9Sn?bloUO&#DkO1%qgs&*q!?h#hL?QZT7wRgJI-+sr~F%T9-Pxl|Lxp+Y(tk(s#Bp22}RX%fDR%seW6e3!RiZa9uMN8GAeM_ZgOe?`B}B>2ZoOQW)FVIY)Y_V(msJCB56dJAM6{D>!Kniod{%D-!VkAmQ}&QAtTO2$kOSKs6GAf>ooJnx&HZu)P$*v~}aEAxKf@tTyK=K+fsbT4EDVPGal@$FY-eP>I*e8>6kUcCf$YDd*vc3@o8bVMlsYtc{@ohm-Iwe?JYV_&H(I14&-$E?6v-8oB8{1c#o4*D%T<FnX212|i24SKRvIW|q}~4Ugb^{p=SsK1jFVd_Rn5tSWZO7>j+hbP6(U#z@}&WuQGVU_dnubkpAUc{3R2x|_~k5I%tH<A1YqvvhXI=!a04Cwwka-#&Dm)M^|q?QH7>DcL_Q(Sy5h4BXM81aTxbV(B2wZBu#q>8OAwbn-sF_<GW<<xe1pz0{&zMQM|5+M}BgupYFi$TIc87`H?SWdGLoqOsA-&G<0{*H0Xi8^u*n>=flZOyc$(+#G+a>8cS%ckV~@(Kf|w8@&{x%7K!%-c`#OPWs&bM}K&}>#K7R9ZEU1zvy1~Js0&qAU{d{BLDsZ1bmk>Cc$rl7x(p*lUr0Y3C@l<rBiQ(^qw1fn?#%8pE;+NPO!E^fGYE?3Yp8TdtUF#dAEcH)D9f$>DX=O59KajPnXs}@SRMHb``^RMKP=HK%V~FJbzeT;h>_;%V$LbzSH9Kz0Y;OK`&{l@s~#VCABoAIl{;LR*K~HHHy1z&uSfnz-YqTO08@Nf|n`QZn)5K{lP?wg)6?e0C_5+u>6xur}lqE3-g^u!PHzACvLp+16q{uVe9vit@!}U!C08@EVQ#G-`KlZ7gN$F;$mX-G3F%OjH6^fUp=O2rx}y|od3CF0pDrV^nOwDYdC+tHVAma$JKiddjgKvzJruU{RREHcii!NI#%Pl7KtaJlQ@-U96A9C_mV*@!|n_3IDPDN{ot$2N^Q&t$S%)+E00C(I;RC(mK}8W6>of|3U~scOWK92E`8VcV&d~XM#e5TV`A|1cEzl<rQLQOYRmL6Nb8}BfU)e@c{<XF{cVHh(DI&0T&}-nd5-HJp%w_ljn$Cy*TF`PtIRgVO+n&5E{x`J5x+}MLg>)?;Y;`Q!u>ADY&1Iy5m})kih1hzWWy2~a9*04B$m-&?!<=X-r3x|QJy^6)T~wh;0X9GXG>zx)mHDPMgpEd5FgNrH(D;nk7!|@Am--=>uswQcFQ8F%Hc015g`x=1kr|C)S!Hv{S;DW)r{P%Y6uoDnWEu;fSl(LK8(~K2W|<;fS~kTvR@yr+NUp^b%90ZkEpKqeQsV+o;1Ji4j1qeA0X#PDh)vppz5%%6SqQ8v(@gp`Vyh@xxnG7XSx?c_(`0WKBb1Q*y2@~ZS^_p-#J&RF19`=a1`(&&QK$#v6&E19!;j^-ZVJv;D5)7{^)#yX#M}j_#0s~UiDc090jcRCZ@?PP7i<dbTAvyJ9)JcX3t*k@!Kd9>=of0Q&gmas7=NzbmaE&*A3O;SA-``*kWYH8~^qCZT&wlwC9Z1YtkUL-mLs|dOe-LR%hGHmkmPim$FZj+GJh_fxptQU#%`f7SM9-<yAxSErCGjzT5H{#o=~C%OQ9r)uP?~emyVg`Am68zt{Hu9~`LV8X7hVf#cM!9?c_hS^Ty7-09u=dub$VUHAsat43a=h4~Lfd*>-ttDA+iF#oCK`eq(dH|Bp{Q_zb#c>db&0}J@ycPr=#B8F+DpNn=nfBu>ac!GHFy5!)Ptp2?HN>RXf8WrEAf9YNZK|jUVua<BXcpVP1RTR1TgY@Ls&!-GTl&5LGx(qd35F1lc(>wx!QniPRcV2=(`<dq<D+&VTU#s<lE|NZxAeL~l##KlUF~!3CKkA|vc573<tD!;q8p9sTp3y*s9ywVhgXDivr6~OSL-sLHs3!=S=o_3*YX|V-gakZ+&<$XD+`AuXI+IuTEfVkqf+W&7&&_e}9}Hd{bWveR8!strWiIf$^$Y(wSfGF>bQJEKBCn+oP;*@R=0rds&3y2plziT{>lz`8BQpBix$*YWD^FrT5a^l`{?m5h@oz{=DCvI}^0cGzmOWe?lLLWk5B2bQc@Q8i|3S_>$b2A(20>K#cz?`)J|f@=AITi1)lIu&+&p5b9Q4qE2CUm#>+T=>Z2K%_;^wpJQ6mlBE1|1LVAYwgH2;kIkLwQf;?9H6=y9QXA3Y9Ksoma)E5Fkq|4`hD`bUse=r^<{=XHmTC+a;p+n*_gfbWzR6+2X)Ex2dNjjx9N*40*A<v^9}TJm{7f@qYbNorQ^x%}V9t`YE}0{S7$xNq?!jE~Ko=^Hx{qr4|pli$>meM3UQuEox35&e<Z@W!auyBVk{H={iM^~jDpKcVERuk_x*?U&;`gAa2RSkJEUGx_-U=R7_4b&0bMX1$7wy!u!l+ZX;+T{=P@N!obTOuAdU@_Z5$=06$M$z{V76ZzxgBj7)git`z(b!?`g!V?U=?Mt+<^#QB>g`>s)9GhaML^d=5L|tPXxyV%jzL&=TQ)|b#4ED?lW^m)J-F)dU?cM~k{g(}6^1m-c(2M-IJC4@4cjG1vjALc5MU>FMVp)_|Weg2a##g;$Lm|Mnz?!)kf~a{jc7;gbbIGP>_g1~-K%TZY&i<@%JIWrk`d-ksUgR-9sPT6GuMlLVo2A&?f?%eS!^+Xw9d`XxndZ|4oH3ZSy1e+xc2kU9$LxF;{+68o6GS6VmhP@&W>?Ul&h=QP>Kz&cDQrGgolp9Xu7dqLbaOny&j*nLzN`Dt6Uvu+H`mc1IL>gdC3jw24PdQLe@Ny7K_Vzn&NH?cavGxETC=9v7D5mZO1<1o@?m?43jX#7pZoK1lbuh<gz5I!Ql_D&w}BPz{8wJelIj)G>UW}FJGb!!34`;d+37z}xEB$uhllOiQwn)X_^>uE)?i=1z7{C(&du3+XDo42&<ah1vvvp^4qspP?m7ggr<E907C<og#T)~VAH*iESr@l9sg1BlV4n5iYx#!w=$H95$?VyPj5vWH4h{Cs&;jy``1K>28QsQrIn1Q0WCl0?HR@hT(El?JZW`#TBs3qg5)@q$Q)Mw_H|%6WS|iQs(<Fc97x8&N3qE^c?Ss*O!1vnT|MRB)PS9$54+M6E<i83s!<w0%x_fk1a`W)w?Y~){fPm4jVZ-WJ2$&1MoME$#?AsmA<Kt0o4*YqC1^frX*f&Z(MtV91?&FuSUMk`A(K0>OT%L+S@TeOD#tlMjy><VsPtrjwg}`UW=gW3}pK`8g`ikg3pGR=A%Zl6~K${P9WOhO@W{{m})B^}=^;)#O>E~?tc>f|r#HMxM87e3v(0qs4lvYIgSpwm6u-EQrMNAD%HAkxyZGJ%mi?mg4S_x!55(os51Kn7z<65tY*n?e^vbP%G{*5w97R{!@&mT5!t=pjA2&uj|k9cKhV#WG}1vzfI<h+6)mQ)Unt7MKU;=iv?z<+QZuH@%h6=H+{W&1^h!G4+@CV#T|fKfMC7dNz;js!x!is(5&a&2z>E^hyy^0&4V#elG*hi<F$`$9oa5O3nYd9D_E8S<1sAP^*#KX%L-V^aZn+C}^y@(C(0"},"H":{"n":2000,"seed_start":200000,"seed_end":201999,"format":"Increasing seed order; each record is three little-endian IEEE754 float64 values: candidate-incumbent total_edge, retail_edge, arb_edge.","encoding":"zlib-compressed, RFC1924 base85 via Python base64.b85encode","raw_sha256":"e7478763b822dbe629c7530492cd478f13a398e8ce54d169f5303da41b6a5c95","compressed_base85":"c-rmVdt8j!9|!QGB2nATC8V3eVkx?@I7b&dKT4=n6jKtm+{#kxvJa_WNadE$swla%mCNcP=C~|YrJ+!2x9Nh|<(Hxh(QmApG`sDxl$rXz|M|W?HNAS~d7g95_jzV&5PCl$7it1_tsF&L%55zX73oaUw59d~>Yen0Y$)oB>s01Se6sBU4I=IL8+G2nX*y6s82|u25O?UY9#Tqrls#jLm1Fd9s?jZyJNxAem}eR=3BF@&ZOSletN?rrWhR7cSdWpT_QKB`Bnfln;#VUd{nGm5F8*+opXp7E5*sRbHx>@R2PifjA0m`R$9J*!&bacA>$#KC-#hbb?at~hqv1G%j?M9;yw&J*!8l-?n&%Jh6C{6HH&joaG-jSq{?p?NO1Gb!`~))r=dvVhp77`6oSc>6Z0Nf{`?7o!r*`~pEU4|>K>ee7&N2i=rSo>p?n3B5GwW+Taxs&B&$4v8GC|}jU1l7N$GCOr$=aaY;`~5l=YMaKQj1Yz{lxA+4^6mapif%LAAFj0PAG}_><Mlu1MmmgZ)Ln@{DhHP9Zy-}B1YuSe=E%W;5-4~ulmgN`bg3V5%eQ2@U!LD6>3>i6l27{&-7N=^&guAPK){7(TxU~XW!amXPajLKwF^>znE-r)1t^(wf~k9Ey`T22{tszdjIwPx{kz>8&#MwTYF*NxN3~N10532?1Ag+Pc70l^nO-82eIdA%bT6ypvjXnOV;Ly|8cQ7c5MSIor9(}Q~&?~?TfC*b%(s&P4hbu$|9m_;@z!jTPg*8Q;kq=YZv<|jyxDzA=pn;C<77WV<CNL=dYX=^E=;wQ1hKiBbt7WEtEwZGe00ft5%aRrJR)(NSoH{L~l>38%cQktk(McZx|IkFhVGURuvKyUb}s<9%;;BLb=^BpO$xXZD+yrOEzns+ZtO!_thu~J<1#POoDLw)2Zr3&o65afb$=KR-O1%qmA8*F$y0Z`)ha!Mrj&)?7jz}j{?p6mYnnMN1UEw=EegXi#7bdU#l+veD}Eb@BagqR8$q7!|1%#%T+vnMN6d}qsm+V^%1HO=k8$Lw7rZ_24aC7SfL!{%<rGg46g*wE5#!%7WZcL(;%>CKCYl6G17M{42X>HS;Oq!Ce-CbNUFJ_CG2MrMLIoNW54euMlWWaah+I(BPFr=z*Q~3--&V5TpLvQ5F@9C3R*?i1$MF0dgg+0BN5R&iwfSW{d-p(wWi#OiylRPZ9!E|C2Wt*HGu1{k8MHD^86kt9Heo3R=1w~ikO+}ye^Ly`{$+Mqmpngj{kf@Zyi293nT6q^UWfD5c}(hFRw|Z9`LXxJdej#-xLm{Hc1k$+gLL`+W1{C?5LV{kviqA93>|;LxHkbRa&H%JdC?WgLfEi3CrZ5sdJM<67x7{&5O}HuKd*D)+;7|;<IHXh>*F_hliBtP*hblP+D~e^kV=306xet_d%wGt1U_SG+S=Q>gn{V#Z%*b-?L$T0qsim1jU#;{T>MV#~h*jC)DrKPzhiD_oIEBf)--L8_gX&&Ij(7G^(7Tq?THWQOYt^<z<gB+WJcQ;iBv9_Vpvlj85~qCMpT8&$zyl%`yO>6>NIo7ajUD2Pyp6+xfR>jIPLKtiFB?UZ)0aid@cCI3U$u&=;EtWwBMKEUPM)f)S}LKT+n3nF9YUokLDRp94h0a1CcOzii9|S!*S4dcr}ccZ`wosDkseLFCr2wGC9qQF65?qMOYWsxjHFA8#`jy?H4&IN*FmCPq1z-qemNvmj`>oE$~U6%(@Dq$pZ`bN3`m{&`KEZ8RC*rrJ>@1*EJvp+y+t5SUTkjVhEx6dYdiIf0Q5+EmRrmtkjV(>SbZ$V`{mIMy+Yj0-E{@fnQh%`mCQu^(-`Y8+29>BW<z%#eB)|67t2u^+GFsC&Wn4iHNU$Dhv1U-1=1i@m*-)Rd@g{$1HVqs(bbk2j4(BeJHOl9n<6007VyNW{06*@MSZu2f{@G&ZJW56k7@%1XHZ(9V75?&MtUGM4HFDr~wq(u8u?_|F^A`ThUigsmISqDh}q<M?}ns_qP;xmxz!_h&p3n|^+2Xilfwds(EH%6ems{X^-(P0!@#Y_NiU3;=PaUCp(ga|@$G`EP0ie;c1nBWWYr)${?5FSMY^UA}Noa-7id#`_LNF2Cp)Mv=1*F81`}AUBKR!67Hbf8AfISstDm%YR<%ITvbnVq{aytXRDp`k9Z-I$dky;H0L{i4e-7PPe#nR>6thG%-6lV!vBoO172v9~pZ0y|<sl?k&nonJ1V(CJ1E!+BMbHY`Ljr7~R?Uriz^>rfEOe^S4{w#YcJS>-WQ6@YA2r0oRMr;R~O~aZvfP5r5RSf-T~sVu~@^us*o=(ISijjPgvUMTp-1KiF-e&Ns)K);poxYU`ALQNXPc&+x@1YEfgJNfCR8St<KcpSFB_WWU3G=pGJAi&G+B9^xRwZTH<y?QD5Fi{}ULGJI>@zIC&C78%ph?c_G{w`<gtPR3psaTl@Ti`R<(I6dS(ASEpmqlbrX&-bjtjE%_&ZtCCszsKozy$7HE6$>g5PX+U9%WkA&l(X+mZIsA5;;nNYBY)Nc{k}X*ji#-N)4UC@j{^WeTZvpOYplbcmlI{Vo2T*DXQo_rpUc(`HxE;(^)d<d-3ilB;ly}1{lk2h4smrQD7nbt((#*|nt;S?$tA9^{{R5spD>06#-_{PT5pXSvhDf4YhM4I`k2$smfjeVq-7y5Mt;KU;I7@~yfS^go!$-g->tL$es@;dKjE~L!CyN&yH`}5yb-Y(u6tG0&6FNYKi#+A<0<dI&K`2jlS)0^bRNYDWno0UFd_G?{}XH`lmYk~CYPqqn6zjvp~SP3W1$MY=r!BWTp#*F(8kwy_r}-vw2~mq-Y<6B21yV^_dm;sh=6sc!O5p_3TDzh1>-VVD7O}(+4soq6;C<n+XTmw=eZo@Ul4O{$?qJLw@$;O5)q9@?$+`S=Jag1SI>zHCc?b&$p_Nrr7^!PY#KL=PzInqlQNbZyS5OcGp@Gm*A-F6UY{4g|L0$nmDlgCj>agAWUyAmV8q;;bmFL$_>7~tjpTOMha41AUDm()28UfLXTjRS6Z?6<>+m+&$G%qt*EgO*`4hNuKUL?g-(PpRd2Zv|6*AsiO=gdwyc@RhhV};3cv4{C2$dcbCWe2hO4qGVof--0-t&(4`9VZ?VYOv$fCB7KQKhS>P<-mG&y61@lz~WL_Sm_X)^;LD-{9+S#`0^Hg*NYpB(cAL#jLLm9Pe3!8!H@X06Lz?Q<K7yjCBdG@MWp~%mFmu;LqJ|+#O9|&wN_0TAq4IdBdo&a*5i*JWG1e+JE}$191OJWT|8<4`Z@0+K}SuvoRl|yT2@*x$QFabwIT7)K85I*uiNr0|5R}NJ?_r+*}30`Wz^fMTOR3uY`?uo`h$s89~_EG~}Ge$<5C_#lNp$5_*ifwg3yNsG`gI7#Uo{XsKPsa6^7Y<d$vKtFthI+6Ft=OeSWV9bF#zQtzh6RC>~~pA+6SmcpL-$S#=M_*!-$jJ<`TAHVXyGIJp}9nNzA0001poc{y=AiwJ"}},"offline_reproduction_code":"\"\"\"Usage: python3 offline_reproduce.py path/to/result.json\nExtract offline evaluation inputs. To remeasure, use a NEW empty scratch folder\nor remove local evaluation ledgers first; do not use remeasurement to tune on H.\n\"\"\"\nimport base64\nimport hashlib\nimport json\nfrom pathlib import Path\nimport sys\nimport zlib\n\nresult=json.loads(Path(sys.argv[1]).read_text())\nroot=Path('test/scratch')\nroot.mkdir(parents=True,exist_ok=True)\nevidence=result['evidence']\ncode=result['code']\nassert hashlib.sha256(code.encode()).hexdigest()==result['code_sha256']\nchange=result['tried'][0]['change']\nassert code.count(change['after'])==1\nincumbent=code.replace(change['after'],change['before'])\nassert hashlib.sha256(incumbent.encode()).hexdigest()==result['incumbent_code_sha256']\n(root/'candidate.py').write_text(code)\n(root/'incumbent.py').write_text(incumbent)\n(root/'evaluate.py').write_text(evidence['evaluator_code'])\n(root/'freeze.py').write_text(evidence['freeze_code'])\nsnapshot=evidence['simulator_snapshot']\nraw=zlib.decompress(base64.b85decode(snapshot['compressed_base85']))\nassert hashlib.sha256(raw).hexdigest()==snapshot['raw_sha256']\nmodules=json.loads(raw)\npackage=root/'simulator/orderbook_pm_challenge'\npackage.mkdir(parents=True,exist_ok=True)\nfor name,source in modules.items():\n    assert Path(name).name==name and name.endswith('.py')\n    assert hashlib.sha256(source.encode()).hexdigest()==snapshot['module_sha256'][name]\n    (package/name).write_text(source)\nprint('Offline inputs reconstructed. Run evaluate.py --split T; then freeze.py; then evaluate.py --split H --freeze test/scratch/freeze.json, using the same Python interpreter and serial execution.')\n","paired_data_decoder_code":"import base64, struct, zlib\nraw = zlib.decompress(base64.b85decode(payload['compressed_base85']))\ntriples = list(struct.iter_unpack('<ddd', raw))\n# Row i belongs to seed payload['seed_start'] + i.\n","prepare_code":"import ast, difflib, hashlib, json\nfrom pathlib import Path\np=Path('test/scratch')\ns=(p/'incumbent.py').read_text()\nold=\"if P['ydf1'] > 0 and P['m1'] < ptick < P['g1'] + 1.0 and amt != 1:\"\nnew=\"if P['ydf1'] > 0 and P['m1'] < ptick and cb <= 1 and amt != 1:\"\nassert s.count(old)==1\nc=s.replace(old,new)\nassert hashlib.sha256(s.encode()).hexdigest()=='baef955ec10728839f7c3357016ec9eb0550e7ec689bbd5171b1cdd5c9e37273'\nast.parse(c)\n(p/'candidate.py').write_text(c)\nprint(''.join(difflib.unified_diff(s.splitlines(True),c.splitlines(True),fromfile='incumbent',tofile='candidate')))\nprint('candidate_sha256',hashlib.sha256(c.encode()).hexdigest())\n","evaluator_code":"\"\"\"Serial paired evaluator; no sandbox, parallelism, or simulator modifications.\nRun T first (optionally resumed from its exact prefix ledger); freeze externally;\nthen run H once with --freeze pointing to that recorded commitment.\n\"\"\"\nimport argparse\nfrom dataclasses import asdict\nfrom datetime import datetime, timezone\nimport hashlib\nimport json\nimport math\nfrom pathlib import Path\nimport statistics\nimport sys\nimport time\nimport traceback\n\nROOT=Path(__file__).resolve().parent\nsys.path.insert(0,str(ROOT/'simulator'))\nfrom orderbook_pm_challenge.config import ChallengeConfig, ParameterVariance\nfrom orderbook_pm_challenge.engine import SimulationEngine\nfrom orderbook_pm_challenge.loader import load_strategy_factory\nfrom orderbook_pm_challenge.runner import sample_config\n\nINCUMBENT='baef955ec10728839f7c3357016ec9eb0550e7ec689bbd5171b1cdd5c9e37273'\nCANDIDATE='a709c7e85c7dc5200cba83d854cc7ecc9cee8a70915ca79798504da648e9ebed'\ndef sha(path): return hashlib.sha256(path.read_bytes()).hexdigest()\ndef now(): return datetime.now(timezone.utc).isoformat()\ndef summary(rows, split, elapsed):\n    expected=(100000,101999) if split=='T' else (200000,201999)\n    failed=[]\n    for row in rows:\n        for name in ('candidate','incumbent'):\n            r=row[name]\n            if r['failed']:\n                failed.append({'seed':row['seed'],'strategy':name,'error':r['error']})\n    result={'n':len(rows),'seeds':{'start':rows[0]['seed'] if rows else None,'end':rows[-1]['seed'] if rows else None,'inclusive':True,'requested_start':expected[0],'requested_end':expected[1]},'failures':failed,'elapsed_seconds_this_invocation':elapsed}\n    result['complete']=len(rows)==2000 and [r['seed'] for r in rows]==list(range(expected[0],expected[1]+1))\n    result['eligible_for_ranking']=result['complete'] and not failed\n    for name in ('candidate','incumbent'):\n        result[name]={key+'_mean':statistics.mean([r[name][key] for r in rows]) if rows else None for key in ('total_edge','retail_edge','arb_edge')}\n    result['components']={}\n    for key,label in [('total_edge','total'),('retail_edge','retail'),('arb_edge','arbitrage')]:\n        # Failed engine results remain in the ledger and in these descriptive statistics.\n        # They make the whole comparison ineligible, rather than being dropped.\n        ds=[r['candidate'][key]-r['incumbent'][key] for r in rows]\n        result['components'][label]={'mean_diff':statistics.mean(ds) if ds else None,'se':statistics.stdev(ds)/math.sqrt(len(ds)) if len(ds)>1 else None,'sum_diff':math.fsum(ds),'sum_squared_diff':math.fsum(d*d for d in ds)}\n    result['mean_diff']=result['components']['total']['mean_diff']\n    result['se']=result['components']['total']['se']\n    return result\n\ndef main():\n    parser=argparse.ArgumentParser()\n    parser.add_argument('--split',choices=['T','H'],required=True)\n    parser.add_argument('--limit',type=int,default=2000)\n    parser.add_argument('--freeze',type=Path)\n    args=parser.parse_args()\n    assert 1<=args.limit<=2000\n    assert sha(ROOT/'incumbent.py')==INCUMBENT\n    assert sha(ROOT/'candidate.py')==CANDIDATE\n    base=ChallengeConfig(); variance=ParameterVariance()\n    assert base.process.n_steps==2000\n    if args.split=='H':\n        assert args.limit==2000 and args.freeze is not None\n        frozen=json.loads(args.freeze.read_text())\n        assert frozen['code_sha256']==CANDIDATE\n        assert frozen['incumbent_code_sha256']==INCUMBENT\n        assert frozen['tuning_complete'] and frozen['tuning_n']==2000\n    ledger=ROOT/(args.split+'.jsonl')\n    rows=[]\n    if ledger.exists():\n        assert args.split=='T', 'H is evaluated only once; existing ledger refuses replay'\n        rows=[json.loads(line) for line in ledger.read_text().splitlines()]\n    start=100000 if args.split=='T' else 200000\n    assert [r['seed'] for r in rows]==list(range(start,start+len(rows)))\n    assert len(rows)<=args.limit\n    factories={name:load_strategy_factory(str(ROOT/(name+'.py'))) for name in ('incumbent','candidate')}\n    started=now(); t0=time.monotonic()\n    print(json.dumps({'event':'start','split':args.split,'utc':started,'existing_n':len(rows),'target_n':args.limit,'code_sha256':CANDIDATE}),flush=True)\n    with ledger.open('a') as out:\n        for seed in range(start+len(rows),start+args.limit):\n            assert (100000<=seed<=101999) or (200000<=seed<=201999)\n            config=sample_config(base,variance,seed=seed)\n            row={'seed':seed}\n            for name in ('incumbent','candidate'):\n                try:\n                    r=SimulationEngine(config,factories[name],seed=seed).run()\n                    assert r.seed==seed\n                    row[name]={'failed':r.failed,'error':r.error,'total_edge':r.total_edge,'retail_edge':r.retail_edge,'arb_edge':r.arb_edge}\n                    assert all(math.isfinite(row[name][k]) for k in ('total_edge','retail_edge','arb_edge'))\n                except Exception:\n                    # Preserve an unexpected failure, stop, and make no numeric claim for it.\n                    error={'event':'uncaught_failure','seed':seed,'strategy':name,'traceback':traceback.format_exc(),'utc':now()}\n                    (ROOT/(args.split+'_fatal.json')).write_text(json.dumps(error,indent=2))\n                    raise\n            out.write(json.dumps(row,sort_keys=True)+'\\n');out.flush()\n            rows.append(row)\n            if len(rows)%100==0 or len(rows)==args.limit:\n                print(json.dumps({'event':'progress','split':args.split,'n':len(rows),'utc':now(),'elapsed':time.monotonic()-t0,'mean_diff':statistics.mean(r['candidate']['total_edge']-r['incumbent']['total_edge'] for r in rows)}),flush=True)\n    result=summary(rows,args.split,time.monotonic()-t0)\n    result.update(started_utc=started,finished_utc=now(),ledger_sha256=sha(ledger),candidate_code_sha256=CANDIDATE,incumbent_code_sha256=INCUMBENT)\n    (ROOT/(args.split+'_summary.json')).write_text(json.dumps(result,indent=2,allow_nan=False)+'\\n')\n    print(json.dumps(result,allow_nan=False),flush=True)\n\nif __name__=='__main__': main()\n","evaluator_sha256":"91fdcde31c94e9ff824696149a295192dfd1d1aeffa603651887e44c59bbf672","freeze_code":"from datetime import datetime, timezone\nimport hashlib\nimport json\nfrom pathlib import Path\nR=Path(__file__).resolve().parent\nsha=lambda p:hashlib.sha256(p.read_bytes()).hexdigest()\nt=json.loads((R/'T_summary.json').read_text())\nassert t['complete'] and t['n']==2000 and not t['failures']\nassert not (R/'H.jsonl').exists(), 'H must remain untouched until after freeze'\nassert not (R/'freeze.json').exists(), 'Freeze is created exactly once'\nassert sha(R/'candidate.py')=='a709c7e85c7dc5200cba83d854cc7ecc9cee8a70915ca79798504da648e9ebed'\nassert sha(R/'incumbent.py')=='baef955ec10728839f7c3357016ec9eb0550e7ec689bbd5171b1cdd5c9e37273'\nf={'code_sha256':sha(R/'candidate.py'),'incumbent_code_sha256':sha(R/'incumbent.py'),'frozen_utc':datetime.now(timezone.utc).isoformat(),'tuning_complete':True,'tuning_n':t['n'],'tuning_finished_utc':t['finished_utc'],'tuning_ledger_sha256':t['ledger_sha256'],'tuning_mean_diff':t['mean_diff'],'tuning_se':t['se'],'selection':'Retain the sole prescribed candidate after full T. No choice, revision, or promotion will be made using H.','H_evaluations_before_freeze':0}\n(R/'freeze.json').write_text(json.dumps(f,indent=2)+'\\n')\nprint(json.dumps(f))\n","local_checks":{"single_expression_replacement":true,"syntax_valid":true,"gate_truth_table_cases":168,"candidate_sha256":"a709c7e85c7dc5200cba83d854cc7ecc9cee8a70915ca79798504da648e9ebed","offline_extraction_and_imports_valid":true,"snapshot_modules":12,"simulations_run":0,"reconstructed_candidate_sha256":"a709c7e85c7dc5200cba83d854cc7ecc9cee8a70915ca79798504da648e9ebed","reconstructed_incumbent_sha256":"baef955ec10728839f7c3357016ec9eb0550e7ec689bbd5171b1cdd5c9e37273"},"verification":"Recomputed every mean and paired sample SE independently from all ledger rows using math.fsum; asserted exact contiguous seed coverage, code hashes, simulator commit/clean diff, and T finish <= freeze < H start. Checked syntax and the 168-case gate truth table. No rows dropped.","failures":{"T":[],"H":[],"uncaught_evaluation_failures":[],"tooling_notes":["Initial python command was unavailable; used python3. Initial web-view retrieval failed; direct HTTPS retrieval and pinned git checkout succeeded. These were setup issues; no simulation was omitted."]},"packaging_repairs":[{"check":"Result JSON byte limit","initial_pretty_json_bytes":67817,"limit_bytes":64000,"repair":"Use compact JSON separators without changing measured values or evidence."}],"limitations":["This item does not use reserved finalist seeds and makes no promotion claim. Standard errors quantify paired sampling variation on the listed ranges, not a guarantee for other seeds. Full per-strategy ledgers were retained in disposable test scaffolding; their SHA256 commitments are recorded. Exact per-seed total, retail, and arbitrage paired differences are embedded as compressed data, with a decoder, and sufficient paired sums are also recorded."]}}
