yxc20098 commited on
Commit
5a3c04b
·
1 Parent(s): a3fc650

prompt_v2: sanitize confusing 'Buildings: ? ()' briefing line

Browse files

Unit-only scenarios have no agent base, so the vendored briefing_v2
empty-own-buildings fallback emitted 'Buildings: ? ()'. Post-process
the vendored output in our briefing() wrapper (vendored module stays
byte-identical; drift test green) to state plainly that the agent
commands mobile units only and enemy buildings appear under Enemies
once scouted. Adds a guard test.

Files changed (36) hide show
  1. openra_bench/prompt_v2.py +15 -1
  2. playback/_smoke/20260519-025303__qwen_qwen3.6-flash/_journal.jsonl +1 -0
  3. playback/_smoke/20260519-025303__qwen_qwen3.6-flash/adversarial-duel:easy:public/seed1/manifest.json +33 -0
  4. playback/_smoke/20260519-025303__qwen_qwen3.6-flash/adversarial-duel:easy:public/seed1/messages.json +236 -0
  5. playback/_smoke/20260519-025303__qwen_qwen3.6-flash/adversarial-duel:easy:public/seed1/minimap_turn001.png +0 -0
  6. playback/_smoke/20260519-025303__qwen_qwen3.6-flash/adversarial-duel:easy:public/seed1/minimap_turn002.png +0 -0
  7. playback/_smoke/20260519-025303__qwen_qwen3.6-flash/adversarial-duel:easy:public/seed1/minimap_turn003.png +0 -0
  8. playback/_smoke/20260519-025303__qwen_qwen3.6-flash/adversarial-duel:easy:public/seed1/minimap_turn004.png +0 -0
  9. playback/_smoke/20260519-025303__qwen_qwen3.6-flash/adversarial-duel:easy:public/seed1/minimap_turn005.png +0 -0
  10. playback/_smoke/20260519-025303__qwen_qwen3.6-flash/adversarial-duel:easy:public/seed1/minimap_turn006.png +0 -0
  11. playback/_smoke/20260519-025303__qwen_qwen3.6-flash/adversarial-duel:easy:public/seed1/minimap_turn007.png +0 -0
  12. playback/_smoke/20260519-025303__qwen_qwen3.6-flash/adversarial-duel:easy:public/seed1/score.json +19 -0
  13. playback/_smoke/20260519-025303__qwen_qwen3.6-flash/adversarial-duel:easy:public/seed1/turns.jsonl +7 -0
  14. playback/run1/20260519-060529__qwen_qwen3.6-flash/_journal.jsonl +1 -0
  15. playback/run1/20260519-060529__qwen_qwen3.6-flash/action-multiunit-coordination:medium:public/seed1/manifest.json +33 -0
  16. playback/run1/20260519-060529__qwen_qwen3.6-flash/action-multiunit-coordination:medium:public/seed1/messages.json +425 -0
  17. playback/run1/20260519-060529__qwen_qwen3.6-flash/action-multiunit-coordination:medium:public/seed1/minimap_turn001.png +0 -0
  18. playback/run1/20260519-060529__qwen_qwen3.6-flash/action-multiunit-coordination:medium:public/seed1/minimap_turn002.png +0 -0
  19. playback/run1/20260519-060529__qwen_qwen3.6-flash/action-multiunit-coordination:medium:public/seed1/minimap_turn003.png +0 -0
  20. playback/run1/20260519-060529__qwen_qwen3.6-flash/action-multiunit-coordination:medium:public/seed1/minimap_turn004.png +0 -0
  21. playback/run1/20260519-060529__qwen_qwen3.6-flash/action-multiunit-coordination:medium:public/seed1/minimap_turn005.png +0 -0
  22. playback/run1/20260519-060529__qwen_qwen3.6-flash/action-multiunit-coordination:medium:public/seed1/minimap_turn006.png +0 -0
  23. playback/run1/20260519-060529__qwen_qwen3.6-flash/action-multiunit-coordination:medium:public/seed1/minimap_turn007.png +0 -0
  24. playback/run1/20260519-060529__qwen_qwen3.6-flash/action-multiunit-coordination:medium:public/seed1/minimap_turn008.png +0 -0
  25. playback/run1/20260519-060529__qwen_qwen3.6-flash/action-multiunit-coordination:medium:public/seed1/minimap_turn009.png +0 -0
  26. playback/run1/20260519-060529__qwen_qwen3.6-flash/action-multiunit-coordination:medium:public/seed1/minimap_turn010.png +0 -0
  27. playback/run1/20260519-060529__qwen_qwen3.6-flash/action-multiunit-coordination:medium:public/seed1/minimap_turn011.png +0 -0
  28. playback/run1/20260519-060529__qwen_qwen3.6-flash/action-multiunit-coordination:medium:public/seed1/minimap_turn012.png +0 -0
  29. playback/run1/20260519-060529__qwen_qwen3.6-flash/action-multiunit-coordination:medium:public/seed1/minimap_turn013.png +0 -0
  30. playback/run1/20260519-060529__qwen_qwen3.6-flash/action-multiunit-coordination:medium:public/seed1/minimap_turn014.png +0 -0
  31. playback/run1/20260519-060529__qwen_qwen3.6-flash/action-multiunit-coordination:medium:public/seed1/score.json +17 -0
  32. playback/run1/20260519-060529__qwen_qwen3.6-flash/action-multiunit-coordination:medium:public/seed1/turns.jsonl +0 -0
  33. r_amc_easy.json +73 -0
  34. r_amc_medium.json +73 -0
  35. smoke_qwen.json +85 -0
  36. tests/test_prompt_v2.py +10 -0
openra_bench/prompt_v2.py CHANGED
@@ -154,8 +154,22 @@ def state_from_render(render_state: dict) -> dict:
154
  }
155
 
156
 
 
 
 
157
  def briefing(render_state: dict) -> str:
158
- return _BRIEF.format_state_briefing_v2(state_from_render(render_state))
 
 
 
 
 
 
 
 
 
 
 
159
 
160
 
161
  def structured_fog(render_state: dict) -> str:
 
154
  }
155
 
156
 
157
+ import re as _re
158
+
159
+
160
  def briefing(render_state: dict) -> str:
161
+ text = _BRIEF.format_state_briefing_v2(state_from_render(render_state))
162
+ # Vendored briefing_v2's empty-own-buildings fallback emits a
163
+ # confusing "Buildings: ? ()" for unit-only scenarios (the agent
164
+ # has no base). Sanitize that one degenerate line in our wrapper
165
+ # (the vendored module stays byte-identical for the drift test).
166
+ text = _re.sub(
167
+ r"(?m)^Buildings: (?:\?|0|none)? ?\(\)\s*$",
168
+ "Buildings: none (you command mobile units only; enemy "
169
+ "buildings appear under Enemies once scouted)",
170
+ text,
171
+ )
172
+ return text
173
 
174
 
175
  def structured_fog(render_state: dict) -> str:
