# Weapon parity follow-up — 2026-10-05 This pass connects source-bound Disarm contributions for players and generated party members, adds verified native RoM unarmed inputs, imports intrinsic enemy offhand flags, and records actual hand results between route checkpoints. The level cap remains 80. Loot and readiness policies are unchanged. ## Runtime ownership - `enemyDisarmRuntime.ts` selects source spell weapon channels and projects equipped-weapon aura and damage contributions. `combatStore.ts` exposes `effectiveActorAuras`; the player and party paths consume that view. Passive weapon auras stay in authoritative storage and resume when Disarm expires. Nonpassive aura storage and other usable hands remain intact. Feral forms retain their weapon-independent behavior. Original gear and nonweapon stats remain available to attribute/AP derivation. - `romNativeCombatAmount.ts` supplies the verified native main-hand profile: source base `Level * 2`, native speed 30 (3 seconds), residual nonweapon damage, and the tracked physical damage multiplier. Main-hand-consuming direct and periodic formulas accept this profile; ranged fields remain independent. Player and party schedulers consume the actor's native snapshot. See [the native source audit](ROM_NATIVE_DISARM_2026-10-05.md) for source hashes, neutral unmodeled rate channels, custom-gear limits, and cast prerequisites. - `enemyAutomaticOffhand.ts` reads the pinned creature `flags_extra` 0x800. Five generated templates carry the flag; their capability survives encounter lifecycle resets and their hand clocks rearm on engagement. Native enemies, summons, and character defenders stay outside this creature contract. The item-class AUTO predicate is available, but equipment mappings are not bound: the backup tables do not match the pinned world source. See [the offhand audit](ENEMY_AUTOMATIC_OFFHAND_2026-10-05.md). - `combatEvents.ts` retains `attackHand` and `extraAttackSourceSpellId` on actual supported enemy swing results. Ordinary main-hand, offhand, and queued Thrash results are distinguishable; unrelated special melee abilities and periodic ticks do not receive invented hand labels. Player, party, summon, and online recipient event writers share the same source classifier. - `scripts/weapon-evidence-recorder.cjs` subscribes read-only to committed combat state. It copies events, weapon state changes, and global source utility aura changes, including party debuffs. It audits event-ID gaps and capacity loss. This is a committed-state recorder, not a guarantee that uncommitted transient state is visible. The existing bounded HUD history remains unchanged. ## Source limits The WoW source contract does not invent native item eligibility or unknown ability channels. Native custom equipment provenance, seven unmodeled weapon rate channels, broader proc-specific formulas, and unsourced cast prerequisites remain explicit boundaries. The source Thrash fallback cadence remains simulator policy. The mismatched equipment backup is evidence for an unresolved import requirement, not an equipment mapping used by combat. ## Validation The final 17-file focused run passes 102 Vitest checks, covering the source helpers, actual player and party Disarm paths, aura projection, weapon AP/DPS contributions, native direct/periodic resolution, enemy hands/queues, and event subscriptions. The selected files are `enemyWeaponEvents.integration`, `enemyExtraAttacks.integration`, `enemyAutomaticOffhand`, `enemyAutomaticOffhand.integration`, `enemyDisarmRuntime`, `enemyDisarmRuntime.integration`, `enemyDisarmApplication.integration`, `enemyWeaponDebuffs`, `playerDisarmContributions.integration`, `romNativeDisarm`, `romNativeCombatAmount.integration`, `romNativeDamage`, `romNativePeriodicDamage`, `romNativeCombatResolution.integration`, `partyAbilityAi`, `combatAuras`, and `combatEventsSubscription`, all under `src/game` with `.test.ts` suffixes. `npm run test:ready-five` passes 7 Vitest and 20 Python checks. Avatar validation passes all 56 checks. The recorder's Node tests pass 3 checks; syntax and the transformed wrapper's `--prepare-only` check pass. No full suite or all-class balance sweep was run. The non-Ready shaman/feral fixtures are isolated source exception checks; native active-five diagnostics do not promote readiness. The final `npm run build` passes the standard prebuild, 8GB TypeScript, Vite, precompression and release-bundle verification. Existing chunk-size and mixed static/dynamic-import warnings remain. Review found and corrected a disabled offhand/ranged default-speed AP contribution before this final build; its new regression preserves independent scripted AP while removing that speed term. The corrected build freeze is `artifacts/weapon-parity-followup-2026-10-05/corrected-build-20261006-035420760`: build SHA-256 `fcdde36bbd63ac711453a57562a38d7a1aa7ff2e8cafd4acb0e65a7a4dc27efe`. It reuses the unchanged isolated content copy from `frozen-20261006-034444784/content`, manifest SHA-256 `ac0fa2a867ba0a495c172de2b89532d69b32d56d032482b26020ce2d189f074b`. That original freeze copied and verified all 27,571 referenced objects (6,489,632,021 bytes; 21,597 logical files). The corrected freeze rechecked both content manifests and hashed the complete source/copied build before and after; it records the original object-verification evidence rather than claiming to rehash every unchanged object a second time. The live wrapper separately verifies the objects actually served. The first-build route `playtest-artifacts/stockade-weapon-utilities/20261006-034834217` cleared Bazil Thredd (1716) and recorded 740 post-baseline events, 44 source main-hand results, one offhand result, positive hand timers, party Disarm and Infected Wound. The recorder had zero gaps, errors, or capacity loss. This is historical first-build evidence: the corrected build receives a separate final run below. Source/helper diagnostics are recorded in the linked worker audits. ## Corrected-build Cellblock Rush `playtest-artifacts/stockade-weapon-utilities/20261006-035524177` completes the one-boss variant with seeded Hamhock, entry 1717, live actor `creature-79098`, run ID `b40105fb-bf4e-435b-9c08-00d3f9feda75`. The native results screenshot shows Hamhock defeated, 1/1 bosses and 03:15.1. This is Cellblock Rush completion, not a five-boss Stockade campaign. The route uses a normal offline Discipline Priest and four Ready NPCs. The UI-created profile receives isolated pre-entry level-30 progression preparation; gameplay uses ordinary controls and read-only telemetry, with no combat state seeding or forced utility casts. The recorder retains 842 consecutive post-baseline events (IDs 9–850), with zero gaps, sampling errors or retention loss. It identifies 73 actual source NPC main-hand results, 528 combined weapon-state observations, and source Bloodlust, Disarm and Infected Wound aura snapshots (15, 3 and 49 respectively). Targets include player-party NPCs and source enemies. No offhand or queued Thrash result is observed in this seeded route. Those paths have deterministic runtime tests; the earlier Bazil first-build route additionally contains one blocked offhand result. Absence here does not establish that the capability never operates. Coverage describes committed post-baseline state, not every uncommitted instant. The route has no player/party hand-tagged events, so it does not directly prove outgoing Disarm suppression; focused player/party runtime tests establish that consumer behavior separately. The run record verifies unchanged complete build/content fingerprints and manifest-backed objects actually loaded. Page/route console error arrays are empty; the outer browser log contains only a favicon 404. Root inspected the final-build roster, entrance/equipment, mid-route and results screenshots: player and several party bodies and staff/shield/weapon silhouettes are visible. Clustering limits a complete per-companion equipment audit. The results UI is readable and agrees with the seeded boss identity. The independent audit rehashes all 2,124 loaded content object paths (77,019,550 bytes), all 185 observed asset URLs (69 frozen build files and 116 manifest-backed logical assets), and all seven critical loaded build chunks, with zero failures. It verifies backing immutable source bytes; complete HTTP response body digests were not captured for every asset request. Evidence: - [Final run record](../playtest-artifacts/stockade-weapon-utilities/20261006-035524177/run-record.json) - [Weapon evidence](../playtest-artifacts/stockade-weapon-utilities/20261006-035524177/weapon-utilities-evidence.json) - [Independent audit](../playtest-artifacts/stockade-weapon-utilities/20261006-035524177/root-weapon-recorder-review.json) - [Roster](../playtest-artifacts/stockade-weapon-utilities/20261006-035524177/campaign/final-build-20261006-035526744/roster-discipline-priest-level-30.png) - [Party silhouettes](../playtest-artifacts/stockade-weapon-utilities/20261006-035524177/campaign/final-build-20261006-035526744/bite-sized-stormwind-stockade-boss-route-50.png) - [Native results](../playtest-artifacts/stockade-weapon-utilities/20261006-035524177/campaign/final-build-20261006-035526744/bite-sized-stormwind-stockade-boss-arrival.png) The final `npm run release:check` passes, including untracked files. Separate game/vault diffs and vault text hygiene are reviewed; no stage, commit or deploy. The root audit is retained with the run. The task began October 5 and completed October 6 local time. Source equipment mappings and native limits above remain open; this pass makes no loot, level-cap or readiness promotion.