# Debug test arena **Current branch, 13 October 2026:** old enemy AI scenarios, the AI enable toggle and F8 AI observation tooling are retired. Shared player/combat/session practice controls and authored lab geometry are retained where independent of AI. Enemies are passive targets pending replacement. The following records and scenario instructions describe historical revisions and must not be used as a current test selection. See the [removal record](superpowers/plans/2026-10-13-enemy-ai-removal.md) and current catalogue. ## Historical arena behavior and evidence Implemented development arena, 8 October 2026. Built-player multiplayer lifecycle checks passed; the normal hand-authored Verdant regression depends on its setup checkpoint below. Open **ProjectI > Debug > Open test arena**, enter Play Mode and choose **Host local test** for an offline NGO/Transport host, or **Host online test** to use the configured free-tier session service. Clients can join by code. **F7** opens/closes the debug panel; closing restores gameplay when no other modal owns input. **F8** opens read-only AI observations on the host or replicated client observations; host-only fields are explicitly unavailable to clients. It starts closed and is development-only. Choose a scenario and **Prepare practice fixture** for manual practice. Use Reset before running it again. Automated assertions run through **ProjectI > Debug > Run arena checks** or `Tools/Test-DebugArena.ps1`. The panel displays execution mode, generation, seed, host/client role, actors, projectiles, pending actions and command failures. Shared fixture controls belong to the host. Automated scenarios reject manual mutations; Reset cancels the generation. AI and invulnerability are labelled fixture overrides. Equipment IDs resolve authored presets and use the production loadout validator. Invulnerability is enforced at accepted server damage. With the panel closed, **Tab** opens core details and **Escape** closes them. The four stations cover target lanes, solid/L-corner cover, ramps/steps/passages/bridge with a floor bypass, and mixed groups. Markers are empty until scenario setup. The six fixed fixtures bypass ordinary random encounter admission, while retaining production prefabs, spawn initialization, population limits, collision, navigation and combat authority. A seventh **dynamic-admission** scenario uses the ordinary production spawn clock and selector. A seed fixes sampling/fixture selection; it does not make PhysX, navigation or network scheduling deterministic. The lab uses an Active run with real participants, tier/player scaling and normal effect scheduling. A dedicated development/scene policy suppresses automatic waves, boss transitions, progression and drops. Reset cancels hostile effects, despawns without death credit, clears run effects/bonuses, restores validated equipment and player combat state, and checks accepted pads and remaining actor/action counts. Failed cleanup refuses a new Run until a successful Reset. A new run identity rejects old combat requests. **ProjectI > Debug > Create or rebuild test arena** replaces only the lab's generated station root after its initial infrastructure copy. Save dirty scenes first. Keep manual additions outside that generated root. The command does not rebuild PrototypeArena or Verdant. Terrain changes require revalidation and navigation baking. **ProjectI > Debug > Build Windows test arena** writes `Builds/DebugArena/ProjectI.exe`. The debug scene is added only to that build; original Editor scene settings are restored in `finally`. **Verify release exclusion build** produces a release build and checks packed scene/scenario assets. The lab never belongs to the ordinary stage sequence. ## Decisions and validation ledger - Baseline: `FoundationTestRunner.RunEditMode("debug-arena-baseline")` passed **688/688**. - First regression run: **689 passed / 18 expected failures**, proving absent entry/lifecycle/panel/scene contracts before implementation (`TestResults/debug-arena-red.xml`). - Independent technical, gameplay and UX reviews selected Active fixture policy because the existing Menu practice state does not tick run effects and pausing ordinary spawning still permits boss progression. - The panel uses F7 to avoid the pack plan's F8 toggle. The original HUD document remains; the copied legacy session menu is disabled in this scene. - **9 October corrected tracer requirement:** cover blocks new shots and absorbs launched enemy tracers. Restore the bolt-cover fixture to assert a real wall impact and zero damage behind cover; the prior pass-through fixture is superseded. Shell/player collision remains separate. A direct-service wall fixture does not by itself prove a genuine AI launch followed by entering cover; that live flow has its own acceptance gate. - Pinned packages and Editor remain unchanged. Primitive lab geometry and existing project materials require no imported asset licence or paid generation. - Fresh full rules: **729/729 EditMode** (`TestResults/debug-probe-ownership-green.xml`). Live suite: **18/18 PlayMode**, including all six real scenarios, ten fixture reset cycles and persistent diagnostics ownership (`TestResults/debug-arena-playmode.xml`). - Built offline suite passed **17 reports**: six scenarios, ten in-flight reset repetitions and expected assertion failure with successful cleanup (`TestResults/debug-arena-1a3fb22ef17e42ee88fe9582f2280e2f/result.json`). - Rendered local flow passed at 1280×720, 1920×1080 and 2560×1440 with 100/125% simulated panel scale, including scroll access, visible fields/checkboxes, actual opened dropdown, reset/rerun generations and blocker release. Captures are under `TestResults/debug-ui-*` and `debug-station-*`; these do not establish human input or actual OS DPI acceptance. - First development build succeeded with **zero errors / 540 warnings**. Release exclusion build succeeded with **zero errors / 676 warnings**, and its packed-asset report contains no debug scene/scenario assets. Build settings restored the normal scene order; the replacement Verdant GUID was repaired by Editor APIs. - Sandbox network attempt failed DNS resolution. The first outside-sandbox two-player cohort exposed destroyed scene-owned diagnostics at rehost. The probe now moves to one persistent session-root owner in explicit debug mode. Matching rebuilt two- and four-player cohorts passed with 75 ms endpoint delay, 15 ms jitter and 1% loss: six scenarios, client mutation refusal, generation-matched local cleanup on every peer, target disconnect, host-loss return to menu and same-process rehost/rejoin with real combat. Evidence: `TestResults/debug-arena-55c5d96d552543d9a5874089f7d31f67/result.json` and `TestResults/debug-arena-581826d5b8b74bc69a17cc3fb23a8e26/result.json`. - At the prior arena checkpoint, normal-stage regression awaited spatial/navigation/group setup. Current setup installs those bindings against the preserved manual terrain; fresh normal-entry/build/multiplayer acceptance is recorded below when complete. Human balance, dodge/readability, representative hardware performance and separate-network co-op acceptance remain separate checks. ## Ordinary admission checkpoint — 9 October The seventh scenario runs against a temporary runtime spatial clone with explicit 20 m exclusive minimum, 60 m inclusive maximum, 6 m disk radius and six-actor fixture cap. It records actual actor lifetimes, group circles, current player positions, route queries and admission times. Normal admissions progress on the existing due clock; moving a player into the selected disk must refuse an unsafe admission. The elite phase uses the large agent mesh, then reset verifies empty actors/groups/selectors and restores the original spatial binding. Fixed-marker spawn controls are disabled for this scenario; AI pause remains an explicitly labelled testing override. F8 reads the accepted reservation footprint and cached selector outcomes, including failures with no actors. Green rings mean spawn reservations, not moving formations or proof that every point in a disk is walkable. Host-only selection/path fields remain unavailable to clients. Rendered accepted/empty views at 720p with 125% simulated scale and 1080p include reachable Close; reset clears old circles/counters. An initial stale-image capture is retained separately and corrected captures wait for a fresh snapshot and completed frames (`pack-spawn-debug-render.txt`). Native testing exposed occupied-pad swapping when reset used join order and scenario preparation used owner order. Both now preserve supported occupied pads and assign only safe unused slots, with bounded support queries and actual accepted-XYZ verification. The regression produced 13 expected failures before the helper. Immediate-spawn menu probes also failed against incremental selection; they now await bounded requests while checking host, scene, run, stage and participant lifetimes. The first four-player ordinary replay timed out after repeatedly discarding known valid preflight points and drawing visible replacements. The selector now retains shuffled uniform preflight samples, revalidates them for each actual tier/member, consumes them only after successful registration, and resumes route work after budget denial. The same seed and 90-second limit passed with **eight admissions / 124 assertions in 47.2 seconds** (`debug-arena-9fa963b8aa3e434d9ed3823c92355a49`). A later two-player run caught a diagnostic assertion that confused the final mesh failure with earlier distance refusals; cached saturating distance counts now retain that evidence while leaving the latest reason truthful. Spawn rules are **68/68**; full current rules **914/914**, including **44 next-slice pure warp cases**, and PlayMode **18/18**. Final rebuilt two/four-player reports follow below. Normal-menu and full-stage four-player runs exposed a separate small-teleport race. The focused `Tools/Test-WarpSettlement.ps1` deliberately crosses the former half-second grace with 350 ms endpoint delay: one 3.162 m warp was accepted, then the old pose replaced it under the same continuity/lifetime; the 5.831 m comparison settled correctly. The failed desired-contract result and successful cleanup are retained in `warp-settlement-679501a5cf37414e966ad2746b3771a6`. Bounded host/owner/peer traces distinguish requested, accepted and rendered XYZ. Ordered publication/arrival state passes pure tests but is not yet integrated into the player; normal-run acceptance remains open. Do not mistake the arena admission checkpoint for pack Advance/grace/tracer/specialist or human-play acceptance. Final admission checkpoint: same development build `d9ebe8e0e111409dbe3ca9ddb1970678` passed two- and four-player runs with 75 ms endpoint delay, 15 ms jitter and 1% loss. Each produced **11 scenario reports**, including seven scenarios, two deep-reset repetitions, one deliberate expected failure and same-process rehost combat; all cleanup succeeded. Initial and rejoined peers prove a matching non-default controller epoch before authority checks. Dynamic admission recorded **eight actors / 124 assertions**, 43.6 s with two players and 47.2 s with four. The two-player metric correctly retained distance refusals `0→8` while the latest trial remained `AgentMesh`. Evidence: `debug-arena-9b4f00f750674f05a9eb81680fcd8403` and `debug-arena-9025b3d7355f40b1967732cdbcf0998f`. Latest incremental debug build: **0 errors/103 warnings**. This closes ordinary arena admission; the reproduced normal-run warp race remains the next integration gate. ## Current setup and diagnostics checkpoint F8 is now bound in the saved lab and manual stage. It reads cached host AI state at 5 Hz with at most 17 actors/32 corners; client host-only fields remain unavailable. F7/F8 blocker ownership and nonempty reader neutrality are covered by live tests. All-category top/bottom rendered captures under `TestResults/debug-ui-ai-*` prove wrapped text and reachable Close at 720p125%/1080p; these are programmatic UI checks, not physical-key or OS-DPI acceptance. Fresh rules **770/770**, live suite **18/18**, normal build **0 errors/543 warnings**, debug **0/640**, release exclusion **0/716**. Matching-build two/four cohorts each passed **18 structured reports**, including ten deep reset repeats, one deliberate failure, client refusal, disconnect, host loss and same-process rehost combat; zero cleanup failures. Reports are in `debug-arena-0f59dd50cfe1489babb39f2e6256a85d` and `debug-arena-07e55febe5064c1a9df98405013f2f3f`. Normal menu passed ten fresh phases in `main-menu-8ad3facbfad04a5988d334d8e77b453f`. The full-stage harness still needs map-independent supported drop/portal layouts: its obsolete coordinate-derived core drop correctly banked through production fallback, so physical ground-pickup acceptance is not yet established. Dynamic admission, hidden pack ingress/grace, revised tracer collision and specialist scenarios must be added as their runtime slices integrate; the six marker fixtures do not claim that future coverage. Normal-stage prerequisite S now passes: the map-independent progression probe/script resolves supported ground and portal-local slots, refuses client/stale work, and verifies host acceptance plus every peer's XYZ. Fresh **781 implemented EditMode / 18 PlayMode**, **29 pending Task0 specs skipped**, two command-ack regressions and prototype **0 errors/543 warnings**. Matching-build two/four normal full runs passed **23 phases** in `encounter-polish-7b46369be4644468b6e81e93e9bab51e` with 75/15/1 simulation, including real core pickup/removal, readiness exit/reentry, four-player portal entry, forfeiture, mandatory rewards/travel, support/revive, results and rehost. The prior coordinate-based core fixture failure is resolved. Ordinary dynamic admission and new pack/specialist lab scenarios remain future work alongside their runtime slices. ## Movement and normal-run checkpoint — 9 October The player now requires matching correction/lifetime/run/stage/scene identity, the owner's native teleport publication tick and a legal received native pose before accepting a remote correction. Ordered received axes replace the pinned NGO full-float interpolation getter. Confirmation remains bounded to two seconds plus four seconds of late recovery; movement uses strict native ticks, trusted elapsed time, one original allowance and the captured dash window/path. Host-authorized normal-speed gains raise only future credit; already authorized speed remains a finite recovery ceiling through expiry, then ordinary current-speed validation resumes. This is bounded reconciliation tolerance, not exact causal buff timing or stronger anti-cheat. Owner movement remains immediate. A first jump queues once and drains after commit without replacing the correction. Unconfirmed spatial casts, pickups, revive participants and portal readiness are refused; existing paid grenades/fields and HP/reload passive events retain their ordinary lifetimes. Unknown portal position clears outside-entry evidence. A teleport cannot earn Backstep Guard: actual accepted dash travel must exceed the existing half-metre threshold. Downing during confirmation revokes the live budget and issues a new stationary correction; stale proof cannot recover, including exhausted-issuer failure. Client reports explicitly mark host settlement unknown/Unavailable. Behavior REDs are retained: `backstep-warp-red` (motionless teleport wrongly granted12), `warp-speed-ceiling-red` (eleven missing contracts), `warp-down-revoke-fresh-red` (three missing revocation contracts), and `warp-down-live-red` (actual down left the old correction version). An earlier down-label run used the older compiled assembly and is not revocation proof. Final movement snapshot passed **966/966 EditMode** and **25/25 PlayMode** (`movement-warp-down-final-*`), before new pending ingress/contact specifications. The actual Tempo wiring test uses an artificial remote window/synthetic native positions and does not claim live buff-delivery timing. Prefab migration was validated on a disposable copy and actual saved prefab, preserving GUID, component IDs/order and transform settings; protocol10 rejects older players. Package/editor pins and manual terrain are preserved. Final builds succeeded: prototype **0 errors/555 warnings**, debug **0/640**, release exclusion **0/693**; release packed assets contain no debug scene/catalog. Final debug build `edb6f04c671a43ccb877baab57348870` passed two/four **five-case** warp cohorts at350ms endpoint delay/15ms jitter/no loss: short and large warps, movement before confirmation, immediate queued jump, and actual downing during confirmation. Every case converged and cleanup passed (`warp-settlement-bb9c153b85aa4c1abd709a3601c13e0b`, `warp-settlement-12002ce3d2064b149785c29b26520e6c`). Final seven-scenario two/four arena cohorts, two deep resets, deliberate expected failure, client refusal, disconnect/host loss and rehost passed at75/15/1 (`debug-arena-f78e81300c414700aa4c759fb836bfc1`, `debug-arena-f36d9991c4034183b9cc22075da7497e`). Normal main-menu acceptance passed ten phases (`main-menu-39d3ae635b1742b7a042afc589df8050`). Normal portal entry is exercised by ordinary owner CharacterController walking, not an inside teleport. Steps spend actual elapsed movement time once per frame; the unchanged eight-second command requires actual containment and replicated host readiness. The retained `encounter-polish-be5ede582a104b2eb177cecee56c1419` failure exposed over-budget async stepping/early acknowledgement. In `encounter-polish-0825ddffd5884355971917ab6e8f9d89`, two-player progression passed eleven phases through stage-three results; four-player entry failed because process order0,2,3,1 occupied the nearer row before the farther slot. The blocked owner recorded29,194 steps over8.0005s with unchanged correction/readiness counts. The script now fills slots farthest-first along the validated approach, with pure shuffled/rotated/side-approach/invalid-geometry regression proof (`Tools/Test-PortalEntryOrder.ps1`). Matching-build four-player replay passed twelve phases through both portals, stage-three results and clean rehost (`encounter-polish-b97cdc0223684546aada507a31fbba8e`). No movement speed, collision, portal rule or deadline was relaxed. Independent final technical/gameplay/UX reviews cleared the bounded runtime change after the downing repair. Human movement/dodge/portal feel, actual separate-network play and representative hardware performance remain unverified. Future ingress/grace/tracer/specialist fixtures must accompany their runtime slices; this checkpoint does not claim those features. ## Pack intent and initial unseen ingress — 9 October Task2 now stores actual contact separately from imported memory and area guidance. Per-member grace captures the last positive sighting time plus its resolved duration (default5, valid0–60, invalid5); joining/tuning/peek/removal/lifetime boundaries are covered by35 pure cases. Guidance is coarse8m/1s with4s commitment, validated against every represented native mesh/filter under the shared eight-query budget. Denied work retains prior guidance; full cohort/filter/lifetime stamps fence deferred proof. Supported centres seed once from the accepted dynamic circle or first supported legacy member. This is cached intent/navigation data; real actor visual reporting, FSM changes, moving formation and attack grace remain later tasks. Real local-host normal ranged actors exposed four desired failures with one target-down control passing (`pack-advance-ingress-coroutine-full-red`). Initial unseen paths now retain coordination Advance permission after acquisition releases a combat lease. Budget refusal preserves an existing complete route only while current hint/all-player spacing remains safe; perceived combat still uses the fair combat lease. Fixtures explicitly disable sight in a definition clone and install measured native safe paths, so they do not claim natural-cover or production-selected arrivals. The first corrected fixture sampled an expired retry window and then measured acceleration after only0.019–0.141s. It was corrected using public AIStopMovement→AIExplore on fresh actual frames to establish the unchanged one-second reuse window, then a0.45s minimum observation inside the original three-second limit. Private clocks, budgets and>.1m displacement assertions are unchanged. Temporarily restoring the old permission clauses still produced one pass/four expected failures (`pack-advance-window-old-permission-red`); restored candidate hashes matched. Final one/two/three-member evidence records0.452–0.453s, four actual thinks each, useful motion, complete retained paths/permissions and successful cleanup (`pack-advance-*-20261008T20360*.json`). Earlier zero-corner replans remain a Task3 investigation risk, not proof of their cause. Native mixed normal/elite guidance, exhausted-budget retention and lifecycle checks passed. Two additional REDs proved unsupported-first centre stayedzero and changed deferred filter retainedTypeIndex1; bounded fixes produced5/5 (`pack-contact-coordinator-red`, `pack-contact-coordinator-green`). Both use real prefabs/agents/path corners/query work; reflection-driven private scheduling is labelled in reports. Final complete suites pass **1001 EditMode / 35 PlayMode** (`pack-contact-ingress-full-*`), with no runtime console errors. Independent technical/gameplay/UX and corrective delta reviews pass. Matching rebuilt players succeeded with **0 errors**, retained warnings555/640/693 for normal/debug/release; release excludes lab assets. Debug build `0e48629fbfe54adba43a76a8bb44cd1e` passed two/four seven-scenario cohorts with11 reports each, two deep resets, expected failure, client refusal, target disconnect, host loss and rehost combat (`debug-arena-8ef0ab26856d479486cb799d35b95946`, `debug-arena-ee9b8b20937b4480b6f4612ae7eb462f`). Menu passed10 phases (`main-menu-54ac468f6d0a4d62bd4b813b62065ce4`); full two/four manual-first-stage progression passed23 phases at75ms endpoint delay/15ms jitter/1% loss (`encounter-polish-62c9cf9993174a7c99cd65d9d9248885`). Human feel, separate-network and performance acceptance remain open. Next: moving typed formation routes, then actual actor contact/action integration and specialist coverage.