{
 "key": "f5-two-step-retreat",
 "mechanism": "f5-two-step-retreat: two consecutive same-side rival retreats -> cancel both sides, place nothing for C callbacks",
 "approach": "Overlay on RC: track rival best bid/ask each step; if bid fell (or ask rose) on two consecutive steps, cancel all own orders and drop all PlaceOrders for C callbacks (incl. the trigger step). Acts on s in 1..4 (s from first rival quotes). C=0 returns RC unchanged. Tuned C in {2,3,5} on 330000..330199; froze C=2 (least negative).",
 "tried": [
  {
   "name": "C=2",
   "code_sha256": "78921a9d9e71faca2bfcb735dfbe2958e731d681fe8d94690b857641ccfc532b",
   "mean_diff": -2.4864701558160003,
   "se": 0.5692203771622988
  },
  {
   "name": "C=3",
   "code_sha256": "97b5f2d79ee3cab4b3150f74aceb7ef7d3ba2655325dc8444ad7ac40afdc61f5",
   "mean_diff": -3.2971603258234983,
   "se": 0.6521405480207011
  },
  {
   "name": "C=5",
   "code_sha256": "e147467ccd382c173c90a2515a2df53fbe2d6f859bbf432025c0ca718be416af",
   "mean_diff": -4.192466219925,
   "se": 0.6851348717759599
  }
 ],
 "next": "Reject: every variant loses edge (retail loss from pausing outweighs any arb saving, and arb loss also rose at s=3,4). Two-step rival retreat is not a useful toxicity signal for RC; do not pursue pausing on rival-quote trends.",
 "spreads_acted": [
  1,
  2,
  3,
  4
 ],
 "off_equals_rc": true,
 "frozen_variant": "C=2",
 "code": "class Strategy(_RC):\n    \"\"\"Overlay f5-two-step-retreat: when the rival retreats on the same side on\n    two consecutive steps, cancel all own orders and place nothing for C callbacks.\n    Acts only when rival spread s (from first quotes) is in ACT_SPREADS.\"\"\"\n    PAUSE_C = 2\n    ACT_SPREADS = (1, 2, 3, 4)\n\n    def __init__(self, *a, **k):\n        super().__init__(*a, **k)\n        self._f5_s = None\n        self._f5_prev = None\n        self._f5_run_bid = 0\n        self._f5_run_ask = 0\n        self._f5_pause = 0\n\n    def on_step(self, state):\n        actions = list(super().on_step(state))\n        if self.PAUSE_C <= 0:\n            return actions\n        b = state.competitor_best_bid_ticks\n        a = state.competitor_best_ask_ticks\n        if self._f5_s is None and b is not None and a is not None:\n            self._f5_s = max(1, (a - b + 1) // 2)\n        if self._f5_s not in self.ACT_SPREADS:\n            return actions\n        trigger = False\n        if self._f5_prev is not None:\n            pb, pa = self._f5_prev\n            if b is not None and pb is not None:\n                self._f5_run_bid = self._f5_run_bid + 1 if b < pb else 0\n            if a is not None and pa is not None:\n                self._f5_run_ask = self._f5_run_ask + 1 if a > pa else 0\n            if self._f5_run_bid >= 2 or self._f5_run_ask >= 2:\n                trigger = True\n                self._f5_run_bid = 0\n                self._f5_run_ask = 0\n        self._f5_prev = (b, a)\n        if trigger:\n            self._f5_pause = self.PAUSE_C\n        if self._f5_pause > 0:\n            self._f5_pause -= 1\n            out = []\n            seen = set()\n            for x in actions:\n                if isinstance(x, PlaceOrder):\n                    continue\n                if isinstance(x, CancelOrder):\n                    if x.order_id in seen:\n                        continue\n                    seen.add(x.order_id)\n                out.append(x)\n            for o in state.own_orders:\n                if o.order_id not in seen:\n                    seen.add(o.order_id)\n                    out.append(CancelOrder(o.order_id))\n            return out\n        return actions\n",
 "code_sha256": "78921a9d9e71faca2bfcb735dfbe2958e731d681fe8d94690b857641ccfc532b",
 "assembled_sha256": "d1412653edcd7aae7ee2c8de271f6f90150e7baac47b1818e4705ed580709ee8",
 "comparator_sha256": "3c07bdcd221ac25729c3ebc92b21ac9e2014510ecb85816c4391ed81e933291f",
 "tuning": {
  "seeds": "330000..330199",
  "variants": {
   "C=2": {
    "overall": {
     "n": 200,
     "sum_d": -497.2940311632001,
     "sum_d2": 14132.177910668957,
     "mean_diff": -2.4864701558160003,
     "se": 0.5692203771622988,
     "comparator_mean": 97.4672213329115,
     "candidate_mean": 94.9807511770955,
     "retail_diff": -1.5996289830969987,
     "arb_diff": -0.8868411727110006
    },
    "by_spread": {
     "1": {
      "n": 54,
      "sum_d": -1.076153843200157,
      "sum_d2": 40.11679122795225,
      "mean_diff": -0.01992877487407698,
      "se": 0.11836196364353961,
      "comparator_mean": 46.182844338938885,
      "candidate_mean": 46.16291556406481,
      "retail_diff": -0.14615436835370296,
      "arb_diff": 0.12622559349629542
     },
     "2": {
      "n": 57,
      "sum_d": -65.90895236540003,
      "sum_d2": 427.4527915649254,
      "mean_diff": -1.1562974099192986,
      "se": 0.33172030176185646,
      "comparator_mean": 87.23571902150526,
      "candidate_mean": 86.07942161158596,
      "retail_diff": -1.7693403172403501,
      "arb_diff": 0.6130429073298242
     },
     "3": {
      "n": 49,
      "sum_d": -247.08757527439988,
      "sum_d2": 10631.40185473531,
      "mean_diff": -5.042603577028569,
      "se": 1.9976002997109599,
      "comparator_mean": 112.87398754092447,
      "candidate_mean": 107.83138396389592,
      "retail_diff": -3.0609613578653034,
      "arb_diff": -1.981642219191838
     },
     "4": {
      "n": 40,
      "sum_d": -183.22134968020006,
      "sum_d2": 3033.2064731407704,
      "mean_diff": -4.580533742005001,
      "se": 1.1859095013129939,
      "comparator_mean": 162.4077324637125,
      "candidate_mean": 157.82719872170748,
      "retail_diff": -1.5298489027549984,
      "arb_diff": -3.0506848392100006
     }
    }
   },
   "C=3": {
    "overall": {
     "n": 200,
     "sum_d": -659.4320651646997,
     "sum_d2": 19100.68755887197,
     "mean_diff": -3.2971603258234983,
     "se": 0.6521405480207011,
     "comparator_mean": 97.4672213329115,
     "candidate_mean": 94.17006100708801,
     "retail_diff": -2.2828870784279984,
     "arb_diff": -1.0142732473679998
    },
    "by_spread": {
     "1": {
      "n": 54,
      "sum_d": 2.5595707242999493,
      "sum_d2": 41.6548296324259,
      "mean_diff": 0.047399457857406464,
      "se": 0.12046599969149965,
      "comparator_mean": 46.182844338938885,
      "candidate_mean": 46.230243796796294,
      "retail_diff": -0.14013061392407275,
      "arb_diff": 0.18753007181481496
     },
     "2": {
      "n": 57,
      "sum_d": -79.49616698110003,
      "sum_d2": 747.6242090716673,
      "mean_diff": -1.3946695961596496,
      "se": 0.44663645554833475,
      "comparator_mean": 87.23571902150526,
      "candidate_mean": 85.84104942534562,
      "retail_diff": -2.328209560214035,
      "arb_diff": 0.9335399640526314
     },
     "3": {
      "n": 49,
      "sum_d": -338.3136548146997,
      "sum_d2": 13708.239804799028,
      "mean_diff": -6.904360302340811,
      "se": 2.198909790630002,
      "comparator_mean": 112.87398754092447,
      "candidate_mean": 105.96962723858367,
      "retail_diff": -4.486042051310204,
      "arb_diff": -2.4183182510510197
     },
     "4": {
      "n": 40,
      "sum_d": -244.1818140931999,
      "sum_d2": 4603.168715368847,
      "mean_diff": -6.104545352329998,
      "se": 1.412524054032241,
      "comparator_mean": 162.4077324637125,
      "candidate_mean": 156.3031871113825,
      "retail_diff": -2.4121589271824955,
      "arb_diff": -3.6923864250274994
     }
    }
   },
   "C=5": {
    "overall": {
     "n": 200,
     "sum_d": -838.4932439849999,
     "sum_d2": 22197.86434347619,
     "mean_diff": -4.192466219925,
     "se": 0.6851348717759599,
     "comparator_mean": 97.4672213329115,
     "candidate_mean": 93.2747551129865,
     "retail_diff": -3.4942076834229994,
     "arb_diff": -0.6982585364970003
    },
    "by_spread": {
     "1": {
      "n": 54,
      "sum_d": 9.809385621599867,
      "sum_d2": 85.51747947311621,
      "mean_diff": 0.18165528928888644,
      "se": 0.1710488390563207,
      "comparator_mean": 46.182844338938885,
      "candidate_mean": 46.364499628227776,
      "retail_diff": -0.08041188567222128,
      "arb_diff": 0.2620671749796305
     },
     "2": {
      "n": 57,
      "sum_d": -131.25397839180002,
      "sum_d2": 1395.1039641012042,
      "mean_diff": -2.302701375294737,
      "se": 0.5851293281700043,
      "comparator_mean": 87.23571902150526,
      "candidate_mean": 84.93301764621053,
      "retail_diff": -3.227953925475438,
      "arb_diff": 0.9252525501789465
     },
     "3": {
      "n": 49,
      "sum_d": -370.4027868798999,
      "sum_d2": 13408.778530415979,
      "mean_diff": -7.559240548569385,
      "se": 2.123805663219552,
      "comparator_mean": 112.87398754092447,
      "candidate_mean": 105.3147469923551,
      "retail_diff": -6.555614478175512,
      "arb_diff": -1.0036260704224504
     },
     "4": {
      "n": 40,
      "sum_d": -346.64586433489984,
      "sum_d2": 7308.4643694858905,
      "mean_diff": -8.666146608372497,
      "se": 1.661089480287431,
      "comparator_mean": 162.4077324637125,
      "candidate_mean": 153.74158585534002,
      "retail_diff": -4.732020291889997,
      "arb_diff": -3.934126316445
     }
    }
   }
  }
 },
 "paired": {
  "seeds": "440000..440499",
  "n": 500,
  "complete": true,
  "missing_seeds": [],
  "overall": {
   "n": 500,
   "sum_d": -1347.6938197349994,
   "sum_d2": 71066.93744913269,
   "mean_diff": -2.6953876394699985,
   "se": 0.5198827530283228,
   "comparator_mean": 101.4369248623788,
   "candidate_mean": 98.74153722290879,
   "retail_diff": -1.4899183806153993,
   "arb_diff": -1.2054692588449998
  },
  "by_spread": {
   "1": {
    "n": 142,
    "sum_d": 18.10607111600002,
    "sum_d2": 500.75510296586043,
    "mean_diff": 0.12750754307042267,
    "se": 0.15778129700540197,
    "comparator_mean": 28.7146791778493,
    "candidate_mean": 28.842186720919717,
    "retail_diff": 0.05613545841619735,
    "arb_diff": 0.07137208465704288
   },
   "2": {
    "n": 110,
    "sum_d": -80.83242098749992,
    "sum_d2": 677.3625995937938,
    "mean_diff": -0.7348401907954538,
    "se": 0.2270240602469613,
    "comparator_mean": 88.78927784058273,
    "candidate_mean": 88.05443764978727,
    "retail_diff": -1.4960602118054545,
    "arb_diff": 0.7612200210145454
   },
   "3": {
    "n": 119,
    "sum_d": -274.43721080149965,
    "sum_d2": 3192.397848468,
    "mean_diff": -2.3061950487520977,
    "se": 0.4269356426842082,
    "comparator_mean": 143.37780997585293,
    "candidate_mean": 141.07161492710085,
    "retail_diff": -3.1039408226117637,
    "arb_diff": 0.7977457738554625
   },
   "4": {
    "n": 129,
    "sum_d": -1010.5302590619998,
    "sum_d2": 66696.42189810504,
    "mean_diff": -7.833567899705425,
    "se": 1.8867584228284489,
    "comparator_mean": 153.5829305298,
    "candidate_mean": 145.7493626300946,
    "retail_diff": -1.6976344512666652,
    "arb_diff": -6.135933448404651
   }
  }
 },
 "failures": 0,
 "check_values": {
  "310000": 17.5126554022,
  "310001": 20.6298693268,
  "310002": 2.3903113616,
  "310003": 248.006347259
 },
 "python_version": "3.12.3",
 "seconds_per_simulation": 0.7633709778785706,
 "notes": "Off check covered seeds 310000..310003 (4 seeds). Assembly renames every whole-word Strategy in RC to _RC (RC references the name at module level, so renaming only the class line fails). se formula as in brief."
}