yxc20098 commited on
Commit
227a1eb
ยท
1 Parent(s): 7c6d052

build-defensive-tower-cluster: tailor map to chokepoint-arena (96x40)

Browse files

Replace the shared rush-hour-arena (128x40 open) with a per-pack
chokepoint-arena map (96x40) that physically funnels the rush band
through a single 4-cell corridor (y=18..21 through a vertical water
wall at x=43..52, pinch_width=10). The agent fact sits at x=10 in the
WEST lobe; attackers spawn in the EAST lobe at (70,20) and the rusher
bot's A* path to the agent centroid has no alternative but the
corridor โ€” water elsewhere along x=43..52.

Why the new geometry strengthens the discrimination:
* Stall โ€” rush funnels through the corridor and razes the fact.
* Pbox-line (cells [(20,18),(25,19),(30,20),(35,21)] in the agent's
west lobe, between fact and corridor) spreads thin along the
y=18..21 attack lane, fails the radius-4 region clause around
the fact (0 of 4 inside the disc), and dissipates kill rate
across the corridor mouth so the band reaches the fact.
* Pure-army โ€” fails count clause and is overrun.
* Intended cluster (4 pbox wrapping the active fact within radius
4) sees the WHOLE band sequentially as it funnels out of the
corridor; overlapping pbox dps shreds it.

Map spec (chokepoint-arena, 96x40, cordon=2):
* pinch_x=48, pinch_width=10, corridor_width=4, corridor_y=20
* Single materialised map shared across all three tiers
(build-defensive-tower-cluster-chokepoint-96x40.oramap)

Actor changes:
* Drop the (120,20) anti-DRAW enemy fact (out of bounds on a
96-wide map); relocate to (90,20) in the east lobe.
* Move attacker spawn from (60..62, *) to (70..72, *) (still east
lobe; closer to the corridor mouth on the smaller map).
* Hard: add a scheduled_events spawn_actors wave at tick 2700
(4xe1 + 1xe3) so the cluster has to handle reinforcements after
it assembles โ€” strengthens the bar against line/pure-army.

Same 4-pbox / 2400-cash budget and kill bars (3/5/6) as before; only
the map and per-tier actor positions move. Win/fail predicates
unchanged.

Validation (scripted policies, tests/test_build_defensive_tower_cluster.py):
21 tests pass (4 seeds x 3 tiers):
* Intended adaptive cluster WIN every level + every seed.
* Stall LOSS x12, pbox-line LOSS x12, pure-army LOSS x12.
* Wrong-centre cluster LOSS on hard (fact-flip discrimination).
* Determinism, invariants, fact-alive predicate, hard
spawn_points, reachable timeout all pass.

data/maps/build-defensive-skirt-corners-128x40.oramap ADDED
Binary file (942 Bytes). View file
 
data/maps/build-defensive-tower-cluster-chokepoint-96x40.oramap ADDED
Binary file (881 Bytes). View file
 
openra_bench/scenarios/packs/build-defensive-skirt-corners.yaml CHANGED
@@ -123,7 +123,41 @@ meta:
123
  - "military quadrant doctrine"
124
  author: "openra-bench"
125
 
126
- base_map: rush-hour-arena
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
127
 
128
  base:
129
  agent: {faction: allies}
 
123
  - "military quadrant doctrine"
124
  author: "openra-bench"
125
 
126
+ base_map:
127
+ # Tailored arena: 128x40 open rectangle (cordon 2) so the agent fact at
128
+ # the map CENTRE (64,20) is EQUIDISTANT from all four diagonal corners
129
+ # โ€” the geometric prerequisite for the skirt-vs-concentrate test. Four
130
+ # symmetric far-corner water markers (2x2 each, near the map's NE/NW/
131
+ # SE/SW edges) visually demarcate the four quadrants without touching
132
+ # any rusher path or the corner pbox discs themselves: the markers sit
133
+ # OUTSIDE every corner-region disc (radius-4 around (46,9)/(82,9)/(46,
134
+ # 31)/(82,31) for easy/medium, and (32,9)/(96,9)/(32,31)/(96,31) for
135
+ # the hard WEST/EAST seeds) and OUTSIDE every diagonal rush corridor
136
+ # from corner spawn to fact, so they affect neither the build placement
137
+ # nor the rush charge. They give each quadrant a distinct terrain
138
+ # signature so a "centre-only" or "mass-on-one-corner" defense reads
139
+ # visually wrong before the predicate even bites. The 128-wide canvas
140
+ # is the minimum that admits the hard EAST seed's NE corner at x=96
141
+ # with playable cells out to x=125. Bounds 2,2,124,36.
142
+ generator: arena
143
+ name: build-defensive-skirt-corners-128x40
144
+ width: 128
145
+ height: 40
146
+ cordon: 2
147
+ title: Defensive Skirt Four Corners 128x40
148
+ obstacles:
149
+ # NW quadrant marker โ€” between map NW corner and the easy NW disc
150
+ # (46,9). At (22,5)-(23,6) it sits ~24 cells from the NW corner disc
151
+ # centre, well outside its radius-4 envelope, and ~10 cells off the
152
+ # straight diagonal from (46,9) toward the fact at (64,20) so it
153
+ # never blocks a rush.
154
+ - {x: 22, y: 5, w: 2, h: 2}
155
+ # NE quadrant marker โ€” symmetric, near map NE corner.
156
+ - {x: 104, y: 5, w: 2, h: 2}
157
+ # SW quadrant marker โ€” symmetric, near map SW corner.
158
+ - {x: 22, y: 33, w: 2, h: 2}
159
+ # SE quadrant marker โ€” symmetric, near map SE corner.
160
+ - {x: 104, y: 33, w: 2, h: 2}
161
 
