Files
healer-man/docs/WEAPON_PARITY_FOLLOWUP_2026-10-05.md
2026-10-06 22:25:34 -04:00

149 lines
9.5 KiB
Markdown
Raw Permalink 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.
# 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.