Files
SirRoboGarage/common_libs/tests/fixtures/headon_longrange_live_results.json
T
SirStone 140fe2519a HeadOn (no-lead) vs Pattern LIVE at long range: clean negative, offline ruler killed
2 arms x 15 runs x 7 rounds, one frozen binary from HEAD a82c864, real DrussGT,
server-side events sidecar. Shipped rack is onlyPattern, so control=Pattern-only
and headon=HeadOn-only (TR_RACK_PATTERN=off TR_RACK_HEADON=both).

  arm      dmg/run  dmgtk/run  round wins  shots/run
  control      279        211     48/105       785
  headon        14        228      0/105       580

Round wins and dmg/run both separate at p<0.0001 (MC permutation, se 0.0000),
~7x the damage MDE (35.8). Per range band (pooled, 15 runs):
  300-450: Pattern 12.3% (4590 shots) vs HeadOn 0.6% (3701)  p<0.0001, MDE 2.0pp
  450+   : Pattern  9.2% (6671)       vs HeadOn 0.4% (4177)  p<0.0001, MDE 1.1pp
HeadOn loses EVERY long-range band by 20-23x, so the whole-battle loss is not a
close-range artefact.

The offline ruler (prediction_quality_results.txt) predicted the opposite: HeadOn
meanAbs 14.61 vs Pattern 17.53 at 300-450 and 12.33 vs 16.19 at 450+, hitProxy
.105/.104 and .098/.077 (+27%). That is an open-loop replay of a FIXED enemy
track, so it cannot see that a different bullet makes the surfer dodge
differently; live, the static gun does not lead at all.

TR_PATTERN_RAD_SCALE arms were skipped: applyRadial scales aim DISTANCE along an
unchanged bearing, so it cannot express 'less lead' (bearing is what firing uses).
HeadOn confirmed to ignore bulletSpeed (head_on.nim:9), liveness OK 15/15.

Adds the range-band analyzer tools/ab/ab_range_bands.py (reuses the lead-capture
Run alignment) and the captured fixtures. Does not touch bitbrain_gun.nim /
bitbrain_campaign.md (job-100).
2026-09-24 23:52:49 +02:00

199 lines
2.9 KiB
JSON

{
"arms": {
"control": {
"bands_pooled": {
"0-100": {
"hits": 2,
"shots": 3
},
"100-200": {
"hits": 4,
"shots": 28
},
"200-300": {
"hits": 26,
"shots": 211
},
"300-450": {
"hits": 565,
"shots": 4590
},
"450+": {
"hits": 616,
"shots": 6671
},
"ALL": {
"hits": 1213,
"shots": 11503
}
},
"runs": {
"run1.jsonl": {
"hits": 81,
"shots": 781
},
"run10.jsonl": {
"hits": 90,
"shots": 819
},
"run11.jsonl": {
"hits": 78,
"shots": 822
},
"run12.jsonl": {
"hits": 80,
"shots": 781
},
"run13.jsonl": {
"hits": 85,
"shots": 754
},
"run14.jsonl": {
"hits": 78,
"shots": 811
},
"run15.jsonl": {
"hits": 62,
"shots": 628
},
"run2.jsonl": {
"hits": 92,
"shots": 750
},
"run3.jsonl": {
"hits": 90,
"shots": 751
},
"run4.jsonl": {
"hits": 67,
"shots": 761
},
"run5.jsonl": {
"hits": 88,
"shots": 830
},
"run6.jsonl": {
"hits": 72,
"shots": 725
},
"run7.jsonl": {
"hits": 86,
"shots": 731
},
"run8.jsonl": {
"hits": 77,
"shots": 774
},
"run9.jsonl": {
"hits": 87,
"shots": 785
}
}
},
"headon": {
"bands_pooled": {
"0-100": {
"hits": 0,
"shots": 1
},
"100-200": {
"hits": 8,
"shots": 97
},
"200-300": {
"hits": 12,
"shots": 469
},
"300-450": {
"hits": 21,
"shots": 3701
},
"450+": {
"hits": 15,
"shots": 4177
},
"ALL": {
"hits": 56,
"shots": 8445
}
},
"runs": {
"run1.jsonl": {
"hits": 2,
"shots": 590
},
"run10.jsonl": {
"hits": 6,
"shots": 604
},
"run11.jsonl": {
"hits": 5,
"shots": 550
},
"run12.jsonl": {
"hits": 2,
"shots": 522
},
"run13.jsonl": {
"hits": 4,
"shots": 616
},
"run14.jsonl": {
"hits": 3,
"shots": 584
},
"run15.jsonl": {
"hits": 4,
"shots": 549
},
"run2.jsonl": {
"hits": 3,
"shots": 561
},
"run3.jsonl": {
"hits": 1,
"shots": 552
},
"run4.jsonl": {
"hits": 6,
"shots": 570
},
"run5.jsonl": {
"hits": 4,
"shots": 567
},
"run6.jsonl": {
"hits": 3,
"shots": 520
},
"run7.jsonl": {
"hits": 8,
"shots": 605
},
"run8.jsonl": {
"hits": 5,
"shots": 588
},
"run9.jsonl": {
"hits": 0,
"shots": 467
}
}
}
},
"band_labels": [
"0-100",
"100-200",
"200-300",
"300-450",
"450+"
],
"session": {
"binary_sha256": "9d20f530d633982b30735d5ece38da09b707737ae1c57238ee41abe928276601",
"commit": "a82c864c6075d8325589681bae23b371e3c4f1b5",
"conc": 8,
"rounds": 7,
"runs": 15,
"timestamp": "2026-09-24T23:45:01+02:00"
}
}