playback/_smoke/20260519-025303__qwen_qwen3.6-flash/_journal.jsonl ADDED
@@ -0,0 +1 @@
 
 
1
+ {"cell": "adversarial-duel:easy", "capability": "adversarial", "split": "public", "seed": 1, "outcome": "win", "composite": 0.8561, "perception": 0.2722, "reasoning": 0.9494, "action": 1.0, "weakest_link": "perception", "objective_progress": 1.0, "reward_vector": {"economy": 0.5, "military": 0.3, "territory": 0.1317, "scouting": 0.3, "objective": 1.0}, "turns": 7, "notes": ["very low map coverage \u2192 perception/scouting problem"], "_key": "adversarial-duel|easy|public|1"}
playback/_smoke/20260519-025303__qwen_qwen3.6-flash/adversarial-duel:easy:public/seed1/manifest.json ADDED
@@ -0,0 +1,33 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "scenario": "adversarial-duel:easy",
3
+ "pack_id": "adversarial-duel",
4
+ "level": "easy",
5
+ "capability": "adversarial",
6
+ "run_id": "20260519-025303",
7
+ "model": "qwen/qwen3.6-flash",
8
+ "seed": 1,
9
+ "outcome": "win",
10
+ "turns": 7,
11
+ "max_turns": 60,
12
+ "actions_issued": 7,
13
+ "actions_warned": 0,
14
+ "agent_stats": {
15
+ "turns": 7,
16
+ "tool_calls": 7,
17
+ "empty_replies": 0
18
+ },
19
+ "objective_progress": 1.0,
20
+ "reward_vector": {
21
+ "economy": 0.5,
22
+ "military": 0.3,
23
+ "territory": 0.1317,
24
+ "scouting": 0.3,
25
+ "objective": 1.0
26
+ },
27
+ "signals": {
28
+ "economy_value": 5000,
29
+ "explored_percent": 13.17,
30
+ "units_killed": 3,
31
+ "units_lost": 0
32
+ }
33
+ }
playback/_smoke/20260519-025303__qwen_qwen3.6-flash/adversarial-duel:easy:public/seed1/messages.json ADDED
@@ -0,0 +1,236 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ [
2
+ {
3
+ "role": "system",
4
+ "content": "You are playing Command & Conquer: Red Alert.\nEach turn you receive a BRIEFING with the current game state and a MINIMAP image.\nIssue orders to your units via tool calls; the game advances asynchronously and\ninterrupts you when something happens (unit arrived, enemy spotted, etc.).\n\nUnit format in briefings (one unit per line):\n <id> <type> @(<x>,<y>) unit is idle / not moving\n <id> <type> @(<x>,<y>), moving to (<tx>,<ty>) unit is en route to (tx,ty)\nExample:\n 1004 jeep @(15,27)\n 1005 jeep @(15,27), moving to (40,30)\n\nWhen issuing tool calls, pass the numeric unit ID (e.g. unit_ids=[1004]).\n\nIdle units are also listed at the end as `Idle: 1004, 1006, ...`\nfor quick scanning.\n\nEvery turn MUST include at least one tool call.\n\nCombat model (read once, applies to every turn):\n * Two ways to fight:\n - `move` to a cell \u2014 units take the path; auto-fire at any hostile\n in weapon range *opportunistically* (no detour); they stop when\n they reach the cell. Use this to POSITION (e.g. flank, retreat).\n - `attack_target(unit_ids, target_id)` \u2014 units pathfind toward the\n named actor and focus-fire it, even if other enemies are closer.\n Use this for PRIORITY: kill THIS tesla, ignore the e3 next to it.\n After the target dies, units go idle and you re-decide on the\n next briefing.\n * \"Range\" in the codex is in cells. A unit with rng=4.8c attacks\n targets at \u22644.8 cells away. A defense with rng=7c hits you at 7 cells.\n * If your range < enemy range, you take damage before you can hit back.\n Counter by:\n (a) flanking from multiple sides so attention splits, or\n (b) sending sacrificial high-HP units (2tnk, apc) to soak hits while\n longer-burst units do damage, or\n (c) bypassing the threat entirely (route around).\n * DPS in the codex assumes sustained fire; concentrating 4 tanks on one\n tesla coil burns it down 4\u00d7 faster than sending one at a time. Send\n GROUPS via `attack_target` with the same target_id, not single units.\n * Sight (`sight Nc`) means you see N cells out from that unit \u2014 if your\n sight \u2265 enemy attack range, scout safely from outside their range.\n\nOBJECTIVE (this scenario): Rung 1 \u2014 even-ish duel: 4 agent vehicles vs 3 enemy rifle.\nWIN WHEN: destroy \u22653 enemy units AND before game tick 14000.\nYOU LOSE IF: your whole force is destroyed.\nYou have at most 60 decision turns; acting decisively and early matters.\n\nUNIT CODEX (this scenario). Each line: <code> $cost hp<HP> rng<attack range, cells> dps<damage/sec> sight<vision, cells> <movement: foot/wheeled/tracked> (role). Unarmed units list their function instead of rng/dps; buildings list their purpose.\n 1tnk Light tank \u2014 cheap, fast, modest armour/gun; anti-vehicle. $700 hp300 rng4c dps14 sight6c tracked\n 2tnk Medium tank \u2014 the main battle tank, balanced armour/firepower. $850 hp400 rng4.75c dps22 sight6c tracked\n e1 Rifle infantry \u2014 cheap basic foot soldier, good vs infantry. $100 hp50 rng3c dps6 sight4c foot"
5
+ },
6
+ {
7
+ "role": "user",
8
+ "content": "--- TURN BRIEFING (tick 3, ~0s game time) ---\nFunds: $5000 (cash=$5000 + ore=$0) | Power: +0 | Harvesters: 0 | Explored: 3.3%\nUnits (4):\n 1003 1tnk @(6,11)\n 1004 1tnk @(6,11)\n 1001 2tnk @(6,8)\n 1002 2tnk @(6,8)\nIdle: 1003, 1004, 1001, 1002\nBuildings: ? ()\nEnemies: none visible\nProduction: IDLE"
9
+ },
10
+ {
11
+ "role": "assistant",
12
+ "content": "",
13
+ "reasoning": "The initial briefing shows my starting force: two 1tnks (1003, 1004) and two 2tnks (1001, 1002) at the top-left of the map.\nThe enemy force consists of 3 rifle (e1).\nThe objective is to destroy 3 enemy units before tick 14000.\nSince the enemy has no ranged advantage and I have tanks with range 4-4.75c vs their 3c, I should move out and engage.\nI will move the entire force south-east to scout and find the enemy.\nTarget coordinates: (15, 15).",
14
+ "tool_calls": [
15
+ {
16
+ "id": "c0",
17
+ "type": "function",
18
+ "function": {
19
+ "name": "move_units",
20
+ "arguments": {
21
+ "unit_ids": [
22
+ 1001,
23
+ 1002,
24
+ 1003,
25
+ 1004
26
+ ],
27
+ "target_x": 15,
28
+ "target_y": 15
29
+ }
30
+ }
31
+ }
32
+ ]
33
+ },
34
+ {
35
+ "role": "tool",
36
+ "tool_call_id": "c0",
37
+ "content": "ok"
38
+ },
39
+ {
40
+ "role": "user",
41
+ "content": "--- TURN BRIEFING (tick 93, ~3s game time) ---\nFunds: $5000 (cash=$5000 + ore=$0) | Power: +0 | Harvesters: 0 | Explored: 5.0%\nUnits (4):\n 1003 1tnk @(12,11), moving to (15,14)\n 1004 1tnk @(13,11), moving to (16,14)\n 1001 2tnk @(9,9), moving to (15,15)\n 1002 2tnk @(9,9), moving to (14,14)\nBuildings: ? ()\nEnemies: none visible\nProduction: IDLE"
42
+ },
43
+ {
44
+ "role": "assistant",
45
+ "content": "",
46
+ "reasoning": "The units are moving toward the center-right area (around 15,15) to scout and find the enemy. No enemies are visible yet. The movement is progressing as expected. I should wait for them to reach the target or for enemies to appear.",
47
+ "tool_calls": [
48
+ {
49
+ "id": "c0",
50
+ "type": "function",
51
+ "function": {
52
+ "name": "observe",
53
+ "arguments": {}
54
+ }
55
+ }
56
+ ]
57
+ },
58
+ {
59
+ "role": "tool",
60
+ "tool_call_id": "c0",
61
+ "content": "ok"
62
+ },
63
+ {
64
+ "role": "user",
65
+ "content": "--- TURN BRIEFING (tick 183, ~7s game time) ---\nFunds: $5000 (cash=$5000 + ore=$0) | Power: +0 | Harvesters: 0 | Explored: 6.3%\nUnits (4):\n 1003 1tnk @(15,14)\n 1004 1tnk @(16,14)\n 1001 2tnk @(14,14), moving to (15,15)\n 1002 2tnk @(14,14)\nIdle: 1003, 1004, 1002\nBuildings: ? ()\nEnemies: none visible\nProduction: IDLE"
66
+ },
67
+ {
68
+ "role": "assistant",
69
+ "content": "",
70
+ "reasoning": "The units have moved closer to the center. The two 1tnk units are at (15,14) and (16,14). 2tnk 1001 is moving to (15,15) and has arrived. 2tnk 1002 is at (14,14).\n\nI need to keep scouting and looking for the enemy. The objective is a duel. I should probably move forward to engage. The enemy is likely nearby. Let's push the formation forward a bit more to find them.\n\nMoving all units slightly forward (e.g., to (18, 18) or (20, 20)) might reveal enemies. Or I can just wait and observe. Since I have 60 turns and need to destroy 3 units before tick 14000, time is not extremely tight, but early engagement is good.\n\nLet's move the group forward to (20, 20).\n",
71
+ "tool_calls": [
72
+ {
73
+ "id": "c0",
74
+ "type": "function",
75
+ "function": {
76
+ "name": "move_units",
77
+ "arguments": {
78
+ "unit_ids": [
79
+ 1001,
80
+ 1002,
81
+ 1003,
82
+ 1004
83
+ ],
84
+ "target_x": 20,
85
+ "target_y": 20
86
+ }
87
+ }
88
+ }
89
+ ]
90
+ },
91
+ {
92
+ "role": "tool",
93
+ "tool_call_id": "c0",
94
+ "content": "ok"
95
+ },
96
+ {
97
+ "role": "user",
98
+ "content": "--- TURN BRIEFING (tick 273, ~10s game time) ---\nFunds: $5000 (cash=$5000 + ore=$0) | Power: +0 | Harvesters: 0 | Explored: 8.2%\nUnits (4):\n 1003 1tnk @(20,19)\n 1004 1tnk @(21,19)\n 1001 2tnk @(18,18), moving to (20,20)\n 1002 2tnk @(18,18), moving to (19,19)\nIdle: 1003, 1004\nBuildings: ? ()\nEnemies: none visible\nProduction: IDLE"
99
+ },
100
+ {
101
+ "role": "assistant",
102
+ "content": "",
103
+ "reasoning": "The units have moved to (20,19) and (21,19) for the 1tnks, and (18,18) moving to (20,20) and (19,19) for the 2tnks. We are exploring the map. No enemies are visible yet. I should continue moving towards the center or east to find the enemy. The enemy is likely to be around (20,20)-(30,30) or similar. Let's move further east/north-east.",
104
+ "tool_calls": [
105
+ {
106
+ "id": "c0",
107
+ "type": "function",
108
+ "function": {
109
+ "name": "move_units",
110
+ "arguments": {
111
+ "unit_ids": [
112
+ 1001,
113
+ 1002,
114
+ 1003,
115
+ 1004
116
+ ],
117
+ "target_x": 25,
118
+ "target_y": 25
119
+ }
120
+ }
121
+ }
122
+ ]
123
+ },
124
+ {
125
+ "role": "tool",
126
+ "tool_call_id": "c0",
127
+ "content": "ok"
128
+ },
129
+ {
130
+ "role": "user",
131
+ "content": "--- TURN BRIEFING (tick 363, ~14s game time) ---\nFunds: $5000 (cash=$5000 + ore=$0) | Power: +0 | Harvesters: 0 | Explored: 10.1%\nUnits (4):\n 1003 1tnk @(25,24)\n 1004 1tnk @(26,24)\n 1001 2tnk @(22,22), moving to (25,25)\n 1002 2tnk @(22,22), moving to (24,24)\nIdle: 1003, 1004\nBuildings: ? ()\nEnemies: none visible\nProduction: IDLE"
132
+ },
133
+ {
134
+ "role": "assistant",
135
+ "content": "",
136
+ "reasoning": "The units are continuing to move toward (25, 25) and beyond, exploring the map. No enemies are visible yet. The objective is to destroy 3 enemy units. I should keep advancing to find the enemy.\n",
137
+ "tool_calls": [
138
+ {
139
+ "id": "c0",
140
+ "type": "function",
141
+ "function": {
142
+ "name": "move_units",
143
+ "arguments": {
144
+ "unit_ids": [
145
+ 1001,
146
+ 1002,
147
+ 1003,
148
+ 1004
149
+ ],
150
+ "target_x": 30,
151
+ "target_y": 30
152
+ }
153
+ }
154
+ }
155
+ ]
156
+ },
157
+ {
158
+ "role": "tool",
159
+ "tool_call_id": "c0",
160
+ "content": "ok"
161
+ },
162
+ {
163
+ "role": "user",
164
+ "content": "--- TURN BRIEFING (tick 453, ~18s game time) ---\nFunds: $5000 (cash=$5000 + ore=$0) | Power: +0 | Harvesters: 0 | Explored: 12.4%\nUnits (4):\n 1003 1tnk @(30,29)\n 1004 1tnk @(31,29)\n 1001 2tnk @(27,27), moving to (30,30)\n 1002 2tnk @(26,26), moving to (29,29)\nIdle: 1003, 1004\nBuildings: ? ()\nEnemies: 1xe1[1007@(32,24)] center (32,24)\nProduction: IDLE"
165
+ },
166
+ {
167
+ "role": "assistant",
168
+ "content": "",
169
+ "reasoning": "I have spotted an enemy unit (e1 rifle infantry at 32,24). My tanks are approaching. I should focus fire this enemy unit to get a kill early. The tanks are close enough to engage. I'll order all tanks to attack the enemy e1.",
170
+ "tool_calls": [
171
+ {
172
+ "id": "c0",
173
+ "type": "function",
174
+ "function": {
175
+ "name": "attack_unit",
176
+ "arguments": {
177
+ "target_id": 1007,
178
+ "unit_ids": [
179
+ 1001,
180
+ 1002,
181
+ 1003,
182
+ 1004
183
+ ]
184
+ }
185
+ }
186
+ }
187
+ ]
188
+ },
189
+ {
190
+ "role": "tool",
191
+ "tool_call_id": "c0",
192
+ "content": "ok"
193
+ },
194
+ {
195
+ "role": "user",
196
+ "content": [
197
+ {
198
+ "type": "text",
199
+ "text": "--- TURN BRIEFING (tick 543, ~21s game time) ---\nFunds: $5000 (cash=$5000 + ore=$0) | Power: +0 | Harvesters: 0 | Explored: 12.4%\nUnits (4):\n 1003 1tnk @(30,28), moving to (34,24)\n 1004 1tnk @(31,28), moving to (34,24)\n 1001 2tnk @(28,27)\n 1002 2tnk @(28,26)\nIdle: 1001, 1002\nBuildings: ? ()\nEnemies: 2xe1[1005@(34,24),1006@(33,24)] center (33,24)\nProduction: IDLE"
200
+ },
201
+ {
202
+ "type": "image_url",
203
+ "image_url": {
204
+ "url": "data:image/png;base64,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QgiNGjWMRCKff/5/0eVdu3bZsmXLOed0Gjr0j3ff/auSv3L66c0ffvjR7t0vqVu3zqWX9gr/OSup2XnnnfuTn/yse/dLKlSocMUV/7P347B9+/Yvv/z7ccfV/+/dj5s2bXqnTueFENq0afX++4tKTQKUXeNTT42qVatmz57df/ObAfff/1B0lNq3bzts2PCePS9t2LDBJZf0Kv4Gf/7551111XVXXPHTVq1aFM/wNG9+6rBhw+fMebfUO3fq1LFlyzMvu+zKfv0GnHbaKT+oyiX37sc/bnTssbWnT58xY8bsLl067zKOlix6YmLSk08+ccopJz/++PC9mQM566w2r7wytnPnHrVr127duvWRMkSHj/POO/ess1r37n3Fr399T6tWLUvu8hNPPNmwYYMOHc7u2fPSiy7q3b59u+OPzyp1pOzhwNkf7703v0WLM5OSko4/Piu6VW3atHrvvXllt+fqq69bs2bNlVf+dJfHY/GO+LseAILTsaLh4c47+w4c2P/uu+8NISxY8J8TogYPfjg/P/8/m5iQUPxldMSIx9u0aRVCWLDg/V/84tYQwpYtW9q2PTeUuCZkzxswbdo7ffrcXLFixU6dOr755pTi5UuWLP3FL274zW9+PX/+wlJnSU2b9nY0q4wZM75du7OWLVsRXX722e1at275zjtTo0937Njxg4aisLCg5LlJIYS4uLhp0955+unhw4eP7NSp45Qp07p0uaDkC8qusaCg4J57fjd69KhJk15bsGBhdPmMGbM/+WRJCGH8+EmtWrWIfrlv1+6sl18es3bt2hDCq6+OO/305m+8MTmEsHjxRx9//Mltt91S6p3r16/36qvj1q79Zwjhrbfe/qGFLt67Hj26vf32Ozt27Jg69a0HHxz0+98/UlzNXRY9M7Pq7NlzFixY+Lvf3XPttT/fuXPnnle0cOH78+cvCCF89NHHGRlVmjU76UgZosNEy5YtXn117D//+U0IYfr0d6ILo7scQlixYuVzzz3fp8/NO3bsyMzMTEtLK3Wk1K9fb3cHzv6YN2/+wIG/mj9/wbx5C5o1O6levbpnnHH6oEGD8/LySm3Pt99+u7uj45NPlhbvCABwVIeQYlu2bJk48bX777+v1OUBLVqcOWzYI+PGTSj+9rls2fJrrrkqGkVuuaVvCKFLl849e3bft/Vu2rTpo48+adHijHPP7XD77f9bvPzTTz/r0eOSli3PbNOm1U033dijxyVlf7dChQql0tHIkc+MHPnMPmxGSkpKs2ZNH3rokVLL161bt3HjxqZNT2re/NR77x1UKoTsco2ZmVULCgoyM6uGXZ3pVPy4YsXEgoKC6OPk5OSCgn9FpoKCwl2+84MP/q7kju/b3sXHx3fp0vmYYzIvvvii6I/atm0za9ac3RU9OgKDBg2Oj48/66w2P//59U8++XSpnBZ9ULly5eiD4ooUFe2Mi4s7Uobo8JGYWDG6gyGESpUqldzlEEL37l2vvvrKceMm5uVtbdy48S6PlFJPSw7pPluy5NOaNWt07nz+++9/sGXL1uuv/1lOzqqtW7f26NGt1Pbs4eho2bJF8Y4AAME1ISGE9PT0Sy/ttWTJ0lLfCOfPXxAfH5+enh5K/Ff3xo0b77337tq1ayUlJTVvfup1112zP6uePHnqz37209zczWvWrCl5d6M+fW6eN2/BK6+MrVy5cslrP84/v1NWVpOqVTN6975k7tx5xcvff39R164X1qlzbNWqGU899cTeX6aSmVl1wIB+n3yydMWKlWEXczXTBw7sX/ZcrF2uMS0tbcCAu265pW/dunU7dz4/+rJ27dpkZTU55phjrrjisg8++NdVJYsWfXj55b2rV69Ws2aN3r0vzs6eu+d3Xrjwg0svvbhatWqNGjU877yOez+8JfeuTZvWhYUFzZu3OvXUFqee2uLll8eUvdC/VNELCwsjkcjOnTsHDrznpz/9yWmnnRr+c4elLVlZTTIyMlq2PLN581N3ufYjYogOK0uXftazZ7cqVSqffHKz9u1LX9Feu3atTz/97M03p3z33YYTTsiqWDGh1JFyxx19d3fg7I+ioqKFCz+IDvL8+Qu6d+86b978XW5PUVFRcnJyQkLCPh+PAECI+ZmQ6DUhIYT8/B0LF75/zz2/C7uarLjqqiuKT+MuKiq6+ebbbr+9z4sv/jklJXnRor/dc89v+/a9dZ+3YdasOffc8+tHHhlacuGLL/7lwQcHzZz51ubNuY8+Omz79u3FP1qwYOGgQffVrFlj4sS/Tp8+o0WLM6PL33137gknZL3wwrMJCQmTJr1e8uSusJv5gei+5+XlzZ07r3//gbt82dtvz+jX787hw58q+6Oya7znnoHZ2XM//HDxoEGDH310yIIF74cQPv54yX333V2/fr0pU96aNOm1M844PYTw2mtvNG7847FjX87Pzx8zZlypb9hl3zkuLu7445tMmjR21apVM2fODnsx+1F273r06PrKK2OL/2t83LgJf/nL85UqVSosLNhl0UuO4YoVK594YuSDD/62d++fbNmyJYSwePFHS5d++uabE5cu/WzGjFm73IzDeYgOTxMmTGrWrOmUKa+tWvWPjz76uORcXwhh0qTXhg59ZPr0yW+99fazz46+667/veGGm0oeKdnZ7+7uwAn7e1nIvFNOOXnlypyNGzfFxcW99968XW5Pr16XrVv37fPP/+nKK68pVaDiQxUAONzEpaVVNQqxpGvXC0877ZT773/IUBydQ5Sbu35vbtGbnv6vRi49enTr2vXCO++8q3r1asOHD7v11tt3OUG3/1u1N7foLd4qACCYCQFi1ZQpb7Vu3XL69Ml5eduee+75A5FAAACCmRCIYXvZd/wgzzkcnlsFAAghAABAcHcsAAAAIQQAABBCAAAAhBAAAEAIAQAAhBBDAAAACCEAAIAQAgAAIIQAAABCCAAAgBACAAAIIQAAgBACAAAghAAAAEIIAACAEAIAAAghAAAAQggAACCEAAAAQggAAIAQAgAACCEAAABCCAAAIIQAAAAIIQAAgBACAAAIIQAAAEIIAAAghAAAAAghAACAEAIAAAghAAAAQggAACCEAAAACCEAAIAQAgAAIIQAAABCCAAAIIQAAAAIIQAAgBACAAAghAAAAEIIAACAEAIAAAghAACAEAIAACCEAAAAQggAAIAQAgAACCEAAABCCAAAIIQAAABCCAAAgBACAAAIIQAAAEIIAAAghAAAAEIIAACAEAIAAAghAAAAQggAACCEAAAACCEAAIAQAgAACCEAAABCCAAAIIQAAAAIIQAAgBACAABQ7P8DEMtwKFi7GJUAAAAASUVORK5CYII="
205
+ }
206
+ }
207
+ ]
208
+ },
209
+ {
210
+ "role": "assistant",
211
+ "content": "",
212
+ "reasoning": "We have spotted 2 enemies: 1005 and 1006 (rifle infantry) at (34,24) and (33,24).\nPrevious enemy 1007 seems to be gone (likely destroyed by the tanks moving towards it).\nThe tanks 1003 and 1004 are already moving towards (34,24).\n1001 and 1002 are idle at (28,27) and (28,26).\nI should move 1001 and 1002 towards the enemies as well to focus fire.\nTarget coordinates: (34,24) is where the enemies are.",
213
+ "tool_calls": [
214
+ {
215
+ "id": "c0",
216
+ "type": "function",
217
+ "function": {
218
+ "name": "move_units",
219
+ "arguments": {
220
+ "unit_ids": [
221
+ 1001,
222
+ 1002
223
+ ],
224
+ "target_x": 34,
225
+ "target_y": 24
226
+ }
227
+ }
228
+ }
229
+ ]
230
+ },
231
+ {
232
+ "role": "tool",
233
+ "tool_call_id": "c0",
234
+ "content": "ok"
235
+ }
236
+ ]
playback/_smoke/20260519-025303__qwen_qwen3.6-flash/adversarial-duel:easy:public/seed1/minimap_turn001.png ADDED
playback/_smoke/20260519-025303__qwen_qwen3.6-flash/adversarial-duel:easy:public/seed1/minimap_turn002.png ADDED
playback/_smoke/20260519-025303__qwen_qwen3.6-flash/adversarial-duel:easy:public/seed1/minimap_turn003.png ADDED
playback/_smoke/20260519-025303__qwen_qwen3.6-flash/adversarial-duel:easy:public/seed1/minimap_turn004.png ADDED
playback/_smoke/20260519-025303__qwen_qwen3.6-flash/adversarial-duel:easy:public/seed1/minimap_turn005.png ADDED
playback/_smoke/20260519-025303__qwen_qwen3.6-flash/adversarial-duel:easy:public/seed1/minimap_turn006.png ADDED
playback/_smoke/20260519-025303__qwen_qwen3.6-flash/adversarial-duel:easy:public/seed1/minimap_turn007.png ADDED
playback/_smoke/20260519-025303__qwen_qwen3.6-flash/adversarial-duel:easy:public/seed1/score.json ADDED
@@ -0,0 +1,19 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "composite": 0.8561,
3
+ "outcome": "win",
4
+ "perception": 0.2722,
5
+ "reasoning": 0.9494,
6
+ "action": 1.0,
7
+ "weakest_link": "perception",
8
+ "objective_progress": 1.0,
9
+ "reward_vector": {
10
+ "economy": 0.5,
11
+ "military": 0.3,
12
+ "territory": 0.1317,
13
+ "scouting": 0.3,
14
+ "objective": 1.0
15
+ },
16
+ "notes": [
17
+ "very low map coverage \u2192 perception/scouting problem"
18
+ ]
19
+ }
playback/_smoke/20260519-025303__qwen_qwen3.6-flash/adversarial-duel:easy:public/seed1/turns.jsonl ADDED
@@ -0,0 +1,7 @@
 
 
 
 
 
 
 
 
1
+ {"turn": 1, "tick": 93, "interrupt": null, "commands": ["Command::MoveUnits { unit_ids: [\"1001\", \"1002\", \"1003\", \"1004\"], target_x: 15, target_y: 15 }"], "ascii_minimap": "################################################################################################################################\n################################################################################################################################\n######.#########################################################################################################################\n###.......######################################################################################################################\n##.........#####################################################################################################################\n##..........####################################################################################################################\n##..........####################################################################################################################\n##..........####################################################################################################################\n##...........###################################################################################################################\n##..........####################################################################################################################\n##..........####################################################################################################################\n##..........####################################################################################################################\n##.........#####################################################################################################################\n##.........#####################################################################################################################\n##.........#####################################################################################################################\n###.......######################################################################################################################\n######.#########################################################################################################################\n################################################################################################################################\n################################################################################################################################\n################################################################################################################################\n################################################################################################################################\n################################################################################################################################\n################################################################################################################################\n################################################################################################################################\n################################################################################################################################\n################################################################################################################################\n################################################################################################################################\n################################################################################################################################\n################################################################################################################################\n################################################################################################################################\n################################################################################################################################\n################################################################################################################################\n############################################################################################################################.###\n##########################################################################################################################....##\n#########################################################################################################################.....##\n#########################################################################################################################.....##\n########################################################################################################################......##\n#########################################################################################################################.....##\n################################################################################################################################\n################################################################################################################################", "signals": {"cash": 5000, "economy_value": 5000, "explored_percent": 5.02, "units_killed": 0, "units_lost": 0, "enemies_seen": 0}, "units": [{"id": "1001", "cell_x": 6, "cell_y": 8, "type": "2tnk", "hp": 1.0, "activity": "idle", "idle": true, "can_attack": true}, {"id": "1002", "cell_x": 6, "cell_y": 8, "type": "2tnk", "hp": 1.0, "activity": "idle", "idle": true, "can_attack": true}, {"id": "1003", "cell_x": 6, "cell_y": 11, "type": "1tnk", "hp": 1.0, "activity": "idle", "idle": true, "can_attack": true}, {"id": "1004", "cell_x": 6, "cell_y": 11, "type": "1tnk", "hp": 1.0, "activity": "idle", "idle": true, "can_attack": true}], "enemies": [], "goal": {"leaves": [{"name": "units_killed_gte", "target": 3, "current": 0, "ratio": 0.0, "satisfied": false}, {"name": "within_ticks", "target": 14000, "current": 93, "ratio": 1.0, "satisfied": true}], "reward_vector": {"economy": 0.5, "military": 0.0, "territory": 0.0502, "scouting": 0.0, "objective": 0.5}, "objective_progress": 0.5, "won": false}}
2
+ {"turn": 2, "tick": 183, "interrupt": null, "commands": ["Command::Observe"], "ascii_minimap": "################################################################################################################################\n################################################################################################################################\n######...#######################################################################################################################\n###.........####################################################################################################################\n##...........###################################################################################################################\n##............##################################################################################################################\n##.............#################################################################################################################\n##...............###############################################################################################################\n##................##############################################################################################################\n##................##############################################################################################################\n##................##############################################################################################################\n##.................#############################################################################################################\n##................##############################################################################################################\n##................##############################################################################################################\n##................##############################################################################################################\n###..............###############################################################################################################\n######........##################################################################################################################\n################################################################################################################################\n################################################################################################################################\n################################################################################################################################\n################################################################################################################################\n################################################################################################################################\n################################################################################################################################\n################################################################################################################################\n################################################################################################################################\n################################################################################################################################\n################################################################################################################################\n################################################################################################################################\n################################################################################################################################\n################################################################################################################################\n################################################################################################################################\n################################################################################################################################\n############################################################################################################################.###\n##########################################################################################################################....##\n#########################################################################################################################.....##\n#########################################################################################################################.....##\n########################################################################################################################......##\n#########################################################################################################################.....##\n################################################################################################################################\n################################################################################################################################", "signals": {"cash": 5000, "economy_value": 5000, "explored_percent": 6.27, "units_killed": 0, "units_lost": 0, "enemies_seen": 0}, "units": [{"id": "1001", "cell_x": 9, "cell_y": 9, "type": "2tnk", "hp": 1.0, "activity": "moving", "idle": false, "can_attack": true, "target_x": 15, "target_y": 15}, {"id": "1002", "cell_x": 9, "cell_y": 9, "type": "2tnk", "hp": 1.0, "activity": "moving", "idle": false, "can_attack": true, "target_x": 14, "target_y": 14}, {"id": "1003", "cell_x": 12, "cell_y": 11, "type": "1tnk", "hp": 1.0, "activity": "moving", "idle": false, "can_attack": true, "target_x": 15, "target_y": 14}, {"id": "1004", "cell_x": 13, "cell_y": 11, "type": "1tnk", "hp": 1.0, "activity": "moving", "idle": false, "can_attack": true, "target_x": 16, "target_y": 14}], "enemies": [], "goal": {"leaves": [{"name": "units_killed_gte", "target": 3, "current": 0, "ratio": 0.0, "satisfied": false}, {"name": "within_ticks", "target": 14000, "current": 183, "ratio": 1.0, "satisfied": true}], "reward_vector": {"economy": 0.5, "military": 0.0, "territory": 0.0627, "scouting": 0.0, "objective": 0.5}, "objective_progress": 0.5, "won": false}}
3
+ {"turn": 3, "tick": 273, "interrupt": null, "commands": ["Command::MoveUnits { unit_ids: [\"1001\", \"1002\", \"1003\", \"1004\"], target_x: 20, target_y: 20 }"], "ascii_minimap": "################################################################################################################################\n################################################################################################################################\n######...#######################################################################################################################\n###.........####################################################################################################################\n##...........###################################################################################################################\n##............##################################################################################################################\n##.............#################################################################################################################\n##...............###############################################################################################################\n##................##############################################################################################################\n##.................#############################################################################################################\n##..................############################################################################################################\n##...................###########################################################################################################\n##...................###########################################################################################################\n##...................###########################################################################################################\n##....................##########################################################################################################\n###..................###########################################################################################################\n######...............###########################################################################################################\n#########............###########################################################################################################\n##########..........############################################################################################################\n###########.......##############################################################################################################\n##############.#################################################################################################################\n################################################################################################################################\n################################################################################################################################\n################################################################################################################################\n################################################################################################################################\n################################################################################################################################\n################################################################################################################################\n################################################################################################################################\n################################################################################################################################\n################################################################################################################################\n################################################################################################################################\n################################################################################################################################\n############################################################################################################################.###\n##########################################################################################################################....##\n#########################################################################################################################.....##\n#########################################################################################################################.....##\n########################################################################################################################......##\n#########################################################################################################################.....##\n################################################################################################################################\n################################################################################################################################", "signals": {"cash": 5000, "economy_value": 5000, "explored_percent": 8.18, "units_killed": 0, "units_lost": 0, "enemies_seen": 0}, "units": [{"id": "1001", "cell_x": 14, "cell_y": 14, "type": "2tnk", "hp": 1.0, "activity": "moving", "idle": false, "can_attack": true, "target_x": 15, "target_y": 15}, {"id": "1002", "cell_x": 14, "cell_y": 14, "type": "2tnk", "hp": 1.0, "activity": "idle", "idle": true, "can_attack": true}, {"id": "1003", "cell_x": 15, "cell_y": 14, "type": "1tnk", "hp": 1.0, "activity": "idle", "idle": true, "can_attack": true}, {"id": "1004", "cell_x": 16, "cell_y": 14, "type": "1tnk", "hp": 1.0, "activity": "idle", "idle": true, "can_attack": true}], "enemies": [], "goal": {"leaves": [{"name": "units_killed_gte", "target": 3, "current": 0, "ratio": 0.0, "satisfied": false}, {"name": "within_ticks", "target": 14000, "current": 273, "ratio": 1.0, "satisfied": true}], "reward_vector": {"economy": 0.5, "military": 0.0, "territory": 0.0818, "scouting": 0.0, "objective": 0.5}, "objective_progress": 0.5, "won": false}}
4
+ {"turn": 4, "tick": 363, "interrupt": null, "commands": ["Command::MoveUnits { unit_ids: [\"1001\", \"1002\", \"1003\", \"1004\"], target_x: 25, target_y: 25 }"], "ascii_minimap": "################################################################################################################################\n################################################################################################################################\n######...#######################################################################################################################\n###.........####################################################################################################################\n##...........###################################################################################################################\n##............##################################################################################################################\n##.............#################################################################################################################\n##...............###############################################################################################################\n##................##############################################################################################################\n##.................#############################################################################################################\n##..................############################################################################################################\n##...................###########################################################################################################\n##....................##########################################################################################################\n##.....................#########################################################################################################\n##......................########################################################################################################\n###......................#######################################################################################################\n######....................######################################################################################################\n#########.................######################################################################################################\n##########................######################################################################################################\n###########................#####################################################################################################\n############..............######################################################################################################\n#############.............######################################################################################################\n##############............######################################################################################################\n###############..........#######################################################################################################\n##################.#..##########################################################################################################\n################################################################################################################################\n################################################################################################################################\n################################################################################################################################\n################################################################################################################################\n################################################################################################################################\n################################################################################################################################\n################################################################################################################################\n############################################################################################################################.###\n##########################################################################################################################....##\n#########################################################################################################################.....##\n#########################################################################################################################.....##\n########################################################################################################################......##\n#########################################################################################################################.....##\n################################################################################################################################\n################################################################################################################################", "signals": {"cash": 5000, "economy_value": 5000, "explored_percent": 10.13, "units_killed": 0, "units_lost": 0, "enemies_seen": 0}, "units": [{"id": "1001", "cell_x": 18, "cell_y": 18, "type": "2tnk", "hp": 1.0, "activity": "moving", "idle": false, "can_attack": true, "target_x": 20, "target_y": 20}, {"id": "1002", "cell_x": 18, "cell_y": 18, "type": "2tnk", "hp": 1.0, "activity": "moving", "idle": false, "can_attack": true, "target_x": 19, "target_y": 19}, {"id": "1003", "cell_x": 20, "cell_y": 19, "type": "1tnk", "hp": 1.0, "activity": "idle", "idle": true, "can_attack": true}, {"id": "1004", "cell_x": 21, "cell_y": 19, "type": "1tnk", "hp": 1.0, "activity": "idle", "idle": true, "can_attack": true}], "enemies": [], "goal": {"leaves": [{"name": "units_killed_gte", "target": 3, "current": 0, "ratio": 0.0, "satisfied": false}, {"name": "within_ticks", "target": 14000, "current": 363, "ratio": 1.0, "satisfied": true}], "reward_vector": {"economy": 0.5, "military": 0.0, "territory": 0.1013, "scouting": 0.0, "objective": 0.5}, "objective_progress": 0.5, "won": false}}
5
+ {"turn": 5, "tick": 453, "interrupt": null, "commands": ["Command::MoveUnits { unit_ids: [\"1001\", \"1002\", \"1003\", \"1004\"], target_x: 30, target_y: 30 }"], "ascii_minimap": "################################################################################################################################\n################################################################################################################################\n######...#######################################################################################################################\n###.........####################################################################################################################\n##...........###################################################################################################################\n##............##################################################################################################################\n##.............#################################################################################################################\n##...............###############################################################################################################\n##................##############################################################################################################\n##.................#############################################################################################################\n##..................############################################################################################################\n##...................###########################################################################################################\n##....................##########################################################################################################\n##.....................#########################################################################################################\n##......................########################################################################################################\n###......................#######################################################################################################\n######....................######################################################################################################\n#########..................#####################################################################################################\n##########..................####################################################################################################\n###########..................###################################################################################################\n############..................##################################################################################################\n#############..................#################################################################################################\n##############.................#################################################################################################\n###############................#################################################################################################\n################................################################################################################################\n#################..............#################################################################################################\n##################.............#################################################################################################\n###################............#################################################################################################\n######################........##################################################################################################\n#########################..#####################################################################################################\n################################################################################################################################\n################################################################################################################################\n############################################################################################################################.###\n##########################################################################################################################....##\n#########################################################################################################################.....##\n#########################################################################################################################.....##\n########################################################################################################################......##\n#########################################################################################################################.....##\n################################################################################################################################\n################################################################################################################################", "signals": {"cash": 5000, "economy_value": 5000, "explored_percent": 12.37, "units_killed": 0, "units_lost": 0, "enemies_seen": 1}, "units": [{"id": "1001", "cell_x": 22, "cell_y": 22, "type": "2tnk", "hp": 1.0, "activity": "moving", "idle": false, "can_attack": true, "target_x": 25, "target_y": 25}, {"id": "1002", "cell_x": 22, "cell_y": 22, "type": "2tnk", "hp": 1.0, "activity": "moving", "idle": false, "can_attack": true, "target_x": 24, "target_y": 24}, {"id": "1003", "cell_x": 25, "cell_y": 24, "type": "1tnk", "hp": 1.0, "activity": "idle", "idle": true, "can_attack": true}, {"id": "1004", "cell_x": 26, "cell_y": 24, "type": "1tnk", "hp": 1.0, "activity": "idle", "idle": true, "can_attack": true}], "enemies": [], "goal": {"leaves": [{"name": "units_killed_gte", "target": 3, "current": 0, "ratio": 0.0, "satisfied": false}, {"name": "within_ticks", "target": 14000, "current": 453, "ratio": 1.0, "satisfied": true}], "reward_vector": {"economy": 0.5, "military": 0.0, "territory": 0.1237, "scouting": 0.1, "objective": 0.5}, "objective_progress": 0.5, "won": false}}
6
+ {"turn": 6, "tick": 543, "interrupt": null, "commands": ["Command::AttackUnit { unit_ids: [\"1001\", \"1002\", \"1003\", \"1004\"], target_id: \"1007\" }"], "ascii_minimap": "################################################################################################################################\n################################################################################################################################\n######...#######################################################################################################################\n###.........####################################################################################################################\n##...........###################################################################################################################\n##............##################################################################################################################\n##.............#################################################################################################################\n##...............###############################################################################################################\n##................##############################################################################################################\n##.................#############################################################################################################\n##..................############################################################################################################\n##...................###########################################################################################################\n##....................##########################################################################################################\n##.....................#########################################################################################################\n##......................########################################################################################################\n###......................#######################################################################################################\n######....................######################################################################################################\n#########..................#####################################################################################################\n##########..................####################################################################################################\n###########..................###################################################################################################\n############..................##################################################################################################\n#############..................###.#############################################################################################\n##############......................############################################################################################\n###############.....................############################################################################################\n################....................############################################################################################\n#################..................#############################################################################################\n##################..................############################################################################################\n###################.................############################################################################################\n####################................############################################################################################\n#####################................###########################################################################################\n######################..............############################################################################################\n#######################.............############################################################################################\n########################............########################################################################################.###\n###########################........#######################################################################################....##\n##############################..#########################################################################################.....##\n#########################################################################################################################.....##\n########################################################################################################################......##\n#########################################################################################################################.....##\n################################################################################################################################\n################################################################################################################################", "signals": {"cash": 5000, "economy_value": 5000, "explored_percent": 12.43, "units_killed": 1, "units_lost": 0, "enemies_seen": 3}, "units": [{"id": "1001", "cell_x": 27, "cell_y": 27, "type": "2tnk", "hp": 1.0, "activity": "moving", "idle": false, "can_attack": true, "target_x": 30, "target_y": 30}, {"id": "1002", "cell_x": 26, "cell_y": 26, "type": "2tnk", "hp": 1.0, "activity": "moving", "idle": false, "can_attack": true, "target_x": 29, "target_y": 29}, {"id": "1003", "cell_x": 30, "cell_y": 29, "type": "1tnk", "hp": 1.0, "activity": "idle", "idle": true, "can_attack": true}, {"id": "1004", "cell_x": 31, "cell_y": 29, "type": "1tnk", "hp": 0.960869550704956, "activity": "idle", "idle": true, "can_attack": true}], "enemies": [{"id": "1007", "cell_x": 32, "cell_y": 24, "type": "e1", "hp": 1.0, "activity": null, "idle": true, "can_attack": true}], "goal": {"leaves": [{"name": "units_killed_gte", "target": 3, "current": 1, "ratio": 0.3333, "satisfied": false}, {"name": "within_ticks", "target": 14000, "current": 543, "ratio": 1.0, "satisfied": true}], "reward_vector": {"economy": 0.5, "military": 0.1, "territory": 0.1243, "scouting": 0.3, "objective": 0.6666}, "objective_progress": 0.6666, "won": false}}
7
+ {"turn": 7, "tick": 633, "interrupt": null, "commands": ["Command::MoveUnits { unit_ids: [\"1001\", \"1002\"], target_x: 34, target_y: 24 }"], "ascii_minimap": "################################################################################################################################\n################################################################################################################################\n######...#######################################################################################################################\n###.........####################################################################################################################\n##...........###################################################################################################################\n##............##################################################################################################################\n##.............#################################################################################################################\n##...............###############################################################################################################\n##................##############################################################################################################\n##.................#############################################################################################################\n##..................############################################################################################################\n##...................###########################################################################################################\n##....................##########################################################################################################\n##.....................#########################################################################################################\n##......................########################################################################################################\n###......................#######################################################################################################\n######....................######################################################################################################\n#########..................#####################################################################################################\n##########..................####################################################################################################\n###########..................###################################################################################################\n############..................##################################################################################################\n#############...................##.#############################################################################################\n##############......................############################################################################################\n###############.....................############################################################################################\n################....................############################################################################################\n#################...................############################################################################################\n##################..................############################################################################################\n###################.................############################################################################################\n####################.................###########################################################################################\n#####################................###########################################################################################\n######################..............############################################################################################\n#######################.............############################################################################################\n########################............########################################################################################.###\n###########################........#######################################################################################....##\n##############################..#########################################################################################.....##\n#########################################################################################################################.....##\n########################################################################################################################......##\n#########################################################################################################################.....##\n################################################################################################################################\n################################################################################################################################", "signals": {"cash": 5000, "economy_value": 5000, "explored_percent": 13.17, "units_killed": 3, "units_lost": 0, "enemies_seen": 3}, "units": [{"id": "1001", "cell_x": 28, "cell_y": 27, "type": "2tnk", "hp": 1.0, "activity": "idle", "idle": true, "can_attack": true}, {"id": "1002", "cell_x": 28, "cell_y": 26, "type": "2tnk", "hp": 1.0, "activity": "idle", "idle": true, "can_attack": true}, {"id": "1003", "cell_x": 30, "cell_y": 28, "type": "1tnk", "hp": 1.0, "activity": "attacking", "idle": false, "can_attack": true, "target_x": 34, "target_y": 24}, {"id": "1004", "cell_x": 31, "cell_y": 28, "type": "1tnk", "hp": 0.9217391014099121, "activity": "attacking", "idle": false, "can_attack": true, "target_x": 34, "target_y": 24}], "enemies": [{"id": "1005", "cell_x": 34, "cell_y": 24, "type": "e1", "hp": 0.03999999910593033, "activity": null, "idle": true, "can_attack": true}, {"id": "1006", "cell_x": 33, "cell_y": 24, "type": "e1", "hp": 1.0, "activity": null, "idle": true, "can_attack": true}], "goal": {"leaves": [{"name": "units_killed_gte", "target": 3, "current": 3, "ratio": 1.0, "satisfied": true}, {"name": "within_ticks", "target": 14000, "current": 633, "ratio": 1.0, "satisfied": true}], "reward_vector": {"economy": 0.5, "military": 0.3, "territory": 0.1317, "scouting": 0.3, "objective": 1.0}, "objective_progress": 1.0, "won": true}}
playback/run1/20260519-060529__qwen_qwen3.6-flash/_journal.jsonl ADDED
@@ -0,0 +1 @@
 
 
1
+ {"cell": "action-multiunit-coordination:medium", "capability": "action", "split": "public", "seed": 1, "outcome": "win", "composite": 0.8044, "perception": 0.7405, "reasoning": 0.9414, "action": 1.0, "weakest_link": "perception", "objective_progress": 1.0, "reward_vector": {"economy": 0.5, "military": 0.1, "territory": 0.6293, "scouting": 0.5, "objective": 1.0}, "turns": 13, "notes": [], "_key": "action-multiunit-coordination|medium|public|1"}
playback/run1/20260519-060529__qwen_qwen3.6-flash/action-multiunit-coordination:medium:public/seed1/manifest.json ADDED
@@ -0,0 +1,33 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "scenario": "action-multiunit-coordination:medium",
3
+ "pack_id": "action-multiunit-coordination",
4
+ "level": "medium",
5
+ "capability": "action",
6
+ "run_id": "20260519-060529",
7
+ "model": "qwen/qwen3.6-flash",
8
+ "seed": 1,
9
+ "outcome": "win",
10
+ "turns": 13,
11
+ "max_turns": 36,
12
+ "actions_issued": 17,
13
+ "actions_warned": 0,
14
+ "agent_stats": {
15
+ "turns": 13,
16
+ "tool_calls": 17,
17
+ "empty_replies": 0
18
+ },
19
+ "objective_progress": 1.0,
20
+ "reward_vector": {
21
+ "economy": 0.5,
22
+ "military": 0.1,
23
+ "territory": 0.6293,
24
+ "scouting": 0.5,
25
+ "objective": 1.0
26
+ },
27
+ "signals": {
28
+ "economy_value": 5000,
29
+ "explored_percent": 62.93,
30
+ "units_killed": 1,
31
+ "units_lost": 0
32
+ }
33
+ }
playback/run1/20260519-060529__qwen_qwen3.6-flash/action-multiunit-coordination:medium:public/seed1/messages.json ADDED
@@ -0,0 +1,425 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ [
2
+ {
3
+ "role": "system",
4
+ "content": "You are playing Command & Conquer: Red Alert.\nEach turn you receive a BRIEFING with the current game state and a MINIMAP image.\nIssue orders to your units via tool calls; the game advances asynchronously and\ninterrupts you when something happens (unit arrived, enemy spotted, etc.).\n\nUnit format in briefings (one unit per line):\n <id> <type> @(<x>,<y>) unit is idle / not moving\n <id> <type> @(<x>,<y>), moving to (<tx>,<ty>) unit is en route to (tx,ty)\nExample:\n 1004 jeep @(15,27)\n 1005 jeep @(15,27), moving to (40,30)\n\nWhen issuing tool calls, pass the numeric unit ID (e.g. unit_ids=[1004]).\n\nIdle units are also listed at the end as `Idle: 1004, 1006, ...`\nfor quick scanning.\n\nEvery turn MUST include at least one tool call.\n\nCombat model (read once, applies to every turn):\n * Two ways to fight:\n - `move` to a cell \u2014 units take the path; auto-fire at any hostile\n in weapon range *opportunistically* (no detour); they stop when\n they reach the cell. Use this to POSITION (e.g. flank, retreat).\n - `attack_target(unit_ids, target_id)` \u2014 units pathfind toward the\n named actor and focus-fire it, even if other enemies are closer.\n Use this for PRIORITY: kill THIS tesla, ignore the e3 next to it.\n After the target dies, units go idle and you re-decide on the\n next briefing.\n * \"Range\" in the codex is in cells. A unit with rng=4.8c attacks\n targets at \u22644.8 cells away. A defense with rng=7c hits you at 7 cells.\n * If your range < enemy range, you take damage before you can hit back.\n Counter by:\n (a) flanking from multiple sides so attention splits, or\n (b) sending sacrificial high-HP units (2tnk, apc) to soak hits while\n longer-burst units do damage, or\n (c) bypassing the threat entirely (route around).\n * DPS in the codex assumes sustained fire; concentrating 4 tanks on one\n tesla coil burns it down 4\u00d7 faster than sending one at a time. Send\n GROUPS via `attack_target` with the same target_id, not single units.\n * Sight (`sight Nc`) means you see N cells out from that unit \u2014 if your\n sight \u2265 enemy attack range, scout safely from outside their range.\n\nOBJECTIVE (this scenario): Three DISPERSED regions, 8 units, attrition cap. Put >=2 units in EACH of: NE corner (115,6), bottom-left (20,36), SE corner (115,34) before tick 2800, losing <=2. The regions are in three different directions \u2014 a single eastward column cannot reach the bottom-left one \u2014 so this needs genuine multi-vector dispatch, not one fanned-out march. Enemy infantry contest the two eastern lanes; the bottom-left route is clear.\nWIN WHEN: get \u22652 units into region (115,6) r=7 AND get \u22652 units into region (20,36) r=7 AND get \u22652 units into region (115,34) r=7 AND before game tick 2800 AND lose \u22642 of your own units.\nYOU LOSE IF: (your whole force is destroyed OR not before game tick 2801).\nYou have at most 36 decision turns; acting decisively and early matters.\n\nUNIT CODEX (this scenario). Each line: <code> $cost hp<HP> rng<attack range, cells> dps<damage/sec> sight<vision, cells> <movement: foot/wheeled/tracked> (role). Unarmed units list their function instead of rng/dps; buildings list their purpose.\n 1tnk Light tank \u2014 cheap, fast, modest armour/gun; anti-vehicle. $700 hp300 rng4c dps14 sight6c tracked\n 2tnk Medium tank \u2014 the main battle tank, balanced armour/firepower. $850 hp400 rng4.75c dps22 sight6c tracked\n e1 Rifle infantry \u2014 cheap basic foot soldier, good vs infantry. $100 hp50 rng3c dps6 sight4c foot\n fact Construction yard \u2014 builds all structures; LOSS-CRITICAL base building.\n jeep Ranger jeep \u2014 fast lightly-armed scout, best for vision. $600 hp150 rng4c dps8 sight7c wheeled\n powr Power plant \u2014 supplies power; structures fail without enough power.\n proc Ore refinery \u2014 converts harvested ore into credits; the economy core."
5
+ },
6
+ {
7
+ "role": "user",
8
+ "content": "--- TURN BRIEFING (tick 3, ~0s game time) ---\nFunds: $5000 (cash=$5000 + ore=$0) | Power: +0 | Harvesters: 0 | Explored: 4.1%\nUnits (8):\n 1004 1tnk @(7,10)\n 1005 1tnk @(7,10)\n 1006 1tnk @(7,10)\n 1001 2tnk @(5,6)\n 1002 2tnk @(5,6)\n 1003 2tnk @(5,6)\n 1007 jeep @(5,14)\n 1008 jeep @(5,14)\nIdle: 1004, 1005, 1006, 1001, 1002, 1003, 1007, 1008\nBuildings: ? ()\nEnemies: none visible\nProduction: IDLE"
9
+ },
10
+ {
11
+ "role": "assistant",
12
+ "content": "",
13
+ "reasoning": "The goal is to position at least 2 units in three specific regions before tick 2800, losing no more than 2 units:\n1. NE corner: (115, 6), radius 7\n2. Bottom-left: (20, 36), radius 7\n3. SE corner: (115, 34), radius 7\n\nMy units are currently clustered in the top-left area:\n- Three 1tnk at (7, 10)\n- Three 2tnk at (5, 6)\n- Two jeeps at (5, 14)\n\nThe bottom-left region (20, 36) is relatively close but requires moving south.\nThe eastern regions (115, 6) and (115, 34) are far east.\n\nI need to split my forces into three groups to hit these three locations.\nGroup A (East/North): Target NE (115, 6). Distance from (7,10) is ~108 cells east.\nGroup B (South): Target Bottom-Left (20, 36). Distance from (5,6) is ~30 cells south and 15 east.\nGroup C (East/South): Target SE (115, 34). Distance from (7,10) is ~108 east and 24 south.\n\nWait, the briefing says \"Enemy infantry contest the two eastern lanes; the bottom-left route is clear.\"\nThis implies I should be careful moving east.\n\nLet's distribute the units:\n- 3x 2tnk (heavier tanks): Maybe send 1 to NE, 1 to SE, 1 to SW? Or keep them together?\n- 3x 1tnk (light tanks): Fast, can scout.\n- 2x jeeps: Fastest, good for scouting.\n\nLet's plan the splits:\nRegion 1: (20, 36) - Bottom Left.\nRegion 2: (115, 6) - NE.\nRegion 3: (115, 34) - SE.\n\nI have 8 units. I need >= 2 in each. That's 6 units minimum. I have 8.\nSo I can spare 2 units.\n\nProposed assignment:\n- To Bottom-Left (20, 36): 1001 (2tnk), 1002 (2tnk). They are already at (5,6). Moving south to ~20,36 is a long march but clear.\n- To NE (115, 6): 1003 (2tnk), 1004 (1tnk). Moving east.\n- To SE (115, 34): 1005 (1tnk), 1006 (1tnk). Moving east then south.\n- Reserves/Scouts: 1007 (jeep), 1008 (jeep). Maybe follow one of the groups or scout ahead.\n\nActually, looking at the map, the \"bottom-left\" is (20, 36). My units are at y=6 and y=10.\nSo moving to (20, 36) involves going South-East.\nThe eastern targets are at x=115. That's very far east.\n\nLet's refine the groups to ensure they can handle enemies.\nThe 2tnks are better for fighting.\nLet's send:\n- Group 1 (Bottom Left): 1001 (2tnk), 1002 (2tnk). Target: (20, 36).\n- Group 2 (NE): 1003 (2tnk), 1004 (1tnk). Target: (115, 6).\n- Group 3 (SE): 1005 (1tnk), 1006 (1tnk). Target: (115, 34).\n- Scouts: 1007, 1008. Where to send? Maybe follow Group 2 or 3 to scout the eastern lanes.\n\nLet's adjust. The jeeps are fast (wheeled). 1tnk are tracked (fast). 2tnk are tracked (slower than jeeps/1tnk).\nMaybe send jeeps with the eastern groups to scout for the \"enemy infantry contesting\".\n\nNew Plan:\n- Group SW (to 20, 36): 1001 (2tnk), 1002 (2tnk).\n- Group NE (to 115, 6): 1003 (2tnk), 1007 (jeep).\n- Group SE (to 115, 34): 1004 (1tnk), 1005 (1tnk), 1008 (jeep).\n- Leftover: 1006 (1tnk). Keep it with Group SW or add to Group SE?\nActually, the prompt says \"losing <= 2\". So I can afford some losses.\n\nLet's stick to a simpler split first to get the ball rolling.\nMove 1001, 1002 to (20, 36).\nMove 1003, 1004 to (115, 6).\nMove 1005, 1006 to (115, 34).\nMove 1007, 1008 to (115, 6) or (115, 34) to support.\n\nWait, 1003 is at (5,6). 1001/1002 are at (5,6). 1004/1005/1006 are at (7,10).\nIt might be better to group units by starting position to minimize initial movement confusion, though the game handles pathfinding.\n\nLet's just send them all towards their destinations.\n- 1001, 1002 -> (20, 36)\n- 1003, 1007 -> (115, 6)\n- 1004, 1008 -> (115, 34)\n- 1005, 1006 -> (115, 34) (reinforcing SE)\n\nActually, let's look at the \"bottom-left\" target (20, 36). It's roughly South-East from my base.\nThe eastern targets are far East.\n\nLet's try:\n- 1001 (2tnk), 1002 (2tnk) -> move to (20, 36)\n- 1003 (2tnk), 1004 (1tnk) -> move to (115, 6)\n- 1005 (1tnk), 1006 (1tnk) -> move to (115, 34)\n- 1007 (jeep) -> move to (115, 6) (scout/backup)\n- 1008 (jeep) -> move to (115, 34) (scout/backup)\n\nThis gives 2 units to SW, 2+1 to NE, 2+1 to SE. This meets the >=2 requirement for all.\nThe 2tnks are valuable, maybe keep them together? No, the prompt says \"single eastward column cannot reach the bottom-left one\". I MUST split.\n\nLet's execute this distribution.\nTarget coordinates are (x, y).\nSW: (20, 36)\nNE: (115, 6)\nSE: (115, 34)\n\nMove 1001, 1002 to (20, 36).\nMove 1003, 1004 to (115, 6).\nMove 1005, 1006 to (115, 34).\nMove 1007 to (115, 6).\nMove 1008 to (115, 34).\n\nWait, 1007 and 1008 are jeeps. They are fast. Maybe send them to the furthest point to arrive first? Or split them.\nLet's send 1007 to NE and 1008 to SE.\n\nOne detail: \"Enemy infantry contest the two eastern lanes\".\nI should be careful. But I have no other info. I must move.\n\nLet's verify unit IDs and positions.\n1001, 1002 @ (5,6). Move to (20,36).\n1003 @ (5,6). Move to (115,6).\n1004, 1005, 1006 @ (7,10).\n 1004 -> (115,6).\n 1005 -> (115,34).\n 1006 -> (115,34).\n1007, 1008 @ (5,14).\n 1007 -> (115,6).\n 1008 -> (115,34).\n\nThis seems like a solid plan. I'm committing all 8 units to the objective immediately.\n\nWait, looking at the map, (20,36) is bottom-left-ish. (115,6) is top-right. (115,34) is bottom-right.\nThe map shows water on the left edge? No, blue is water. The green area is land.\nMy units are on land.\nThe path to (20,36) might be blocked or narrow? The briefing says \"bottom-left route is clear\".\nThe eastern routes are contested.\n\nI will proceed with the move commands.\n\nOne correction: 1003 is a 2tnk. 1004, 1005, 1006 are 1tnk.\nMaybe put 1003 with the 1tnks going East?\n2tnk has better armor.\nLet's swap:\nGroup NE: 1003 (2tnk), 1004 (1tnk), 1007 (jeep).\nGroup SE: 1005 (1tnk), 1006 (1tnk), 1008 (jeep).\nGroup SW: 1001 (2tnk), 1002 (2tnk).\n\nThis gives me:\nSW: 2 tanks.\nNE: 1 tank, 1 light tank, 1 jeep.\nSE: 2 light tanks, 1 jeep.\nThis is balanced enough.\n\nLet's issue the orders.",
14
+ "tool_calls": [
15
+ {
16
+ "id": "c0",
17
+ "type": "function",
18
+ "function": {
19
+ "name": "move_units",
20
+ "arguments": {
21
+ "unit_ids": [
22
+ 1001,
23
+ 1002
24
+ ],
25
+ "target_x": 20,
26
+ "target_y": 36
27
+ }
28
+ }
29
+ },
30
+ {
31
+ "id": "c1",
32
+ "type": "function",
33
+ "function": {
34
+ "name": "move_units",
35
+ "arguments": {
36
+ "unit_ids": [
37
+ 1003,
38
+ 1004,
39
+ 1007
40
+ ],
41
+ "target_x": 115,
42
+ "target_y": 6
43
+ }
44
+ }
45
+ },
46
+ {
47
+ "id": "c2",
48
+ "type": "function",
49
+ "function": {
50
+ "name": "move_units",
51
+ "arguments": {
52
+ "unit_ids": [
53
+ 1005,
54
+ 1006,
55
+ 1008
56
+ ],
57
+ "target_x": 115,
58
+ "target_y": 34
59
+ }
60
+ }
61
+ }
62
+ ]
63
+ },
64
+ {
65
+ "role": "tool",
66
+ "tool_call_id": "c0",
67
+ "content": "ok"
68
+ },
69
+ {
70
+ "role": "tool",
71
+ "tool_call_id": "c1",
72
+ "content": "ok"
73
+ },
74
+ {
75
+ "role": "tool",
76
+ "tool_call_id": "c2",
77
+ "content": "ok"
78
+ },
79
+ {
80
+ "role": "user",
81
+ "content": "--- TURN BRIEFING (tick 93, ~3s game time) ---\nFunds: $5000 (cash=$5000 + ore=$0) | Power: +0 | Harvesters: 0 | Explored: 8.1%\nUnits (8):\n 1004 1tnk @(14,10), moving to (115,5)\n 1005 1tnk @(14,10), moving to (114,33)\n 1006 1tnk @(14,10), moving to (115,33)\n 1001 2tnk @(5,12), moving to (19,35)\n 1002 2tnk @(5,12), moving to (20,35)\n 1003 2tnk @(10,6), moving to (114,5)\n 1007 jeep @(16,14), moving to (116,5)\n 1008 jeep @(16,14), moving to (116,33)\nBuildings: ? ()\nEnemies: none visible\nProduction: IDLE"
82
+ },
83
+ {
84
+ "role": "assistant",
85
+ "content": "",
86
+ "reasoning": "Units are moving toward their three target regions. The north-east group (1003, 1004, 1007) is heading to (115, 6). The south-east group (1005, 1006, 1008) is heading to (115, 34). The south-west group (1001, 1002) is heading to (20, 36). All groups are progressing well. I will observe to let them advance.\n",
87
+ "tool_calls": [
88
+ {
89
+ "id": "c0",
90
+ "type": "function",
91
+ "function": {
92
+ "name": "observe",
93
+ "arguments": {}
94
+ }
95
+ }
96
+ ]
97
+ },
98
+ {
99
+ "role": "tool",
100
+ "tool_call_id": "c0",
101
+ "content": "ok"
102
+ },
103
+ {
104
+ "role": "user",
105
+ "content": "--- TURN BRIEFING (tick 183, ~7s game time) ---\nFunds: $5000 (cash=$5000 + ore=$0) | Power: +0 | Harvesters: 0 | Explored: 13.3%\nUnits (8):\n 1004 1tnk @(23,10), moving to (115,5)\n 1005 1tnk @(23,10), moving to (114,33)\n 1006 1tnk @(23,10), moving to (115,33)\n 1001 2tnk @(6,16), moving to (19,35)\n 1002 2tnk @(6,16), moving to (20,35)\n 1003 2tnk @(16,6), moving to (114,5)\n 1007 jeep @(29,14), moving to (116,5)\n 1008 jeep @(29,14), moving to (116,33)\nBuildings: ? ()\nEnemies: none visible\nProduction: IDLE"
106
+ },
107
+ {
108
+ "role": "assistant",
109
+ "content": "",
110
+ "reasoning": "The units are marching toward their respective targets.\n- 1001, 1002 (2tnks) heading to (19,35)/(20,35) ~ region (20,36)\n- 1003 (2tnk), 1004 (1tnk), 1007 (jeep) heading to (114,5)/(115,5)/(116,5) ~ region (115,6)\n- 1005 (1tnk), 1006 (1tnk), 1008 (jeep) heading to (114,33)/(115,33)/(116,33) ~ region (115,34)\n\nAll units are proceeding without incident. I will advance the game to let them reach their destinations or get closer.",
111
+ "tool_calls": [
112
+ {
113
+ "id": "c0",
114
+ "type": "function",
115
+ "function": {
116
+ "name": "observe",
117
+ "arguments": {}
118
+ }
119
+ }
120
+ ]
121
+ },
122
+ {
123
+ "role": "tool",
124
+ "tool_call_id": "c0",
125
+ "content": "ok"
126
+ },
127
+ {
128
+ "role": "user",
129
+ "content": "--- TURN BRIEFING (tick 273, ~10s game time) ---\nFunds: $5000 (cash=$5000 + ore=$0) | Power: +0 | Harvesters: 0 | Explored: 19.4%\nUnits (8):\n 1004 1tnk @(32,10), moving to (115,5)\n 1005 1tnk @(32,10), moving to (114,33)\n 1006 1tnk @(32,10), moving to (115,33)\n 1001 2tnk @(6,22), moving to (19,35)\n 1002 2tnk @(6,21), moving to (20,35)\n 1003 2tnk @(22,6), moving to (114,5)\n 1007 jeep @(41,14), moving to (116,5)\n 1008 jeep @(41,14), moving to (116,33)\nBuildings: ? ()\nEnemies: none visible\nProduction: IDLE"
130
+ },
131
+ {
132
+ "role": "assistant",
133
+ "content": "",
134
+ "reasoning": "The units are progressing well toward their targets.\n- 1001, 1002 heading to (19,35)/(20,35) - bottom-left region. They are at y=21-22, x=6.\n- 1004, 1005, 1006 heading east. 1005, 1006 to y=33/33, 1004 to y=5.\n- 1003 heading to (114,5) - NE corner.\n- 1007, 1008 jeeps heading east at y=14.\n\nNo enemies spotted yet. The map shows a large grassy area to the east, but the path seems clear. I'll continue observing as they move.\nI will wait until they get closer or encounter enemies.",
135
+ "tool_calls": [
136
+ {
137
+ "id": "c0",
138
+ "type": "function",
139
+ "function": {
140
+ "name": "observe",
141
+ "arguments": {}
142
+ }
143
+ }
144
+ ]
145
+ },
146
+ {
147
+ "role": "tool",
148
+ "tool_call_id": "c0",
149
+ "content": "ok"
150
+ },
151
+ {
152
+ "role": "user",
153
+ "content": "--- TURN BRIEFING (tick 363, ~14s game time) ---\nFunds: $5000 (cash=$5000 + ore=$0) | Power: +0 | Harvesters: 0 | Explored: 26.3%\nUnits (8):\n 1004 1tnk @(41,10), moving to (115,5)\n 1005 1tnk @(41,10), moving to (114,33)\n 1006 1tnk @(41,10), moving to (115,33)\n 1001 2tnk @(10,26), moving to (19,35)\n 1002 2tnk @(11,26), moving to (20,35)\n 1003 2tnk @(28,6), moving to (114,5)\n 1007 jeep @(54,14), moving to (116,5)\n 1008 jeep @(54,14), moving to (116,33)\nBuildings: ? ()\nEnemies: none visible\nProduction: IDLE"
154
+ },
155
+ {
156
+ "role": "assistant",
157
+ "content": "",
158
+ "reasoning": "Units are progressing well:\n- 1004, 1005, 1006 (1tnks) moving east: 1004 is at (41,10), 1005/1006 at (41,10)\n- 1001, 1002 (2tnks) moving south: at (10,26), (11,26) heading to (19/20,35)\n- 1003 (2tnk) moving east: at (28,6) heading to (114,5)\n- 1007, 1008 (jeeps) moving east: at (54,14) heading to (116,5), (116,33)\n\nThe southern group (1001, 1002) is heading towards (20,36). They are moving south.\nThe eastern groups are heading towards (115,6) and (115,34).\n\nLet's continue observing until they reach their destinations or encounter enemies.",
159
+ "tool_calls": [
160
+ {
161
+ "id": "c0",
162
+ "type": "function",
163
+ "function": {
164
+ "name": "observe",
165
+ "arguments": {}
166
+ }
167
+ }
168
+ ]
169
+ },
170
+ {
171
+ "role": "tool",
172
+ "tool_call_id": "c0",
173
+ "content": "ok"
174
+ },
175
+ {
176
+ "role": "user",
177
+ "content": "--- TURN BRIEFING (tick 453, ~18s game time) ---\nFunds: $5000 (cash=$5000 + ore=$0) | Power: +0 | Harvesters: 0 | Explored: 33.1%\nUnits (8):\n 1004 1tnk @(50,10), moving to (115,5)\n 1005 1tnk @(50,10), moving to (114,33)\n 1006 1tnk @(50,10), moving to (115,33)\n 1001 2tnk @(14,30), moving to (19,35)\n 1002 2tnk @(15,30), moving to (20,35)\n 1003 2tnk @(34,6), moving to (114,5)\n 1007 jeep @(67,14), moving to (116,5)\n 1008 jeep @(67,14), moving to (116,33)\nBuildings: ? ()\nEnemies: none visible\nProduction: IDLE"
178
+ },
179
+ {
180
+ "role": "assistant",
181
+ "content": "",
182
+ "reasoning": "The units are continuing their march. No enemies have been spotted yet. The units are progressing towards their respective targets. I should continue to observe and wait for them to arrive or for enemies to appear.\n",
183
+ "tool_calls": [
184
+ {
185
+ "id": "c0",
186
+ "type": "function",
187
+ "function": {
188
+ "name": "observe",
189
+ "arguments": {}
190
+ }
191
+ }
192
+ ]
193
+ },
194
+ {
195
+ "role": "tool",
196
+ "tool_call_id": "c0",
197
+ "content": "ok"
198
+ },
199
+ {
200
+ "role": "user",
201
+ "content": "--- TURN BRIEFING (tick 543, ~21s game time) ---\nFunds: $5000 (cash=$5000 + ore=$0) | Power: +0 | Harvesters: 0 | Explored: 39.4%\nUnits (8):\n 1004 1tnk @(59,10), moving to (115,5)\n 1005 1tnk @(59,10), moving to (114,33)\n 1006 1tnk @(59,10), moving to (115,33)\n 1001 2tnk @(19,35)\n 1002 2tnk @(19,34), moving to (20,35)\n 1003 2tnk @(40,6), moving to (114,5)\n 1007 jeep @(80,14), moving to (116,5)\n 1008 jeep @(80,14), moving to (116,33)\nIdle: 1001\nBuildings: ? ()\nEnemies: 2xe1[1012@(60,8),1013@(60,8)] 1xpowr[1011@(20,36)] center (46,17)\nProduction: IDLE"
202
+ },
203
+ {
204
+ "role": "assistant",
205
+ "content": "",
206
+ "reasoning": "Units 1001 and 1002 have reached the bottom-left region (20,36) area. 1001 is at (19,35) which is within the r=7 circle of (20,36). 1002 is at (19,34) moving to (20,35) which will also be in range. So the bottom-left requirement is met with 2 units.\n\nNow I need to get units to the NE corner (115,6) and SE corner (115,34).\nCurrent status:\n- 1004 (1tnk) moving to (115,5) -> will be in NE corner region (115,6)\n- 1003 (2tnk) moving to (114,5) -> will be in NE corner region (115,6)\n- 1007 (jeep) moving to (116,5) -> will be in NE corner region (115,6)\n- 1005 (1tnk) moving to (114,33) -> will be in SE corner region (115,34)\n- 1006 (1tnk) moving to (115,33) -> will be in SE corner region (115,34)\n- 1008 (jeep) moving to (116,33) -> will be in SE corner region (115,34)\n\nThe enemy infantry [1012, 1013] are at (60,8). They might contest the eastern lanes. The briefing says \"Enemy infantry contest the two eastern lanes\". I should keep moving towards the targets. The units are auto-firing opportunistically, so they will engage if in range.\n\nI'll continue observing to let them reach their destinations.",
207
+ "tool_calls": [
208
+ {
209
+ "id": "c0",
210
+ "type": "function",
211
+ "function": {
212
+ "name": "observe",
213
+ "arguments": {}
214
+ }
215
+ }
216
+ ]
217
+ },
218
+ {
219
+ "role": "tool",
220
+ "tool_call_id": "c0",
221
+ "content": "ok"
222
+ },
223
+ {
224
+ "role": "user",
225
+ "content": "--- TURN BRIEFING (tick 633, ~25s game time) ---\nFunds: $5000 (cash=$5000 + ore=$0) | Power: +0 | Harvesters: 0 | Explored: 44.7%\nUnits (8):\n 1004 1tnk @(68,10), moving to (115,5)\n 1005 1tnk @(68,10), moving to (114,33)\n 1006 1tnk @(68,10), moving to (115,33)\n 1001 2tnk @(19,35), moving to (20,36)\n 1002 2tnk @(20,35), moving to (20,36)\n 1003 2tnk @(46,6), moving to (114,5)\n 1007 jeep @(93,14), moving to (116,5)\n 1008 jeep @(93,14), moving to (116,33)\nBuildings: ? ()\nEnemies: 1xpowr[1011@(20,36)] center (20,36)\nProduction: IDLE"
226
+ },
227
+ {
228
+ "role": "assistant",
229
+ "content": "",
230
+ "reasoning": "1001 arrived at 20,36 (Bottom-Left region).\n1002 is moving to 20,36.\n1003 is close to NE (115,6).\n1004, 1005, 1006, 1007, 1008 are en route to various spots.\n1001 is idle at 20,36.\nI need to get 1002 to 20,36.\nI need to check on 1003, 1004, 1005, 1006, 1007, 1008 to ensure they reach their targets and don't get stuck or killed.\nThe enemies spotted earlier (e1s) might have been dispatched or destroyed by auto-fire, or they are just nearby.\nI'll just observe for now to let the tanks move.\nWait, 1001 is idle. 1002 is moving to 20,36.\nI should keep observing until 1002 arrives.\nAlso, I need to make sure 1003, 1004, 1005, 1006 reach their respective targets (NE and SE).\nLooking at the map, 1003 is at (46,6) moving to (114,5). This is heading East towards (115,6).\n1004 is at (68,10) moving to (115,5). Also heading East/North-East.\n1005 is at (68,10) moving to (114,33). Heading South-East.\n1006 is at (68,10) moving to (115,33). Heading South-East.\n1007 is at (93,14) moving to (116,5). Heading North-East.\n1008 is at (93,14) moving to (116,33). Heading South-East.\n\nI will continue observing to let them reach their destinations.\nOne concern: 1003, 1004 might encounter enemies in the NE region if there are any. The briefing said \"Enemy infantry contest the two eastern lanes\".\nBut for now, they are just moving. I'll observe.\n",
231
+ "tool_calls": [
232
+ {
233
+ "id": "c0",
234
+ "type": "function",
235
+ "function": {
236
+ "name": "observe",
237
+ "arguments": {}
238
+ }
239
+ }
240
+ ]
241
+ },
242
+ {
243
+ "role": "tool",
244
+ "tool_call_id": "c0",
245
+ "content": "ok"
246
+ },
247
+ {
248
+ "role": "user",
249
+ "content": "--- TURN BRIEFING (tick 723, ~28s game time) ---\nFunds: $5000 (cash=$5000 + ore=$0) | Power: +0 | Harvesters: 0 | Explored: 51.2%\nUnits (8):\n 1004 1tnk @(77,10), moving to (115,5)\n 1005 1tnk @(77,10), moving to (114,33)\n 1006 1tnk @(77,10), moving to (115,33)\n 1001 2tnk @(19,35), moving to (20,36)\n 1002 2tnk @(20,35), moving to (20,36)\n 1003 2tnk @(52,6), moving to (114,5)\n 1007 jeep @(106,14), turning\n 1008 jeep @(103,20), moving to (116,33)\nBuildings: ? ()\nEnemies: 1xpowr[1011@(20,36)] center (20,36)\nProduction: IDLE"
250
+ },
251
+ {
252
+ "role": "assistant",
253
+ "content": "",
254
+ "reasoning": "1001 and 1002 have reached the bottom-left region (20,36).\nUnits 1004, 1005, 1006 are moving east.\nUnit 1003 is moving east.\nUnits 1007 and 1008 are moving east (one slightly south).\nThey are getting closer to the eastern targets.\nI will observe and wait for them to arrive.",
255
+ "tool_calls": [
256
+ {
257
+ "id": "c0",
258
+ "type": "function",
259
+ "function": {
260
+ "name": "observe",
261
+ "arguments": {}
262
+ }
263
+ }
264
+ ]
265
+ },
266
+ {
267
+ "role": "tool",
268
+ "tool_call_id": "c0",
269
+ "content": "ok"
270
+ },
271
+ {
272
+ "role": "user",
273
+ "content": "--- TURN BRIEFING (tick 813, ~32s game time) ---\nFunds: $5000 (cash=$5000 + ore=$0) | Power: +0 | Harvesters: 0 | Explored: 59.4%\nUnits (8):\n 1004 1tnk @(86,10), moving to (115,5)\n 1005 1tnk @(86,10), moving to (114,33)\n 1006 1tnk @(86,10), moving to (115,33)\n 1001 2tnk @(19,35), moving to (20,36)\n 1002 2tnk @(20,35), moving to (20,36)\n 1003 2tnk @(58,6), moving to (114,5)\n 1007 jeep @(115,5), turning\n 1008 jeep @(113,30), moving to (116,33)\nBuildings: ? ()\nEnemies: 2xe1[1012@(81,8),1013@(81,9)] 1xfact[1009@(115,6)] 1xproc[1010@(115,34)] 1xpowr[1011@(20,36)] center (82,18)\nProduction: IDLE"
274
+ },
275
+ {
276
+ "role": "assistant",
277
+ "content": "",
278
+ "reasoning": "Good, we're making progress. Let's assess the situation:\n- Bottom-left (20,36): 1001 and 1002 (2tnk) are moving there. 1011 (powr) is at (20,36). We need >=2 units in the region.\n- NE corner (115,6): 1007 (jeep) just arrived at (115,5), which is inside the region (115,6) r=7. 1003 (2tnk), 1004 (1tnk) are moving there. 1009 (fact) is at (115,6). Enemy e1s at (81,8), (81,9).\n- SE corner (115,34): 1005, 1006 (1tnk) are moving there. 1008 (jeep) is at (113,30) moving to (116,33). 1010 (proc) is at (115,34).\n\nObjective: Get >=2 units into EACH region before tick 2800, losing <=2.\nCurrently:\n- 1007 is at (115,5) -> inside NE region.\n- 1001, 1002 are moving to (20,36) -> inside BL region.\n- 1004, 1003 are moving to NE.\n- 1005, 1006 are moving to SE.\n- 1008 is moving to SE.\n\nWe just need to ensure they all arrive safely. The enemy infantry at (81,8) and (81,9) might contest the eastern lanes. Let's monitor. I'll just observe for now as they are en route and we have enough units heading to each zone. Wait, 1007 is already there. 1001 and 1002 are very close to BL. 1003, 1004 are heading to NE. 1005, 1006, 1008 are heading to SE.\nLet's check distances:\n1003 is at (58,6) moving to (114,5). Enemy e1s at (81,8). They might engage.\n1004 is at (86,10) moving to (115,5).\n1005, 1006 at (86,10) moving to SE.\n1008 at (113,30) moving to SE.\n\nSince they are auto-firing opportunistically, they should handle the infantry or bypass them. The tanks have range 4-4.75c, infantry 3c. Tanks should win.\nI will just observe to let them advance.\nActually, let's verify if 1001 and 1002 are close enough to BL region. They are at (19,35) and (20,35) moving to (20,36). That's basically there.\nI'll observe.\nWait, should I adjust targets to be exactly on the region centers or just let them auto-path? The prompt says \"moving to (115,5)\" etc. It's fine.\nI will observe.\nOne thing: 1003, 1004, 1005, 1006 are all bunched at (86,10) or nearby. They might get clumped fire. But they are tanks vs infantry, should be fine.\nLet's observe. \nActually, I'll just call observe.\nWait, 1007 is at (115,5) which is inside NE region. That's 1 unit. We need 2. 1003 and 1004 are coming.\n1001 and 1002 are coming to BL. That's 2 units.\n1005, 1006, 1008 are coming to SE. That's 3 units.\nSo we have enough units en route. Just need to survive.\nObserving. \nLet's do it. \nWait, I should check if 1001 and 1002 have reached the region. They are moving to (20,36). The region is (20,36) r=7. They will stop there.\nI'll observe.",
279
+ "tool_calls": [
280
+ {
281
+ "id": "c0",
282
+ "type": "function",
283
+ "function": {
284
+ "name": "observe",
285
+ "arguments": {}
286
+ }
287
+ }
288
+ ]
289
+ },
290
+ {
291
+ "role": "tool",
292
+ "tool_call_id": "c0",
293
+ "content": "ok"
294
+ },
295
+ {
296
+ "role": "user",
297
+ "content": "--- TURN BRIEFING (tick 903, ~36s game time) ---\nFunds: $5000 (cash=$5000 + ore=$0) | Power: +0 | Harvesters: 0 | Explored: 61.3%\nUnits (8):\n 1004 1tnk @(95,10), moving to (115,5)\n 1005 1tnk @(94,13), moving to (114,33)\n 1006 1tnk @(94,12), moving to (115,33)\n 1001 2tnk @(19,35)\n 1002 2tnk @(20,35)\n 1003 2tnk @(64,6), moving to (114,5)\n 1007 jeep @(116,5), moving to (115,6)\n 1008 jeep @(116,33), moving to (115,34)\nIdle: 1001, 1002\nBuildings: ? ()\nEnemies: 1xe1[1013@(90,9)] 1xfact[1009@(115,6)] 1xproc[1010@(115,34)] center (106,16)\nProduction: IDLE"
298
+ },
299
+ {
300
+ "role": "assistant",
301
+ "content": "",
302
+ "reasoning": "Good progress. Let's check the status:\n- Bottom-left (20,36): 1001 and 1002 are right there. They should arrive/hold soon.\n- NE corner (115,6): 1007 jeep is moving to (115,6). 1003 2tnk is heading there too. 1004 1tnk is also heading there.\n- SE corner (115,34): 1008 jeep is moving to (115,34). 1005 and 1006 1tnks are heading there.\n\nI need to make sure at least 2 units are in each region.\nCurrently:\n- BL: 1001, 1002 (2 units) - Good.\n- NE: 1007 is en route to (115,6), 1003 and 1004 are en route to (114,5)/(115,5). I should direct 1003 and 1004 to (115,6) to secure 2+ units there.\n- SE: 1008 is en route to (115,34), 1005 and 1006 are en route to (114,33)/(115,33). I should direct 1005 and 1006 to (115,34) to secure 2+ units there.\n\nLet's adjust targets to exactly match the regions:\n1003 -> (115,6)\n1004 -> (115,6)\n1005 -> (115,34)\n1006 -> (115,34)\n\nThis ensures each region gets 2+ units.\nWait, 1007 is already going to (115,6). 1008 is going to (115,34).\nSo:\nNE: 1007, 1003, 1004 -> I just need 2. I'll send 1003 and 1004 to (115,6).\nSE: 1008, 1005, 1006 -> I'll send 1005 and 1006 to (115,34).\n\nLet's issue moves to consolidate.\nAlso, 1001 and 1002 are idle at (19,35) and (20,35). I'll move them to (20,36) to be safe inside the region.\n\nActually, looking at the minimap, 1001 and 1002 are very close to (20,36). I'll just move them there.\nFor the eastern groups, I'll adjust 1003, 1004 to (115,6) and 1005, 1006 to (115,34).\nThis guarantees >=2 in each.\n\nLet's execute. \nWait, 1003 is a 2tnk, 1004 is a 1tnk. 1005, 1006 are 1tnks.\nI'll move them all to their respective targets.\n1001, 1002 -> (20,36)\n1003, 1004 -> (115,6)\n1005, 1006 -> (115,34)\n1007, 1008 are already en route.\n\nLet's do it.",
303
+ "tool_calls": [
304
+ {
305
+ "id": "c0",
306
+ "type": "function",
307
+ "function": {
308
+ "name": "move_units",
309
+ "arguments": {
310
+ "unit_ids": [
311
+ 1001,
312
+ 1002
313
+ ],
314
+ "target_x": 20,
315
+ "target_y": 36
316
+ }
317
+ }
318
+ },
319
+ {
320
+ "id": "c1",
321
+ "type": "function",
322
+ "function": {
323
+ "name": "move_units",
324
+ "arguments": {
325
+ "unit_ids": [
326
+ 1003,
327
+ 1004
328
+ ],
329
+ "target_x": 115,
330
+ "target_y": 6
331
+ }
332
+ }
333
+ },
334
+ {
335
+ "id": "c2",
336
+ "type": "function",
337
+ "function": {
338
+ "name": "move_units",
339
+ "arguments": {
340
+ "unit_ids": [
341
+ 1005,
342
+ 1006
343
+ ],
344
+ "target_x": 115,
345
+ "target_y": 34
346
+ }
347
+ }
348
+ }
349
+ ]
350
+ },
351
+ {
352
+ "role": "tool",
353
+ "tool_call_id": "c0",
354
+ "content": "ok"
355
+ },
356
+ {
357
+ "role": "tool",
358
+ "tool_call_id": "c1",
359
+ "content": "ok"
360
+ },
361
+ {
362
+ "role": "tool",
363
+ "tool_call_id": "c2",
364
+ "content": "ok"
365
+ },
366
+ {
367
+ "role": "user",
368
+ "content": "--- TURN BRIEFING (tick 993, ~39s game time) ---\nFunds: $5000 (cash=$5000 + ore=$0) | Power: +0 | Harvesters: 0 | Explored: 62.1%\nUnits (8):\n 1004 1tnk @(104,10), moving to (115,5)\n 1005 1tnk @(101,20), moving to (114,33)\n 1006 1tnk @(101,19), moving to (115,33)\n 1001 2tnk @(20,36)\n 1002 2tnk @(20,35)\n 1003 2tnk @(70,6), moving to (114,5)\n 1007 jeep @(116,5), moving to (115,6)\n 1008 jeep @(116,33), moving to (115,34)\nIdle: 1001, 1002\nBuildings: ? ()\nEnemies: 1xfact[1009@(115,6)] 1xproc[1010@(115,34)] center (115,20)\nProduction: IDLE"
369
+ },
370
+ {
371
+ "role": "assistant",
372
+ "content": "",
373
+ "reasoning": "The two 2tnks (1001, 1002) have arrived at the bottom-left objective (20,36).\nThe jeep 1007 is approaching the NE objective (115,6).\nThe jeep 1008 is approaching the SE objective (115,34).\nThe 1tnks are still en route.\nI need to keep monitoring the progress.\nThe 2tnks are already in position.\nI'll just observe for now and wait for the other units to arrive or for enemy resistance.",
374
+ "tool_calls": [
375
+ {
376
+ "id": "c0",
377
+ "type": "function",
378
+ "function": {
379
+ "name": "observe",
380
+ "arguments": {}
381
+ }
382
+ }
383
+ ]
384
+ },
385
+ {
386
+ "role": "tool",
387
+ "tool_call_id": "c0",
388
+ "content": "ok"
389
+ },
390
+ {
391
+ "role": "user",
392
+ "content": [
393
+ {
394
+ "type": "text",
395
+ "text": "--- TURN BRIEFING (tick 1083, ~43s game time) ---\nFunds: $5000 (cash=$5000 + ore=$0) | Power: +0 | Harvesters: 0 | Explored: 62.5%\nUnits (8):\n 1004 1tnk @(112,8), moving to (115,5)\n 1005 1tnk @(108,27), moving to (114,33)\n 1006 1tnk @(108,26), moving to (115,33)\n 1001 2tnk @(20,36)\n 1002 2tnk @(20,35)\n 1003 2tnk @(76,6), moving to (114,5)\n 1007 jeep @(116,5), moving to (115,6)\n 1008 jeep @(116,33), moving to (115,34)\nIdle: 1001, 1002\nBuildings: ? ()\nEnemies: 1xfact[1009@(115,6)] 1xproc[1010@(115,34)] center (115,20)\nProduction: IDLE"
396
+ },
397
+ {
398
+ "type": "image_url",
399
+ "image_url": {
400
+ "url": "data:image/png;base64,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F33xy141KseHYy/8LCU57oU7G3RuVfWwGvEnNks+6ZcrqiTFTb3jqPnvZ7+/YpteAwAASieEjJmwNrZQvWpcCGHdpu09O6Q+N3vTN+vzQwhvvLPlrPYpQggAABBK956Qh284fPlTTdasy/tkVc4nq3K6t0+pkVrp6HoJXVpXrVMjXpcBAAClHEJ+Neqr5hd8WikucmX/tCemb1izLn/5U00mjDzyvc+2bdlaoMsAAIBQWpdj/ePmIya/sWnynE1ffpv38oKshvUScvOjl9359WV3fh17d/nKHF0GAMDB8tXi+3e4/vC2Q3XOLvonlOWZkDnvbrm0b806NeKPqlt5QJfq8z/IvrRPjcmjjqqeUumsdikdWlZ5ZVGWoQUAAEJpzYSMf3lDy8ZJSx5tvC0vOv7l9RNnbaySGNeldconzzT5z7r8X436atMWl2MBAAClF0Jy86PD7l097N7VhWuycwoG3/Jv3QQAAAQV0wEAACEEAABACAEAAIQQAADgkBVJSal5wL4sK2utHgcAgENHamraQQ4hAAAALscCAACEEAAAQAgBAAAQQgAAACEEAACg7ISQ9PSmS5cujv2ZP/+Ne++9KzU1NTExoXDlu+8umjFjWr9+fWLbz5nzWsOGR4cQEhMTr7/+/15/fcaiRRnjxz/cps0JsQ2OPPLIefNmFf2KBQvm1K9f77nnnin8zNifG264bmet6ty54+jRd+1sfc+ePYr93Xbt2t5337273tPjjmtR7DMPO6xOYWMWLJjzl7/8uVattKK7GeucK674TeFfOe20U5cuXdynT6997PbdafCuXXXV0HPP7bt3exdCqFGjxttvvzl06OWFa3Y26A0bHj19+vOxbZKTk//+9wfuuefO+Pj4/f3LLPUuOoiystbuzh+tAgAOovgD/H3//veXvXufG0KoXr36vffe1a9fn2efnRhCaNeuY05Oblxc3EkntRk7dswbb2SsX7++8G/dddeoSCRyySW//vbb77p27fLXv94zcODgr79evbNv6d9/UOyM9vHH/37qqd123aS5c+fNnTtvZ+t79uxRWvu+devWk08+NYRQr169YcOuuOuuUb/4xa+LbrBu3fpu3bqOG/dQ7OWZZ3Zdu3Zdefkl7WLvzj77rKysrLPP7j527IPRaLTIqX/xQS98q0qVKvffP3rDhg3XX//7/Px8B+oe6Te+0643mDIk48C3qkGnG3a9QWbGqL342Fq10p588tEePfoadwAIZkJ+/Ivj4uLjK3311ddFVxYUFCxa9NaGDRvq1KlduPLYY3/aosWxw4ePyMxclZ2d/cILL82cOatXr7P37nsfe+xvZ531fSyZMmVCs2bpsRmPqlWr3HffvQsWzJk8+dnjjmsZisyQ1KxZ85FHHpo3b9bIkTcnJCT8b9rpN2PGtDfeePX22/9UtWqV3WzD6tWr//jH2xo3bty8ebOi67/7bu2mTZuaNj0mhJCQkHDCCccvWfJOiXz1P984dOjlY8eOCSG0adP6hRcmV6lSpWfPHqNGjXz44Qfmz3/jlltuLDqNcOmll8yc+fLs2a/89rdXRCKR2AzAuHF/feSRB3/72yuKfXJcXNy11141d+7rzz33zBFHHL77PVxy73r37nnXXfdWr16tVavjS25fctCrVq0ybtyYkgmkS5dT7777jtjyn/98W5cup3bu3PGee+4cPfru+fNnjx59d2JiQrnoorJm2LAr5859/Zlnnrz11lv69OlVdJdj72ZkvD5nzsxrrvltbHSKHiklD5xSMX78wx07dgghPPzwA3/4ww0hhD59eo0Y8buS7XnyyUfr1av3z38+UXLoi+0IAHDohpAjjzwidhHO7NmvVKlSZcmSd4slkw4d2kej0S++yCxc2aLFscuWLc/Ozi5cc/PNI//2t0diyykpKUUvu0pOTt51A15+ecbpp58WQmjcuFE0Gv3443/F1vfsefbmzZtPO63b6NH33Xjj74r+lTZtWt911z29e/c/8sgjBgzoF364KqnlGWec/rOfXdy7d/9KlSpdcMH5u98P27Zt+/TTz44+usH/7n7k1Vdndut2RgihQ4f2b721pNgkQMlvfOihh+vVq9u3b+8//OGGW2+9I9ZLnTt3HDNmbN++Axo1ati/f7/CM/gzzzzjwgsvueCCn7dv37Zwhqd161ZjxoydO3desU/u1q1ru3YnnXfe4Ouuu+GEE47fo1EuunfHHNP48MPrz5w5a9asOWef3X2HcbTooCckJD7wwP3HH3/cX/86dnfmQE45pcMzz0zs3r1P/fr1Tz755PLSRWXHGWecfsopJw8ceMHvf39T+/btiu7y/fc/0KhRwy5dTu3bd8A55wzs3LlTs2bpxY6UXRw4++LNNxe2bXtSYmJis2bpsVZ16ND+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7vgBnnMom60CAIQQAAAgeDoWAACAEAIAAAghAAAAQggAACCEAAAAQoguAAAAhBAAAEAIAQAAEEIAAAAhBAAAQAgBAACEEAAAQAgBAAAQQgAAACEEAABACAEAAIQQAAAAIQQAABBCAACAQ0h8OW335s3rdn/jlJSah3KrAAAgmAk58B56aOwLL0w23gAAEMyE7IvoZx13vUHkmHkhhOTk5OOOa9G58xm785m1aqU9+eSjPXr03d+tAgAAIeRA6Nq1S79+fRITE95774NHHnm8efNmXbqcGhcX+elPm3/44UejR4/Ny8sruc1ZZ3WLRqPNmzd7/vkXqlev1rFjh/PPP3/3v/Tpp59ITk6eNm1Sjx59hw27cuDAcwsKolOnPn/vvfeFEC677NLzzhsQFxd5/PEnH3/8ySeffLRevXr//OcTgwf/fL92Rc+ePTp27FC7dq3mzZu/9trMW2+9o02b1kOGXJiYmLB06fv33Tfu0ksvOf/8AZUqVZo8+fn7738gGo0Wa6qfLwAAweVYu9a06THt2p00YsQtV199XaVKlc4668wQQqtWx82YMXPo0Gtq1659/PEtd7hNs2bpEydOvv763/fvf8769RuGDft/e/S9gwcPWbt2XY8efRs1atily6l9+w4455yBnTt3atYs/fTTT+vWrevgwUMGDx4yZMiFdevWveiiS1avXr2/E0hM584dx4wZ27fvgEaNGvbv3y+E0Lp1qzFjxt5//wNdupx65plnXHjhJRdc8PP27dv27NmjZFP9fAEACGZCdq116xOOO67FQw/dF3uZm5u3atWqZcuWf/DBshDCv/71aWpq6jHHNC65zb/+9cmKFZ+HELKzt86ePXfLli1714CVK7947LEnhg69PDc3Ny0tLSUl5ZRTTn7hhZfWrFkTQujS5awQQq1aaQesQ2bNmhPb9+eem9q+fdsvvshcuvS999//IITQqdMpTz89IdawZ5+d1KZN64KC7cWaCgAAQsiPfVl8pUmTpkyaNKVILGmVm5sXW45GCyKRyA632bp1a+HL/Py8vW5A7949L7po8KRJU7KztzRp0iSEkJiYuGnTpoM+DAUFBbGFvLz82ELlygl5ed/vaVJSUl5ebpUqVcpCUwEAIJSjy7GWL/+oU6dT6tSpU61atREjhnfqdMrebbPX6tev9+GHH7300vR169Y3b55euXL8W28tOeecPjVq1GjUqOGcOa/VqpVWUFCQlJQUH38g4lmnTh3S05vWqlXrggvOe/vtd4q+tWTJO4MGDaxTp3bduocNHHhuRsb8kk318wUAIJgJ2bV3332vYcOjb7315kqVKr3xxtx589484YTj92KbvTZ16rTRo++eOfPlV1557dFHx19//f/17z+oWbP0adMmZWdv/ctfxnz33doQwrfffvfEE48MHjxkf3fI++8vu+WWGxs0OGr69FemTp124oltCt+aNu3FJk2OmTjx6ZycnAkTJmVkzI+LiyvZVAAAKHci5bRkXqws4G4+DPcAFyvczVadf/7PTjjh+FtvvcOvEACA4HIsAACAoFhhBfPSS9Nfemm6fgAAIJgJAQAACGZCws5vrtAqAAAIZkIAAABCRXo6FgAAEMyEAAAACCEAAIAQAgAACCEAAABCCAAAIIQAAAAIIQAAgBACAAAghAAAAEIIAAAghAAAAAghAACAEAIAACCEAAAAQggAAIAQAgAACCEAAIAQAgAAIIQAAABCCAAAgBACAAAIIQAAAEIIAAAghAAAAEIIAACAEAIAAAghAAAAQggAACCEAAAAQggAAIAQAgAACCEAAABCCAAAIIQAAACU9P8BPCmrdlzXLV0AAAAASUVORK5CYII="
401
+ }
402
+ }
403
+ ]
404
+ },
405
+ {
406
+ "role": "assistant",
407
+ "content": "",
408
+ "reasoning": "The units are moving towards their target regions.\n- 1001, 1002 are already at/near (20,36).\n- 1007 is at (116,5), moving to (115,6).\n- 1008 is at (116,33), moving to (115,34).\n- 1003, 1004 are heading to (115,6).\n- 1005, 1006 are heading to (115,34).\n\nLet's see where they end up. 1007 and 1008 are very close to their NE and SE corners. 1001 and 1002 are at NW corner.\nI will just observe to let them arrive.",
409
+ "tool_calls": [
410
+ {
411
+ "id": "c0",
412
+ "type": "function",
413
+ "function": {
414
+ "name": "observe",
415
+ "arguments": {}
416
+ }
417
+ }
418
+ ]
419
+ },
420
+ {
421
+ "role": "tool",
422
+ "tool_call_id": "c0",
423
+ "content": "ok"
424
+ }
425
+ ]
playback/run1/20260519-060529__qwen_qwen3.6-flash/action-multiunit-coordination:medium:public/seed1/minimap_turn001.png ADDED
playback/run1/20260519-060529__qwen_qwen3.6-flash/action-multiunit-coordination:medium:public/seed1/minimap_turn002.png ADDED
playback/run1/20260519-060529__qwen_qwen3.6-flash/action-multiunit-coordination:medium:public/seed1/minimap_turn003.png ADDED
playback/run1/20260519-060529__qwen_qwen3.6-flash/action-multiunit-coordination:medium:public/seed1/minimap_turn004.png ADDED
playback/run1/20260519-060529__qwen_qwen3.6-flash/action-multiunit-coordination:medium:public/seed1/minimap_turn005.png ADDED
playback/run1/20260519-060529__qwen_qwen3.6-flash/action-multiunit-coordination:medium:public/seed1/minimap_turn006.png ADDED
playback/run1/20260519-060529__qwen_qwen3.6-flash/action-multiunit-coordination:medium:public/seed1/minimap_turn007.png ADDED
playback/run1/20260519-060529__qwen_qwen3.6-flash/action-multiunit-coordination:medium:public/seed1/minimap_turn008.png ADDED
playback/run1/20260519-060529__qwen_qwen3.6-flash/action-multiunit-coordination:medium:public/seed1/minimap_turn009.png ADDED
playback/run1/20260519-060529__qwen_qwen3.6-flash/action-multiunit-coordination:medium:public/seed1/minimap_turn010.png ADDED
playback/run1/20260519-060529__qwen_qwen3.6-flash/action-multiunit-coordination:medium:public/seed1/minimap_turn011.png ADDED
playback/run1/20260519-060529__qwen_qwen3.6-flash/action-multiunit-coordination:medium:public/seed1/minimap_turn012.png ADDED
playback/run1/20260519-060529__qwen_qwen3.6-flash/action-multiunit-coordination:medium:public/seed1/minimap_turn013.png ADDED
playback/run1/20260519-060529__qwen_qwen3.6-flash/action-multiunit-coordination:medium:public/seed1/minimap_turn014.png ADDED
playback/run1/20260519-060529__qwen_qwen3.6-flash/action-multiunit-coordination:medium:public/seed1/score.json ADDED
@@ -0,0 +1,17 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "composite": 0.8044,
3
+ "outcome": "win",
4
+ "perception": 0.7405,
5
+ "reasoning": 0.9414,
6
+ "action": 1.0,
7
+ "weakest_link": "perception",
8
+ "objective_progress": 1.0,
9
+ "reward_vector": {
10
+ "economy": 0.5,
11
+ "military": 0.1,
12
+ "territory": 0.6293,
13
+ "scouting": 0.5,
14
+ "objective": 1.0
15
+ },
16
+ "notes": []
17
+ }
playback/run1/20260519-060529__qwen_qwen3.6-flash/action-multiunit-coordination:medium:public/seed1/turns.jsonl ADDED
The diff for this file is too large to render. See raw diff
 
