# Testing procedure **13 October AI teardown applicability:** the old autonomous enemy AI is removed on `codex/enemy-ai-rebuild`. Retained full suites must still discover their complete current assemblies; deleting obsolete AI fixtures does not make historical counts current. Run retained combat/entity/spawn/session checks against this revision and report their exact selection. Legacy pack/arrival/roster-behavior campaigns below are historical procedures until corresponding behavior exists again; they grant no new campaign attempts. The [removal record](superpowers/plans/2026-10-13-enemy-ai-removal.md) owns this checkpoint's evidence and omissions. Use this procedure with [AGENTS.md](../AGENTS.md), the [complete catalogue](TEST_CATALOGUE.md) and [current project state](PROJECT_PLAN.md). A plan describes intent; source describes implementation; a saved report proves only its recorded revision/build, selection and conditions. ## Choose checks before running The [delegated test execution policy](AGENT_WORKFLOW.md#delegated-test-execution) permits a Sol 6.1 / Medium operator to execute a lead-selected substantial batch. The lead retains strategy and evidence acceptance; transfer exclusive Editor ownership, freeze source and retain every selection, identity, cleanup and retry safeguard below. Human-review timing is chosen for playable implementation slices and does not lower these gates. Read-only reviews do not authorize test execution or a test operator merely by selecting reviewers. Use [the workflow](AGENT_WORKFLOW.md) to classify review effort and exploratory versus integrated work. Those decisions do not lower the gates below. An isolated prototype may use focused checks for its bounded question; promotion into the normal game requires the affected integrated gates and required reviews. Human feel/balance/readability, hardware and separate-network acceptance remain distinct. A prototype label never relaxes authority, state ownership, release exclusion or campaign qualification/budgets. For a prose-only change, inspect references/policy without running Unity. Read the relevant catalogue entries for other boundaries rather than every fixture by default. Write a brief verification packet in the task record: changed behavior/boundary, files/assets, focused checks, remaining integrated gates, reusable evidence and its identity, estimated duration (or unknown), escalation triggers and stop condition. This is not an additional approval step. | Changed boundary | During work | Integrated acceptance | |---|---|---| | Prose/instructions | Inspect links, parameters, consistency | No Unity tests/builds by default; documentation checks only if export/executable docs changed | | Pure rules | Relevant fixture | Full EditMode; affected native contracts if rules drive runtime behavior | | Pack contact/navigation/actions | Relevant rules and actual actor/native fixtures | Relevant full suites once; affected two/four-player combat and lifecycle checks | | Receipts/observer/export/capture | Scope/isolation/serialization/capture fixtures | Affected native cases and representative actual export/render; escalate if production timing, visibility or lifecycle changes | | Owner movement/authority/session | Clock/credit/input/lifecycle regressions | Full relevant suites; matching two/four-owner and warp/lifecycle checks; affected normal-stage progression | | PowerShell launcher/reporting | Controlled arguments, classification, cleanup, parser checks | Representative affected real cohorts; progression matrix only when its path changed | | Runtime/development compilation/debug assets | Relevant source checks | Necessary normal/debug/release builds and release exclusion | | Natural arrivals | Retained artifact qualification first | Resume only eligible unfinished cells when needed and authorized; preserve cumulative budget | Select by the actual boundary, not a task label. A navigation change can affect movement, authority and damage. Record omissions with reasons; a focused pass does not close omitted gates. Freeze integrated source, run broad checks once, then repeat only checks invalidated by fixes/new evidence. Stop once agreed checks pass. Do not change deadlines, assertions or geometry to obtain a pass. Examples: a documentation typo needs link/prose inspection; a pack-navigation fix needs relevant pure/native fixtures then integrated pack and affected two/four-player lifecycle proof; a remote movement-credit fix requires broader authority, owner, warp and affected stage regression. Neither the typo nor a timing-only sidecar automatically requires three player builds. ## Editor prerequisites and execution Verify connected project, pinned version from `ProjectSettings/ProjectVersion.txt`, stopped/playing state, import/compile readiness and Console errors. Current pins: Unity 6000.6.4f1 and Test Framework 1.8.0 (read manifest/version files again before execution). Use supported Unity CLI/MCP operations; C# below belongs inside an Editor command, not PowerShell. Never launch a second Editor against an already-open project to run tests. Only one test/discovery/build operation at a time in the shared Editor. Coordinate exclusive ownership with other agents and the manual Test Runner. Do not cancel unrelated jobs or clear a lease merely because a caller timed out. Preserve the active scene/unsaved authoring and restore owned settings after verification. Assemblies are exactly `ProjectI.Foundation.EditModeTests` and `ProjectI.Foundation.PlayModeTests`. Full entry points retain full-assembly meaning: ```csharp ProjectI.Editor.FoundationTestRunner.RunEditMode("task-integrated-editmode"); // Run only AFTER the previous request has finalized: ProjectI.Editor.FoundationTestRunner.RunPlayMode("task-integrated-playmode"); ``` Existing focused entry points accept discovered exact fixture or method names: ```csharp ProjectI.Editor.FoundationTestRunner.RunEditModeFiltered( "movement-focused", "ProjectI.Tests.ReceivedMovementBudgetTests"); ProjectI.Editor.FoundationTestRunner.RunPlayModeFiltered( "navigation-focused", "ProjectI.Tests.EnemyPackNavigationPlayModeTests"); ``` Use exact multi-fixture selection for predictable native scope: ```csharp ProjectI.Editor.FoundationTestRunner.RunFixtures("pack-focused", UnityEditor.TestTools.TestRunner.Api.TestMode.PlayMode, new[] { "ProjectI.Tests.EnemyPackNavigationPlayModeTests", "ProjectI.Tests.EnemyCoverGraceTests" }); ``` Never guess NUnit filter expressions or assume a typo means a full run. Fixture requests must identify actual discovered fixture types; namespaces/method prefixes are rejected. A skipped, missing, duplicate, zero-case or wrong-mode result is not GREEN. Deliberate RED remains labelled failed evidence; documented historical skips remain skips. `Integration.Arena` identifies the expensive all-scenario arena fixture; it remains included in full PlayMode. Feature categories aid discovery, while exact `RunFixtures` selections avoid category/filter ambiguity. No assembly split or shared cross-fixture session is introduced. ## Reports and identity New runner requests use unique `TestResults` directories with request identity, XML/text and final JSON. Read the manifest's validation/status, requested/discovered/executed leaves, mode/assembly and failures before trusting counts. A finished operation can still produce invalid evidence. Legacy `TestResults/