# Heart of the Forest: Build 8 content specification

Implements the submitted Content-Brief-Build8.md using the canonical Adventure, Creature, Combat Encounter and Challenge design templates. This is the authored implementation specification; verification evidence is recorded separately in Build-8-Change-Record.md.

## Design intent

An eerie, readable, occasionally ridiculous ascent from wounded forest to overprotective wizard's tower. Six combats (five required), four treasures, two puzzles, two other required challenges, one indoor camp, three substantial NPC conversations and a short post-boss beat. Preserve the ten-node route, stable IDs, scenery and travel exits, with the Turning Ward itself forming the tower entrance. Preparation, healing supplies and optional Town returns matter. No Titan identity is disclosed. Juniper is an adult forest gnome druid who joins the reserves at completion, without replacing any active hero.

The optional owlbear fight pits two baseline mother strikes and cub healing against Bereaved Fury: defeating the cub adds +2 attack and +4 damage to both strikes. A one-time parchment combat message and raging artwork announce the change. Approach prose is atmospheric and does not disclose the mechanics. Thul is a physical boss with a periodic cleave and half-health escalation. Existing elemental defense, targeting, death and retreat rules apply.

## Adventure implementation

GlobalContent owns every new reusable hero, creature, spell, dialogue, encounter and challenge. HeartOfForest owns placements, the Forsaken Woods completion prerequisite, Juniper recruitment and the Heartstring Bracelet completion reward. Once Forsaken Woods is completed, recorded highest completion keeps the unlock permanent. Practice may bypass the launch gate; normal Town launches cannot. Cold restore preserves an already active expedition. Portrait index 16 is Juniper; indices 17-23 are new creatures. Existing identities and indices are unchanged. The save version remains unchanged. Additive arrays store Locked, last timed-action round and the one-time rage announcement receipt, with safe absent-field defaults. Rage derives from restored HP/allies; puzzle variants derive from the saved expedition ID, tier, node and point using stable FNV-1a. Old saves with no expedition ID use the deterministic legacy fallback. Completed pre-content expeditions remain completed; new points are available on unresolved/replayed expeditions, and old completed/high-tier saves receive the module's completion recruit through existing migration.

Point prerequisites refer only to earlier mandatory points in the same location. They gate the library guardian after its challenge, the gaoler after freeing Juniper, the Heart aftermath after the boss, and the wizard after the final door. Both failed and successful required challenges resolve their point. Neither puzzle can hard-lock progress. Physical scenery persists after completion. Exhausted lore and treasure can be inspected without further rewards; resolved challenges stay visible and disabled. Direct creature encounter props disappear. Unresolved nearby interactions outrank exhausted props; reachable exits outrank exhausted props. The transformed goat disappears; specimen crates remain.

| Location | Authored points (position; required/optional) |
| --- | --- |
| The Sycamore Approach | sticks-and-trouble (0.18; optional); black-sap-stump (0.44; optional); gloam-wings (0.74; required) |
| The Deep Dark | rootbound-coffer (0.28; optional); owlbear-den (0.67; optional) |
| Heartwood Clearing | scarred-threshold (0.22; optional); turning-ward (1.0; required exit) |
| The Tower Vestibule | broken-wards (0.25; optional); vestibule-defense (0.67; required) |
| The Great Hall | welcome-sideboard (0.2; optional); drowsing-casket (0.48; optional); little-footprints (0.76; optional) |
| The Endless Library | lost-in-stacks (0.28; required); library-guardian (0.7; required) |
| The Alchemist's Floor | strange-brew (0.28; optional); alchemical-valuables (0.66; optional) |
| The Holding Rooms | box-one (0.14; optional); box-two (0.34; optional); juniper-release (0.56; required); containment-breach (0.82; required) |
| The Heart Chamber | heart-offerings (0.22; optional); torn-heart-root (0.40; optional); woodsman-heart (0.6; required); heart-still-beats (0.83; required) |
| The Wizard's High Chamber | panic-room (0.26; required); orrel-warning (0.68; required) |

Exit completion awards normal tier Reputation (25/50/100/175/250) once and unlocks Juniper plus the Heartstring Bracelet, once per Company. It grants no extra gold, XP, consumable or Silver Seal. Completion uses a large centered Living Heart illustration. Master+ and cross-adventure Company state remain shared-system behavior. Rescuing Juniper is required on every run; unlocking her again is idempotent.

