Spaces:
Running
Running
Commit History
-
docs: Wave 1 engine-footgun aggregation in CLAUDE.md + regen scenarios.html
Aggregates engine-quirk findings surfaced by the 10 Wave 1 parallel agents (defense-rush-survive, strategy-trilemma, harass-response-preserve, mid-concede-vs-hold, coordination-staggered-window, tempo-double-window, perception-count-the-threat, navigation-confined-hard-only, plus economy-harvest-timebox + economy-harvest-investment rebuilds): - spawn_point filter applies ONLY to agent actors (enemies always all-place) — cannot vary enemy by seed via spawn_point; vary the agent's spawn instead. Duplicate base actors across both groups. - silo is NOT MustBeDestroyed — using it as landmark allows premature engine auto-done. Use barr/proc/powr/fact for anchors. - after_ticks in a WIN clause collapses to DRAW via ConquestVictoryConditions — after_ticks only belongs in fail_condition. - move_units auto-fires regardless of stance:0 — perception packs with hidden enemies must set the HIDDEN actors to stance:0. - pbox costs 600 (not 400); defense and infantry are separate product…d05021a
-
docs: whole-suite no-cheat pass summary + engine footguns; regenerate catalog
All 21 active packs redesigned to the no-cheat bar (#1-#21 cadence complete). Records the recurring defect classes eliminated, the predicates used to enforce each capability, and the two engine footguns surfaced for follow-up (power_surplus_gte inert, deploy unimplemented). Catalog regenerated to the new YAMLs.ca00016 -
#6 artofwar-lure-the-tiger: adopt rigorously-verified no-cheat redesign
Replaces the hand-tuned 5e0a27f variant with the review agent's verified design (displace-and-exploit, distinct from #4 decoy- sacrifice): enemy bot_type:guard lethal e3 wall at x=60; win = units_in_region_gte n3 AND units_lost_lte:2 AND reachable within_ticks (rejects the 1-unit reach cheat and a head-on grab that burns armour); any_of fail; fact marker; 2 in-bounds hard spawn groups. Proven over 60 scripted runs: every lazy/brute/stall/flank LOSES all tiers/seeds 1-4; the lure is causally required (same tank route w/o luring loses); the intended lure-then-grab WINS all tiers/seeds. +2 strengthening tests. Suite 383.7521ecb -
#5 artofwar-indirect-approach: no-cheat redesign — hazard-detour enforced
Original was cheatable: static e1 line, short hop, inert deadlines, no real fail — scripted brute/greedy WON all tiers/seeds (the detour was never required), stall DREW (degeneracy). Redesigned to the #4 idiom (capability = reject the lethal short path, commit to the survivable circuitous detour — pure hazard-routing, no bait): enemy bot_type:guard; a horizontal e3 wall across the direct west→east lane (the only safe route is rounding the wall's east end along the north edge, distance > guard aggro); unarmed high-HP fact marker at the far objective (no enemy-elim auto-terminal draw); win = units_in_region_gte n3 (easy/med) / all_units_in_region+own_units_gte3 (hard) + reachable within_ticks + units_lost_lte; fail any_of[ after_ticks budget+1, not units_lost_lte, not own_units_gte1]. Tiers: easy bare; medium longer wall + zero-loss; hard seed-varied spawn + all-units + zero-loss. Tick/turn aligned every level. VERIFIED no defect: stall/brute/greedy/greedy_y LOSE every tier & every har…3b75cad -
#4 artofwar-decoy-sacrifice: no-cheat redesign — decoy-sacrifice enforced
The prior pack was cheatable (durable 2tnk brute-rush past a weak e1 picket won in ~4 turns; the decoy/credit-assignment capability was never required). Redesigned end-to-end so the ONLY winning policy is the decoy: - enemy bot_type: guard (new engine leashed-defender behaviour): an e3 (anti-tank) line spans the corridor at x=60, holds post, lunges at a foe within aggro, snaps back past the leash. - win = units_in_region_gte{(112,20) r6 n:3} (the THREE-tank main body must reach the far objective) + reachable within_ticks; the unarmed high-HP marker keeps the episode alive (no enemy-elim auto-terminal). - A head-on push runs the full lethal e3 gauntlet → <3 arrive → timeout LOSS. Do-nothing/preserve-everything → timeout LOSS. Only baiting a segment off post with the fast jeeps opens a transient gap for the tanks. - Tiers: easy bare; medium tighter clock; hard seed-varied spawn (anti-memorisation) + units_lost_lte:2 (only the 2 bait jeeps may be spent). Off-map hard sp…d0dd8e7 -
fix-forward: repair merged PR#5/#6 (unblocked by own-unit actor_type fix)
The collaborator merged PR#5 (tech-production-planning) and PR#6 (economy-investment/rush-hour fail_conditions + longhorizon pack) raw — main was RED (3 failures). With the engine own-unit actor_type fix: - tech-production-planning: now WINNABLE (scripted chain wins easy ~tick 2883). Un-quarantined; realigned the inert within_ticks to the tick reachable at max_turns (5403/7203/8103) + added timeout fails; classified NOT_APPLICABLE (non-spatial build-order); added 'mine' glossary entry; fixed the PR's test (res.signals.units_summary AttributeError -> a win already proves the 3tnk; hard-fail test updated to the any_of shape). - economy-investment / rush-hour / longhorizon-opening-to-assault: realigned the inert after_ticks fails to R=93+90·(max_turns-1) so a non-finisher LOSES instead of drawing (turn budget unchanged -> solvency-safe); classified longhorizon NOT_APPLICABLE. Suite 380 passed, 1 skipped; catalog regenerated.40d2f25 -
#2 hard: per-waypoint search BAND in the relative objective
Per user: hard should give a coarse area to scout for each waypoint, not a bare compass word. Rewrote all 8 waypoint labels to express a relative search band (e.g. 'the far NORTH-WEST — search the western ~quarter, in the northern ~third'); still no coordinates (enemy_ building_spotted interrupt pins the exact fogged marker on sighting). Verified no coord leak in the relative brief. Suite 358; docs regen. Also recorded: #2 easy WIN (ordered W1->W2->W3, tick 1893<2400); medium LOSS = valid model failure (split correctly, completed route S in order but lost column discipline on route N and timed out — exactly the re-deliberation failure the pack targets; scenario solvable, no compensation).a9b5126 -
#2: enforce ordered waypoints (stateful waypoint_sequence) + two-path medium + scouted hard
Root defect (closer look): the pack claimed to test ordered non-stalling route execution but the win condition only referenced the final region + a tick band — a beeline-to-final that skipped every waypoint and idled to the gate won. Fix: - New reusable stateful predicate waypoint_sequence: latches ordered region-visit progress (monotonic) on a per-episode signals.seq_progress scratch. Wk+1 only counts after Wk reached; skip/idle/out-of-order => never satisfied. Coords-aware objective phrase (exact|relative). - easy: ONE ordered 3-waypoint route, clear, generous budget. - medium: TWO crossing ordered routes BOTH required -> must split into two parallel columns (serial overruns the clock); attrition cap. - hard: TWO 4-waypoint serpentine routes on a NEW larger map (scout-arena 176x80, scripts/build_scout_arena_map.py), given by RELATIVE direction only (no coords) with the enemy_building_spotted interrupt revealing fogged markers on sighting -> real scouting; seed -varie…b165246 -
action-sequenced-execution: timeout/attrition overrun is a LOSS, not a draw
Closer look on #2: easy/medium had no fail_condition, so overrunning the [after_ticks, within_ticks] takt-time band (the scenario's actual teeth) recorded as a draw at max_turns instead of a failure. Per the established sequenced-route idiom (cf artofwar-sequenced-citadel: a single final region graded by an arrival-timing band, not literal waypoint predicates), keep the design and add real fail_conditions: deadline overrun -> loss on all 3 levels; on medium/hard also lose when the attrition cap is busted (win unreachable once >1 lost) or the force is destroyed. Win/fail tick bands are disjoint (no overlap at the boundary). Suite 351 passed; catalog regenerated.01e12d1 -
hard: enemy_building_spotted interrupt closes the coordinate-blind feedback loop
Second hard run still lost: the model named the right buildings and split correctly but, with no coords and the markers fogged all episode, could only visually estimate from the minimap and parked ~15 cells short every time — the landmark never entered sight, so no corrective signal ('identify on the minimap' was impossible). Per user: building-found should trigger an interrupt. Enable enemy_building_spotted in hard's overrides (engine env.rs already emits it; eval_core already supports it) so the agent is re-prompted the instant a unit sights a marker, revealing its exact position; r7 becomes fair since the sighting yields coords. Objective rewritten to instruct: keep advancing in each direction until the sighting interrupt, then converge. easy/medium unchanged (no interrupts). Suite 351 passed; catalog regenerated.d58c824 -
hard: anchor relative objective on the named enemy building type per direction
First hard run (qwen3.6-flash) lost: the model reasonably read 'the NORTH-EAST corner' as the literal map extreme and parked at the geometric corners, while the win pockets are inset ~13-20 cells (r7) — under-determined for a coordinate-blind agent, and units overshot past the landmark buildings so the intended visual aid never entered vision. Fix per user: name the specific enemy building in each direction (Construction Yard NE / Power Plant SW / Ore Refinery SE) so the model converges on that identifiable structure on the minimap, which sits at the region centre. No radius/region changes; setup still identical to medium. Suite 351 passed; catalog regenerated.36bbbc9 -
action-multiunit-coordination hard: spatial-grounding via relative-direction objective
New controllable knob objective_coords (exact|relative) on Level/ScenarioConfig (default exact). relative discloses only the authored compass label per region ('the NORTH-EAST corner') instead of (x,y), so the model must localize targets on the minimap itself; the win predicate still evaluates against real engine coordinates. Hard is now byte-identical to medium's setup (same 3 dispersed regions, same infantry pickets, same deadline + attrition); the SOLE changed variable vs medium is the coordinate disclosure, isolating spatial grounding as the tested capability. No turrets / no spawn-variation by design (would confound attribution) — recorded as a reasoned exception to the spawn-variation contract. Threaded objective_coords through schema -> compile/compile_config -> run_eval -> game_knowledge.objective_brief -> docs generator. Guard tests + SCENARIO_QUALITY design note. Full suite 351 passed.51d66ad -
action-multiunit-coordination medium: disperse the 3 regions (multi-vector)
The 3 regions were all far-right x110-112 (stacked in y), so one eastward column could fan out and cover them — not a real multi-group SPLIT. Now dispersed across the map: NE corner (115,6), bottom-left (20,36), SE corner (115,34) — three different directions; a single eastward march physically cannot reach the bottom-left region. Markers fact/proc/powr moved to match; e1 lane defenders unchanged (threaten the 2 east routes; bottom-left clear); within_ticks 2800 / loss-cap 2 retained (probed: each region reachable, slowest ~1800t). tests: dispersion + 3-way-split-wins / all-east-loses (proves the split is enforced). catalog regenerated.a3fc650 -
Fix action-multiunit-coordination: enforce split, binding deadline, real fail
Review found 4 defects; all fixed + re-verified: - new predicate units_in_region_gte {x,y,radius,n}: win now requires >=2 units in EACH region (reach_region only needed 1 → a single touring unit could win; the stated 'parallel split' wasn't tested) - within_ticks was inert (6000/5000/4200 >> max_turns*~90). Measured traversal (~1530 ticks optimal parallel, ~3000+ serialized) → bound to 2400/2800/3300 so the deadline actually discriminates parallel-dispatch vs serialized - fail_condition on ALL levels (force-wiped OR after_ticks past the deadline): missing the deadline is a LOSS, not draw (kills the loss==draw degeneracy on easy/medium) - tools stop_units -> stop (stop_units silently dropped) - game_knowledge: objective phrasing for the new predicate verified: do-nothing -> loss; scripted parallel split-dash -> win (solvable); tests/test_units_in_region.py (+6); 346 passed, 1 skippeddeb7cde -
De-dup: consolidate aimless scenario duplicates (24→21 active)
Overlap analysis (decision-level, not raw predicate Jaccard): - adversarial-siege, adversarial-skirmish → quarantined: same map + same win signature + same adversarial skill as adversarial-duel, which is now canonical (its easy→hard ladder + easy/medium configs already cover even→outnumbered→entrenched). - economy-time-box → quarantined: = economy-force-buildup + a standing-economy clause (same budget-under-clock decision). Kept force-buildup + investment (distinct allocation decision). Kept as distinct (each serves a purpose): strategy-dilemma vs -gauntlet (different MAPS/route puzzles); artofwar decoy vs lure (distinct credit-assignment). Principle: don't aimlessly duplicate maps — each scenario = a distinct decision. Quarantined packs stay on disk + explicit --packs runnable; off the default sweep. tests + SCENARIO_QUALITY.md + docs/scenarios.html regenerated (21). 340 passed, 1 skipped.834b683 -
HTML scenario catalog + clearer custom-map-no-enemy descriptions
- scripts/gen_scenario_docs.py → docs/scenarios.html: every active scenario's title, capability, why-it-exists, robotics analogue, and per runnable config the EXACT objective the model sees (objective_brief: description + WIN/LOSE + turn budget). Run with --open to view. - custom-map-no-enemy easy/medium descriptions: plain imperative ('Move your units to the goal zone near (30,16) … Win: …') instead of the terse originals. Finishes the clarity pass (#26): titles + catalog; the remaining per-level texts were assessed already concrete and left to preserve tuned puzzle intent.701ffc9