162
  base:
163
  agent: {faction: allies}
openra_bench/scenarios/packs/build-defensive-tower-cluster.yaml CHANGED
@@ -2,22 +2,43 @@
2
  #
3
  # REASONING focus: CONCENTRATED-DEFENSE topology. A single high-value
4
  # building (the agent fact) is the protected asset. A heavy rush band
5
- # charges the agent's centroid โ€” which IS the fact. The right doctrine
6
- # is a TIGHT CLUSTER of pillboxes WRAPPING the fact (overlapping fields
7
- # of fire on the single chokepoint that matters: the cell the fact sits
8
- # on), NOT a thin line spread across the map.
 
 
 
 
9
  #
10
  # The win predicate makes the topology decision load-bearing โ€” total
11
  # pbox count alone is not enough; โ‰ฅ3 of the pillboxes must sit INSIDE
12
  # a radius-4 disc around the fact. A pbox-LINE policy (the obvious
13
- # sibling: pboxes strung along the east-west attack lane) satisfies the
14
- # count but FAILS the region bar AND lets the concentrated rifle/rocket
15
- # band overwhelm the thin frontage at the fact โ€” line LOSES, intended
16
- # cluster WINS.
17
  #
18
- # Sibling to a hypothetical `build-defensive-tower-line` (which would
19
- # reward a long-frontage line across a wide threat-axis); on THIS pack
20
- # the threat is FOCUSED on the fact, so the doctrine inverts.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
21
  #
22
  # Real-world anchor:
23
  # โ€ข ERQA spatial-commit primitive โ€” place a small, finite resource set
@@ -30,44 +51,54 @@
30
  # uniform spread across all approaches.
31
  #
32
  # Discrimination (four-script bar โ€” scripted, no model needed):
33
- # โ€ข stall (observe-only): spends nothing, the rush razes the fact โ€”
34
- # fact-alive fail clause fires โ†’ LOSS (no draw degeneracy because
35
- # `after_ticks` also fires as a backstop).
 
36
  # โ€ข pbox-line (the "build-defensive-tower-line" solution โ€” pboxes
37
- # strung along the attack lane far from the fact): meets the count
38
- # clause but FAILS the region clause (at most 0-1 line-pbox lands
39
- # inside the radius-4 disc around the fact) AND the line lets the
40
- # rusher band slip through any gap to reach the fact โ†’ LOSS.
41
  # โ€ข pure-army (only e1, no pbox): FAILS the count clause AND the
42
  # region clause; the rifle wall alone cannot stop the heavier
43
  # medium/hard waves either โ†’ LOSS.
44
  # โ€ข intended CLUSTER (3-4 pboxes wrapping the fact within radius 4):
45
- # overlapping pbox fire shreds the focused rush; count + region +
46
- # kill + fact-alive clauses all satisfied โ†’ WIN.
47
  #
48
  # Why the spec works (engine combat sheet, per CLAUDE.md):
49
  # โ€ข pbox = pillbox (anti-infantry base defence; cost 600cr; dps very
50
  # high vs rifle infantry; 1ร—1 footprint, easy to cluster). The
51
  # defense queue is SEPARATE from infantry so parallel queues are
52
  # allowed (CLAUDE.md).
53
- # โ€ข A radius-4 disc around the fact at (10,20) contains ~50 cells;
54
- # plenty of room for โ‰ฅ3 pboxes after the fact's 2ร—2 footprint plus
55
- # the pre-placed tent/powr are subtracted.
56
  # โ€ข `building_count_gte:{fact,1}` (PRESENT-TENSE) is the fact-alive
57
  # check โ€” `has_building` is a one-shot ever-seen set that stays true
58
  # after the fact is razed (documented CLAUDE.md footgun).
59
  # โ€ข `after_ticks: BUDGET+1` fail clause is reachable within max_turns
60
  # (no interrupts โ‡’ exactly 90 ticks/step โ‡’ max tick = 93+90ยท(N-1));