## Creature implementation

All statistics below are Basic. HP, AC, attack, damage bonus and ordinary rewards use existing tier scaling. Initiative, ability probabilities and escalation increments remain fixed. Support definitions can opt into a target-MaxHP floor; authored healing dice and multipliers otherwise remain fixed. Creature art is JournalArt/Creatures/<name> and is also used for exploration; shared sizing entries calibrate prop use. Each creature has one stable global Monster Manual identity.

| ID / name | HP | AC | Attack | Damage | Initiative | Art index / scale | Kit / elements |
| --- | --- | --- | --- | --- | --- | --- | --- |
| gloamGrifflet / Gloam Grifflet | 12 | 12 | +3 | d4+1 | 18 | 17 / 0.55 | `{"onHitDebuff": {"kind": "offBalance", "chance": 25, "amount": 1}, "weaknesses": ["Fire"], "resistances": ["Earth"], "flight": {"armor": 5, "targets": 2, "damageMultiplier": 0.5, "name": "Raking Swoop"}, "flyingArtwork": "JournalArt/Creatures/GloamGrifflet_Flying", "flightHeight": 0.3}` |
| owlbearMother / Owlbear Mother | 42 | 13 | +4 | d8+2 | 10 | 18 / 1.8 | `{"attacksPerTurn": 2, "rage": {"name": "Bereaved Fury", "onAllyDeath": true, "attackBonus": 2, "damageBonus": 4, "attacksPerTurn": 2, "message": "owlbear_bereaved_fury"}, "weaknesses": ["Fire", "Void"], "resistances": ["Earth", "Wind"], "enragedArtwork": "JournalArt/Creatures/OwlbearMotherRaging"}` |
| owlbearCub / Owlbear Cub | 10 | 11 | +1 | d4+0 | 16 | 19 / 0.75 | `{"mp": 20, "support": {"name": "Hug Mama", "type": "heal", "targeting": "lowestHpPercentAlly", "cost": 1, "die": 4, "bonus": 2, "minimumMissing": 3, "multiplier": 2, "threshold": 1, "selfThreshold": 0.01}, "weaknesses": ["Fire", "Void"], "resistances": ["Earth", "Wind"], "fleeOnDefeatOf": "owlbearMother", "fleeMessage": "owlbear_cub_flees"}` |
| wardMite / Ward Mite | 16 | 14 | +3 | d4+1 | 17 | 20 / 0.65 | `{"timedAction": {"name": "Faultline Pulse", "round": 2, "interval": 3, "icon": "enemy.faultline", "effect": {"kind": "damage", "target": "party", "die": 2, "bonus": 0, "element": "Earth"}}, "weaknesses": ["Void"], "resistances": ["Earth"]}` |
| indexWarden / The Index Warden | 54 | 14 | +4 | d6+1 | 9 | 21 / 1.3 | `{"attacksPerTurn": 2, "timedAction": {"name": "Gale of Unreturned Pages", "round": 2, "interval": 2, "icon": "enemy.gale", "effect": {"kind": "damage", "target": "party", "die": 4, "bonus": 1, "element": "Wind"}, "tierDamageMultiplier": 0.5}, "weaknesses": ["Fire"], "resistances": ["Frost"]}` |
| wardGaoler / The Ward Gaoler | 48 | 14 | +4 | d6+2 | 12 | 22 / 1.8 | `{"attacksPerTurn": 2, "timedAction": {"name": "Lockdown", "round": 1, "interval": 0, "icon": "enemy.lockdown", "effect": {"kind": "locked", "target": "party", "die": 0, "bonus": 40, "element": null}}, "weaknesses": ["Holy", "Wind"], "resistances": ["Void", "Earth"]}` |
| woodsman / Thul, the Woodsman | 72 | 15 | +5 | d6+2 | 8 | 23 / 1.4 | `{"attacksPerTurn": 2, "timedAction": {"name": "Blackwood Cleave", "round": 1, "interval": 3, "icon": "enemy.cleave", "effect": {"kind": "damage", "target": "party", "die": 4, "bonus": 1, "element": null, "sappedChance": 25}, "tierDamageMultiplier": 0.5}, "rage": {"name": "Black Sap Rising", "belowHealth": 0.5, "attackBonus": 1, "damageBonus": 1, "attacksPerTurn": 2}, "weaknesses": ["Fire"], "resistances": ["Earth"]}` |

