Wires the §3 zone-note interactions that were called out across the
resource doc but left for the polish pass.
Harvest gates (dnd_expedition_harvest.go):
- zoneConditionHarvestBlock — Underforge Heat 10 blocks !mine, Dragon's
Lair infernax_awake blocks all harvesting, Abyss Instability 81+
blocks all harvesting.
- zoneConditionHarvestDCMod — Underforge Heat 7-9 → +3 !mine DC,
Dragon's Lair Awareness Pulse 3+ (day 9+) → +4 all DCs, Abyss 61-80
→ +5 all DCs, Feywild Double-Day → -3 !forage DC. Delta + reason
shown inline on the dice line.
- restoreHarvestNodesInRoom — Time Loop hook (in-memory only; cycle
flow persists downstream).
- Manor !scavenge: 10% Cursed Trinket secondary drop with one-time
TwinBee warning gated by RegionState["manor_cursed_warned"].
Time Loop wiring (dnd_expedition_temporal.go):
- feywildTemporalPostRollover Loop branch now restores nodes in the
current room and appends a re-emergence narration line.
Drow Poison Blade recipe (dnd_economy.go):
- ThomCraftRecipe gains BladeWeaponCount; pickBladeWeapons matches
Type=="weapon" + blade keyword (sword/dagger/blade/scimitar/etc.).
- !craft list shows the blade slot with current inventory count.
- Recipe consumes 1× Drow Poison + 1× any blade weapon → Drow Poison
Blade (sleep-on-crit for 3 combats, effect TODO).
Tests (dnd_zone_conditions_test.go, all DB-free): block branches per
zone, DC delta tables, manor cursed-trinket gate at 10% boundary,
restoreHarvestNodesInRoom in-memory roundtrip, isBladeWeapon /
pickBladeWeapons coverage + shortfall + exclude-already-consumed,
drow_poison_blade recipe shape.
Flavor reuse only — no new flavor file. Reasons-strings on the dice
line and the cursed-trinket warning are inline (Thom/TwinBee voices
in existing pools didn't fit harvest-blocking or warding contexts).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>