Spaces:
Running
fix(tests): repair perception-count / playback / units-in-region / pairwise suite regressions
Browse filesRecalibrate three fixture packs after the engine balance fixes:
- perception-count-the-threat: the mid-map inner defenders were
stance:3 (AttackAnything) โ they hunted passing scouts up the
lane and got discovered, contaminating the perception count so an
under-scout saw 5 enemies and WON. Switched them to stance:2
(Defend): they hold their post, never advance, and a one-lane
under-scout now caps at K=3 and LOSES while the intended two-lane
scout still WINS every level/seed and over-scout still LOSES.
- perception-frontier-reading: the agent jeeps carried no explicit
stance, so an idle scout auto-advanced and a stall (observe-only)
policy self-delivered into the fog pocket and WON easy. Pinned all
agent scouts to stance:0 (HoldFire) โ stall now LOSES, a directed
scout WINS. Also unblocks test_pairwise (explorer vs idle).
- action-multiunit-coordination: easy's after_ticks:2401 was inert
(the engine ends the episode at tick ~2343) so a stall DREW
instead of losing โ tick-aligned the deadline to 2200/2201. Medium
& hard staged the fragile jeeps at y=14, routing the SE-bound
column through the NE picket where they were attrited to death,
making the 3/3/2 split unsolvable; moved the jeep spawn to y=24
so the three-way split WINS while all-east and stall still LOSE.
|
@@ -55,11 +55,16 @@ levels:
|
|
| 55 |
all_of:
|
| 56 |
- {units_in_region_gte: {x: 110, y: 6, radius: 8, n: 2}}
|
| 57 |
- {units_in_region_gte: {x: 110, y: 33, radius: 8, n: 2}}
|
| 58 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 59 |
fail_condition:
|
| 60 |
any_of:
|
| 61 |
- {not: {own_units_gte: 1}}
|
| 62 |
-
- {after_ticks:
|
| 63 |
max_turns: 30
|
| 64 |
|
| 65 |
medium:
|
|
@@ -75,7 +80,11 @@ levels:
|
|
| 75 |
actors:
|
| 76 |
- {type: 2tnk, owner: agent, position: [5, 6], count: 3}
|
| 77 |
- {type: 1tnk, owner: agent, position: [7, 10], count: 3}
|
| 78 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
| 79 |
- {type: fact, owner: enemy, position: [115, 6]} # NE corner
|
| 80 |
- {type: proc, owner: enemy, position: [115, 34]} # SE corner
|
| 81 |
- {type: powr, owner: enemy, position: [20, 36]} # bottom-left
|
|
@@ -127,7 +136,11 @@ levels:
|
|
| 127 |
actors:
|
| 128 |
- {type: 2tnk, owner: agent, position: [5, 6], count: 3}
|
| 129 |
- {type: 1tnk, owner: agent, position: [7, 10], count: 3}
|
| 130 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
| 131 |
- {type: fact, owner: enemy, position: [115, 6]} # NE corner
|
| 132 |
- {type: proc, owner: enemy, position: [115, 34]} # SE corner
|
| 133 |
- {type: powr, owner: enemy, position: [20, 36]} # bottom-left
|
|
|
|
| 55 |
all_of:
|
| 56 |
- {units_in_region_gte: {x: 110, y: 6, radius: 8, n: 2}}
|
| 57 |
- {units_in_region_gte: {x: 110, y: 33, radius: 8, n: 2}}
|
| 58 |
+
# within_ticks 2200 / after_ticks 2201: the engine ends this
|
| 59 |
+
# level's episode at tick ~2343, so the timeout fail clause
|
| 60 |
+
# must bite BELOW that โ 2401 was inert (the episode ended
|
| 61 |
+
# before it fired, collapsing a stall to a DRAW). The intended
|
| 62 |
+
# parallel split still wins by ~tick 1500, well inside 2200.
|
| 63 |
+
- {within_ticks: 2200}
|
| 64 |
fail_condition:
|
| 65 |
any_of:
|
| 66 |
- {not: {own_units_gte: 1}}
|
| 67 |
+
- {after_ticks: 2201}
|
| 68 |
max_turns: 30
|
| 69 |
|
| 70 |
medium:
|
|
|
|
| 80 |
actors:
|
| 81 |
- {type: 2tnk, owner: agent, position: [5, 6], count: 3}
|
| 82 |
- {type: 1tnk, owner: agent, position: [7, 10], count: 3}
|
| 83 |
+
# Jeeps staged at y=24 (south of centre) so the SE-bound
|
| 84 |
+
# column does NOT route past the NE picket at y=8 โ at y=14
|
| 85 |
+
# the fragile jeeps were attrited to death before reaching
|
| 86 |
+
# the SE region, making the 3/3/2 split unsolvable.
|
| 87 |
+
- {type: jeep, owner: agent, position: [5, 24], count: 2}
|
| 88 |
- {type: fact, owner: enemy, position: [115, 6]} # NE corner
|
| 89 |
- {type: proc, owner: enemy, position: [115, 34]} # SE corner
|
| 90 |
- {type: powr, owner: enemy, position: [20, 36]} # bottom-left
|
|
|
|
| 136 |
actors:
|
| 137 |
- {type: 2tnk, owner: agent, position: [5, 6], count: 3}
|
| 138 |
- {type: 1tnk, owner: agent, position: [7, 10], count: 3}
|
| 139 |
+
# Jeeps staged at y=24 (south of centre) so the SE-bound
|
| 140 |
+
# column does NOT route past the NE picket at y=8 โ at y=14
|
| 141 |
+
# the fragile jeeps were attrited to death before reaching
|
| 142 |
+
# the SE region, making the 3/3/2 split unsolvable.
|
| 143 |
+
- {type: jeep, owner: agent, position: [5, 24], count: 2}
|
| 144 |
- {type: fact, owner: enemy, position: [115, 6]} # NE corner
|
| 145 |
- {type: proc, owner: enemy, position: [115, 34]} # SE corner
|
| 146 |
- {type: powr, owner: enemy, position: [20, 36]} # bottom-left
|
|
@@ -140,18 +140,19 @@ levels:
|
|
| 140 |
# scout (split N/S) clears the discovery bar.
|
| 141 |
- {type: e3, owner: enemy, position: [60, 10], stance: 0, count: 3}
|
| 142 |
- {type: e3, owner: enemy, position: [100, 30], stance: 0, count: 3}
|
| 143 |
-
# Inner defender wall: stance:
|
| 144 |
-
#
|
| 145 |
-
#
|
| 146 |
-
#
|
| 147 |
-
#
|
| 148 |
-
#
|
| 149 |
-
#
|
| 150 |
-
#
|
| 151 |
-
#
|
| 152 |
-
#
|
| 153 |
-
|
| 154 |
-
- {type: e3, owner: enemy, position: [50,
|
|
|
|
| 155 |
# Persistent passive marker for episode-end safety (see easy).
|
| 156 |
- {type: barr, owner: enemy, position: [120, 36], stance: 0}
|
| 157 |
win_condition:
|
|
@@ -198,14 +199,15 @@ levels:
|
|
| 198 |
# (or SW) cannot generalise.
|
| 199 |
- {type: e3, owner: enemy, position: [60, 10], stance: 0, count: 3}
|
| 200 |
- {type: e3, owner: enemy, position: [100, 30], stance: 0, count: 3}
|
| 201 |
-
# Inner defender wall (stance:
|
| 202 |
-
#
|
| 203 |
-
#
|
| 204 |
-
#
|
| 205 |
-
#
|
| 206 |
-
#
|
| 207 |
-
|
| 208 |
-
- {type: e3, owner: enemy, position: [50,
|
|
|
|
| 209 |
# Persistent passive marker for episode-end safety.
|
| 210 |
- {type: barr, owner: enemy, position: [120, 20], stance: 0}
|
| 211 |
win_condition:
|
|
|
|
| 140 |
# scout (split N/S) clears the discovery bar.
|
| 141 |
- {type: e3, owner: enemy, position: [60, 10], stance: 0, count: 3}
|
| 142 |
- {type: e3, owner: enemy, position: [100, 30], stance: 0, count: 3}
|
| 143 |
+
# Inner defender wall: stance:2 (Defend) e3 missiles parked
|
| 144 |
+
# mid-y x=50, between the north (yโ6-10) and south (yโ30-34)
|
| 145 |
+
# scout lanes. stance:2 auto-fires on an in-range foe but
|
| 146 |
+
# NEVER advances โ so the defenders hold their post and a
|
| 147 |
+
# just-enough scout that stays in its lane never even sees
|
| 148 |
+
# them (a stance:3 hunter would chase the scout up the lane
|
| 149 |
+
# and contaminate the perception count). An OVER-scout that
|
| 150 |
+
# pulls every unit through every fog patch (mid-map sweep)
|
| 151 |
+
# drives straight into the wall and bleeds time AND units โ
|
| 152 |
+
# the over-scout tooth bites via clock (the detour never
|
| 153 |
+
# finishes the count) and on a deeper sweep via attrition.
|
| 154 |
+
- {type: e3, owner: enemy, position: [50, 19], stance: 2}
|
| 155 |
+
- {type: e3, owner: enemy, position: [50, 21], stance: 2}
|
| 156 |
# Persistent passive marker for episode-end safety (see easy).
|
| 157 |
- {type: barr, owner: enemy, position: [120, 36], stance: 0}
|
| 158 |
win_condition:
|
|
|
|
| 199 |
# (or SW) cannot generalise.
|
| 200 |
- {type: e3, owner: enemy, position: [60, 10], stance: 0, count: 3}
|
| 201 |
- {type: e3, owner: enemy, position: [100, 30], stance: 0, count: 3}
|
| 202 |
+
# Inner defender wall (stance:2 Defend) at mid-y x=50. They
|
| 203 |
+
# hold their post and auto-fire on anything in range but
|
| 204 |
+
# never advance โ a just-enough scout that stays in its lane
|
| 205 |
+
# never sees them (a stance:3 hunter would chase a passing
|
| 206 |
+
# scout and contaminate the perception count). An OVER-scout
|
| 207 |
+
# that runs every unit through every fog patch bleeds time
|
| 208 |
+
# AND units crossing this wall โ the over-scout teeth.
|
| 209 |
+
- {type: e3, owner: enemy, position: [50, 19], stance: 2}
|
| 210 |
+
- {type: e3, owner: enemy, position: [50, 21], stance: 2}
|
| 211 |
# Persistent passive marker for episode-end safety.
|
| 212 |
- {type: barr, owner: enemy, position: [120, 20], stance: 0}
|
| 213 |
win_condition:
|
|
@@ -54,8 +54,11 @@ base:
|
|
| 54 |
termination: {max_ticks: 10000}
|
| 55 |
actors:
|
| 56 |
# Fast, fragile scouts spawned in the bottom-left pocket (x<25).
|
| 57 |
-
|
| 58 |
-
|
|
|
|
|
|
|
|
|
|
| 59 |
|
| 60 |
levels:
|
| 61 |
easy:
|
|
@@ -67,8 +70,8 @@ levels:
|
|
| 67 |
enters the pocket and loses on the deadline.
|
| 68 |
overrides:
|
| 69 |
actors:
|
| 70 |
-
- {type: jeep, owner: agent, position: [5, 33], count: 3}
|
| 71 |
-
- {type: jeep, owner: agent, position: [7, 30], count: 2}
|
| 72 |
# Hidden marker: a lone building in the eastern fog pocket,
|
| 73 |
# well off the y=30..33 spawn rows so a fixed eastward charge
|
| 74 |
# along spawn rows never reveals it.
|
|
@@ -95,8 +98,8 @@ levels:
|
|
| 95 |
is far NE and only a deliberate split push reveals it in time.
|
| 96 |
overrides:
|
| 97 |
actors:
|
| 98 |
-
- {type: jeep, owner: agent, position: [5, 33], count: 3}
|
| 99 |
-
- {type: jeep, owner: agent, position: [7, 30], count: 2}
|
| 100 |
# Decoy: passive enemy infantry parked OFF the egress lane
|
| 101 |
# (high y, away from the scout corridor) โ pure time-bait, not
|
| 102 |
# an instant-kill wall.
|
|
@@ -132,12 +135,12 @@ levels:
|
|
| 132 |
overrides:
|
| 133 |
actors:
|
| 134 |
# spawn_point 0 โ scouts staged SW.
|
| 135 |
-
- {type: jeep, owner: agent, position: [5, 33], count: 3, spawn_point: 0}
|
| 136 |
-
- {type: jeep, owner: agent, position: [7, 30], count: 2, spawn_point: 0}
|
| 137 |
# spawn_point 1 โ scouts staged NW (markers are fixed, so the
|
| 138 |
# reading order that works flips by seed).
|
| 139 |
-
- {type: jeep, owner: agent, position: [5, 6], count: 3, spawn_point: 1}
|
| 140 |
-
- {type: jeep, owner: agent, position: [7, 9], count: 2, spawn_point: 1}
|
| 141 |
# Center decoys (already-explored zone) โ time-bait only,
|
| 142 |
# passive so they cannot instakill a passing scout.
|
| 143 |
- {type: e1, owner: enemy, position: [55, 20], stance: 0, count: 3}
|
|
|
|
| 54 |
termination: {max_ticks: 10000}
|
| 55 |
actors:
|
| 56 |
# Fast, fragile scouts spawned in the bottom-left pocket (x<25).
|
| 57 |
+
# stance:0 (HoldFire) โ an idle scout must NOT auto-advance: a
|
| 58 |
+
# stall policy that issues only observe() must stay parked so the
|
| 59 |
+
# frontier markers are discovered only by a directed move push.
|
| 60 |
+
- {type: jeep, owner: agent, position: [5, 33], stance: 0, count: 3}
|
| 61 |
+
- {type: jeep, owner: agent, position: [7, 30], stance: 0, count: 2}
|
| 62 |
|
| 63 |
levels:
|
| 64 |
easy:
|
|
|
|
| 70 |
enters the pocket and loses on the deadline.
|
| 71 |
overrides:
|
| 72 |
actors:
|
| 73 |
+
- {type: jeep, owner: agent, position: [5, 33], stance: 0, count: 3}
|
| 74 |
+
- {type: jeep, owner: agent, position: [7, 30], stance: 0, count: 2}
|
| 75 |
# Hidden marker: a lone building in the eastern fog pocket,
|
| 76 |
# well off the y=30..33 spawn rows so a fixed eastward charge
|
| 77 |
# along spawn rows never reveals it.
|
|
|
|
| 98 |
is far NE and only a deliberate split push reveals it in time.
|
| 99 |
overrides:
|
| 100 |
actors:
|
| 101 |
+
- {type: jeep, owner: agent, position: [5, 33], stance: 0, count: 3}
|
| 102 |
+
- {type: jeep, owner: agent, position: [7, 30], stance: 0, count: 2}
|
| 103 |
# Decoy: passive enemy infantry parked OFF the egress lane
|
| 104 |
# (high y, away from the scout corridor) โ pure time-bait, not
|
| 105 |
# an instant-kill wall.
|
|
|
|
| 135 |
overrides:
|
| 136 |
actors:
|
| 137 |
# spawn_point 0 โ scouts staged SW.
|
| 138 |
+
- {type: jeep, owner: agent, position: [5, 33], stance: 0, count: 3, spawn_point: 0}
|
| 139 |
+
- {type: jeep, owner: agent, position: [7, 30], stance: 0, count: 2, spawn_point: 0}
|
| 140 |
# spawn_point 1 โ scouts staged NW (markers are fixed, so the
|
| 141 |
# reading order that works flips by seed).
|
| 142 |
+
- {type: jeep, owner: agent, position: [5, 6], stance: 0, count: 3, spawn_point: 1}
|
| 143 |
+
- {type: jeep, owner: agent, position: [7, 9], stance: 0, count: 2, spawn_point: 1}
|
| 144 |
# Center decoys (already-explored zone) โ time-bait only,
|
| 145 |
# passive so they cannot instakill a passing scout.
|
| 146 |
- {type: e1, owner: enemy, position: [55, 20], stance: 0, count: 3}
|