yxc20098 commited on
Commit
c46972d
·
1 Parent(s): f8f4a41

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:2 (Defend) e1 spawn-witness next to the fact:
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. A single rifleman cannot carry
268
- # the kill bar (8) and the fact still falls to the rush, so a
269
- # stall/tech-rush play still LOSES.
270
- - {type: e1, owner: agent, position: [12, 14], stance: 2, spawn_point: 0}
 
 
 
 
 
 
 
 
 
 
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: 2, spawn_point: 1}
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-10; stall and tech-rush top out at ~2 (the
293
- # lone stance:2 spawn-witness e1) before the fact falls.
 
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 → ~2 kills at
16
- most from the lone spawn-witness rifleman);
 
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