When both owlbears are at full health, the cub attacks. Hug Mama replaces the cub's attack when a living ally is below its configured health threshold and missing at least 3 HP. It costs 1 of 20 MP and heals 2 × (d4+2), or 6–12 HP, capped at maximum HP; lowest HP percentage wins. Self-heal is only possible below 1% HP, therefore not at any living Basic cub HP. No resurrection. Bereaved Fury activates when another actor in the encounter is dead: +2 attack/+4 damage and two attacks per turn while that condition holds. Black Sap Rising activates at or below half maximum HP: +1 attack/+1 damage and two attacks. Freeze skips the entire action; dead actors cannot rage or heal. Multiattacks retain one strike per presentation beat and save the strike counter. No extra RNG is used to determine escalation.

Timed maneuvers replace the entire personal action, including multiattacks. Faultline Pulse: round 2 and every 3 rounds, d2 Earth to each living hero. Gale of Unreturned Pages: round 2 and every 2 rounds, d4+1 Wind to each living hero; normal rounds have two d6+1 attacks. Blackwood Cleave: round 1 and every 3 rounds, d4+1 untyped to each living hero with an independent 25% Sapped rider on survivors. Thul has two ordinary strikes; Black Sap Rising adds +1 attack/+1 damage at half HP. Cleave and Gale add half the tier damage bonus rounded up; Faultline Pulse adds the full bonus, all before elemental defense. Lockdown: round 1 once, 40% per living hero, no damage; Locked skips the next personal turn, clears after the skip, and has no elemental resistance. A frozen/locked caster can miss its scheduled action. Timed receipts survive saves; repeated calls in the same round cannot recast. The gaoler is 1.8 visual scale, 150% of its previous 1.2. Index Warden and gaoler no longer entangle. Grifflet Off Balance retains its existing hit rider.

## Encounter implementation

| Stable ID | Ordered creatures | Base gold | XP per living hero |
| --- | --- | --- | --- |
| gloam-wings | gloamGrifflet, gloamGrifflet | 16 | 22 |
| owlbear-den | owlbearMother, owlbearCub | 36 | 40 |
| vestibule-defense | wardMite, wardMite, wardMite | 28 | 32 |
| library-guardian | indexWarden | 38 | 42 |
| containment-breach | wardGaoler | 36 | 40 |
| woodsman-heart | woodsman | 60 | 65 |

The den uses the existing encounter-chest confirmation path with den artwork: Investigate starts combat; Leave has no cost, reward or completion. It never calls ordinary treasure rewards. All other combats are required explicit interactions. Every win has its own adventure point receipt. The Heart aftermath is a separate required explicitly opened one-page narrative, gated by the boss receipt.

## Challenge and puzzle implementation

All approaches use Moderate DC12. Requirements need living active members. `heroAny` uses a pipe-separated list and accepts at least one matching hero. Modifiers stack once each. Natural 1/20 retain ordinary challenge math; nonlethal damage never kills or revives. Resource loss clamps living members' mana/stamina at zero. Results commit before presentation and survive saves without another award.

Turning Ward has three prompts (seed/leaf/moon). Choosing the matching symbol adds +4; mismatching adds -2. Matching active Mystere, Spargle and Juniper each add +2. The choice UI does not reveal the answer bonus before selection. Success grants 12 XP; failure grants 4 XP and up to 2 nonlethal HP loss per living member. Both open the damaged ward. Strange Brew chooses from nine clues (grass, frog, pea soup -> green; flame, pumpkin, carrot -> orange; royal robes, amethyst, plum -> purple). Players toggle two illustrated primary bottles and press Mix, or Leave It Alone; a correct two-bottle mix always succeeds without dice. Wrong mixes resolve once, award partial XP and nonlethal damage, and disable the apparatus for the run. No reroll by leaving, reloading or switching adventures.

