J2: sim picker casts+consumes; T5 raid-content warning

The post-J1 sweep had the casters clustered at 19–22% L12 clear, vs
martials at 70–80%. A per-round trace across 240 boss-room fights showed
why: autoResolveCombat dispatched !attack only — zero spell_casts, zero
mid-fight consumable uses across every caster class. The entire "caster
cliff" was the sim measuring a strawman where casters couldn't cast.

J2a teaches the sim's autoResolveCombat to mirror a competent prod
player: heal at low HP if an inventory consumable is available, otherwise
cast the highest-EV damage spell (slot or cantrip), otherwise swing.
BuildCharacter now seeds the known-spell list via ensureSpellsForCharacter
so the synthetic spellbook is populated. A -trace flag on the cmd
attaches the raw CombatEvent stream to the last combat of each run for
post-hoc diagnostics.

A first re-baseline (n=100, all 10 classes) showed Ranger regressed
-35.8pp — the picker was burning L3 slots on lightning_arrow when
Ranger's weapon chassis (Hunter's Mark + Extra Attack) was the better
play. Added simMartialFirstClass to gate the picker off for Ranger and
Paladin (whose default kit is also weapon-first / no damage spells).
J2c experimented with widening the picker to control + heal spells;
heal-spell preempt cost druid 10pp (slot heals are 10HP vs 40HP
consumables) and control-spell scoring at 22 cost warlock 6.6pp. Both
reverted. Corpora retained under baseline_j2c*.jsonl for the post-mortem
in sim_results/j2b_findings.md.

Post-J2 L12 leaderboard (baseline_j2a_v2_all10.jsonl, n=100):
  fighter 80.0, ranger 80.0, paladin 78.4, rogue 76.8,
  druid 61.6, mage 53.4, sorcerer 50.6, warlock 48.2,
  bard 40.4, cleric 39.0.

The caster cluster is dissolved; martials are within ±5pp of J1 (sweep
noise). Bard/cleric still trail, but it's no longer a sim artifact —
their defaultKnownSpells damage rosters cap at L2 and the picker can't
pick spells they don't have. That's a prod-level fix, deferred.

J3 trace (sim_results/j3_findings.md): T5 dragons_lair walls every solo
class at 0% (Infernax 546 HP vs solo player HP 110–175; ~25% boss HP
eaten before TPK across all classes). Per the J3 plan menu, this is
party-shaped content the engine doesn't yet have parties for. Surface
a TwinBee-voiced heads-up in handleDnDExpeditionCmd's start path and a
matching tag in !expedition list — players see "raid-shaped — solo
runs not yet survivable" before they spend outfitting coin. No combat
or class balance changes.

Files: cmd/expedition-sim/main.go +trace flag; expedition_sim.go picker
+ SimCombatSummary.Events + spellbook seed; dnd_expedition_cmd.go
raidContentWarning + list tag. All baselines + traces + findings
checked in under sim_results/.
This commit is contained in:
prosolis
2026-05-17 15:43:41 -07:00
parent 519964fb01
commit f2c2d774d4
24 changed files with 158396 additions and 21 deletions

View File

