AscensionAI

AscensionAI Results Dashboard

Tracks AscensionAI from the live-game PPO era to the current headless-simulator agent. The headline reflects the deployed mainline_v3 (search-combat + a diagnosed macro stack on the sts_lightspeed simulator). The charts and tables further down are the historical live-game PPO training era (through ~19.5k games), which plateaued at ~14.7 floor and motivated the June 10 pivot to the simulator. Load local CSV exports to chart your own runs.

Current deployed agent (Jun 17) = mainline_v3 on the headless sts_lightspeed simulator: 1-ply replay-search combat + a diagnose-first macro stack (deck hygiene, AoE/draw role scorer, conservative + tempo-targeted smith) — avg floor 26.1, 9 wins / 150 fixed seeds (6.0%). The cards above summarize it; the stage-progression panel shows how it was built. The charts and the Fixed-Seed / Run-Metadata tables below are the historical live-game PPO era (585-d → 717-d models, May–June, plateaued at ~14.7 floor / 0 wins) kept for the record. Load training_stats.csv, bc_train_stats.csv, and eval_stats.csv to chart local live-game runs.

Current Agent — mainline_v3 (headless simulator)

The deployed agent plays on the headless sts_lightspeed simulator: combat by 1-ply replay search (each candidate action rolled to the end of the fight) layered with a diagnose-first macro stack for non-combat decisions. It was built one attributable lever at a time, each A/B-tested at 150 fixed seeds. Full reasoning in the Experiments reports (009–011).

StageEvalAvg floorWinsWhat changed
Live-game PPO plateau20014.70The universal wall — ~21,700 games, 0 wins (charted below).
+ search combat4826.401-ply search at combat decisions only — combat was the wall (Act-3 reached, max floor 50).
+ deck hygiene15023.65Remove basics / skip filler / suppress shop bloat — project's first wins.
mainline_v2 (+varN combat, +AoE/draw scorer, +conservative smith)15024.97First winning agent; Act-2/3 combat retrain + role gap-filler + HP-safe smithing.
mainline_v3 (+tempo-targeted smith)15026.19Upgrade the highest-tempo card (Bash+ etc.) instead of a Strike — biggest single-lever floor gain, no HP cost (6.0% win rate).

Remaining wall (next phase): entering Act-2 monster chains too hurt (~28% median HP) — an HP-attrition / path-sequencing problem, localized by elimination since deck tempo improved and per-fight combat stayed flat. See the Changelog below and report 011.

Historical — Live-Game PPO Training (May–June 2026, pre-pivot)

The charts and the two tables that follow are the original live-game RL era over CommunicationMod, which plateaued at ~14.7 floor with 0 wins after ~19.5k games and motivated the June 10 pivot to the simulator. Kept for the project record; they do not describe the current agent above.

Floor Over Time

Reward Over Time

PPO KL, Entropy, and Loss

BC Validation Accuracy and Loss

Fixed-Seed Comparison (live-game PPO era)

Run Metadata (live-game PPO era)

Changelog

