test(vfx): harden live missile and effect lifetimes

Add deterministic 96-owner lifecycle and renderer-resource stress gates plus an exact twelve-cycle recall/portal ownership gate. Prove zero retained records, projectiles, spatial buckets, script queues, particle/light owners, shadows, pending effects, and mesh references after churn, GUID reuse, deletion, and session reset.

Make logical teardown incarnation-specific and reentrancy-safe with lifetime epochs, atomic resource registration, generation-aware effect/teleport cleanup, projection mutation tokens, and failure-isolated visibility fan-out. Finish canonical spatial transactions before reporting observer failures and never discard superseded cleanup failures.

Synchronize architecture, roadmap, milestones, retail research, divergence bookkeeping, and durable memory. All three independent review tracks are clean; Release build and the full 5,454-pass/5-skip suite are green.

Co-Authored-By: Codex <noreply@openai.com>
This commit is contained in:
Erik 2026-07-14 15:47:00 +02:00
parent 1e98d81448
commit 8d63e5c28a
21 changed files with 2704 additions and 100 deletions

View file

@ -471,8 +471,8 @@ include dungeons.
`PlayerDescription.Options1` preserves retail's player secure-trade
preference. See
`docs/research/2026-07-13-retail-give-item-pseudocode.md` and issue #216.
- **M2/M3 missile, effect, and portal presentation campaign (Steps 08
independently reviewed 2026-07-14)** — named-retail projectile and
- **M2/M3 missile, effect, and portal presentation campaign (automated Steps 09
complete and independently reviewed 2026-07-14)** — named-retail projectile and
physics-script behavior is pinned in one oracle, the complete `PhysicsDesc`
and F754/F755 wire surfaces are parsed with retail timestamp gates, and
`LiveEntityRuntime` now separates logical lifetime from spatial rebucketing.
@ -533,8 +533,34 @@ include dungeons.
`teleport_hook` teardown followed by a placement snap before the airborne
gate. Ordinary visible CreateObject does not fabricate UnHide; pending
F754/F755 packets replay only after construction-state effects. TS-43 is
retired. The remaining Step 9 is final hardening plus the two-client visual
gate.
retired. Step 9 adds a deterministic 96-owner whole-lifecycle gate spanning
projectile ticks, repeated DAT-effect plays, loaded↔pending landblock churn,
dynamic lights, particle bindings, collision shadows, rapid deletion,
same-GUID generation reuse, unknown pre-create effect packets, and session
reset. A separate 96-owner renderer-seam gate balances every
`EntitySpawnAdapter` mesh reference. Teardown now proves zero retained live
records/bodies/projectiles, render owners, spatial buckets/rescues,
PhysicsScript queues/anchors, effect profiles/packets, emitters/logical IDs,
poses, lights, and active/suspended shadow registrations. The hardening pass
also fixed undrained persistent-rescue retention and rejects queued spatial
visibility edges that no longer match current incarnation truth. A companion
twelve-cycle gate drives exact recall motion `0x10000153` through CallPES,
Hidden, unloaded-destination placement, hydration, and UnHide. Logical
teardown is incarnation-specific across callback-driven GUID reuse; per-GUID
epochs reject create resurrection after a nested delete/reset, resource
registration is atomic, terminal session clear rejects registrations outside
its teardown snapshot, and visibility fan-out drains all owners before
aggregating observer failures. Canonical cell/projection state finishes
committing before those aggregates rethrow; per-GUID epoch tombstones survive
accepted delete until session clear, and superseded creates cannot discard a
prior-incarnation cleanup failure. Per-record projection tokens also prevent
an outer rebucket/withdrawal from overwriting a replacement incarnation or a
newer same-record projection created synchronously by an observer.
TS-26's
`UpdatePosition` freshness gap is retired by the nine-channel timestamp
gates; TS-49 remains the explicit
DetectionManager/`LeftDetection` gap. The final two-client visual gate is
still pending.
- **L.1c local attack receive path (implemented 2026-07-11; live gate pending)**
local non-autonomous mt-0 UpdateMotion now uses retail's wholesale interpreted
funnel and action-stamp gate, so ACE's server-selected melee/missile action