← Back to Runs
Run Detail
ddd65763-2585-45ad-b058-ba92770a3c20
Started22/06/2026, 06:12:56
Git SHA0c8b2ac8
Statedirty
Avg Error %0.21%
BH Sig Count4
Total Cases178
Passing159
Run Report—
Code Changes Since Previous Run
Index: simulator/config/hero_definitions/Ahmose.json===================================================================--- simulator/config/hero_definitions/Ahmose.json prev run+++ simulator/config/hero_definitions/Ahmose.json this run@@ -98,9 +98,9 @@"source": "infantry"},"effects": {"BladeOfLight/1": {- "type": "active.hero.damage.up",+ "type": "active.hero.lethality.up","value": [12,24,36,@@ -109,15 +109,12 @@],"units": {"applies_to": ["infantry"- ],- "applies_vs": [- "target"]},"duration": {- "type": "attack",+ "type": "turn","value": 1}},"BladeOfLight/2": {@@ -129,14 +126,13 @@20,25],"units": {- "applies_to": "target"+ "applies_to": "trigger.source"},"duration": {"type": "turn",- "value": 1,- "delay": 1+ "value": 1},"same_effect_stacking": "add"}}Index: simulator/config/hero_definitions/Renee.json===================================================================--- simulator/config/hero_definitions/Renee.json prev run+++ simulator/config/hero_definitions/Renee.json this run@@ -12,9 +12,9 @@"target": "enemy"},"effects": {"NightmareTrace/1": {- "type": "type.normal.damage.up",+ "type": "active.hero.damage.up","value": [40,80,120,Index: simulator/config/hero_definitions/Wayne.json===================================================================--- simulator/config/hero_definitions/Wayne.json prev run+++ simulator/config/hero_definitions/Wayne.json this run@@ -122,10 +122,9 @@100,100],"units": {- "applies_to": "trigger.source",- "applies_vs": "trigger.target"+ "applies_to": "trigger.source"},"duration": {"type": "attack","value": 1Index: simulator/src/simulator.test.ts===================================================================--- simulator/src/simulator.test.ts prev run+++ simulator/src/simulator.test.ts this run@@ -5,11 +5,34 @@import { loadSimulatorConfig } from "./config";import { createSeededRng, chancePasses } from "./effects";import { applyHeroGenerationStats, resolveFighter } from "./resolve";-import { simulateBattle, signedRemainingScore } from "./simulator";+import { prepareBattle, runPrepared, simulateBattle, signedRemainingScore } from "./simulator";import type { BattleInput, EffectIntentDefinition, ResolvedSkill, SimulatorConfig, SkillFile, UnitType } from "./types";+test("runPrepared reuses the compiled input seed when no override is supplied", () => {+ const config = loadSimulatorConfig();+ const stats = {+ inf: { attack: 200, defense: 200, lethality: 150, health: 150 },+ lanc: { attack: 200, defense: 200, lethality: 150, health: 150 },+ mark: { attack: 200, defense: 200, lethality: 150, health: 150 }+ };+ const input: BattleInput = {+ seed: "runprepared-seed-regression",+ attacker: { troops: { infantry_t6: 5000, lancer_t6: 3000, marksman_t6: 4000 }, stats, heroes: { Mia: { skill_1: 5, skill_2: 5, skill_3: 5 } } },+ defender: { troops: { infantry_t6: 5000, lancer_t6: 3000, marksman_t6: 4000 }, stats, heroes: { Greg: { skill_1: 5, skill_2: 5 } } }+ };+ const direct = simulateBattle(input, config);+ // Only meaningful if chance triggers make the round loop seed-sensitive.+ assert.equal(direct.randomness.deterministic, false, "expected a stochastic battle");+ // runPrepared with no seed override must reproduce simulateBattle using the compiled input seed,+ // not silently fall back to the default seed.+ const prepared = runPrepared(prepareBattle(input, config));+ assert.equal(prepared.winner, direct.winner);+ assert.equal(prepared.rounds, direct.rounds);+ assert.deepEqual(prepared.remaining, direct.remaining);+});+test("simulateBattle returns structured result for a no-hero battle", () => {const config = loadSimulatorConfig();const result = simulateBattle({Index: simulator/src/simulator.ts===================================================================--- simulator/src/simulator.ts prev run+++ simulator/src/simulator.ts this run@@ -111,9 +111,12 @@return { input, config, fighters, template, deterministicBattleStart };}export function runPrepared(compiled: CompiledBattle, seed?: string | number, options: SimulationOptions = {}): BattleResult {- return buildBattleResult(runBattle({ ...compiled.input, seed }, compiled.config, options, compiled));+ // Only override the compiled input's seed when a seed is explicitly supplied; spreading an+ // undefined seed would otherwise clobber compiled.input.seed and silently lose reproducibility.+ const runInput = seed === undefined ? compiled.input : { ...compiled.input, seed };+ return buildBattleResult(runBattle(runInput, compiled.config, options, compiled));}function buildBattleResult(run: BattleRun): BattleResult {const { fighters, runtime } = run;Index: simulator/src/testcases.ts===================================================================--- simulator/src/testcases.ts prev run+++ simulator/src/testcases.ts this run@@ -434,9 +434,12 @@initialTroops: number;deterministic: boolean;thresholds?: Record<string, number>;}): InternalStatAdjustment | undefined {- if (!options.deterministic || options.game.bias_raw === 0) return undefined;+ // Deterministic cases correct any nonzero bias; stochastic cases correct only outright misses.+ // Either way a nonzero bias is needed to pick a search direction.+ const shouldCorrect = options.deterministic ? options.game.bias_raw !== 0 : !options.game.passes;+ if (!shouldCorrect || options.game.bias_raw === 0) return undefined;const direction = -Math.sign(options.game.bias_raw);const maxCandidate = evaluateStatAdjustment(options, direction * STAT_ROUNDING_MAX_ADJUSTMENT);let best = maxCandidate;if (maxCandidate.mode === "deterministic_exact") return maxCandidate;
Show Raw Dirty State Patch (vs Clean Baseline)
diff --git a/shared/fighters_data/fighters_stats.json b/shared/fighters_data/fighters_stats.json--- a/shared/fighters_data/fighters_stats.json+++ b/shared/fighters_data/fighters_stats.json@@ -4,6 +4,11 @@"lanc": [1400.98, 1432.28, 1756.8, 1722.5],"mark": [1400.98, 1431.28, 1806.4, 1785.4]},+ "custom": {+ "inf": [1370.6, 1380.5, 1706.7, 1864.7],+ "lanc": [1370.6, 1380.5, 1820.4, 1669.3],+ "mark": [1370.6, 1380.5, 1910.9, 1732.9]+ },"daut": {"inf": [9.94,diff --git a/simulator/config/hero_definitions/Ahmose.json b/simulator/config/hero_definitions/Ahmose.json--- a/simulator/config/hero_definitions/Ahmose.json+++ b/simulator/config/hero_definitions/Ahmose.json@@ -24,7 +24,7 @@}},"ViperFormation/2": {- "type": "active.hero.defense.up",+ "type": "active.hero.damageTaken.down","value": [10,15,@@ -46,7 +46,7 @@"same_effect_stacking": "max"},"ViperFormation/3": {- "type": "active.hero.defense.up",+ "type": "active.hero.damageTaken.down","value": [10,25,@@ -75,7 +75,7 @@},"effects": {"PrayerOfFlame/1": {- "type": "active.hero.lethality.up",+ "type": "active.hero.damage.up","value": [20,40,@@ -113,12 +113,12 @@]},"duration": {- "type": "attack",+ "type": "turn","value": 1}},"BladeOfLight/2": {- "type": "active.hero.defense.down",+ "type": "active.hero.damageTaken.up","value": [5,10,@@ -127,12 +127,11 @@25],"units": {- "applies_to": "target"+ "applies_to": "trigger.source"},"duration": {"type": "turn",- "value": 1,- "delay": 1+ "value": 1},"same_effect_stacking": "add"}diff --git a/simulator/config/hero_definitions/Bradley.json b/simulator/config/hero_definitions/Bradley.json--- a/simulator/config/hero_definitions/Bradley.json+++ b/simulator/config/hero_definitions/Bradley.json@@ -28,7 +28,7 @@},"effects": {"PowerShot/1": {- "type": "active.hero.lethality.up",+ "type": "type.all.damage.up","value": [6,12,@@ -43,7 +43,7 @@}},"PowerShot/2": {- "type": "active.hero.lethality.up",+ "type": "type.all.damage.up","value": [5,10,@@ -67,7 +67,7 @@},"effects": {"TacticalAssistance/1": {- "type": "active.hero.lethality.up",+ "type": "active.hero.damage.up","value": [6,12,diff --git a/simulator/config/hero_definitions/Edith.json b/simulator/config/hero_definitions/Edith.json--- a/simulator/config/hero_definitions/Edith.json+++ b/simulator/config/hero_definitions/Edith.json@@ -25,7 +25,7 @@}},"StrategicBalance/2": {- "type": "active.hero.lethality.up",+ "type": "active.hero.damage.up","value": [4,8,diff --git a/simulator/config/hero_definitions/Flint.json b/simulator/config/hero_definitions/Flint.json--- a/simulator/config/hero_definitions/Flint.json+++ b/simulator/config/hero_definitions/Flint.json@@ -10,7 +10,7 @@},"effects": {"Pyromaniac/1": {- "type": "active.hero.lethality.up",+ "type": "active.hero.damage.up","value": [20,40,diff --git a/simulator/config/hero_definitions/Greg.json b/simulator/config/hero_definitions/Greg.json--- a/simulator/config/hero_definitions/Greg.json+++ b/simulator/config/hero_definitions/Greg.json@@ -17,7 +17,7 @@},"effects": {"SwordOfJustice/1": {- "type": "active.hero.lethality.up",+ "type": "active.hero.damage.up","value": [8,16,diff --git a/simulator/config/hero_definitions/Gwen.json b/simulator/config/hero_definitions/Gwen.json--- a/simulator/config/hero_definitions/Gwen.json+++ b/simulator/config/hero_definitions/Gwen.json@@ -10,7 +10,7 @@},"effects": {"EagleVision/1": {- "type": "active.hero.defense.down",+ "type": "active.hero.damageTaken.up","value": [5,10,diff --git a/simulator/config/hero_definitions/Hector.json b/simulator/config/hero_definitions/Hector.json--- a/simulator/config/hero_definitions/Hector.json+++ b/simulator/config/hero_definitions/Hector.json@@ -40,7 +40,7 @@},"effects": {"Rampant/1": {- "type": "active.hero.lethality.up",+ "type": "active.hero.damage.up","value": [100,125,@@ -65,7 +65,7 @@}},"Rampant/2": {- "type": "active.hero.lethality.up",+ "type": "active.hero.damage.up","value": [20,40,diff --git a/simulator/config/hero_definitions/Jeronimo.json b/simulator/config/hero_definitions/Jeronimo.json--- a/simulator/config/hero_definitions/Jeronimo.json+++ b/simulator/config/hero_definitions/Jeronimo.json@@ -47,7 +47,7 @@},"effects": {"EXpertSwordsmanship/1": {- "type": "active.hero.lethality.up",+ "type": "active.hero.damage.up","value": [6,12,diff --git a/simulator/config/hero_definitions/Norah.json b/simulator/config/hero_definitions/Norah.json--- a/simulator/config/hero_definitions/Norah.json+++ b/simulator/config/hero_definitions/Norah.json@@ -26,7 +26,7 @@}},"CombinedArms/2": {- "type": "active.hero.lethality.up",+ "type": "active.hero.damage.up","value": [3,6,@@ -96,7 +96,7 @@},"effects": {"Momentum/1": {- "type": "active.hero.lethality.up",+ "type": "active.hero.damage.up","value": [5,10,diff --git a/simulator/config/hero_definitions/Renee.json b/simulator/config/hero_definitions/Renee.json--- a/simulator/config/hero_definitions/Renee.json+++ b/simulator/config/hero_definitions/Renee.json@@ -7,11 +7,13 @@"description": "Troops place Dream Marks on targets every two turns, dealing extra Lancer damage once next turn","trigger": {"type": "turn",- "every": 2+ "every": 2,+ "source": "self.lancer",+ "target": "enemy"},"effects": {"NightmareTrace/1": {- "type": "extra_skill_attack",+ "type": "active.hero.damage.up","value": [40,80,@@ -20,23 +22,15 @@200],"units": {- "applies_to": [- "lancer"- ],- "applies_vs": "any"+ "applies_to": "lancer",+ "applies_vs": "target"},"duration": {"type": "attack","value": 1,"delay": 1},- "same_effect_stacking": "max",- "trigger_damage_jobs": [- {- "source": "use.source",- "target": "use.target"- }- ]+ "same_effect_stacking": "max"}}},@@ -44,11 +38,13 @@"description": "Dream Marks highlight enemy vulnerabilities, increasing damage dealt by Lancers to marked targets","trigger": {"type": "turn",- "every": 2+ "every": 2,+ "source": "self.lancer",+ "target": "enemy"},"effects": {"Dreamcatcher/1": {- "type": "active.hero.lethality.up",+ "type": "active.hero.damage.up","value": [30,60,@@ -57,10 +53,8 @@150],"units": {- "applies_to": [- "lancer"- ],- "applies_vs": "any"+ "applies_to": "lancer",+ "applies_vs": "target"},"duration": {"type": "turn",@@ -76,11 +70,12 @@"trigger": {"type": "turn","every": 2,- "source": "self.any"+ "source": "self.lancer",+ "target": "enemy"},"effects": {"Dreamslice/1": {- "type": "active.hero.defense.down",+ "type": "type.all.damage.up","value": [15,30,@@ -89,8 +84,8 @@75],"units": {- "applies_to": "target",- "applies_vs": "any"+ "applies_to": "any",+ "applies_vs": "target"},"duration": {"type": "turn",diff --git a/simulator/config/hero_definitions/Wayne.json b/simulator/config/hero_definitions/Wayne.json--- a/simulator/config/hero_definitions/Wayne.json+++ b/simulator/config/hero_definitions/Wayne.json@@ -28,7 +28,7 @@"type": "attack","value": 1},- "same_effect_stacking": "max",+ "same_effect_stacking": "add","trigger_damage_jobs": [{"source": "use.source",@@ -123,8 +123,7 @@100],"units": {- "applies_to": "trigger.source",- "applies_vs": "trigger.target"+ "applies_to": "trigger.source"},"duration": {"type": "attack",diff --git a/simulator/config/hero_definitions/WuMing.json b/simulator/config/hero_definitions/WuMing.json--- a/simulator/config/hero_definitions/WuMing.json+++ b/simulator/config/hero_definitions/WuMing.json@@ -48,7 +48,7 @@},"effects": {"CrescentUplift/1": {- "type": "active.hero.lethality.up",+ "type": "active.hero.damage.up","value": [4,8,
Accuracy Results
178 / 178