DateAreaChangeImpact
Jun 17 Tempo-targeted smithing — mainline_v3 (biggest single-lever floor gain) A phase that opened aiming to cut Act-2 monster deaths with deeper combat search, and was redirected twice by diagnostics before any code. A 150-seed death recon showed 88% of those deaths are “lost on arrival” (median 28% HP at fight entry, every line already losing) — so death-turn search is futile. A deck-deficit pinpoint then showed the losing decks are not damage-deficient (equal damage, more scaling/powers than decks that cleared Act 2); the only monotonic success-correlate was upgrades (winners 2.7 vs losers 1.8–1.0). A 450-event audit found the conservative smith was upgrading a basic Strike/Defend 97% of the time (it took the first card in deck order). The fix kept the same smith frequency and HP gates and changed only the target: upgrade the highest-tempo card (premium attack > attack > block > AoE > draw/energy > scaling/power > filler) — e.g. Bash→Bash+ instead of Strike→Strike+. mainline_v3 = 9 wins / 150 (6.0%), avg floor 26.06+1.19 floor over mainline_v2, the largest single-lever gain so far, with zero boss-entry-HP cost (88.5→88.1%). Upgraded-tempo cards at Act-2 entry 0.31→1.57; Act-1 deaths 32→28. It missed its named gate — raw Act-2 monster deaths rose 58→65 — but the per-fight Act-2 monster win rate stayed flat (90.2→89.6%), so the rise is exposure (more runs reach Act 2: 118→122), not a combat regression. The remaining wall is now localized by elimination: entering Act-2 monster chains too hurt (HP-attrition / path-sequencing), the next phase. Rollback intact (SMITH_TARGET=0 reproduces v2).
Jun 15 First winning agent — mainline_v2 (stacked macro on search-combat) Converted the search-combat depth breakthrough into actual victories through a diagnose-first sequence of macro levers, each A/B-tested at 150-seed statistical power. (1) Deck hygiene (remove basics, skip filler, suppress shop-card bloat) → lean decks → first wins. (2) varN combat retrain: a per-act diagnostic showed combat falls off a cliff in Act 2 (monster 99→87%, elite 95→59%, boss 84→54%) because the combat net was trained only on Act-1 fights — so we harvested Act-2/3 fights from the agent's own deep runs and retrained (warm-started from the prior net; Act-2/3 oversampled). (3) AoE/draw role scorer: a card-role diagnostic found 42% of Act-2 decks had zero AoE, 34% no draw — a narrow gap-filler (only when missing, never relaxing drafting) cut those to ~8%. (4) Conservative boss-aware smith: upgrades at Act-2 entry were ~0.9; smithing only at HP ≥ 85% (≥95% pre-boss) raised them to 1.9 with no boss-entry-HP cost — unlike the earlier naive “smith when safe” that regressed. Ruled out by diagnostic (no broad heuristic grinding): starter-purge, relic-buying, elite/path gating, naive smithing. mainline_v2 = the project's first winning agent: 7 wins / 150 fixed seeds (4.7%), avg floor 24.9 — up from 0 wins across ~21,700 live games and the entire simulator variant series. Each diagnosed lever stacked (~+0.3–0.7 floor, +1 win); undiagnosed or broad ones washed out at power. The method — diagnose the specific deficiency, target only it, A/B at 150 seeds — is the real deliverable. Macro is now at its ceiling: the remaining wall (Act-2 monsters dying with the enemy at ~50% HP) is combat throughput, the next deliberate phase (deeper search / stronger combat model). Fully reproducible with rollback chain intact.
Jun 14 First wins — deck quality on top of search-combat With combat now handled by search, the next bottleneck became measurable. Full-run failure analytics over 48 fixed seeds localized it: 69% of deaths in Act 2, mostly ordinary monsters/elites, dying with the enemy still at ~42% HP (outpaced, not unlucky), behind a bloated, weak deck — 29 cards, ~10 un-removed Strikes/Defends, 0 relics bought, ~3 upgrades, 0.8 removes/run. A narrow deck-hygiene override was layered on the search-combat agent (skip filler card rewards, suppress shop card-buys, remove basic Strikes/Defends), intervening only on those screens and deferring everything else to the trained policy. First wins in the project's history — 0 → 3 of 48 seeds. Deck size 29→21, Strikes 6→3, shop cards 3.65→0/run, scaling powers 2.2→3.9, elite deaths 14→7. Average floor traded down 26.4→23.3 (a higher-variance “snowball-or-fizzle” profile). Diagnostics pinned the remaining Act-1-boss deaths to upgrade starvation (~0.3 upgraded cards in those decks) — the current lever. The project has moved from “can this work?” to “how do we make it reliable?”
Jun 13–14 A standalone combat policy hits a representational limit (varL, varM, capacity probe) Tested whether a search-free policy can be trained to search level: varL (on-policy DAgger distillation, β-annealed), varM (a value-bootstrapped teacher reusing the now-working value head), and an offline capacity sweep (0.86M → 5.22M params imitating the search teacher). All capped. DAgger ended ~19% boss; the value-bootstrap teacher collapsed (with the rollout removed, the value head — trained on a policy that loses bosses — rated every boss state a near-certain loss and spiraled, search boss 4%); per-state agreement with the teacher plateaued at ~70% regardless of capacity (0.69→0.73 for 6× params). Conclusion: a feedforward policy cannot absorb search-level combat on long fights — search acts as necessary per-step error correction, so the agent keeps search at combat decision time (deploy-with-search, AlphaZero-style).
Jun 13 Train-time search breaks the combat wall (decisive) A torch-free search worker reconstructs any fight by deterministic replay (seed + action prefix — the fork has no state cloning, but fights are deterministic) and runs a 1-ply lookahead: roll each candidate action to the end of the fight and score it. On 64 held-out fights, search wins boss 75–88% / elite ~94% vs the stuck greedy 44%/56%. A full-run evaluation then held the deck/map/shop policy fixed and replaced only combat decisions with search, isolating the effect of combat quality alone. Decisive. Combat alone — drafting/pathing unchanged — drove avg floor 14.71 → 26.35, Act-2 reach 27% → 83%, Act-3 reach 0% → 14.6%, max floor 33 → 50. The universal ~14.7 plateau was combat execution all along, and it fell the moment fights were played well. (Distilling search into a search-free policy, varK, did not transfer — greedy stayed 19–38% boss — but it solved value learning, ev → 0.97.)
Jun 12 Reward exhausted, observation bug fixed, combat identified as the wall (varC–F, H–J) Found and fixed a fork-binding call-order bug that had silently zeroed ~73% of the observation (deck + in-combat hand/draw/discard) — the baseline and early controls had trained effectively blind. With sight restored, varC/varD (deck shaping) and varE (bare-reward control) drafted identically and held floor ~14.7, so the plateau is reward-independent. A fight-curriculum gym (varF/H/I/J) trained combat directly: greedy fight win rates froze bit-identically at 72/94/56/44 with explained variance ≈ 0; a control showed random play wins 0% of bosses vs greedy's 44%, so combat has large headroom. A value-replay buffer (varJ) fixed value learning (ev 0→0.3) but the policy still would not climb. Narrowed the universal plateau to combat execution and showed model-free PPO cannot escape the combat local optimum in this setup — directly motivating the move to train-time search.
Jun 11 Simulator baseline + controlled plateau probes (varA, varB) Productionized the simulator trainer (milestone checkpoints + 48-fixed-seed greedy eval) and ran three controlled variants to test the plateau's cause: baseline (entropy collapsed to 0 by ~3.5k games), varA (normalized entropy held healthy 0.15–0.30 via auto-tune), and varB (3.5× network capacity, 150k games). All three pinned eval floor at ~14.4–14.9 with 0 wins and 0% Act 3 — the plateau is a floor, not a ceiling: not exploration, not capacity. (These predated the observation-corruption fix, so they also trained deck-blind — a second reason they couldn't move.)
Jun 10 Strategic pivot — training migrated to a headless C++ simulator A full project deep-dive confronted the core problem: after 21,000+ live-game training games and 0 wins, average floor had been flat at ~14.7 since game 3,000 — the agent is not capacity-limited, it is throughput-starved. Live modded STS over CommunicationMod runs at only ~90 games/hour, so every reward/architecture experiment took days-to-weeks to reach a verdict, and the reward function had grown to ~15 hand-tuned terms by trial-and-error (deck reward, BC-anchor cap, Option B, burst reward — several added then reverted). Research confirmed every RL agent that actually beats the game trains on a fast headless simulator, not the live game. Decision: migrate training onto a headless simulator (sts_lightspeed via the sts_gym Gymnasium fork — Ironclad, full-run, 1200-d observation incl. intents/powers/hand, 128 masked actions), reusing the PPO + fixed-seed-eval methodology and demoting the live-game rig to a periodic transfer-eval oracle. Built a process-separated training stack: env-worker processes import only the C++ extension while a torch trainer drives PPO across them over IPC — required both to use all 22 vCPUs (the sim is single-threaded) and to sidestep an in-process torch/extension native conflict. Hardened the fork along the way (boss unordered_map::at and getCardIdx out-of-bounds guards, observation carry-forward) and added retry-until-healthy worker supervision for an ASLR-dependent ~50% startup segfault in the fork. From-scratch PPO (no behavior cloning) drove sampled mean floor 4.15 (random) → 8.73 and still climbing in 91 seconds (52 updates, 427 games). Measured throughput ~17,000 games/hour on 8 workers (~190× the live game, with headroom to thousands/min via shared-memory IPC and more workers). This collapses the experiment loop from weeks to under an hour — the entire 19k-game live-game history is now ~1 hour of compute, the 30k "consistent-win" target ~2 hours — so compute is no longer the bottleneck; analysis/eval cadence is. Status: validated spike, not yet a production trainer (throughput unoptimized; the startup heisenbug is auto-handled but not yet root-caused).
Jun 10 Disk-fill outage — recovery, zone migration & log capping Training silently died ~Jun 9 01:49 when the 30 GB boot disk filled — 8 worker JVM logs at ~2 GB each (unbounded CommunicationMod state-JSON stdout). A full disk blocked the guest agent from writing SSH keys (SSH refused from both gcloud and the console) and crashed cloud-init; compounding it, us-west1-a ran out of spot capacity so the VM couldn't even restart. Recovery: snapshot the disk → migrate to us-west1-b (spot available) → grow the disk 30→60 GB → offline-repair the full filesystem on a throwaway rescue VM (growpart + resize2fs + delete 19 GB of logs). Root-cause fix: the monitor cron now caps any log over 200 MB to its last 20 MB (O_APPEND-safe, so the wedge-watchdog's mtime heartbeat still works), and a companion process rolls the per-fight detail log into per-(act, fight-type, result) aggregates once it grows large — keeping recent per-fight rows for analysis while bounding the file. Source-level follow-up: the worker JVM's verbose state-JSON stdout (the actual disk-filler) is now dropped at the source — the wedge-watchdog reads each Python worker's tiny heartbeat file instead of the log's mtime, so the multi-GB firehose no longer needs to be written at all. Cloud Scheduler repointed to the new zone. Training restored and self-healing again on a roomier disk. Casualty: the defensive-combat-reward experiment only logged ~581 games (Jun 8 18:00 → Jun 9 01:49) before the outage — far too few for a verdict (the value function was still re-adapting, block/dmg on lost fights had barely moved), so it effectively restarts now on the fixed VM.
Jun 8 Defensive combat reward (burst-death fix) The fight instrumentation (12,625 logged fights) showed Act 1/2 losses are burst, not attrition: lost fights are shorter than wins, one hit takes 45–75% of HP (vs ~32% in wins), and losers under-block (block/damage ~0.8 vs ~1.8 in wins). The agent over-values offense and fails to defend against telegraphed big hits. Three reward changes target this directly: (1) a super-linear surcharge on single-hit HP loss — coef·(hp_lost/max_hp)²·max_hp, capped — so one 30-HP hit costs far more than three 10-HP hits; (2) a reward for effective block — block generated to cover the telegraphed incoming damage (read from monster intents), paid only up to the incoming hit so over-blocking earns nothing; (3) both bounded (caps + threat-gated) so it defends without turtling and still kills. Pre-change checkpoint backed up; training continues from baseline under the new reward. The first reward change with the failure mode pinned by data rather than guessed. Verdict comes from re-running the same fight_detail analysis after ~3–5k games: if block/damage on lost fights rises and Act 1-boss / Act 2-elite win rates climb, the burst-death diagnosis was right and we push further on defense; if not, the failure is elsewhere in combat (e.g. damage scaling) and we re-target.
Jun 7 Option B verdict — deck-building is not the wall Trained ~3,700 games under the direct deck-quality reward + GRID anchor exemption. Result: flat. Progression tracked at-or-slightly-below baseline (floor 12.4 vs 12.8, Act 2 11% vs 14%, boss 24% vs 30% — sampled/noisy) with a small but consistent elite-WR uptick (~75% vs 70%). A repeat deck-vec ablation confirmed the model still acts on the deck (GRID picks flip 25% on zero, 58% on randomize). Reverted the reward/anchor changes and restored the pre-experiment checkpoint (the Option B policy was mildly worse on progression); kept both checkpoints as backups. Decisive negative result, and a valuable one: the agent reads the deck and builds marginally stronger decks (elites improved), but better decks do not translate into deeper runs — so the wall is downstream of deck composition, and we reverted rather than keep a slightly-worse policy. A failure analysis of the 200-game eval then pinpointed the real wall: 80% die in Act 1, the Act 1 boss WR is only 40%, and elite WR collapses from 75% (Act 1) to 10% (Act 2), with 72% of Act 2 deaths clustered at floors 20–23 (the first Act 2 elites/hallways). To learn whether those fights are lost to burst (needs block) or attrition (needs scaling), added per-fight instrumentation (turns, damage taken, max single hit, block gained) across normal/elite/boss fights — that data will drive a combat-focused reward redesign.
Jun 6 Deck-building verdict & Option B experiment Ran the planned 200-game greedy fixed-seed eval of the 717-d deck-vector model: statistically identical to the 585-d baseline on every metric (avg floor 14.2 vs 14.7, Act 2 20% vs 19%, boss WR 39% vs 38%, elite 71% vs 70%, 0 wins). To learn why a 132-dim observation change yielded zero behavioral gain, ran a deck-vec ablation on real decision states: zeroing the deck vector flips 30% of removal/upgrade picks and randomizing it flips 80% (vs a 23% hand-zero control), so the model genuinely reads and acts on the deck — it just makes heuristic-quality choices. Diagnosis: the deck reward was (1) potential-based, which is policy-invariant by design (Ng et al. 1999) and telescopes to Φfinal−Φinit — it cannot push toward a better deck, only a deck-conditional one; (2) only ~2% of the reward signal; and (3) the BC anchor actively pulled deck picks back to the heuristic. Option B experiment: replaced the potential shaping with a direct, asymmetric, capped deck-quality reward (gains ×5, losses ×2 so it is non-invariant, cumulative gain capped at 8/run to stop the agent farming deck quality instead of winning) and exempted GRID screens from the BC anchor (dropped 161 demos) so removal/upgrade can diverge from the heuristic. Pre-experiment checkpoint backed up. A decisive test of the deck-building thesis with a proven-responsive lever. If decks measurably improve and the wall moves → deck-building was a real lever worth pushing. If decks improve but floor/boss WR stay flat → the wall is conclusively Act 2 combat execution, not deck quality, and we pivot there. Verdict comes from re-running the same ablation + greedy eval after ~3–5k games.
Jun 3–4 Deck-vector training & tuning Tracked whether the new deck inputs are actually being learned via a custom diagnostic — the mean weight magnitude of the 132 new input columns vs the original 585 (ratio 0.14 → 0.59 and climbing). The zero-initialized deck inputs learned glacially at the checkpoint's converged lr (2.37e-5), so added an --override-lr flag and raised lr to 1e-4 (floored at 6e-5). At 6e-5 the policy ran hot (KL ~0.022, clip ~0.21) and the auto-tuner pushed the BC anchor to ~0.03 to stabilize it. Tried capping the anchor (auto-max-bc-coef 0.01) on the hypothesis it was over-anchoring to the heuristic — but training behavior then regressed (avg floor 12.9→12.0, Act 2 14%→10% over ~1,200 games), so reverted it: that ~0.03 anchor was stabilizing the hot policy near competent play, not capping its ceiling. Honest status: the deck vector is integrating well (ratio 0.59 = over half the original inputs' strength), but the sampled training-game floor — noisy and depressed by exploration entropy — hasn't broken from baseline yet; behavior change lags weight growth. A greedy fixed-seed eval is planned at ratio ~0.70 (~2k more games) for a clean read vs the 585-d baseline (38.1% boss WR). Lesson: don't over-tune on a noisy sampled-floor signal.
Jun 2 Learned deck-building (Path 2) Expanded the observation to 717-d with a 132-dim per-card deck count vector (over the full Ironclad pool), so the policy sees its exact deck, not just a 20-d aggregate. Moved card removal (purge) and upgrade selection from the heuristic to the RL policy. Replaced the flat per-removal (+0.2) and per-upgrade (+0.30) rewards with potential-based deck-quality shaping: reward Δ of mean card quality (upgrades boosted), so it's quality-weighted and context-dependent. Warm-transferred 585→717 (behavior preserved, zero-init new inputs), with a light BC anchor (fresh 717-d heuristic demos) and an --override-lr escape hatch to re-raise lr for learning the new inputs. Deck-building was previously unlearnable — the agent couldn't observe its deck or choose removals/upgrades. This makes it a learned skill, the key lever for the Act 2 wall. Deck-vector weights are integrating steadily (ratio 0.14→0.35 and climbing); behavior eval to follow.
Jun 1 Hands-off spot resilience Made unattended spot training self-recovering and auditable: a VM-side cron (vm/monitor.sh, .autorun-driven) continuously relaunches training after any death/clean-end/reboot and writes a 10-min heartbeat log; a Cloud Scheduler job restarts the VM after preemption; run_training.sh gained a per-worker watchdog (kill+relaunch a JVM whose log goes silent). Also fixed a BC-anchor deadlock (a checkpoint bc_coef=0 silently discarded the anchor) and a cron bug (pgrep -c || echo 0"0\n0") that disabled auto-resume. Training now runs constantly in 24h chunks and recovers from preemption in ~15–25 min with no human or session — only stops when explicitly told to.
May 30 Headless cloud deployment Ported the worker + trainer stack to a headless GCP c3-standard-22 spot VM (22 vCPU, no GPU). Added a one-shot installer (vm/install.sh) and headless launcher (vm/run_training.sh). Solved per-worker Xvfb + software GL, per-worker JVM tmpdir (SIGSEGV race), Java 8 pin, OpenAL path, CommunicationMod READY-before-import, 2 GB heap + 25-game restart (OOM fix), and spot preemption recovery. Unattended overnight training now runs in the cloud at ~90+ games/hour on 8 workers for a few dollars per run, freeing the desktop. Fixing a silent heap OOM lifted throughput from ~55 to ~90+ games/hour on the same hardware.
May 27 HP-urgency heal reward Added HP-urgency-scaled rest-site heal reward: 0.025 × hp_healed × (1 − hp_before/max_hp). Healing at 25% HP gives ~0.45 reward (beats 0.30 upgrade); healing at 75% HP gives ~0.15 (upgrade wins). Fixes the agent choosing upgrades over healing at critical HP (e.g. 23 HP before Act 1 boss). 200-game eval: boss WR jumped from 21.7% to 38.1%, Act 2 reach doubled from 13.5% to 20%.
May 22 Elite win bonus +4.0 Increased elite win bonus from +3.0 to +4.0, awarded on the next floor advance after an elite combat victory. Makes elite-seeking paths more clearly positive-EV for the RL policy. Elite fights were only marginally rewarded despite data showing 2+ elites double the boss win rate.
May 22 HP-scaled floor advance Replaced flat +0.75 floor advance reward with hybrid formula: 0.50 base + 0.25 × (HP / max HP). Preserves “progress matters” while rewarding healthy progression. Gives a dense per-floor signal that arriving at the boss at high HP is better than low HP, without punishing survival at low health.
May 21 Network upgrade Upgraded MLP from (256, 256) Tanh (~236K params) to (512, 256, 256) GELU (~504K params) via warm transfer. Existing weights preserved; new capacity initialized near identity. Doubles representational capacity to break the plateau at ~15 avg floor. 1,300+ games overnight confirmed warm transfer preserved behavior with no regression.
May 19 Boss reward shaping Added per-boss combat signals for all Act 1–3 bosses: Guardian (Sharp Hide penalty), Hexaghost (big-hit penalty), Slime Boss (overkill bonus past 50% HP), Bronze Automaton (Hyper Beam penalty), Champ (enraged penalty). Priority kill targets for Donu, TorchHead, and BronzeOrb. Boss kill reward: +8 base + up to +8 scaled by HP preserved. Gives the RL policy direct feedback on boss-specific mechanics instead of only a binary win/loss signal.
May 19 BC anchor decay Accelerated auto-decay: fast decay 0.90→0.85, slow decay 0.98→0.95, floor lowered from 0.01→0.001. Auto-tune now oscillates BC coefficient between 0.001–0.009. Lets the RL policy escape the heuristic faster. Caused a temporary boss conversion dip as the policy explores beyond heuristic habits.
May 18 Heuristic overhaul Reworked card tier scoring, added Battle Trance diminishing returns (S-tier first copy, penalized duplicates), improved event handler logic, and refined boss relic pick priorities. Better heuristic demonstrations for BC anchor.
May 18 Infrastructure Reduced workers 7→5 (eliminated ~48 stale rollouts/update→0). Added JVM heap limiter per instance. STS restart cycling for memory leak prevention. Every rollout now trains on the current policy version. Training throughput is more efficient despite fewer workers.

