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

564 lines
34 KiB
Markdown

# First Conquest of Azeroth party
Updated: 2026-10-05. The project owner selected these five classes as the first
CoA implementation milestone. Build and refine this party before expanding to
other CoA classes. CoA here means Conquest of Azeroth on Vol'Jin; the existing
RoM backlog's Chronicles of Arcadia references describe a different game.
| Seat | Class | Initial specialization | Responsibility |
| --- | --- | --- | --- |
| 1 | Guardian | Vanguard | Tank |
| 2 | Witch Doctor | Brewing | Healer |
| 3 | Barbarian | Brutality | Melee damage |
| 4 | Ranger | Archery | Ranged damage |
| 5 | Pyromancer | Incineration | Caster damage |
Begin with each class's core kit and the selected specialization so the full
party can enter targeted playtests early. Finish the remaining trees within
these five classes before expanding to the other classes. This selects work;
it does not certify the current implementations.
## Implementation order and acceptance
1. Freeze the five class/spec identities and reproducible diagnostic inputs.
Inventory every node, rank, source spell, and current runtime mapping. Author
reviewed talent allocations instead of treating generated role-weighted
allocations as an intended CoA build.
2. Establish the tank and healer loops together, including their resource and
persistent state. Check damage, mitigation, threat, healing recipients,
periodic effects, and party utility against the captured evidence.
3. Implement the three distinct damage loops and their talent interactions.
Share combat primitives where their semantics match, while keeping class
state and learned-rank ownership on the correct actor.
4. Test the same party against explicitly selected encounters. Repeat with
each class as the active player and the other four as companions. Include
single-target and multiple-target pulls, incoming party damage, interrupts,
dispels, cooldown use, resource exhaustion, death, and resurrection where
the selected kits provide them.
5. Fix observed mechanic and AI defects, then inspect live dungeon play and
record evidence in `PLAYTEST_NOTES.md`. Compare balance only after mechanic
correctness. Expand the selected classes' other trees before other classes.
The completion gate is verified behavior for the reviewed core/initial-tree
builds on players and companions, a coherent 1-tank/1-healer/3-damage party in
live playtests, and an explicit record of any unresolved source limitations.
Catalog counts, a boss kill, or passing preparation tests are insufficient.
## Source-backed priorities
The following anchors are from the August Vol'Jin capture in
`src/game/coaLiveData.generated.json`. They identify work to verify; they are
not claims that these mechanics are implemented.
- Guardian: Footman's Calling (node 4019, spell 92105) establishes formation
behavior; Vanguard's Shield (34417, 804383) builds stacks through blocks and
auto attacks; Paragon (29969, 706514) transforms Heavy Blow at 10 stacks and
interacts with Brace. Audit formation gates, actor-owned stacks, block events,
threat, and defensive sequencing together.
- Witch Doctor: Cauldron Brewer (4005, 92085), Ingredient: Jungle Shrooms
(12645, 801660), Potion Toss (12646, 801661), and Mixologist (6645, 561069)
establish cauldron/ingredient state, nearby ally effects, and ingredient-based
changes to a targeted heal. Verify recipient, radius, periodic cadence,
ingredient exclusivity/capacity, and healing formulas before adding interactions.
- Barbarian: Decapitate (5744, 804414) requires a target below 35% health and
converts additional Energy into damage; Beheader (6744, 705222) refunds Energy
after an eligible kill; Battle Rhythm (14303, 800193) generates Energy on
ability critical hits. Verify event origin and payment/refund ordering.
- Ranger: Precision Shot (31178, 500075), Hunting Shot (29660, 801191), and
Masterful Archery (7794, 680469) depend on Advantage, Elude, ricochet hits,
and stacking effects. Audit the state and target selection before AI priorities.
- Pyromancer: Ignite (6985, 800791), Combustion (29854, 520884), and Pyroclasm
(7174, 520019) depend on Heat, Embers, and the caster's burning effects on a
specific target. Verify periodic generation, spending, effect counting, and
effect consumption. The August Agonizing Burns/Timed Attacks payload exchange
also requires explicit saved-build review.
Current generated resource profiles and generic effects do not prove these
stateful loops are supported. Unspecified proc timing, missing coefficients,
and unknown server rules remain evidence gaps; never invent their values.
Use the cached Vol'Jin capture and global Spell data described in
[COA_REFERENCE_PIPELINE.md](COA_REFERENCE_PIPELINE.md).
## Repeatable preparation and targeted diagnostics
`src/game/coaFirstPartyRoster.ts` owns the exact roster. The benchmark helper at
`src/game/benchmark/coaFirstParty.ts` owns build selection, companion construction,
and explicitly scoped Balance Lab configurations.
`scripts/coa-first-party/prepare.ts` produces the review inventory and five
active-player configurations, retaining the same party build IDs in each.
```sh
npm run coa:party:prepare -- --list-bosses stormwind-stockade
npm run coa:party:prepare -- --level 60 --boss <exact-key-from-list>
npm run coa:party:test
```
Preparation writes ignored local artifacts to
`artifacts/coa-first-party/level-60/`: `audit.json`, `audit.md`, `config.json`,
and `seat-1.json` through `seat-5.json`. It records the source capture/hash,
legal generated talent allocations, source gaps, and runtime representations.
Every mechanic begins as `needs-review`; mapping is not verification.
It downloads nothing and runs no encounter simulations.
Once an explicit diagnostic is appropriate, the existing runtime consumes a
prepared configuration without changing the ordinary companion pool:
```sh
npx vite-node --mode balance-lab scripts/balance-lab/runtime.ts simulate --config artifacts/coa-first-party/level-60/seat-2.json --output artifacts/coa-first-party/level-60/seat-2-runs.json
```
Only the selected five and explicitly named bosses belong to this milestone's
diagnostics. All five remain **Needs Testing**. Do not change Ready policy,
random/eligible pools, default regression scope, or all-class sweep coverage.
Ordinary live party generation currently uses the Ready WoW pool, including
for a CoA player; a complete CoA party must be configured explicitly.
For implementation changes, run the smallest affected tests plus the existing
Ready-five checks, build, and `npm run release:check`. Record each mechanic's
source, player/companion checks, and live evidence as it is completed.
## Initial implementation and evidence limits
The first catalog fix exposes sourced active Talent entries for these five
classes. Talent Essence purchase type no longer prevents an active spell from
becoming a usable action. The action retains its talent-node/rank gate. DBC
passive flags and rank metadata keep passive Talent nodes on the existing
modifier path; missing DBC rows cannot create a new action. The other 16 classes
retain their previous action catalogs.
This fixes action availability, not the complete effect of each spell. Initial
Potion Toss checks cover its base targeted heal and mana payment for a player
and companion. The follow-up below adds ingredient state and the Frog Bones
rider; other riders and the complete Brewing loop remain work. Decapitate's
target-health gate and Beheader's kill refund are separate mechanics;
additional Energy conversion remains unresolved.
Ranger's primary resource is now Focus, matching its spell costs. Player and
companion checks cover spending, the displayed/authoritative pool, and recovery.
The existing authored 100-point pool and 10-per-second recovery are retained;
this correction does not establish source-verified regeneration or implement
Advantage/Elude.
Brewing has specific evidence limits beyond the node-rank source inventory:
Mojo Beam's capture describes eight seconds while the selected DBC says four;
Spirit Link Idol's tooltip says fourteen seconds while its DBC says 8.5. The
current promoted catalog omits the Loa's Blessing empowerment payloads
802207/802208/802215/802216 and Spirit in a Bottle's referenced
504606/707172 payloads. Resolve those exact references against the local/raw
cache before implementing their full behavior. Zero missing node-rank DBC rows
does not establish that every mentioned payload or server rule is known.
## Kickoff validation and diagnostic baseline
On 2026-10-04, 87 focused tests across 15 files pass, including the exact roster,
learned Talent actions, Potion Toss delivery, Decapitate's health restriction,
Ranger Focus, source scope, and classic catalog preservation. Ready-five checks
pass seven game tests and twenty Python tests. The production build passes
TypeScript, asset audits, bundling, compression, and bundle verification.
`npm run release:check` passes, including untracked files. A before/after digest
also confirms the other 16 CoA action catalogs are unchanged.
The targeted automated baseline uses the same five generated level-60 builds,
seed 1, and Taragaman the Hungerer (`ragefire-chasm/entry-11520`). Each run has a
30-second limit and moves only the active player seat. Results after the Focus
correction are:
| Active player | Outcome | Elapsed seconds | Boss health remaining | Deaths |
| --- | --- | ---: | ---: | ---: |
| Guardian | Time limit | 30.0 | 80,065 | 0 |
| Witch Doctor | Time limit | 30.0 | 79,292 | 0 |
| Barbarian | Defeated | 12.6 | 0 | 0 |
| Ranger | Time limit | 30.0 | 12,782 | 0 |
| Pyromancer | Time limit | 30.0 | 14,724 | 0 |
Raw runs are local ignored artifacts at
`artifacts/coa-first-party/level-60/seat-1-runs.json` through `seat-5-runs.json`.
The original claim that Ranger and Pyromancer companions each cast only three
times was a telemetry error. Damaging companion casts were omitted from the
counter despite damage and decision events showing more activity. The corrected
collector counts release presentations once per cast, including channel pulses
only once. A new Hamhock healer-seat diagnostic records 19 Ranger and 17
Pyromancer companion casts. Ranger still records 32.3% Focus starvation; raw
cast counts do not establish a coherent resource/state rotation. The large
player-seat differences require mechanic investigation before balance changes.
These low-pressure encounters provide limited evidence for tank/healer interactions.
These are explicitly scoped automated diagnostics, with no live browser
playtest or balance certification in this kickoff. All five remain Needs
Testing. New routine diagnostics use Stormwind Stockade: Cellblock Rush
(`bite-sized-stormwind-stockade`) under `TEST_DUNGEON_POLICY.md`; record the
boss selected from the run ID. Full-source Stockade campaigns require explicit
selection. The Taragaman records above remain historical evidence.
## Mechanics and rotation follow-up, 2026-10-05
- `coaGuardianVanguardRuntime.ts` owns learned node 34417's actor-owned Vanguard
state. Source spells 804383/804384 establish one stack per landed normal swing
or block, ten maximum, a refreshed 60-second duration, and 2% less damage from
each magic school per stack. Direct incoming spells use the current mitigation
before consuming one stack. Periodic-tick consumption is unresolved and is
excluded. Player and companion event hooks use the same state transition.
- `coaWitchDoctorBrewingRuntime.ts` owns persistent ingredient markers and the
one-ingredient capacity, raised to two by learned Mixologist node 6645. An
ingredient already present may refresh; an additional ingredient at capacity
fails before payment. Replacement/removal behavior is not specified by the
captured evidence. Frog Bones 801663 no longer creates the importer's bogus
one-second caster shield. It retains its 1.5-second cauldron pulse. Potion Toss
801661 adds the shield from global spell 802971 to its selected ally only when
that caster owns an active Frog Bones marker: eight seconds, base 100, five
points per level from level ten, 35% Spirit and 80% bonus healing. Other
ingredient markers do not establish their unfinished Potion Toss riders.
- `coaBarbarianExecuteRuntime.ts` also owns learned Beheader node 6744's exact
Decapitate kill refund: 100% of maximum Energy after an effective killing hit,
clamped to the pool maximum. Failed, nonlethal and unrelated hits do not refund.
The additional-Energy damage conversion has no verified ratio in this slice.
Its generic weapon-damage projection also needs review: separate DBC weapon
effects must not be treated as two independent weapon hits.
- Pyromancer Ignite's selected-enemy implicit target takes precedence over its
DBC radius metadata. Both tree and progression variants use unit targeting;
nearby enemies no longer receive the selected enemy's burn.
- Chosen-five unit-target periodic maintenance compares ability, caster,
recipient and positive remaining duration. A burn or HoT on one actor no
longer blocks applying that spell to a different actor. This correction does
not author speculative class priority lists or clipping windows. Mojo Beam's
incidental caster aura no longer redirects its friendly unit heal to the
caster; the scorer selects the injured ally and checks that ally's own HoT.
An actual companion channel check verifies Mana payment and the first pulse
on the injured Vanguard ally. It does not resolve Mojo Beam's duration conflict.
The companion Potion Toss rider check primes its actor-owned ingredient marker
explicitly. Default healthy companion AI does not prepare its cauldron; authored
ingredient preparation and selection remain a rotation gap. Loa's Brew winning
one injured-ally fixture does not, by itself, establish a wrong healing priority.
Formation/Paragon, full Brewing riders and payloads, Decapitate's Energy
conversion/Battle Rhythm, Ranger Advantage/Elude, Pyromancer Heat/Embers and
reviewed talent allocations remain the next mechanics work. All five remain
Needs Testing. Automated checks do not replace live party playtests.
The follow-up's explicitly scoped Stockade/Hamhock diagnostic retains level 60,
seed 1, a 30-second limit and the same five generated builds in each seat:
| Active player | Outcome | Elapsed seconds | Boss health remaining | Deaths |
| --- | --- | ---: | ---: | ---: |
| Guardian | Time limit | 30.0 | 80,815 | 0 |
| Witch Doctor | Time limit | 30.0 | 77,898 | 0 |
| Barbarian | Defeated | 13.6 | 0 | 0 |
| Ranger | Time limit | 30.0 | 28,443 | 0 |
| Pyromancer | Defeated | 27.8 | 0 | 0 |
Raw runs are ignored local artifacts at
`artifacts/coa-first-party/stockade-2026-10-05/seat-1-after.json` through
`seat-5-after.json`; seats two/four also retain before runs. The final healer-seat
run records 19 Ranger and 16 Pyromancer companion casts, with Ranger still
32.3% Focus-starved. Correct source behavior can change damage and timing;
these outcomes do not establish balance, authored allocations, or full-class
completion. Low encounter pressure limits healer/tank conclusions. No live
browser playtest was performed in this mechanics follow-up.
Focused validation passes 126 tests across 19 directly affected files, including
the helper, public scorer and actual player/companion behavior checks. Ready-five
compatibility passes seven Vitest and twenty Python tests. The generated runtime
and UI changes are limited to two Pyromancer Ignite actions; the other twenty
class records, resource profiles and triggered payloads are preserved.
The final production build passes TypeScript, asset audits, bundling, static
compression and release-bundle verification. `npm run release:check` passes,
including untracked files. The canonical CoA vault note is updated separately.
## Brewing integration, 2026-10-05
`coaWitchDoctorBrewingAi.ts` owns an authored companion preparation policy.
`partyRuntime.ts::choosePartySupportIntent` prepares learned Frog Bones when a
Brewing healer has Brewer and Potion Toss, every party member/player is at
least 90% healthy, and no resurrection, dispel or engaged-enemy cast is pending.
Normal readiness, Mana, target and capacity checks still precede payment. It
preserves an existing full cauldron and does not refresh an existing own Frog
Bones marker. This is a conservative gameplay policy, not a sourced optimal
rotation. Other ingredient selection remains unfinished.
`partyAbilityAi.ts` projects the caster's current Brewing effects before
scoring heals. Ingredient casts are excluded from the ordinary Brewing healer
rotation so they cannot displace healing or repeatedly refill the cauldron.
Actual idle companion tests prepare through normal selection and payment,
then heal and shield an injured player with Potion Toss, without seeding an
in-flight cast or priming an ingredient marker.
Splash Potion node 7128/spell 802710 is now a friendly ground action in source
generation and the runtime/UI catalogs. Its DBC destination targets 87/31 and
captured tooltip establish a location, 40-yard range, 10-yard radius and up to
eight allies. Its base heal centers on that destination. The cast projection
suppresses the importer's unconditional flattened ingredient and SLS payloads;
only an owned, live Frog Bones marker adds verified 803699's reduced absorb:
eight seconds, base 25 and one point per level from level 15. Player and NPC
tests check nearby recipients, excluded distant allies, no inactive riders,
and destination validation before payment. The player's previous radius shield
branch centered on the caster; the Splash-specific path now uses the same
effect-scoped ground center as its healing. Existing other spell paths retain
their behavior.
Jungle Shrooms 802973's exact Spirit scaling, Fish Oil 802969's aura decoding,
Bloodthistle 802975/803287's proc and 0.5-second internal cooldown, and the
803275 SLS ingredient-combination chain remain unresolved. Their raw source
records are retained; missing runtime semantics do not grant every rider.
The Guardian audit identifies the next import boundary. August Vol'Jin node
4019/spell 92105 establishes 10% self mitigation while Tower or Line Formation
is active, with no numeric threat multiplier. Global spells 800317 and 803130
would create self-owned aura identities `coa:800317:effect:0:aura:87` and
`coa:803130:effect:0:aura:232`, but neither action is present in the promoted
tree/progression/runtime catalog. Mitigation cannot honestly use an assumed
formation flag. Paragon 29969/706514 has a description conflict: the August
builder changes Heavy Blow to Paragon Smash, while the promoted primary text
for 706516 still describes Tower/Bastion. The later formation audit below finds
compatible secondary text and child payloads. Import formation actions and
preserve the source discrepancy when wiring the conditional mechanics. See the cached Guardian JSON and builder in
`data/coa-reference/cache/archive-5078f9ac2254/generation-fa16afec-8f11-4eab-98ab-b6441304fab7/`
and global snapshot `e86031775dfac7e336361087c50ca23a0a7a86c36a760c85803bee4bcdb89351`.
Rotation policy is `playerbots-inspired-v10-coa-brewing-preparation`. The same
five level-60 builds, seed 1, Hamhock and 30-second limit produce:
| Active player | Outcome | Elapsed seconds | Boss health remaining | Deaths |
| --- | --- | ---: | ---: | ---: |
| Guardian | Time limit | 30.0 | 80,007 | 0 |
| Witch Doctor | Time limit | 30.0 | 77,898 | 0 |
| Barbarian | Defeated | 13.6 | 0 | 0 |
| Ranger | Time limit | 30.0 | 28,599 | 0 |
| Pyromancer | Defeated | 24.8 | 0 | 0 |
The Guardian-seat companion records one naturally selected Frog Bones cast.
Raw evidence is preserved separately at ignored
`artifacts/coa-first-party/stockade-integration-2026-10-05/seat-1.json` through
`seat-5.json`. Encounter pressure is low; the healer deals substantial damage,
and these results establish neither balance nor a complete healing rotation.
All five remain Needs Testing. No live browser playtest was performed.
Focused validation passes 37 tests across eight directly affected files;
Ready-five compatibility passes seven Vitest and twenty Python tests. The new
generated catalog change is one Witch Doctor Splash action in each runtime/UI
catalog; the other twenty class records, resource profiles and triggered
payloads are preserved. No recrawl or download was needed.
The final production build passes TypeScript, asset audits, bundling, static
compression and release-bundle verification. `npm run release:check` passes,
including untracked files; the canonical CoA vault note is updated separately.
## Decapitate strike integration and Guardian audit, 2026-10-05
`coaBarbarianWeaponDamageRuntime.ts` projects only tree node 5744/spell 804414
as one normalized weapon strike. The imported effects previously emitted two
independent damage events. The August Vol'Jin tooltip gives the formula:
`27 + 2.2 * (weapon mean + attack power / 14 * normalized speed)`. Explicit
equipped-item classification supplies the standard normalized speed: 3.3 seconds
for two-handed melee weapons, 1.7 for daggers, and 2.4 for other one-handed
melee weapons. Actual swing speed is used only to undo the existing weapon-DPS
conversion. An unknown weapon classification retains the imported fallback.
The helper is used before player execution in `combatStore.ts`, companion
execution in `partyRuntime.ts`, companion scoring in `partyAbilityAi.ts`, and
active-seat scoring in `benchmark/benchmarkController.ts`. Applying it repeatedly
preserves a single strike. It retains identity, cost, targeting, the below-35%
health gate, and Beheader's successful-kill refund. The additional Energy
conversion ratio remains unknown and is not implemented.
The historical generic AzerothCore weapon-effect sequence adds the flat bonus
before applying the percentage, which would also multiply 27. The custom CoA
server script is unavailable; this projection follows the explicit CoA tooltip's
flat bonus outside the percentage. This source interpretation remains recorded
in the helper and does not claim verification against the live server.
The Guardian audit now distinguishes acquisition from payload reconciliation.
Tower 800317 and Line 803130 carry trainer source 6, levels 4/20, but lack a
current tree node or ranked progression chain. They need an explicit rankless
trainer import path and formation-specific effect handling. No formation state
was seeded. Paragon stack spell 706516's secondary field 187 matches the August
Heavy Blow/Paragon Smash description, and children 802629/803432 support its
damage and block/Brace effects. The older primary Tower/Bastion description
is preserved as a conflict. Exact IDs, raw-field provenance, modifiers and
remaining acquisition boundaries are in
`docs/COA_GUARDIAN_FORMATION_AUDIT_2026-10-05.md`.
Rotation policy is `playerbots-inspired-v11-coa-decapitate-strike`. The explicitly
selected five builds run at level 60, seed 1, with a 30-second limit against
Cellblock Rush's catalog-template boss, Hamhock
(`bite-sized-stormwind-stockade/entry-1717`):
| Active player | Outcome | Elapsed seconds | Boss health remaining | Deaths |
| --- | --- | ---: | ---: | ---: |
| Guardian | Time limit | 30.0 | 80,007 | 0 |
| Witch Doctor | Time limit | 30.0 | 77,898 | 0 |
| Barbarian | Defeated | 12.8 | 0 | 0 |
| Ranger | Time limit | 30.0 | 29,396 | 0 |
| Pyromancer | Defeated | 24.8 | 0 | 0 |
These are isolated headless boss-room diagnostics, not a live dungeon clear.
The boss identity comes from the registered Cellblock Rush template; a fresh
live run can select a different boss. Raw configs/results are ignored local
artifacts at `artifacts/coa-first-party/stockade-decapitate-2026-10-05/`.
The final Barbarian active-seat scorer chooses other attacks in this run; its
Decapitate count is zero. Deterministic regression fixtures separately prove
one correctly calculated damage event through actual player and NPC casts.
Damage/selection changes do not certify balance, and encounter pressure remains
too low to establish tank/healer completeness. All five remain Needs Testing.
Focused validation passes 22 tests across five directly affected files,
including the actual player/NPC strike checks and existing execute/Beheader
regressions. Ready-five compatibility passes seven Vitest and twenty Python
tests. This pass changes no generated catalog records or readiness pools.
The final production build passes TypeScript, asset audits, bundling, static
compression and release-bundle verification. `npm run release:check` passes,
including untracked files; the canonical CoA vault note is updated separately.
## Guardian formations and Paragon integration, 2026-10-05
Tower Formation 800317 and Line Formation 803130 now have an explicit rankless
trainer import path in `coaAbilityCatalog.ts`, constrained to the two sourced
Guardian/class-18 rows with trainer source 6, valid levels and matching DBC
identities. They learn at levels 4 and 20 through the game's existing automatic
level-learning model. No tree grant or named trainer is invented. The generated
runtime and UI catalog changes are limited to Guardian records.
`coaGuardianFormationRuntime.ts` replaces the flattened source effects with one
owned self aura per cast. Tower gives +10 percentage points of block, adds half
of the actual shield item's armor and reduces outgoing damage by 10%. Line
adds 15% movement speed and reduces roots by 25%. Aura 232/misc 7 identifies
Root; the broader tooltip wording remains a source conflict, so other control
types retain their duration. Footman's Calling node 4019 adds 10% taken-damage
reduction only while an own live form is active. Projection uses current talent
ranks, equipment and health, preventing borrowed/expired markers and recomputing
shield armor after equipment changes. No numeric threat grant is assumed.
Switching replaces the other form through an authored exclusive group; source
categories 708/709 do not prove exclusivity. Toggle-off remains unfinished.
`coaGuardianParagonRuntime.ts` follows August Vol'Jin node 29969/706514,
706516's compatible secondary text and linked payloads. Heavy Blow adds three
stacks on successful cast; a block adds one with a 500 ms stack-trigger internal
cooldown. Stacks last ten seconds and cap at ten. Readiness 707138 grants no
block bonus. While ready, Heavy Blow's existing action slot, identity, cost,
talent gate and cooldown project to Paragon Smash: 144 + 37% AP in an 8-yard
self circle, confirmed by local SpellRadius.dbc row 14. A successful Smash
creates the separate ten-second +10-point block buff with five block charges.
Each block during that buff consumes a charge and reduces an active Brace
cooldown by two seconds. Companion authority and its mirrored member receive
the same reduction. No unverified stack-consumption/reset rule is introduced;
a qualifying event can reestablish readiness after its previous window expires.
The stale primary Tower/Bastion text remains documented in the source audit.
Player execution, companion execution/scoring, active-seat benchmarking and HUD
use the shared projection. The HUD displays Smash in the Heavy Blow slot during
readiness. Both player and companion movement consume owned Line speed.
Vanguard companions prepare learned Tower through ordinary readiness, targeting
and resource payment and preserve an existing Line. Formation preparation
respects `nextActionAt`, so a future preparation decision does not suppress
normal attacks. Cast/block fixtures prove player and companion paths; they use
explicit block-probability fixtures to make combat outcomes deterministic.
The ready-Smash priority is an authored rotation policy: priority 7,500 only
for a Vanguard tank at or above 55% health; injured, unknown-health and other
actors retain the existing fallback preference. The public companion scorer
uses ordinary learned, ready candidates and chooses Smash over routine Ballad
maintenance. Existing low-health mitigation and urgent reactive taunt/interrupt
scores remain ahead of it. This is a gameplay preference, not a source-derived
optimal rotation.
Rotation policy is `playerbots-inspired-v12-coa-guardian-formations-paragon`.
The generated five builds at level 60, seed 1, with a 30-second limit against
Cellblock Rush's catalog-template Hamhock
(`bite-sized-stormwind-stockade/entry-1717`) produce:
| Active player | Outcome | Elapsed seconds | Boss health remaining | Deaths |
| --- | --- | ---: | ---: | ---: |
| Guardian | Time limit | 30.0 | 81,106 | 0 |
| Witch Doctor | Time limit | 30.0 | 76,687 | 0 |
| Barbarian | Defeated | 12.8 | 0 | 0 |
| Ranger | Time limit | 30.0 | 23,870 | 0 |
| Pyromancer | Defeated | 24.8 | 0 | 0 |
Each companion-Guardian seat records one naturally selected Tower cast. The
active-player benchmark records no Tower cast; manual player casting is covered
by actual cast fixtures and the browser diagnostic. These
are isolated headless diagnostics at ignored
`artifacts/coa-first-party/stockade-guardian-2026-10-05/`, not live dungeon clears.
The role-weighted Guardian allocation does not learn Paragon/Heavy Blow, so
these five results do not establish Smash selection. Incoming damage is low;
all five remain Needs Testing and no random/readiness pool changed.
Focused validation passes 66 unique tests across fifteen directly affected CoA
and input files, including actual player/companion formation and Paragon casts, incoming
root handling, shield armor/Footman's Calling, block charges/Brace reduction,
unrestricted companion scoring and prior Brewing/Splash/weapon-strike paths.
Ready-five compatibility passes seven Vitest and twenty Python tests. Avatar
checks pass 56 tests across eleven files. Narrow compatibility checks for the
shared workspace's boss guide, disarm metadata/runtime and extra-attack helper
pass seventeen tests; compatibility fixes preserve those existing behaviors.
The final production build passes TypeScript, asset audits, Vite bundling,
static compression and release-bundle verification. During verification,
concurrent enemy-runtime changes briefly duplicated/removed their interface
fields and concurrent bootstrap runs collided on an exclusive object write;
final validation uses the successful completed build. The final creature weapon
state declarations share one typed interface, preserving runtime behavior.
The isolated live harness uses an explicit, runtime-normalized level-60 Guardian
variant learning Paragon and Heavy Blow alongside Footman's Calling, Brace and
Vanguard's Shield. It resolves the public catalog preloader and resource API's
minified export aliases from source-matched bundle AST, loads the five class
catalogs before entry, and verifies their resource profiles. Switching characters
cannot preload a whole party persistently because the app reloads its memory
when the entered character changes. The harness therefore installs a scoped
pre-entry PartyBridge initialization fixture, calls the normal initializer and
substitutes the prepared companions before actor synchronization. It leaves
readiness/random pools unchanged and seeds no combat/proc state. A selectable
first-party preset in the game UI remains separate work.
Live entry exposed two startup gaps and supplied the final regressions.
`combatRotation.ts::precombatPreparationEffects` now excludes exact Guardian
formation spells from generic free aura preparation: initial entry has no form,
player casting pays normally, companion preparation casts normally, and later
preparation cannot add a second raw form or replace a chosen Line.
`actionBindings.ts::normalizeActionBindings` separates default assignment order
from an optional explicit allowlist. `combatStore.ts::initializeCharacter`
validates saved slots against all nonpassive class actions, then retains the
existing unlearned-talent filter. The learned Heavy Blow talent action survives
entry in its saved slot, while unlearned and unknown actions are rejected.
The shared `dist/assets` directory became locked during rebuild. Final verification
uses an isolated output at
`artifacts/coa-first-party/stockade-guardian-2026-10-05/dist-final`: prebuild and
asset audits passed, then the same npm build command ran with lifecycle hooks
skipped and an explicit output override; compression and release-bundle checks
ran explicitly against that output. The live harness accepts a confined `--dist`
path and records the directory/bundle assets actually tested.
The final 180-second browser diagnostic completes on the isolated production
bundle at `artifacts/playtest/coa-guardian-formations/20261006-011259958/`.
Normal offline creation, Button Assignments, Cellblock selection/download and
Tank entry are preserved; the exact companion composition is the explicitly
recorded pre-entry fixture. Entry verifies level 60, all five catalogs, no seeded
formation and the saved Heavy Blow R2 slot. Real action-bar clicks cast Tower,
Line and Tower again, each leaving only its own projected form. The first Tower
reduces Energy from 100 to 83; this legal build's cost modifiers resolve the
base 20 cost to 17, with normal regeneration between later casts.
The fresh run selects Dextren Ward (`entry-1663`, `creature-79116`), confirmed
by its intro card. Screenshot 02 is a countdown overlay because the initial
detachment wait raced the intro's appearance; screenshots 03/04/06 provide the
actual in-dungeon evidence. The route explores about 8 m near the entrance,
with 5.74 m net displacement, full player/party health and no observed boss
actor. It records only the three formation casts, no natural Paragon ready/Smash
marker and no healing/combat pressure. It does not establish a clear, balanced
party, live Smash proc or complete tank/healer rotation. The actual proc/block/
Brace and unmasked scorer coverage comes from the focused regression fixtures.
Reviewed the roster body/shield capture and in-dungeon captures: the player
body and equipped shield/weapon silhouettes render, while the clustered party
and large temporary gold effects obscure some companions. Heavy Blow remains
visible in its saved R2 slot at the endpoint. Browser exceptions are zero;
one console 404 is unclassified, with no failed requests or HTTP errors in
the harness's recorded request scope. These visual and request limitations
remain in the live evidence. All five stay Needs Testing. The source/cast fixes,
scoped diagnostic harness, milestone, source audit and canonical CoA vault note
are updated together.
`npm run release:check` passes, including untracked files. The Git index is
unchanged; no commit, deployment or readiness promotion was performed.