From ad27077329eeaf4f9d27353e23343eb0b174935b Mon Sep 17 00:00:00 2001 From: prosolis <5590409+prosolis@users.noreply.github.com> Date: Fri, 15 May 2026 11:24:34 -0700 Subject: [PATCH] Phase 4 doc updates Folds the 4-A diagnostic + 4-B roster pass into the plan doc with before/after numbers, and notes the partial Phase 4 exit (per-zone outliers fixed, tier-wide gap remains for T2/T3/T5). Adds the Phase 5 jumping-off list (per-tier elite threshold, gear-tier mapping review, or shipping burn=75 as the live global). Co-Authored-By: Claude Opus 4.7 (1M context) --- gogobee_expedition_difficulty.md | 75 ++++++++++++++++++++++++++++++-- 1 file changed, 71 insertions(+), 4 deletions(-) diff --git a/gogobee_expedition_difficulty.md b/gogobee_expedition_difficulty.md index 8246293..9662d5a 100644 --- a/gogobee_expedition_difficulty.md +++ b/gogobee_expedition_difficulty.md @@ -310,9 +310,9 @@ the burn=75 global if Phase 4 outlier fixes leave T4 still stuck. ### Phase 4 — per-zone outlier pass -After globals settle, the matrix will name outlier zones — tiers -where one zone reads dramatically off-band while sibling zones are -fine. Per-zone tools: +After globals settle, the matrix names outlier zones — tiers where +one zone reads dramatically off-band while sibling zones are fine. +Per-zone tools: - `SpawnWeight` / `IsElite` flags in zone rosters (`dnd_zone.go:100`). - Boss stat tuning in zone definitions. @@ -324,7 +324,74 @@ Constraint: do not touch monster stat blocks (those belong to the bestiary, shared across systems). Tune the roster + zone-level knobs, not the monsters themselves. -**Exit:** all per-zone cells within band; commit. +#### Phase 4-A — outlier diagnostic (shipped) + +Added a structured per-fight trace hook (`traceFightStruct` + +`harnessFightTrace`) alongside the existing string `traceFight`; +both fire from the same `runHarnessFight` site so the human log and +the structured aggregate stay in sync. Test: +`TestExpeditionBalance_Phase4A_OutlierDiagnostic`. For each of the +four outlier zones it pairs against the healthy sibling at the same +tier (goblin_warrens, sunken_temple, underforge, dragons_lair), +running 200 trials each on the Phase 3-B best cell (e=23, d=1, +burn=50) and reporting per-monster appearances / win-rate / avg HP +loss / kill attribution + day-of-end histogram. + +Findings — each outlier had one or two miscategorised entries that +Phase 2c's single-boss-elite dilution sweep had skipped: + +- **crypt_valdris**: dual-killer elite pool (Wight 99k, Flameskull + 68k); Phase 2c had skipped this zone as "already dual-elite," but + both elites are over-tier for T1. +- **forest_shadows**: standard pool too lethal — Displacer Beast + (38% win, 53k) + Bandit Captain (57% win, 48k). +- **manor_blackspire**: Wraith on standard slot (45hp loss per win, + 85k). +- **abyss_portal**: Nalfeshnee mis-classified standard (CR-13, 2.8% + win, 86k) + Vrock standard at 43hp loss per win. + +#### Phase 4-B — roster re-classification (shipped) + +Per-zone roster tweaks based on Phase 4-A's attribution. No monster +stat-block touches. + +- crypt_valdris: dropped flameskull (lives in underforge T3); + promoted specter to IsElite SW=3 as the soft dilutor. +- forest_shadows: promoted Displacer Beast + Bandit Captain to + IsElite; Owlbear SW 4→2 so the 4-elite pool dilutes evenly. +- manor_blackspire: promoted Wraith to IsElite (joins + Spawn+Revenant). +- abyss_portal: promoted Nalfeshnee + Vrock to IsElite (collapses + standard pool to Quasit alone, ≥99% win). + +Outlier-vs-sibling completion (Phase 3-B best cell, 200 trials): + +| Zone | Before | After | Sibling | +|------|-------:|------:|--------:| +| crypt_valdris T1 | 8.5% | **46.0%** | 45.0% | +| forest_shadows T2 | 0.0% | **7.5%** | 13.0% | +| manor_blackspire T3| 0.5% | **14.5%** | 3.0% | +| abyss_portal T5 | 0.0% | **25.0%** | 57.5% | + +Phase 3-B tier mean (b=50, f=tier) before → after: + T1 26.8% → 44.0% (+17pp), T2 6.2% → 10.0% (+4), + T3 2.5% → 8.5% (+6), T4 unchanged, T5 27.5% → 41.0% (+14). + +**Exit (partial):** the four off-band outliers are no longer +outliers — every per-zone cell is within the spread of its tier +siblings. The Phase 4 plan's stricter exit ("all per-zone cells +within target band") is **not** met: T2/T3/T5 sibling pairs still +sit below band (T2 7-13% vs 62-82%; T3 3-14% vs 54-74%; T5 25-57% +vs 36-56%). That gap is tier-wide, not zone-specific — both zones at +each problem tier underperform together — so no further per-zone +tool will close it. Phase 5 (or a follow-up tier-wide pass) needs to +take over. + +**Next:** Phase 5. Candidate moves are tier-wide: revisit player +gear-tier mapping at T2/T3 (the centerline level vs gear ladder, see +`phase1TierCenterline`), reconsider the elite-bracket threshold +per-tier instead of global, or ship `burn=75` as the new live global +since Phase 4-B already converted T4 to playable at b=50. ### Phase 5 — optional MAD / second-order