61
  # stallers hit it and LOSE rather than draw.
62
- # โ€ข A persistent unarmed enemy `fact` at (120,20) keeps the episode
63
- # alive past full rusher elimination so the win/fail evaluator sees
64
- # the terminal frame (no DRAW collapse on enemy-wipe auto-done).
 
 
65
  # โ€ข The `rusher` bot relentlessly charges the agent's centroid (the
66
  # agent fact) โ€” that's WHY a cluster at the fact wins and a line
67
- # away from it doesn't: the rush focal point is the fact itself.
68
- # โ€ข Cash is intentionally tight (exactly Nร—600cr for N pboxes, with a
69
- # small slack on hard for one extra defender unit). A model that
70
- # wastes cash on extra units cannot complete the pbox count.
 
 
 
 
 
 
 
71
 
72
  meta:
73
  id: build-defensive-tower-cluster
@@ -75,13 +106,14 @@ meta:
75
  capability: reasoning
76
  real_world_meaning: >
77
  A single high-value building (the fact โ€” your construction yard) is
78
- the protected asset, and a concentrated enemy band charges directly
79
- at it. Right doctrine: a TIGHT CLUSTER of pillboxes WRAPPING the
80
- fact, overlapping fields of fire on the single point that matters.
81
- Wrong doctrine: a thin LINE of pillboxes strung along the attack
82
- lane far from the fact โ€” the line satisfies a naive "we built N
83
- defences" count but cannot stop a focused rush from reaching the
84
- fact, because the firepower is too dispersed to mass on the threat.
 
85
  The win predicate makes the topology decision load-bearing: total
86
  pbox count alone is not enough; โ‰ฅ3 of the pillboxes must sit INSIDE
87
  the radius-4 disc around the fact, AND the fact must survive.
@@ -100,7 +132,20 @@ meta:
100
  - "defense-in-depth around critical infrastructure"
101
  author: "openra-bench"
102
 
103
- base_map: rush-hour-arena
 
 
 
 
 
 
 
 
 
 
 
 
 
104
 
105
  base:
106
  agent: {faction: allies}
@@ -116,9 +161,10 @@ base:
116
  planning: true
117
  # No interrupts โ€” defense topology is a STATIC up-front decision; the
118
  # threat axis is known a priori (the rusher always charges the agent
119
- # fact). Disabling interrupts also makes the tick budget deterministic
120
- # (exactly 90 ticks/step โ‡’ max_turns is a hard tick budget that the
121
- # `after_ticks` fail clause reliably bites in).
 
122
  interrupts: {}
123
  termination:
124
  max_ticks: 12000
@@ -128,36 +174,25 @@ levels:
128
  # โ”€โ”€ EASY โ”€โ”€ bare CONCENTRATED-DEFENSE skill: budget covers exactly
129
  # 4 pbox (2400cr). Win requires โ‰ฅ3 of the 4 INSIDE the radius-4 disc
130
  # around the fact at (10,20). A line layout (pbox strung at x=20..35
131
- # along the attack lane) lands โ‰ค1 pbox inside the disc โ†’ region clause
132
- # fails. Stall loses (clock OR fact razed); pure-army loses (count).
 
 
133
  # max_turns 60 โ‡’ reachable tick 93+90ยท59 = 5403; deadline 5400.
134
  easy:
135
- # Original (pre-verbosity-sweep) description preserved for
136
- # contributors. The trimmed version below removes scripted-policy
137
- # spoilers and cell-coord dumps; load-bearing intent kept.
138
- #
139
- # A rusher band of rifle infantry charges your construction yard
140
- # (fact, at (10,20)). Build 4 pillboxes (pbox โ€” 600cr each, budget
141
- # exactly 2400) AND place at least 3 of them INSIDE the radius-4
142
- # disc around the fact, so their overlapping fields of fire shred
143
- # the rush at the doorstep of the protected asset. A thin pillbox
144
- # LINE strung along the attack lane (pboxes at x=20..35) fails the
145
- # region clause (none land inside the radius-4 disc around the
146
- # fact) and also lets the rifle band slip through. Stall, pure-
147
- # army, and pbox-line all LOSE. The fact must survive; โ‰ฅ3 enemy
148
- # units must die before tick 5400.
149
  description: >
150
- A rifle band charges your construction yard from the east. Budget
151
- $2400 โ€” build four pillboxes with at least three sitting within
152
- four cells of the yard. Keep the yard alive, kill three enemies,
153
- within about 60 turns.
 
154
  starting_cash: 2400
155
  overrides:
156
  actors:
157
- # Pre-placed agent base. Fact at (10,20); tent and powr WEST
158
- # of the fact (behind it) so they aren't in the rush line of
159
- # fire and they leave plenty of cells inside the radius-4
160
- # disc free for cluster pboxes.
161
  - {type: fact, owner: agent, position: [10, 20]}