@@ -41,9 +41,13 @@ func main() {
levels = flag.String("levels", "", "comma-separated levels (matrix mode)")
zones = flag.String("zones", "", "comma-separated zone ids (matrix mode)")
runs = flag.Int("runs", 1, "replicates per (class,level,zone) cell (matrix mode)")
trace = flag.Bool("trace", false, "include raw per-round CombatEvent stream on the LAST combat of each expedition (boss room) — for J2 diagnostic sweeps")
)
flag.Parse()
plugin.SetSimIncludeTrace(*trace)
if *matrix {
// Matrix default: drop log to keep stdout manageable; explicit
// -log=true overrides.

View File

@@ -215,28 +215,57 @@ Before any tuning, freeze a reproducible baseline:
**Definition of done:** Fighter L12 manor clears jump from 0% to **≥50%** at n=30; T2 forest clears stay ≥80% (don't break the leader); T4 underdark clears non-zero.
### J2 — Mage T2+ wall
### J2 — Caster boss-survival cliff
**Hypothesis menu:**
**Scope (reframed 2026-05-17 after post-J1 n=100 sweep, `sim_results/baseline_j1_all10.jsonl`):** five caster classes — **mage, cleric, sorcerer, warlock, bard** — all cluster at 1922% L12 mean %clr across the 5 zones, vs four martial leaders (fighter/ranger/paladin/rogue) at 7080%. They reach the boss room 6282% of the time but TPK there. So the gap is **boss-fight burst/durability**, not zone traversal.
1. **No defensive layer.** Mage AC = 10 + DEX (no armor proficiency). At T2+ monster Attack, 70%+ hit rate every round.
2. **Slot economy.** L7 mage has 4 L1 + 3 L2 + 2 L3 slots — enough for one elite, not a manor's worth.
3. **No Shield spell auto-cast.** 5e Mage gets `Shield` (reaction: +5 AC until next turn). Verify it exists and fires.
4. **Mage Armor not active.** `Mage Armor` (+3 AC for 8h) should be a pre-walk default; check whether the autopilot starts it.
Druid sits between the bands at 39% L12 clr (88% boss-reach) — the only mid-band class — because Wild Shape gives a real HP buffer. That's the diagnostic: the trailers lack a durability or burst lever that pulls them through the final fight.
**Cell snapshot (L12, %clr | %boss):**
| Class | goblin (T1) | forest (T2) | manor (T3) | underdark (T4) | dragons (T5) |
|----------|-------------|-------------|------------|----------------|--------------|
| mage | 100\|100 | 0\|99 | 0\|63 | 0\|56 | 0\|68 |
| cleric | 93\|93 | 0\|87 | 0\|70 | 0\|8 | 0\|50 |
| sorcerer | 100\|100 | 0\|97 | 0\|57 | 0\|38 | 0\|60 |
| warlock | 100\|100 | 7\|100 | 0\|71 | 0\|62 | 0\|78 |
| bard | 100\|100 | 8\|100 | 0\|70 | 0\|66 | 0\|74 |
| *druid (ref)* | *100\|100* | *93\|100* | *0\|74* | *90\|100* | *0\|78* |
Cleric is doubly broken: lowest boss-reach (62% mean) **and** lowest clear (19%) — pure-support kit doesn't carry solo expeditions even before the boss.
**Hypothesis menu (cheapest first):**
1. **Damage falls off a cliff at mid-level boss HP.** L12 boss HP grows ~linearly; cantrip damage scales (Fire Bolt 2d10 at L11) but slot-spell burst is gated by 23 high-level slots used earlier in the zone. Trace `EnemyHPEnd` at TPK across the 5 classes vs druid.
2. **No durability backstop.** Druid (Wild Shape ≈ +temp HP pool) clears 39%; the five trailers have no equivalent. Mage's `Shield` reaction and `Mage Armor` may already exist but aren't firing in turn-engine boss rooms — verify.
3. **Slot/resource economy.** L7/L12 casters reach boss with slots spent; H5 partial short-rest refresh (already planned) is the obvious lever and might solo-fix several of the five.
4. **Cleric class identity.** Bottom-of-band even at boss-reach. Whatever differentiated cleric from "AC 16 melee with no Extra Attack" probably isn't wired into turn engine (e.g. Channel Divinity, Spiritual Weapon auto-cast).
**Investigation steps:**
- Grep for `MageArmor|ShieldSpell|mageArmor`. If they exist, why doesn't the sim cast them?
- Trace a single mage L7 manor run: does the character ever cast a defensive spell?
- Check `dnd_spells.go` for any auto-cast pre-combat hook the sim could opt into.
- Pull per-round combat traces from boss rooms for mage/cleric/sorc/warlock/bard at L12 manor and underdark. Look at: did a slot spell ever fire? did a reaction fire? what was player HP when boss died vs when player died?
- Grep `Shield\b|MageArmor|SpiritualWeapon|ChannelDivinity|EldritchBlast|HealingWord` for existing wiring; check whether each fires from `combat_turn_engine.go` paths.
- Cross-check whether the J1 [[project_j1_turn_engine_fix]] turn-engine seam exposed any *caster* wiring that was previously only firing in `SimulateCombat`. If yes, that's the cheapest fix: same pattern.
- Compare druid L12 underdark trace (90% clr) to cleric L12 underdark (0% clr / 8% boss-reach) — what's druid doing that cleric isn't?
**Likely levers:**
**Findings (2026-05-17 trace sweep, `sim_results/j2_findings.md`):** zero slot casts and zero mid-fight consumable uses across 240 boss-room combats. `autoResolveCombat` dispatches `!attack` only — the entire caster-cliff diagnosis was built on a strawman where casters couldn't cast and didn't quaff heals. Druid's outperformance is its `ThornLashDmg` passive firing on the weapon-attack path, not Wild Shape durability (Wild Shape isn't wired into autoResolveCombat at all). Reaction-spell hypothesis is also moot: `dnd_spells.go` skips reaction-cast spells globally — no reaction window exists yet. Hypothesis 3 (slot economy) is confirmed-but-inverted: casters reach boss with slots intact because the sim refuses to spend them.
- **Wire Mage Armor as a long-rest auto-buff** when not already active and the mage has spell slots. Production characters benefit too.
- **Add Shield-spell reaction** in combat: if available slot + about-to-be-hit + AC < threshold, burn a L1 slot for +5 AC. Reaction-based survival lever 5e mages depend on.
- **Slot economy:** H5 partial short-rest refresh (already in this plan) helps mage longevity directly. May land alongside J2 if it's the cleanest fix.
**Reframed levers (replaces the original menu):**
**Definition of done:** Mage L12 forest clears ≥60%; manor clears non-zero; T1 yield density doesn't drop more than 10%.
- **J2a — Teach `autoResolveCombat` to cast and consume.** Before each `!attack`, mirror the prod player decision: heal at low HP if a heal consumable is in inventory; otherwise cast the highest-impact available slot/cantrip; fall back to weapon swing. Class-blind first cut is fine — pick by damage-vs-remaining-enemy-HP, with a small heal-trigger at player HP < ~40%. Surface: `expedition_sim.go:530`. Heal-side mirrors `combat_bridge.go`'s `SelectConsumables`.
- **J2b — Re-baseline.** Re-run the n=100 all-class corpus with the fixed `autoResolveCombat`. The current `baseline_j1_all10.jsonl` cell numbers do not measure caster boss-survival; they measure "caster forced to swing a stick". Only after J2b do we have a real read on whether a class-level lever is needed.
- *Deferred until after J2b's real read:* shared boss-room cushion, cleric-specific intervention, H5 short-rest refresh wired to J2. Don't pre-commit balance changes against a strawman.
- *Out of scope:* reaction-spell wiring — the reaction phase doesn't exist; lifting that ban is its own surface (post-J2).
- *Avoid:* per-class HP/AC stat riders. Per accessibility-over-crunch, prefer surfacing a verb (cast, ward, channel) over inflating numbers.
**Definition of done (reframed 2026-05-17):**
- **J2a:** at least one of {slot cast, cantrip cast, mid-fight heal-consumable} fires in ≥80% of boss-room fights for every caster class in a small (n≥10) verification sweep. ✅ **MET** — 100% cast rate in `sim_results/j2a_findings.md`.
- **J2b:** new `sim_results/baseline_j2a_v2_all10.jsonl` (n=100). 3 of 5 trailer casters cleared the floor: mage 49% / sorcerer 47% manor at L12 (>40%). Warlock 34%, bard 2%, cleric 9% — these three are now spell-pool-bottlenecked, not sim-artifact-bottlenecked. Writeup: `sim_results/j2b_findings.md`.
- *No martial leader cell drops by more than 10pp from `baseline_j1_all10.jsonl`* — ✅ **MET** (all +0.4 to +6.2pp). Required adding `simMartialFirstClass` after a v1 sweep showed Ranger regressed -35.8pp when the picker burned L3 slots; the gate skips cast-mode for half-caster martials.
**J2c — tried + reverted 2026-05-17.** Both proposed widening levers regressed: heal-spell preempt cost druid 10pp (slot heals are 10HP vs 40HP consumables); control-spell scoring at 22 cost warlock 6.6pp (hypnotic_pattern beat vampiric_touch wrongly), and at 5 the level-first sort made it inert. Picker reverted to the J2b shape. Bard/cleric trailing is a prod-level `defaultKnownSpells` problem (their damage rosters cap at L2), not a sim-picker problem — separate decision. Corpora `baseline_j2c_all10.jsonl` and `baseline_j2c_v2_all10.jsonl` retained for the post-mortem in `sim_results/j2b_findings.md`.
T5 dragons_lair stays J3's problem — J2 isn't on the hook for it. (J2a will partially overlap J3 hypothesis 1, which already flagged this exact sim-artifact for T5.)
### J3 — T5 boss universal wall
@@ -274,9 +303,9 @@ After each of J1/J2/J3 lands:
J0 first — n=10 noise floor is too high to read 10pp movements; without a tighter baseline we'll chase ghosts.
J1 and J2 are independent and can ship in either order. J1 is probably easier (Second Wind is a well-understood beat); J2 has more design surface (auto-cast policy, Shield-spell reactions). If only one ships, J1 has the cleaner DoD.
J1 shipped 2026-05-17 (commit 519964f) — turn-engine Extra Attack wired. J2 is now reframed (above) from "Mage walls" to a five-class caster boss-survival problem spanning mage/cleric/sorc/warlock/bard; investigation may share a lever or split into per-class fixes after the per-round trace. Cleric likely needs its own intervention regardless.
J3 can ship in parallel with J1/J2. If sim-artifact, fix is in expedition_sim.go and doesn't touch balance. If a real wall, depends on J1/J2 outcomes — a buffed Fighter or Mage might already reach the boss-doorway more often.
J3 can ship in parallel with J2. If sim-artifact, fix is in expedition_sim.go and doesn't touch balance. If a real wall, depends on J2 outcomes — a more durable caster reaching the boss room with slots intact might already reach the boss-doorway more often.
J4 is the gate. Don't merge a class buff without the validation matrix showing the leader didn't regress.
@@ -285,7 +314,7 @@ After Phase J converges, return to H4 with a meaningful baseline.
### Open questions (J phases)
- **Sim party scaling.** Sim character = solo player, party of 4, or band? Production is solo. Tune for solo or we make group play trivial. Document the choice.
- **Subclass coverage.** Sim builds vanilla-class synthetics (no subclass). Subclass passives at L3+ probably matter a lot for Fighter and Mage. Pick a "best" subclass for the sim or sweep across subclasses in a separate pass.
- **Subclass coverage.** Sim builds vanilla-class synthetics (no subclass). Subclass passives at L3+ probably matter a lot — particularly for the five J2 trailers where the subclass often *is* the survival kit (e.g. Bard College of Valor's extra attack, Cleric domains' bonus-action burst). Pick a "best" subclass per class for the sim or sweep across subclasses in a separate pass before pre-committing J2 levers.
- **Mage Armor as auto-buff.** Player-side spell they cast, or a passive we toggle? Auto-toggling preserves accessibility-over-crunch but removes a (small) tactical decision. Probably worth auto-toggling and noting it in per-class help.
- **Boss consumable refresh.** At T5 elite gates, should the autopilot offer a "rest and re-stock" prompt before the boss? Mirrors real-game tension; closes the sim/prod gap.

View File

@@ -116,8 +116,12 @@ func (p *AdventurePlugin) expeditionCmdList(ctx MessageContext, c *DnDCharacter)
var b strings.Builder
b.WriteString(fmt.Sprintf("**Expeditions available at L%d** (you can enter zones up to 2 tiers above your current tier):\n\n", c.Level))
for i, z := range zones {
b.WriteString(fmt.Sprintf("**%d.** %s — _T%d, L%d%d_ `!expedition start %s`\n",
i+1, z.Display, int(z.Tier), z.LevelMin, z.LevelMax, z.ID))
suffix := ""
if raidContentWarning(z.ID) != "" {
suffix = " _⚠ raid-shaped — solo runs not yet survivable_"
}
b.WriteString(fmt.Sprintf("**%d.** %s — _T%d, L%d%d_ `!expedition start %s`%s\n",
i+1, z.Display, int(z.Tier), z.LevelMin, z.LevelMax, z.ID, suffix))
b.WriteString(fmt.Sprintf(" %s\n", z.Atmosphere))
}
if exp, _ := getActiveExpedition(ctx.Sender); exp != nil {
@@ -269,10 +273,31 @@ func (p *AdventurePlugin) expeditionCmdStart(ctx MessageContext, c *DnDCharacter
b.WriteString(startLine)
b.WriteString("\n\n")
}
if w := raidContentWarning(zoneID); w != "" {
b.WriteString(w)
b.WriteString("\n\n")
}
b.WriteString("Use `!expedition status` for the daily briefing format. Day 1 begins now.")
return p.SendDM(ctx.Sender, b.String())
}
// raidContentWarning returns a TwinBee-voiced heads-up for zones whose
// boss is tuned for a party rather than a solo adventurer. T5 zones
// (Dragon's Lair / Abyss Portal) have boss HP / damage curves that the
// solo combat path can't realistically clear — the J3 trace sweep at
// L12 showed 0% solo clears across all 10 classes. Until multiplayer
// expeditions ship, this is the surface that tells a player what
// they're walking into without nerfing the encounter for parties later.
func raidContentWarning(zoneID ZoneID) string {
switch zoneID {
case ZoneDragonsLair:
return "⚠ A note before we commit. Infernax doesn't go down to one sword. I've watched better-prepared adventurers walk in here and not walk back out, and I haven't yet seen the lone exception. Bring friends when you can. For tonight — I'm with you anyway."
case ZoneAbyssPortal:
return "⚠ A note before we commit. Belaxath is the kind of enemy you bring a band to. Not one solo hero has put him down yet, and I'd rather you weren't the first to try. We can still go. I just want the record to show I said this."
}
return ""
}
func estimateDays(maxSU, dailyBurn float32) int {
if dailyBurn <= 0 {
return 0

View File

@@ -14,6 +14,7 @@ package plugin
import (
"encoding/json"
"fmt"
"sort"
"time"
"gogobee/internal/db"
@@ -91,6 +92,13 @@ func (s *SimRunner) BuildCharacter(uid id.UserID, class DnDClass, level int) (*D
return nil, fmt.Errorf("setSpellSlotsForLevel: %w", err)
}
}
// Populate the known+prepared spell list. ensureSpellsForCharacter is
// the canonical seeder used by !setup and the auto-migrate path; prod
// players hit it on character create. The sim has to call it
// explicitly so simPickSpell sees a real spellbook. No-op for martials.
if err := ensureSpellsForCharacter(c); err != nil {
return nil, fmt.Errorf("ensureSpellsForCharacter: %w", err)
}
if err := outfitSimCharacter(uid, level); err != nil {
return nil, fmt.Errorf("outfitSimCharacter: %w", err)
}
@@ -274,8 +282,24 @@ type SimCombatSummary struct {
EnemyMisses int
PlayerAC int // inferred from RollAgainst on enemy attack events
EnemyAC int // inferred from RollAgainst on player attack events
// Events is the raw per-round TurnLog. Populated only when
// SetSimIncludeTrace(true) has been called, and only on the LAST
// combat per expedition (the boss room) to keep JSONL size bounded.
// Used by J2 caster-survival analysis.
Events []CombatEvent `json:",omitempty"`
}
// simIncludeTrace gates per-round event capture on SimCombatSummary.
// Off by default — matrix runs already emit megabytes of summary rows
// and the raw turn log multiplies that. SetSimIncludeTrace flips it on
// for targeted J2-style diagnostic sweeps.
var simIncludeTrace = false
// SetSimIncludeTrace toggles inclusion of the raw per-round CombatEvent
// stream on the LAST SimCombatSummary of each expedition (the boss
// room). Callers should flip this on before BuildCharacter / RunExpedition.
func SetSimIncludeTrace(on bool) { simIncludeTrace = on }
// SimLogEntry is a JSONL-friendly projection of one dnd_expedition_log
// row. We expose just the fields a post-hoc analyzer needs without
// pulling the full ExpeditionEntry type.
@@ -442,6 +466,7 @@ func simCombatSummaries(uid id.UserID) []SimCombatSummary {
}
defer rows.Close()
var out []SimCombatSummary
var lastEvents []CombatEvent
for rows.Next() {
var s SimCombatSummary
var turnLogJSON string
@@ -455,6 +480,7 @@ func simCombatSummaries(uid id.UserID) []SimCombatSummary {
if turnLogJSON != "" {
_ = json.Unmarshal([]byte(turnLogJSON), &events)
}
lastEvents = events
for _, ev := range events {
switch ev.Actor {
case "player":
@@ -489,6 +515,9 @@ func simCombatSummaries(uid id.UserID) []SimCombatSummary {
}
out = append(out, s)
}
if simIncludeTrace && len(out) > 0 {
out[len(out)-1].Events = lastEvents
}
return out
}
@@ -556,13 +585,159 @@ func (s *SimRunner) autoResolveCombat(ctx MessageContext) (bool, error) {
case CombatStatusLost, CombatStatusFled:
return false, nil
}
if err := s.P.handleAttackCmd(ctx); err != nil {
return false, fmt.Errorf("attack iter %d: %w", i, err)
kind, arg := s.simPickCombatAction(ctx.Sender, cur)
var dispatchErr error
switch kind {
case "consume":
dispatchErr = s.P.handleConsumeCmd(ctx, arg)
case "cast":
dispatchErr = s.P.handleCombatCastCmd(ctx, arg)
default:
dispatchErr = s.P.handleAttackCmd(ctx)
}
if dispatchErr != nil {
return false, fmt.Errorf("%s iter %d: %w", kind, i, dispatchErr)
}
}
return false, fmt.Errorf("combat exceeded %d rounds", autoCombatRoundCap)
}
// simHealHPThresholdPct is the player-HP percentage below which the sim
// reaches for a heal consumable before its !attack/!cast. 40% mirrors
// the "competent player" prod assumption — heal early enough to absorb
// one more big hit, not so early that a 1-HP scratch burns a potion.
const simHealHPThresholdPct = 40
// simPickCombatAction is the sim's per-turn decision tree, mirroring
// what a competent prod player would type:
//
// 1. If HP is below simHealHPThresholdPct and the inventory has a heal
// consumable, !consume <heal>. (Slot-spell heals were tried in J2c
// but regressed druid by 10pp — slot heals like cure_wounds heal
// ~10HP vs 40HP from a tier-4 Spirit Tonic, and burned a slot the
// caster needed for damage spells. Consumable-first wins.)
// 2. Else if the character is a non-martial-first spellcaster with a
// usable damage spell + slot (or a damaging cantrip), !cast it.
// Higher-slot damage outranks lower-slot damage. (J2c also tried
// scoring control spells; net ±0 vs J2b in the n=100 sweep, and
// a higher control weight regressed warlock by 6.6pp — control
// scoring was reverted. Bard/cleric trailing remains a class-pool
// issue, not a picker issue.)
// 3. Else !attack.
//
// Pre-J2a the sim looped !attack only, which underweighted every caster
// class — see sim_results/j2_findings.md for the trace evidence.
func (s *SimRunner) simPickCombatAction(uid id.UserID, sess *CombatSession) (kind, arg string) {
c, _ := LoadDnDCharacter(uid)
if c == nil || sess == nil {
return "attack", ""
}
lowHP := sess.PlayerHPMax > 0 && sess.PlayerHP*100 < sess.PlayerHPMax*simHealHPThresholdPct
if lowHP {
inv := s.P.loadConsumableInventory(uid)
for _, it := range inv {
if it.Def.Effect == EffectHeal {
return "consume", it.Def.Name
}
}
}
if isSpellcaster(c) && !simMartialFirstClass(c.Class) {
if id := simPickSpell(c, uid); id != "" {
return "cast", id
}
}
return "attack", ""
}
// simMartialFirstClass marks the half-casters whose damage identity is
// weapon-attack + ExtraAttack rather than slot spells. Picker skips
// !cast for these — Ranger's weapon swing with Hunter's Mark + Extra
// Attack out-damages a single Lightning Arrow at L12, and the J2b
// re-baseline measured a 35pp regression when the picker burned slots
// on damage_save spells for them. Paladin currently has no damage-
// effect spells in defaults (kit is bless/cure/buff), so the picker is
// already a no-op there; listed here for intent.
func simMartialFirstClass(class DnDClass) bool {
switch class {
case ClassRanger, ClassPaladin:
return true
}
return false
}
// simPickSpell returns the spell ID a competent player would cast this
// turn, or "" when no usable spell is available (forcing a !attack).
// Selection rules:
// - Only damage-effect spells (damage_attack / damage_save / damage_auto).
// Control/buff/heal are out (J2c sweep showed control scoring at
// either 22 or 5 nets ≤±2pp at L12 and regresses warlock at 22 —
// no headroom worth the complexity). Healing is handled by the
// consumable-first branch in simPickCombatAction.
// - Reaction-cast spells are excluded (engine rejects them).
// - Non-cantrips require an available slot at their native level (no
// upcasting — preserves high slots for high-level spells).
// - Among feasible candidates, prefer higher slot level; tie-break on
// expected damage from the dice string.
//
// Returns the spell ID for handleCombatCastCmd.
func simPickSpell(c *DnDCharacter, uid id.UserID) string {
known, err := listKnownSpells(uid)
if err != nil || len(known) == 0 {
return ""
}
slots, _ := getSpellSlots(uid)
type cand struct {
id string
level int
expDmg float64
}
var cands []cand
for _, k := range known {
if !k.Prepared {
continue
}
sp, ok := lookupSpell(k.SpellID)
if !ok {
continue
}
switch sp.Effect {
case EffectDamageAttack, EffectDamageSave, EffectDamageAuto:
default:
continue
}
if sp.CastTime == CastReaction {
continue
}
onList := false
for _, cl := range sp.Classes {
if cl == c.Class {
onList = true
break
}
}
if !onList {
continue
}
if sp.Level > 0 {
pair, ok := slots[sp.Level]
if !ok || pair[0]-pair[1] <= 0 {
continue
}
}
cands = append(cands, cand{id: sp.ID, level: sp.Level, expDmg: spellExpectedDamage(sp, sp.Level, c.Level)})
}
if len(cands) == 0 {
return ""
}
sort.Slice(cands, func(i, j int) bool {
if cands[i].level != cands[j].level {
return cands[i].level > cands[j].level
}
return cands[i].expDmg > cands[j].expDmg
})
return cands[0].id
}
// TickDay drives one synthetic day rollover for exp: 21:00 recap of
// the current day, then 06:00 briefing of the next day. The briefing
// is what bumps current_day and applies supply burn / overnight camp /

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,76 @@
# J2 — Caster boss-survival traces (per-round event sweep)
**Date:** 2026-05-17
**Corpus:** `sim_results/j2_traces.jsonl` — 240 expeditions
**Cells:** {mage, cleric, sorcerer, warlock, bard, druid} × {manor_blackspire, underdark} × L12 × n=20
**Method:** New `-trace` flag on `cmd/expedition-sim` attaches the raw `CombatEvent` stream to the last combat (the boss/elite room) of every expedition. Aggregated in `/tmp/analyze_j2.py`.
## Headline
The caster cliff in `baseline_j1_all10.jsonl` is **not a class-balance problem. It is a sim-artifact**: `autoResolveCombat` dispatches `!attack` only — never `!cast`, never `!consume`. Across 240 boss-room fights:
| Event type | Count |
|-------------------------------|------:|
| `player` `spell_cast` | **0** |
| `player` `use_consumable` | **0** |
| `consumable` events | **0** |
| `player` `hit` (weapon swing) | 381 |
| `player` `thorn_lash` (druid passive) | 261 |
Every "caster boss-fight" the matrix has scored to date is a melee swing-fest with the caster's spell slots untouched and their consumables sitting in inventory.
## Class-level per-cell boss-fight rollup (L12)
| class | zone | n | reachBoss | won | lost | rnd | pDmg | eDmg | slotRuns | casts | noSlot | eHPleft |
|----------|------------------|----|-----------|-----|------|-----|------|------|----------|-------|--------|---------|
| mage | manor_blackspire | 20 | 10 | 0 | 10 | 7.4 | 27.4 | 89 | **0** | 0 | 10 | 116.6 |
| mage | underdark | 20 | 13 | 0 | 13 | 5.4 | 28.7 | 68.1 | **0** | 0 | 13 | 133.3 |
| cleric | manor_blackspire | 20 | 7 | 0 | 7 | 7.6 | 28.1 | 101 | **0** | 0 | 7 | 115.9 |
| cleric | underdark | 20 | 1 | 0 | 1 | 2 | 12 | 26 | **0** | 0 | 1 | 150 |
| sorcerer | manor_blackspire | 20 | 11 | 0 | 11 | 6.8 | 16.9 | 86.2 | **0** | 0 | 11 | 127.1 |
| sorcerer | underdark | 20 | 6 | 0 | 6 | 6.5 | 26.8 | 79 | **0** | 0 | 6 | 135.2 |
| warlock | manor_blackspire | 20 | 10 | 0 | 10 | 8.8 | 29.9 | 108.4| **0** | 0 | 10 | 114.1 |
| warlock | underdark | 20 | 15 | 0 | 15 | 8.6 | 53.4 | 96.1 | **0** | 0 | 15 | 108.6 |
| bard | manor_blackspire | 20 | 14 | 0 | 14 | 9.1 | 29.9 | 103.8| **0** | 0 | 14 | 114.1 |
| bard | underdark | 20 | 10 | 0 | 10 | 7.8 | 46.9 | 76.5 | **0** | 0 | 10 | 115.1 |
| *druid* | manor_blackspire | 20 | 15 | 0 | 15 | 8.1 | 77.8 | 107.5| **0** | 0 | 15 | 66.2 |
| *druid* | underdark | 20 | 14 | 0 | 14 | 6.5 | 72.3 | 81.1 | **0** | 0 | 14 | 89.7 |
Columns: `slotRuns` = boss fights where ≥1 slot spell fired; `casts` = total slot casts; `noSlot` = boss fights with zero casts; `eHPleft` = mean enemy HP remaining at player-loss (the "how close did we come" number).
## Why druid is the lone outlier at 39% mean clear
Druid's `ThornLashDmg = 2 + level/4` passive (`dnd_passives.go:210`, Class-identity audit 2026-05-16) fires every time the enemy lands a hit on the player — 5 reactive damage at L12, ×~1015 enemy hits per fight = 5075 incidental player damage. That alone accounts for the ~70+ mean `pDmg` druid posts vs 1753 for the trailers. **Druid is not "tankier than the trailers" — druid is the only class whose damage profile doesn't depend on the spell action**. Wild Shape, the actual durability beat the plan called out, is not wired through `autoResolveCombat` at all; thorn lash is.
## Reaction-spell hypothesis (plan §6.J2 H2) is moot for now
`dnd_spells.go` already documents that reaction-cast spells (`shield`, `counterspell`, `hellish_rebuke`) are explicitly skipped today — no reaction window in combat. So even if `autoResolveCombat` were upgraded, Shield-style auto-fires aren't a J2 lever until a reaction phase exists.
## Conclusion — J2 is hypothesis-3-shaped but the cause is upstream
The plan listed four hypotheses; the trace evidence speaks to them as follows:
1. ~~Damage falls off vs boss HP~~ — confounded: cantrip damage was never tested; player only swung weapons.
2. ~~No durability backstop~~ — Druid's outperformance is offense (thorn lash), not durability. So the durability gap, if it exists, can't be read from this corpus.
3. **Slot/resource economy** — slots aren't being spent in boss fights at all. Confirms casters reach boss "with slots intact" (the plan's optimistic read), but in the worst possible way: the sim refuses to spend them.
4. Cleric identity — `simAutoArmDefaultFor` does pre-arm Healing Word for Cleric (`dnd_abilities.go:375`), and that fires on the armed-ability path before combat. But mid-fight casts of Spiritual Weapon / Bless never fire.
## Recommended J2 lever (replaces the original menu)
**J2a — Teach `autoResolveCombat` to cast and consume.**
Before each `!attack`, the sim should mirror "what a competent prod player would do":
- If HP < ~40% MaxHP and a heal-tagged consumable is in inventory → dispatch `handleConsumeCmd` with that item.
- Else if the character is a spellcaster with available slots and a known damage/control spell that lands → dispatch `handleCastCmd` (priority: damage spell that finishes the enemy → control/stun → buff → cantrip).
- Else swing.
The picker can be small and class-blind for the first cut — pick the highest-level slot whose damage roll most efficiently reduces remaining enemy HP, fall back to a cantrip when slots are dry. Mirror `combat_bridge.go`'s `SelectConsumables` for the heal side.
**J2b — Re-run baseline matrix with the fixed `autoResolveCombat`.**
The current n=100 baseline measures a strawman. Once J2a lands we get a real read on caster boss-survival. Only then is it worth picking class-level levers (or concluding "casters are fine, the sim was lying").
**Out of J2 scope for now:** Reaction wiring (Shield, Counterspell). Per `dnd_spells.go`'s own comments, the reaction phase doesn't exist yet; lifting that ban is its own surface.
## Side note — `autoCombatRoundCap` vs the actual constant
Plan mentions `autoCombatRoundCap = 200`; verified in `expedition_sim.go:528`. No issue, just confirming the harness isn't truncating fights early.

398
sim_results/j2_traces.err Normal file
View File

@@ -0,0 +1,398 @@
2026/05/17 14:33:32 INFO database initialized path=/tmp/expedition-sim-1435326323/gogobee.db
2026/05/17 14:33:32 INFO database initialized path=/tmp/expedition-sim-570080482/gogobee.db
2026/05/17 14:33:32 INFO database initialized path=/tmp/expedition-sim-1961067701/gogobee.db
2026/05/17 14:33:33 INFO database initialized path=/tmp/expedition-sim-2587622653/gogobee.db
2026/05/17 14:33:33 INFO database initialized path=/tmp/expedition-sim-1858572084/gogobee.db
2026/05/17 14:33:33 INFO database initialized path=/tmp/expedition-sim-891082602/gogobee.db
2026/05/17 14:33:33 INFO database initialized path=/tmp/expedition-sim-3411481929/gogobee.db
2026/05/17 14:33:33 INFO database initialized path=/tmp/expedition-sim-4180440505/gogobee.db
2026/05/17 14:33:33 INFO database initialized path=/tmp/expedition-sim-1352384336/gogobee.db
2026/05/17 14:33:33 INFO database initialized path=/tmp/expedition-sim-1857658664/gogobee.db
2026/05/17 14:33:33 INFO database initialized path=/tmp/expedition-sim-1053057170/gogobee.db
2026/05/17 14:33:33 INFO dnd: armed ability fired (turn-based build) user=@sim:cleric-l12-manor_blackspire-0 ability="Healing Word"
2026/05/17 14:33:33 INFO dnd: armed ability fired (turn-based build) user=@sim:cleric-l12-manor_blackspire-0 ability="Healing Word"
2026/05/17 14:33:33 INFO dnd: armed ability fired (turn-based build) user=@sim:cleric-l12-manor_blackspire-0 ability="Healing Word"
2026/05/17 14:33:33 WARN auto-heal cleanup: short on inventory user=@sim:cleric-l12-manor_blackspire-0 wanted=1 removed=0
2026/05/17 14:33:33 WARN auto-heal cleanup: short on inventory user=@sim:cleric-l12-manor_blackspire-0 wanted=1 removed=0
2026/05/17 14:33:33 INFO database initialized path=/tmp/expedition-sim-972878641/gogobee.db
2026/05/17 14:33:33 INFO database initialized path=/tmp/expedition-sim-256884369/gogobee.db
2026/05/17 14:33:33 INFO database initialized path=/tmp/expedition-sim-3470319547/gogobee.db
2026/05/17 14:33:33 INFO database initialized path=/tmp/expedition-sim-961022847/gogobee.db
2026/05/17 14:33:33 INFO database initialized path=/tmp/expedition-sim-2323722081/gogobee.db
2026/05/17 14:33:33 INFO database initialized path=/tmp/expedition-sim-2780245983/gogobee.db
2026/05/17 14:33:33 INFO database initialized path=/tmp/expedition-sim-2761994054/gogobee.db
2026/05/17 14:33:33 INFO database initialized path=/tmp/expedition-sim-59185064/gogobee.db
2026/05/17 14:33:33 INFO dnd: armed ability fired (turn-based build) user=@sim:cleric-l12-manor_blackspire-1 ability="Healing Word"
2026/05/17 14:33:33 INFO dnd: armed ability fired (turn-based build) user=@sim:cleric-l12-manor_blackspire-1 ability="Healing Word"
2026/05/17 14:33:33 INFO database initialized path=/tmp/expedition-sim-1505145848/gogobee.db
2026/05/17 14:33:33 INFO dnd: armed ability fired (turn-based build) user=@sim:cleric-l12-manor_blackspire-1 ability="Healing Word"
2026/05/17 14:33:33 INFO database initialized path=/tmp/expedition-sim-1383216459/gogobee.db
2026/05/17 14:33:33 INFO database initialized path=/tmp/expedition-sim-1328601750/gogobee.db
2026/05/17 14:33:33 INFO database initialized path=/tmp/expedition-sim-98864978/gogobee.db
2026/05/17 14:33:33 INFO database initialized path=/tmp/expedition-sim-2659914046/gogobee.db
2026/05/17 14:33:33 INFO database initialized path=/tmp/expedition-sim-1386804201/gogobee.db
2026/05/17 14:33:33 INFO database initialized path=/tmp/expedition-sim-163421166/gogobee.db
2026/05/17 14:33:33 INFO database initialized path=/tmp/expedition-sim-220854570/gogobee.db
2026/05/17 14:33:33 INFO database initialized path=/tmp/expedition-sim-3389300164/gogobee.db
2026/05/17 14:33:33 INFO database initialized path=/tmp/expedition-sim-1934711212/gogobee.db
2026/05/17 14:33:33 INFO database initialized path=/tmp/expedition-sim-683711492/gogobee.db
2026/05/17 14:33:33 INFO database initialized path=/tmp/expedition-sim-3235526877/gogobee.db
2026/05/17 14:33:33 INFO dnd: armed ability fired (turn-based build) user=@sim:cleric-l12-manor_blackspire-2 ability="Healing Word"
2026/05/17 14:33:33 INFO dnd: armed ability fired (turn-based build) user=@sim:cleric-l12-manor_blackspire-2 ability="Healing Word"
2026/05/17 14:33:33 INFO dnd: armed ability fired (turn-based build) user=@sim:cleric-l12-manor_blackspire-2 ability="Healing Word"
2026/05/17 14:33:33 INFO database initialized path=/tmp/expedition-sim-403680368/gogobee.db
2026/05/17 14:33:33 INFO database initialized path=/tmp/expedition-sim-1224265812/gogobee.db
2026/05/17 14:33:33 WARN auto-heal cleanup: short on inventory user=@sim:cleric-l12-manor_blackspire-2 wanted=1 removed=0
2026/05/17 14:33:33 WARN auto-heal cleanup: short on inventory user=@sim:cleric-l12-manor_blackspire-2 wanted=1 removed=0
2026/05/17 14:33:33 INFO database initialized path=/tmp/expedition-sim-3033798307/gogobee.db
2026/05/17 14:33:33 INFO database initialized path=/tmp/expedition-sim-4169972330/gogobee.db
2026/05/17 14:33:33 INFO database initialized path=/tmp/expedition-sim-3094361155/gogobee.db
2026/05/17 14:33:33 INFO database initialized path=/tmp/expedition-sim-39807966/gogobee.db
2026/05/17 14:33:33 INFO database initialized path=/tmp/expedition-sim-2571438535/gogobee.db
2026/05/17 14:33:33 INFO database initialized path=/tmp/expedition-sim-2572980888/gogobee.db
2026/05/17 14:33:33 INFO database initialized path=/tmp/expedition-sim-2578263003/gogobee.db
2026/05/17 14:33:33 INFO database initialized path=/tmp/expedition-sim-2463584493/gogobee.db
2026/05/17 14:33:33 INFO database initialized path=/tmp/expedition-sim-1572790867/gogobee.db
2026/05/17 14:33:33 INFO dnd: armed ability fired (turn-based build) user=@sim:cleric-l12-manor_blackspire-3 ability="Healing Word"
2026/05/17 14:33:33 INFO database initialized path=/tmp/expedition-sim-2937583366/gogobee.db
2026/05/17 14:33:33 INFO dnd: armed ability fired (turn-based build) user=@sim:cleric-l12-manor_blackspire-3 ability="Healing Word"
2026/05/17 14:33:33 INFO dnd: armed ability fired (turn-based build) user=@sim:cleric-l12-manor_blackspire-3 ability="Healing Word"
2026/05/17 14:33:33 INFO database initialized path=/tmp/expedition-sim-3613819748/gogobee.db
2026/05/17 14:33:33 INFO database initialized path=/tmp/expedition-sim-2540828918/gogobee.db
2026/05/17 14:33:34 INFO database initialized path=/tmp/expedition-sim-1139909187/gogobee.db
2026/05/17 14:33:34 INFO database initialized path=/tmp/expedition-sim-4142969182/gogobee.db
2026/05/17 14:33:34 INFO database initialized path=/tmp/expedition-sim-2019276704/gogobee.db
2026/05/17 14:33:34 INFO database initialized path=/tmp/expedition-sim-2988018196/gogobee.db
2026/05/17 14:33:34 INFO database initialized path=/tmp/expedition-sim-1795837828/gogobee.db
2026/05/17 14:33:34 INFO database initialized path=/tmp/expedition-sim-1760808843/gogobee.db
2026/05/17 14:33:34 INFO database initialized path=/tmp/expedition-sim-2153283131/gogobee.db
2026/05/17 14:33:34 INFO dnd: armed ability fired (turn-based build) user=@sim:cleric-l12-manor_blackspire-4 ability="Healing Word"
2026/05/17 14:33:34 INFO database initialized path=/tmp/expedition-sim-1942277386/gogobee.db
2026/05/17 14:33:34 INFO dnd: armed ability fired (turn-based build) user=@sim:cleric-l12-manor_blackspire-4 ability="Healing Word"
2026/05/17 14:33:34 INFO dnd: armed ability fired (turn-based build) user=@sim:cleric-l12-manor_blackspire-4 ability="Healing Word"
2026/05/17 14:33:34 INFO database initialized path=/tmp/expedition-sim-1406817335/gogobee.db
2026/05/17 14:33:34 INFO database initialized path=/tmp/expedition-sim-1271254441/gogobee.db
2026/05/17 14:33:34 INFO database initialized path=/tmp/expedition-sim-854529878/gogobee.db
2026/05/17 14:33:34 INFO database initialized path=/tmp/expedition-sim-1694073851/gogobee.db
2026/05/17 14:33:34 INFO database initialized path=/tmp/expedition-sim-3038451926/gogobee.db
2026/05/17 14:33:34 INFO database initialized path=/tmp/expedition-sim-2343863670/gogobee.db
2026/05/17 14:33:34 INFO database initialized path=/tmp/expedition-sim-1295476148/gogobee.db
2026/05/17 14:33:34 INFO dnd: armed ability fired (turn-based build) user=@sim:cleric-l12-underdark-0 ability="Healing Word"
2026/05/17 14:33:34 INFO dnd: armed ability fired (turn-based build) user=@sim:cleric-l12-underdark-0 ability="Healing Word"
2026/05/17 14:33:34 INFO dnd: armed ability fired (turn-based build) user=@sim:cleric-l12-underdark-0 ability="Healing Word"
2026/05/17 14:33:34 INFO database initialized path=/tmp/expedition-sim-1125646836/gogobee.db
2026/05/17 14:33:34 WARN auto-heal cleanup: short on inventory user=@sim:cleric-l12-underdark-0 wanted=1 removed=0
2026/05/17 14:33:34 WARN auto-heal cleanup: short on inventory user=@sim:cleric-l12-underdark-0 wanted=1 removed=0
2026/05/17 14:33:34 INFO database initialized path=/tmp/expedition-sim-1333512022/gogobee.db
2026/05/17 14:33:34 INFO dnd: armed ability fired (turn-based build) user=@sim:cleric-l12-manor_blackspire-5 ability="Healing Word"
2026/05/17 14:33:34 INFO dnd: armed ability fired (turn-based build) user=@sim:cleric-l12-manor_blackspire-5 ability="Healing Word"
2026/05/17 14:33:34 INFO dnd: armed ability fired (turn-based build) user=@sim:cleric-l12-manor_blackspire-5 ability="Healing Word"
2026/05/17 14:33:34 INFO database initialized path=/tmp/expedition-sim-220710329/gogobee.db
2026/05/17 14:33:34 INFO database initialized path=/tmp/expedition-sim-3277829553/gogobee.db
2026/05/17 14:33:34 INFO database initialized path=/tmp/expedition-sim-1865701626/gogobee.db
2026/05/17 14:33:34 INFO database initialized path=/tmp/expedition-sim-935594784/gogobee.db
2026/05/17 14:33:34 INFO database initialized path=/tmp/expedition-sim-827715148/gogobee.db
2026/05/17 14:33:34 INFO database initialized path=/tmp/expedition-sim-68986296/gogobee.db
2026/05/17 14:33:34 INFO database initialized path=/tmp/expedition-sim-1012607066/gogobee.db
2026/05/17 14:33:34 INFO database initialized path=/tmp/expedition-sim-2500951803/gogobee.db
2026/05/17 14:33:34 INFO dnd: armed ability fired (turn-based build) user=@sim:cleric-l12-underdark-1 ability="Healing Word"
2026/05/17 14:33:34 INFO dnd: armed ability fired (turn-based build) user=@sim:cleric-l12-underdark-1 ability="Healing Word"
2026/05/17 14:33:34 INFO dnd: armed ability fired (turn-based build) user=@sim:cleric-l12-underdark-1 ability="Healing Word"
2026/05/17 14:33:34 WARN auto-heal cleanup: short on inventory user=@sim:cleric-l12-underdark-1 wanted=1 removed=0
2026/05/17 14:33:34 INFO database initialized path=/tmp/expedition-sim-557441740/gogobee.db
2026/05/17 14:33:34 INFO database initialized path=/tmp/expedition-sim-914070631/gogobee.db
2026/05/17 14:33:34 INFO database initialized path=/tmp/expedition-sim-2271572170/gogobee.db
2026/05/17 14:33:34 INFO database initialized path=/tmp/expedition-sim-2949698724/gogobee.db
2026/05/17 14:33:34 INFO database initialized path=/tmp/expedition-sim-1061067707/gogobee.db
2026/05/17 14:33:34 INFO dnd: armed ability fired (turn-based build) user=@sim:cleric-l12-manor_blackspire-6 ability="Healing Word"
2026/05/17 14:33:34 INFO dnd: armed ability fired (turn-based build) user=@sim:cleric-l12-manor_blackspire-6 ability="Healing Word"
2026/05/17 14:33:34 INFO database initialized path=/tmp/expedition-sim-1705075809/gogobee.db
2026/05/17 14:33:34 INFO dnd: armed ability fired (turn-based build) user=@sim:cleric-l12-manor_blackspire-6 ability="Healing Word"
2026/05/17 14:33:34 INFO database initialized path=/tmp/expedition-sim-1523470365/gogobee.db
2026/05/17 14:33:34 INFO database initialized path=/tmp/expedition-sim-3499970093/gogobee.db
2026/05/17 14:33:34 INFO database initialized path=/tmp/expedition-sim-830760784/gogobee.db
2026/05/17 14:33:34 INFO database initialized path=/tmp/expedition-sim-3280978624/gogobee.db
2026/05/17 14:33:34 INFO dnd: armed ability fired (turn-based build) user=@sim:cleric-l12-underdark-2 ability="Healing Word"
2026/05/17 14:33:34 INFO dnd: armed ability fired (turn-based build) user=@sim:cleric-l12-underdark-2 ability="Healing Word"
2026/05/17 14:33:34 INFO dnd: armed ability fired (turn-based build) user=@sim:cleric-l12-underdark-2 ability="Healing Word"
2026/05/17 14:33:34 INFO database initialized path=/tmp/expedition-sim-307271588/gogobee.db
2026/05/17 14:33:34 WARN auto-heal cleanup: short on inventory user=@sim:cleric-l12-underdark-2 wanted=1 removed=0
2026/05/17 14:33:34 INFO database initialized path=/tmp/expedition-sim-2775243793/gogobee.db
2026/05/17 14:33:34 INFO database initialized path=/tmp/expedition-sim-3018564373/gogobee.db
2026/05/17 14:33:34 INFO database initialized path=/tmp/expedition-sim-3030586970/gogobee.db
2026/05/17 14:33:34 INFO database initialized path=/tmp/expedition-sim-1029269349/gogobee.db
2026/05/17 14:33:34 INFO database initialized path=/tmp/expedition-sim-4002156351/gogobee.db
2026/05/17 14:33:34 INFO database initialized path=/tmp/expedition-sim-183864816/gogobee.db
2026/05/17 14:33:34 INFO database initialized path=/tmp/expedition-sim-3257645146/gogobee.db
2026/05/17 14:33:34 INFO database initialized path=/tmp/expedition-sim-1929325151/gogobee.db
2026/05/17 14:33:34 INFO database initialized path=/tmp/expedition-sim-225751687/gogobee.db
2026/05/17 14:33:34 INFO database initialized path=/tmp/expedition-sim-3615293801/gogobee.db
2026/05/17 14:33:34 INFO dnd: armed ability fired (turn-based build) user=@sim:cleric-l12-underdark-3 ability="Healing Word"
2026/05/17 14:33:34 INFO dnd: armed ability fired (turn-based build) user=@sim:cleric-l12-underdark-3 ability="Healing Word"
2026/05/17 14:33:34 INFO dnd: armed ability fired (turn-based build) user=@sim:cleric-l12-manor_blackspire-7 ability="Healing Word"
2026/05/17 14:33:34 INFO dnd: armed ability fired (turn-based build) user=@sim:cleric-l12-manor_blackspire-7 ability="Healing Word"
2026/05/17 14:33:34 INFO database initialized path=/tmp/expedition-sim-576438996/gogobee.db
2026/05/17 14:33:34 INFO dnd: armed ability fired (turn-based build) user=@sim:cleric-l12-underdark-3 ability="Healing Word"
2026/05/17 14:33:34 WARN auto-heal cleanup: short on inventory user=@sim:cleric-l12-underdark-3 wanted=1 removed=0
2026/05/17 14:33:34 INFO dnd: armed ability fired (turn-based build) user=@sim:cleric-l12-manor_blackspire-7 ability="Healing Word"
2026/05/17 14:33:34 WARN auto-heal cleanup: short on inventory user=@sim:cleric-l12-underdark-3 wanted=1 removed=0
2026/05/17 14:33:34 WARN auto-heal cleanup: short on inventory user=@sim:cleric-l12-underdark-3 wanted=1 removed=0
2026/05/17 14:33:34 WARN auto-heal cleanup: short on inventory user=@sim:cleric-l12-underdark-3 wanted=1 removed=0
2026/05/17 14:33:34 INFO database initialized path=/tmp/expedition-sim-2421935970/gogobee.db
2026/05/17 14:33:34 INFO database initialized path=/tmp/expedition-sim-1180856031/gogobee.db
2026/05/17 14:33:34 INFO database initialized path=/tmp/expedition-sim-2369465835/gogobee.db
2026/05/17 14:33:35 INFO database initialized path=/tmp/expedition-sim-3833483254/gogobee.db
2026/05/17 14:33:35 INFO database initialized path=/tmp/expedition-sim-224923423/gogobee.db
2026/05/17 14:33:35 INFO database initialized path=/tmp/expedition-sim-2726204412/gogobee.db
2026/05/17 14:33:35 INFO database initialized path=/tmp/expedition-sim-2419377482/gogobee.db
2026/05/17 14:33:35 INFO database initialized path=/tmp/expedition-sim-4254550146/gogobee.db
2026/05/17 14:33:35 INFO database initialized path=/tmp/expedition-sim-658875425/gogobee.db
2026/05/17 14:33:35 INFO database initialized path=/tmp/expedition-sim-2977421017/gogobee.db
2026/05/17 14:33:35 INFO database initialized path=/tmp/expedition-sim-2945912897/gogobee.db
2026/05/17 14:33:35 INFO database initialized path=/tmp/expedition-sim-1223443637/gogobee.db
2026/05/17 14:33:35 INFO dnd: armed ability fired (turn-based build) user=@sim:cleric-l12-underdark-4 ability="Healing Word"
2026/05/17 14:33:35 INFO dnd: armed ability fired (turn-based build) user=@sim:cleric-l12-manor_blackspire-8 ability="Healing Word"
2026/05/17 14:33:35 INFO dnd: armed ability fired (turn-based build) user=@sim:cleric-l12-underdark-4 ability="Healing Word"
2026/05/17 14:33:35 INFO dnd: armed ability fired (turn-based build) user=@sim:cleric-l12-manor_blackspire-8 ability="Healing Word"
2026/05/17 14:33:35 INFO dnd: armed ability fired (turn-based build) user=@sim:cleric-l12-manor_blackspire-8 ability="Healing Word"
2026/05/17 14:33:35 INFO dnd: armed ability fired (turn-based build) user=@sim:cleric-l12-underdark-4 ability="Healing Word"
2026/05/17 14:33:35 WARN auto-heal cleanup: short on inventory user=@sim:cleric-l12-underdark-4 wanted=1 removed=0
2026/05/17 14:33:35 INFO database initialized path=/tmp/expedition-sim-1646450137/gogobee.db
2026/05/17 14:33:35 INFO database initialized path=/tmp/expedition-sim-1481312023/gogobee.db
2026/05/17 14:33:35 INFO database initialized path=/tmp/expedition-sim-3507008659/gogobee.db
2026/05/17 14:33:35 INFO database initialized path=/tmp/expedition-sim-1516972004/gogobee.db
2026/05/17 14:33:35 INFO database initialized path=/tmp/expedition-sim-28609871/gogobee.db
2026/05/17 14:33:35 INFO database initialized path=/tmp/expedition-sim-1430768706/gogobee.db
2026/05/17 14:33:35 INFO database initialized path=/tmp/expedition-sim-4220398274/gogobee.db
2026/05/17 14:33:35 INFO database initialized path=/tmp/expedition-sim-1646369506/gogobee.db
2026/05/17 14:33:35 INFO database initialized path=/tmp/expedition-sim-2125090382/gogobee.db
2026/05/17 14:33:35 INFO dnd: armed ability fired (turn-based build) user=@sim:cleric-l12-underdark-5 ability="Healing Word"
2026/05/17 14:33:35 INFO dnd: armed ability fired (turn-based build) user=@sim:cleric-l12-underdark-5 ability="Healing Word"
2026/05/17 14:33:35 INFO dnd: armed ability fired (turn-based build) user=@sim:cleric-l12-underdark-5 ability="Healing Word"
2026/05/17 14:33:35 INFO database initialized path=/tmp/expedition-sim-1488901552/gogobee.db
2026/05/17 14:33:35 WARN auto-heal cleanup: short on inventory user=@sim:cleric-l12-underdark-5 wanted=1 removed=0
2026/05/17 14:33:35 INFO database initialized path=/tmp/expedition-sim-4060999029/gogobee.db
2026/05/17 14:33:35 INFO dnd: armed ability fired (turn-based build) user=@sim:cleric-l12-manor_blackspire-9 ability="Healing Word"
2026/05/17 14:33:35 INFO dnd: armed ability fired (turn-based build) user=@sim:cleric-l12-manor_blackspire-9 ability="Healing Word"
2026/05/17 14:33:35 INFO dnd: armed ability fired (turn-based build) user=@sim:cleric-l12-manor_blackspire-9 ability="Healing Word"
2026/05/17 14:33:35 INFO database initialized path=/tmp/expedition-sim-1980401808/gogobee.db
2026/05/17 14:33:35 INFO database initialized path=/tmp/expedition-sim-1684418884/gogobee.db
2026/05/17 14:33:35 INFO database initialized path=/tmp/expedition-sim-1794726509/gogobee.db
2026/05/17 14:33:35 INFO database initialized path=/tmp/expedition-sim-1749345557/gogobee.db
2026/05/17 14:33:35 INFO database initialized path=/tmp/expedition-sim-2740874960/gogobee.db
2026/05/17 14:33:35 INFO database initialized path=/tmp/expedition-sim-3925551982/gogobee.db
2026/05/17 14:33:35 INFO database initialized path=/tmp/expedition-sim-2864919519/gogobee.db
2026/05/17 14:33:35 INFO dnd: armed ability fired (turn-based build) user=@sim:cleric-l12-underdark-6 ability="Healing Word"
2026/05/17 14:33:35 INFO dnd: armed ability fired (turn-based build) user=@sim:cleric-l12-underdark-6 ability="Healing Word"
2026/05/17 14:33:35 INFO database initialized path=/tmp/expedition-sim-3095718542/gogobee.db
2026/05/17 14:33:35 INFO dnd: armed ability fired (turn-based build) user=@sim:cleric-l12-underdark-6 ability="Healing Word"
2026/05/17 14:33:35 WARN auto-heal cleanup: short on inventory user=@sim:cleric-l12-underdark-6 wanted=1 removed=0
2026/05/17 14:33:35 INFO database initialized path=/tmp/expedition-sim-3373738734/gogobee.db
2026/05/17 14:33:35 INFO dnd: armed ability fired (turn-based build) user=@sim:cleric-l12-manor_blackspire-10 ability="Healing Word"
2026/05/17 14:33:35 INFO database initialized path=/tmp/expedition-sim-3789457226/gogobee.db
2026/05/17 14:33:35 INFO dnd: armed ability fired (turn-based build) user=@sim:cleric-l12-manor_blackspire-10 ability="Healing Word"
2026/05/17 14:33:35 INFO database initialized path=/tmp/expedition-sim-4094310036/gogobee.db
2026/05/17 14:33:35 INFO dnd: armed ability fired (turn-based build) user=@sim:cleric-l12-manor_blackspire-10 ability="Healing Word"
2026/05/17 14:33:35 INFO database initialized path=/tmp/expedition-sim-3470990917/gogobee.db
2026/05/17 14:33:35 INFO database initialized path=/tmp/expedition-sim-3142853546/gogobee.db
2026/05/17 14:33:35 INFO database initialized path=/tmp/expedition-sim-309817808/gogobee.db
2026/05/17 14:33:35 INFO database initialized path=/tmp/expedition-sim-2429653290/gogobee.db
2026/05/17 14:33:35 INFO database initialized path=/tmp/expedition-sim-3580392471/gogobee.db
2026/05/17 14:33:35 INFO database initialized path=/tmp/expedition-sim-597247584/gogobee.db
2026/05/17 14:33:35 INFO database initialized path=/tmp/expedition-sim-2154392471/gogobee.db
2026/05/17 14:33:35 INFO dnd: armed ability fired (turn-based build) user=@sim:cleric-l12-underdark-7 ability="Healing Word"
2026/05/17 14:33:35 INFO dnd: armed ability fired (turn-based build) user=@sim:cleric-l12-underdark-7 ability="Healing Word"
2026/05/17 14:33:35 INFO dnd: armed ability fired (turn-based build) user=@sim:cleric-l12-underdark-7 ability="Healing Word"
2026/05/17 14:33:35 WARN auto-heal cleanup: short on inventory user=@sim:cleric-l12-underdark-7 wanted=1 removed=0
2026/05/17 14:33:35 INFO database initialized path=/tmp/expedition-sim-2565782481/gogobee.db
2026/05/17 14:33:35 INFO database initialized path=/tmp/expedition-sim-3549806484/gogobee.db
2026/05/17 14:33:35 INFO database initialized path=/tmp/expedition-sim-574287783/gogobee.db
2026/05/17 14:33:35 INFO database initialized path=/tmp/expedition-sim-1200079250/gogobee.db
2026/05/17 14:33:35 INFO database initialized path=/tmp/expedition-sim-1394948982/gogobee.db
2026/05/17 14:33:35 INFO database initialized path=/tmp/expedition-sim-847854238/gogobee.db
2026/05/17 14:33:35 INFO database initialized path=/tmp/expedition-sim-1817871372/gogobee.db
2026/05/17 14:33:35 INFO database initialized path=/tmp/expedition-sim-2323220882/gogobee.db
2026/05/17 14:33:35 INFO database initialized path=/tmp/expedition-sim-2450392709/gogobee.db
2026/05/17 14:33:35 INFO dnd: armed ability fired (turn-based build) user=@sim:cleric-l12-manor_blackspire-11 ability="Healing Word"
2026/05/17 14:33:35 INFO database initialized path=/tmp/expedition-sim-4012828053/gogobee.db
2026/05/17 14:33:35 INFO dnd: armed ability fired (turn-based build) user=@sim:cleric-l12-manor_blackspire-11 ability="Healing Word"
2026/05/17 14:33:35 INFO database initialized path=/tmp/expedition-sim-276814314/gogobee.db
2026/05/17 14:33:35 INFO dnd: armed ability fired (turn-based build) user=@sim:cleric-l12-manor_blackspire-11 ability="Healing Word"
2026/05/17 14:33:35 INFO dnd: armed ability fired (turn-based build) user=@sim:cleric-l12-underdark-8 ability="Healing Word"
2026/05/17 14:33:35 INFO dnd: armed ability fired (turn-based build) user=@sim:cleric-l12-underdark-8 ability="Healing Word"
2026/05/17 14:33:35 INFO dnd: armed ability fired (turn-based build) user=@sim:cleric-l12-underdark-8 ability="Healing Word"
2026/05/17 14:33:35 WARN auto-heal cleanup: short on inventory user=@sim:cleric-l12-underdark-8 wanted=1 removed=0
2026/05/17 14:33:35 INFO database initialized path=/tmp/expedition-sim-133917226/gogobee.db
2026/05/17 14:33:35 WARN auto-heal cleanup: short on inventory user=@sim:cleric-l12-underdark-8 wanted=1 removed=0
2026/05/17 14:33:36 WARN auto-heal cleanup: short on inventory user=@sim:cleric-l12-underdark-8 wanted=1 removed=0
2026/05/17 14:33:36 INFO database initialized path=/tmp/expedition-sim-27695044/gogobee.db
2026/05/17 14:33:36 INFO database initialized path=/tmp/expedition-sim-2595221952/gogobee.db
2026/05/17 14:33:36 INFO database initialized path=/tmp/expedition-sim-3729100327/gogobee.db
2026/05/17 14:33:36 INFO database initialized path=/tmp/expedition-sim-40630619/gogobee.db
2026/05/17 14:33:36 INFO database initialized path=/tmp/expedition-sim-1451440739/gogobee.db
2026/05/17 14:33:36 INFO database initialized path=/tmp/expedition-sim-1823882855/gogobee.db
2026/05/17 14:33:36 INFO database initialized path=/tmp/expedition-sim-2323272789/gogobee.db
2026/05/17 14:33:36 INFO database initialized path=/tmp/expedition-sim-1841383835/gogobee.db
2026/05/17 14:33:36 INFO database initialized path=/tmp/expedition-sim-540980082/gogobee.db
2026/05/17 14:33:36 INFO database initialized path=/tmp/expedition-sim-1023722670/gogobee.db
2026/05/17 14:33:36 INFO dnd: armed ability fired (turn-based build) user=@sim:cleric-l12-underdark-9 ability="Healing Word"
2026/05/17 14:33:36 INFO dnd: armed ability fired (turn-based build) user=@sim:cleric-l12-underdark-9 ability="Healing Word"
2026/05/17 14:33:36 INFO dnd: armed ability fired (turn-based build) user=@sim:cleric-l12-underdark-9 ability="Healing Word"
2026/05/17 14:33:36 WARN auto-heal cleanup: short on inventory user=@sim:cleric-l12-underdark-9 wanted=1 removed=0
2026/05/17 14:33:36 INFO database initialized path=/tmp/expedition-sim-776796602/gogobee.db
2026/05/17 14:33:36 WARN auto-heal cleanup: short on inventory user=@sim:cleric-l12-underdark-9 wanted=1 removed=0
2026/05/17 14:33:36 INFO dnd: armed ability fired (turn-based build) user=@sim:cleric-l12-manor_blackspire-12 ability="Healing Word"
2026/05/17 14:33:36 INFO dnd: armed ability fired (turn-based build) user=@sim:cleric-l12-manor_blackspire-12 ability="Healing Word"
2026/05/17 14:33:36 INFO dnd: armed ability fired (turn-based build) user=@sim:cleric-l12-manor_blackspire-12 ability="Healing Word"
2026/05/17 14:33:36 INFO database initialized path=/tmp/expedition-sim-376454587/gogobee.db
2026/05/17 14:33:36 INFO database initialized path=/tmp/expedition-sim-4137125856/gogobee.db
2026/05/17 14:33:36 INFO database initialized path=/tmp/expedition-sim-1977687003/gogobee.db
2026/05/17 14:33:36 INFO database initialized path=/tmp/expedition-sim-482104267/gogobee.db
2026/05/17 14:33:36 INFO database initialized path=/tmp/expedition-sim-4191466593/gogobee.db
2026/05/17 14:33:36 INFO database initialized path=/tmp/expedition-sim-3413343421/gogobee.db
2026/05/17 14:33:36 INFO database initialized path=/tmp/expedition-sim-337500389/gogobee.db
2026/05/17 14:33:36 INFO database initialized path=/tmp/expedition-sim-1161698075/gogobee.db
2026/05/17 14:33:36 INFO database initialized path=/tmp/expedition-sim-3923717903/gogobee.db
2026/05/17 14:33:36 INFO dnd: armed ability fired (turn-based build) user=@sim:cleric-l12-underdark-10 ability="Healing Word"
2026/05/17 14:33:36 INFO database initialized path=/tmp/expedition-sim-1486542255/gogobee.db
2026/05/17 14:33:36 INFO dnd: armed ability fired (turn-based build) user=@sim:cleric-l12-underdark-10 ability="Healing Word"
2026/05/17 14:33:36 INFO dnd: armed ability fired (turn-based build) user=@sim:cleric-l12-underdark-10 ability="Healing Word"
2026/05/17 14:33:36 INFO database initialized path=/tmp/expedition-sim-609549845/gogobee.db
2026/05/17 14:33:36 INFO database initialized path=/tmp/expedition-sim-2314709835/gogobee.db
2026/05/17 14:33:36 INFO dnd: armed ability fired (turn-based build) user=@sim:cleric-l12-manor_blackspire-13 ability="Healing Word"
2026/05/17 14:33:36 INFO dnd: armed ability fired (turn-based build) user=@sim:cleric-l12-manor_blackspire-13 ability="Healing Word"
2026/05/17 14:33:36 INFO dnd: armed ability fired (turn-based build) user=@sim:cleric-l12-manor_blackspire-13 ability="Healing Word"
2026/05/17 14:33:36 INFO database initialized path=/tmp/expedition-sim-2226585091/gogobee.db
2026/05/17 14:33:36 INFO database initialized path=/tmp/expedition-sim-4285465609/gogobee.db
2026/05/17 14:33:36 INFO database initialized path=/tmp/expedition-sim-1152863169/gogobee.db
2026/05/17 14:33:36 INFO database initialized path=/tmp/expedition-sim-1140564116/gogobee.db
2026/05/17 14:33:36 INFO database initialized path=/tmp/expedition-sim-247538292/gogobee.db
2026/05/17 14:33:36 INFO database initialized path=/tmp/expedition-sim-12727718/gogobee.db
2026/05/17 14:33:36 INFO database initialized path=/tmp/expedition-sim-493249432/gogobee.db
2026/05/17 14:33:36 INFO database initialized path=/tmp/expedition-sim-3457453074/gogobee.db
2026/05/17 14:33:36 INFO database initialized path=/tmp/expedition-sim-4126564222/gogobee.db
2026/05/17 14:33:36 INFO database initialized path=/tmp/expedition-sim-2948190870/gogobee.db
2026/05/17 14:33:36 INFO dnd: armed ability fired (turn-based build) user=@sim:cleric-l12-underdark-11 ability="Healing Word"
2026/05/17 14:33:36 INFO database initialized path=/tmp/expedition-sim-2937358906/gogobee.db
2026/05/17 14:33:36 INFO dnd: armed ability fired (turn-based build) user=@sim:cleric-l12-underdark-11 ability="Healing Word"
2026/05/17 14:33:36 INFO dnd: armed ability fired (turn-based build) user=@sim:cleric-l12-manor_blackspire-14 ability="Healing Word"
2026/05/17 14:33:36 INFO dnd: armed ability fired (turn-based build) user=@sim:cleric-l12-underdark-11 ability="Healing Word"
2026/05/17 14:33:36 INFO dnd: armed ability fired (turn-based build) user=@sim:cleric-l12-manor_blackspire-14 ability="Healing Word"
2026/05/17 14:33:36 INFO dnd: armed ability fired (turn-based build) user=@sim:cleric-l12-manor_blackspire-14 ability="Healing Word"
2026/05/17 14:33:36 WARN auto-heal cleanup: short on inventory user=@sim:cleric-l12-underdark-11 wanted=1 removed=0
2026/05/17 14:33:36 INFO database initialized path=/tmp/expedition-sim-2940956075/gogobee.db
2026/05/17 14:33:36 INFO database initialized path=/tmp/expedition-sim-940255277/gogobee.db
2026/05/17 14:33:36 INFO database initialized path=/tmp/expedition-sim-1219888338/gogobee.db
2026/05/17 14:33:36 INFO database initialized path=/tmp/expedition-sim-1737695406/gogobee.db
2026/05/17 14:33:36 INFO database initialized path=/tmp/expedition-sim-1364107823/gogobee.db
2026/05/17 14:33:36 INFO database initialized path=/tmp/expedition-sim-3928809135/gogobee.db
2026/05/17 14:33:36 INFO database initialized path=/tmp/expedition-sim-2770426133/gogobee.db
2026/05/17 14:33:36 INFO database initialized path=/tmp/expedition-sim-4112019964/gogobee.db
2026/05/17 14:33:36 INFO database initialized path=/tmp/expedition-sim-2920118324/gogobee.db
2026/05/17 14:33:36 INFO database initialized path=/tmp/expedition-sim-841285958/gogobee.db
2026/05/17 14:33:36 INFO database initialized path=/tmp/expedition-sim-2359475009/gogobee.db
2026/05/17 14:33:36 INFO dnd: armed ability fired (turn-based build) user=@sim:cleric-l12-underdark-12 ability="Healing Word"
2026/05/17 14:33:36 INFO dnd: armed ability fired (turn-based build) user=@sim:cleric-l12-manor_blackspire-15 ability="Healing Word"
2026/05/17 14:33:36 INFO database initialized path=/tmp/expedition-sim-4003732719/gogobee.db
2026/05/17 14:33:36 INFO dnd: armed ability fired (turn-based build) user=@sim:cleric-l12-manor_blackspire-15 ability="Healing Word"
2026/05/17 14:33:36 INFO dnd: armed ability fired (turn-based build) user=@sim:cleric-l12-underdark-12 ability="Healing Word"
2026/05/17 14:33:36 INFO dnd: armed ability fired (turn-based build) user=@sim:cleric-l12-manor_blackspire-15 ability="Healing Word"
2026/05/17 14:33:36 INFO dnd: armed ability fired (turn-based build) user=@sim:cleric-l12-underdark-12 ability="Healing Word"
2026/05/17 14:33:36 WARN auto-heal cleanup: short on inventory user=@sim:cleric-l12-manor_blackspire-15 wanted=1 removed=0
2026/05/17 14:33:36 WARN auto-heal cleanup: short on inventory user=@sim:cleric-l12-manor_blackspire-15 wanted=1 removed=0
2026/05/17 14:33:36 WARN auto-heal cleanup: short on inventory user=@sim:cleric-l12-manor_blackspire-15 wanted=1 removed=0
2026/05/17 14:33:36 WARN auto-heal cleanup: short on inventory user=@sim:cleric-l12-manor_blackspire-15 wanted=1 removed=0
2026/05/17 14:33:36 INFO database initialized path=/tmp/expedition-sim-1124627013/gogobee.db
2026/05/17 14:33:36 WARN auto-heal cleanup: short on inventory user=@sim:cleric-l12-manor_blackspire-15 wanted=1 removed=0
2026/05/17 14:33:36 WARN auto-heal cleanup: short on inventory user=@sim:cleric-l12-underdark-12 wanted=1 removed=0
2026/05/17 14:33:37 INFO database initialized path=/tmp/expedition-sim-3360721450/gogobee.db
2026/05/17 14:33:37 INFO database initialized path=/tmp/expedition-sim-2189731270/gogobee.db
2026/05/17 14:33:37 INFO database initialized path=/tmp/expedition-sim-2135723417/gogobee.db
2026/05/17 14:33:37 INFO database initialized path=/tmp/expedition-sim-4081839001/gogobee.db
2026/05/17 14:33:37 INFO database initialized path=/tmp/expedition-sim-3089792466/gogobee.db
2026/05/17 14:33:37 INFO database initialized path=/tmp/expedition-sim-2658215845/gogobee.db
2026/05/17 14:33:37 INFO database initialized path=/tmp/expedition-sim-711568570/gogobee.db
2026/05/17 14:33:37 INFO database initialized path=/tmp/expedition-sim-2452659043/gogobee.db
2026/05/17 14:33:37 INFO database initialized path=/tmp/expedition-sim-690174537/gogobee.db
2026/05/17 14:33:37 INFO dnd: armed ability fired (turn-based build) user=@sim:cleric-l12-manor_blackspire-16 ability="Healing Word"
2026/05/17 14:33:37 INFO dnd: armed ability fired (turn-based build) user=@sim:cleric-l12-manor_blackspire-16 ability="Healing Word"
2026/05/17 14:33:37 INFO dnd: armed ability fired (turn-based build) user=@sim:cleric-l12-manor_blackspire-16 ability="Healing Word"
2026/05/17 14:33:37 INFO database initialized path=/tmp/expedition-sim-1712861838/gogobee.db
2026/05/17 14:33:37 INFO database initialized path=/tmp/expedition-sim-839790690/gogobee.db
2026/05/17 14:33:37 INFO dnd: armed ability fired (turn-based build) user=@sim:cleric-l12-underdark-13 ability="Healing Word"
2026/05/17 14:33:37 INFO dnd: armed ability fired (turn-based build) user=@sim:cleric-l12-underdark-13 ability="Healing Word"
2026/05/17 14:33:37 INFO dnd: armed ability fired (turn-based build) user=@sim:cleric-l12-underdark-13 ability="Healing Word"
2026/05/17 14:33:37 WARN auto-heal cleanup: short on inventory user=@sim:cleric-l12-underdark-13 wanted=1 removed=0
2026/05/17 14:33:37 INFO database initialized path=/tmp/expedition-sim-2069258505/gogobee.db
2026/05/17 14:33:37 INFO database initialized path=/tmp/expedition-sim-448809708/gogobee.db
2026/05/17 14:33:37 INFO database initialized path=/tmp/expedition-sim-870225890/gogobee.db
2026/05/17 14:33:37 INFO database initialized path=/tmp/expedition-sim-1394846529/gogobee.db
2026/05/17 14:33:37 INFO database initialized path=/tmp/expedition-sim-713189544/gogobee.db
2026/05/17 14:33:37 INFO database initialized path=/tmp/expedition-sim-3333028202/gogobee.db
2026/05/17 14:33:37 INFO database initialized path=/tmp/expedition-sim-3490413428/gogobee.db
2026/05/17 14:33:37 INFO database initialized path=/tmp/expedition-sim-216826575/gogobee.db
2026/05/17 14:33:37 INFO database initialized path=/tmp/expedition-sim-2600575392/gogobee.db
2026/05/17 14:33:37 INFO dnd: armed ability fired (turn-based build) user=@sim:cleric-l12-manor_blackspire-17 ability="Healing Word"
2026/05/17 14:33:37 INFO database initialized path=/tmp/expedition-sim-3247025114/gogobee.db
2026/05/17 14:33:37 INFO dnd: armed ability fired (turn-based build) user=@sim:cleric-l12-manor_blackspire-17 ability="Healing Word"
2026/05/17 14:33:37 INFO dnd: armed ability fired (turn-based build) user=@sim:cleric-l12-manor_blackspire-17 ability="Healing Word"
2026/05/17 14:33:37 INFO database initialized path=/tmp/expedition-sim-575813843/gogobee.db
2026/05/17 14:33:37 WARN auto-heal cleanup: short on inventory user=@sim:cleric-l12-manor_blackspire-17 wanted=1 removed=0
2026/05/17 14:33:37 INFO database initialized path=/tmp/expedition-sim-852951387/gogobee.db
2026/05/17 14:33:37 INFO dnd: armed ability fired (turn-based build) user=@sim:cleric-l12-underdark-14 ability="Healing Word"
2026/05/17 14:33:37 INFO dnd: armed ability fired (turn-based build) user=@sim:cleric-l12-underdark-14 ability="Healing Word"
2026/05/17 14:33:37 INFO dnd: armed ability fired (turn-based build) user=@sim:cleric-l12-underdark-14 ability="Healing Word"
2026/05/17 14:33:37 WARN auto-heal cleanup: short on inventory user=@sim:cleric-l12-underdark-14 wanted=1 removed=0
2026/05/17 14:33:37 WARN auto-heal cleanup: short on inventory user=@sim:cleric-l12-underdark-14 wanted=1 removed=0
2026/05/17 14:33:37 INFO database initialized path=/tmp/expedition-sim-1698113894/gogobee.db
2026/05/17 14:33:37 INFO database initialized path=/tmp/expedition-sim-3570143397/gogobee.db
2026/05/17 14:33:37 INFO database initialized path=/tmp/expedition-sim-2415058239/gogobee.db
2026/05/17 14:33:37 INFO database initialized path=/tmp/expedition-sim-637325677/gogobee.db
2026/05/17 14:33:37 INFO database initialized path=/tmp/expedition-sim-1149336246/gogobee.db
2026/05/17 14:33:37 INFO database initialized path=/tmp/expedition-sim-2613071951/gogobee.db
2026/05/17 14:33:37 INFO database initialized path=/tmp/expedition-sim-4240410874/gogobee.db
2026/05/17 14:33:37 INFO database initialized path=/tmp/expedition-sim-1918837118/gogobee.db
2026/05/17 14:33:37 INFO dnd: armed ability fired (turn-based build) user=@sim:cleric-l12-manor_blackspire-18 ability="Healing Word"
2026/05/17 14:33:37 INFO dnd: armed ability fired (turn-based build) user=@sim:cleric-l12-manor_blackspire-18 ability="Healing Word"
2026/05/17 14:33:37 INFO dnd: armed ability fired (turn-based build) user=@sim:cleric-l12-manor_blackspire-18 ability="Healing Word"
2026/05/17 14:33:37 INFO database initialized path=/tmp/expedition-sim-1562628221/gogobee.db
2026/05/17 14:33:37 INFO database initialized path=/tmp/expedition-sim-741594747/gogobee.db
2026/05/17 14:33:37 INFO database initialized path=/tmp/expedition-sim-3917775001/gogobee.db
2026/05/17 14:33:37 INFO dnd: armed ability fired (turn-based build) user=@sim:cleric-l12-underdark-15 ability="Healing Word"
2026/05/17 14:33:37 INFO dnd: armed ability fired (turn-based build) user=@sim:cleric-l12-underdark-15 ability="Healing Word"
2026/05/17 14:33:37 INFO dnd: armed ability fired (turn-based build) user=@sim:cleric-l12-underdark-15 ability="Healing Word"
2026/05/17 14:33:37 WARN auto-heal cleanup: short on inventory user=@sim:cleric-l12-underdark-15 wanted=1 removed=0
2026/05/17 14:33:37 INFO database initialized path=/tmp/expedition-sim-1103274777/gogobee.db
2026/05/17 14:33:37 INFO database initialized path=/tmp/expedition-sim-2655969463/gogobee.db
2026/05/17 14:33:37 INFO database initialized path=/tmp/expedition-sim-2440241823/gogobee.db
2026/05/17 14:33:37 INFO database initialized path=/tmp/expedition-sim-3285403820/gogobee.db
2026/05/17 14:33:37 INFO dnd: armed ability fired (turn-based build) user=@sim:cleric-l12-manor_blackspire-19 ability="Healing Word"
2026/05/17 14:33:37 INFO database initialized path=/tmp/expedition-sim-1632108061/gogobee.db
2026/05/17 14:33:37 INFO dnd: armed ability fired (turn-based build) user=@sim:cleric-l12-manor_blackspire-19 ability="Healing Word"
2026/05/17 14:33:37 INFO database initialized path=/tmp/expedition-sim-704442070/gogobee.db
2026/05/17 14:33:37 INFO dnd: armed ability fired (turn-based build) user=@sim:cleric-l12-manor_blackspire-19 ability="Healing Word"
2026/05/17 14:33:37 INFO database initialized path=/tmp/expedition-sim-917462476/gogobee.db
2026/05/17 14:33:37 INFO database initialized path=/tmp/expedition-sim-702958523/gogobee.db
2026/05/17 14:33:37 INFO dnd: armed ability fired (turn-based build) user=@sim:cleric-l12-underdark-16 ability="Healing Word"
2026/05/17 14:33:37 INFO dnd: armed ability fired (turn-based build) user=@sim:cleric-l12-underdark-16 ability="Healing Word"
2026/05/17 14:33:37 INFO dnd: armed ability fired (turn-based build) user=@sim:cleric-l12-underdark-16 ability="Healing Word"
2026/05/17 14:33:37 WARN auto-heal cleanup: short on inventory user=@sim:cleric-l12-underdark-16 wanted=1 removed=0
2026/05/17 14:33:37 INFO database initialized path=/tmp/expedition-sim-3461168624/gogobee.db
2026/05/17 14:33:38 INFO database initialized path=/tmp/expedition-sim-2994824878/gogobee.db
2026/05/17 14:33:38 INFO database initialized path=/tmp/expedition-sim-2518451673/gogobee.db
2026/05/17 14:33:38 INFO dnd: armed ability fired (turn-based build) user=@sim:cleric-l12-underdark-17 ability="Healing Word"
2026/05/17 14:33:38 INFO dnd: armed ability fired (turn-based build) user=@sim:cleric-l12-underdark-17 ability="Healing Word"
2026/05/17 14:33:38 INFO dnd: armed ability fired (turn-based build) user=@sim:cleric-l12-underdark-17 ability="Healing Word"
2026/05/17 14:33:38 WARN auto-heal cleanup: short on inventory user=@sim:cleric-l12-underdark-17 wanted=1 removed=0
2026/05/17 14:33:38 INFO database initialized path=/tmp/expedition-sim-3320304407/gogobee.db
2026/05/17 14:33:38 INFO database initialized path=/tmp/expedition-sim-1135211496/gogobee.db
2026/05/17 14:33:38 INFO dnd: armed ability fired (turn-based build) user=@sim:cleric-l12-underdark-18 ability="Healing Word"
2026/05/17 14:33:38 INFO dnd: armed ability fired (turn-based build) user=@sim:cleric-l12-underdark-18 ability="Healing Word"
2026/05/17 14:33:38 INFO dnd: armed ability fired (turn-based build) user=@sim:cleric-l12-underdark-18 ability="Healing Word"
2026/05/17 14:33:38 WARN auto-heal cleanup: short on inventory user=@sim:cleric-l12-underdark-18 wanted=1 removed=0
2026/05/17 14:33:38 INFO database initialized path=/tmp/expedition-sim-741208661/gogobee.db
2026/05/17 14:33:38 INFO dnd: armed ability fired (turn-based build) user=@sim:cleric-l12-underdark-19 ability="Healing Word"
2026/05/17 14:33:38 INFO dnd: armed ability fired (turn-based build) user=@sim:cleric-l12-underdark-19 ability="Healing Word"
2026/05/17 14:33:38 INFO dnd: armed ability fired (turn-based build) user=@sim:cleric-l12-underdark-19 ability="Healing Word"
2026/05/17 14:33:38 WARN auto-heal cleanup: short on inventory user=@sim:cleric-l12-underdark-19 wanted=1 removed=0
2026/05/17 14:33:38 WARN auto-heal cleanup: short on inventory user=@sim:cleric-l12-underdark-19 wanted=1 removed=0

240
sim_results/j2_traces.jsonl Normal file

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,151 @@
class level zone n p50_yld p50_yld_clr mean_yld mean_rms %clr %boss %tpk %fled %ext
bard 3 dragons_lair 100 0 0 0 0 0 0 0 0 0
bard 7 dragons_lair 100 3 0 3.7 5.7 0 24 98 0 2
bard 12 dragons_lair 100 3 0 4.2 7.5 0 77 100 0 0
cleric 3 dragons_lair 100 0 0 0 0 0 0 0 0 0
cleric 7 dragons_lair 100 3 0 3.4 5.4 0 7 100 0 0
cleric 12 dragons_lair 100 3 0 3.6 7.1 0 60 100 0 0
druid 3 dragons_lair 100 0 0 0 0 0 0 0 0 0
druid 7 dragons_lair 100 3 0 3.5 5.8 0 29 99 0 1
druid 12 dragons_lair 100 4 0 4.1 7.4 0 72 97 0 3
fighter 3 dragons_lair 100 0 0 0 0 0 0 0 0 0
fighter 7 dragons_lair 100 3 0 3.9 6.8 0 56 97 0 3
fighter 12 dragons_lair 100 3 0 3.6 8 0 99 100 0 0
mage 3 dragons_lair 100 0 0 0 0 0 0 0 0 0
mage 7 dragons_lair 100 4 0 4.9 5.6 0 25 99 0 1
mage 12 dragons_lair 100 5 0 5.5 7.3 0 68 100 0 0
paladin 3 dragons_lair 100 0 0 0 0 0 0 0 0 0
paladin 7 dragons_lair 100 2 0 3.1 6.9 0 65 99 0 1
paladin 12 dragons_lair 100 4 0 4.5 7.9 0 95 100 0 0
ranger 3 dragons_lair 100 0 0 0 0 0 0 0 0 0
ranger 7 dragons_lair 100 8 0 8.5 7.8 0 91 98 0 2
ranger 12 dragons_lair 100 8 0 8.8 8 0 99 100 0 0
rogue 3 dragons_lair 100 0 0 0 0 0 0 0 0 0
rogue 7 dragons_lair 100 5 0 4.8 6.5 0 53 94 0 6
rogue 12 dragons_lair 100 5 0 6.6 7.9 0 97 100 0 0
sorcerer 3 dragons_lair 100 0 0 0 0 0 0 0 0 0
sorcerer 7 dragons_lair 100 5 0 5.1 5.2 0 18 100 0 0
sorcerer 12 dragons_lair 100 5 0 5.4 7.2 0 62 100 0 0
warlock 3 dragons_lair 100 0 0 0 0 0 0 0 0 0
warlock 7 dragons_lair 100 4 0 4.1 6 0 34 99 0 1
warlock 12 dragons_lair 100 4 0 4.4 7.5 0 76 98 0 2
bard 3 forest_shadows 100 3 0 4.1 4.2 0 1 100 0 0
bard 7 forest_shadows 100 6 0 7.1 6 0 99 100 0 0
bard 12 forest_shadows 100 7 7 7.8 7 100 100 0 0 0
cleric 3 forest_shadows 100 5 0 5.6 4.7 0 3 100 0 0
cleric 7 forest_shadows 100 6 1 6.7 5.7 5 68 95 0 0
cleric 12 forest_shadows 100 7 8 8.6 6.6 81 81 19 0 0
druid 3 forest_shadows 100 5 0 5.1 5.1 0 13 100 0 0
druid 7 forest_shadows 100 6 5 7.6 6.9 91 100 9 0 0
druid 12 forest_shadows 100 7 7 7.7 7 100 100 0 0 0
fighter 3 forest_shadows 100 5 0 5.8 5.3 0 25 100 0 0
fighter 7 forest_shadows 100 6 6 6.5 7 100 100 0 0 0
fighter 12 forest_shadows 100 6 6 7.4 7 100 100 0 0 0
mage 3 forest_shadows 100 4 0 4.4 3.8 0 0 100 0 0
mage 7 forest_shadows 100 6 7 7 6.9 89 98 11 0 0
mage 12 forest_shadows 100 7 7 7.4 7 100 100 0 0 0
paladin 3 forest_shadows 100 6 0 6.9 5.8 0 77 100 0 0
paladin 7 forest_shadows 100 6 6 6.6 7 100 100 0 0 0
paladin 12 forest_shadows 100 6 6 6.4 7 100 100 0 0 0
ranger 3 forest_shadows 100 12 0 11.8 5.3 0 33 100 0 0
ranger 7 forest_shadows 100 16 16 17.5 6 3 100 97 0 0
ranger 12 forest_shadows 100 14 14 16 7 100 100 0 0 0
rogue 3 forest_shadows 100 5 0 6.3 5.7 0 69 100 0 0
rogue 7 forest_shadows 100 6 7 6.9 6.8 80 100 20 0 0
rogue 12 forest_shadows 100 7 7 6.9 7 100 100 0 0 0
sorcerer 3 forest_shadows 100 3 0 4.1 3.6 0 0 100 0 0
sorcerer 7 forest_shadows 100 6 6 7.5 6.5 62 85 38 0 0
sorcerer 12 forest_shadows 100 6 6 7.2 7 100 100 0 0 0
warlock 3 forest_shadows 100 4 0 4.6 4.1 0 0 100 0 0
warlock 7 forest_shadows 100 6 6 6.6 6.4 45 96 55 0 0
warlock 12 forest_shadows 100 5 5 6.5 7 100 100 0 0 0
bard 3 goblin_warrens 100 5 0 4.8 4.9 0 93 100 0 0
bard 7 goblin_warrens 100 4 4 5.4 6 99 99 1 0 0
bard 12 goblin_warrens 100 4 4 4.5 6 100 100 0 0 0
cleric 3 goblin_warrens 100 4 3 4.3 5 9 86 91 0 0
cleric 7 goblin_warrens 100 4 4 5.2 5.9 96 96 4 0 0
cleric 12 goblin_warrens 100 4 4 4.9 5.9 96 96 4 0 0
druid 3 goblin_warrens 100 5 5 5.1 5.6 67 92 33 0 0
druid 7 goblin_warrens 100 3 3 4.1 6 100 100 0 0 0
druid 12 goblin_warrens 100 4 4 4.8 6 100 100 0 0 0
fighter 3 goblin_warrens 100 4 5 5.1 5.6 66 94 34 0 0
fighter 7 goblin_warrens 100 4 4 5.2 6 100 100 0 0 0
fighter 12 goblin_warrens 100 4 4 5 6 100 100 0 0 0
mage 3 goblin_warrens 100 7 7 6.8 5.6 68 87 32 0 0
mage 7 goblin_warrens 100 5 5 6.3 6 100 100 0 0 0
mage 12 goblin_warrens 100 7 7 7.5 6 100 100 0 0 0
paladin 3 goblin_warrens 100 4 5 5.4 5.8 80 97 20 0 0
paladin 7 goblin_warrens 100 5 5 5.5 6 100 100 0 0 0
paladin 12 goblin_warrens 100 5 5 6.1 6 100 100 0 0 0
ranger 3 goblin_warrens 100 5 0 5.6 4.9 0 89 100 0 0
ranger 7 goblin_warrens 100 4 4 5.2 6 100 100 0 0 0
ranger 12 goblin_warrens 100 4 4 5.4 6 100 100 0 0 0
rogue 3 goblin_warrens 100 8 8 7.7 5.9 86 100 14 0 0
rogue 7 goblin_warrens 100 7 7 7.6 6 100 100 0 0 0
rogue 12 goblin_warrens 100 7 7 8 6 100 100 0 0 0
sorcerer 3 goblin_warrens 100 7 7 7.1 5.5 67 82 33 0 0
sorcerer 7 goblin_warrens 100 5 5 6.7 5.9 95 95 5 0 0
sorcerer 12 goblin_warrens 100 7 7 7 6 100 100 0 0 0
warlock 3 goblin_warrens 100 4 5 4.8 5.3 56 78 44 0 0
warlock 7 goblin_warrens 100 5 5 5.3 6 100 100 0 0 0
warlock 12 goblin_warrens 100 5 5 5.4 6 100 100 0 0 0
bard 3 manor_blackspire 100 4 0 4.5 4.6 0 2 100 0 0
bard 7 manor_blackspire 100 4 0 5.3 6 0 54 100 0 0
bard 12 manor_blackspire 100 4 3 4.5 6 1 68 99 0 0
cleric 3 manor_blackspire 100 3 0 3.9 4.4 0 0 100 0 0
cleric 7 manor_blackspire 100 4 0 4.8 5.7 0 32 100 0 0
cleric 12 manor_blackspire 100 5 5 5 6 6 58 94 0 0
druid 3 manor_blackspire 100 4 0 3.8 5 0 13 100 0 0
druid 7 manor_blackspire 100 4 0 4.9 6 0 58 100 0 0
druid 12 manor_blackspire 100 4 4 4.4 6.7 71 82 29 0 0
fighter 3 manor_blackspire 100 4 0 4.4 5.6 0 15 100 0 0
fighter 7 manor_blackspire 100 3 4 3.5 6.2 17 100 83 0 0
fighter 12 manor_blackspire 100 5 5 5.2 7 100 100 0 0 0
mage 3 manor_blackspire 100 4 0 5.6 3.9 0 0 100 0 0
mage 7 manor_blackspire 100 6 12 6.6 6 2 50 98 0 0
mage 12 manor_blackspire 100 5 6 6.1 6.5 46 68 54 0 0
paladin 3 manor_blackspire 100 3 0 4 5.7 0 42 100 0 0
paladin 7 manor_blackspire 100 3 3 4.3 6.1 5 99 95 0 0
paladin 12 manor_blackspire 100 4 4 4.3 6.9 91 100 9 0 0
ranger 3 manor_blackspire 100 4 0 5 5.4 0 17 100 0 0
ranger 7 manor_blackspire 100 5 0 5.8 6 0 100 100 0 0
ranger 12 manor_blackspire 100 5 5 5.1 6.1 10 100 90 0 0
rogue 3 manor_blackspire 100 6 0 6.6 5.6 0 42 100 0 0
rogue 7 manor_blackspire 100 6 0 7.1 6 0 98 100 0 0
rogue 12 manor_blackspire 100 6 6 6.6 6.8 82 100 18 0 0
sorcerer 3 manor_blackspire 100 5 0 5.2 3.6 0 0 100 0 0
sorcerer 7 manor_blackspire 100 7 0 8 5.9 0 40 100 0 0
sorcerer 12 manor_blackspire 100 5 5 7 6.5 47 69 53 0 0
warlock 3 manor_blackspire 100 4 0 4.8 4.4 0 0 100 0 0
warlock 7 manor_blackspire 100 4 0 5.4 6 0 49 100 0 0
warlock 12 manor_blackspire 100 5 4 5.5 6.3 27 80 73 0 0
bard 3 underdark 100 0 0 0 0 0 0 0 0 0
bard 7 underdark 100 2 0 3 3.7 0 5 100 0 0
bard 12 underdark 100 4 0 4.4 5.7 0 64 100 0 0
cleric 3 underdark 100 0 0 0 0 0 0 0 0 0
cleric 7 underdark 100 2 0 3.5 3.1 0 1 100 0 0
cleric 12 underdark 100 3 0 4.3 4.8 1 10 99 0 0
druid 3 underdark 100 0 0 0 0 0 0 0 0 0
druid 7 underdark 100 4 0 3.9 3.7 0 4 100 0 0
druid 12 underdark 100 5 5 5.7 6.2 33 77 67 0 0
fighter 3 underdark 100 0 0 0 0 0 0 0 0 0
fighter 7 underdark 100 4 6 5.5 6.1 10 90 90 0 0
fighter 12 underdark 100 4 4 4.7 7 100 100 0 0 0
mage 3 underdark 100 0 0 0 0 0 0 0 0 0
mage 7 underdark 100 2 0 2.9 3.4 0 1 100 0 0
mage 12 underdark 100 3 4 4.2 5.6 17 44 83 0 0
paladin 3 underdark 100 0 0 0 0 0 0 0 0 0
paladin 7 underdark 100 5 0 5.5 5.9 0 89 100 0 0
paladin 12 underdark 100 4 4 4.7 6.9 87 100 13 0 0
ranger 3 underdark 100 0 0 0 0 0 0 0 0 0
ranger 7 underdark 100 10 0 11.8 6 0 98 100 0 0
ranger 12 underdark 100 10 16 10.1 6 4 100 96 0 0
rogue 3 underdark 100 0 0 0 0 0 0 0 0 0
rogue 7 underdark 100 5 3 5.3 5.9 1 78 99 0 0
rogue 12 underdark 100 4 4 5 7 99 100 1 0 0
sorcerer 3 underdark 100 0 0 0 0 0 0 0 0 0
sorcerer 7 underdark 100 2 0 3.1 3.1 0 1 100 0 0
sorcerer 12 underdark 100 3 3 3.6 5.1 10 29 90 0 0
warlock 3 underdark 100 0 0 0 0 0 0 0 0 0
warlock 7 underdark 100 3 0 4 3.6 0 5 100 0 0
warlock 12 underdark 100 5 7 5.3 5.8 9 64 91 0 0

View File

@@ -0,0 +1,67 @@
# J2a — autoResolveCombat cast+consume picker (verification sweep)
**Date:** 2026-05-17
**Corpus:** `sim_results/j2a_traces.jsonl` — 240 runs (6 classes × {manor_blackspire, underdark} × L12 × n=20)
**Pre-state corpus:** `sim_results/j2_traces.jsonl` (same shape, picker disabled). See [j2_findings.md](j2_findings.md) for the strawman diagnosis that motivated this fix.
## What J2a shipped
- `internal/plugin/expedition_sim.go`:
- New `simPickCombatAction(uid, sess)` decision tree:
1. HP < 40% MaxHP + heal consumable in inventory → `!consume <heal>`
2. Caster with a usable damage spell (slot or cantrip) → `!cast <spell>`
3. Otherwise → `!attack`
- New `simPickSpell(c, uid)` ranks prepared damage-effect spells by slot level (descending) then expected damage from the dice string. Reaction-cast spells excluded; non-cantrips require an available slot at their native level (no upcasting in v1).
- `BuildCharacter` now calls `ensureSpellsForCharacter` so the synthetic spellbook is populated (prod players hit this on character creation; the sim path skipped it).
- `autoResolveCombat` dispatches via the picker instead of always swinging.
Built on top of the per-round `-trace` plumbing landed earlier in J2 (`SimCombatSummary.Events`, `SetSimIncludeTrace`).
## Verification (n=20 per cell, L12 only — same cells as j2_findings)
| class | zone | n | reachBoss | won | lost | rnd | pDmg | eDmg | slotRuns | casts | consumeRuns | eHP@loss |
|----------|------------------|----|-----------|-----|------|------|-------|-------|----------|-------|-------------|----------|
| mage | manor_blackspire | 20 | 15 | **12** | 3 | 7.2 | 133.0 | 74.3 | 15 / 15 | 93 | 12 | 83.3 |
| mage | underdark | 20 | 8 | 3 | 5 | 7.0 | 143.8 | 78.6 | 8 / 8 | 54 | 2 | 34.2 |
| cleric | manor_blackspire | 20 | 6 | 2 | 4 | 11.3 | 101.3 | 146.2 | 6 / 6 | 58 | 5 | 64.8 |
| cleric | underdark | 20 | 4 | 0 | 4 | 7.0 | 74.5 | 89.5 | 4 / 4 | 28 | 0 | 87.5 |
| sorcerer | manor_blackspire | 20 | 13 | **9** | 4 | 8.0 | 130.9 | 87.3 | 13 / 13 | 91 | 8 | 53.2 |
| sorcerer | underdark | 20 | 7 | 1 | 6 | 5.9 | 89.6 | 67.4 | 7 / 7 | 40 | 1 | 86.2 |
| warlock | manor_blackspire | 20 | 12 | 6 | 6 | 13.2 | 131.0 | 140.6 | 12 / 12 | 141 | 9 | 45.5 |
| warlock | underdark | 20 | 15 | 0 | 15 | 6.8 | 74.3 | 82.5 | 15 / 15 | 101 | 1 | 87.7 |
| bard | manor_blackspire | 20 | 12 | 0 | 12 | 10.6 | 68.1 | 128.2 | 12 / 12 | 117 | 6 | 75.9 |
| bard | underdark | 20 | 12 | 0 | 12 | 11.2 | 74.3 | 108.8 | 12 / 12 | 132 | 2 | 87.7 |
| druid | manor_blackspire | 20 | 15 | **14** | 1 | 6.9 | 142.6 | 84.5 | 15 / 15 | 87 | 11 | 79.0 |
| druid | underdark | 20 | 18 | 3 | 15 | 5.1 | 123.3 | 82.3 | 18 / 18 | 85 | 5 | 47.5 |
`slotRuns` = boss fights where ≥1 spell_cast fired. `casts` = total spell_cast events. `consumeRuns` = fights with ≥1 use_consumable. `eHP@loss` = mean enemy HP remaining when player lost.
## DoD check
- **J2a DoD: ≥80% of boss fights produce a cast or consumable use.** **MET** — every cell shows `slotRuns == reachBoss` (100% cast rate).
- Manor mean clear (5 trailer casters): mage 60%, sorcerer 45%, warlock 30%, bard 0%, cleric 10%. Mage and sorcerer clear the ≥40% J2 target on the strength of the sim fix alone; warlock/cleric are close, bard is the one outlier still at zero.
- Druid jumped 0% → 70% manor / 0% → 15% underdark. Pre-J2a it was the lone mid-band class on weapon-attack alone; with cast on top, druid pulls into the top tier.
## What's still broken and why
- **Bard 0% clear despite firing 117 casts/cell.** Bard's prepared damage spell registry is thin: `vicious_mockery` cantrip (4d4 at L11) and `shatter` L2 (3d8) are the only damage-effect options in `defaultKnownSpells`. Every other bard spell is control/buff/heal, which the v1 picker skips. Bard's average pDmg 68 in 11-round fights = 6/round — that's accurate for the spell pool, not a picker bug. Fix candidates: (a) extend bard's default known-spell list with a damage L3+; (b) widen picker to score `EffectControl` (hold_person, hypnotic_pattern) which trivializes enemy turns and effectively converts to damage by buying free player rounds; (c) include healing spells in the consume-priority path. **(b)** has the highest expected ROI and lifts cleric and warlock too.
- **Cleric still bottom-of-table.** 10% manor / 0% underdark. Cleric's damage-effect spells: `sacred_flame` cantrip (4d8 at L11) — that's it. Same shape problem as bard. `spiritual_weapon`, `bless`, `guiding_bolt`, `cure_wounds` aren't reachable by the v1 picker. Fix: same as bard — score control spells and recognise heal spells as alternatives to consumables (cleric has 40-HP healing word at low slot cost).
- **Warlock underdark 0%.** Different shape: high cast rate (101 casts/15 fights = 7/round), high player damage (74), but loses anyway because enemy damage averaged 82.5 and warlock has no defensive lever. Underdark boss is dropping warlock before warlock can drop it. This is a class-balance problem the post-J2b corpus needs to confirm before we move on.
## Implications for J2b (the big re-baseline)
A full n=100 all-classes baseline (`sim_results/baseline_j2a_all10.jsonl`) is kicked off; that replaces `baseline_j1_all10.jsonl` as the canonical post-fix corpus. Expected shape:
- Mage / sorcerer / druid pull into mid-band (4070% L12 clear range).
- Bard / cleric stay at bottom, but the *reason* is a thin damage-spell pool, not a sim artifact.
- Warlock somewhere middle; partial-clear depending on zone.
- Martials should be unchanged (picker is a no-op for non-casters with no low-HP heal trigger).
If that picture holds, the right J2 follow-up is **picker widening** (control + heal scoring) rather than per-class balance riders. Cleaner than five class buffs.
## Files touched
- `internal/plugin/expedition_sim.go` — picker, BuildCharacter spell-seed, dispatch in autoResolveCombat.
- `cmd/expedition-sim/main.go` — already had `-trace` from earlier in J2.
No prod paths changed. The fix is sim-scoped.

406
sim_results/j2a_traces.err Normal file
View File

@@ -0,0 +1,406 @@
2026/05/17 14:43:54 INFO database initialized path=/tmp/expedition-sim-2841882662/gogobee.db
2026/05/17 14:43:54 INFO dnd: armed ability fired (turn-based build) user=@sim:cleric-l12-underdark-0 ability="Healing Word"
2026/05/17 14:43:54 INFO dnd: armed ability fired (turn-based build) user=@sim:cleric-l12-underdark-0 ability="Healing Word"
2026/05/17 14:43:54 INFO dnd: armed ability fired (turn-based build) user=@sim:cleric-l12-underdark-0 ability="Healing Word"
2026/05/17 14:43:54 WARN auto-heal cleanup: short on inventory user=@sim:cleric-l12-underdark-0 wanted=1 removed=0
2026/05/17 14:43:54 WARN auto-heal cleanup: short on inventory user=@sim:cleric-l12-underdark-0 wanted=1 removed=0
2026/05/17 14:43:54 INFO database initialized path=/tmp/expedition-sim-225352482/gogobee.db
2026/05/17 14:43:54 INFO database initialized path=/tmp/expedition-sim-4205788393/gogobee.db
2026/05/17 14:43:54 INFO dnd: armed ability fired (turn-based build) user=@sim:cleric-l12-underdark-1 ability="Healing Word"
2026/05/17 14:43:54 INFO dnd: armed ability fired (turn-based build) user=@sim:cleric-l12-underdark-1 ability="Healing Word"
2026/05/17 14:43:54 INFO dnd: armed ability fired (turn-based build) user=@sim:cleric-l12-underdark-1 ability="Healing Word"
2026/05/17 14:43:54 WARN auto-heal cleanup: short on inventory user=@sim:cleric-l12-underdark-1 wanted=1 removed=0
2026/05/17 14:43:54 WARN auto-heal cleanup: short on inventory user=@sim:cleric-l12-underdark-1 wanted=1 removed=0
2026/05/17 14:43:54 WARN auto-heal cleanup: short on inventory user=@sim:cleric-l12-underdark-1 wanted=1 removed=0
2026/05/17 14:43:54 INFO database initialized path=/tmp/expedition-sim-1930907323/gogobee.db
2026/05/17 14:43:54 INFO database initialized path=/tmp/expedition-sim-2608712787/gogobee.db
2026/05/17 14:43:54 INFO database initialized path=/tmp/expedition-sim-1176694106/gogobee.db
2026/05/17 14:43:54 INFO dnd: armed ability fired (turn-based build) user=@sim:cleric-l12-manor_blackspire-0 ability="Healing Word"
2026/05/17 14:43:54 INFO dnd: armed ability fired (turn-based build) user=@sim:cleric-l12-manor_blackspire-0 ability="Healing Word"
2026/05/17 14:43:54 INFO dnd: armed ability fired (turn-based build) user=@sim:cleric-l12-manor_blackspire-0 ability="Healing Word"
2026/05/17 14:43:54 INFO database initialized path=/tmp/expedition-sim-2955343031/gogobee.db
2026/05/17 14:43:54 INFO dnd: armed ability fired (turn-based build) user=@sim:cleric-l12-underdark-2 ability="Healing Word"
2026/05/17 14:43:54 INFO dnd: armed ability fired (turn-based build) user=@sim:cleric-l12-underdark-2 ability="Healing Word"
2026/05/17 14:43:54 INFO dnd: armed ability fired (turn-based build) user=@sim:cleric-l12-underdark-2 ability="Healing Word"
2026/05/17 14:43:54 WARN auto-heal cleanup: short on inventory user=@sim:cleric-l12-underdark-2 wanted=1 removed=0
2026/05/17 14:43:54 WARN auto-heal cleanup: short on inventory user=@sim:cleric-l12-underdark-2 wanted=1 removed=0
2026/05/17 14:43:54 INFO database initialized path=/tmp/expedition-sim-4034633129/gogobee.db
2026/05/17 14:43:54 INFO database initialized path=/tmp/expedition-sim-2929207905/gogobee.db
2026/05/17 14:43:54 INFO database initialized path=/tmp/expedition-sim-2110260434/gogobee.db
2026/05/17 14:43:54 INFO database initialized path=/tmp/expedition-sim-2284107973/gogobee.db
2026/05/17 14:43:54 INFO database initialized path=/tmp/expedition-sim-412795061/gogobee.db
2026/05/17 14:43:54 INFO database initialized path=/tmp/expedition-sim-1173027611/gogobee.db
2026/05/17 14:43:54 INFO dnd: armed ability fired (turn-based build) user=@sim:cleric-l12-manor_blackspire-1 ability="Healing Word"
2026/05/17 14:43:54 INFO dnd: armed ability fired (turn-based build) user=@sim:cleric-l12-manor_blackspire-1 ability="Healing Word"
2026/05/17 14:43:54 INFO database initialized path=/tmp/expedition-sim-2445381708/gogobee.db
2026/05/17 14:43:54 INFO dnd: armed ability fired (turn-based build) user=@sim:cleric-l12-manor_blackspire-1 ability="Healing Word"
2026/05/17 14:43:54 INFO database initialized path=/tmp/expedition-sim-1821032632/gogobee.db
2026/05/17 14:43:54 INFO database initialized path=/tmp/expedition-sim-2786520320/gogobee.db
2026/05/17 14:43:54 INFO database initialized path=/tmp/expedition-sim-3005065205/gogobee.db
2026/05/17 14:43:55 INFO database initialized path=/tmp/expedition-sim-791965660/gogobee.db
2026/05/17 14:43:55 INFO database initialized path=/tmp/expedition-sim-2223320144/gogobee.db
2026/05/17 14:43:55 INFO database initialized path=/tmp/expedition-sim-60870279/gogobee.db
2026/05/17 14:43:55 INFO database initialized path=/tmp/expedition-sim-3836426391/gogobee.db
2026/05/17 14:43:55 INFO dnd: armed ability fired (turn-based build) user=@sim:cleric-l12-underdark-3 ability="Healing Word"
2026/05/17 14:43:55 INFO dnd: armed ability fired (turn-based build) user=@sim:cleric-l12-underdark-3 ability="Healing Word"
2026/05/17 14:43:55 INFO dnd: armed ability fired (turn-based build) user=@sim:cleric-l12-underdark-3 ability="Healing Word"
2026/05/17 14:43:55 WARN auto-heal cleanup: short on inventory user=@sim:cleric-l12-underdark-3 wanted=1 removed=0
2026/05/17 14:43:55 INFO database initialized path=/tmp/expedition-sim-3903226518/gogobee.db
2026/05/17 14:43:55 WARN auto-heal cleanup: short on inventory user=@sim:cleric-l12-underdark-3 wanted=1 removed=0
2026/05/17 14:43:55 INFO database initialized path=/tmp/expedition-sim-3424518245/gogobee.db
2026/05/17 14:43:55 INFO database initialized path=/tmp/expedition-sim-3911775726/gogobee.db
2026/05/17 14:43:55 INFO dnd: armed ability fired (turn-based build) user=@sim:cleric-l12-manor_blackspire-2 ability="Healing Word"
2026/05/17 14:43:55 INFO dnd: armed ability fired (turn-based build) user=@sim:cleric-l12-manor_blackspire-2 ability="Healing Word"
2026/05/17 14:43:55 INFO dnd: armed ability fired (turn-based build) user=@sim:cleric-l12-manor_blackspire-2 ability="Healing Word"
2026/05/17 14:43:55 INFO database initialized path=/tmp/expedition-sim-557009472/gogobee.db
2026/05/17 14:43:55 INFO database initialized path=/tmp/expedition-sim-891659795/gogobee.db
2026/05/17 14:43:55 INFO database initialized path=/tmp/expedition-sim-2790310577/gogobee.db
2026/05/17 14:43:55 INFO database initialized path=/tmp/expedition-sim-1893494180/gogobee.db
2026/05/17 14:43:55 INFO database initialized path=/tmp/expedition-sim-2599204073/gogobee.db
2026/05/17 14:43:55 INFO database initialized path=/tmp/expedition-sim-3107205757/gogobee.db
2026/05/17 14:43:55 INFO database initialized path=/tmp/expedition-sim-3202057156/gogobee.db
2026/05/17 14:43:55 INFO database initialized path=/tmp/expedition-sim-2588260230/gogobee.db
2026/05/17 14:43:55 INFO dnd: armed ability fired (turn-based build) user=@sim:cleric-l12-underdark-4 ability="Healing Word"
2026/05/17 14:43:55 INFO dnd: armed ability fired (turn-based build) user=@sim:cleric-l12-underdark-4 ability="Healing Word"
2026/05/17 14:43:55 INFO dnd: armed ability fired (turn-based build) user=@sim:cleric-l12-underdark-4 ability="Healing Word"
2026/05/17 14:43:55 WARN auto-heal cleanup: short on inventory user=@sim:cleric-l12-underdark-4 wanted=1 removed=0
2026/05/17 14:43:55 INFO database initialized path=/tmp/expedition-sim-173844620/gogobee.db
2026/05/17 14:43:55 INFO dnd: armed ability fired (turn-based build) user=@sim:cleric-l12-manor_blackspire-3 ability="Healing Word"
2026/05/17 14:43:55 INFO dnd: armed ability fired (turn-based build) user=@sim:cleric-l12-manor_blackspire-3 ability="Healing Word"
2026/05/17 14:43:55 INFO dnd: armed ability fired (turn-based build) user=@sim:cleric-l12-manor_blackspire-3 ability="Healing Word"
2026/05/17 14:43:55 INFO database initialized path=/tmp/expedition-sim-3411128379/gogobee.db
2026/05/17 14:43:55 INFO database initialized path=/tmp/expedition-sim-3548322566/gogobee.db
2026/05/17 14:43:55 INFO database initialized path=/tmp/expedition-sim-3088530070/gogobee.db
2026/05/17 14:43:55 INFO database initialized path=/tmp/expedition-sim-591597397/gogobee.db
2026/05/17 14:43:55 INFO database initialized path=/tmp/expedition-sim-2749783546/gogobee.db
2026/05/17 14:43:55 INFO database initialized path=/tmp/expedition-sim-2720689093/gogobee.db
2026/05/17 14:43:55 INFO database initialized path=/tmp/expedition-sim-1695224480/gogobee.db
2026/05/17 14:43:55 INFO database initialized path=/tmp/expedition-sim-957000268/gogobee.db
2026/05/17 14:43:55 INFO dnd: armed ability fired (turn-based build) user=@sim:cleric-l12-underdark-5 ability="Healing Word"
2026/05/17 14:43:55 INFO dnd: armed ability fired (turn-based build) user=@sim:cleric-l12-underdark-5 ability="Healing Word"
2026/05/17 14:43:55 INFO dnd: armed ability fired (turn-based build) user=@sim:cleric-l12-underdark-5 ability="Healing Word"
2026/05/17 14:43:55 WARN auto-heal cleanup: short on inventory user=@sim:cleric-l12-underdark-5 wanted=1 removed=0
2026/05/17 14:43:55 INFO database initialized path=/tmp/expedition-sim-1260755451/gogobee.db
2026/05/17 14:43:55 WARN auto-heal cleanup: short on inventory user=@sim:cleric-l12-underdark-5 wanted=1 removed=0
2026/05/17 14:43:55 INFO database initialized path=/tmp/expedition-sim-974084076/gogobee.db
2026/05/17 14:43:55 INFO database initialized path=/tmp/expedition-sim-2721135246/gogobee.db
2026/05/17 14:43:55 INFO dnd: armed ability fired (turn-based build) user=@sim:cleric-l12-manor_blackspire-4 ability="Healing Word"
2026/05/17 14:43:55 INFO dnd: armed ability fired (turn-based build) user=@sim:cleric-l12-manor_blackspire-4 ability="Healing Word"
2026/05/17 14:43:55 WARN auto-heal cleanup: short on inventory user=@sim:cleric-l12-manor_blackspire-4 wanted=1 removed=0
2026/05/17 14:43:55 INFO dnd: armed ability fired (turn-based build) user=@sim:cleric-l12-manor_blackspire-4 ability="Healing Word"
2026/05/17 14:43:55 WARN auto-heal cleanup: short on inventory user=@sim:cleric-l12-manor_blackspire-4 wanted=1 removed=0
2026/05/17 14:43:55 WARN auto-heal cleanup: short on inventory user=@sim:cleric-l12-manor_blackspire-4 wanted=1 removed=0
2026/05/17 14:43:55 WARN auto-heal cleanup: short on inventory user=@sim:cleric-l12-manor_blackspire-4 wanted=1 removed=0
2026/05/17 14:43:55 WARN auto-heal cleanup: short on inventory user=@sim:cleric-l12-manor_blackspire-4 wanted=1 removed=0
2026/05/17 14:43:55 WARN auto-heal cleanup: short on inventory user=@sim:cleric-l12-manor_blackspire-4 wanted=1 removed=0
2026/05/17 14:43:55 INFO database initialized path=/tmp/expedition-sim-1048519529/gogobee.db
2026/05/17 14:43:55 INFO database initialized path=/tmp/expedition-sim-1682387304/gogobee.db
2026/05/17 14:43:55 INFO database initialized path=/tmp/expedition-sim-657608895/gogobee.db
2026/05/17 14:43:55 INFO database initialized path=/tmp/expedition-sim-1564107756/gogobee.db
2026/05/17 14:43:55 INFO database initialized path=/tmp/expedition-sim-3063072436/gogobee.db
2026/05/17 14:43:55 INFO dnd: armed ability fired (turn-based build) user=@sim:cleric-l12-underdark-6 ability="Healing Word"
2026/05/17 14:43:55 INFO dnd: armed ability fired (turn-based build) user=@sim:cleric-l12-underdark-6 ability="Healing Word"
2026/05/17 14:43:55 INFO database initialized path=/tmp/expedition-sim-3622268633/gogobee.db
2026/05/17 14:43:55 INFO database initialized path=/tmp/expedition-sim-1467797736/gogobee.db
2026/05/17 14:43:55 INFO dnd: armed ability fired (turn-based build) user=@sim:cleric-l12-underdark-6 ability="Healing Word"
2026/05/17 14:43:55 WARN auto-heal cleanup: short on inventory user=@sim:cleric-l12-underdark-6 wanted=1 removed=0
2026/05/17 14:43:55 INFO database initialized path=/tmp/expedition-sim-2232860775/gogobee.db
2026/05/17 14:43:55 INFO database initialized path=/tmp/expedition-sim-2627481174/gogobee.db
2026/05/17 14:43:55 INFO database initialized path=/tmp/expedition-sim-2390666327/gogobee.db
2026/05/17 14:43:55 INFO dnd: armed ability fired (turn-based build) user=@sim:cleric-l12-manor_blackspire-5 ability="Healing Word"
2026/05/17 14:43:55 INFO dnd: armed ability fired (turn-based build) user=@sim:cleric-l12-manor_blackspire-5 ability="Healing Word"
2026/05/17 14:43:55 INFO dnd: armed ability fired (turn-based build) user=@sim:cleric-l12-manor_blackspire-5 ability="Healing Word"
2026/05/17 14:43:55 INFO database initialized path=/tmp/expedition-sim-1914770656/gogobee.db
2026/05/17 14:43:55 INFO database initialized path=/tmp/expedition-sim-2824103805/gogobee.db
2026/05/17 14:43:55 INFO database initialized path=/tmp/expedition-sim-95110996/gogobee.db
2026/05/17 14:43:55 INFO database initialized path=/tmp/expedition-sim-2829759744/gogobee.db
2026/05/17 14:43:55 INFO database initialized path=/tmp/expedition-sim-1001150422/gogobee.db
2026/05/17 14:43:55 INFO database initialized path=/tmp/expedition-sim-929451847/gogobee.db
2026/05/17 14:43:55 INFO dnd: armed ability fired (turn-based build) user=@sim:cleric-l12-underdark-7 ability="Healing Word"
2026/05/17 14:43:55 INFO dnd: armed ability fired (turn-based build) user=@sim:cleric-l12-underdark-7 ability="Healing Word"
2026/05/17 14:43:55 INFO dnd: armed ability fired (turn-based build) user=@sim:cleric-l12-underdark-7 ability="Healing Word"
2026/05/17 14:43:55 WARN auto-heal cleanup: short on inventory user=@sim:cleric-l12-underdark-7 wanted=1 removed=0
2026/05/17 14:43:55 INFO database initialized path=/tmp/expedition-sim-3436574612/gogobee.db
2026/05/17 14:43:55 INFO database initialized path=/tmp/expedition-sim-2958798854/gogobee.db
2026/05/17 14:43:55 INFO database initialized path=/tmp/expedition-sim-2592630111/gogobee.db
2026/05/17 14:43:56 INFO database initialized path=/tmp/expedition-sim-31480089/gogobee.db
2026/05/17 14:43:56 INFO database initialized path=/tmp/expedition-sim-2243703025/gogobee.db
2026/05/17 14:43:56 INFO dnd: armed ability fired (turn-based build) user=@sim:cleric-l12-manor_blackspire-6 ability="Healing Word"
2026/05/17 14:43:56 INFO dnd: armed ability fired (turn-based build) user=@sim:cleric-l12-manor_blackspire-6 ability="Healing Word"
2026/05/17 14:43:56 INFO dnd: armed ability fired (turn-based build) user=@sim:cleric-l12-manor_blackspire-6 ability="Healing Word"
2026/05/17 14:43:56 INFO database initialized path=/tmp/expedition-sim-2613244335/gogobee.db
2026/05/17 14:43:56 INFO database initialized path=/tmp/expedition-sim-395237346/gogobee.db
2026/05/17 14:43:56 INFO database initialized path=/tmp/expedition-sim-3326655556/gogobee.db
2026/05/17 14:43:56 INFO database initialized path=/tmp/expedition-sim-1845800138/gogobee.db
2026/05/17 14:43:56 INFO dnd: armed ability fired (turn-based build) user=@sim:cleric-l12-underdark-8 ability="Healing Word"
2026/05/17 14:43:56 INFO dnd: armed ability fired (turn-based build) user=@sim:cleric-l12-underdark-8 ability="Healing Word"
2026/05/17 14:43:56 INFO dnd: armed ability fired (turn-based build) user=@sim:cleric-l12-underdark-8 ability="Healing Word"
2026/05/17 14:43:56 INFO database initialized path=/tmp/expedition-sim-2772701177/gogobee.db
2026/05/17 14:43:56 INFO database initialized path=/tmp/expedition-sim-3972849183/gogobee.db
2026/05/17 14:43:56 INFO database initialized path=/tmp/expedition-sim-3672392659/gogobee.db
2026/05/17 14:43:56 INFO database initialized path=/tmp/expedition-sim-313329452/gogobee.db
2026/05/17 14:43:56 INFO database initialized path=/tmp/expedition-sim-586346631/gogobee.db
2026/05/17 14:43:56 INFO database initialized path=/tmp/expedition-sim-2765126792/gogobee.db
2026/05/17 14:43:56 INFO database initialized path=/tmp/expedition-sim-1436131991/gogobee.db
2026/05/17 14:43:56 INFO dnd: armed ability fired (turn-based build) user=@sim:cleric-l12-manor_blackspire-7 ability="Healing Word"
2026/05/17 14:43:56 INFO database initialized path=/tmp/expedition-sim-341586518/gogobee.db
2026/05/17 14:43:56 INFO dnd: armed ability fired (turn-based build) user=@sim:cleric-l12-manor_blackspire-7 ability="Healing Word"
2026/05/17 14:43:56 INFO dnd: armed ability fired (turn-based build) user=@sim:cleric-l12-manor_blackspire-7 ability="Healing Word"
2026/05/17 14:43:56 INFO database initialized path=/tmp/expedition-sim-195889630/gogobee.db
2026/05/17 14:43:56 INFO database initialized path=/tmp/expedition-sim-1979402690/gogobee.db
2026/05/17 14:43:56 INFO database initialized path=/tmp/expedition-sim-1419244121/gogobee.db
2026/05/17 14:43:56 INFO dnd: armed ability fired (turn-based build) user=@sim:cleric-l12-underdark-9 ability="Healing Word"
2026/05/17 14:43:56 INFO dnd: armed ability fired (turn-based build) user=@sim:cleric-l12-underdark-9 ability="Healing Word"
2026/05/17 14:43:56 INFO database initialized path=/tmp/expedition-sim-197539845/gogobee.db
2026/05/17 14:43:56 INFO dnd: armed ability fired (turn-based build) user=@sim:cleric-l12-underdark-9 ability="Healing Word"
2026/05/17 14:43:56 INFO database initialized path=/tmp/expedition-sim-4032773905/gogobee.db
2026/05/17 14:43:56 INFO database initialized path=/tmp/expedition-sim-3701142355/gogobee.db
2026/05/17 14:43:56 WARN auto-heal cleanup: short on inventory user=@sim:cleric-l12-underdark-9 wanted=1 removed=0
2026/05/17 14:43:56 WARN auto-heal cleanup: short on inventory user=@sim:cleric-l12-underdark-9 wanted=1 removed=0
2026/05/17 14:43:56 WARN auto-heal cleanup: short on inventory user=@sim:cleric-l12-underdark-9 wanted=1 removed=0
2026/05/17 14:43:56 INFO database initialized path=/tmp/expedition-sim-3902897193/gogobee.db
2026/05/17 14:43:56 INFO database initialized path=/tmp/expedition-sim-808797586/gogobee.db
2026/05/17 14:43:56 INFO database initialized path=/tmp/expedition-sim-4136221636/gogobee.db
2026/05/17 14:43:56 INFO database initialized path=/tmp/expedition-sim-1986950995/gogobee.db
2026/05/17 14:43:56 INFO dnd: armed ability fired (turn-based build) user=@sim:cleric-l12-manor_blackspire-8 ability="Healing Word"
2026/05/17 14:43:56 INFO dnd: armed ability fired (turn-based build) user=@sim:cleric-l12-manor_blackspire-8 ability="Healing Word"
2026/05/17 14:43:56 WARN auto-heal cleanup: short on inventory user=@sim:cleric-l12-manor_blackspire-8 wanted=1 removed=0
2026/05/17 14:43:56 INFO database initialized path=/tmp/expedition-sim-1859825555/gogobee.db
2026/05/17 14:43:56 INFO dnd: armed ability fired (turn-based build) user=@sim:cleric-l12-manor_blackspire-8 ability="Healing Word"
2026/05/17 14:43:56 WARN auto-heal cleanup: short on inventory user=@sim:cleric-l12-manor_blackspire-8 wanted=1 removed=0
2026/05/17 14:43:56 WARN auto-heal cleanup: short on inventory user=@sim:cleric-l12-manor_blackspire-8 wanted=1 removed=0
2026/05/17 14:43:56 WARN auto-heal cleanup: short on inventory user=@sim:cleric-l12-manor_blackspire-8 wanted=1 removed=0
2026/05/17 14:43:56 WARN auto-heal cleanup: short on inventory user=@sim:cleric-l12-manor_blackspire-8 wanted=1 removed=0
2026/05/17 14:43:56 WARN auto-heal cleanup: short on inventory user=@sim:cleric-l12-manor_blackspire-8 wanted=1 removed=0
2026/05/17 14:43:56 WARN auto-heal cleanup: short on inventory user=@sim:cleric-l12-manor_blackspire-8 wanted=1 removed=0
2026/05/17 14:43:56 INFO database initialized path=/tmp/expedition-sim-2946961527/gogobee.db
2026/05/17 14:43:56 INFO database initialized path=/tmp/expedition-sim-2429531262/gogobee.db
2026/05/17 14:43:56 INFO dnd: armed ability fired (turn-based build) user=@sim:cleric-l12-underdark-10 ability="Healing Word"
2026/05/17 14:43:56 INFO dnd: armed ability fired (turn-based build) user=@sim:cleric-l12-underdark-10 ability="Healing Word"
2026/05/17 14:43:56 INFO dnd: armed ability fired (turn-based build) user=@sim:cleric-l12-underdark-10 ability="Healing Word"
2026/05/17 14:43:56 INFO database initialized path=/tmp/expedition-sim-3262540763/gogobee.db
2026/05/17 14:43:56 INFO database initialized path=/tmp/expedition-sim-406280733/gogobee.db
2026/05/17 14:43:56 INFO database initialized path=/tmp/expedition-sim-4121783865/gogobee.db
2026/05/17 14:43:56 INFO database initialized path=/tmp/expedition-sim-3886271696/gogobee.db
2026/05/17 14:43:56 INFO database initialized path=/tmp/expedition-sim-755937194/gogobee.db
2026/05/17 14:43:56 INFO database initialized path=/tmp/expedition-sim-2787117412/gogobee.db
2026/05/17 14:43:56 INFO dnd: armed ability fired (turn-based build) user=@sim:cleric-l12-manor_blackspire-9 ability="Healing Word"
2026/05/17 14:43:56 INFO dnd: armed ability fired (turn-based build) user=@sim:cleric-l12-manor_blackspire-9 ability="Healing Word"
2026/05/17 14:43:56 INFO dnd: armed ability fired (turn-based build) user=@sim:cleric-l12-manor_blackspire-9 ability="Healing Word"
2026/05/17 14:43:56 INFO database initialized path=/tmp/expedition-sim-1277058289/gogobee.db
2026/05/17 14:43:56 INFO database initialized path=/tmp/expedition-sim-4186523944/gogobee.db
2026/05/17 14:43:56 INFO database initialized path=/tmp/expedition-sim-3400700333/gogobee.db
2026/05/17 14:43:56 INFO dnd: armed ability fired (turn-based build) user=@sim:cleric-l12-underdark-11 ability="Healing Word"
2026/05/17 14:43:56 INFO dnd: armed ability fired (turn-based build) user=@sim:cleric-l12-underdark-11 ability="Healing Word"
2026/05/17 14:43:56 INFO dnd: armed ability fired (turn-based build) user=@sim:cleric-l12-underdark-11 ability="Healing Word"
2026/05/17 14:43:56 INFO database initialized path=/tmp/expedition-sim-2057624917/gogobee.db
2026/05/17 14:43:56 WARN auto-heal cleanup: short on inventory user=@sim:cleric-l12-underdark-11 wanted=1 removed=0
2026/05/17 14:43:56 INFO database initialized path=/tmp/expedition-sim-893758964/gogobee.db
2026/05/17 14:43:56 INFO database initialized path=/tmp/expedition-sim-2865260923/gogobee.db
2026/05/17 14:43:56 INFO database initialized path=/tmp/expedition-sim-893271695/gogobee.db
2026/05/17 14:43:56 INFO database initialized path=/tmp/expedition-sim-1834209609/gogobee.db
2026/05/17 14:43:56 INFO database initialized path=/tmp/expedition-sim-259340017/gogobee.db
2026/05/17 14:43:56 INFO database initialized path=/tmp/expedition-sim-443152924/gogobee.db
2026/05/17 14:43:56 INFO database initialized path=/tmp/expedition-sim-534798107/gogobee.db
2026/05/17 14:43:57 INFO dnd: armed ability fired (turn-based build) user=@sim:cleric-l12-underdark-12 ability="Healing Word"
2026/05/17 14:43:57 INFO dnd: armed ability fired (turn-based build) user=@sim:cleric-l12-underdark-12 ability="Healing Word"
2026/05/17 14:43:57 INFO dnd: armed ability fired (turn-based build) user=@sim:cleric-l12-underdark-12 ability="Healing Word"
2026/05/17 14:43:57 INFO database initialized path=/tmp/expedition-sim-1492944299/gogobee.db
2026/05/17 14:43:57 INFO dnd: armed ability fired (turn-based build) user=@sim:cleric-l12-manor_blackspire-10 ability="Healing Word"
2026/05/17 14:43:57 INFO dnd: armed ability fired (turn-based build) user=@sim:cleric-l12-manor_blackspire-10 ability="Healing Word"
2026/05/17 14:43:57 INFO dnd: armed ability fired (turn-based build) user=@sim:cleric-l12-manor_blackspire-10 ability="Healing Word"
2026/05/17 14:43:57 INFO database initialized path=/tmp/expedition-sim-1329640727/gogobee.db
2026/05/17 14:43:57 INFO database initialized path=/tmp/expedition-sim-3510807036/gogobee.db
2026/05/17 14:43:57 INFO database initialized path=/tmp/expedition-sim-1677312784/gogobee.db
2026/05/17 14:43:57 INFO database initialized path=/tmp/expedition-sim-2967123722/gogobee.db
2026/05/17 14:43:57 INFO database initialized path=/tmp/expedition-sim-3955369742/gogobee.db
2026/05/17 14:43:57 INFO database initialized path=/tmp/expedition-sim-1638843092/gogobee.db
2026/05/17 14:43:57 INFO database initialized path=/tmp/expedition-sim-3971836417/gogobee.db
2026/05/17 14:43:57 INFO database initialized path=/tmp/expedition-sim-1265464193/gogobee.db
2026/05/17 14:43:57 INFO database initialized path=/tmp/expedition-sim-2557575696/gogobee.db
2026/05/17 14:43:57 INFO database initialized path=/tmp/expedition-sim-4287591977/gogobee.db
2026/05/17 14:43:57 INFO database initialized path=/tmp/expedition-sim-2698331497/gogobee.db
2026/05/17 14:43:57 INFO dnd: armed ability fired (turn-based build) user=@sim:cleric-l12-underdark-13 ability="Healing Word"
2026/05/17 14:43:57 INFO dnd: armed ability fired (turn-based build) user=@sim:cleric-l12-underdark-13 ability="Healing Word"
2026/05/17 14:43:57 INFO dnd: armed ability fired (turn-based build) user=@sim:cleric-l12-underdark-13 ability="Healing Word"
2026/05/17 14:43:57 INFO database initialized path=/tmp/expedition-sim-2910676030/gogobee.db
2026/05/17 14:43:57 INFO database initialized path=/tmp/expedition-sim-1627295865/gogobee.db
2026/05/17 14:43:57 INFO database initialized path=/tmp/expedition-sim-3781791468/gogobee.db
2026/05/17 14:43:57 INFO database initialized path=/tmp/expedition-sim-1091889186/gogobee.db
2026/05/17 14:43:57 INFO dnd: armed ability fired (turn-based build) user=@sim:cleric-l12-manor_blackspire-11 ability="Healing Word"
2026/05/17 14:43:57 INFO dnd: armed ability fired (turn-based build) user=@sim:cleric-l12-manor_blackspire-11 ability="Healing Word"
2026/05/17 14:43:57 INFO dnd: armed ability fired (turn-based build) user=@sim:cleric-l12-manor_blackspire-11 ability="Healing Word"
2026/05/17 14:43:57 INFO database initialized path=/tmp/expedition-sim-1848832537/gogobee.db
2026/05/17 14:43:57 INFO database initialized path=/tmp/expedition-sim-1083592695/gogobee.db
2026/05/17 14:43:57 INFO database initialized path=/tmp/expedition-sim-3484468071/gogobee.db
2026/05/17 14:43:57 INFO database initialized path=/tmp/expedition-sim-223486995/gogobee.db
2026/05/17 14:43:57 INFO database initialized path=/tmp/expedition-sim-2518075308/gogobee.db
2026/05/17 14:43:57 INFO dnd: armed ability fired (turn-based build) user=@sim:cleric-l12-underdark-14 ability="Healing Word"
2026/05/17 14:43:57 INFO dnd: armed ability fired (turn-based build) user=@sim:cleric-l12-underdark-14 ability="Healing Word"
2026/05/17 14:43:57 INFO database initialized path=/tmp/expedition-sim-3752040653/gogobee.db
2026/05/17 14:43:57 INFO dnd: armed ability fired (turn-based build) user=@sim:cleric-l12-underdark-14 ability="Healing Word"
2026/05/17 14:43:57 WARN auto-heal cleanup: short on inventory user=@sim:cleric-l12-underdark-14 wanted=1 removed=0
2026/05/17 14:43:57 WARN auto-heal cleanup: short on inventory user=@sim:cleric-l12-underdark-14 wanted=1 removed=0
2026/05/17 14:43:57 WARN auto-heal cleanup: short on inventory user=@sim:cleric-l12-underdark-14 wanted=1 removed=0
2026/05/17 14:43:57 WARN auto-heal cleanup: short on inventory user=@sim:cleric-l12-underdark-14 wanted=1 removed=0
2026/05/17 14:43:57 INFO database initialized path=/tmp/expedition-sim-3390344411/gogobee.db
2026/05/17 14:43:57 INFO database initialized path=/tmp/expedition-sim-150176521/gogobee.db
2026/05/17 14:43:57 INFO database initialized path=/tmp/expedition-sim-3536451781/gogobee.db
2026/05/17 14:43:57 INFO dnd: armed ability fired (turn-based build) user=@sim:cleric-l12-manor_blackspire-12 ability="Healing Word"
2026/05/17 14:43:57 INFO dnd: armed ability fired (turn-based build) user=@sim:cleric-l12-manor_blackspire-12 ability="Healing Word"
2026/05/17 14:43:57 INFO dnd: armed ability fired (turn-based build) user=@sim:cleric-l12-manor_blackspire-12 ability="Healing Word"
2026/05/17 14:43:57 INFO database initialized path=/tmp/expedition-sim-3886065500/gogobee.db
2026/05/17 14:43:57 INFO database initialized path=/tmp/expedition-sim-1109050757/gogobee.db
2026/05/17 14:43:57 INFO database initialized path=/tmp/expedition-sim-4152157644/gogobee.db
2026/05/17 14:43:57 INFO database initialized path=/tmp/expedition-sim-4170366951/gogobee.db
2026/05/17 14:43:57 INFO database initialized path=/tmp/expedition-sim-2833450096/gogobee.db
2026/05/17 14:43:57 INFO dnd: armed ability fired (turn-based build) user=@sim:cleric-l12-underdark-15 ability="Healing Word"
2026/05/17 14:43:57 INFO database initialized path=/tmp/expedition-sim-1445222612/gogobee.db
2026/05/17 14:43:57 INFO dnd: armed ability fired (turn-based build) user=@sim:cleric-l12-underdark-15 ability="Healing Word"
2026/05/17 14:43:57 INFO dnd: armed ability fired (turn-based build) user=@sim:cleric-l12-underdark-15 ability="Healing Word"
2026/05/17 14:43:57 INFO database initialized path=/tmp/expedition-sim-3602208598/gogobee.db
2026/05/17 14:43:57 INFO database initialized path=/tmp/expedition-sim-1802403687/gogobee.db
2026/05/17 14:43:57 WARN auto-heal cleanup: short on inventory user=@sim:cleric-l12-underdark-15 wanted=1 removed=0
2026/05/17 14:43:57 WARN auto-heal cleanup: short on inventory user=@sim:cleric-l12-underdark-15 wanted=1 removed=0
2026/05/17 14:43:57 INFO database initialized path=/tmp/expedition-sim-464538117/gogobee.db
2026/05/17 14:43:57 INFO database initialized path=/tmp/expedition-sim-591307153/gogobee.db
2026/05/17 14:43:57 INFO database initialized path=/tmp/expedition-sim-1657565653/gogobee.db
2026/05/17 14:43:57 INFO database initialized path=/tmp/expedition-sim-1067707991/gogobee.db
2026/05/17 14:43:57 INFO dnd: armed ability fired (turn-based build) user=@sim:cleric-l12-manor_blackspire-13 ability="Healing Word"
2026/05/17 14:43:57 INFO dnd: armed ability fired (turn-based build) user=@sim:cleric-l12-manor_blackspire-13 ability="Healing Word"
2026/05/17 14:43:57 INFO dnd: armed ability fired (turn-based build) user=@sim:cleric-l12-manor_blackspire-13 ability="Healing Word"
2026/05/17 14:43:57 INFO database initialized path=/tmp/expedition-sim-1130536036/gogobee.db
2026/05/17 14:43:57 INFO database initialized path=/tmp/expedition-sim-555324116/gogobee.db
2026/05/17 14:43:57 INFO database initialized path=/tmp/expedition-sim-979982115/gogobee.db
2026/05/17 14:43:57 INFO database initialized path=/tmp/expedition-sim-564817425/gogobee.db
2026/05/17 14:43:57 INFO database initialized path=/tmp/expedition-sim-1918459856/gogobee.db
2026/05/17 14:43:57 INFO dnd: armed ability fired (turn-based build) user=@sim:cleric-l12-underdark-16 ability="Healing Word"
2026/05/17 14:43:57 INFO database initialized path=/tmp/expedition-sim-2353824581/gogobee.db
2026/05/17 14:43:57 INFO dnd: armed ability fired (turn-based build) user=@sim:cleric-l12-underdark-16 ability="Healing Word"
2026/05/17 14:43:57 INFO dnd: armed ability fired (turn-based build) user=@sim:cleric-l12-underdark-16 ability="Healing Word"
2026/05/17 14:43:57 INFO database initialized path=/tmp/expedition-sim-1599178712/gogobee.db
2026/05/17 14:43:57 WARN auto-heal cleanup: short on inventory user=@sim:cleric-l12-underdark-16 wanted=1 removed=0
2026/05/17 14:43:57 INFO database initialized path=/tmp/expedition-sim-2711333189/gogobee.db
2026/05/17 14:43:58 INFO database initialized path=/tmp/expedition-sim-3845334846/gogobee.db
2026/05/17 14:43:58 INFO database initialized path=/tmp/expedition-sim-1943741524/gogobee.db
2026/05/17 14:43:58 INFO dnd: armed ability fired (turn-based build) user=@sim:cleric-l12-manor_blackspire-14 ability="Healing Word"
2026/05/17 14:43:58 INFO dnd: armed ability fired (turn-based build) user=@sim:cleric-l12-manor_blackspire-14 ability="Healing Word"
2026/05/17 14:43:58 INFO dnd: armed ability fired (turn-based build) user=@sim:cleric-l12-manor_blackspire-14 ability="Healing Word"
2026/05/17 14:43:58 INFO database initialized path=/tmp/expedition-sim-3108660236/gogobee.db
2026/05/17 14:43:58 INFO database initialized path=/tmp/expedition-sim-4121050120/gogobee.db
2026/05/17 14:43:58 INFO database initialized path=/tmp/expedition-sim-2311303713/gogobee.db
2026/05/17 14:43:58 INFO database initialized path=/tmp/expedition-sim-106280646/gogobee.db
2026/05/17 14:43:58 INFO database initialized path=/tmp/expedition-sim-1575016660/gogobee.db
2026/05/17 14:43:58 INFO dnd: armed ability fired (turn-based build) user=@sim:cleric-l12-underdark-17 ability="Healing Word"
2026/05/17 14:43:58 INFO database initialized path=/tmp/expedition-sim-2656288065/gogobee.db
2026/05/17 14:43:58 INFO dnd: armed ability fired (turn-based build) user=@sim:cleric-l12-underdark-17 ability="Healing Word"
2026/05/17 14:43:58 INFO dnd: armed ability fired (turn-based build) user=@sim:cleric-l12-underdark-17 ability="Healing Word"
2026/05/17 14:43:58 INFO database initialized path=/tmp/expedition-sim-719488742/gogobee.db
2026/05/17 14:43:58 INFO database initialized path=/tmp/expedition-sim-1262298393/gogobee.db
2026/05/17 14:43:58 INFO database initialized path=/tmp/expedition-sim-2481790746/gogobee.db
2026/05/17 14:43:58 INFO database initialized path=/tmp/expedition-sim-2256556235/gogobee.db
2026/05/17 14:43:58 INFO database initialized path=/tmp/expedition-sim-2013936558/gogobee.db
2026/05/17 14:43:58 INFO dnd: armed ability fired (turn-based build) user=@sim:cleric-l12-manor_blackspire-15 ability="Healing Word"
2026/05/17 14:43:58 INFO database initialized path=/tmp/expedition-sim-4204714177/gogobee.db
2026/05/17 14:43:58 INFO dnd: armed ability fired (turn-based build) user=@sim:cleric-l12-manor_blackspire-15 ability="Healing Word"
2026/05/17 14:43:58 WARN auto-heal cleanup: short on inventory user=@sim:cleric-l12-manor_blackspire-15 wanted=1 removed=0
2026/05/17 14:43:58 INFO dnd: armed ability fired (turn-based build) user=@sim:cleric-l12-manor_blackspire-15 ability="Healing Word"
2026/05/17 14:43:58 WARN auto-heal cleanup: short on inventory user=@sim:cleric-l12-manor_blackspire-15 wanted=1 removed=0
2026/05/17 14:43:58 WARN auto-heal cleanup: short on inventory user=@sim:cleric-l12-manor_blackspire-15 wanted=1 removed=0
2026/05/17 14:43:58 WARN auto-heal cleanup: short on inventory user=@sim:cleric-l12-manor_blackspire-15 wanted=1 removed=0
2026/05/17 14:43:58 WARN auto-heal cleanup: short on inventory user=@sim:cleric-l12-manor_blackspire-15 wanted=1 removed=0
2026/05/17 14:43:58 WARN auto-heal cleanup: short on inventory user=@sim:cleric-l12-manor_blackspire-15 wanted=1 removed=0
2026/05/17 14:43:58 WARN auto-heal cleanup: short on inventory user=@sim:cleric-l12-manor_blackspire-15 wanted=1 removed=0
2026/05/17 14:43:58 INFO database initialized path=/tmp/expedition-sim-2304427836/gogobee.db
2026/05/17 14:43:58 INFO database initialized path=/tmp/expedition-sim-1363285098/gogobee.db
2026/05/17 14:43:58 INFO database initialized path=/tmp/expedition-sim-1907634492/gogobee.db
2026/05/17 14:43:58 INFO database initialized path=/tmp/expedition-sim-2542100338/gogobee.db
2026/05/17 14:43:58 INFO dnd: armed ability fired (turn-based build) user=@sim:cleric-l12-underdark-18 ability="Healing Word"
2026/05/17 14:43:58 INFO database initialized path=/tmp/expedition-sim-2279242167/gogobee.db
2026/05/17 14:43:58 INFO database initialized path=/tmp/expedition-sim-487534128/gogobee.db
2026/05/17 14:43:58 INFO dnd: armed ability fired (turn-based build) user=@sim:cleric-l12-underdark-18 ability="Healing Word"
2026/05/17 14:43:58 INFO dnd: armed ability fired (turn-based build) user=@sim:cleric-l12-underdark-18 ability="Healing Word"
2026/05/17 14:43:58 WARN auto-heal cleanup: short on inventory user=@sim:cleric-l12-underdark-18 wanted=1 removed=0
2026/05/17 14:43:58 INFO database initialized path=/tmp/expedition-sim-3871894932/gogobee.db
2026/05/17 14:43:58 INFO database initialized path=/tmp/expedition-sim-3809454218/gogobee.db
2026/05/17 14:43:58 INFO database initialized path=/tmp/expedition-sim-3398006598/gogobee.db
2026/05/17 14:43:58 INFO database initialized path=/tmp/expedition-sim-4239387458/gogobee.db
2026/05/17 14:43:58 INFO dnd: armed ability fired (turn-based build) user=@sim:cleric-l12-manor_blackspire-16 ability="Healing Word"
2026/05/17 14:43:58 INFO database initialized path=/tmp/expedition-sim-3581761743/gogobee.db
2026/05/17 14:43:58 INFO dnd: armed ability fired (turn-based build) user=@sim:cleric-l12-manor_blackspire-16 ability="Healing Word"
2026/05/17 14:43:58 INFO dnd: armed ability fired (turn-based build) user=@sim:cleric-l12-manor_blackspire-16 ability="Healing Word"
2026/05/17 14:43:58 INFO database initialized path=/tmp/expedition-sim-3490615026/gogobee.db
2026/05/17 14:43:58 INFO database initialized path=/tmp/expedition-sim-2753050590/gogobee.db
2026/05/17 14:43:58 INFO database initialized path=/tmp/expedition-sim-886249041/gogobee.db
2026/05/17 14:43:58 INFO database initialized path=/tmp/expedition-sim-3732143829/gogobee.db
2026/05/17 14:43:58 INFO dnd: armed ability fired (turn-based build) user=@sim:cleric-l12-underdark-19 ability="Healing Word"
2026/05/17 14:43:58 INFO dnd: armed ability fired (turn-based build) user=@sim:cleric-l12-underdark-19 ability="Healing Word"
2026/05/17 14:43:58 INFO dnd: armed ability fired (turn-based build) user=@sim:cleric-l12-underdark-19 ability="Healing Word"
2026/05/17 14:43:58 INFO database initialized path=/tmp/expedition-sim-1506959/gogobee.db
2026/05/17 14:43:58 INFO database initialized path=/tmp/expedition-sim-1569482860/gogobee.db
2026/05/17 14:43:58 INFO database initialized path=/tmp/expedition-sim-1104745961/gogobee.db
2026/05/17 14:43:58 INFO database initialized path=/tmp/expedition-sim-1619123479/gogobee.db
2026/05/17 14:43:58 INFO database initialized path=/tmp/expedition-sim-1516630739/gogobee.db
2026/05/17 14:43:58 INFO database initialized path=/tmp/expedition-sim-1113187191/gogobee.db
2026/05/17 14:43:58 INFO dnd: armed ability fired (turn-based build) user=@sim:cleric-l12-manor_blackspire-17 ability="Healing Word"
2026/05/17 14:43:58 INFO database initialized path=/tmp/expedition-sim-1860557687/gogobee.db
2026/05/17 14:43:58 INFO dnd: armed ability fired (turn-based build) user=@sim:cleric-l12-manor_blackspire-17 ability="Healing Word"
2026/05/17 14:43:58 INFO dnd: armed ability fired (turn-based build) user=@sim:cleric-l12-manor_blackspire-17 ability="Healing Word"
2026/05/17 14:43:58 INFO database initialized path=/tmp/expedition-sim-189211669/gogobee.db
2026/05/17 14:43:58 INFO database initialized path=/tmp/expedition-sim-2904984255/gogobee.db
2026/05/17 14:43:58 INFO database initialized path=/tmp/expedition-sim-1696777558/gogobee.db
2026/05/17 14:43:58 INFO database initialized path=/tmp/expedition-sim-2383322429/gogobee.db
2026/05/17 14:43:58 INFO database initialized path=/tmp/expedition-sim-910046284/gogobee.db
2026/05/17 14:43:58 INFO database initialized path=/tmp/expedition-sim-3952079025/gogobee.db
2026/05/17 14:43:58 INFO database initialized path=/tmp/expedition-sim-260516460/gogobee.db
2026/05/17 14:43:58 INFO database initialized path=/tmp/expedition-sim-4221126017/gogobee.db
2026/05/17 14:43:58 INFO dnd: armed ability fired (turn-based build) user=@sim:cleric-l12-manor_blackspire-18 ability="Healing Word"
2026/05/17 14:43:58 INFO dnd: armed ability fired (turn-based build) user=@sim:cleric-l12-manor_blackspire-18 ability="Healing Word"
2026/05/17 14:43:58 INFO dnd: armed ability fired (turn-based build) user=@sim:cleric-l12-manor_blackspire-18 ability="Healing Word"
2026/05/17 14:43:58 INFO database initialized path=/tmp/expedition-sim-3199452696/gogobee.db
2026/05/17 14:43:58 INFO database initialized path=/tmp/expedition-sim-401258720/gogobee.db
2026/05/17 14:43:58 INFO database initialized path=/tmp/expedition-sim-3635517879/gogobee.db
2026/05/17 14:43:59 INFO database initialized path=/tmp/expedition-sim-1840100184/gogobee.db
2026/05/17 14:43:59 INFO database initialized path=/tmp/expedition-sim-3744271099/gogobee.db
2026/05/17 14:43:59 INFO database initialized path=/tmp/expedition-sim-2513846601/gogobee.db
2026/05/17 14:43:59 INFO database initialized path=/tmp/expedition-sim-4136361311/gogobee.db
2026/05/17 14:43:59 INFO database initialized path=/tmp/expedition-sim-2024110754/gogobee.db
2026/05/17 14:43:59 INFO database initialized path=/tmp/expedition-sim-3010651090/gogobee.db
2026/05/17 14:43:59 INFO database initialized path=/tmp/expedition-sim-3550751545/gogobee.db
2026/05/17 14:43:59 INFO database initialized path=/tmp/expedition-sim-4130428632/gogobee.db
2026/05/17 14:43:59 INFO database initialized path=/tmp/expedition-sim-1514264878/gogobee.db
2026/05/17 14:43:59 INFO dnd: armed ability fired (turn-based build) user=@sim:cleric-l12-manor_blackspire-19 ability="Healing Word"
2026/05/17 14:43:59 INFO dnd: armed ability fired (turn-based build) user=@sim:cleric-l12-manor_blackspire-19 ability="Healing Word"
2026/05/17 14:43:59 INFO dnd: armed ability fired (turn-based build) user=@sim:cleric-l12-manor_blackspire-19 ability="Healing Word"
2026/05/17 14:43:59 INFO database initialized path=/tmp/expedition-sim-2880784602/gogobee.db
2026/05/17 14:43:59 INFO database initialized path=/tmp/expedition-sim-4289186554/gogobee.db
2026/05/17 14:43:59 INFO database initialized path=/tmp/expedition-sim-4146683819/gogobee.db
2026/05/17 14:43:59 INFO database initialized path=/tmp/expedition-sim-160060743/gogobee.db
2026/05/17 14:43:59 INFO database initialized path=/tmp/expedition-sim-353707644/gogobee.db
2026/05/17 14:43:59 INFO database initialized path=/tmp/expedition-sim-1636999209/gogobee.db
2026/05/17 14:43:59 INFO database initialized path=/tmp/expedition-sim-3390283268/gogobee.db
2026/05/17 14:43:59 INFO database initialized path=/tmp/expedition-sim-826756018/gogobee.db
2026/05/17 14:43:59 INFO database initialized path=/tmp/expedition-sim-547509131/gogobee.db
2026/05/17 14:43:59 INFO database initialized path=/tmp/expedition-sim-4022639383/gogobee.db
2026/05/17 14:43:59 INFO database initialized path=/tmp/expedition-sim-3551275989/gogobee.db
2026/05/17 14:43:59 INFO database initialized path=/tmp/expedition-sim-1302856577/gogobee.db
2026/05/17 14:43:59 INFO database initialized path=/tmp/expedition-sim-2850236305/gogobee.db
2026/05/17 14:43:59 INFO database initialized path=/tmp/expedition-sim-2113733943/gogobee.db
2026/05/17 14:43:59 INFO database initialized path=/tmp/expedition-sim-2254598562/gogobee.db
2026/05/17 14:43:59 INFO database initialized path=/tmp/expedition-sim-254159564/gogobee.db
2026/05/17 14:43:59 INFO database initialized path=/tmp/expedition-sim-739650239/gogobee.db
2026/05/17 14:43:59 INFO database initialized path=/tmp/expedition-sim-2204564464/gogobee.db
2026/05/17 14:43:59 INFO database initialized path=/tmp/expedition-sim-2356786064/gogobee.db
2026/05/17 14:43:59 INFO database initialized path=/tmp/expedition-sim-2226186626/gogobee.db
2026/05/17 14:43:59 INFO database initialized path=/tmp/expedition-sim-1705628391/gogobee.db
2026/05/17 14:43:59 INFO database initialized path=/tmp/expedition-sim-634290542/gogobee.db
2026/05/17 14:43:59 INFO database initialized path=/tmp/expedition-sim-1269283242/gogobee.db
2026/05/17 14:43:59 INFO database initialized path=/tmp/expedition-sim-3919510895/gogobee.db
2026/05/17 14:43:59 INFO database initialized path=/tmp/expedition-sim-1823197516/gogobee.db
2026/05/17 14:43:59 INFO database initialized path=/tmp/expedition-sim-2557976063/gogobee.db
2026/05/17 14:44:00 INFO database initialized path=/tmp/expedition-sim-357381407/gogobee.db
2026/05/17 14:44:00 INFO database initialized path=/tmp/expedition-sim-53293036/gogobee.db
2026/05/17 14:44:00 INFO database initialized path=/tmp/expedition-sim-1739792480/gogobee.db
2026/05/17 14:44:00 INFO database initialized path=/tmp/expedition-sim-2016742342/gogobee.db
2026/05/17 14:44:00 INFO database initialized path=/tmp/expedition-sim-1658638379/gogobee.db
2026/05/17 14:44:00 INFO database initialized path=/tmp/expedition-sim-139478709/gogobee.db

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,151 @@
class level zone n p50_yld p50_yld_clr mean_yld mean_rms %clr %boss %tpk %fled %ext
bard 3 dragons_lair 100 0 0 0 0 0 0 0 0 0
bard 7 dragons_lair 100 3 0 3.6 6.1 0 36 99 0 1
bard 12 dragons_lair 100 4 0 5 7.6 0 80 100 0 0
cleric 3 dragons_lair 100 0 0 0 0 0 0 0 0 0
cleric 7 dragons_lair 100 4 0 3.5 5.1 0 13 100 0 0
cleric 12 dragons_lair 100 4 0 4 7.2 0 58 100 0 0
druid 3 dragons_lair 100 0 0 0 0 0 0 0 0 0
druid 7 dragons_lair 100 3 0 3.7 6 0 36 99 0 1
druid 12 dragons_lair 100 3 0 3.8 7.5 0 77 99 0 1
fighter 3 dragons_lair 100 0 0 0 0 0 0 0 0 0
fighter 7 dragons_lair 100 4 0 4.3 7.2 0 72 99 0 1
fighter 12 dragons_lair 100 4 0 4.4 8 0 100 100 0 0
mage 3 dragons_lair 100 0 0 0 0 0 0 0 0 0
mage 7 dragons_lair 100 4 0 4.4 5.6 0 28 100 0 0
mage 12 dragons_lair 100 6 0 6.3 7.3 0 66 99 0 1
paladin 3 dragons_lair 100 0 0 0 0 0 0 0 0 0
paladin 7 dragons_lair 100 3 0 3.9 7 0 59 93 0 7
paladin 12 dragons_lair 100 4 0 4.2 7.9 0 96 100 0 0
ranger 3 dragons_lair 100 0 0 0 0 0 0 0 0 0
ranger 7 dragons_lair 100 8 0 8.9 7.7 0 87 97 0 3
ranger 12 dragons_lair 100 7 0 9.2 8 0 100 100 0 0
rogue 3 dragons_lair 100 0 0 0 0 0 0 0 0 0
rogue 7 dragons_lair 100 5 0 5.9 6.5 0 52 95 0 5
rogue 12 dragons_lair 100 6 0 6.5 7.9 0 96 99 0 1
sorcerer 3 dragons_lair 100 0 0 0 0 0 0 0 0 0
sorcerer 7 dragons_lair 100 3 0 4.1 5.4 0 18 98 0 2
sorcerer 12 dragons_lair 100 5 0 5.3 7.2 0 60 100 0 0
warlock 3 dragons_lair 100 0 0 0 0 0 0 0 0 0
warlock 7 dragons_lair 100 3 0 3.4 5.8 0 28 100 0 0
warlock 12 dragons_lair 100 3 0 4.3 7.4 0 70 100 0 0
bard 3 forest_shadows 100 4 0 5.1 4.3 0 1 100 0 0
bard 7 forest_shadows 100 7 0 7.6 6 0 99 100 0 0
bard 12 forest_shadows 100 6 6 6.6 7 100 100 0 0 0
cleric 3 forest_shadows 100 4 0 5.1 4.6 0 1 100 0 0
cleric 7 forest_shadows 100 6 0 7.5 5.8 0 73 100 0 0
cleric 12 forest_shadows 100 9 9 8.1 6.8 90 90 10 0 0
druid 3 forest_shadows 100 5 0 6 5.2 0 11 100 0 0
druid 7 forest_shadows 100 7 7 7.9 6.8 84 99 16 0 0
druid 12 forest_shadows 100 7 7 7.4 7 100 100 0 0 0
fighter 3 forest_shadows 100 4 0 5.2 5.3 0 28 100 0 0
fighter 7 forest_shadows 100 6 6 6.7 7 100 100 0 0 0
fighter 12 forest_shadows 100 5 5 6.2 7 100 100 0 0 0
mage 3 forest_shadows 100 3 0 4.6 3.9 0 1 100 0 0
mage 7 forest_shadows 100 6 6 6.7 6.8 86 96 14 0 0
mage 12 forest_shadows 100 6 6 7 7 99 99 1 0 0
paladin 3 forest_shadows 100 6 0 7.8 5.9 0 86 100 0 0
paladin 7 forest_shadows 100 7 7 7.7 7 100 100 0 0 0
paladin 12 forest_shadows 100 6 6 6.6 7 100 100 0 0 0
ranger 3 forest_shadows 100 11 0 11.7 5.2 0 23 100 0 0
ranger 7 forest_shadows 100 13 13 14.8 7 100 100 0 0 0
ranger 12 forest_shadows 100 13 13 15.1 7 100 100 0 0 0
rogue 3 forest_shadows 100 5 0 6.4 5.8 0 80 100 0 0
rogue 7 forest_shadows 100 8 8 8.6 6.9 85 100 15 0 0
rogue 12 forest_shadows 100 6 6 6.7 7 100 100 0 0 0
sorcerer 3 forest_shadows 100 4 0 5.3 3.5 0 0 100 0 0
sorcerer 7 forest_shadows 100 6 6 6.4 6.5 63 86 37 0 0
sorcerer 12 forest_shadows 100 7 7 7.5 7 98 98 2 0 0
warlock 3 forest_shadows 100 4 0 5.1 4.2 0 1 100 0 0
warlock 7 forest_shadows 100 5 7 6.4 6.3 34 96 66 0 0
warlock 12 forest_shadows 100 7 7 7.8 7 100 100 0 0 0
bard 3 goblin_warrens 100 4 0 4.4 4.8 0 80 100 0 0
bard 7 goblin_warrens 100 5 5 5.7 6 100 100 0 0 0
bard 12 goblin_warrens 100 4 4 5 6 100 100 0 0 0
cleric 3 goblin_warrens 100 4 5 4.6 5 15 85 85 0 0
cleric 7 goblin_warrens 100 4 4 4.6 5.8 91 91 9 0 0
cleric 12 goblin_warrens 100 4 4 4.9 5.9 96 96 4 0 0
druid 3 goblin_warrens 100 3 3 4 5.6 67 93 33 0 0
druid 7 goblin_warrens 100 5 5 5.4 6 100 100 0 0 0
druid 12 goblin_warrens 100 4 4 4.6 6 100 100 0 0 0
fighter 3 goblin_warrens 100 5 5 5.2 5.5 54 92 46 0 0
fighter 7 goblin_warrens 100 5 5 6.1 6 100 100 0 0 0
fighter 12 goblin_warrens 100 4 4 5.7 6 100 100 0 0 0
mage 3 goblin_warrens 100 6 8 6.9 5.5 67 78 33 0 0
mage 7 goblin_warrens 100 6 6 7 5.9 97 97 3 0 0
mage 12 goblin_warrens 100 7 7 7.7 6 100 100 0 0 0
paladin 3 goblin_warrens 100 5 5 5.1 5.9 88 98 12 0 0
paladin 7 goblin_warrens 100 5 5 5.6 6 100 100 0 0 0
paladin 12 goblin_warrens 100 4 4 5.3 6 100 100 0 0 0
ranger 3 goblin_warrens 100 5 6 5.9 5.5 64 90 36 0 0
ranger 7 goblin_warrens 100 6 6 6.3 6 100 100 0 0 0
ranger 12 goblin_warrens 100 5 5 5.5 6 100 100 0 0 0
rogue 3 goblin_warrens 100 7 7 6.9 5.8 81 95 19 0 0
rogue 7 goblin_warrens 100 6 6 6.9 6 100 100 0 0 0
rogue 12 goblin_warrens 100 7 7 7.2 6 100 100 0 0 0
sorcerer 3 goblin_warrens 100 6 6 6.5 5.5 66 79 34 0 0
sorcerer 7 goblin_warrens 100 7 7 6.9 5.9 95 95 5 0 0
sorcerer 12 goblin_warrens 100 6 6 7.1 6 100 100 0 0 0
warlock 3 goblin_warrens 100 4 5 4.9 5.4 56 83 44 0 0
warlock 7 goblin_warrens 100 4 4 5 6 100 100 0 0 0
warlock 12 goblin_warrens 100 5 5 5.2 6 100 100 0 0 0
bard 3 manor_blackspire 100 3 0 4.5 4.6 0 1 100 0 0
bard 7 manor_blackspire 100 4 0 4.8 6 0 58 100 0 0
bard 12 manor_blackspire 100 5 11 4.8 6 2 76 98 0 0
cleric 3 manor_blackspire 100 3 0 3.3 4.1 0 1 100 0 0
cleric 7 manor_blackspire 100 4 0 4.3 5.7 0 24 100 0 0
cleric 12 manor_blackspire 100 3 4 3.8 6 9 55 91 0 0
druid 3 manor_blackspire 100 4 0 4.3 5.4 0 10 100 0 0
druid 7 manor_blackspire 100 4 0 4.5 6 0 57 100 0 0
druid 12 manor_blackspire 100 4 4 4.8 6.7 74 79 26 0 0
fighter 3 manor_blackspire 100 4 0 3.9 5.4 0 21 100 0 0
fighter 7 manor_blackspire 100 4 5 4.1 6.1 14 100 86 0 0
fighter 12 manor_blackspire 100 4 4 4.4 7 100 100 0 0 0
mage 3 manor_blackspire 100 4 0 4.7 3.8 0 0 100 0 0
mage 7 manor_blackspire 100 5 22 6.4 5.9 1 49 99 0 0
mage 12 manor_blackspire 100 5 5 5.8 6.5 49 63 51 0 0
paladin 3 manor_blackspire 100 3 0 3.6 5.8 0 47 100 0 0
paladin 7 manor_blackspire 100 5 4 5 6.2 17 98 83 0 0
paladin 12 manor_blackspire 100 4 4 4.9 7 96 100 4 0 0
ranger 3 manor_blackspire 100 4 0 5 5.3 0 15 100 0 0
ranger 7 manor_blackspire 100 5 5 5.9 6.3 30 100 70 0 0
ranger 12 manor_blackspire 100 4 4 5.3 7 100 100 0 0 0
rogue 3 manor_blackspire 100 5 0 6.4 5.6 0 34 100 0 0
rogue 7 manor_blackspire 100 6 7 6.6 6 4 99 96 0 0
rogue 12 manor_blackspire 100 6 6 6.9 6.9 90 100 10 0 0
sorcerer 3 manor_blackspire 100 4 0 5 3.9 0 0 100 0 0
sorcerer 7 manor_blackspire 100 7 6 7.4 5.9 1 36 99 0 0
sorcerer 12 manor_blackspire 100 6 7 7 6.5 47 60 53 0 0
warlock 3 manor_blackspire 100 4 0 4.5 4.3 0 0 100 0 0
warlock 7 manor_blackspire 100 4 0 4.9 6 0 65 100 0 0
warlock 12 manor_blackspire 100 4 5 5.3 6.3 34 69 66 0 0
bard 3 underdark 100 0 0 0 0 0 0 0 0 0
bard 7 underdark 100 3 0 3.7 3.8 0 3 100 0 0
bard 12 underdark 100 4 0 4 5.7 0 66 100 0 0
cleric 3 underdark 100 0 0 0 0 0 0 0 0 0
cleric 7 underdark 100 2 0 3 3.1 0 1 100 0 0
cleric 12 underdark 100 4 0 5.1 4.8 0 13 100 0 0
druid 3 underdark 100 0 0 0 0 0 0 0 0 0
druid 7 underdark 100 3 0 4.3 3.7 0 7 100 0 0
druid 12 underdark 100 5 5 5.3 6.3 34 84 66 0 0
fighter 3 underdark 100 0 0 0 0 0 0 0 0 0
fighter 7 underdark 100 5 6 4.9 6.1 10 96 90 0 0
fighter 12 underdark 100 4 4 4.8 7 100 100 0 0 0
mage 3 underdark 100 0 0 0 0 0 0 0 0 0
mage 7 underdark 100 2 0 3 3.1 0 0 100 0 0
mage 12 underdark 100 4 4 4.6 5.8 19 60 81 0 0
paladin 3 underdark 100 0 0 0 0 0 0 0 0 0
paladin 7 underdark 100 3 2 4.3 5.9 2 80 98 0 0
paladin 12 underdark 100 4 4 4.8 7 96 100 4 0 0
ranger 3 underdark 100 0 0 0 0 0 0 0 0 0
ranger 7 underdark 100 9 10 9.3 6.3 30 98 70 0 0
ranger 12 underdark 100 9 9 9.7 7 100 100 0 0 0
rogue 3 underdark 100 0 0 0 0 0 0 0 0 0
rogue 7 underdark 100 5 4 4.7 5.8 5 80 95 0 0
rogue 12 underdark 100 5 5 5.5 6.9 94 99 6 0 0
sorcerer 3 underdark 100 0 0 0 0 0 0 0 0 0
sorcerer 7 underdark 100 2 0 2.7 2.9 0 1 100 0 0
sorcerer 12 underdark 100 3 8 3.7 5.1 8 32 92 0 0
warlock 3 underdark 100 0 0 0 0 0 0 0 0 0
warlock 7 underdark 100 2 0 3.5 3.6 0 3 100 0 0
warlock 12 underdark 100 4 2 4.1 5.6 7 69 93 0 0

View File

@@ -0,0 +1,81 @@
# J2b — Post-J2a all-classes baseline (n=100)
**Date:** 2026-05-17
**Corpus:** `sim_results/baseline_j2a_v2_all10.jsonl` (15,000 rows = 10 classes × 3 levels × 5 zones × n=100). Per-cell tabular summary in `sim_results/j2b_all10_summary.txt`.
**Replaces:** `sim_results/baseline_j1_all10.jsonl` as the post-sim-fix canonical corpus. The J1 numbers measured a strawman where casters never cast (see [j2_findings.md](j2_findings.md)).
## L12 leaderboard (mean %clr across all 5 zones)
| Class | J1 baseline | J2b | Δ | J1 boss% | J2b boss% | Per-zone J2b %clr (T1 / T2 / T3 / T4 / T5) |
|----------|-------------|-------|--------|----------|-----------|--------------------------------------------|
| fighter | 79.6 | 80.0 | **+0.4** | 100.0 | 100.0 | 100 / 100 / 100 / 100 / 0 |
| ranger | 78.6 | 80.0 | **+1.4** | 100.0 | 100.0 | 100 / 100 / 100 / 100 / 0 |
| paladin | 72.2 | 78.4 | **+6.2** | 99.6 | 99.2 | 100 / 100 / 96 / 96 / 0 |
| rogue | 70.6 | 76.8 | **+6.2** | 99.0 | 99.0 | 100 / 100 / 90 / 94 / 0 |
| druid | 38.6 | 61.6 | **+23.0** | 88.4 | 88.0 | 100 / 100 / 74 / 34 / 0 |
| mage | 20.0 | 53.4 | **+33.4** | 77.2 | 77.6 | 100 / 99 / 49 / 19 / 0 |
| sorcerer | 20.0 | 50.6 | **+30.6** | 70.4 | 70.0 | 100 / 98 / 47 / 8 / 0 |
| warlock | 21.4 | 48.2 | **+26.8** | 82.2 | 81.6 | 100 / 100 / 34 / 7 / 0 |
| bard | 21.6 | 40.4 | **+18.8** | 82.0 | 84.4 | 100 / 100 / 2 / 0 / 0 |
| cleric | 18.6 | 39.0 | **+20.4** | 61.6 | 62.4 | 96 / 90 / 9 / 0 / 0 |
## Headline
1. **No martial regression.** Fighter/Ranger/Paladin/Rogue all moved within +0.4 to +6.2pp, indistinguishable from sweep variance. The `simMartialFirstClass` gate added after the v1 sweep saved Ranger (which had regressed -35.8pp when the picker burned L3 slots on `lightning_arrow` instead of letting the weapon-attack + Hunter's Mark + Extra Attack chassis swing).
2. **Caster cliff is dissolved.** The pre-fix 1922% cluster spread out to 3962%. The picker alone — no balance changes — converted the trailers to mid-band classes.
3. **Druid is now top-of-band-2 at 61.6%.** Wild Resilience's ThornLash on weapon swings plus the new cast path stacks cleanly. Druid is still defensive-first by design; the cast layer turns boss rooms from "swing-and-bleed" into "burn-and-finish".
4. **T5 dragons_lair still walls everyone (0% clear across all 10 classes).** That's the J3 problem; J2 wasn't on the hook for it, and the sim-artifact half of J3's hypothesis 1 (`autoResolveCombat` never casting/consuming) is now closed by J2a.
## What's still trailing — bard and cleric
Bard L12 manor 2%, cleric L12 manor 9% — both reach the boss (~5084%) and die there. **Not a sim artifact**; this is the spell pool. The v1 picker only scores damage-effect spells, and these two classes have thin damage rosters in `defaultKnownSpells`:
- **Bard** damage options: `vicious_mockery` (cantrip), `shatter` L2. Everything else in the bard kit is control / heal / buff, which the picker skips.
- **Cleric** damage options: `sacred_flame` (cantrip), `guiding_bolt` L1, `spiritual_weapon` L2, `spirit_guardians` L3, `flame_strike` L5. The non-damage options (`bless`, `healing_word`, `mass_cure_wounds`, etc.) are skipped too.
Both classes' identity spells are control (`hold_person`, `hypnotic_pattern`, `command`) and heal (`cure_wounds`, `healing_word`, `mass_cure_wounds`). The picker treats those as zero-value.
Note on cleric underdark: 87% of L12 underdark runs end as `tpk` with stop `ended` — that's expedition-side starvation, not boss-fight TPK (only 13% reach boss/elite). Cleric's exploration loop is brittle for unrelated reasons (low STR/CON build, supply burn). Out of J2 scope.
## J2 DoD check
Reframed DoD (`gogobee_harvest_charges_plan.md` §6.J2, updated 2026-05-17):
- **J2a — ≥80% of boss fights produce a cast or consumable.** **MET** (100% cast rate in the verification sweep, [j2a_findings.md](j2a_findings.md)).
- **J2b — caster L12 manor mean clear ≥ druid's pre-J2a 39%.** Mage 49 ✓, sorcerer 47 ✓, warlock 34 ✗ (close), bard 2 ✗, cleric 9 ✗. **3 of 5 pass.**
- **No martial leader regresses >10pp.** **MET** (all +0.4 to +6.2pp).
Two trailers still under the floor (bard, cleric). They're now bottlenecked on **spell-pool richness for the v1 damage-only picker**, not on the sim itself. The cleanest next move:
## J2c — tried, reverted (2026-05-17)
Implemented two widening levers, ran two n=100 sweeps, and reverted both:
1. **Heal-spell preempt** (cure_wounds / healing_word / mass_cure_wounds preferred over heal consumable at low HP). Regressed **druid -10pp**: slot heals at L12 heal ~10HP vs 40HP from a tier-4 Spirit Tonic, and the picker burned slots druid needed for damage spells.
2. **Control-spell scoring at 22** (denied-enemy-turn proxy). Regressed **warlock -6.6pp** — vampiric_touch L3 (10.5 expected over multiple rounds + heal) was outscored by hypnotic_pattern L3 (single denied turn). Dropping the score to 5 brought net deltas back to ±2pp but didn't lift bard or cleric, because the level-first sort prevents low-score control spells from ever winning over a higher-level damage option (which the trailer classes don't have at higher slots).
Corpora retained for reference: `sim_results/baseline_j2c_all10.jsonl` (heal-preempt + control@22) and `sim_results/baseline_j2c_v2_all10.jsonl` (control@5 only). The picker reverted to the J2b shape (damage-effect only, level-first sort, no heal-spell preempt).
**Real lever for bard/cleric trailing.** Their `defaultKnownSpells` damage rosters cap at L2 (bard: shatter; cleric: spiritual_weapon's 1d8). The picker can't pick higher-damage spells they don't have. Lifting these classes is therefore a **prod-level change to `defaultKnownSpells`** (add a damage option at L3+ for bard, a damage option at L4+ for cleric) — not a sim-picker change. Out of scope for J2; revisit alongside class identity / Open5e integration work.
## (original) Recommended J2c (now superseded by the section above)
**Widen the picker to score control + heal spells.**
- `EffectControl` (e.g. `hold_person`, `hypnotic_pattern`, `hideous_laughter`, `command`) should score as the *enemy damage it prevents over its expected effect duration* — i.e. each prevented enemy turn ≈ one round's worth of incoming damage. For a stunner that lands and lasts 1 round on a 30-dmg/round boss, that's a 30-equivalent. Better than most damage spells.
- `EffectSpellHeal` should compete with the consume-on-low-HP branch — if the cleric has `mass_cure_wounds` ready, it should fire at the low-HP threshold instead of a `Spirit Tonic`.
- `EffectBuffSelf` (e.g. `bless`, `shield_of_faith`) lifts to-hit chance / AC. Score in opening round of a fight only; subsequent rounds it's a waste.
This is one focused change in `simPickSpell` + `simPickCombatAction`. Expected impact: bard pulls into the 3040% manor band (control spells are the bard identity); cleric pulls similarly. Martial leaders unchanged. Whether it's needed depends on operator: J2's reframed DoD allows shipping J2 with bard/cleric trailing if the prod target is "five classes mid-band, two below". Per [feedback_difficulty_target](.claude/memory/feedback_difficulty_target.md), the explicit ask is to lift trailers — that argues for landing J2c.
## Files touched this phase
- `internal/plugin/expedition_sim.go`:
- `SimCombatSummary.Events`, `simIncludeTrace` + `SetSimIncludeTrace` (J2 diagnostic).
- `simPickCombatAction`, `simPickSpell`, `simMartialFirstClass`, `simHealHPThresholdPct` (J2a picker + post-baseline fix).
- `BuildCharacter` now seeds `ensureSpellsForCharacter`.
- `autoResolveCombat` dispatches via the picker.
- `cmd/expedition-sim/main.go`: `-trace` flag.
- Docs: `sim_results/j2_findings.md`, `sim_results/j2a_findings.md`, `sim_results/j2b_findings.md`, `sim_results/j2b_all10_summary.txt`, plan §6.J2.
No prod combat / class / spell paths changed. Everything is in the sim harness.

View File

@@ -0,0 +1,43 @@
# J3 — T5 dragons_lair universal wall (initial trace)
**Date:** 2026-05-17
**Corpus:** `sim_results/j3_traces.jsonl` — 60 expeditions (6 representative classes × L12 × dragons_lair × n=10), per-round traces enabled. Hypothesis-sift only; not a balance sweep.
**Pre-state:** post-J2 picker (`baseline_j2a_v2_all10.jsonl` shows 0% clear across all 10 classes at L12 dragons_lair).
## Boss-room aggregates (L12 vs `boss_*` of dragons_lair)
| class | n | reachBoss | won | rounds | pDmg | eDmg | enemyHPMax | enemyHP@end | playerHPMax | playerHP@end | casts | consume |
|---------|----|-----------|-----|--------|-------|-------|------------|-------------|-------------|--------------|-------|---------|
| fighter | 10 | 10 | 0 | 8.8 | 122.5 | 207.8 | **546** | 423.5 | 173.6 | 0 | 0 | 14 |
| ranger | 10 | 10 | 0 | 8.8 | 133.4 | 197.1 | **546** | 412.6 | 131.0 | 0 | 0 | 18 |
| paladin | 10 | 10 | 0 | 8.3 | 76.0 | 200.0 | **546** | 470.0 | 169.4 | 0 | 0 | 16 |
| rogue | 10 | 9 | 0 | 6.6 | 63.7 | 168.6 | **546** | 482.3 | 133.2 | 0 | 0 | 11 |
| druid | 10 | 9 | 0 | 4.8 | 122.4 | 136.9 | **546** | 423.6 | 131.0 | 0 | 34 | 9 |
| mage | 10 | 6 | 0 | 5.2 | 92.7 | 129.2 | **546** | 453.3 | 112.5 | 0 | 26 | 5 |
## Diagnosis
T5 dragons_lair boss is at **546 max HP**. Solo characters (player HP 110175) take 59 rounds to die, dealing 60130 player damage in that time — they chew down ~1025% of the boss before being TPK'd. This is **party content tuned for solo by accident**.
Per-round math: clearing 546 HP in ~10 rounds requires ~55 DPR sustained. Solo player DPR caps around 1525 even on fighter (122/8.8 = 13.9 mean) and druid (122/4.8 = 25.5 — burst before dying). A 4-character party at the same DPR clears in ~7 rounds, which is the survivable window the boss seems tuned around.
Plan §J3 listed three hypotheses; this trace rules them out cleanly:
1. ~~`autoResolveCombat` unfair (only swings).~~ **Closed by J2a.** Druid/mage are now casting (34/26 casts in 10 fights) and still 0% clear.
2. ~~Boss HP pool just too deep / multi-phase.~~ **No multi-phase complication observed** — fights are linear monotone HP descent, the boss just doesn't have a phase mechanic exposed in the trace. The HP pool *itself* is the issue.
3. **Party scaling missing — boss is tuned for 4-character parties.** Confirmed by the consistent ~25% boss-HP-eaten-at-player-death across every class.
## Recommended J3 lever
Per `gogobee_harvest_charges_plan.md` §J3 likely-levers, the difficulty memo allows *lifting trailers without pushing monster scaling*. **Reducing boss scaling at low party counts is in-bounds.**
- **Auto-scale boss HP (and probably boss damage) by participant count.** A simple `bossHP *= (0.4 + 0.15*participants)` style ramp would put solo at 0.55× (≈ 300 HP from 546) and 4-up at full. That brings a 59 round solo fight in line with the boss-HP curve already validated at T3/T4 (post-J2 manor: 60%+ clear for top classes; underdark: 30100%).
- **Alternative:** Document dragons_lair as raid content. Surface a verb-style warning in `!zone` help ("Bring friends — this dragon eats solo adventurers."). Cheaper but doesn't lift the trailer end of the solo population, which `feedback_difficulty_target` says we should.
Recommendation: **try party-scaling first** — it's the lever that both keeps the boss difficult for parties AND respects the "lift trailers" feedback. Document-only is the fallback if scaling proves intrusive.
## Open question for the operator
What's the *intended* T5 boss audience — solo or party? If solo, scaling is required. If party, dragons_lair should be flagged as raid content and not appear in solo-play recommendations. The sim has been running solo throughout, which the plan's J-phase open questions already flagged needs an operator answer.
Out of scope here: implementing the scaling lever. That's a prod change in the boss HP / damage path. Picking up that work would need the operator's call on the audience question first.

90
sim_results/j3_traces.err Normal file
View File

@@ -0,0 +1,90 @@
2026/05/17 15:34:22 INFO database initialized path=/tmp/expedition-sim-3937486981/gogobee.db
2026/05/17 15:34:22 INFO database initialized path=/tmp/expedition-sim-3578458476/gogobee.db
2026/05/17 15:34:23 INFO database initialized path=/tmp/expedition-sim-1544593455/gogobee.db
2026/05/17 15:34:23 INFO database initialized path=/tmp/expedition-sim-67658511/gogobee.db
2026/05/17 15:34:23 INFO database initialized path=/tmp/expedition-sim-2710175851/gogobee.db
2026/05/17 15:34:23 INFO database initialized path=/tmp/expedition-sim-3311525977/gogobee.db
2026/05/17 15:34:23 INFO database initialized path=/tmp/expedition-sim-1482370118/gogobee.db
2026/05/17 15:34:23 INFO dnd: armed ability fired (turn-based build) user=@sim:fighter-l12-dragons_lair-0 ability="Second Wind"
2026/05/17 15:34:23 INFO dnd: armed ability fired (turn-based build) user=@sim:fighter-l12-dragons_lair-0 ability="Second Wind"
2026/05/17 15:34:23 INFO dnd: armed ability fired (turn-based build) user=@sim:fighter-l12-dragons_lair-0 ability="Second Wind"
2026/05/17 15:34:23 INFO database initialized path=/tmp/expedition-sim-573218642/gogobee.db
2026/05/17 15:34:23 INFO database initialized path=/tmp/expedition-sim-2555594716/gogobee.db
2026/05/17 15:34:23 INFO database initialized path=/tmp/expedition-sim-1293820254/gogobee.db
2026/05/17 15:34:23 INFO database initialized path=/tmp/expedition-sim-2922091846/gogobee.db
2026/05/17 15:34:23 INFO database initialized path=/tmp/expedition-sim-2255769101/gogobee.db
2026/05/17 15:34:23 INFO dnd: armed ability fired (turn-based build) user=@sim:fighter-l12-dragons_lair-1 ability="Second Wind"
2026/05/17 15:34:23 INFO dnd: armed ability fired (turn-based build) user=@sim:fighter-l12-dragons_lair-1 ability="Second Wind"
2026/05/17 15:34:23 INFO dnd: armed ability fired (turn-based build) user=@sim:fighter-l12-dragons_lair-1 ability="Second Wind"
2026/05/17 15:34:23 INFO database initialized path=/tmp/expedition-sim-4141510411/gogobee.db
2026/05/17 15:34:24 INFO database initialized path=/tmp/expedition-sim-2327156998/gogobee.db
2026/05/17 15:34:24 INFO database initialized path=/tmp/expedition-sim-3831482955/gogobee.db
2026/05/17 15:34:24 INFO database initialized path=/tmp/expedition-sim-3224447098/gogobee.db
2026/05/17 15:34:24 INFO database initialized path=/tmp/expedition-sim-3972171829/gogobee.db
2026/05/17 15:34:24 INFO database initialized path=/tmp/expedition-sim-2507866628/gogobee.db
2026/05/17 15:34:24 INFO dnd: armed ability fired (turn-based build) user=@sim:fighter-l12-dragons_lair-2 ability="Second Wind"
2026/05/17 15:34:24 INFO dnd: armed ability fired (turn-based build) user=@sim:fighter-l12-dragons_lair-2 ability="Second Wind"
2026/05/17 15:34:24 INFO dnd: armed ability fired (turn-based build) user=@sim:fighter-l12-dragons_lair-2 ability="Second Wind"
2026/05/17 15:34:24 INFO database initialized path=/tmp/expedition-sim-2702751982/gogobee.db
2026/05/17 15:34:24 INFO database initialized path=/tmp/expedition-sim-814091512/gogobee.db
2026/05/17 15:34:24 INFO database initialized path=/tmp/expedition-sim-1701622760/gogobee.db
2026/05/17 15:34:24 INFO database initialized path=/tmp/expedition-sim-2474663970/gogobee.db
2026/05/17 15:34:24 INFO database initialized path=/tmp/expedition-sim-3500203401/gogobee.db
2026/05/17 15:34:24 INFO dnd: armed ability fired (turn-based build) user=@sim:fighter-l12-dragons_lair-3 ability="Second Wind"
2026/05/17 15:34:24 INFO dnd: armed ability fired (turn-based build) user=@sim:fighter-l12-dragons_lair-3 ability="Second Wind"
2026/05/17 15:34:24 INFO dnd: armed ability fired (turn-based build) user=@sim:fighter-l12-dragons_lair-3 ability="Second Wind"
2026/05/17 15:34:24 INFO database initialized path=/tmp/expedition-sim-1597673037/gogobee.db
2026/05/17 15:34:24 INFO database initialized path=/tmp/expedition-sim-3746346522/gogobee.db
2026/05/17 15:34:24 INFO database initialized path=/tmp/expedition-sim-2947709156/gogobee.db
2026/05/17 15:34:24 INFO database initialized path=/tmp/expedition-sim-2279228254/gogobee.db
2026/05/17 15:34:24 INFO database initialized path=/tmp/expedition-sim-1330280095/gogobee.db
2026/05/17 15:34:24 INFO database initialized path=/tmp/expedition-sim-1007046865/gogobee.db
2026/05/17 15:34:24 INFO database initialized path=/tmp/expedition-sim-3808145558/gogobee.db
2026/05/17 15:34:24 INFO dnd: armed ability fired (turn-based build) user=@sim:fighter-l12-dragons_lair-4 ability="Second Wind"
2026/05/17 15:34:24 INFO dnd: armed ability fired (turn-based build) user=@sim:fighter-l12-dragons_lair-4 ability="Second Wind"
2026/05/17 15:34:24 INFO dnd: armed ability fired (turn-based build) user=@sim:fighter-l12-dragons_lair-4 ability="Second Wind"
2026/05/17 15:34:24 INFO database initialized path=/tmp/expedition-sim-3669887885/gogobee.db
2026/05/17 15:34:24 INFO database initialized path=/tmp/expedition-sim-3912763644/gogobee.db
2026/05/17 15:34:24 INFO database initialized path=/tmp/expedition-sim-2891748518/gogobee.db
2026/05/17 15:34:24 INFO database initialized path=/tmp/expedition-sim-1827307519/gogobee.db
2026/05/17 15:34:24 INFO database initialized path=/tmp/expedition-sim-4109127351/gogobee.db
2026/05/17 15:34:24 INFO database initialized path=/tmp/expedition-sim-253619287/gogobee.db
2026/05/17 15:34:24 INFO dnd: armed ability fired (turn-based build) user=@sim:fighter-l12-dragons_lair-5 ability="Second Wind"
2026/05/17 15:34:24 INFO dnd: armed ability fired (turn-based build) user=@sim:fighter-l12-dragons_lair-5 ability="Second Wind"
2026/05/17 15:34:24 INFO dnd: armed ability fired (turn-based build) user=@sim:fighter-l12-dragons_lair-5 ability="Second Wind"
2026/05/17 15:34:24 INFO database initialized path=/tmp/expedition-sim-889111768/gogobee.db
2026/05/17 15:34:24 INFO database initialized path=/tmp/expedition-sim-3994033199/gogobee.db
2026/05/17 15:34:24 INFO database initialized path=/tmp/expedition-sim-2355572633/gogobee.db
2026/05/17 15:34:24 INFO database initialized path=/tmp/expedition-sim-2955130129/gogobee.db
2026/05/17 15:34:25 INFO database initialized path=/tmp/expedition-sim-3040643250/gogobee.db
2026/05/17 15:34:25 INFO dnd: armed ability fired (turn-based build) user=@sim:fighter-l12-dragons_lair-6 ability="Second Wind"
2026/05/17 15:34:25 INFO dnd: armed ability fired (turn-based build) user=@sim:fighter-l12-dragons_lair-6 ability="Second Wind"
2026/05/17 15:34:25 INFO dnd: armed ability fired (turn-based build) user=@sim:fighter-l12-dragons_lair-6 ability="Second Wind"
2026/05/17 15:34:25 INFO database initialized path=/tmp/expedition-sim-996326193/gogobee.db
2026/05/17 15:34:25 INFO database initialized path=/tmp/expedition-sim-1026834926/gogobee.db
2026/05/17 15:34:25 INFO database initialized path=/tmp/expedition-sim-874236375/gogobee.db
2026/05/17 15:34:25 INFO database initialized path=/tmp/expedition-sim-628985075/gogobee.db
2026/05/17 15:34:25 INFO database initialized path=/tmp/expedition-sim-4278591308/gogobee.db
2026/05/17 15:34:25 INFO dnd: armed ability fired (turn-based build) user=@sim:fighter-l12-dragons_lair-7 ability="Second Wind"
2026/05/17 15:34:25 INFO dnd: armed ability fired (turn-based build) user=@sim:fighter-l12-dragons_lair-7 ability="Second Wind"
2026/05/17 15:34:25 INFO dnd: armed ability fired (turn-based build) user=@sim:fighter-l12-dragons_lair-7 ability="Second Wind"
2026/05/17 15:34:25 INFO database initialized path=/tmp/expedition-sim-1333675344/gogobee.db
2026/05/17 15:34:25 INFO database initialized path=/tmp/expedition-sim-3247890534/gogobee.db
2026/05/17 15:34:25 INFO database initialized path=/tmp/expedition-sim-3858591699/gogobee.db
2026/05/17 15:34:25 INFO database initialized path=/tmp/expedition-sim-1397281242/gogobee.db
2026/05/17 15:34:25 INFO database initialized path=/tmp/expedition-sim-2332733301/gogobee.db
2026/05/17 15:34:25 INFO dnd: armed ability fired (turn-based build) user=@sim:fighter-l12-dragons_lair-8 ability="Second Wind"
2026/05/17 15:34:25 INFO dnd: armed ability fired (turn-based build) user=@sim:fighter-l12-dragons_lair-8 ability="Second Wind"
2026/05/17 15:34:25 INFO dnd: armed ability fired (turn-based build) user=@sim:fighter-l12-dragons_lair-8 ability="Second Wind"
2026/05/17 15:34:25 INFO database initialized path=/tmp/expedition-sim-2396625240/gogobee.db
2026/05/17 15:34:25 INFO database initialized path=/tmp/expedition-sim-1690573929/gogobee.db
2026/05/17 15:34:25 INFO database initialized path=/tmp/expedition-sim-1681341943/gogobee.db
2026/05/17 15:34:25 INFO database initialized path=/tmp/expedition-sim-3006146542/gogobee.db
2026/05/17 15:34:25 INFO dnd: armed ability fired (turn-based build) user=@sim:fighter-l12-dragons_lair-9 ability="Second Wind"
2026/05/17 15:34:25 INFO dnd: armed ability fired (turn-based build) user=@sim:fighter-l12-dragons_lair-9 ability="Second Wind"
2026/05/17 15:34:25 INFO dnd: armed ability fired (turn-based build) user=@sim:fighter-l12-dragons_lair-9 ability="Second Wind"
2026/05/17 15:34:25 INFO database initialized path=/tmp/expedition-sim-799921603/gogobee.db
2026/05/17 15:34:25 INFO database initialized path=/tmp/expedition-sim-442683998/gogobee.db
2026/05/17 15:34:25 INFO database initialized path=/tmp/expedition-sim-3139041772/gogobee.db
2026/05/17 15:34:25 INFO database initialized path=/tmp/expedition-sim-2602959398/gogobee.db
2026/05/17 15:34:25 INFO database initialized path=/tmp/expedition-sim-3028049942/gogobee.db

File diff suppressed because one or more lines are too long