Trapped treasures offer Disarm (+5) with living active Vestin or Xov, and Shield the Opening (+2, mitigated failure) with living active Alaric or Thoradin. Shielding is available without a scout; Open remains unrestricted. They award ordinary chest gold, scaled XP, and the configured ordinary chest bonus roll exactly once, including rank benefits. The Rootbound Coffer uses nonlethal damage; the Drowsing Casket uses resource loss, never poison. Leave never resolves or spends. Detection prose still requires a living scout; shielding is a precaution available to fighters independently of detection.

| Definition / approach | Requirements | Modifiers | Success | Failure |
| --- | --- | --- | --- | --- |
| rootbound-coffer / open | `[]` | `{"base": 0, "conditional": []}` | `{"text": "The silver flask and a roll of old crowns are carefully packed away.", "gold": 18, "xp": 5}` | `{"text": "A hidden spring snaps across the Company. The silver flask and a roll of old crowns are carefully packed away.", "gold": 18, "xp": 2, "nonLethalDamage": 2, "resourceLoss": 0}` |
| rootbound-coffer / disarm | `[{"kind": "heroAny", "id": "fen|xov"}]` | `{"base": 5, "conditional": []}` | `{"text": "The silver flask and a roll of old crowns are carefully packed away.", "gold": 18, "xp": 5}` | `{"text": "A hidden spring snaps across the Company. The silver flask and a roll of old crowns are carefully packed away.", "gold": 18, "xp": 2, "nonLethalDamage": 2, "resourceLoss": 0}` |
| rootbound-coffer / brace | `[{"kind": "heroAny", "id": "aldric|rowan"}]` | `{"base": 2, "conditional": []}` | `{"text": "The silver flask and a roll of old crowns are carefully packed away.", "gold": 18, "xp": 5}` | `{"text": "The shield catches most of the trap. The silver flask and a roll of old crowns are carefully packed away.", "gold": 18, "xp": 3, "nonLethalDamage": 1}` |
| drowsing-casket / open | `[]` | `{"base": 0, "conditional": []}` | `{"text": "An engraved astrolabe and silver spoons join the Company treasury.", "gold": 18, "xp": 5}` | `{"text": "Lavender smoke curls out. Everyone suddenly needs a nap. An engraved astrolabe and silver spoons join the Company treasury.", "gold": 18, "xp": 2, "nonLethalDamage": 0, "resourceLoss": 1}` |
| drowsing-casket / disarm | `[{"kind": "heroAny", "id": "fen|xov"}]` | `{"base": 5, "conditional": []}` | `{"text": "An engraved astrolabe and silver spoons join the Company treasury.", "gold": 18, "xp": 5}` | `{"text": "Lavender smoke curls out. Everyone suddenly needs a nap. An engraved astrolabe and silver spoons join the Company treasury.", "gold": 18, "xp": 2, "nonLethalDamage": 0, "resourceLoss": 1}` |
| drowsing-casket / brace | `[{"kind": "heroAny", "id": "aldric|rowan"}]` | `{"base": 2, "conditional": []}` | `{"text": "An engraved astrolabe and silver spoons join the Company treasury.", "gold": 18, "xp": 5}` | `{"text": "The shield catches most of the trap. An engraved astrolabe and silver spoons join the Company treasury.", "gold": 18, "xp": 3, "nonLethalDamage": 0}` |
| turning-ward / seed | `[]` | `{"base": 0, "conditional": [{"label": "Mystere", "amount": 2, "flavor": "Mystere steadies the spell.", "requirements": [{"kind": "hero", "id": "elowen"}]}, {"label": "Spargle", "amount": 2, "flavor": "Spargle knows which sparks to avoid.", "requirements": [{"kind": "hero", "id": "vesper"}]}, {"label": "Juniper", "amount": 2, "flavor": "Juniper reads the living pattern.", "requirements": [{"kind": "hero", "id": "juniper"}]}]}` | `{"text": "The rings turn in a clean green flash. The door opens, and the ward politely forgets your faces.", "gold": 0, "xp": 12}` | `{"text": "The rings shriek. A harmless-looking spark proves less harmless than advertised. The damaged ward burns out and the door opens anyway.", "gold": 0, "xp": 4, "nonLethalDamage": 2}` |
| turning-ward / leaf | `[]` | `{"base": 0, "conditional": [{"label": "Mystere", "amount": 2, "flavor": "Mystere steadies the spell.", "requirements": [{"kind": "hero", "id": "elowen"}]}, {"label": "Spargle", "amount": 2, "flavor": "Spargle knows which sparks to avoid.", "requirements": [{"kind": "hero", "id": "vesper"}]}, {"label": "Juniper", "amount": 2, "flavor": "Juniper reads the living pattern.", "requirements": [{"kind": "hero", "id": "juniper"}]}]}` | `{"text": "The rings turn in a clean green flash. The door opens, and the ward politely forgets your faces.", "gold": 0, "xp": 12}` | `{"text": "The rings shriek. A harmless-looking spark proves less harmless than advertised. The damaged ward burns out and the door opens anyway.", "gold": 0, "xp": 4, "nonLethalDamage": 2}` |
| turning-ward / moon | `[]` | `{"base": 0, "conditional": [{"label": "Mystere", "amount": 2, "flavor": "Mystere steadies the spell.", "requirements": [{"kind": "hero", "id": "elowen"}]}, {"label": "Spargle", "amount": 2, "flavor": "Spargle knows which sparks to avoid.", "requirements": [{"kind": "hero", "id": "vesper"}]}, {"label": "Juniper", "amount": 2, "flavor": "Juniper reads the living pattern.", "requirements": [{"kind": "hero", "id": "juniper"}]}]}` | `{"text": "The rings turn in a clean green flash. The door opens, and the ward politely forgets your faces.", "gold": 0, "xp": 12}` | `{"text": "The rings shriek. A harmless-looking spark proves less harmless than advertised. The damaged ward burns out and the door opens anyway.", "gold": 0, "xp": 4, "nonLethalDamage": 2}` |
| lost-in-stacks / catalogue | `[]` | `{"base": 0, "conditional": [{"label": "Mystere", "amount": 2, "flavor": "Mystere follows the footnotes.", "requirements": [{"kind": "hero", "id": "elowen"}]}, {"label": "Spargle", "amount": 2, "flavor": "Spargle recognizes the ward script.", "requirements": [{"kind": "hero", "id": "vesper"}]}]}` | `{"text": "The Company finds Care and Feeding of a Forest Heart. A note reads: NEVER REMOVE FROM ITS ROOT SYSTEM. Even the index looks worried.", "gold": 8, "xp": 12}` | `{"text": "The shelves spin once too often. A dictionary lands on each available head. The exit finally rolls into view; the needed page is stuck to a boot.", "gold": 0, "xp": 4, "nonLethalDamage": 1}` |
| lost-in-stacks / navigate | `[]` | `{"base": 0, "conditional": [{"label": "Vestin", "amount": 2, "flavor": "Vestin tracks the scuffed floor.", "requirements": [{"kind": "hero", "id": "fen"}]}, {"label": "Xov", "amount": 2, "flavor": "Xov slips between the shelves.", "requirements": [{"kind": "hero", "id": "xov"}]}]}` | `{"text": "The Company finds Care and Feeding of a Forest Heart. A note reads: NEVER REMOVE FROM ITS ROOT SYSTEM. Even the index looks worried.", "gold": 8, "xp": 12}` | `{"text": "The shelves spin once too often. A dictionary lands on each available head. The exit finally rolls into view; the needed page is stuck to a boot.", "gold": 0, "xp": 4, "nonLethalDamage": 1}` |
| lost-in-stacks / hold | `[]` | `{"base": 0, "conditional": [{"label": "Alaric", "amount": 2, "flavor": "Alaric braces the bookcase.", "requirements": [{"kind": "hero", "id": "aldric"}]}, {"label": "Thoradin", "amount": 2, "flavor": "Thoradin refuses to be alphabetized.", "requirements": [{"kind": "hero", "id": "rowan"}]}]}` | `{"text": "The Company finds Care and Feeding of a Forest Heart. A note reads: NEVER REMOVE FROM ITS ROOT SYSTEM. Even the index looks worried.", "gold": 8, "xp": 12}` | `{"text": "The shelves spin once too often. A dictionary lands on each available head. The exit finally rolls into view; the needed page is stuck to a boot.", "gold": 0, "xp": 4, "nonLethalDamage": 1}` |
| strange-brew / orange | `[]` | `{"base": 0, "conditional": []}` | `{"text": "The mixture settles into the requested color. A drawer pops open with a little purse marked COMPETENT ASSISTANTS. A rare honor.", "gold": 10, "xp": 10}` | `{"text": "The wrong mixture coughs blue smoke and a very small thunderclap. The apparatus locks itself for cleaning. At least nobody has turned into a spoon.", "gold": 0, "xp": 3, "nonLethalDamage": 2}` |
| strange-brew / green | `[]` | `{"base": 0, "conditional": []}` | `{"text": "The mixture settles into the requested color. A drawer pops open with a little purse marked COMPETENT ASSISTANTS. A rare honor.", "gold": 10, "xp": 10}` | `{"text": "The wrong mixture coughs blue smoke and a very small thunderclap. The apparatus locks itself for cleaning. At least nobody has turned into a spoon.", "gold": 0, "xp": 3, "nonLethalDamage": 2}` |
| strange-brew / purple | `[]` | `{"base": 0, "conditional": []}` | `{"text": "The mixture settles into the requested color. A drawer pops open with a little purse marked COMPETENT ASSISTANTS. A rare honor.", "gold": 10, "xp": 10}` | `{"text": "The wrong mixture coughs blue smoke and a very small thunderclap. The apparatus locks itself for cleaning. At least nobody has turned into a spoon.", "gold": 0, "xp": 3, "nonLethalDamage": 2}` |
| panic-room / announce | `[]` | `{"base": 0, "conditional": [{"label": "Markovia", "amount": 2, "flavor": "Markovia sounds reassuringly official.", "requirements": [{"kind": "hero", "id": "mara"}]}, {"label": "Juniper", "amount": 2, "flavor": "Juniper knows the correct sort of indignation.", "requirements": [{"kind": "hero", "id": "juniper"}]}]}` | `{"text": "The seal clicks open. The wizard is halfway into a dressing gown and halfway through a very stern speech. Relief gets there first. \"Oh. Rescuers. Do come in.\"", "gold": 5, "xp": 12}` | `{"text": "The door bursts inward with a noise like six dropped saucepans. A pillow strikes the first hero. \"State your business!\" cries the wizard. Explaining takes a moment, but no swords are drawn.", "gold": 0, "xp": 4, "resourceLoss": 1}` |
| panic-room / unpick | `[]` | `{"base": 0, "conditional": [{"label": "Mystere", "amount": 2, "flavor": "Mystere traces the emergency rune.", "requirements": [{"kind": "hero", "id": "elowen"}]}, {"label": "Spargle", "amount": 2, "flavor": "Spargle muffles the alarm glyph.", "requirements": [{"kind": "hero", "id": "vesper"}]}]}` | `{"text": "The seal clicks open. The wizard is halfway into a dressing gown and halfway through a very stern speech. Relief gets there first. \"Oh. Rescuers. Do come in.\"", "gold": 5, "xp": 12}` | `{"text": "The door bursts inward with a noise like six dropped saucepans. A pillow strikes the first hero. \"State your business!\" cries the wizard. Explaining takes a moment, but no swords are drawn.", "gold": 0, "xp": 4, "resourceLoss": 1}` |
| panic-room / shoulder | `[]` | `{"base": 0, "conditional": [{"label": "Alaric", "amount": 2, "flavor": "Alaric finds the loose hinge.", "requirements": [{"kind": "hero", "id": "aldric"}]}, {"label": "Thoradin", "amount": 2, "flavor": "Thoradin does the talking with his shoulder.", "requirements": [{"kind": "hero", "id": "rowan"}]}]}` | `{"text": "The seal clicks open. The wizard is halfway into a dressing gown and halfway through a very stern speech. Relief gets there first. \"Oh. Rescuers. Do come in.\"", "gold": 5, "xp": 12}` | `{"text": "The door bursts inward with a noise like six dropped saucepans. A pillow strikes the first hero. \"State your business!\" cries the wizard. Explaining takes a moment, but no swords are drawn.", "gold": 0, "xp": 4, "resourceLoss": 1}` |