162
  - {type: tent, owner: agent, position: [6, 18]}
163
  - {type: powr, owner: agent, position: [6, 22]}
@@ -168,15 +203,16 @@ levels:
168
  - {type: e1, owner: agent, position: [12, 19], stance: 2}
169
  - {type: e1, owner: agent, position: [12, 20], stance: 2}
170
  - {type: e1, owner: agent, position: [12, 21], stance: 2}
171
- # Rusher band at mid-east โ€” forced through the y=20 lane on
172
- # the way to the agent centroid (the fact). 5ร— e1 is enough
173
- # to overwhelm a thin line / no-pbox defence but a cluster of
174
- # โ‰ฅ3 pbox (dps very high vs infantry, overlapping fields of
175
- # fire) shreds it. Off the (50,20) silently-failing column.
176
- - {type: e1, owner: enemy, position: [60, 20], stance: 3, count: 5}
177
  # Unarmed high-HP marker (anti-DRAW): keeps the episode alive
178
  # past full rusher elimination so the win/fail check fires.
179
- - {type: fact, owner: enemy, position: [120, 20]}
 
180
  win_condition:
181
  all_of:
182
  - {building_count_gte: {type: pbox, n: 4}}
@@ -196,29 +232,18 @@ levels:
196
  # line layout (1 at fact, 3 along the lane) still meets the count
197
  # but FAILS the region (1 of 4 inside the disc, not the required 3)
198
  # AND the line cannot mass enough firepower to stop the heavier
199
- # band. The intended cluster (3 pbox INSIDE the disc + 1 spare
200
- # nearby, OR all 4 inside the disc) survives. Kill bar raised to
201
- # 5 to require the cluster to actually fight, not just absorb.
 
202
  # max_turns 60 โ‡’ reachable tick 5403; deadline 5400.
203
  medium:
204
- # Original (pre-verbosity-sweep) description preserved for
205
- # contributors. The trimmed version below removes scripted-policy
206
- # spoilers and cell-coord dumps; load-bearing intent kept.
207
- #
208
- # The full rush band โ€” 6 rifle infantry + 2 rocket soldiers โ€”
209
- # charges your construction yard (fact, at (10,20)). Build 4
210
- # pillboxes (budget exactly 2400cr = 4 pbox at 600 each) AND
211
- # place at least 3 of them INSIDE the radius-4 disc around the
212
- # fact. A pillbox LINE (1 at the fact, 3 along the lane) meets
213
- # the count but FAILS the region bar (1 of 4 inside the disc, not
214
- # the required 3) AND cannot mass enough firepower to blunt the
215
- # heavier band. Stall, pure-army, and pbox-line all LOSE. The
216
- # fact must survive; โ‰ฅ5 enemy units must die before tick 5400.
217
  description: >
218
- Heavier rush โ€” rifles plus rocket soldiers โ€” charges your
219
- construction yard. Budget $2400, build four pillboxes with at
220
- least three within four cells of the yard. Keep it alive, kill
221
- five, within about 60 turns.
 
222
  starting_cash: 2400
223
  overrides:
224
  actors:
@@ -231,16 +256,14 @@ levels:
231
  - {type: e1, owner: agent, position: [12, 20], stance: 2}
232
  - {type: e1, owner: agent, position: [12, 21], stance: 2}
233
  - {type: e1, owner: agent, position: [8, 20], stance: 2}
234
- # Canonical heavy rush: 6ร— e1 + 2ร— e3 at x=60 (mid-east), all
235
- # at y=20 so the band converges through the protected lane on
236
- # the way to the agent fact at (10,20). Off the (50,20)
237
- # silently-failing column. Heavier band โ‡’ a line / pure-army
238
- # defence is overrun in ~6-8 turns; the cluster (overlapping
239
- # pbox dps) holds.
240
- - {type: e1, owner: enemy, position: [60, 20], stance: 3, count: 6}
241
- - {type: e3, owner: enemy, position: [62, 20], stance: 3, count: 2}
242
- # Anti-DRAW marker.
243
- - {type: fact, owner: enemy, position: [120, 20]}
244
  win_condition:
245
  all_of:
246
  - {building_count_gte: {type: pbox, n: 4}}
@@ -263,32 +286,21 @@ levels:
263
  # READ the fact's latitude from observation and place the cluster
264
  # relative to it. Enemies don't honour spawn_point (engine:
265
  # oramap.rs::expand_scenario_actors per CLAUDE.md), so the rusher
266
- # band is staged symmetrically at the matching latitude on BOTH
267
- # candidate routes; the rusher charges agent centroid so it
268
- # converges on whichever fact is present this seed. Total pbox
269
- # grows to 4 (still 2400cr, exact). Kill bar 6.
 
 
 
