mirror of
https://github.com/jcreek/CosmicClash.git
synced 2026-09-11 00:14:00 +00:00
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:
@@ -13,16 +13,15 @@ const BOTS_DIR := "res://bots"
|
||||
|
||||
# Every tier runs its promoted checkpoint at full trained capability —
|
||||
# difficulty is a genuinely different policy, never the same policy
|
||||
# handicapped with reaction delay or action noise. Easy and Medium are now
|
||||
# distinct models (medium.json beats easy.json 65-22-13 head-to-head); Hard
|
||||
# still points at medium.json, the strongest promoted policy, and stays a
|
||||
# label-only duplicate until a stronger one earns hard.json. Keep the tiers
|
||||
# handicapped with reaction delay or action noise. All three tiers are now
|
||||
# distinct models: medium.json beats easy.json 65-22-13, and hard.json (the
|
||||
# generation-5 Stage-5 policy) beats medium.json 47-32-21. Keep the tiers
|
||||
# monotonic: never leave a lower tier pointing at a stronger model than the
|
||||
# one above it.
|
||||
const DIFFICULTIES := [
|
||||
{"name": "Easy", "model": "res://bots/promoted/easy.json", "reaction_ticks": 8, "action_noise": 0.0},
|
||||
{"name": "Medium", "model": "res://bots/promoted/medium.json", "reaction_ticks": 8, "action_noise": 0.0},
|
||||
{"name": "Hard", "model": "res://bots/promoted/medium.json", "reaction_ticks": 8, "action_noise": 0.0},
|
||||
{"name": "Hard", "model": "res://bots/promoted/hard.json", "reaction_ticks": 8, "action_noise": 0.0},
|
||||
]
|
||||
|
||||
@onready var difficulty_dropdown: OptionButton = %DifficultyDropdown
|
||||
|
||||
Reference in New Issue
Block a user