# Stormwind Stockade enemy-mechanics playtest — 2026-10-05 **Outcome: verified full Stockade clear with live Chain Lightning, Rend, hostile buff, and Demoralizing Shout cast evidence.** The successful run used the normal dungeon UI and ordinary movement, targeting, attacks, party commands, and healing. It was a focused browser playtest, not a balance certification. ## Final run and immutable build The successful run is preserved under [`playtest-artifacts/stockade-enemy-mechanics/20261005-160913676/`](../playtest-artifacts/stockade-enemy-mechanics/20261005-160913676/). It ran from `2026-10-05T16:09:15.713Z` to `2026-10-05T16:31:15.761Z` and completed with child exit code 0. The profile was created through the normal offline character UI as a Priest, then prepared in the isolated profile as a native-stat level-30 Priest/Knight before entering Stockade through the normal picker and healer-role flow. Four NPC companions filled the party. No enemy, damage, health, aura, cast, or combat store state was seeded; there was no teleport, collision bypass, boss-test entry, loot interaction, or readiness promotion. The frozen distribution was `artifacts/stockade-enemy-mechanics-2026-10-05/frozen-dist-20261005-153220` with aggregate SHA-256 `296f26c1a58d096b925977f8a0f4aebc5a2de20ba4ce804592188a87102f99e0` over 5,964 files. The before and after manifests match that exact fingerprint. The read-only `content/` source manifest also stayed unchanged at SHA-256 `d3d553aa7443bf444c87b0c0e923357df02756d0822db2e1a0a908d3f257fdb8`; all 2,124 distinct requested hash-addressed objects returned HTTP 200 and their local bytes matched their object-address hashes. See [`run-record.json`](../playtest-artifacts/stockade-enemy-mechanics/20261005-160913676/run-record.json), [`content-source-evidence.json`](../playtest-artifacts/stockade-enemy-mechanics/20261005-160913676/content-source-evidence.json), and the before/after manifests in the same run folder. The game loaded these production modules: `index-D-xYtSuF.js`, `combatStore-BmIrp-s1.js`, `GameRuntime-DJd285mw.js`, `dungeonSession-Bzyqicra.js`, `PartyFrames-DU0sDQaZ.js`, `romAbilityCatalog-CBkQytej.js`, and `dungeonWorldInteraction-4rtL_sSb.js`. The native result UI reported **FULL DUNGEON CLEAR**, `21:32.5` to final boss, and 5/5 defeated: Targorr the Dread (`creature-84027`), Kam Deepfury (`creature-79088`), Hamhock (`creature-79098`), Bazil Thredd (`creature-79124`), and Dextren Ward (`creature-79116`). The player finished at level 40 with all four level-39 NPCs alive. This was not a no-casualty run: Rorik had three casualty/recovery observations and the party issued three ordinary “Rez dead members” actions. The player death count was zero. The native result text and boss IDs are recorded in `run-record.json` and the campaign `results.json`. ## Enemy mechanics observed The preserved read-only evidence contains 41,116 mob samples, 5,622 raw combat events, 761 source-attributed enemy damage events, and 175 combat-aura samples. The full raw evidence is in [`enemy-mechanics-evidence.json`](../playtest-artifacts/stockade-enemy-mechanics/20261005-160913676/enemy-mechanics-evidence.json). **Hamhock Chain Lightning, spell 421.** Four unique active-cast windows were captured on Hamhock, source `creature-79098`, each interruptible and 1,500 ms long. There are five cast samples because the first window was sampled twice. The event stream attributes ten damage events to Hamhock’s `smart-1717-0-chain-lightning` attack ID: | Target | Hits | Raw damage | Effective damage | Event times (ms) | | --- | ---: | ---: | ---: | --- | | Mage `party-damage-3-rom-mage` | 1 | 579 | 512 | 1791217137627 | | Scout `party-damage-2-rom-scout` | 1 | 347 | 347 | 1791217137627 | | Player `__player__` | 1 | 208 | 208 | 1791217137627 | | Tank `party-tank-0-rom-knight` | 3 | 1,737 | 1,348 | 1791217143836–1791217170624 | | Rogue `party-damage-1-rom-rogue` | 3 | 1,041 | 1,041 | 1791217143836–1791217170624 | | Mage summon `party-damage-3-rom-mage:summon-4` | 1 | 208 | 208 | 1791217143836 | Cast windows (`startedAt`–`completesAt`, ms): `1791217136023–1791217137523`, `1791217142234–1791217143734`, `1791217152437–1791217153937`, and `1791217169029–1791217170529`. **Rend, spells 6547 and 16509.** The raw stream contains 359 source-attributed enemy damage events. Spell 6547 produced 153 pulses, 2,172 raw / 2,060 effective damage, with individual raw hits of 14–16 from Defias Inmates. Spell 16509 produced 206 pulses, 8,823 raw / 8,331 effective damage, with individual raw hits of 38–52 from Defias Prisoners, Captives, and Convicts. Spell 6547 events targeted the tank (112), mage (24), scout (12), and rogue (5). Spell 16509 events targeted the tank (196), mage (5), and scout (5). No Rend active cast state was sampled; the live raw damage events establish the pulses without depending on cast-state sampling. **Enemy-source buffs.** The legacy `mob.auras` projection was empty, but the separate combat-aura stream records eight unique applications whose source and target are both sampled enemies. The initial run summary incorrectly equated the empty legacy projection with no enemy buffs; the evidence summary and status note have been corrected without changing the raw route file. | Aura instance / spell | Source → target | Applied (ms) | | --- | --- | ---: | | `creature-84027:enemy-source-spell-8599:creature-84027` — Enrage | Targorr `creature-84027` → Targorr | 1791216791350 | | `creature-79040:enemy-source-spell-9128:creature-79040` — Battle Shout | Insurgent `creature-79040` → self | 1791217027326 | | `creature-79045:enemy-source-spell-9128:creature-79040` — Battle Shout | Insurgent `creature-79040` → Captive `creature-79045` | 1791217027326 | | `creature-79070:enemy-source-spell-9128:creature-79049` — Battle Shout | Insurgent `creature-79049` → Convict `creature-79070` | 1791216941320 | | `creature-79074:enemy-source-spell-9128:creature-79049` — Battle Shout | Insurgent `creature-79049` → Convict `creature-79074` | 1791216950039 | | `creature-79097:enemy-source-spell-9128:creature-79085` — Battle Shout | Insurgent `creature-79085` → Inmate `creature-79097` | 1791216972232 | | `creature-79100:enemy-source-spell-9128:creature-79085` — Battle Shout | Insurgent `creature-79085` → Inmate `creature-79100` | 1791216963628 | | `creature-79101:enemy-source-spell-9128:creature-79101` — Battle Shout | Insurgent `creature-79101` → self | 1791217182924 | **Demoralizing Shout (“Demo”).** Live active-cast telemetry captured 44 unique cast windows: 20 for spell 13730 from six Defias Insurgent actor IDs, and 24 for spell 16244 from nine Defias Convict actor IDs. The sampled casts were interruptible. This harness captured combat aura instances only when the target was an enemy, so it does not independently establish the party-side Demoralizing Shout effect. The cast state itself was observed live. ## Visual and runtime review Screenshots are in [`campaign/final-build-20261005-160915922/`](../playtest-artifacts/stockade-enemy-mechanics/20261005-160913676/campaign/final-build-20261005-160915922/). The entry, equipped-player/native-party, route 25/50/75%, and boss-arrival screens show loaded native characters, full party frames, buffs, ability HUD, and the changing level HUD. Root also reviewed the 50% and 75% captures. Scene and HUD rendering appeared normal, while bodies and name labels overlapped or were partly occluded; this playtest did not attempt a visual fix. The `stormwind-stockade-boss-arrival.png` filename is historical: its pixels show the native “Stormwind Stockade complete” results overlay, `21:32.5`, all five named bosses defeated, and the level-40 player/four level-39 NPC party. The same result text is recorded in `results.json`. There were no page errors. The only console error was a local `/favicon.ico` 404. Three Rorik recoveries were recorded as described above. The ordinary native UI accepted the configured party and completed the full route. ## Preserved failed and superseded attempts These attempts remain intact and are not counted as the final result: 1. `20261005-152510407` used the earlier authorized frozen copy, which was superseded after the owner found a Chain leash-edge bug. The owner stopped it during roster/picker setup before dungeon entry. 2. `20261005-153314575` used the replacement hash but had an isolated content source setup error: `/content/manifest.json` returned 404, and role selection timed out before entry. The owner clarified that `contentDir` is read-only catalog/object input. The corrected run used the project content directory with the disposable profile/data directory kept separate. 3. `20261005-154226103` reached checkpoint 88 after defeating only Targorr (1/5 bosses). Ordinary movement inputs overshot and reversed around the checkpoint tolerance; the route stopped there. The attempt is preserved as incomplete, not a full clear. 4. `20261005-155657325` reached the dungeon route but failed while serializing evidence because the wrapper referenced `contentSourceResponses` outside its scope. Its `failure.json` retains the error and browser diagnostics; no campaign route JSON was written, so its endpoint and boss count are inconclusive. The final successful retry used adaptive short movement inputs near route checkpoints while retaining the authored checkpoint sequence and tolerance. No further run or source/build change was needed. ## Harness checks The scoped wrapper is [`scripts/playtest-stockade-enemy-mechanics.cjs`](../scripts/playtest-stockade-enemy-mechanics.cjs). `node --check scripts/playtest-stockade-enemy-mechanics.cjs` passed, and `node scripts/playtest-stockade-enemy-mechanics.cjs --prepare-only` validated the source and transformed harness syntax without launching a server or browser. No full suite or build was run by this playtest agent.