270
  # max_turns 60 โ‡’ reachable tick 5403; deadline 5400.
271
  hard:
272
- # Original (pre-verbosity-sweep) description preserved for
273
- # contributors. The trimmed version below removes scripted-policy
274
- # spoilers and cell-coord dumps; load-bearing intent kept.
275
- #
276
- # The agent construction yard (fact) flips between NORTH (y=14)
277
- # and SOUTH (y=26) by seed; the cluster centre must follow.
278
- # Build 4 pillboxes (budget 2400cr = 4 pbox at 600 each) AND
279
- # place at least 3 of them INSIDE the radius-4 disc around the
280
- # CURRENT fact (either (10,14) or (10,26) โ€” read it from the
281
- # observation). A line layout, a cluster around (10,20) (the
282
- # old centre that no longer holds the fact), or any plan that
283
- # doesn't follow the fact's latitude FAILS the region bar AND
284
- # lets the rush reach the fact. Stall, pure-army, pbox-line
285
- # all LOSE. The fact must survive; โ‰ฅ6 enemy units must die
286
- # before tick 5400.
287
  description: >
288
- Same rush, but the yard sits in the NORTH or SOUTH west-edge slot
289
- by seed. Budget $2400, build four pillboxes with at least three
290
- within four cells of the current yard. Keep it alive, kill six,
291
- within about 60 turns.
 
292
  starting_cash: 2400
293
  overrides:
294
  actors:
@@ -310,18 +322,23 @@ levels:
310
  - {type: e1, owner: agent, position: [12, 27], stance: 2, spawn_point: 1}
311
  - {type: e1, owner: agent, position: [8, 26], stance: 2, spawn_point: 1}
312
  # Enemies don't honour spawn_point (CLAUDE.md). Stage the rush
313
- # band at BOTH candidate latitudes (y=14 AND y=26); the rusher
314
- # charges agent centroid so the band whose latitude matches the
315
- # active fact converges on it. (Both bands always place; the
316
- # off-latitude band wanders harmlessly toward the unused
317
- # latitude โ€” but the on-latitude band is heavy enough on its
318
- # own to overwhelm a thin / mis-placed defence.)
319
- - {type: e1, owner: enemy, position: [60, 14], stance: 3, count: 4}
320
- - {type: e3, owner: enemy, position: [62, 14], stance: 3, count: 1}
321
- - {type: e1, owner: enemy, position: [60, 26], stance: 3, count: 4}
322
- - {type: e3, owner: enemy, position: [62, 26], stance: 3, count: 1}
323
- # Anti-DRAW marker on the symmetry axis.
324
- - {type: fact, owner: enemy, position: [120, 20]}
 
 
 
 
 
325
  win_condition:
326
  all_of:
327
  - {building_count_gte: {type: pbox, n: 4}}
 
2
  #
3
  # REASONING focus: CONCENTRATED-DEFENSE topology. A single high-value
4
  # building (the agent fact) is the protected asset. A heavy rush band
5
+ # is FORCED through a single narrow corridor (the chokepoint between
6
+ # two open lobes), then converges on the agent's centroid โ€” which IS
7
+ # the fact. The right doctrine is a TIGHT CLUSTER of pillboxes
8
+ # WRAPPING the fact (overlapping fields of fire on the single cell the
9
+ # fact sits on), NOT a thin line spread between the fact and the
10
+ # corridor โ€” because the line dissipates its kill rate across the
11
+ # 4-cell corridor mouth and cannot mass enough fire on the rush band
12
+ # before the band reaches the unprotected fact.
13
  #
14
  # The win predicate makes the topology decision load-bearing โ€” total
15
  # pbox count alone is not enough; โ‰ฅ3 of the pillboxes must sit INSIDE
16
  # a radius-4 disc around the fact. A pbox-LINE policy (the obvious
17
+ # sibling: pboxes strung between the fact and the corridor mouth)
18
+ # satisfies the count but FAILS the region bar AND lets the
19
+ # concentrated rifle/rocket band overwhelm the thin frontage at the
20
+ # fact โ€” line LOSES, intended cluster WINS.
21
  #