## Juniper implementation

Stable ID juniper, appended roster slot 7, portrait 16, Druid, visualScale 0.75. Basic 15 HP, AC13, +3 attack, d6+1 Earth, initiative13, 4 mana. Briar Balm is both personal effect and free starting learned spell: 1 mana heals d6+3 to a living ally and cures poison. Temple offers Briar Lash (25 gold; 1 mana; d6+2 automatic Earth damage to one enemy) and Barkskin (35 gold; 2 mana; party +2 AC for two turns). Briar Balm's catalog price is 20 gold. Existing healing, spell eligibility, buff expiration and max-resource rules apply. Gilded attire derives from Rank III like every other hero; no automatic equip or combat benefit.

## Art, compatibility and verification contract

The original twenty-one assets plus eleven second-pass original assets and their prompts are preserved in ArtSources/HeartOfForestContent; game copies are global Resources assets. Existing environment images, map, stair, metadata and user artwork are retained. Source alpha and resolution are preserved; platform import controls runtime size. All new exploration art is registered in SceneArtSizing. The post-boss scene uses the separate LivingHeart prop (1.4 human-height units), a botanical heart of roots, vines and blossoms on a stone plinth. Review four aspect ratios, dialogue portraits, challenge choices/results, creature figures, indoor camp and completion.

