Spaces:
Running
Running
fix(scenario): lh-tech-rush-vs-army-rush — recalibrate after engine movement fixes
Browse files
openra_bench/scenarios/packs/lh-tech-rush-vs-army-rush.yaml
CHANGED
|
@@ -60,7 +60,12 @@
|
|
| 60 |
# - hard tier: 2 agent spawn_point groups (NORTH y=12 / SOUTH
|
| 61 |
# y=28) round-robined by seed; the full base is duplicated under
|
| 62 |
# each group, the enemy band has no spawn_point so it always
|
| 63 |
-
# places (back-compat).
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 64 |
#
|
| 65 |
# Validate (no engine / no network):
|
| 66 |
# python3 -m openra_bench.scenarios.validate \
|
|
@@ -261,20 +266,30 @@ levels:
|
|
| 261 |
- {type: powr, owner: agent, position: [14, 14], spawn_point: 0}
|
| 262 |
- {type: tent, owner: agent, position: [10, 16], spawn_point: 0}
|
| 263 |
- {type: weap, owner: agent, position: [16, 12], spawn_point: 0}
|
| 264 |
-
# One stance:
|
| 265 |
# gives the seed-driven start an observable unit so the
|
| 266 |
# hard-tier curation test (which reads units_summary) sees
|
| 267 |
-
# the two distinct latitudes.
|
| 268 |
-
#
|
| 269 |
-
#
|
| 270 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 271 |
# spawn_point 1 — SOUTH base (same formation, in-bounds).
|
| 272 |
- {type: fact, owner: agent, position: [10, 28], spawn_point: 1}
|
| 273 |
- {type: proc, owner: agent, position: [12, 28], spawn_point: 1}
|
| 274 |
- {type: powr, owner: agent, position: [14, 30], spawn_point: 1}
|
| 275 |
- {type: tent, owner: agent, position: [10, 32], spawn_point: 1}
|
| 276 |
- {type: weap, owner: agent, position: [16, 28], spawn_point: 1}
|
| 277 |
-
- {type: e1, owner: agent, position: [12, 26], stance:
|
| 278 |
# Two fast rush bands at distinct latitudes — both visible to
|
| 279 |
# rusher targeting (it always charges the agent centroid).
|
| 280 |
# Close at x=48 so both bands land fast regardless of which
|
|
@@ -289,8 +304,9 @@ levels:
|
|
| 289 |
win_condition:
|
| 290 |
all_of:
|
| 291 |
# Kill bar 7 of the 12-strong total force: an intended army
|
| 292 |
-
# buy clears 8-
|
| 293 |
-
#
|
|
|
|
| 294 |
- units_killed_gte: 7
|
| 295 |
- building_count_gte: {type: fact, n: 1}
|
| 296 |
- within_ticks: 4800
|
|
|
|
| 60 |
# - hard tier: 2 agent spawn_point groups (NORTH y=12 / SOUTH
|
| 61 |
# y=28) round-robined by seed; the full base is duplicated under
|
| 62 |
# each group, the enemy band has no spawn_point so it always
|
| 63 |
+
# places (back-compat). The lone spawn-witness e1 per group is
|
| 64 |
+
# stance:0 HoldFire (RECALIBRATION — see the hard overrides):
|
| 65 |
+
# post-engine-fix a stance:2 Defend witness could solo the kill
|
| 66 |
+
# bar, so a stall/tech-rush could WIN with no capability; a
|
| 67 |
+
# HoldFire witness never fires, so only the intended army-rush
|
| 68 |
+
# scores kills.
|
| 69 |
#
|
| 70 |
# Validate (no engine / no network):
|
| 71 |
# python3 -m openra_bench.scenarios.validate \
|
|
|
|
| 266 |
- {type: powr, owner: agent, position: [14, 14], spawn_point: 0}
|
| 267 |
- {type: tent, owner: agent, position: [10, 16], spawn_point: 0}
|
| 268 |
- {type: weap, owner: agent, position: [16, 12], spawn_point: 0}
|
| 269 |
+
# One stance:0 (HoldFire) e1 spawn-witness next to the fact:
|
| 270 |
# gives the seed-driven start an observable unit so the
|
| 271 |
# hard-tier curation test (which reads units_summary) sees
|
| 272 |
+
# the two distinct latitudes. RECALIBRATION (engine movement
|
| 273 |
+
# fixes): the witness is HoldFire, NOT Defend — with the
|
| 274 |
+
# engine fix a stationary Defend rifleman now reliably guns
|
| 275 |
+
# down the charging rush as it closes (moving units take
|
| 276 |
+
# fire, no sprint-past), and a lone Defend e1 could rack up
|
| 277 |
+
# 6-7 kills on a favourable seed and satisfy the kill bar for
|
| 278 |
+
# a stall/tech-rush play (a no-capability WIN). HoldFire
|
| 279 |
+
# means the witness never auto-fires, so a stall/tech-rush
|
| 280 |
+
# play scores ZERO kills and the fact is razed → LOSS. The
|
| 281 |
+
# intended army-rush issues an explicit `attack_move` over
|
| 282 |
+
# ALL unit ids (the witness included) — an explicit order
|
| 283 |
+
# overrides HoldFire — so the witness still contributes to
|
| 284 |
+
# the intended play.
|
| 285 |
+
- {type: e1, owner: agent, position: [12, 14], stance: 0, spawn_point: 0}
|
| 286 |
# spawn_point 1 — SOUTH base (same formation, in-bounds).
|
| 287 |
- {type: fact, owner: agent, position: [10, 28], spawn_point: 1}
|
| 288 |
- {type: proc, owner: agent, position: [12, 28], spawn_point: 1}
|
| 289 |
- {type: powr, owner: agent, position: [14, 30], spawn_point: 1}
|
| 290 |
- {type: tent, owner: agent, position: [10, 32], spawn_point: 1}
|
| 291 |
- {type: weap, owner: agent, position: [16, 28], spawn_point: 1}
|
| 292 |
+
- {type: e1, owner: agent, position: [12, 26], stance: 0, spawn_point: 1}
|
| 293 |
# Two fast rush bands at distinct latitudes — both visible to
|
| 294 |
# rusher targeting (it always charges the agent centroid).
|
| 295 |
# Close at x=48 so both bands land fast regardless of which
|
|
|
|
| 304 |
win_condition:
|
| 305 |
all_of:
|
| 306 |
# Kill bar 7 of the 12-strong total force: an intended army
|
| 307 |
+
# buy clears 8-9; stall and tech-rush score ZERO (the lone
|
| 308 |
+
# spawn-witness e1 is stance:0 HoldFire and never fires) and
|
| 309 |
+
# the fact is razed → LOSS.
|
| 310 |
- units_killed_gte: 7
|
| 311 |
- building_count_gte: {type: fact, n: 1}
|
| 312 |
- within_ticks: 4800
|
tests/test_lh_tech_rush_vs_army_rush.py
CHANGED
|
@@ -12,14 +12,27 @@ the base.
|
|
| 12 |
The win predicate makes the commitment decision load-bearing:
|
| 13 |
|
| 14 |
* `units_killed_gte:K` ⇒ the agent must field a real fighting force
|
| 15 |
-
and blunt the rush (a tech investment fields no army →
|
| 16 |
-
|
|
|
|
| 17 |
* `building_count_gte:{fact,1}` ⇒ the fact must STILL stand (present-
|
| 18 |
tense predicate, not the one-shot `has_building` set — CLAUDE.md
|
| 19 |
footgun); stalling or teching up loses the fact to the rush;
|
| 20 |
* `within_ticks` paired with `after_ticks: T+1` in the fail clause ⇒
|
| 21 |
a non-finisher is a real reachable timeout LOSS, never a draw.
|
| 22 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 23 |
The scripted-policy validations prove deterministically that:
|
| 24 |
|
| 25 |
* the intended ARMY-RUSH (commit the budget to cheap units NOW and
|
|
|
|
| 12 |
The win predicate makes the commitment decision load-bearing:
|
| 13 |
|
| 14 |
* `units_killed_gte:K` ⇒ the agent must field a real fighting force
|
| 15 |
+
and blunt the rush (a tech investment fields no army → ZERO kills:
|
| 16 |
+
the hard tier's lone spawn-witness rifleman is stance:0 HoldFire
|
| 17 |
+
and never auto-fires);
|
| 18 |
* `building_count_gte:{fact,1}` ⇒ the fact must STILL stand (present-
|
| 19 |
tense predicate, not the one-shot `has_building` set — CLAUDE.md
|
| 20 |
footgun); stalling or teching up loses the fact to the rush;
|
| 21 |
* `within_ticks` paired with `after_ticks: T+1` in the fail clause ⇒
|
| 22 |
a non-finisher is a real reachable timeout LOSS, never a draw.
|
| 23 |
|
| 24 |
+
RECALIBRATION NOTE (engine movement fixes — moving units fire AND
|
| 25 |
+
take fire en route, no sprint-past): with the fix a STATIONARY
|
| 26 |
+
Defend rifleman reliably guns down a charging rush as it closes, so
|
| 27 |
+
the hard tier's lone stance:2 spawn-witness e1 could solo the kill
|
| 28 |
+
bar (6-7 kills on a favourable seed) and hand a stall / tech-rush
|
| 29 |
+
play a no-capability WIN. The witness is now stance:0 HoldFire — it
|
| 30 |
+
never auto-fires, so a stall / tech-rush scores ZERO kills and the
|
| 31 |
+
fact is razed (real LOSS). The intended army-rush issues an explicit
|
| 32 |
+
`attack_move` over ALL unit ids (the witness included); an explicit
|
| 33 |
+
order overrides HoldFire, so the witness still contributes to the
|
| 34 |
+
intended play.
|
| 35 |
+
|
| 36 |
The scripted-policy validations prove deterministically that:
|
| 37 |
|
| 38 |
* the intended ARMY-RUSH (commit the budget to cheap units NOW and
|