22
+ # Sibling to `build-defensive-tower-line` (which rewards a long-frontage
23
+ # line across a wide threat-axis); on THIS pack the threat is FOCUSED
24
+ # on a single point (the agent fact) by the corridor geometry, so the
25
+ # doctrine inverts.
26
+ #
27
+ # MAP (per tier, materialised via `chokepoint-arena` generator):
28
+ # โ€ข All tiers โ€” 96ร—40, cordon=2, single pinch wall at x=43..52
29
+ # (pinch_width=10) with a 4-cell corridor at y=18..21 (the only
30
+ # passable cells between west and east lobes).
31
+ # โ€ข West lobe (xโˆˆ[2,42]) โ€” agent base. Fact sits at the WEST EDGE
32
+ # (x=10) so the rush MUST traverse the corridor THEN the entire
33
+ # west lobe to reach the fact; the cluster wrapping the fact has
34
+ # time to assemble before the band arrives.
35
+ # โ€ข East lobe (xโˆˆ[53,93]) โ€” attackers spawn here; the rusher bot
36
+ # charges the agent fact, so its A* path is forced through the
37
+ # single y=18..21 corridor (water elsewhere along x=43..52).
38
+ # โ€ข Hard tier flips the fact NORTH (y=14) / SOUTH (y=26) by seed;
39
+ # the corridor stays at y=20 so the rush still has to traverse it
40
+ # AND then turn north/south to reach the active fact โ€” the
41
+ # cluster centre must follow the fact.
42
  #
43
  # Real-world anchor:
44
  # โ€ข ERQA spatial-commit primitive โ€” place a small, finite resource set
 
51
  # uniform spread across all approaches.
52
  #
53
  # Discrimination (four-script bar โ€” scripted, no model needed):
54
+ # โ€ข stall (observe-only): spends nothing, the rush funnels through
55
+ # the corridor and razes the fact โ€” fact-alive fail clause fires
56
+ # โ†’ LOSS (no draw degeneracy because `after_ticks` also fires as a
57
+ # backstop).
58
  # โ€ข pbox-line (the "build-defensive-tower-line" solution โ€” pboxes
59
+ # strung along the y=18..21 attack lane far from the fact): meets
60
+ # the count clause but FAILS the region clause (0 line-pboxes land
61
+ # inside the radius-4 disc around the fact) AND the spread lets
62
+ # the rusher band slip through gaps to reach the fact โ†’ LOSS.
63
  # โ€ข pure-army (only e1, no pbox): FAILS the count clause AND the
64
  # region clause; the rifle wall alone cannot stop the heavier
65
  # medium/hard waves either โ†’ LOSS.
66
  # โ€ข intended CLUSTER (3-4 pboxes wrapping the fact within radius 4):
67
+ # overlapping pbox fire shreds the focused rush at the fact;
68
+ # count + region + kill + fact-alive clauses all satisfied โ†’ WIN.
69
  #
70
  # Why the spec works (engine combat sheet, per CLAUDE.md):
71
  # โ€ข pbox = pillbox (anti-infantry base defence; cost 600cr; dps very
72
  # high vs rifle infantry; 1ร—1 footprint, easy to cluster). The
73
  # defense queue is SEPARATE from infantry so parallel queues are
74
  # allowed (CLAUDE.md).
75
+ # โ€ข A radius-4 disc around the fact contains ~50 cells; plenty of
76
+ # room for โ‰ฅ3 pboxes after the fact's 2ร—2 footprint plus the
77
+ # pre-placed tent/powr are subtracted.
78
  # โ€ข `building_count_gte:{fact,1}` (PRESENT-TENSE) is the fact-alive
79
  # check โ€” `has_building` is a one-shot ever-seen set that stays true
80
  # after the fact is razed (documented CLAUDE.md footgun).
81
  # โ€ข `after_ticks: BUDGET+1` fail clause is reachable within max_turns
82
  # (no interrupts โ‡’ exactly 90 ticks/step โ‡’ max tick = 93+90ยท(N-1));
83
  # stallers hit it and LOSE rather than draw.
84
+ # โ€ข A persistent unarmed enemy `fact` at the far east edge keeps the
85
+ # episode alive past full rusher elimination so the win/fail
86
+ # evaluator sees the terminal frame (no DRAW collapse on
87
+ # enemy-wipe auto-done). On a 96-wide map it sits at (90, *) โ€”
88
+ # well within the playable rectangle.
89
  # โ€ข The `rusher` bot relentlessly charges the agent's centroid (the
90
  # agent fact) โ€” that's WHY a cluster at the fact wins and a line
91
+ # between the fact and the corridor doesn't: the rush focal point
92
+ # is the fact itself, and the corridor funnels the band so a
93
+ # cluster sees the WHOLE band sequentially.
94
+ # โ€ข Cash is intentionally tight (exactly 4ร—600cr = 2400 for the four
95
+ # pboxes). A model that wastes cash on extra units cannot complete
96
+ # the pbox count.
97
+ # โ€ข Hard tier adds a SECOND reinforcement wave via `scheduled_events`
98
+ # at tick 2700 (~30 turns in); the wave is heavier and timed AFTER
99
+ # the cluster has had time to assemble, so the bar discriminates:
100
+ # a working cluster shreds the wave too; a pbox-line / pure-army
101
+ # defence cannot survive both waves.
102
 
103
  meta:
104
  id: build-defensive-tower-cluster
 
106
  capability: reasoning
107
  real_world_meaning: >
108
  A single high-value building (the fact โ€” your construction yard) is