HeartContentChecks covers real traversal with every point resolved and reloaded, conditional trap choices, puzzle persistence/answers, camp/death behavior, recruit migration, rage, healing, combat balance and duplicate protection. The Editor content verifier uses isolated Practice, captures all points/dialogue pages across four ratios and Unity JSON; its combat victories are simulated for presentation coverage. Existing combat suites and the new pure samples test actual fighting. Physical phone/tablet/controller evidence is separate.

Second-pass questions: resource attrition with varied parties and difficulties; full player perception of the optional den's risk; portrait crops and generated cutout finishing; optional expansion of Juniper's druid spell catalog. These are follow-up playtesting topics, not blockers to the implemented polish scope.

## Heartstring Bracelet

Global artifact ID `heartstring`, skill label First Spark, Mage/Cleric/Druid roles. One transferable artifact in the existing slot. New combat construction grants 1 MP only to a living equipped caster with missing MP, capped at maximum; it never grants stamina, exceeds maximum MP or runs during combat restore. Passive effect preserves the caster's personal skill/spellbook. Completion grants ownership idempotently, without auto-equipping. Prodigus explains the freely given living strand in his final dialogue.

Gold and XP use shared tier multipliers 1/1.8/2.8/4/6 and existing rounding. Revised encounter bases total 214 gold and 241 XP per survivor including the optional den (previously 165/180); required encounters total 178/201. Advanced required encounters therefore pay the same global 1.8 scaling, rather than a separate module-specific multiplier. Chest bonus rates/caps, provisions and rank rules are unchanged.

