Files
gogobee/sim_results/h4_findings.md
prosolis d225fc8185 H4: bump Uncommon/Rare harvest MaxCharges 1→2
53 resources affected in dnd_resource_registry.go; Common (mostly already
2), VeryRare, and Legendary untouched. Calibration sim (15k rows, 10
classes × L3/7/12 × 5 zones) lands cleared-run yield deltas at −2.5% to
+4.7% vs the J2b baseline — well within the ±10% DoD band, but with much
less leverage than the plan anticipated.

The finding (sim_results/h4_findings.md): per-room yield is gated by
non-Noise interrupt truncation, not charge count. The Common consolation
bracket (delta ≥ -4 yields +1) already absorbs most of the Josie nerf.
Future yield tuning should reach for resolveCombatInterrupt, not charges
— parked as out-of-scope for this branch.

H4 closes; the phase-H branch can now soak H1/H2/H3/H5 + this bump.
2026-05-17 16:49:18 -07:00

61 lines
4.9 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.
# H4 — Charge calibration findings
**Date:** 2026-05-17
**Corpus:** `h4_calibration_v1_all10.jsonl` (15k rows, 10 classes × L3/7/12 × 5 zones × n=100). Summary: `h4_calibration_v1_summary.txt`.
**Baseline for comparison:** `baseline_j2a_v2_all10.jsonl` (post-J2b picker, current shipped state).
**Change under test:** every `RarityUncommon` and `RarityRare` resource bumped from `MaxCharges: 1``MaxCharges: 2` in `dnd_resource_registry.go` (53 resources). Commons (already mostly 2), VeryRare/Legendary (trophy tier) untouched.
## TL;DR
**Charge counts are not the binding constraint on yield.** The bump from 1 → 2 charges on every Uncommon and Rare resource produces a tiny net change in cleared-run yield, ranging from 2.5% (forest) to +4.7% (goblin). The H4 DoD (±10% yield parity) is satisfied trivially because the lever has almost no leverage.
| zone | cleared mean yield (J2b) | cleared mean yield (H4) | Δ% |
| ---------------- | -----------------------: | ----------------------: | ---: |
| goblin_warrens | 5.99 | 6.27 | +4.7 |
| forest_shadows | 8.17 | 7.97 | 2.5 |
| manor_blackspire | 5.50 | 5.37 | 2.4 |
| underdark | 6.30 | 6.16 | 2.2 |
| dragons_lair | — | — | — |
All deltas are within n=100 noise (~±5% on these means).
## Why charge counts don't move the needle
Two compounding mechanics cap per-room yield well below "all charges spent":
1. **Standard/Elite/Patrol interrupts abort the entire room harvest pass.** `autoHarvestRoom` returns immediately on any non-Noise interrupt (`internal/plugin/dnd_expedition_autopilot_harvest.go:160-175`). Bumping charges *adds more interrupt rolls per room*, which slightly *increases* the chance the room ends before higher-rarity actions even fire — the Forage action runs first, so its extra charges can squander the room budget before Fish/Essence/Commune get a swing.
2. **The Common consolation bracket** (`resolveHarvestOutcome`, delta -1 to -4) already softens the Josie nerf: even a "failed" roll within 4 below DC yields +1. P(Nothing) is only 0-50% across the realistic DC×modifier range, so the Josie penalty per charge was ~25-50%, not 100%.
Net effect: doubling charges roughly doubles the *potential* yield ceiling per resource, but the per-room interrupt-truncation budget is fixed. Yield reshuffles between resources within a room (Fey Bloom +55% in forest, Darkwood 36%, Biolum Fungi 35% — see `mean_yields_by_name` slice) without changing the per-run total.
## What this means for the H4 DoD
The plan's DoD reads:
> Monte Carlo shows yield parity within ±10% across tiers; rare nodes feel rare (success rate visibly < 50%) but not punishing across a full expedition.
Both legs are met:
- **Parity:** all four sampled zones land within ±5% of the J2b baseline.
- **Rare-feel:** charge bumps don't change DCs; success rate per attempt is unchanged. A 1→2 MC bump only means "two swings instead of one" on the same DC, so rares still take two attempts on average to land.
The implicit goal — restore pre-Josie yields — is **not** met. We don't have a pre-Josie sim corpus to compare against (H1 shipped before the sim was built). Analytically, pre-Josie yields would be ~1.3× (low DC) to 2× (high DC) the post-Josie per-charge expectation. H4 closes maybe 5-30% of that gap depending on zone, because of the interrupt cap.
## Recommendation
**Ship the bump as-is.** It's a narrative/feel win (more swings, longer node depletion arcs) and a small yield lift in goblin_warrens — the entry zone. The cost is zero (registry-only change, no code touched, all tests green).
**Do not chase the rest of the gap by tuning interrupts.** The difficulty memo (`feedback_difficulty_target`) says lift trailers without pushing monster scaling, and harvest-interrupt frequency is part of the per-zone threat economy. Reducing interrupt rate would lift yield universally but also weaken the threat-loop feedback (`§4.2 Combat Interrupt`). Out of scope for this branch.
**Document the finding** so a future tuner doesn't reach for the charge knob again expecting big swings.
## Files
- `dnd_resource_registry.go` — 53 resources bumped.
- `h4_calibration_v1_all10.jsonl` / `.err` — sim corpus.
- `h4_calibration_v1_summary.txt` — per-cell summary.
## Open items rolled forward
- **Interrupt-frequency tune** (not H4): if harvest yields ever need to lift another 20-30%, the right lever is `resolveCombatInterrupt` rates in `dnd_expedition_harvest.go`, not charge counts. Park as a future tuning option.
- **Pre-Josie baseline corpus** (not needed): a one-shot git revert of H1 + sim run would give the true target. Skipping unless someone disputes the "interrupt-cap is the real ceiling" finding.