r_amc_easy.json ADDED
@@ -0,0 +1,73 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "run_id": "20260519-051909",
3
+ "model": "qwen/qwen3.6-flash",
4
+ "truncated": false,
5
+ "resumed": 0,
6
+ "cost": {
7
+ "calls": 17,
8
+ "prompt_tokens": 77867,
9
+ "completion_tokens": 4225,
10
+ "usd": 0.0,
11
+ "max_usd": 0.0
12
+ },
13
+ "summary": {
14
+ "action-multiunit-coordination:easy": {
15
+ "n": 1,
16
+ "win_rate": 1.0,
17
+ "composite_mean": 0.7757,
18
+ "composite_std": 0.0,
19
+ "perception_mean": 0.4098,
20
+ "reasoning_mean": 0.9234,
21
+ "action_mean": 1.0,
22
+ "objective_mean": 1.0,
23
+ "weakest_link_hist": {
24
+ "perception": 1
25
+ }
26
+ }
27
+ },
28
+ "overall": {
29
+ "n": 1,
30
+ "win_rate": 1.0,
31
+ "composite_mean": 0.7757,
32
+ "composite_std": 0.0,
33
+ "perception_mean": 0.4098,
34
+ "reasoning_mean": 0.9234,
35
+ "action_mean": 1.0,
36
+ "objective_mean": 1.0,
37
+ "weakest_link_hist": {
38
+ "perception": 1
39
+ }
40
+ },
41
+ "reward_vector_mean": {
42
+ "economy": 0.5,
43
+ "military": 0.0,
44
+ "territory": 0.414,
45
+ "scouting": 0.2,
46
+ "objective": 1.0
47
+ },
48
+ "episodes": [
49
+ {
50
+ "cell": "action-multiunit-coordination:easy",
51
+ "capability": "action",
52
+ "split": "public",
53
+ "seed": 1,
54
+ "outcome": "win",
55
+ "composite": 0.7757,
56
+ "perception": 0.4098,
57
+ "reasoning": 0.9234,
58
+ "action": 1.0,
59
+ "weakest_link": "perception",
60
+ "objective_progress": 1.0,
61
+ "reward_vector": {
62
+ "economy": 0.5,
63
+ "military": 0.0,
64
+ "territory": 0.414,
65
+ "scouting": 0.2,
66
+ "objective": 1.0
67
+ },
68
+ "turns": 17,
69
+ "notes": []
70
+ }
71
+ ],
72
+ "skipped": []
73
+ }
r_amc_medium.json ADDED
@@ -0,0 +1,73 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "run_id": "20260519-060529",
3
+ "model": "qwen/qwen3.6-flash",
4
+ "truncated": false,
5
+ "resumed": 0,
6
+ "cost": {
7
+ "calls": 13,
8
+ "prompt_tokens": 60915,
9
+ "completion_tokens": 7157,
10
+ "usd": 0.0,
11
+ "max_usd": 0.0
12
+ },
13
+ "summary": {
14
+ "action-multiunit-coordination:medium": {
15
+ "n": 1,
16
+ "win_rate": 1.0,
17
+ "composite_mean": 0.8044,
18
+ "composite_std": 0.0,
19
+ "perception_mean": 0.7405,
20
+ "reasoning_mean": 0.9414,
21
+ "action_mean": 1.0,
22
+ "objective_mean": 1.0,
23
+ "weakest_link_hist": {
24
+ "perception": 1
25
+ }
26
+ }
27
+ },
28
+ "overall": {
29
+ "n": 1,
30
+ "win_rate": 1.0,
31
+ "composite_mean": 0.8044,
32
+ "composite_std": 0.0,
33
+ "perception_mean": 0.7405,
34
+ "reasoning_mean": 0.9414,
35
+ "action_mean": 1.0,
36
+ "objective_mean": 1.0,
37
+ "weakest_link_hist": {
38
+ "perception": 1
39
+ }
40
+ },
41
+ "reward_vector_mean": {
42
+ "economy": 0.5,
43
+ "military": 0.1,
44
+ "territory": 0.6293,
45
+ "scouting": 0.5,
46
+ "objective": 1.0
47
+ },
48
+ "episodes": [
49
+ {
50
+ "cell": "action-multiunit-coordination:medium",
51
+ "capability": "action",
52
+ "split": "public",
53
+ "seed": 1,
54
+ "outcome": "win",
55
+ "composite": 0.8044,
56
+ "perception": 0.7405,
57
+ "reasoning": 0.9414,
58
+ "action": 1.0,
59
+ "weakest_link": "perception",
60
+ "objective_progress": 1.0,
61
+ "reward_vector": {
62
+ "economy": 0.5,
63
+ "military": 0.1,
64
+ "territory": 0.6293,
65
+ "scouting": 0.5,
66
+ "objective": 1.0
67
+ },
68
+ "turns": 13,
69
+ "notes": []
70
+ }
71
+ ],
72
+ "skipped": []
73
+ }
smoke_qwen.json ADDED
@@ -0,0 +1,85 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "run_id": "20260519-025303",
3
+ "model": "qwen/qwen3.6-flash",
4
+ "truncated": false,
5
+ "resumed": 0,
6
+ "cost": {
7
+ "calls": 7,
8
+ "prompt_tokens": 20683,
9
+ "completion_tokens": 1274,
10
+ "usd": 0.0,
11
+ "max_usd": 0.0
12
+ },
13
+ "summary": {
14
+ "adversarial-duel:easy": {
15
+ "n": 1,
16
+ "win_rate": 1.0,
17
+ "composite_mean": 0.8561,
18
+ "composite_std": 0.0,
19
+ "perception_mean": 0.2722,
20
+ "reasoning_mean": 0.9494,
21
+ "action_mean": 1.0,
22
+ "objective_mean": 1.0,
23
+ "weakest_link_hist": {
24
+ "perception": 1
25
+ }
26
+ }
27
+ },
28
+ "overall": {
29
+ "n": 1,
30
+ "win_rate": 1.0,
31
+ "composite_mean": 0.8561,
32
+ "composite_std": 0.0,
33
+ "perception_mean": 0.2722,
34
+ "reasoning_mean": 0.9494,
35
+ "action_mean": 1.0,
36
+ "objective_mean": 1.0,
37
+ "weakest_link_hist": {
38
+ "perception": 1
39
+ }
40
+ },
41
+ "reward_vector_mean": {
42
+ "economy": 0.5,
43
+ "military": 0.3,
44
+ "territory": 0.1317,
45
+ "scouting": 0.3,
46
+ "objective": 1.0
47
+ },
48
+ "episodes": [
49
+ {
50
+ "cell": "adversarial-duel:easy",
51
+ "capability": "adversarial",
52
+ "split": "public",
53
+ "seed": 1,
54
+ "outcome": "win",
55
+ "composite": 0.8561,
56
+ "perception": 0.2722,
57
+ "reasoning": 0.9494,
58
+ "action": 1.0,
59
+ "weakest_link": "perception",
60
+ "objective_progress": 1.0,
61
+ "reward_vector": {
62
+ "economy": 0.5,
63
+ "military": 0.3,
64
+ "territory": 0.1317,
65
+ "scouting": 0.3,
66
+ "objective": 1.0
67
+ },
68
+ "turns": 7,
69
+ "notes": [
70
+ "very low map coverage \u2192 perception/scouting problem"
71
+ ]
72
+ }
73
+ ],
74
+ "skipped": [],
75
+ "adversarial": {
76
+ "ladder_ratings": {
77
+ "adversarial-duel": 1
78
+ },
79
+ "mean_ladder_rating": 1.0,
80
+ "packs": [
81
+ "adversarial-duel"
82
+ ],
83
+ "max_rung": 3
84
+ }
85
+ }
tests/test_prompt_v2.py CHANGED
@@ -194,3 +194,13 @@ def test_extra_body_merged_into_request(monkeypatch):
194
  monkeypatch.setenv("OPENROUTER_API_KEY", "k")
195
  p.complete([{"role": "user", "content": "hi"}], [])
196
  assert captured.get("provider") == {"sort": "throughput"}
 
 
 
 
 
 
 
 
 
 
 
194
  monkeypatch.setenv("OPENROUTER_API_KEY", "k")
195
  p.complete([{"role": "user", "content": "hi"}], [])
196
  assert captured.get("provider") == {"sort": "throughput"}
197
+
198
+
199
+ def test_briefing_sanitizes_empty_buildings_line():
200
+ """Unit-only scenarios must not show the vendored fallback's
201
+ confusing 'Buildings: ? ()'."""
202
+ b = P.briefing(_render_state())
203
+ assert "Buildings: ? ()" not in b
204
+ assert "Buildings: 0 ()" not in b
205
+ line = [l for l in b.splitlines() if l.startswith("Buildings:")][0]
206
+ assert "none" in line and "mobile units only" in line