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).
| Stage | Eval | Avg floor | Wins | What changed |
|---|---|---|---|---|
| Live-game PPO plateau | 200 | 14.7 | 0 | The universal wall — ~21,700 games, 0 wins (charted below). |
| + search combat | 48 | 26.4 | 0 | 1-ply search at combat decisions only — combat was the wall (Act-3 reached, max floor 50). |
| + deck hygiene | 150 | 23.6 | 5 | Remove basics / skip filler / suppress shop bloat — project's first wins. |
| mainline_v2 (+varN combat, +AoE/draw scorer, +conservative smith) | 150 | 24.9 | 7 | First winning agent; Act-2/3 combat retrain + role gap-filler + HP-safe smithing. |
| mainline_v3 (+tempo-targeted smith) | 150 | 26.1 | 9 | Upgrade 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
| Date | Area | Change | Impact |
|---|---|---|---|
| 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).
| Decision | Handler | Notes |
|---|---|---|
| Combat (play card / end turn) | 1-ply replay search | Rollout teacher over net policy_varN (Act-1 + harvested Act-2/3); boss 75–88% vs 44% feed-forward |
| Card reward take / skip | Macro override + trained policy | Premium-only hygiene + AoE/draw role gap-filler (ROLE_SCORE); defers to the policy otherwise |
| Card removal (grid) | Macro override | Remove basic Strikes/Defends once the deck is developed |
| Rest vs smith | Macro 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 |
| Shop | Macro override | One card removal, suppress filler card-buys; relic-buying off (diagnosed neutral at power) |
| Map pathing | Trained policy (varE) | Elite/path gating was diagnosed a no-op (boss-entry HP already ~88%); left to the policy |
| Boss relics / events | Trained policy (varE) | No measured deficiency — no override |