Restoring an already completed Heart expedition (or its higher tier) backfills Heartstring ownership without auto-equipping or replaying reward popups.

Grifflet combat and exploration use shared pose registration at 0.65 visible human heights. Grounded feet sit on the ground plane; flying feet sit 1.05 human heights above it. Each image has independently measured body bounds and foot contact. The legacy flightHeight/visualScale values are retained in content, but registered flyingArtwork uses SceneArtSizing rather than the legacy fitted container. Exploration flight is cosmetic; combat uses the saved Take Flight / Raking Swoop cycle documented in the GM Guide.

If the mother is defeated while the cub survives, the cub flees at the end of that complete action. A brief "The Owlbear cub runs off" modal precedes the normal victory banner and encounter reward. Fleeing preserves the cub's HP, removes it from targeting/turns and artwork, shows FLED rather than SLAIN, and creates neither a gravestone nor a Monster Manual defeat count. If one area attack kills both, the cub is defeated normally and no retreat popup appears. Cub-first defeat still triggers Bereaved Fury. The additive snapshot `fled` receipt is deep-copied and restored, with missing legacy fields defaulting to false; restoring a retreat does not repeat its popup.

The 20 September balance pass supersedes earlier timing/affinity prose: Thul cleaves on rounds 1,4,7 and applies Sapped; Ward Gaoler makes two ordinary attacks. Both owlbears resist Earth/Wind and are weak to Fire/Void; mites resist Earth and are weak to Void. See the tables above. Living cub retreat grants +20% tier-scaled encounter XP, once, with thematic reward text. Talk is explicit; Juniper remains visible and repeat-interactable after transformation. Heart Basic assumes level 3.