Decision Architecture — mainline_v3

The deployed simulator agent is a hybrid. Combat is played by 1-ply replay search (each legal action rolled to the end of the fight, best score taken). Non-combat decisions default to a trained policy (the from-scratch simulator PPO net, policy_varE) with narrow, diagnosed macro overrides only on the screens where measurement found a specific deficiency — each override gated and reversible via an env toggle. This supersedes the live-game 717-d RL deck-builder shown in the historical era above (that agent never won).

DecisionHandlerNotes
Combat (play card / end turn)1-ply replay searchRollout teacher over net policy_varN (Act-1 + harvested Act-2/3); boss 75–88% vs 44% feed-forward
Card reward take / skipMacro override + trained policyPremium-only hygiene + AoE/draw role gap-filler (ROLE_SCORE); defers to the policy otherwise
Card removal (grid)Macro overrideRemove basic Strikes/Defends once the deck is developed
Rest vs smithMacro override (conservative smith)Smith only at HP ≥ 85% (≥ 95% pre-boss), else rest (SMITH) — no HP cost
Smith target (which card)Macro override (tempo scorer)New (v3): upgrade highest-tempo card — premium attack > block > AoE > … (SMITH_TARGET); was the first card in deck order = a Strike
ShopMacro overrideOne card removal, suppress filler card-buys; relic-buying off (diagnosed neutral at power)
Map pathingTrained policy (varE)Elite/path gating was diagnosed a no-op (boss-entry HP already ~88%); left to the policy
Boss relics / eventsTrained policy (varE)No measured deficiency — no override