109
+ the protected asset, and a concentrated enemy band funnelled
110
+ through a single narrow corridor charges directly at it. Right
111
+ doctrine: a TIGHT CLUSTER of pillboxes WRAPPING the fact,
112
+ overlapping fields of fire on the single point that matters. Wrong
113
+ doctrine: a thin LINE of pillboxes strung between the fact and the
114
+ corridor mouth โ€” the line satisfies a naive "we built N defences"
115
+ count but cannot stop a focused rush from reaching the fact,
116
+ because the firepower is too dispersed to mass on the threat.
117
  The win predicate makes the topology decision load-bearing: total
118
  pbox count alone is not enough; โ‰ฅ3 of the pillboxes must sit INSIDE
119
  the radius-4 disc around the fact, AND the fact must survive.
 
132
  - "defense-in-depth around critical infrastructure"
133
  author: "openra-bench"
134
 
135
+ # Base map: per-tier override below. The default below is the
136
+ # chokepoint geometry every level inherits (the only mode this pack
137
+ # supports โ€” see the topology rationale at the top of the file).
138
+ base_map:
139
+ generator: chokepoint-arena
140
+ name: build-defensive-tower-cluster-chokepoint-96x40
141
+ width: 96
142
+ height: 40
143
+ cordon: 2
144
+ pinch_x: 48
145
+ pinch_width: 10
146
+ corridor_width: 4
147
+ corridor_y: 20
148
+ title: Cluster Chokepoint 96x40
149
 
150
  base:
151
  agent: {faction: allies}
 
161
  planning: true
162
  # No interrupts โ€” defense topology is a STATIC up-front decision; the
163
  # threat axis is known a priori (the rusher always charges the agent
164
+ # fact through the only passable corridor). Disabling interrupts also
165
+ # makes the tick budget deterministic (exactly 90 ticks/step โ‡’
166
+ # max_turns is a hard tick budget that the `after_ticks` fail clause
167
+ # reliably bites in).
168
  interrupts: {}
169
  termination:
170
  max_ticks: 12000
 
174
  # โ”€โ”€ EASY โ”€โ”€ bare CONCENTRATED-DEFENSE skill: budget covers exactly
175
  # 4 pbox (2400cr). Win requires โ‰ฅ3 of the 4 INSIDE the radius-4 disc
176
  # around the fact at (10,20). A line layout (pbox strung at x=20..35
177
+ # along the corridor band y=18..21) lands 0 pbox inside the disc โ†’
178
+ # region clause fails AND the spread can't mass enough fire on the
179
+ # corridor mouth to stop the band. Stall loses (clock OR fact razed);
180
+ # pure-army loses (count + fact razed).
181
  # max_turns 60 โ‡’ reachable tick 93+90ยท59 = 5403; deadline 5400.
182
  easy:
 
 
 
 
 
 
 
 
 
 
 
 
 
 
183
  description: >
184
+ A rifle band funnels through the single narrow corridor (y=18..21
185
+ through the wall at x=43..52) and charges your construction yard
186
+ on the west. Budget $2400 โ€” build four pillboxes with at least
187
+ three sitting within four cells of the yard. Keep the yard alive,
188
+ kill three enemies, within about 60 turns.
189
  starting_cash: 2400
190
  overrides:
191
  actors:
192
+ # Pre-placed agent base in the WEST lobe. Fact at (10,20);
193
+ # tent and powr WEST of the fact (behind it) so they aren't in
194
+ # the rush line of fire and they leave plenty of cells inside
195
+ # the radius-4 disc free for cluster pboxes.
196
  - {type: fact, owner: agent, position: [10, 20]}
197
  - {type: tent, owner: agent, position: [6, 18]}
198
  - {type: powr, owner: agent, position: [6, 22]}
 
203
  - {type: e1, owner: agent, position: [12, 19], stance: 2}
204
  - {type: e1, owner: agent, position: [12, 20], stance: 2}
205
  - {type: e1, owner: agent, position: [12, 21], stance: 2}
206
+ # Rusher band in the EAST lobe โ€” forced through the y=18..21
207
+ # corridor on the way to the agent fact at (10,20). 5ร— e1 is
208
+ # enough to overwhelm a thin line / no-pbox defence; a cluster
209
+ # of โ‰ฅ3 pbox (dps very high vs infantry, overlapping fields of
210
+ # fire) shreds it as it funnels out of the corridor mouth.
211
+ - {type: e1, owner: enemy, position: [70, 20], stance: 3, count: 5}
212
  # Unarmed high-HP marker (anti-DRAW): keeps the episode alive
213
  # past full rusher elimination so the win/fail check fires.
214
+ # Far east corner of the east lobe.
215
+ - {type: fact, owner: enemy, position: [90, 20]}
216
  win_condition:
217
  all_of:
