Files
gogobee/sim_results/j3_findings.md
prosolis f2c2d774d4 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/.
2026-05-17 15:43:41 -07:00

44 lines
4.2 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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.