feat(bots): promote gen5 stage-5 policy to the Hard tier

Hard has been a label-only duplicate of medium.json since medium was promoted
on 2026-08-17. Promote 20260823-1734-gen5-s5-intercepts-retry2 into
hard.json so the tier is a genuinely distinct policy, and so the strongest bot
the curriculum has produced survives the next round's checkpoint pruning —
promoted files are never touched by training scripts.

Stage 5 blocked after three attempts, so like medium.json this comes from a run
recorded as decision: "fail". Both failing floors are covered in TRAINING.md:
goal_rate 0.7369 vs 0.75 is marginal, and productive_air_touch_fraction 0.0001
vs 0.005 is a bar no policy in the lineage has approached, against a metric
quantised at 0.01 per ~100-episode window. On every other axis it is the best
yet: upright_fraction 0.757 against a 0.40 floor that the pre-Round-6 lineage
never pushed past 0.331, and forward_motion_fraction 0.479 against 0.20.

Chosen over attempt 2 (retry1) on a tiebreak, not a margin. retry1 posts a much
wider indirect result against medium.json (63-23-14 vs 47-32-21), but a direct
100-episode head-to-head between the two finished 36-39 with 25 draws, so that
gap does not reflect a real strength difference. Attempt 3 is the later
checkpoint (it resumed from attempt 2) and edges every telemetry metric.

Verified: hard.json is byte-identical to its source export, matches easy/medium
on input_size 83, 3 layers and action space, and beats medium.json 19-7-4 in a
fresh 30-episode paired run. Tiers stay monotonic: hard > medium > easy.

That head-to-head also showed a 17% physical side imbalance (physical teams
0-1 = 29-46), reproduced at 13% in the 30-episode check. Inside the 20% bar
used elsewhere and equal across both models, but noted in TRAINING.md as worth
investigating rather than assuming variance.
This commit is contained in:
Josh Creek
2026-08-24 08:46:06 +01:00
parent 6320b982a8
commit e1f512c94e
4 changed files with 62 additions and 11 deletions
+27
View File
@@ -1062,5 +1062,32 @@
"team_1": 43
},
"win_rate_a": 0.47
},
{
"timestamp": "2026-08-24T07:43:21+00:00",
"model_a": "/Users/jcreek/Documents/repos/GitHub/CosmicClash/Game/bots/20260823-0258-gen5-s5-intercepts-retry1.json",
"model_b": "/Users/jcreek/Documents/repos/GitHub/CosmicClash/Game/bots/20260823-1734-gen5-s5-intercepts-retry2.json",
"seed": 1,
"episodes": 100,
"wins_a": 36,
"wins_b": 39,
"draws": 25,
"side_results": {
"a_team_0": {
"wins_a": 15,
"wins_b": 25,
"draws": 10
},
"a_team_1": {
"wins_a": 21,
"wins_b": 14,
"draws": 15
}
},
"physical_team_wins": {
"team_0": 29,
"team_1": 46
},
"win_rate_a": 0.36
}
]