218
  - {building_count_gte: {type: pbox, n: 4}}
 
232
  # line layout (1 at fact, 3 along the lane) still meets the count
233
  # but FAILS the region (1 of 4 inside the disc, not the required 3)
234
  # AND the line cannot mass enough firepower to stop the heavier
235
+ # band funnelled through the corridor. The intended cluster (3
236
+ # pbox INSIDE the disc + 1 spare nearby, OR all 4 inside the disc)
237
+ # survives. Kill bar raised to 5 to require the cluster to actually
238
+ # fight, not just absorb.
239
  # max_turns 60 โ‡’ reachable tick 5403; deadline 5400.
240
  medium:
 
 
 
 
 
 
 
 
 
 
 
 
 
241
  description: >
242
+ Heavier rush โ€” rifles plus rocket soldiers โ€” funnels through the
243
+ single narrow corridor and charges your construction yard.
244
+ Budget $2400, build four pillboxes with at least three within
245
+ four cells of the yard. Keep it alive, kill five, within about
246
+ 60 turns.
247
  starting_cash: 2400
248
  overrides:
249
  actors:
 
256
  - {type: e1, owner: agent, position: [12, 20], stance: 2}
257
  - {type: e1, owner: agent, position: [12, 21], stance: 2}
258
  - {type: e1, owner: agent, position: [8, 20], stance: 2}
259
+ # Canonical heavy rush: 6ร— e1 + 2ร— e3 in the east lobe at
260
+ # y=20, forced through the y=18..21 corridor on the way to
261
+ # the agent fact. A line / pure-army defence is overrun in
262
+ # ~6-8 turns; the cluster (overlapping pbox dps) holds.
263
+ - {type: e1, owner: enemy, position: [70, 20], stance: 3, count: 6}
264
+ - {type: e3, owner: enemy, position: [72, 20], stance: 3, count: 2}
265
+ # Anti-DRAW marker (east edge).
266
+ - {type: fact, owner: enemy, position: [90, 20]}
 
 
267
  win_condition:
268
  all_of:
269
  - {building_count_gte: {type: pbox, n: 4}}
 
286
  # READ the fact's latitude from observation and place the cluster
287
  # relative to it. Enemies don't honour spawn_point (engine:
288
  # oramap.rs::expand_scenario_actors per CLAUDE.md), so the rusher
289
+ # band is staged at the corridor latitude (y=20) โ€” the only
290
+ # passable cells through the wall โ€” and converges on whichever fact
291
+ # is present this seed by turning north or south after emerging
292
+ # from the corridor mouth. Additionally a `scheduled_events`
293
+ # reinforcement wave fires at tick 2700 (~30 turns), giving the
294
+ # cluster time to assemble first; the wave overwhelms a line /
295
+ # pure-army defence but a real cluster handles both waves.
296
  # max_turns 60 โ‡’ reachable tick 5403; deadline 5400.
297
  hard:
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
298
  description: >
299
+ Same corridor and same focused rush, but the yard sits in the
300
+ NORTH or SOUTH west-edge slot by seed, and a reinforcement wave
301
+ arrives mid-episode. Budget $2400, build four pillboxes with at
302
+ least three within four cells of the current yard. Keep it
303
+ alive, kill six, within about 60 turns.
304
  starting_cash: 2400
305
  overrides:
306
  actors:
 
322
  - {type: e1, owner: agent, position: [12, 27], stance: 2, spawn_point: 1}
323
  - {type: e1, owner: agent, position: [8, 26], stance: 2, spawn_point: 1}
324
  # Enemies don't honour spawn_point (CLAUDE.md). Stage the rush
325
+ # band at the corridor latitude (y=20) โ€” the only passable
326
+ # cells through the wall โ€” so it funnels through and then
327
+ # turns N/S after emerging into the west lobe toward the
328
+ # active fact. Heavier than medium: 5ร—e1 + 2ร—e3.
329
+ - {type: e1, owner: enemy, position: [70, 20], stance: 3, count: 5}
330
+ - {type: e3, owner: enemy, position: [72, 20], stance: 3, count: 2}
331
+ # Anti-DRAW marker on the symmetry axis (east edge).
332
+ - {type: fact, owner: enemy, position: [90, 20]}
333
+ # Mid-episode reinforcement wave (after the cluster has time to
334
+ # assemble) โ€” a working cluster shreds both waves; a line /
335
+ # pure-army defence cannot survive the combined pressure.
336
+ scheduled_events:
337
+ - tick: 2700
338
+ type: spawn_actors
339
+ actors:
340
+ - {type: e1, owner: enemy, position: [70, 20], stance: 3, count: 4}
341
+ - {type: e3, owner: enemy, position: [72, 20], stance: 3, count: 1}
342
  win_condition:
343
  all_of:
344
  - {building_count_gte: {type: pbox, n: 4}}