# Spawn director and coordination implementation plan ## S4 execution packet — 16 October 2026 - Authorized scope: S4 only, with human playtesting **End**. Lead is sole writer; independent technical/Ponytail, gameplay and design/UX pre-reviews (Sol 6.1 Medium) clear the bounded approach and require mode-aware diagnostics, locally latched peer cues and explicit lifecycle proof. High risk because the new harness exercises session/actor lifetime and shared-state ownership. No production activation, C1–C3, roster restoration or Natural campaign. - Intent/hypothesis: matching independent players see the same paid mixed staggered arrivals before action readiness; kills, resets, boss transitions and disconnects cannot duplicate admissions, refund deaths or revive stale work. A missing remote cue, mismatch, unexpected birth/refund, stale generation or leaked owned process falsifies the gate. - Approach/files: reuse existing DebugTestArena geometry, registered passive prefabs and real session/bootstrap; construct owned in-memory controlled definitions, without modifying user tuning or saved scenes. Add development-only `EnemyDirectorPeerScenario.cs`, `Tools/Test-EnemyDirector.ps1`, focused scenario/probe/harness checks, mode-aware `DevelopmentSessionProbe` diagnostics; update catalogue/current brief and this record. Existing S2/S3 shooter sandbox supplies the End human checkpoint. No dependency changes. - Proof/sequence: preserve baseline and initial empty index; meaningful focused RED/GREEN, native scenario scope, deliberately failed real harness before positive cohorts; freeze source/assets/profile identity; exact-discovered full EditMode/PlayMode, normal/debug/release builds/exclusion audits, independent 2/4-player paid-arrival/accounting/boss/reset/disconnect/host-loss cohorts with actual applied 75/15/1 simulation and cue captures, affected normal/menu/progression gates. Measure warmed accounting/scheduler and diagnostic allocations versus settled ledger history. Reuse only explicitly compatible unchanged evidence; retain failed artifacts and primary/cleanup errors. - Constraints/rulings: existing `EncounterSnapshot.Alive` includes the boss; label that honestly and export nonboss live separately only from authoritative ledger. No wire-schema expansion is needed. New scenario remains inert without explicit launch flags and excluded from Release. The separate-process fixture uses existing registered assets rather than the one-process M5B harness. S3 gameplay acceptance remains open and will be included explicitly in the End questions. - Duration unknown until discovery/build/cohort measurements. Escalate authority, identity, geometry, session cleanup or measured unbounded-cost concerns; preserve manual terrain/navigation and pre-existing dirty authoring/plans/research. Stop after required automated proof, reviews and scoped local checkpoint commit, then present human End review; keep `M6-SPAWNING-READY` unchecked pending that acceptance. No push. ### S4 implementation checkpoint and retained failures Evidence root: `TestResults/spawn-s4-f70d03ebaf194f4dacf921765383190d/`; baseline HEAD `80f7fa8`. Initial index empty. Saved original dirty/untracked bytes and patch; concurrent outside-task Wiki edits remain outside ownership. Lead sole writer; operator Sol 6.1 Medium owns serialized Editor/build/player execution only when explicitly handed over. Focused contract RED `spawn-s4-contract-red-d3f632d81d524f91899e8dcb76b77975-eb0ca68e7b1541fd9d54406ef0faccb4` failed the three missing diagnostics/scenario cases as intended. An early GREEN request was invalidated during discovery by compilation/import (`1d796bf820e24ca6a04702e95e13adbf`); no executed cases or pass is claimed. Corrected GREEN `spawn-s4-contract-green-c8604d3620ed464a8796f373c7aa9f36-d6836a84859a41248a8bb68e599e725a` passed 3/3 with matched terminal. The operator also reran these exact contracts after the movement/reset repairs and observed 3/3; final integrated attribution remains separate. Independent post-source technical/Ponytail, gameplay and design/UX reviews required and received concrete corrections: coherent pair-purchase/cap arithmetic; separate prepare/peer epoch/start; valid client-definition refusal and cumulative authority sampling; executable acceptance-helper hash; original-deadline replacement observation; actual reset-owned invalidation; moving/split participant revalidation; every purchased member's native safety/damageability; cancelled pending slots, retained survivor HP/deadlines and stable all-peer hostile cleanup. Source design review cleared the diagnostic distinction and unchanged ordinary HUD. Actual PNG and final evidence review remain pending. Directed camera captures can establish rendering, never normal rear noticeability or feel. Preliminary debug build `f3d48923198e4aa7a49438bfd634494a` completed natively in 137.527 s, source before/after `82656C4850D68340DCA4C7FF36C62C4F8B65F795B85E7D04F27BD005F25C08B1`. Its caller timed out at 120 s, producing the report's one error (Pipeline main-thread timeout) and 650 warnings; native success/idle terminal/report identity were subsequently confirmed. This qualified checkpoint is not a zero-error final build. An earlier eval typo referenced nonexistent `S4BuildDummy`; dynamic eval rejected compilation before any build statements, and its error is retained. Future builds use a longer supported timeout, without launching duplicates. The first deliberate cohort `TestResults/enemy-director-299cb089c43e4119bc4351d784adfdc3/` failed the required intentional-error assertion: host command was still unconsumed, while a client had completed another command. Cleanup errors were empty, all owned processes exited and identity recheck passed. Root cause: PowerShell dynamic scope let `Wait-State`'s `$item` loop shadow the commanded peer captured by its predicate. A controlled test executes the launcher's actual AST function with host-unacknowledged/client-acknowledged states: RED reproduced the false host acknowledgement, GREEN passed after giving the monitored loop a distinct local name. Earlier cohort remains failed launcher evidence; no positive proof is inferred. Corrected deliberate/positive cohorts, ledger measurement, broad final suites/builds and End human acceptance remain open. Corrected deliberate cohort `enemy-director-a308aecea75a406a8105244d018bd0a3` produced the exact `S4 deliberate failure proof`, passed seven checks, deliberately exited nonzero and confirmed owned-process cleanup/identity. The following positive cohort `enemy-director-80ba154a8d264de3bf157ca76dff7be6` failed its first cue comparison: the client's estimated server clock put its cue 6.625 ms before authoritative birth despite enabled cue state. Both retained 1280×720 screen PNGs were black. All owned processes exited; no assertions/deadlines or arrival tuning were relaxed. Those artifacts remain failed evidence. Technical pre/post review cleared the demonstrated evidence repair: a supported [camera-stack render request](https://docs.unity3d.com/ja/current/ScriptReference/Rendering.RenderPipeline.StandardRequest.html) renders the actual existing peer camera into an owned texture, writes PNG synchronously, restores camera/render state and rejects uniform output. Each peer then publishes an immutable atomic cue note in the unique same-machine cohort directory. The host validates connected peer, shared epoch and exact native identity before recording its own authoritative receipt time; every required birth/peer must have positive lead before the original ready deadline. Estimated client timestamps remain diagnostics. Camera-only captures omit ordinary HUD/rear noticeability/feel acceptance; later uncaptured births prove enabled cues/receipts only. Opt-in bounded Console error retention was added. New receipt contracts accept the valid early estimated clock but reject missing/duplicate/foreign/late authoritative receipts. Historical ledger investigation: `ledger-measurement.json` records warmed nine-by-32 accounting, full admission materialization and real scheduler purchase/expiry pairs at 0/100/1,000/4,000 settled one-member histories with no live actors. At 4,000, median accounting 4.375 ms, diagnostic materialization 5.013 ms and scheduler pair 6.590 ms (actual scheduler history 4,016→4,304); at 1,000, 0.601/0.499/1.733 ms respectively. These are Editor Mono observations, not frame/hardware acceptance. `allocation-calibration.json` returned zero for a known 1 MiB allocation: the allocation counter is **unavailable**; raw zero fields do not prove zero allocation. Technical review found no S4 blocker within the bounded opt-in scope and no accepted numeric ledger budget justifying a new state refactor. Before M15 production promotion, qualify representative long-duration/boss history, establish a budget and optimize if needed. The harness's 128-birth ceiling never bounds production history. The first render-repair build failed six Editor/player report-layout checks. Inspection confirmed loaded Editor fields/assembly were stale despite idle flags (Foundation DLL 13:37 UTC versus changed source 13:57 UTC). Supported `CompilationPipeline.RequestScriptCompilation(CleanBuildCache)` rebuilt/reloaded the actual new layout; no manual cache deletion, package upgrade, scene replacement or navigation bake. Readiness now checks actual fields, assembly MVID and file freshness as well as idle flags. Corrected debug build `3de194592511424c87ea646524cde1ae` succeeded with zero errors, 151 warnings, 112.381 s, unchanged before/after source `4AE3F23D975A63D80ED5D8B712AA321FADC7C7E37B58B3F3F8B3D2E820C35C41`. Fresh deliberate `enemy-director-fcfacf4912154a4796390bc45c444601` passed the expected failure/cleanup gate. Positive cohort `enemy-director-19fc48ae4fa546d7a2b031f531959a81` produced actual nonblack host/client camera PNGs. Lead and independent design/UX inspected both: real arena/weapon and a small distant bright arrival bracket are visible. This is bounded two-process rendering clearance only; rear/natural noticeability, HUD composition and human acceptance remain open. The cohort failed on a Windows receipt read-sharing conflict; full cleanup/identity passed. A controlled locked-file regression RED `spawn-s4-receipt-red-22a5a60070dc4c648c59b416af1e6ada-0e5fe9bae2c54bd2bcb7bbee022a7379` passed three prior cases and failed the missing safe reader. The repair treats only I/O publication conflicts as unreadable, retaining their messages and allowing later reads within the unchanged qualification deadline; malformed/foreign identity or late/missing evidence still fails. Closed-ledger reset now respects idempotence, and receipt observation is gated to the exact active ledger/controller epoch so rehosted peers cannot inherit old-birth obligations. Corrected four-case GREEN and rebuilt cohorts remain pending at this checkpoint. ## Director debug-screen follow-up — 15 October 2026 - Intent: inspect arrival and boss director spending while playing, with the same information in an Editor debug window. User selected **Both** and **ASAP** human review. Existing sandbox/ledger/scheduler flows make this a bounded observational UI change. Hypothesis: bank, saving target, future purchase opportunity and actual recent births explain pacing without advancing state, consuming RNG, changing credits or claiming a guaranteed birth time. A capture that changes decisions or logs an uncommitted/cancelled enemy contradicts it. - Scope: development-only read-only bank/profile/phase, captured saving target/cost/expiry, next purchase attempt plus pending-member timing, and a bounded newest-first actual birth history with exact single/template/procedural provenance (boss entry labelled separately). Shared text/view for a compact noninteractive in-game UI Toolkit overlay and dedicated Editor window. F6/Editor toggle only affects display. Reset/switch/stop must clear the current owner view; old-profile births may remain as labelled history within that encounter. - Ownership/risk: medium presentation/diagnostics with understood existing lifetime contracts; lead sole writer. Independent technical/Ponytail and design/UX pre/post reviews (Sol 6.1 Medium) selected. Separate gameplay reviewer adds little while all scheduling, authority, health/rewards, serialization and production activation remain unchanged; escalate if that boundary changes. - Files: diagnostic-only purchase provenance/birth history at verified native commit in ledger; development-only scheduler deadline getter; fixture diagnostics/view and driver overlay lifecycle; Editor debug window/launcher; meaningful EditMode observation/provenance/history tests and native fixture reset/phase/purity/actual-birth tests; brief/catalogue. Do not change existing tuning, saved scenes/navigation, pins or S4 campaign/milestone state. - Proof: RED/GREEN focused diagnostics, actual pure-capture invariance (bank/RNG/deadlines/admissions/identities), native committed-only history and reset/switch/terminal UI. Render both views at a safe checkpoint and offer ASAP review before dependent closure. After review/freeze, full EditMode and affected native fixtures plus required build/exclusion audit; reuse S3 normal packaged proof only for demonstrably unchanged inactive paths with original identities. No new Natural/S4 campaign. Duration initially unknown; stop after requested diagnostics and scoped local closure, no push. Human approval at ASAP remains pending. - Baseline: HEAD `f14ff375a2427fbbe79fc3c2f5ced8f112263cb9`, initial index empty; preserve all earlier dirty authoring/custom-template/planning/research files. Unique ignored baseline/evidence root recorded by the lead. S3 End acceptance remains separate and unclosed by this follow-up. ### Debug follow-up — early checkpoint evidence Baseline and primary artifacts: `TestResults/director-debug-1792061953280/` (original dirty/untracked bytes plus `preexisting.patch`). Pre-review technical/Ponytail and design/UX independently cleared the bounded approach. Post-review technical cleared capture purity, native-commit-only records, lifecycle gates and conditional release guards; design cleared source and the actual populated runtime capture, with narrow/short layouts, long saving-target wrapping and actual Editor rendering still awaiting human review. Reviewers were read-only Sol 6.1 Medium; the lead remained sole writer. Focused deliberate RED `director-debug-red-cdbd85f124ad498f8e7466e256544f4e` retained seven expected missing-diagnostics failures. Focused GREEN `director-debug-green-8822c0293422497697c036e6b54fd378` passed 7/7 with no failures/skips. The native checkpoint union `director-debug-native-checkpoint-aa3225f4adaa4dcebcf8b99106217ba3` passed 54/55: the new test restricted its copied card pool but retained incompatible templates, correctly rejected by snapshot validation. Only the runtime test clone was corrected (`templateIds` empty); authored tuning and validation were preserved. Corrected exact native case `director-debug-native-corrected-736a505347334d5ca8e25594c9cac3b3` passed 1/1 with matched terminal, no failures/skips/conflict, source `71804E5FC3660B2DD5175BBE5F32F763A41BB21ABB61C48C5DEC2375813D8D61`. These are development checkpoint checks, not final integrated evidence. ASAP checkpoint: actual Game-view capture `TestResults/director-debug-1792061953280/checkpoint-game.png` (1479×829 output, screen source; no native narrow-layout claim). The pinned 6000.6 Editor lacks the newer UI-element screenshot APIs, so actual Editor-window inspection is offered directly in Unity; native test assertions check its labels/toggle/refresh without replacing human visual acceptance. The arrival fixture and both views are open for user review; no final tests/builds run during manual preview ownership. User chose **“Needs layout or wording changes”**; concrete feedback was requested and remains pending. Final freeze/integration/build/exclusion checks, local commit and human acceptance remain open. No S4 campaign, production activation, later milestone or S3 sign-off is implied. User's concrete ASAP revision: group the in-game history by pack, e.g. `3× Ranged Drone, 1× Ranged Drone [Elite]`, retaining mode/template and original profile. Editor individual history remains unchanged. Group counts include only native committed members (even dead), exclude unborn/cancelled slots, and remain complete when older individual records leave the bounded queue. A development-only immutable record reference on each existing slot avoids a second mutable group ledger. Technical/Ponytail delta review cleared this source approach. New controlled grouped-history RED `director-debug-groups-red-8e8a8e9bfca04519bd6d93a473715588` failed for the missing GroupHistory property; GREEN `director-debug-groups-green-84dc4ea55add42acaed7e52a802dd685` passed all eight diagnostics, source `226E475171A3853A9343E96DF078E18C1DCC85DA1B7EC4B649B06C67C53EB7AF`. Native overlay/reset/switch delta `director-debug-groups-native-89585d7eaba343679cbb7c715611224f` passed 1/1. Revised rendered/human acceptance and final gates remain pending. Revised actual screen capture `TestResults/director-debug-1792061953280/checkpoint-groups.png` contains the requested mixed pack `3× Ranged Drone, 1× Ranged Drone [Elite]`. Independent design/UX visual delta cleared readable counts, separate admission groups, newest-first order, summary, wrapped footer and HUD separation at this captured layout. Narrow/short layouts, long saving/template wrapping and actual Editor rendering remain unverified. The revised preview was presented to the user for ASAP feedback; final verification/local closure pauses while that response is pending, with manual preview ownership retained by the user. No automatic acceptance is inferred. ### Debug follow-up — final accepted checkpoint **Decision: keep.** The user answered **“Yes — continue final checks”** after inspecting the revised grouped preview. This accepts the requested debug grouping at the offered ASAP checkpoint; it does not sign off S3 gameplay/balance, narrower layouts, long saving/template text, hardware or separate-network play. Technical/Ponytail and design/UX pre/post reviews and the affected grouping/render delta reviews cleared with no remaining blockers. Technical final scope review also cleared explicit reuse of unchanged S3 packaged paths. Owned files: `EnemyAdmissionLedger.cs` and new `EnemyAdmissionLedger.Diagnostics.cs` (conditional immutable birth metadata and native-only history), `EnemySpawnScheduler.cs` (development-only read deadline), `EnemyBehaviorScenarioDriver.cs` (current-owner capture, F6 display and cleanup), new `EnemyDirectorDebugView.cs` / `EnemyDirectorDebugPanel.cs`, new `EnemyDirectorDebugWindow.cs` and sandbox launch link, new `EnemyDirectorDiagnosticTests.cs`, affected `EnemyBehaviorScenarioTests.cs` / `EnemyDirectorBossLifecycleTests.cs`, brief/catalogue and Editor-created new-script metas. No prefab, saved scene, NavMesh, dependency or production activation changes. Frozen final working-tree source: `7908CEFF56D286448B7F88FD706C9E08271FA45866C869418113CD8A1FE979DA`. It includes preserved existing authoring; the scoped commit does not capture those outside-task files. Initial seven pre-existing authoring/research/old-plan files remain byte-identical to the baseline. During the manual checkpoint the boss definition was additionally tuned from add admission limit 6 to 12; this saved change is included in the final tested identity and preserved outside the debug commit (`final/user-tuned-boss-director.asset`). It remains editable user tuning, not new balance acceptance. This pre-existing untracked companion is maintained locally and excluded from staging. | Fresh final evidence | Actual result | |---|---| | Full EditMode | `TestResults/foundation-runs/director-debug-final-editmode-77ee1f55e6a5475c96c7b1e22c726695/`: 1,242 exact unique expected/discovered/executed passes, zero fail/skip/inconclusive/conflict, matched terminal, one genuine reload; execution 54.606 s, compiled `B6845B1646E677D8FB6FD1A3F5E9D1332F1C268B943462F6DEFD20A54180B69A`. | | Affected native union | `TestResults/foundation-runs/director-debug-final-native-fb5e5a89289842bcaa8c6a16ee1c327d/`: 55 exact unique passes (boss lifecycle 10, scenario 21, admission 11, arrival 12, passive lifecycle 1), zero fail/skip/inconclusive/conflict, matched terminal; execution 111.960 s, compiled `F3A2E960C3A3BED74CE6992D8B4D9C376E882FDFDD5292A3499B01AFDC7CF750`. | | Normal / Debug / Release builds | All succeeded with zero errors at the frozen source and unchanged settings. GUIDs `59f5279fffa34be5a1fef4a779f64931` / `64e90758360c4505ace4f0887f83b233` / `a3c6a5f2045f432fa3dcee68505ca409`; elapsed 102.347 / 21.894 / 60.815 s; warning counts 649 / 640 / 919 retained. Reports, packed inventories and whole executable/managed/data fingerprints under `TestResults/director-debug-1792061953280/final/`. | | Exclusion and cleanup | `build-audit.json` / `diagnostic-audit.json` prove fixture assets excluded in every build, Editor tooling excluded, and new UI/history/ledger metadata/slot native record/scheduler getter plus existing arrival diagnostics absent from Release. No packaged players were launched; application build ID is unavailable, with detailed native GUID/report and complete build fingerprints retained instead. `final-state.json`: same frozen source, stopped/compiled/imported/idle, no manual/request lease, clean PlayTestScene, options restored true/3, no driver, zero Console errors. | Operator Sol 6.1 Medium held exclusive Editor execution ownership and handed it back after terminal cleanup. Lead independently validated XML/manifest/discovery sets and build summaries (`lead-editmode-validation.json`, `lead-native-validation.json`, `lead-build-validation.json`). Aggregate `verification-manifest.json` and `lead-historical-reuse.json` retain exact provenance and limits. Whole-batch monotonic elapsed was not measured; individual durations are not summed into a wall-clock claim. An initial CLI transport error/ambiguous preview return started no owned test request; exact invocation and snapshots are retained in `operator-attempt.json`, `operator-interrupted-state.json` and `operator-sandbox-state.json`. Only the confirmed opt-in sandbox was stopped, no test job was cancelled, and `restored-after-preview.json` established a new safe stopped state before the successful run. Its cause remains unproven. **Historical reuse, not fresh execution:** unchanged inactive production/session/combat/progression paths reuse S3's 15 October source `10930982D9594DD0F528AE57CFE9433B2B66E92FBC8A0324EA31C3043D79E052` and original aggregate/build attribution in `TestResults/spawn-s3-1792056010292/final/`. Debug two/four lifecycle `a4f32c15bbdb4d9d946d3c009392fc86` / `3d11e04c10034b2ba9dde8a3d3c4db56`, MainMenu `e61aaa64c79a4851bee85ca046e29853`, Verdant progression `3359a2d5526d4c1087e53767334c2329`. Only conditional observations and opt-in UI changed here; authority/network protocol, health/rewards, session/progression and production activation did not. These original builds do not prove the new UI or execution of the current builds. No new S4/Natural campaign or campaign budget was spent. Access: **ProjectI > Debug > Enemy AI > Director debug**, or the Shooter sandbox link, with S2/S3 launch buttons; F6 toggles the in-game display. Runtime shows up to six groups represented by the latest twelve individual births, with complete actual-born counts for each represented group; Editor keeps the twelve individual rows. Partial groups grow as members are born; cancelled unborn members never appear. Narrow/short layouts, long saving/template wrapping and captured actual Editor rendering remain limited as recorded above. No new gameplay acceptance or later milestone is checked; M6-SPAWNING-READY, S4 and C1–C3 remain open. Stop after scoped local closure, no push. **Debug follow-up local closure:** `2a40e43a7afdef4ef84070c8f270e49565df5f49` — `Add arrival and boss director debug views` (18 owned files). Final technical/Ponytail staged review cleared exact scope and evidence; lead inspected the staged diff/whitespace and preserved outside-task changes. No push or amend. Index is empty after closure; the user-authored director tuning, earlier plan/research and this locally updated companion remain uncommitted. Stop after this debug follow-up; no S3 sign-off, S4 or later milestone is inferred. ## S3 execution packet — 15 October 2026 - Intent: retain readable, damageable arrivals and surviving enemies while the boss encounter replaces exploration with a slower independently authored reinforcement stream. Hypothesis: the phase boundary preserves actor identity/health/deadlines, discards exploration finances/work, and allows no boss-add credit or purchases until one safely placed living boss exists. Any overlapping stream, retry income, duplicate boss or survivor deletion contradicts it. - Scope: S3 only: closed boss-phase state, trusted singleton admission, native placement, boss-profile activation and terminal lifecycle cleanup. Preserve 40-kill entry, rewards/checkpoints, passive boss capabilities, authored terrain/navigation, production defaults and dependency pins. No S4 campaign/activation, boss attacks, splitting or coordination. - Ownership/risk: high (authority/lifecycle/progression). Lead is sole writer; fresh independent technical, gameplay and design/UX pre/post reviewers use Sol 6.1 Medium under canonical policy. Technical post-review includes Ponytail completeness/simplicity. - Files/interfaces: encounter director credit-spawning and cleanup, ledger/scheduler transition seams, encounter snapshot if needed, exact boss rules/native lifecycle tests, opt-in boss fixture authoring/driver, relevant brief/catalogue. Prefer new owned fixture assets over changing user's tuning. - Baseline: HEAD `456eb24e0f5ac6c5d4727a27109794c248ca3e4d`; initial index empty. Initial dirty/untracked authoring, parent plan and research preserved under `TestResults/spawn-s3-1792056010292/baseline/` plus `preexisting.patch`. Companion remains locally edited/untracked and excluded from commit. - Proof: RED/GREEN focused boss rules; discovered native boss lifecycle/admission/arrival cases including survivors/overflow, blocked placement, singleton retry, activation deadline, add death and reset/stage/session cleanup. Freeze integrated source before full EditMode, affected native cohorts, normal/debug/release builds and exclusion audits, and required packaged lifecycle/normal progression checks. Select exact discovered fixtures under TESTING/catalogue; reuse only demonstrably compatible proof with original identities. Do not infer multiplayer/human acceptance from reviews. - Human review timing: user supplied **End** for S3; final playable opt-in checkpoint and concrete questions remain required. Duration unknown until discovery/build/runtime costs are measured. Escalate authority/identity leakage, accounting/progression conflicts, required terrain changes or material scope expansion. Stop after S3-owned scoped local commit, no push; keep S4/C1–C3 and M6-SPAWNING-READY unchecked. - Result/decision: implementation, independent reviews and all selected final automated gates passed. **Keep for further testing; End human acceptance remains pending.** Provisional boss tuning 3 credits/s, ceiling 60, initial 0, interval 8 s, add limit 6 remains editable starting values, not accepted balance. Stop after scoped S3 local closure; no production promotion or S4 work. S3 pre-review: `s3_technical_pre`, `s3_gameplay_pre`, `s3_design_pre` independently recommended proceeding (Sol 6.1 Medium, read-only). Required seams were scheduler retirement without ledger closure, ledger-enforced deferred finance, narrow Large boss placement, terminal/nonlethal-despawn distinction, and clear passive-boss fixture status. New BossFixture assets preserve existing S1/S2 tuning/custom templates; exploration explicitly starts at the S2 playtest values 4.5 income / 5 initial / 6 s interval, single mode. Boss tuning remains provisional and independently editable. Focused development evidence (not final): deliberate RED `spawn-s3-boss-red-2ccabb2df19740a580e26aa1e581c70d` retained two fixture-input defects (same archetype despite different roles, and invalid zero-income saving). Corrected RED `spawn-s3-boss-red-corrected-5232aafaf8474f43b30b7a633cbad4b5` retained missing transition failures plus an unreachable saving input. First GREEN attempt `spawn-s3-rules-green-0010debc91984fa8b8b97e4721f54544` was 3/5; fixed controlled ceiling/time inputs. Exact boss/ledger/scheduler union `spawn-s3-rules-focused-ff14191cb8e94518be9dffe91fd036a8` passed 26, zero fails/skips. Native RED `spawn-s3-native-red-4244faf215b74f79ac2870eb0156dbf0` and first native attempt `spawn-s3-native-green-91af3bbd876343078e7560c280e5a583` each passed 1/4: the saved passive PlayTestScene deliberately has a 10,000-kill goal. Director fixture activation now explicitly exercises the accepted 40-kill rule without editing the saved scene; the practice auto-reset owner also yields to an active credit director. No failure report is relabelled GREEN. S3 verification handoff: final frozen source `10930982D9594DD0F528AE57CFE9433B2B66E92FBC8A0324EA31C3043D79E052`, idle compiled clean PlayTestScene, options true/3 (`TestResults/spawn-s3-1792056010292/frozen-state.json`). Three post-review perspectives cleared after the reproduced S2-goal regression and compact delta checks. The exact boss/sandbox native union passed 30 (`spawn-s3-review-green-8a8d58bab78944599924f649c39a7c08`, 75.382 s); the paid-add terminal case was subsequently strengthened to retain a living arriving add and one unborn member and requires final rerun. Final selected gates: full EditMode with genuine reload; exact native union BossLifecycle, EnemyBehaviorScenario, EnemyDirectorAdmission, EnemyArrival, PassiveEnemyLifecycle; normal/debug/release builds with source/packed-assets/managed release audits; fresh packaged DebugArena two/four players with two resets/failure proof/lifecycle, then MainMenu and VerdantInitial progression after owned cleanup. Do not reuse older build proof for these changed cleanup/phase paths. Operator has exclusive execution ownership; lead accepts manifests and final cleanup. End human play remains pending. Estimated integrated cost 10–20 minutes based on retained build/progression costs; no deadline/assertion changes or automatic rerolls. ### S3 integrated evidence and limits **Owned files:** `PrototypeEncounterDirector.BossSpawning.cs` and meta; credit-spawning/director lifecycle partials; `EnemyAdmissionLedger.cs`, `EnemySpawnScheduler.cs`, `EncounterSnapshot.cs`; `PlaytestSceneController.cs`; `EnemyDirectorFixtureAuthoring.cs`, `EnemyBehaviorScenarioDriver.cs`, `EnemyBehaviorSandboxWindow.cs`; new `EnemyDirectorBossRulesTests.cs` / `EnemyDirectorBossLifecycleTests.cs` and metas; extended `EnemyBehaviorScenarioTests.cs`; new `Debug/EnemyBehavior/SpawnDirector/BossFixture/` definition/folder metas; current brief and test catalogue. The 21-path owned manifest is `TestResults/spawn-s3-1792056010292/owned-paths.json`. Existing planning/research/user assets remain outside commit scope. **Behavior:** one retained ledger owns both generations. Exploration retirement clears its scheduler intent/placement; profile transition cancels unadmitted slots without refund and discards the bank. Deferred boss funds are guarded inside the ledger. One trusted unpriced boss retries within the authored 15 m region with supporting ground, Large mesh, capsule/envelope, living-player separation and a complete native route. Its successful exact live commit grants the new balance once and starts a future purchase deadline. Every nonboss survivor/child/pending slot counts against the boss-add limit; exceeding six blocks additions and preserves actors. Real boss death closes work before run reward/checkpoint callbacks. Defeat/reset/stage/transport shutdown/nonlethal retirement cannot synthesize a boss kill. Snapshot's awaiting-entry helper uses existing fields; wire layout/protocol and dependency pins are unchanged. **Bindings/tuning:** the new definition references existing tracked melee/shooter prefabs, the opt-in shooter registry and two tracked S2 mixed templates. No custom untracked template dependency is introduced. Exploration starts explicitly at 4.5 credits/s, initial 5, interval 6 s, single mode; boss adds start at 3/60/0/8/6 with independently editable card/template/mode/saving inputs, 0.4 s stagger, 20 s pending lifetime and 1.25 s arrival. Both Pulse Warden and Siege Warden remain passive roster assets (null behavior and boss ability), using Large agent `-1372625422` and 0.9 m / 3.3 m native geometry. Seed-7 S3 native fixtures actually select Siege Warden; source inspection of Pulse bindings is not a fresh Pulse birth claim. The accepted isolated shooter is the active capability used for manual adds; passive melee/boss assets do not restore their abilities. **Reviews:** independent technical/Ponytail, gameplay and design pre/post reviews (`s3_*_pre`, `s3_*_post`, Sol 6.1 Medium) cleared after compact delta checks. Post-review found and reproduced the unconditional 40-kill S2 regression (`spawn-s3-review-red-d57001b8357d4465be84748b6f41ab30`, 0/1). Only boss-capable fixtures now use 40; S2 keeps authored practice tuning and restores its boss position after switching. Review also required an actual paid boss-add birth/death/terminal case; final native proof includes a replicated paid three-member purchase, legitimate add reward without refund/progression, and boss death with a living arriving add plus an unborn pending member. | Fresh final check | Actual evidence | |---|---| | Full EditMode | `TestResults/foundation-runs/spawn-s3-final-editmode-71e22612d9a0451081633bfdae19dc38/`: 1,234 unique expected/executed passes, zero fails/skips/conflicts, matched terminal, genuine reload 1, execution 68.577 s; compiled `908C2AFF83C0CEC3CECAC3A99C80A1975726EAC68D4467E264B59553EB701C19`. | | Exact native union | `TestResults/foundation-runs/spawn-s3-final-native-e05603f7ef28421a8a26a2be08c0301a/`: 54 unique expected/executed passes (boss 10, scenario 20, admission 11, arrival 12, passive lifecycle 1), zero fails/skips/conflicts, matched terminal, execution 112.083 s; compiled `23DF6B706594083C315CEB3FB019AAD6B20796F271669B10DE39D45396F8496D`. | | Normal / Debug / Release builds | Fresh source `10930982D9594DD0F528AE57CFE9433B2B66E92FBC8A0324EA31C3043D79E052`; summaries/reports/packed inventories under `TestResults/spawn-s3-1792056010292/final/{Normal,Debug,Release}/`. All succeeded with zero errors and unchanged source/settings. GUIDs `8e76f2c581364b73a73af9ca14801465` / `ab89f72ed85d430baa1421f2ffc51cbb` / `c6461ae14c0d435cbd7ab1c69b4c0c6c`; elapsed 80.537 / 21.170 / 58.417 s. Audits passed; packaged outcomes follow below. | Lead independently compared XML leaf sets and manifest identity in `lead-editmode-validation.json` / `lead-native-validation.json`, and all build summaries in `lead-build-validation.json` under the S3 evidence root. Original preflight's Console field mislabelled six log entries as errors; `final/console-count-correction.json` retains the signature-based correction (zero errors, 40 warnings, six logs). No logs or failed evidence were cleared. All selected final gates passed; the operator returned exclusive ownership after confirmed cleanup. **Acceptance/stop:** End human play, representative hardware, separate-network and S4's independent-process purchased-group/boss campaign remain open. Local native NGO peers and fresh normal packaged regressions have different scopes. Boss attacks stay M14, hidden retirement stays M7, splitting and C1–C3 coordination are untouched. Production remains passive. Keep for further testing pending End human acceptance; do not promote M6-SPAWNING-READY or start S4 through this checkpoint. ### S3 final closure — automated checkpoint **Scoped local commit:** `f14ff375a2427fbbe79fc3c2f5ced8f112263cb9` — `Add boss-phase reinforcements and lifecycle cleanup` (21 S3-owned files). Final technical/Ponytail commit-readiness review cleared staged scope/evidence and retained all pending acceptance limits. No push or amend. Source-owned working/index changes are closed; pre-existing dirty/untracked files and this locally updated untracked companion remain outside the commit. Only S3's five evidence-supported items are checked; S4, M6-SPAWNING-READY and every later milestone remain open. Stop here pending End human review. Lead final acceptance is retained in `TestResults/spawn-s3-1792056010292/lead-final-acceptance.json`. The Verdant result reports seven transient JSON-read retries while the probe rewrote snapshots in place. The existing bounded `Read-Report` policy retries incomplete reads only; all 23 phase predicates and final results passed. These retries are retained, not classified as failed gameplay assertions or silently erased. All selected final gates passed at the frozen source above. Aggregate `TestResults/spawn-s3-1792056010292/final/aggregate.json` retains exact fresh identities; `build-audit.json` proves SpawnDirector fixture assets absent in every build and executable fixture/Editor content absent from Release. Lead accepted test XML/manifests and three audits independently; no historical proof was reused for final S3 gates. | Fresh packaged check | Actual outcome | |---|---| | Debug two players | `TestResults/debug-arena-a4f32c15bbdb4d9d946d3c009392fc86/`: five scenario reports, three lifecycle records, reset 2, controlled failure proof, 75 ms / 15 ms / 1%, 42.387 s; matching Debug build, zero cleanup errors. | | Debug four players | Initial `debug-arena-8acf83aa1c6a4a92897c49602fa7b4b7/` failed cohort readiness at its unchanged 60 s ceiling. Client2 was joining with no players/server clock and initialized transport near 58.734 s; cause remains unresolved service/transport/setup, not a proven outage or S3 assertion failure. After confirmed owned exit, one authorized fresh session/Relay allocation/profile retry `debug-arena-3d11e04c10034b2ba9dde8a3d3c4db56/` passed five scenario reports / three lifecycle records, reset 2/failure proof, same simulation/deadlines, 44.270 s. Original failure and authorization remain in the aggregate. | | Normal MainMenu | `TestResults/main-menu-e61aaa64c79a4851bee85ca046e29853/`: all ten phases passed, UTC 10:13:49–10:15:43, zero cleanup errors. | | Normal VerdantInitial | `TestResults/encounter-polish-3359a2d5526d4c1087e53767334c2329/`: all 23 phases passed at 75/15/1, two/four-peer Stage1→2→3 progression, rewards/scaling/travel, Stage3 wipe with 82 unique team kills, cached detailed results after host departure and fresh rehost. UTC 10:16:07–10:25:12 (544.818 s UTC-derived, not monotonic phase timing), zero cleanup errors. | The legacy MainMenu/Encounter launchers retain their own results/UTC bounds rather than native additive TestEvidence. `final/legacy-packaged-identity.json` separately compares the same complete Normal build bytes before/after with its fresh build report provenance and all six retained encounter peer build IDs. This is identity attribution, not additional gameplay proof. The original Console count and lead absent-field-count corrections are retained separately; no primary report was overwritten. Final `final/final-editor-state.json`: exact frozen source, stopped/compiled/imported/idle, original clean PlayTestScene, enter-play options true/3, zero manual requests/managers/players. All owned packaged processes exited. Seven pre-existing authoring/custom-template/parent-plan/research files remained byte-identical to the baseline; their changes and the locally maintained untracked companion remain outside commit scope. Local commit identity will be appended after staged scope inspection. **End checkpoint:** open **ProjectI > Debug > Enemy AI > Shooter sandbox**, choose **S3: boss phase and reinforcements (passive boss)**. Reach 40 eligible kills; inspect survivor continuity, boss arrival, space created by killing adds, slower reinforcements, boss-death cleanup and F5 selected-fixture reset. Check whether phase/readiness cues and pauses are understandable and pressure remains manageable. Edit the new `BossFixture/Provisional boss director.asset` profiles/cards and restart to capture new provisional tuning. Human feel/readability/balance acceptance remains open; bosses remain passive, native boss proof selects Siege, local packaged peers share one PC, and S4's independently controlled director campaign/separate-network/hardware acceptance remains unverified. Every later milestone and M6-SPAWNING-READY stays unchecked. ## S2 user sign-off — 15 October 2026 **S2 is signed off, including the elite-pack follow-up, within the opt-in prototype scope.** The user reported "everything is feeling really good now" and then explicitly instructed "sign off s2" after the remaining arrival-readability check was identified. This closes S2's End human gameplay/readability checkpoint and records a **keep** decision. The earlier 60 m bright-horizon concern remains historical review evidence; no new measured distance, resolution, hardware or separate-network playtest results are invented from this approval. Implementation checkpoints remain `4c9732b0ab06015044fcb30f9f5e04708ab27d8a` (S2) and `2d26ec153b4040e7af73b2c98dddbd01e9681943` (elite-pack follow-up). Retained final automated proof is 1,229 EditMode and 24 native passes plus three audited builds at source `61A2013059E79787FF809C43A0C6B988A2448BA2F6ED47ACE1A578131871C595`; the execution record below preserves failed attempts, identities and explicit packaged-check reuse. No tests, builds or Unity operations are rerun for this documentation-only sign-off. Risk/closure: low-risk factual status update, lead inspection; check references, milestone scope, diff and preservation of existing edits. Only the tracked project-brief sign-off is staged for the local documentation commit. This pre-existing untracked companion is updated locally without sweeping its accumulated planning/evidence into that commit. User tuning/template/research and the parent-plan edits remain preserved/uncommitted. This approval does not freeze editable tuning or promote production behavior. S3/S4, C1–C3 and M6-SPAWNING-READY remain unchecked. Stop after recording this sign-off. Documentation closure: local commit `456eb24e0f5ac6c5d4727a27109794c248ca3e4d` (`Record S2 user sign-off`) contains only `Docs/PROJECT_PLAN.md`. Reference/status, whitespace, unchanged milestone-checkbox and preserved-file hash checks passed; final index is empty. This companion remains locally updated/untracked. No Unity operations, test/build reruns, push or later-slice implementation occurred. ## Elite-pack follow-up — authorized 15 October 2026 - Intent: occasionally replace one normal member of a single-type pack with an elite of that enemy family. Each normal card owns an editable pack-level upgrade chance; elite card weights choose the variant. Bombardiers are elite-only, explicitly distinct cards/prefabs, and may replace a ranged normal only when their elite card belongs to the active profile. - Hypothesis: at most one fully priced replacement gives ordinary packs occasional variety without changing their size or producing unpaid elites. Zero chance, missing/ineligible variants or insufficient credit must preserve an affordable normal pack; the same seed and captured inputs must produce the same complete choice. Saving still targets only a fixed, strictly expensive, reachable choice with its original deadline. - Scope: captured chance/validation, bounded single-pack selection and admission validation, canonical Bombardier classification/elite-only tier handling, fixture authoring and supported narrow migration, meaningful pure/native regressions. No saving-policy changes, specialist capability restoration, S3/S4/C1–C3, production director activation, navigation bake, UI or new coordination. - Risk/ownership: high because selected tier/cost and native reservations cross shared admission contracts. Lead alone writes. Three independent read-only technical, gameplay and design pre/post reviews use Sol 6.1 Medium, with Ponytail completeness/simplicity in technical post-review. - Proposed representation: append a distinct Bombardier archetype without renumbering existing values; share ordinary ranged clearance and elite-upgrade family while preserving explicit prefab/type IDs. Normalize Bombardier to elite before legacy/manual placement and authoritative birth, and reject normal Bombardier director cards. Existing damage/health/reward formulas remain unchanged. - Proposed selection: preserve weighted base-card and uniform viable pack-size selection; one pack-level chance, weighted eligible elite replacement, at most one changed slot. Filter the complete group's eligibility, full cost, capacity, specialist counts and incompatibilities before selection; freeze members for saving and reservation. Direct elite cards and explicit templates retain their authored identities/tiers. - Provisional tuning: introduce chance with default zero for compatibility; opt-in normal fixture cards with an elite partner start at 0.25, editable and unaccepted as balance. Elite-card weights remain existing values. Preserve user profile income/balance/mode edits. - Human timing: **End**, supplied by the user for this follow-up; closed by the explicit S2 user sign-off above. Hardware and separate-network acceptance remain separate. - Baseline: HEAD `4c9732b0ab06015044fcb30f9f5e04708ab27d8a`; preserved dirty assets, parent plan and untracked research/companion/user template copied to `TestResults/elite-pack-1792046674291/baseline/`, with `preexisting.patch`. Only task-owned source/test/data hunks may enter the local commit; pre-existing planning/research and the user's untracked template remain excluded. - Checks: exact post-import discovery; focused selection/ledger/authoring/geometry RED and GREEN; full EditMode with genuine reload; affected native director admissions and entity tier/geometry contracts; normal/development/release builds and exclusion checks if runtime compilation changes. Select additional co-op/lifecycle checks from actual final diff and TESTING.md; historical S2 evidence is context only where incompatible. One exclusive Editor owner, immutable reports and no overlapping operations. - Duration unknown until discovery/native/build execution; stop after reviewed follow-up and scoped local commit, with pending human acceptance explicit. Escalate unanticipated production behavior, capability or network-schema changes. ### Elite-pack implementation and evidence Implemented `singlePackEliteChance` in immutable card snapshots and a bounded SingleType replacement branch. `SingleCardId` preserves the selected base even when a singleton's only actual member is elite. Ordinary purchases retain an affordable original group, use one pack roll, filter fully priced eligible variants from the active profile, then freeze one weighted replacement and slot. Directly selected elite cards still form their existing all-elite groups. Hard incompatibilities apply to actual retained/replacement members; explicit templates and procedural soft modifiers retain their prior contracts. Saving still requires a strictly expensive reachable final purchase; conditioning on those outcomes can choose an upgraded-only target for any positive chance. Zero excludes the upgraded branch. Base eligibility is checked again during saving/reservation, including singleton replacements. Bombardier appends archetype value 6, retains its separate prefab/type ID, uses existing ranged Large clearance, and resolves to elite before legacy/manual placement and authoritative birth (including unconfigured births). Invalid normal Bombardier cards are rejected. Existing health/resistance/damage/reward formulas are unchanged. This establishes tier/selection/admission, not M9 bombardment behavior. Fresh fixture builders author elite-only Bombardiers and opt-in normal-card chance 0.25. The saved S1 definition now has 13 cards; the saved S2 accepted shooter card has chance 0.25 and passive melee remains zero. The S2 fixture does not automatically add Bombardier to its pool. Its elite card must be authored/listed explicitly in a profile to participate. The S1 passive roster already includes it. No production director binding or scene/navigation edit occurred. Independent technical, gameplay and design pre/post reviews (`elite_*_pre`, `elite_*_post`, Sol 6.1 Medium) cleared source after compact delta rechecks. Technical post-review found a partial-save hazard in the proposed migration menu. The retained menu was removed; the one-off ignored migration validates both definitions and preservation predicates before saving, and restores in-memory JSON if validation fails. Design review requested explicit tooltip wording for conditional expensive saving; the tooltip/table now state it. Final commit scoping must exclude the user's custom-template stanza together with its untracked asset/meta, and retain their finances/mode/timing edits outside the index. The Editor contained a pre-existing unsaved third template absent from the initial disk diff. The failed initial migration exposed its duplicate ID. Its in-memory state was retained in `TestResults/elite-pack-1792046674291/unsaved-arrival-authoring.json` and `unsaved-user-template.json`. The user explicitly authorized correcting only its references. `ranged-elite-arrival` now has a unique ID, exact shooter prefab subobject references and `fixture-shooter-elite` for its elite slot, preserving three chosen shooters and faction. Its active-profile template list remains unchanged; it is not automatically enrolled. The repaired user asset/stanza remain uncommitted pre-existing work. Current retained evidence under `TestResults/elite-pack-1792046674291/`: - `migration.json`: both saved definitions captured successfully; GUIDs `b23218c8adb90c34793a9ba980339250` / `b059064d1a2d7f14ea6e3f160ffaf226`, profile tuning unchanged. `migration-repeat.json` / `migration-idempotence.json`: repeating the controlled operation preserved all three saved files byte-for-byte. Saved/reimported capture succeeded. - RED `foundation-runs/elite-pack-red-23270027f87e41a3a637c9610e9f2be6/`: 3/3 expected failures, zero skips, matched terminal/no conflict. Missing editable chance, accepted normal Bombardier and old Standard classification reproduced. - Preliminary focused `foundation-runs/elite-pack-focused-cd9302ca3c864df8812f984e2fe2e1f4/`: **97/97 pass**, zero skips, matched terminal/no conflict; source `4C56532C0620A0BB391B3E5A9F91380839D44767F20815A19FB55FC315644C6D`, compiled `1CD4BDEA2D6F5382BD1E08E644D0286E36CAF5485FFDF61691394390A668B132`. Two further pure regressions, final tooltip and saved arrival migration followed; this is not final-source proof. - Frozen final source: `852FDAB138FACBB0AA62ACC53714E74DDA835FBBA513F426D9CE4A2C76EAAC20`; stopped, compiled, clean saved PlayTestScene, enter-play options true/3. Sol 6.1 Medium operator `elite_verification` has exclusive final execution ownership. Final manifests/results remain to be recorded; no automated or human acceptance is inferred from review. The first final batch retained **1,227/1,227 EditMode passes**, zero skips, one genuine reload, source `852FDAB…AC20`, compiled `FC8B408E8363E4C0323F4CA8AE95798A221848D29153D395DF60B2DCA5B08831`, 50.435 s execution (`foundation-runs/elite-pack-final-editmode-fe05cad4044445dba34df1eefa7b8d4a/`). Its native union (`elite-pack-final-native-a1cf093520e943bd9592b289fd5f12f9/`) was **21 pass / 3 fail**, zero skips, matched terminal/identity, 69.915 s. Preserve the primary XML/text diagnostics; the first aggregate's nested failure-message fields are empty. All three failures were demonstrated test setup defects. The new peer helper changed the first purchase interval to 60 s but waited 15 s; the scheduler correctly schedules its first opportunity after that interval. The helper now retains the existing fixture's 1 s interval, with zero income and 26 remaining credit preventing another three-member purchase. The false/unconfigured Bombardier birth assertions had already passed elite tier, Large navigation and existing elite health before an unrelated positive manual-spawn assertion hit the correct debug-arena guard in PlayTestScene. That assertion was removed; positive manual-scene placement remains unverified, rather than bypassing its guard. Only `EnemyDirectorAdmissionTests.cs` changed in this repair. `native-test-repair-compatibility.json` retains before/after hashes: runtime DLL `F637B04EE1D471C9A538B7770658791B2DE06FE4BD2BDA098FB2C84FB4A4EC5C` and EditMode DLL `9BDC87887F865BE1ED50BD90FF7BED51F05ACF501E7A5B82A825405782CF519F` are unchanged, as are Arrival/Passive sources; the PlayMode test DLL changed. Technical delta review clears the correction and explicit compatibility reuse. The full EditMode result and **13 unaffected native leaves** (Arrival 12, Passive 1) are reused; they are not fresh final-source runs. Fresh affected admission-fixture evidence is recorded separately below. Runtime, assets, pins, thresholds and timeouts were not relaxed. Final post-repair source is `65092AACA482AC2F1AE2FAE3E3E82FBFF0B3825EB8B2EE6FC1D4E2DADFE6982C`. The operator resumed exclusive ownership for the full affected admission fixture, three fresh audited builds, packaged cohorts and common regressions. No historical S2 result is used as proof of this new mechanic. That checkpoint completed fresh admission **11/11**, three builds/audits and packaged 2/4-player reset/disconnect/rehost/rejoin cohorts, MainMenu 10 phases and VerdantInitial 23 phases, with zero owned-process cleanup errors. Its identities and measured durations remain in `aggregate-final.json`; all are retained under source `65092…6982C`, not relabelled as later proof. Build GUIDs: Normal `0dd7d5d66e184e3a99764766ff6b76fc`, Debug `fdd1c7b9d59040d1a8f77b44bdf1a600`, Release `1d7d46e77f7c41bd98ba00c47827f8ee`. Final technical inspection then confirmed a finite-cost edge case: validating a replacement in slot zero and moving it afterward could change ordered floating-point addition. Costs `[1e16,1,1]` validate at `1e16`, while `[1,1,1e16]` cost `1e16+2`; seed 1 selected the latter. Ledger rejection prevented overspending, but the selection contract was invalid. Numeric RED `elite-pack-numeric-red-1573d00f96414e1d91b36a2ee3326bdd/` reproduced both ordinary and saving failures (2/2 expected failures, zero skips/matched terminal). The small correction filters the at-most-five actual replacement positions through the same complete-group `Fits`, including saving's strict lower bound, before the existing slot draw. Position zero was already validated. Variant weights, chance, draw count, normal tuning behavior and fixed saving choice remain unchanged. No epsilon or alternate cost formula was introduced. Technical delta review cleared the correction and required fresh full EditMode, native union and all three builds. `pre-numeric-fix-inventory.json` / `numeric-fix-source-delta.json` compare all 1,619 source/assets/settings/pin files: only `EnemyGroupSelection.cs` and `EnemyElitePackTests.cs` changed. Previously passing packaged lifecycle/menu/stage flows remain compatible **reused** proof: they never activate the credit director, whose only activation callers are the manual scenario driver and its native tests; its assets are excluded by the build audits. Keep those reports' original source/build identities. They do not prove new-build independent-process purchased groups or human acceptance. Their source compatibility was independently reviewed; no signature-only DLL claim substitutes for behavior. Final numeric source is `61A2013059E79787FF809C43A0C6B988A2448BA2F6ED47ACE1A578131871C595`. Sol 6.1 Medium operator resumed exclusive verification into `TestResults/elite-pack-1792046674291/numeric-final/` and `Builds/ElitePackNumeric-1792046674291/`. Final results and scoped-index validation follow; older failed reports remain immutable. | Final-source automated evidence | Actual result | | --- | --- | | `foundation-runs/elite-pack-numeric-final-editmode-cf75f127b8f54b8cb8bb809a32ae8bc9/` | **1,229/1,229 pass**, zero failures/skips, full assembly, unique exact expected/executed leaves, matched terminal/no conflict, genuine reload 1; 66.421 s. Source `61A201…C595`, compiled `F45E60A7D6E02CE1D62B12191842F96D15D28EBAC35E0AF3FC1DE4A2E0BBDAFD`. | | `foundation-runs/elite-pack-numeric-final-native-525d6015269f4f0f92f50708b4e139b7/` | **24/24 fresh pass**, zero failures/skips, full exact union (admission 11, arrival 12, passive lifecycle 1), matched terminal/no conflict; 43.274 s. Source `61A201…C595`, compiled `3893C8544C63C743B5CA2FBF4740527179E21247D90BABE6C22965FD4B52A8FA`. Includes real two/four-peer fully priced Bombardier packs and false/unconfigured elite births. Native peers share one Editor process. | | Final Normal / Debug / Release builds | All succeeded with zero errors, unchanged source `61A201…C595` and original scene settings; 80.089 / 21.969 / 53.592 s. GUIDs `4f4e727e8ec445378dc449da9b8b2aeb` / `14ee504ea043413b9e20789e0abfa3e7` / `cb193c901bfd4a4a9f258bdfd682cca6`. Immutable summaries/packed asset lists/build reports under `numeric-final/{Normal,Debug,Release}/`. Full exclusion audit/aggregate recorded at handback. | Compatible packaged evidence remains attributed to the preceding `65092…6982C` checkpoint and Debug GUID `fdd1c7b9d59040d1a8f77b44bdf1a600`: `debug-arena-175acadeaceb408b96e7394f47480ff0/` (2 players, 41.393 s), `debug-arena-83727c698e2c471bac474cc855394a5c/` (4 players, 44.387 s), `main-menu-33f07e8eef504a83abf042ae28dc4a1e/` (10 phases; UTC bounds only, no monotonic-duration claim), and `encounter-polish-a305be8458f3491595a7cf0dff897319/` (23 phases, 547.172 s). Both arena cohorts retain two resets, intentional failure proof and disconnect/host-loss/rehost/rejoin coverage. All reported cleanup errors are zero, with owned exits confirmed before common regressions. These are local packaged-session checks, not separate-network/hardware or human acceptance. Owned files: `EnemyDirectorDefinition`, `EnemyGroupSelection` and `EnemyAdmissionLedger` own chance/candidate/price/provenance validation; `EnemyArchetype`, `EnemyDefinition`, `PrototypeEnemy`, `PrototypeEncounterDirector`, `EnemySpawnCircleRules` and `EnemySpawnCircleSelector` own canonical elite-only tier/geometry routing. `CombatFlowEnemyBuilder` and `EnemyDirectorFixtureAuthoring` preserve fresh authoring. The Bombardier definition and two opt-in director assets contain the scoped data changes. `EnemyElitePackTests` (+ Editor-generated meta), `EnemyGroupSelectionTests` and `EnemyDirectorAdmissionTests` provide proof. `PROJECT_PLAN.md` and `TEST_CATALOGUE.md` link current status/coverage. This existing companion remains an excluded pre-existing untracked planning file; its execution record is preserved locally. End playtest, pending: in Unity open **ProjectI → Debug → Enemy AI → Shooter sandbox**, choose **S2: reserved groups and readable arrivals**. Edit the normal card's **Single Pack Elite Chance** in the provisional arrival director; restart the director after edits because settings are captured. Zero/one can help compare all-normal versus replacement behavior before returning to provisional 0.25. Elite-card **Weight** selects the replacement variant; **Cost** is the full elite price. Bombardier participates only when an explicit Elite card is authored and included in that active profile's Card IDs (already present in S1's passive roster, not added automatically to S2's shooter profile). Assess whether the elite is distinguishable in the pack and whether singleton upgrades/credit-driven pressure feel appropriate. Human balance/feel, 60 m bright-horizon cue readability, representative hardware/separate-network acceptance and positive manual-arena Bombardier placement remain open. M9 bombardment remains absent/passive. No production promotion, S3/S4/C1–C3 or M6-SPAWNING-READY completion is claimed. Closure evidence: `numeric-final/aggregate.json` and `numeric-final/build-audit.json` retain final fresh test/build identities, exclusions and explicit preceding-checkpoint packaged reuse. The lead independently accepted the exact XML/manifest selections (1,229/24 unique expected/executed cases, no skips/failures/conflicts, matched terminals/source), all three zero-error build summaries and release exclusion audit. Final Editor is stopped, compiled, idle and clean in original PlayTestScene, options true/3, zero managers/players/requests. No new packaged players were launched after the numeric fix. The exact 20-file index was inspected and whitespace-checked. Eighteen full files match reviewed/tested working content. The two director asset index blobs were constructed from HEAD with only task-owned chance fields and normal-Bombardier removal/references; user profile finances/modes/timing and custom template stanza were excluded. `index-definition-validation.json` proves both exact indexed assets import and `Capture()` successfully (S1 13 cards/13 templates, S2 3 cards/2 templates). Disposable copies were removed; source before/after remains `61A201…C595`. The working assets still retain the user's tuning and approved custom-template reference corrections. Parent plan, untracked companion/research/template and the externally appearing `Docs/Research/2026-10-15-weapon-and-ability-game-feel.md` remain excluded/preserved. The commit is a local implementation checkpoint with human acceptance pending, not production approval. Decision: **keep for further testing**; stop after this S2 follow-up. Local closure: **`2d26ec153b4040e7af73b2c98dddbd01e9681943` — Add weighted elite upgrades to single-type packs** (parent `4c9732b0ab06015044fcb30f9f5e04708ab27d8a`). Post-commit inspection confirms exactly the reviewed 20 paths, empty index, no task-owned source delta remaining, and only preserved user profile/template/planning/research work outside the commit. `local-closure.json` records scope; no push or amend occurred. S3/S4/C1–C3 and M6-SPAWNING-READY remain unchecked. Human End was pending at that implementation commit; the user sign-off above now closes it. > **For agentic workers:** planning only until implementation is separately authorized. Then use `projecti-slice` and `superpowers:executing-plans`, or an explicitly selected `superpowers:subagent-driven-development` workflow, one milestone at a time. ProjectI's current review/model policy takes precedence. One writer integrates; reviewers are read-only. Do not infer execution, tests, builds, Unity operations or commits from this document. **Date and status:** 15 October 2026. S1's isolated rules/authoring gate and S2's implementation, automated checkpoint and user End sign-off are complete within the execution limits below. The user accepts S2 and the elite-pack follow-up within the opt-in prototype scope. S3–S4 and C1–C3 remain pending; M6-SPAWNING-READY remains unchecked. The research and pre-existing parent-plan edits are preserved. **Goal:** implement credit-funded, readable enemy arrivals around a moving party, followed by mixed-squad coordination and temporary roaming-elite cooperation. **Architecture:** the encounter owns one active spawning profile and its scheduler, credit bank and population reservations. Spawning publishes stable group/member admissions; coordination consumes them and maintains coarse assignments and scoped reports. Individual Unity Behavior graphs retain their existing perception, positioning, attack and lifecycle owners. **Tech stack:** Unity 6000.6.4f1, C#, Unity Behavior 1.0.16, AI Navigation 2.0.14, NGO 2.13.3, URP 17.6.0 and Test Framework 1.8.0. Preserve manifest/lockfile pins and the existing multiplayer stack. **Spec:** [Enemy spawn director and squad coordination research](../../Research/2026-10-15-spawn-director-and-squad-coordination.md), especially its confirmed decisions. [Parent M6](2026-10-13-enemy-ai-implementation.md#m6--add-moving-encounter-pressure-and-squads) owns the completion summary. Existing [replacement scenarios](../../Design/Enemies/2026-10-13-ai-replacement-scenarios.md) and [Behavior integration design](../../Design/Enemies/2026-10-13-unity-behavior-rework.md) still govern unaffected behavior. **Post-review decisions, confirmed 15 October:** the director deliberately sometimes saves for one selected expensive purchase, skips cheaper purchases during that finite saving window, and abandons an expired/invalid choice until the next normal opportunity. Splinterbeast children bypass the admission limit but count afterward; the boss bypasses it and stays outside the nonboss count. Reinforcements have no exception. Children use bounded immediate nearby placement attempts, then omission with no backlog. If children push the nonboss total over the active limit, cancel unspawned purchased members and refund only unused cost up to the bank ceiling. These decisions supersede the research's earlier shared hard-cap wording and the old child-cap restriction; other accepted safety/reward rules remain. ## Scope and milestone ownership | Milestone | Deliverable | Depends on | Completion owner | | --- | --- | --- | --- | | S1 | Validated profiles, credits, bounded saving and three composition modes | Accepted M5/M5B foundation | Companion plan | | S2 | Reserved mixed-group admissions and readable arrival windows | S1 | Companion plan | | S3 | Separate boss reinforcement profile and encounter cleanup | S2 | Companion plan | | S4 | Spawning proof and explicit handoff to M6 | S1–S3 | Companion plan; checks the first M6 checkbox | | C1 | Moving pressure and mixed-squad assignments | S4 | Companion detail; parent M6A summary | | C2 | Scoped reports and roaming-elite cooperation | C1 | Companion detail; parent M6B summary | | C3 | Combined coordination proof | C1–C2 | Companion detail; parent M6C summary | S1–S4 do **not** depend on C1–C3. Before C1, spawn commitments use their original coarse birth region; they do not pretend to represent later tactical reassignment. C1 updates those same records when assignment ownership becomes available. S4's completion can therefore unlock M6 without waiting for M6 itself. Only S4's executor may check **M6-SPAWNING-READY**, after its stated evidence gate. C1–C3 completion is recorded separately. The companion is fully complete only when all seven milestones pass their gates; the first M6 checkbox is deliberately narrower. The baseline is `21bd4aadf2aa17b2b59fd96e24827273cfc17059`. Normal stages remain passive; M5/M5B are isolated accepted shooter foundations within their recorded limits. Prove the new systems in opt-in fixtures first. M8–M14 restore real roster capabilities; M15 promotes production bindings; M16–M17 retain integrated roster and human acceptance. Spawning a passive Keeper or boss does not prove support or boss combat. ## Global constraints - Server/host owns credits, RNG outcomes, purchases, reservations, births, arrival readiness, assignments, report transport and cleanup. Reject foreign network/scene/run/stage or stale actor/target lifetimes at consumption, not just request creation. - The selected changes supersede hidden-birth-only, same-family composition admission, old ordinary pacing/elite-selection scheduling in the new director mode, and no-reinforcement boss policy. Retain legacy fixtures explicitly; do not run both schedulers for the same encounter. - Keep 16 as the maximum authored **director admission limit**, with independently lower boss-add/profile limits. Count all living nonboss actors, including children, plus pending nonboss admissions. Children may exceed that limit on legitimate parent death, but then block new director purchases/births; the single encounter-owned boss is outside this count and can be admitted regardless of population. There is no longer a universal 17-actor ceiling. Dead actors awaiting dissolve do not remain alive population. Exemptions require explicit trusted birth origin, never an arbitrary bypass flag from a caller. - Allow visible and hidden births from any direction with a damageable reaction window. Director purchases preserve minimum distance from every living participant, maximum distance/reachable opportunity to at least one, supported ground, bounds, native agent compatibility and capsule/occupancy checks. Local death-owned children use safe nearby placement rather than the director's 20–60 m ring; boss entry retains its authored placement policy. Neither exception bypasses physical clearance, stage/lifetime validation or arrival readiness. - Preserve health/damage scaling, status/Scan, rewards, kill identity and the 40 eligible-kill boss trigger. No new difficulty UI, permanent progression, weapons, art purchases, terrain edits, NavMesh rebakes, faction abilities or dependencies. - A kill refunds no spawn credit. Clearing a group must not refill it, promote survivors or trigger immediate replacement. Deliberate saving holds one choice for a finite deadline, not a queue of owed spawns; capped saving never authorizes a catch-up emission loop or a global actor pause. Finite children are an explicit parent-death aftermath, not director replacement or a credit refund. - Observation reports retain source/time/target provenance and cannot become personal sight. Direct fire requires the actor's own sight/firing path. Existing personal-memory shell rules remain separate. - Preserve useful movement, bounded pursuit, paid recovery and launched effects across task changes. Cooperation cannot reset health/cooldowns/pursuit. Visible spawning does not permit visible retirement or teleport recovery. - Use supported Editor operations for assets, prefabs, graphs and `.meta` creation. Preserve manual VerdantRelay authoring, GUIDs and saved navigation. Diagnostics remain opt-in/development-only and excluded from release. ## Task packet and review focus **Hypothesis:** separated purchase timing, bounded group arrivals and coarse assignments will provide varied moving pressure while clears still create space. Unsafe/instantaneous arrivals, debt-driven refill, ineffective birth routes, synchronized group reversal or report-based hidden fire falsify it. **Ownership/risk:** this turn is lead-owned planning, with document review only. Future runtime work is high risk across authority, lifecycle, population and progression. Before and after each consequential implementation slice obtain independent technical, gameplay and design/UX perspectives under [AGENT_WORKFLOW](../../AGENT_WORKFLOW.md); use its canonical model policy, one writer and compact delta rechecks. Choose ASAP/end human-playtest timing when execution is authorized, not during this planning task. **Evidence and duration:** implementation/test duration is unknown until S1/S2 discovery and native costs are measured. Record source/assets/settings/build identity, selection manifests, elapsed time, cleanup, review outcomes and human observations in this plan's execution record. Update the estimate after S2. Do not promise delivery from historical test totals. **Escalation:** stop the affected slice for authority/lifetime leakage, contradictory budget/population accounting, paid-action resets, required terrain changes, unreadable remote readiness, or scope changes to reward/boss completion rules. Finish independent work, then present the concrete conflict. Five mandatory failure classes and their owners: 1. **Saving/blocked spawns followed by a clear:** one finite saving intent and bounded bank, one scheduled purchase, no catch-up or killed-member replacement; expired/invalid goals return only on a later opportunity (S1/S2). 2. **Mixed-family partial admission:** actual member geometry, reserved capacity and exactly-once rollback; one invalid member cannot cause overlap or unlimited retries (S2). 3. **Arrival interrupted by death/reset or late replication:** no early hostile action, resurrection, stale readiness or duplicate reward (S2/C3). 4. **Boss/child exceptions with pending purchases:** one boss independently admitted, child overflow counted, unused purchased members cancelled/refunded once, no reinforcement before a living boss and no bank dump or old-stage births (S2/S3). 5. **Elite changes partners while sight is lost:** scoped original reports, no relay refresh, direct-fire refusal and unchanged pursuit/recovery (C2/C3). ## File and interface map Paths below are repository-relative. `E` = `Assets/_Project/Features/Enemies`, `T` = `Assets/_Project/Tests`. New files, APIs and fixture names are proposals, not discovered code. Keep serializable helper records with their owner; do not introduce a general-purpose director framework or another behavior-tree runtime. | Owner | Create | Existing seams to modify | | --- | --- | --- | | Immutable tuning and choice rules | `E/Encounters/EnemyDirectorDefinition.cs`, `EnemyDirectorRules.cs`, `EnemyGroupSelection.cs` | `EnemyRosterCatalogue.cs`, existing composition assets/definition, run read-only timing input | | Purchase/population ledger and one scheduler | `E/Encounters/EnemyAdmissionLedger.cs`, `EnemySpawnScheduler.cs` | `PrototypeEncounterDirector.cs`, `EncounterRules.cs`, `EncounterSnapshot.cs`, `EnemySpawnCircleSelector.cs`, `EnemySpawnCircleRules.cs` | | Actor arrival state and cue | `E/Presentation/EnemyArrivalState.cs` | `PrototypeEnemy.cs`, `Behavior/Contracts/EnemyActorContext.cs`, `Behavior/EnemyBehaviorHost.cs`, current attack/movement execution guards and fixture prefab bindings | | Assignment and pursuit | `E/Coordination/EnemyPressureDirector.cs`, `EnemyPressureAssignment.cs`, `EnemySquadAssignments.cs`, `EnemyPursuitState.cs` | `Behavior/Nodes/RequestEnemyAssignmentAction.cs`, `Navigation/EnemyPositioning.cs`, existing `EnemyApproachSector` and graph bindings | | Temporary elite cooperation | `E/Coordination/EnemyEliteCooperation.cs` | squad membership service and `Perception/EnemyPerception.cs`; no new owner of Keeper links or attack state | | Opt-in authoring and observation | fixture assets under `Assets/_Project/Debug/EnemyBehavior/SpawnDirector/` | `Assets/_Project/Debug/EnemyBehavior/EnemyBehaviorScenarioDriver.cs`, `Assets/_Project/Editor/EnemyBehaviorSandboxWindow.cs`, later production assets at M15 | | Built-peer scenario proof | `Assets/_Project/Debug/EnemyBehavior/EnemyDirectorPeerScenario.cs`, `Tools/Test-EnemyDirector.ps1` | reuse `Tools/TestEvidence.ps1` identity/owned-process cleanup; inspect existing session/debug bootstrap and `Features/UI/DevelopmentSessionProbe.cs` for narrowly scoped hooks | Proposed contracts to freeze in their owning milestone: - `EnemyDirectorDefinition.Capture()` returns a private validated `EnemyDirectorDefinition.Settings` snapshot: profiles, card IDs/prefabs/tier/cost/weight/eligibility, templates, compatibility rules and finite limits. Shared assets are never mutable runtime banks. - `EnemyDirectorRules.Accrue(double available, double elapsed, double incomePerSecond, double ceiling)` returns the finite capped balance without storing it. The ledger owns the last authoritative accrual time and balance; invalid/backward time makes no financial change. `EnemyGroupSelection.TryChoose(EnemyDirectorDefinition.Settings settings, EnemyGroupSelection.Context context, uint seed, out EnemyGroupSelection.Result result)` returns an immutable ordered member list, total cost and updated RNG state. Context includes active profile, stage, active run minutes, captured difficulty, stage participant count, available credits, an explicit selection spending limit, free nonboss slots and live-plus-pending specialist counts. Normal selection's spending limit is available credit; saving selection's is the bank ceiling. A choice is not a purchase; selection spends/reserves nothing and cannot read mutable Unity globals. - `EnemyAdmissionLedger.TryReservePurchase(EnemyGroupSelection.Result selection, ulong runId, ulong stageId, uint profileGeneration, double now, out ulong admissionId)` atomically holds cost and nonboss capacity when the choice is actually affordable. Admission identity is distinct from optional purchase identity. `TryCommitMember(ulong admissionId, int slot, PrototypeEnemy actor)` validates origin, lifecycle and member exactly once. The ledger alone owns bank/held credit and all live/pending counts; ordinary death frees population, never credit. - Add narrow unpriced entry points on that same ledger: `TryReserveBossEntry(ulong runId, ulong stageId, out ulong admissionId)` permits at most one encounter-authorized live/pending boss, regardless of nonboss count; `TryReserveDescendants(EnemyAdmissionLedger.ParentDeath death, int count, out ulong admissionId)` requires one authentic scoped lethal event, eligible parent identity/lineage and the finite child allowance. These records use `BossEntry`/`SplinterDeath` origin and no purchase/refund account. S2 proves the accounting with controlled fixtures; actual splitting remains M13. Neither method grants caller-supplied arbitrary cap or geometry exemptions. - `EnemySpawnScheduler.TickServer(double now)` is called only by the encounter owner. It owns purchase/stagger deadlines and at most one saving intent; it has no competing `Update`. A saving intent captures its ordered choice, total cost, eligibility/profile identity and original expiry, but holds no population slots or credit until purchase succeeds. Profile switch clears the intent and cancels pending paid work before starting a new generation. - `EnemyArrivalState.ConfigureBeforeSpawn(double readyAt)` captures immutable birth readiness before network spawn; `ReadyForActionsServer` checks current authority, actor lifetime and deadline. Rejoining/rebinding cannot restart or shorten it. Health/status validity remains separate from action readiness. - The ledger publishes read-only records containing admission identity/origin, optional purchase identity, parent lineage/inherited group and pursuit context when applicable, actual actor identity, run/stage, originating profile generation and coarse contribution region. C1 uses `EnemySquadAssignments.RegisterBirthServer(PrototypeEnemy actor, ulong admissionId)`; descendants inherit valid group/pursuit context without new sightings. A cancelled unfilled group never becomes living pressure. Profile switching invalidates pending exploration work, not the identity, arrival deadline or lawful cooperation of surviving actors. Boss coordination remains separate from ordinary squads. - `EnemyPressureDirector.TryGetAssignmentServer(EnemyActorContext actor, out EnemyPressureAssignment assignment)` returns a coarse region/approach, assignment ID, expiry and pursuit episode ID. It never returns an unseen player's aim transform. Feed through existing `EnemyPositioning.SetApproachSectorServer(EnemyApproachSector sector)`; do not duplicate M3 position/movement ownership. - `EnemySquadAssignments.TryShareObservationServer(EnemyActorContext observer, EnemyObservation personal, EnemyActorContext recipient, double now)` validates membership or an active cooperation relationship before calling existing `EnemyPerception.ImportReportServer`. Only original personal observations are transportable. - `EnemyEliteCooperation` owns its elite's temporary partner relationship, eligibility and reassessment, not squad membership or personal memory. End relationships idempotently on lifetime/context loss. C2 chooses a local typed relationship query consumed by `TryShareObservationServer`; no global broadcast or transitive permissions. Record any necessary API refinement in the milestone before its consumers are implemented. Preserve these ownership and identity guarantees even if a more idiomatic signature is selected after source inspection. ## Provisional authoring choices These are explicit starting proposals for isolated experiments, not accepted balance or RoR2 constants. Capture values at session/stage/profile boundaries; change them only through a documented tune and affected proof. | Setting | Proposed first experiment | | --- | --- | | Normal card cost/weight | Ordinary melee/ranged: 10/1 each; Keeper: 20/0.4; Lancer: 25/0.3; Bulwark: 25/0.3; Splinterbeast: 20/0.4. Bombardier is now elite-only (54/0.125), superseding the former normal 18/0.5 proposal. These are provisional credit/weight pairs, not capability-restoration claims. No SplinterChild or boss card in the ordinary pool. | | Elite purchases and pack upgrades | Explicit elite cards initially use three times normal cost and one quarter normal weight; ordinary elite costs 30. A normal single-type card additionally owns `singlePackEliteChance` (default zero; opt-in fixtures 0.25), replacing at most one member at full captured price. Its same-type elite cards and, for ordinary ranged only, active-profile Bombardier elite cards form the weighted variant pool. Explicit templates keep distinct card/tier identities. Saving conditions on expensive final outcomes, so a positive chance can expose an upgraded-only saving target; zero excludes it. No legacy kill-based elite roll in the new mode. | | Group pricing and selection | Sum member costs; three mode weights initially 1 each. Single-type mode can choose one through five members. Templates use their authored size; procedural groups initially two through five. Reject invalid/oversized requests rather than truncate a required template silently. | | Soft modifiers | Positive finite multipliers applied once per distinct already-selected triggering type, multiplied with base weight. Hard exclusions are symmetric and win first. Validate duplicate/conflicting rules; no negative, NaN or infinite weights. No production sniper/melee ban is installed merely because it was a discussion example. | | Exploration | Base income 10 credits/s, bank ceiling 100, initial balance 20, purchase interval 4 s, at most one pending group, member stagger 0.4 s, pending lifetime 20 s. | | Deliberate saving | On an ordinary purchase opportunity with no pending group/intent, 25% chance to select an eligible higher-cost choice above current credit but at/below the bank ceiling. Save for at most 12 s; both chance and deadline are per-profile editable. Skip cheap purchases during the intent. No capacity reservation, moving deadline or hidden debt. After abandonment, the next scheduled opportunity performs an ordinary affordable-selection pass before another saving intent is allowed. | | Eligibility inputs | Simple authored min/max gates for stage, active run minutes, difficulty and stage participant count, plus mode/pool/tier membership. Unset bounds allow all; capture authoritative inputs and recheck before purchase. No generic expression/predicate engine. Cost affordability and eligibility are distinct. | | Scaling | `income = baseIncome * difficulty * (1 + 0.4 * (participants - 1)) * min(4, 1.15^(stage - 1)) * min(3, 1 + 0.04 * activeRunMinutes)`. Validate/clamp finite inputs. Use existing stage participant snapshot; living-player eligibility separately controls placement. Existing health/damage scaling stays unchanged. | | Run/difficulty input | Active combat time accumulated by the run owner across stages; pauses during menu, collection, travel and defeat. Add a narrow authoritative read-only snapshot if absent. Difficulty is a host-authored run setting captured at start, default 1; fixtures can vary it. A player-facing difficulty picker is outside scope. | | Boss profile | Base income 3 credits/s, bank ceiling 60, initial balance 0, purchase interval 8 s, add limit 6, same scaling inputs and independently editable pool/mode/saving settings. Cancel exploration intents/pending purchases and discard its bank on phase entry. Start boss income and first purchase deadline only after successful live boss birth; initial boss credit is granted once then, never accumulated during placement retries. Existing nonboss survivors/children above six remain, blocking additions. Boss is excluded from that count. | | Arrival | 1.25 s from authoritative birth, damageable throughout; hold normal movement, attack preparation/release and new support effects until ready. Presentation may animate the visual child without moving the authoritative capsule. Status/health/death continue normally; activation never manufactures attack knowledge. | | Placement | Start with Verdant's 20–60 m horizontal limits and 6 m footprint; all directions eligible. Remove visibility rejection only in the new mode. Preserve native geometry and bounded work; no automatic visible-to-hidden fallback mode is needed. | | Death-owned children | Preserve at most two nonrecursive children per legitimate parent death. Release parent population, then admit valid local children even above the active director limit; count their pending/live admissions immediately. Proposed eight nearby placement candidates per child in the same bounded death operation; omit failures with no delayed retry/backlog. Preserve local clearance/routes, fresh lifetimes and reward exclusions. | | Coordination/cooperation | Reassess at most every 1 s per group with staggered phases; initial assignment lifetime 6 s. Elite cooperation: one nearby pack, seek within 25 m with useful reachable contribution, release beyond 35 m or on invalidity, at least 2 s between nonurgent switches. Required report direction is cooperating pack → elite; reciprocal sharing is deferred. | S1 must inventory the current role/tier assets and validate these entries before enabling them. Support/defense/splitting capabilities are not invented to populate a table. Build eligibility and cost data for their passive fixtures, then enable actual role behavior only at its parent milestone. The boss-profile ceiling can intentionally make some expensive entries unavailable; require at least one affordable complete purchase in every enabled mode rather than pretending every card is affordable under every profile. ### Bounded saving behavior At a normal opportunity, choose between ordinary affordable selection and a saving attempt using the authored probability. A saving attempt builds one valid candidate against the bank ceiling, preserving all mode, composition, size and specialist rules, then requires its cost to exceed the current bank and be reachable within the finite saving window at the declared income. If no such candidate exists, no intent is created and that opportunity may perform ordinary selection. A procedural saving candidate has its full member list fixed at intent creation; it is not rebuilt into a more expensive target every tick. While saving, only accrue capped credit and check the captured intent at scheduled opportunities. Purchase it once only if affordable, still eligible, within nonboss capacity and able to enter bounded placement. Temporary occupancy/capacity blockage consumes the same original saving deadline. Do not spend on cheap alternatives, reserve capacity in advance, queue missed opportunities or extend the deadline when players move. Expiry or invalidated eligibility cancels the intent; no fallback purchase occurs on that cancellation opportunity. Resume ordinary selection at the next future deadline. Becoming affordable between opportunities does not trigger a birth. The intent becomes an ordinary paid admission only after successful reservation; then the existing placement timeout and member stagger govern it. Safe-placement failure cancels only unborn members and settles their unused funds once; it cannot recreate the saving intent or trigger an immediate substitute. The next opportunity remains in the future. Only one group can be purchased per opportunity; a fully saved bank never authorizes several catch-up groups. ### Population exceptions and purchase cancellation The shared population ledger counts every live/pending nonboss exactly once, regardless of whether it was paid for. Boss entry has its own singleton reservation and no nonboss slot cost. A legitimate Splinterbeast death authorizes only its finite, local, nonrecursive children; this is the sole selected nonboss cap-bypass source. All other director purchases, including boss reinforcements, are cap-limited. Process parent release and child reservations atomically before another purchase can observe free slots. Within the bounded death operation, validate local child points and reserve only the valid intended children; impossible candidates must not manufacture overflow. Children count immediately, including the pending portion of that same operation. Recheck physical validity at birth and release a failed unused child slot without retry backlog. If the resulting live-plus-pending nonboss total exceeds the active profile limit, cancel the unspawned members of pending paid admissions, retain born survivors and refund each unused paid member at most once into its still-valid profile bank, capped at the ceiling. No cross-generation refund, killed-member refund or immediate purchase follows. Continue counting surviving children until their death/cleanup; do not erase them merely to restore the limit. No child credit account or fake zero-cost purchase is created. Share identity, counting, arrival and physical-safety machinery, with explicit placement policy by trusted admission origin. Ordinary purchases use the distance ring; children use the death location; the boss uses its authored entry region. Cap bypass never means placement inside a player, wall or unsupported ground. This is a small closed set of known origins, not a generic exception framework. ## S1 Credit profiles and composition selection **Files:** create the three tuning/rules/selection files above; extend the existing roster and composition definition; add `T/EditMode/EnemyDirectorRulesTests.cs` and `EnemyGroupSelectionTests.cs`. Inspect `RunRules.cs` and `PrototypeRunDirector.cs` for the narrow run-time/difficulty input. Author only opt-in fixture definitions through supported Editor operations. **Interfaces:** produces captured settings and `TryChoose` results for ordinary purchase or saving intent selection. Uses actual prefab/tier identity, captured time/difficulty/stage/participants, and deterministic seeded selection. It performs no births or reservations. - [x] Inventory every selected card/template, actual prefab registration, tier, footprint/navigation family and authored composition. Record cost/weight/eligibility and passive versus active status. Represent new-mode templates as ordered card references with explicit per-member tier; adapt existing prefab-only templates through supported authoring while preserving GUIDs/faction presentation and explicit legacy consumers. Do not apply an implicit additional elite roll to template members. Implement profile validation, including minimum affordable group, reachable bank ceiling, count limits and at least one usable selection mode. - [x] Add RED cases before the minimal rules: `CreditAccrual_IsFrameRateIndependentAndCapped`, `InvalidClock_DoesNotMintCredit`, `EligibilityUsesCapturedTimeDifficultyStageAndParticipants`, `ModeWeights_SelectOnlyEnabledModes`, `GroupCost_EqualsMembers`, `HardExclusion_IsOrderIndependent`, `SoftWeights_AreGroupLocal`, `EmptyOrUnaffordablePool_TerminatesWithoutSpend`. Assert choices fit the explicit selection spending limit and counts; a saving choice may exceed current credit but cannot be reserved until funded. - [x] Implement capped accrual and selection with simple explicit eligibility bounds. For procedural groups, reject incompatible candidates, apply soft modifiers and the request's spending limit. Ordinary selection uses available funds; deliberate-saving selection uses the bank ceiling and fixes an eligible expensive choice. Bound retry work; do not silently change modes or ignore exclusions. - [x] Add deterministic saving cases: `CheapChoices_DoNotPreventDeliberateSaving`, `SavingHoldsOneFixedChoiceWithoutSlots`, `SavingCanSelectExpensiveTemplateOrProceduralGroup`, `UnreachableCostCannotStartSaving`, `ExpiryAndInvalidationDoNotExtendDeadline`, `CancellationReturnsOnNextOpportunity`, `FundedIntentCannotCatchUpMultipleGroups`, and `NoPerformanceInputChangesSaving`. Specify the scheduler transitions in S2; S1 proves candidate eligibility/cost and immutable intent inputs. - [x] Allow mixed-family templates in the new mode with per-member validation. Preserve boss/child exclusion and existing specialist limits unless explicitly replaced by equivalent admission constraints; preserve current max-two Keeper/Lancer and max-one Keeper per template initially. Scope compatibility-table exclusions to procedural assembly. - [x] Verify deterministic pure selection/cost results and authoring rejection with exact discovered fixtures. The new mode bypasses old elite-chance/pacing selection; retain explicitly exercised legacy-mode coverage without presenting its cadence as the new requirement. Stop at valid immutable choices and the S1 evidence record. **Gate:** choices are finite, reproducible and valid for their mode/declared spending limit; ordinary proposals are affordable, saving candidates are explicitly future choices with a reachable capped cost. No runtime reservation, admission or production promotion is claimed. ## S2 Reserved admissions and readable arrivals **Files:** create `EnemyAdmissionLedger.cs`, `EnemySpawnScheduler.cs`, `EnemyArrivalState.cs`; modify encounter/spawn circle and actor/action seams in the map. Add `T/EditMode/EnemyAdmissionLedgerTests.cs`, `T/PlayMode/EnemyDirectorAdmissionTests.cs`, `EnemyArrivalTests.cs`; extend opt-in scenario driver/window and fixture bindings. **Interfaces:** consumes S1 choices, owns paid and unpriced admission reservations, `TryCommitMember`, finite saving intents and scheduler ticking; publishes real admission records for C1. Arrival state is configured before NGO spawn. Keep health-valid actor context usable during arrival; add one shared action-readiness query on actor context consumed by existing execution guards, rather than invalidating initialization or copying timers into each capability. - [x] Add RED ledger assertions for simultaneous reservations at the director limit, partial success, expired/cancelled purchases, duplicate commit/refund, stage/profile mismatch, death before final member, killed member not replaced and death freeing slots without credit. Prove separate admission/purchase identities, an unpriced singleton boss, finite scoped child overflow and child counts blocking later purchases. Assert a caller cannot impersonate a trusted death/boss origin or refund an unpriced birth. - [x] Implement one authoritative ledger and scheduler, including the bounded saving behavior above. Debit/hold only when reserving an affordable purchase; settle verified births and refund unconsumed portions exactly once, capped by the still-valid bank ceiling. All pending/live nonboss actors, including children, count toward normal/add limits; specialist reservations also retain their own limits. After an opportunity set a future deadline, never catch up missed ones. If a pending purchase blocks an opportunity, do not buy immediately on an overdue deadline when it finishes. - [x] Prove overflow cancellation before further paid emission: kill an authorized parent while a paid group is partly admitted, add valid children above the active limit, retain already born identities, cancel unused paid members/refund once, and reject ordinary/reinforcement purchases until the complete count fits. Multiple same-tick parent deaths remain finite and nonrecursive. S2 tests the trusted-origin ledger contract; M13 owns the actual death capability and local child placement. - [x] Replace two family-indexed pending admissions with purchase/member identity in the new path. Preflight sufficient slots for the actual selected profiles/tiers, preserving a common footprint and each member's actual clearance/native mesh/route. Recheck each birth. Retain bounded continuation and original timeout across deferred queries. An impossible footprint defers/fails safely; it never relaxes geometry or creates missing members instantly. - [x] Generate director candidate regions from living players and account for pending/live birth commitments. Use all-player minimum separation and at-least-one nearby reachable opportunity. Before C1, publish coarse birth-region commitments only. After C1, consume updates to these records; do not introduce a second pressure counter. Unpriced children count as pressure as well as population; saving intents without reservations do not count as incoming pressure. - [x] Add native RED→GREEN cases for visible/front/side/rear births, split-party exclusions, sloped/unsupported ground, normal/large/mixed profiles, player movement between preflight/birth, occupied slots and exhausted query budget. Complete-path-to-player remains the baseline route check here; C1 may add role-legal approach opportunities through the existing positioning boundary, never a false reachability pass. - [x] Implement arrival readiness and simple original cues. Recheck readiness in actual attack begin/release and movement execution, not just graph branching; future capability conformance must include it. In particular inspect `EnemyBoltExecution.TryBeginServer`/release guards and `EnemyMovementExecutor.TryAccept`/movement ticks; arrival must not invalidate health/status context or prevent capability initialization. The delay survives graph restart, status and ownership changes for that birth. Death ends arrival permanently. Remote presentation derives from replicated authoritative start/ready state; it cannot grant readiness. - [x] Prove damage/status/death during arrival, early direct invocation refusal, ready-but-no-personal-sight refusal, reset/despawn/reused identity, and host/two/four-peer cue ordering. Measure applied latency and cue lead time; server timing alone does not prove a remote reaction opportunity. Tune or fix the boundary if the cue arrives too late. **Gate:** bounded purchases yield safe, damageable, readable staggered births; no double accounting, visible pop-in without cue, pre-ready hostile action or catch-up. Existing shooter fixtures can exercise action readiness; passive roles prove admission only. **Checkpoint status:** **S2 signed off by the user on 15 October 2026**, including the elite-pack follow-up. Implementation, automated accounting/placement/readiness/order checks and the user End checkpoint are accepted within the opt-in prototype scope. No production promotion or completion of later spawning/coordination milestones is implied. ## S3 Boss reinforcement and lifecycle **Files:** modify `PrototypeEncounterDirector.cs`, `EncounterRules.cs`, scheduler/ledger and `EncounterSnapshot.cs`; inspect `PrototypeRunDirector.cs` death/checkpoint callbacks. Add `T/EditMode/EnemyDirectorBossRulesTests.cs` and `T/PlayMode/EnemyDirectorBossLifecycleTests.cs`; author the fixture boss profile. **Interfaces:** encounter phase owns `SwitchProfile` generation changes. The ledger/scheduler expose cancellation/settlement through that owner; coordination is not required. Boss actor/kill/portal ownership remains existing code. - [x] Add RED cases for boss entry with 16 live adds, child overflow beyond 16, pending mixed purchases/saving intents, an already killed arrival member, bank at ceiling and prolonged failed boss placement. Assert retained actor identities/HP/arrival deadlines, at most one live/pending boss, no reinforcement income or purchases before successful boss birth, no old pending purchase and no bank transfer. - [x] On phase entry stop exploration before scheduling, cancel its saving intent/unadmitted paid members and close its bank/held funds. Enter boss-awaiting-entry state with zero reinforcement accrual. Admit the unique boss through the trusted unpriced entry, ignoring nonboss population but preserving authored placement, scope and readiness. Successful live boss birth starts the boss profile's authored balance/income and future first-purchase deadline exactly once. Retries cannot restart it or accumulate credits beforehand. - [x] Admit reinforcements only while the authoritative boss remains alive, through ordinary paid physical-safety/arrival/credit/limit rules using the boss profile. The boss is not counted; every nonboss survivor/child/reservation is. Retained counts above the reduced add limit block additions without deleting actors. Preserve 40-kill entry and required boss defeat. Add deaths retain legitimate reward ownership but cannot repeat entry, complete the encounter or refund credit. - [x] On boss death, defeat, reset, stage change, host loss or shutdown: invalidate generation, cancel pending births and arrival callbacks, clear hostile work and preserve established survivor-cleanup/reward semantics. Never interpret cleanup or retirement as a boss kill. - [x] Verify actual passive boss/ordinary admission, exactly-once checkpoint cleanup, boss retry, add deaths and session loss in native/peer fixtures. Record that boss attacks are still M14 and ordinary hidden retirement is M7; do not tick those milestones. **Gate:** exploration and boss spawning cannot overlap; boss reinforcement is independently tunable with coherent accounting and progression. No claim of restored boss combat. ## S4 Spawning verification and M6 handoff **Files:** S1–S3 files/fixtures, opt-in authoring, proposed `EnemyDirectorPeerScenario.cs` and `Tools/Test-EnemyDirector.ps1`, `Docs/TEST_CATALOGUE.md` only for newly discovered fixtures/harnesses, this execution record and the single parent `M6-SPAWNING-READY` checkbox. Do not change parent coordination completion boxes. - [ ] Add an opt-in development-only built-peer scenario and launcher using the existing session/bootstrap route and evidence utilities. Launch actual matching two/four-player processes; prove a controlled intentional assertion failure, finite operation ceilings and owned-process cleanup before accepting positive runs. The Editor-native scenario driver and existing one-process M5B loopback harness are useful references but are not substitutes for this cohort. Keep the new scenario inert outside its explicit launch flags and excluded from release. - [ ] Audit `EncounterSnapshot` and `DevelopmentSessionProbe` consumers: distinguish legacy beat/elite-roll fields from the new mode, expose accurate live/pending/profile diagnostics only where needed, and never report an obsolete elite probability or beat as current director behavior. Preserve player-facing boss/kill/progression information; do not add credit-budget controls to the ordinary HUD. - [ ] Obtain the required post-slice technical/gameplay/design-UX reviews and resolve blockers, including actual arrival rendering, mixed-family safety, financial/population accounting and boss transitions. Freeze source/assets/profile values before integrated proof. - [ ] Follow the verification section below: exact discovery, full current EditMode and PlayMode assemblies at this spawning checkpoint, required builds/release exclusion, matching two/four-player admission/lifecycle cohorts and affected normal-entry/progression checks. Retain failures and cleanup errors. Reuse only compatible unchanged evidence with explicit identity; never replace a changed admission assertion with old pacing proof. - [ ] Present the isolated playable shooter/director fixture at the agreed ASAP/end timing. Record visible/rear arrival readability, bank-at-cap then clear, group staggering and boss-profile admission. Keep human feel, hardware and separate-network acceptance explicitly separate from automated/loopback proof. - [ ] Record source/build/profile identity, exact selections/manifests, reviews, actual checks, reuse, limitations and human decision. Deliver the stable admission/arrival/commitment contracts to C1. If a chosen human-before-handoff gate is pending, leave the prerequisite unchecked; unavailable later M17 acceptance alone does not imply S4 completion or failure. - [ ] **After the preceding gate passes**, check the single `M6-SPAWNING-READY` item at the start of [parent M6](2026-10-13-enemy-ai-implementation.md#m6--add-moving-encounter-pressure-and-squads) and append its evidence-record link there. Leave M6A–M6C unchecked. If a later change invalidates this evidence, reopen the affected gate and repeat only invalidated proof before claiming readiness again. **Gate:** implemented spawning foundation, scoped integrated proof and explicit handoff limitations. No production roster promotion and no requirement to implement coordination to pass S4. ## C1 Moving pressure and mixed squad assignments **Files:** create `EnemyPressureDirector.cs`, `EnemyPressureAssignment.cs`, `EnemySquadAssignments.cs`, `EnemyPursuitState.cs`; integrate the ledger records, current fixture-only `RequestEnemyAssignmentAction`, `EnemyPositioning.SetApproachSectorServer`, graph assets and encounter lifecycle. Add `T/EditMode/EnemyBehaviorPressureTests.cs` and `T/PlayMode/EnemyBehaviorPressureTests.cs`. **Interfaces:** consumes S4 records, produces typed `EnemyPressureAssignment` values and updates the existing commitment region. No birth, bank, population or attack owner is duplicated. - [ ] Add RED cases for stable membership through staggered births/early deaths, temporary invalid targets, assignment expiry, 2+2 and 3+1 splits, moving anchors and pending groups. Score bounded reachable candidate areas by player count and existing commitments. A proposed starting weight is `playersInArea / (1 + committedPressureUnits)`: initially paid actors use captured member cost / 10 and unpriced children use one unit each. These units never mint/refund credit. Deduplicate equivalent areas; count each actor once at its useful contribution region, with pending paid members at their intended region. - [ ] When reassessing a group, remove its own contributions from all comparative scores, retain the current useful assignment on ties, and switch only for changed feasibility or a meaningful score improvement (proposed 20%, editable). Prove a stationary 2+2 split does not cause repeated reversals. Expiry prompts reassessment, not automatic relocation; legitimate renewal preserves pursuit. Cooperation updates the elite's sole contribution region without duplicating its pressure at its birth area and partner area. - [ ] Implement coarse assignments and the real assignment-node integration. Keep valid current travel/actions while a replacement query is Deferred; changing a sector must not discard the only useful plan before another exists. Rate-limit/stagger reassessment; route failure is not automatic retirement. - [ ] Let mixed members use individual legal positions/routes under shared purpose. Reuse normal/large native geometry and M3 claims/budgets. Introduce no universal preferred range or whole-pack waiting. Distinguish a role-legal ranged/support opportunity from walking to a player's center; accept only a supported reachable contribution without granting unseen aim knowledge. - [ ] Own pursuit episodes outside graph branch names. Compare target/opportunity/route and meaningful progress before starting a genuinely different episode. Assignment ID churn, report arrival or temporary cooperation alone cannot refresh pursuit. Preserve status and paid attack recovery. - [ ] Prove real shooter contributions, split/moving-party assignment and bounded query behavior. Use passive role metadata only for unrecovered roles and report that limit. Carry actual melee/support/defense acceptance into M8/M10–M12 instead of fabricating new capabilities here. **Gate:** useful, stable coarse assignments and pressure feedback without hidden tracking, group lockstep, infinite chase or an independent coordination spawn loop. Check parent M6A only after its mapped evidence exists. ## C2 Squad reports and roaming elite cooperation **Files:** create `EnemyEliteCooperation.cs`; extend squad/assignment services and scoped `EnemyPerception.ImportReportServer` callers, preserving its original provenance semantics. Add `T/EditMode/EnemySquadReportTests.cs`, `EnemyEliteCooperationTests.cs`, and `T/PlayMode/EnemyBehaviorCooperationTests.cs`; add opt-in elite shooter fixture variants. **Interfaces:** transport genuine personal observations through `TryShareObservationServer`. Cooperation supplies a bounded, typed permission relationship. It does not rewrite birth membership, personal sight or support capability state. - [ ] Add RED cases for genuine squad reports, denied foreign recipients, expired/unseen targets, recycled identities, report relays, partner switching and source death/disconnect. Repeated forwarding preserves original timestamp; stale/malformed data cannot advance observation time or satisfy personal reaction readiness. - [ ] Transport new observations within stable squads and from an eligible cooperating pack to its elite. Stop live updates when original sight ends; retained reports expire normally. Do not enable transitive pack-to-pack or reciprocal elite-to-pack delivery merely through proximity. - [ ] Implement per-role eligibility and bounded temporary cooperation, initially one useful nearby pack per roaming elite. Retain independent identity/pursuit and continue role-appropriate pressure when no useful partner exists. Stable partner selection/release preserves existing attacks, cooldowns, personal memory and health. Update C1's single contribution record when cooperation changes the elite's useful area; test an elite crossing a split-party boundary without double counting or falsely advertising pressure at its abandoned region. - [ ] Exercise an elite shooter that learns an observed location from a pack, repositions, and fires only after its own legal sight/path. Move the player unseen after all observers lose sight and prove the elite does not receive hidden updates. Kill the pack or elite during a report/attack and prove no replacement, state reset or stale permission. - [ ] Verify max-two specialist and support-link limits remain independent of cooperation; procedural assembly exclusions are not reapplied to existing allies. Record actual support-role integration as M10 work; the M6 fixture is not Keeper behavior proof. **Gate:** stable temporary cooperation and genuine shared information without omniscient attacks, membership merging, renewed pursuit or report laundering. Check parent M6B only after the evidence matches these claims. ## C3 Combined coordination verification **Files:** C1–C2 and affected S1–S3 integration, proposed fixtures, opt-in diagnostics/scenarios, extend S4's `EnemyDirectorPeerScenario.cs` / `Tools/Test-EnemyDirector.ps1` with coordination cases, this record and parent M6C summary. Keep production activation with M15. - [ ] Review the integrated ownership/lifecycle diff from technical, gameplay and design/UX perspectives. Verify extension behavior through actual graph/perception/movement/attack consumers, not only pure mocks. Freeze final source/assets/tuning. - [ ] Run focused native combinations followed by the required full assemblies, normal/debug/release builds and matching two/four-player cohorts. Cover all five review-focus failures, moving/split parties, cover loss, dash-through, target death, status, reset, disconnect, host loss, boss profile and late callbacks. Apply the documented 75 ms delay / 15 ms jitter / 1% loss cohort where supported and record what was actually applied. - [ ] Obtain human keep/tune/revert observations at the agreed checkpoint: visible/side/rear arrivals, earned clear space, mixed pressure, roaming elite joining/leaving cooperation and stale shared sightings. Include separate-network and representative-hardware acceptance where available; leave unavailable categories open explicitly. - [ ] Update the actual catalogue and record identities, exact results, reuse and omissions. Check parent M6C only when its scoped gate is satisfied. Stop; do not automatically start M7, restore specialists or promote production assets. **Gate:** spawning and coordination work together within recorded scope, with no hidden fire, instant refill, unbounded work or lifecycle leakage. M6 completion is distinct from M15–M17 production/roster/human acceptance. ## Verification route for future execution Read [TESTING](../../TESTING.md), relevant [catalogue entries](../../TEST_CATALOGUE.md), [SETUP](../../SETUP.md) and pins again before any Editor/build operation. This planning task runs none of them. Use each milestone's named assertion cases for meaningful RED→GREEN, then the affected retained anchors: `EnemySpawnCircleTests`, `EnemySpawnGeometryTests`, `EnemySpawnIdentityTests`, `EnemyRosterAuthoringTests`, `EncounterRulesTests`, `EarlyStageSpawningTests`, `EncounterPacingHoldTests`, `EnemyBehaviorLifecycleTests`, `EnemyBehaviorPerceptionTests`, `EnemyBehaviorNavigationTests`, `EnemyBehaviorShooterTests`, `PassiveEnemyLifecycleTests`, `StageRewardPortalTests`, `SessionLifecycleTests` and `SessionRosterRecoveryTests`. Select relevant modes/fixtures, not this entire list for every small change. Preserve legacy-mode assertions separately. New-mode cases deliberately replace the old hidden-visibility, family restriction, pacing/elite-selection, no-boss-add and universal-cap behavior. Express the newly approved boss/child admission exceptions explicitly; ordinary purchases/reinforcements remain limited. Never weaken geometry, identity, reward or unaffected admission assertions. Preserve legacy fixtures only where they are designated comparison consumers; M15 migrates production deliberately, without making every new feature support both schedulers forever. Discovery, including proposed fixtures, must be positive and exact after creation/import. Current full assemblies determine counts. Supported Editor execution after readiness and discovery, one operation at a time: ```csharp ProjectI.Editor.FoundationTestRunner.RunFixtures( "spawn-director--", UnityEditor.TestTools.TestRunner.Api.TestMode.PlayMode, new[] { "ProjectI.Tests.EnemyDirectorAdmissionTests" }); // Integrated S4/C3 checkpoints, sequentially after prior finalization: ProjectI.Editor.FoundationTestRunner.RunEditMode("spawn-director-edit-"); ProjectI.Editor.FoundationTestRunner.RunPlayMode("spawn-director-play-"); ``` Expected GREEN means a validated immutable final manifest, correct mode/source/build identity, every requested discovered leaf executed, zero failures/skips/missing/duplicates, and confirmed owned-operation cleanup. Timeout is not termination. No further cohort or common regression starts while ownership remains uncertain. Do not run historical Natural-arrival campaigns or grant new attempts from this plan. At each frozen integrated checkpoint run required Windows normal development, debug development and release exclusion builds sequentially. Matching two/four-peer fixtures must exercise purchases/arrival/cooperation themselves; existing damage/weakpoint tests do not substitute for them. After owned process cleanup, run affected retained arena/session checks and common `Test-MainMenu.ps1` / `Test-EncounterPolish.ps1 -VerdantInitial -DelayMs 75 -JitterMs 15 -LossPercent 1` once as required by TESTING. A production-mode change invalidates relevant earlier proof; otherwise reuse explicitly compatible unchanged subsets. S4 and C3 are different source checkpoints, not permission to repeat identical broad runs after they already pass. ## Downstream contracts and scenario mapping This amendment overrides only conflicting forward requirements. Historical completed proof and previous documents stay intact. No milestone numbers after M6 change. | Parent scope | Integration required after this amendment | | --- | --- | | P01/P07 | Hidden ingress remains a case; add visible/side/rear births with reaction windows. Visibility alone no longer rejects new-mode spawning. No-safe-point/limit defers paid purchases without bursts; trusted boss/child origins have only their declared population exception. | | P05/P06/G08 | Clear/removal changes pressure; no kill-credit refund, immediate replacement or survivor freeze. No guaranteed fixed rest timer is added. | | P02–P04/G01–G07 | C1 owns moving/split assignments and pursuits; C2 owns genuine reports/cooperation. Real role execution remains with its roster milestone. | | P08/M14 | Phase entry stops exploration; successful live boss birth starts reinforcement income/cadence. Boss bypasses the nonboss limit and stays outside its count; reinforcements do not bypass it. Preserve survivors and required defeat. Restore/verify actual boss attacks later; do not restore no-new-adds or a universal 17-actor cap. | | M7 | Retirement releases live capacity without financial refund or replacement; recheck all required observers. Visible births do not weaken hidden-retirement eligibility. | | M8–M12 | Each real attack/support/defense consumer respects arrival readiness, mixed-role positioning and evidence boundaries. Keeper links remain capability-owned; specialist caps and precision overlap remain enforced. | | M13 | Finite nonrecursive descendants use trusted unpriced death admissions: bypass the limit on genuine parent death, count immediately, and cancel/refund only unborn paid members if overflow occurs. Release the parent once; perform bounded safe local placement attempts then omit failures, with no deferred child backlog. Inherit valid group/pursuit/observation provenance; retain reward exclusions and arrival readiness. Run/stage cleanup invalidates child work; a profile switch alone is not a new actor lifetime or a reason to delete already born children. | | M15 | Bind new profiles/arrival/coordination through supported asset operations, preserve GUIDs, verify NGO ordering/registration, and replace the production scheduler deliberately. Until then opt-in fixtures and legacy passive stages remain distinct. | | M16/M17 | Include deliberate saving/expiry, mixed groups, visible arrivals, bank-at-limit clears, child overflow cancellation, delayed boss entry, reinforcement and roaming cooperation in full-roster/network/release/hardware/human acceptance. Profile finite descendant surges above the director limit as well as normal load; never relabel those surges illegal solely because they exceed the former 16/17 total. Retained evidence cannot prove changed behavior. | ## Execution record ### S2 execution — 15 October 2026 - Authorized scope/owner: lead writes ledger, one encounter-ticked opt-in scheduler, ordered mixed-member placement, lifetime-bound replicated arrival and shared action readiness, controlled fixtures/tests and sandbox entry. S3 boss transitions, actual splitting, S4's independent-process campaign, coordination and production activation remain excluded. - Hypothesis: paid groups reserve funds/capacity once, yield safe staggered damageable births, and give each peer a visible cue before hostile actions; clearing/blockage never produces refunded killed members, replacements, catch-up or renewed deadlines. Those outcomes falsify S2. - Provenance: the linked [research's confirmed user decisions](../../Research/2026-10-15-spawn-director-and-squad-coordination.md#confirmed-user-decisions) motivate credit-funded groups, visible/hidden births and a reaction window. This companion's latest bounded-saving and trusted-origin post-review decisions control implementation when older spawning requirements conflict. Reference-game descriptions are not balance evidence. - Risk: high authority/lifecycle/shared accounting. Independent technical, gameplay and UX pre-reviews (Sol 6.1 Medium) agree on separate health-valid/action-ready context, exact member tiers, trusted-origin provenance, settled per-member state and separate cue geometry. Fresh independent post-reviews will inspect the integrated result; lead is sole writer. - Human timing: user chose **at the end**. Human readability/feel remains separate acceptance. - Baseline: `aa22b26b992ff42a364727d2332648f0bd40b138`. Preserve dirty parent and untracked companion/research; commit only S2-owned changes. Reuse S1 interfaces, not its evidence as fresh S2 proof. Preserve scenes/terrain/NavMeshes/GUIDs/settings/package pins. - Planned checks: meaningful RED ledger/scheduler and native arrival/placement cases, exact discovery after import, final full EditMode and affected full native fixture union; actual host/two/four-peer arrival ordering under applied latency, normal/debug/release builds and exclusions, affected retained session/menu checks. Human/hardware/separate-network limits remain explicit. Full spawning assemblies/independent-process director campaign belong S4. - Duration unknown until native discovery/timing. Escalate authority, lifecycle, physical clearance, financial/identity or cue-ordering failures; never relax assertions or rebuild manual geometry. Stop after S2's concrete proof/record/local commit; later boxes stay unchecked. - Ruling: arrival state is replicated by existing `PrototypeEnemy` rather than adding a conditional NetworkBehaviour to registered prefabs. A separate cue component reads it; legacy births retain immediate readiness. This preserves NGO component ordering/GUIDs. - Ruling: the ledger's pure verified-identity transitions are internal trusted-owner seams; public actual-actor commit validates the native actor. Opaque boss/death authorizations have no public constructors. Controlled rules tests exercise internal transitions separately from native proof; no public arbitrary bypass flag is introduced. - Implementation: `EnemyAdmissionLedger` owns distinct admission/purchase IDs, immutable member definitions, captured prices and terminal member state; `EnemySpawnScheduler` is encounter-ticked with one fixed saving intent, one pending group and future opportunity / member deadlines. `PrototypeEncounterDirector.CreditSpawning.cs` owns the explicitly enabled development path and blocks all legacy/untracked birth paths while enabled. Original 40-kill progression stops exploration; actual boss entry/reinforcement stays S3. - Placement: ordered captured Normal/Elite members use the existing bounded selector and native clearance/ground/mesh/complete-route checks. Director births allow visibility while retaining all-player minimum separation and at least one nearby reachable participant. Ledger records are the sole coarse pressure source; children inherit their parent's region, faction and group. Parent capacity remains held through its synchronous finite descendant decision, with final settlement when no child is valid. No actual splitting is installed. - Arrival: `EnemyArrivalState` and `EnemyArrivalPresentation` add an immutable replicated birth/deadline and four retracting pale vertical brackets. Existing actor NetworkBehaviour order is retained. Health/status/Scan and initialization remain usable; Bolt preparation / release, movement/observation and direct tracked/ballistic launch guard the shared readiness. Death/despawn ends that lifetime, and a reused native object must capture a fresh deadline. Existing projectile flight, health/damage scaling and reward ownership remain unchanged. - Authoring: supported Editor creation added three explicit cards, two mixed templates and an exploration profile under `Debug/EnemyBehavior/SpawnDirector/ArrivalFixture`. These are opt-in, with passive melee and the previously accepted isolated OrdinaryShooter (Normal / Elite), not restored production roster abilities. The sandbox's director launch/reset route builds only temporary broad ground/NavMeshData, restores normal navigation when switching into scripted/manual scenarios and cleans up on Stop. Saved scenes/navigation are untouched. - Provisional editable tuning: 10 credits/s, 100 ceiling, 20 initial balance, 4 s opportunity, 16 nonboss slots, .25 saving probability / 12 s window; .4 s member stagger, 20 s pending lifetime and 1.25 s arrival. Arrival cards use melee/shooter 10/1 and elite shooter 30/.25; templates cost 20 or 40. Controlled tests override these values for discriminating cases; none is accepted balance. S1's wider passive-roster inventory and difficulty scaling remain. - Compatibility: added NetworkVariable / encounter snapshot bytes require protocol **12**. RED migration assertions exposed saved protocol 11; supported `UpgradeProtocol()` changed only the app-root version, retaining GUID `38b57d87ab30cbf44bfb5bbd09cd7496` and component IDs. Saved MainMenu inherits 12 with one correct source manager and no protocol override. Current debug/owner harness expectations match; historical evidence/protocol examples are preserved. - Independent post-review: technical/Ponytail, gameplay and design/UX (Sol 6.1 Medium) inspected the integrated source. Gameplay found director → scripted mode/navigation leakage; native RED reproduced it, both entry points now clear director mode and the transition to disconnected-ground/manual passes. Technical delta reviews clear expiry, direct service readiness, synchronous descendant settlement, native reuse and required protocol migration. Design inspected actual isolated peer bracket PNGs and found no source/render blocker. These reviews are separate from automated proof and human readability acceptance. - Final freeze: source/assets/settings identity `851A8066401C660A4E92D0F8DC3E4583AA790144C0D62B6C8EFCB18871D2A0EE`. Exact positive discovery: 1,202 EditMode leaves and 282 affected native leaves across 14 complete fixtures, retained under `TestResults/spawn-s2-final-1792038983987/`. A single operator owns the serialized frozen verification batch. Final results follow below. - Retained failure / bounded recheck: the native union finalized **260 pass / 22 fail**, all 22 in the retained tracer fixture. Its setup disabled `PrototypeEnemy`, which invalidates readiness through the established `OnDisable`; the new direct launch guard correctly refused it. A reviewed test-only correction keeps this passive actor enabled, explicitly requires no autonomous Behavior host and requires valid readiness. All projectile combat assertions and the manually ticked service clock remain. The complete tracer fixture is rechecked; the failed union is retained and never renamed GREEN. - Repair compatibility: file inventory proves only `EnemyTracerCollisionTests.cs` changed among 1,613 source/assets/settings files. Runtime `ProjectI.Foundation.dll` and the EditMode assembly hashes remain byte-identical. The 228 other native cases and 1,202 EditMode passes retain their original identity as compatible proof, not fresh final-source runs. The new build/recheck identity is `8CE3DA880BEB30EA8B166B4CE2F8A384BD303E355CFE3EF935830A1726394B50`; `tracer-repair-compatibility.json` and `after-repair-selection.json` retain the exact delta. - Remaining integration limits: S3 must own boss/profile transitions and hostile cleanup; M13 must perform bounded local child placement and install the death capability. Isolate a throwing future `DirectorParentDeath` subscriber so it cannot interrupt progression/reward settlement. S4 must measure historical-ledger enumeration/allocation cost before promotion and prove independent-process purchased-group arrivals; C1 will update coarse commitments. No production activation, difficulty UI, coordination, natural-campaign rerolls or new dependency pins. Human end-checkpoint readability/feel, hardware and separate-network acceptance remain open even after a scoped local checkpoint commit. ### S2 evidence and end checkpoint All paths are repository-relative. Runner directories below contain the primary final JSON, XML and text; exact discovery/execution sets match, terminal callbacks match, and there are zero skips/conflicts. Earlier RED/checkpoint results are provenance, not final coverage. | Evidence under `TestResults/foundation-runs/` | Actual outcome | | --- | --- | | `spawn-s2-ledger-red-c9c6af0d46154a16b0c39e4f10228c5a` | 1 pass / 6 fail: reservation/settlement RED. | | `spawn-s2-scheduler-red-ledger-green-72465fef849d44e19e25e057d25f3322` | 8 pass / 3 fail: ledger GREEN, scheduler RED. | | `spawn-s2-arrival-red-df42e2fcadf748daa2782ea6456cdfeb` | 2 pass / 2 fail: actual early Bolt/observation accepted before guards. | | `spawn-s2-rules-focused-b832bbd5cef14355bc7274d9e50d556e`; `spawn-s2-native-focused-fc1a2bc3b8194c67983c4b86fea70f14` | 15 rules / 8 native passes at their recorded intermediate source. | | `spawn-s2-expired-commit-red-48d59db3ce864cf4a7e5fdabf78b136b` | 0 pass / 1 fail: native public commit accepted expired purchase; fixed. | | `spawn-s2-peer-and-service-red-76cdb9efa8f241ff961f50a004794ba9` | 13 pass / 2 fail: both direct projectile service entry points bypassed arrival; fixed. | | `spawn-s2-atomic-death-red-fb3217919a784c8da2a884214dc03c88` | 10 pass / 1 fail: parent slot released before descendant settlement; fixed. | | `spawn-s2-sandbox-switch-red-c7be7401a6c6400ead21164fb623824b` → `spawn-s2-sandbox-switch-green-5f0fa04ae90b4286aa1d3fbdd0f09807` | 0/1 RED → 1/0 GREEN. RED also retains cleanup error. | | `spawn-s2-native-completion-47495b5f92934c599b70c2fef49aa857` | 17 pass / 2 fail: native reuse retained arrival configuration (fixed); front/side/rear test incorrectly recaptured a distinct settings identity (fixture corrected). | | `spawn-s2-rules-completion-5bd7c791ee494614a26c1689c9ee365f` | 77 pass / 2 fail: legacy reflective one-argument world constructor compatibility restored; invalid zero-income/unfunded test setup corrected without changing finance validation. | | `spawn-s2-protocol-red-4fb61fb7c37e4901acfe23142b733216` | 10 pass / 2 fail: code/source/menu still 11; supported protocol 12 migration fixed this. | | `spawn-s2-final-editmode-77fa30c8a27b47b1a31682cad6a5e684` | **1,202/1,202 pass**, 44.581 s, one genuine reload. Source `851A…A0EE`, compiled `A4B972A5E32BBEA9C60167239664E70B47D402F9FF2950020B6C2BC04C706077`. Reused after the single test-only repair as described above. | | `spawn-s2-final-native-76bedb4fd7fa4c0fbeb40a1dbfcb3936` | **260 pass / 22 fail** of 282, 437.009 s. Compiled `5DD3B67EB8B303020126D7469759EEB35604DD8D1F6A407627FDC80F258C5AB8`. Retain **228 unchanged non-tracer passes**; no GREEN282 claim. | | `spawn-s2-final-tracer-recheck-a1bb5ce262de4c2187707c61de00e4ab` | **54/54 fresh pass**, 49.139 s, source `8CE3…4B50`, compiled `D194AEC703E2555381AA0BFE19D0CACFDE421FE227189513E175D637F3C4DDC4`. Completes 282-case coverage with the compatible 228. | | `spawn-s2-common-clock-two-b493e82ca0134ce5815b54f3fa758098`; `spawn-s2-common-clock-four-4077715925104334b1047eac89df9d02` | **1/1 each fresh pass**, 7.047 / 6.502 s, source `8CE3…4B50`, same final compiled identity. Narrow remeasurement, overlapping existing arrival cases. | **Final build/identity root:** `TestResults/spawn-s2-final-1792038983987/`. Normal/Debug/Release succeeded with zero errors, unchanged source/settings and no unexpected packed fixture assets. GUIDs are `0cfcd54d56054684970cd420962d65cc`, `738c0ca080fe49bb994e494009feed3a`, `a2a7a795d7d0416d88a942b5307b3bd1`; elapsed 87.341 / 21.405 / 64.336 s, warnings 640 / 640 / 775 retained in reports. `build-audit.json` retains actual executable, managed, complete-data and player-source hashes. Editor authoring is absent from players; SpawnDirector fixture assets are absent from all three; release fixture assembly is empty except its module and cue diagnostic members are excluded. A strict empty-list helper error was corrected in the ignored audit script, not product code; `helper-error.txt` preserves it. CLI/delegate/obsolete-API observer compilation rejections started no tests and changed no source; corrected ignored observers ran with unchanged inputs. **Retained player regressions:** controlled evidence contracts **24 passed**. `TestResults/debug-arena-3592698c574e4db49cb90dac779ddb31` (two, 41.592 s) and `debug-arena-68b87740902b4214be94b2a870726047` (four, 43.600 s) passed with applied 75 ms delay / 15 ms jitter / 1% loss, two resets, real combat, intentional failure proof, remote disconnect, host-session loss and rehost. Normal build `main-menu-ced7ffc6fda9484ea611ee23c9bfa4d9` passed all ten phases (115.857 s); `encounter-polish-b6aafdd5c03e48fa986a4e188393fdb9` passed 23 VerdantInitial phases including two/four-player progression and a clean rehost (480.837 s). All cleanup errors are empty and owned process exit was confirmed. These are retained game/session regressions, not the S4 independent-process director campaign. **Reaction measurement:** initial peer records used each client's estimated server clock. The added observers sample the authoritative host clock **after all peer PNGs have actually rendered**, yielding conservative ready-deadline lead **0.944332 s (two)** and **1.041826 s (four)**. Applied transport parameters are read back; host preparation/release occurs after readiness. Primary records: `host-clock-2-2e69332ad26442bdb447ed6eae368a31/result.json` and `host-clock-4-e1ea9cc7714246e1a20717ff3bb60a81/result.json` under the final root. Their native exports are `TestResults/spawn-s2-peer-cue-2-a86f4dee5e7e40ec866e0cc83e336236` and `spawn-s2-peer-cue-4-48af0af6df2245f5bcf54071b35cc1e4`. This closes the clock-offset ambiguity; it establishes opportunity/order, not human detection. Peers share one Editor process with duplicate client physics disabled. Purchased-group independent-process/separate-network acceptance remains S4/external work. **Actual manual/geometry observation:** safe `LaunchDirector`, reset and Stop/restoration ran. `manual-native-budget.json` records eight complete native routes exhausting the shared budget, a mixed Normal/Elite preflight deferred specifically for Budget, continuation with two native queries, and rejection at the original 0.5 s controlled deadline (54 observed frames). `manual-arrival-render.json` and `manual-arrival-20m.png` / `manual-arrival-60m.png` capture a real purchased shooter, full body and brackets during arrival on temporary ground. `manual-stop.json` records zero actors/listening sessions; `manual-final-editor-state.json` confirms stopped/compiled/idle Editor, clean saved PlayTestScene, restored true/3 play settings, zero managers and unchanged final source. No saved terrain/navigation or GUID was changed. **Historical pre-sign-off End checkpoint.** Independent design delta review found the 20 m body framing clear, but could not reliably distinguish pale brackets against the bright horizon at 60 m/native 1280×720. This is a concrete contrast/angular-size concern; a still cannot choose the correct motion/contrast tune. The human gate remained open until the explicit user sign-off above. Open **ProjectI > Debug > Enemy AI > Shooter sandbox**, select **S2: reserved groups and readable arrivals**, and check the 1.25 s cue at 20/60 m, bright horizon, front/side/rear, mixed stagger and overlapping faction/status/charge visuals. Shoot during arrival; use **F5** to reset and **Stop sandbox / restore Editor scenes** afterward. If far cues are missed, tune contrast/outline or minimum apparent stroke and recheck the affected proof. No mid-run human response was required under the user's End choice. **Closure ownership:** S2 owns the new ledger/scheduler/director partial, two presentation files and metas; arrival settings, actor/context/Bolt/projectile/movement/snapshot/selector seams; fixture driver/window/authoring and ArrivalFixture assets/metas; four new fixtures, focused additions to spawn-circle/scenario/protocol tests and the retained tracer setup; protocol migration constant/app-root field/current harness expectations; catalogue/current brief. Companion/research and the pre-existing parent-plan diff remain excluded from staging. Only S2 implementation items are checked. S3/S4/C1–C3 and M6-SPAWNING-READY remain unchecked. Staged scope is 49 files. Source/docs/tools/data/prefab whitespace checks pass; the all-path check reports 15 trailing spaces only on the five new Editor-generated asset/folder metas' empty userData/assetBundle keys. Preserve those imported bytes/GUIDs rather than rewriting frozen metadata for style. No generated test scene, build/cache or planning/research file is staged. **Measured duration / decision:** this machine's full pure run is about 45 s, native union about 7.3 min, targeted tracer repair about 49 s, three builds about 2.9 min, retained network/menu/stage checks about 13 min, plus discovery/import/manual/review time. Future duration/hardware cost is not guaranteed. Keep this isolated implementation for the End human check; no production/dependent promotion. **Local closure:** commit `4c9732b0ab06015044fcb30f9f5e04708ab27d8a` (`Add reserved enemy admissions and arrival readiness`) contains exactly the 49 reviewed S2-owned files. Final technical/Ponytail staged review clears checkpoint closure, with human readability explicitly open. No push. The index is clean; only the pre-existing modified parent plan and untracked research/companion remain. This companion execution record is deliberately outside the commit, as requested. Stop after S2; S3 is the next implementation owner only after the applicable acceptance/authorization, not an automatic continuation. ### S1 execution — 15 October 2026 - Scope/owner: lead implements only captured director definitions, pure credit/selection rules, explicit mixed-template capture, run-owned read-only inputs and opt-in authoring fixtures. No births, reservations, scheduler, production activation or restored roster abilities. - Hypothesis: fixed captured inputs and seed produce finite reproducible, affordable ordinary choices or reachable expensive saving proposals; source mutation cannot change those choices. Invalid/oversized/incompatible selections or hidden mutable inputs falsify this rules gate. - Risk/reviews: conservative high-risk review coverage for the future financial/identity seam; independent technical, gameplay and design/authoring pre-reviews completed (Sol 6.1 Medium). All endorse separate legacy/template contracts, deep snapshots, stage-roster inputs and no performance adaptation. Lead is sole writer; all three cleared the integrated result and compact corrections. Reviews are source inspection, separate from automated proof. - Human timing: not applicable, explicitly non-playable S1. Duration unknown until import/checks. - Preservation: initial HEAD `21bd4aadf2aa17b2b59fd96e24827273cfc17059`; pre-existing dirty parent plan and untracked companion/research are excluded from staging. This record remains in the untracked companion as requested, rather than committing those earlier planning documents. - Checks selected: meaningful RED then exact discovered S1 fixtures; retained roster/composition, legacy pacing/spawning and run rules; full EditMode once frozen. Runtime compilation changes require normal/development-debug/release builds with exclusion audits. Native births, peer arrivals, gameplay balance and S2 transitions are outside this rules-only gate. - Ruling: new ordered template card/tier bindings are separate from legacy `Valid`; preserve existing prefab-only assets and GUIDs and author opt-in director copies through the Editor. - Ruling: saving proposals are valid through the original deadline (inclusive); S2 must check funded eligibility at that opportunity before expiry, and prove opportunity/cancellation/ catch-up transitions itself. S1 tests for those named contracts prove immutable inputs only. - Stop: validated S1 choices and evidence, required post-reviews, scoped owned local commit; leave M6-SPAWNING-READY and all S2–S4/C1–C3 boxes unchecked. **Implemented files:** `Assets/_Project/Features/Enemies/Encounters/EnemyDirectorDefinition.cs`, `EnemyDirectorRules.cs`, `EnemyGroupSelection.cs`; narrow additions to `EnemyRosterCatalogue.cs` and `Coordination/EnemyCompositionDefinition.cs`; `Features/Runs/RunDirectorInputs.cs` plus `RunRules.cs` / `PrototypeRunDirector.cs`; `Editor/EnemyDirectorFixtureAuthoring.cs`; three EditMode fixtures (`EnemyDirectorRulesTests`, `EnemyGroupSelectionTests`, `RunDirectorInputsTests`); the opt-in `Debug/EnemyBehavior/SpawnDirector/` asset set and Editor-created metas; `Docs/TEST_CATALOGUE.md`. No scene, existing prefab/definition/composition asset, network registry, terrain, navigation, package pin, health/damage rule or reward implementation is changed. **Final contracts/refinements:** stable `typeId` binds one real prefab across explicit tiers; the three Standard-archetype prefabs therefore remain distinct composition types. Hard rules are symmetric type pairs, used only for procedural assembly. Directed positive soft factors apply once per distinct selected type, including across tiers; logarithmic draws avoid multiplied weight overflow. Captures validate registration, native envelope, member bindings, common eligibility, affordable complete enabled modes and reachable profile ceilings. Procedural work is bounded to 65,536 search nodes per request; exhaustion returns no choice, with no mode fallback/truncation. This is a rules bound, not a measured scheduler frame budget. `TryChoose` is the ordinary affordable entry; `TryCreateSavingIntent` alone uses the future ceiling/reachable balance. It deliberately does not roll the profile's saving probability: that probability is a captured S2 opportunity input. An intent owns no balance/capacity. Run inputs use host-captured difficulty (default 1), run/stage identity, stage roster count and Active-only accumulated minutes; old run-duration/result/network schema stays unchanged. Compatibility and income do not read health, kills, damage, Unity Random or live actor globals. **Actual authoring inventory:** all fourteen selected cards are passive roster purchases, not restored combat/support/splitting. Normal and Elite reference the same registered prefab; the explicit tier selects its captured envelope. Each prefab is registered once in `Assets/DefaultNetworkPrefabs.asset`; `Enemy network prefabs.asset` remains empty. Native settings validate Normal `0` (radius/height .5/2) and Large `-1372625422` (.9/3.3). This establishes bindings and sufficient baked-agent settings, not live route coverage on a scene. | Prefab under `Features/Enemies/Authoring/` | Normal cost/weight | Elite cost/weight | Normal / Elite agent | Normal / Elite clearance radius × height (m) | | --- | --- | --- | --- | --- | | `Melee Drone.prefab` | 10 / 1 | 30 / .25 | Normal / Large | .2025 × .43875 / .273375 × .5923125 | | `Ranged Drone.prefab` | 10 / 1 | 30 / .25 | Normal / Large | .45 × 1.8 / .65 × 2.4 | | `Bombardier Drone.prefab` | 18 / .5 | 54 / .125 | Normal / Large | .45 × 1.8 / .65 × 2.4 | | `Roster/Tether Keeper.prefab` | 20 / .4 | 60 / .1 | Normal / Large | .45 × 1.8 / .6075 × 2.43 | | `Roster/Lancer.prefab` | 25 / .3 | 75 / .075 | Normal / Large | .45 × 1.8 / .6075 × 2.43 | | `Roster/Bulwark.prefab` | 25 / .3 | 75 / .075 | Large / Large | .6 × 1.8 / .81 × 2.43 | | `Roster/Splinterbeast.prefab` | 20 / .4 | 60 / .1 | Large / Large | .55 × 1.1 / .7425 × 1.485 | All fixture gates are unset (all valid stages, nonnegative active minutes, positive captured difficulties and 1–4 participants); bounded gate behavior is tested independently. The child uses dedicated agent `-334000983` and is excluded; Pulse/Siege bosses use Large and are excluded. The accepted isolated OrdinaryShooter fixture is not a director card, so no roster capability restoration is implied. The twelve copied templates are Bulwark escort, Keeper escort, Lancer escort and Splinter pack, each in HollowKnights/Riftborn/ScrapSeraphs. Their exact ordered members and factions compare equal to the designated valid legacy originals; copies bind Normal cards explicitly. `mixed-scouts` orders Normal melee then Elite ranged (40 credits). No compatibility ban or soft preference is installed in these default fixture assets. Exploration tuning is 10 credits/s, ceiling 100, initial 20, interval 4 s, admission 16; boss-add tuning is 3/s, ceiling 60, initial 0, interval 8 s, admission 6. Both use mode weights 1/1/1, single size 1–5, procedural 2–5, saving chance .25 and original 12 s window. Specialist limits remain independently two Keepers/two Lancers including pending/candidate members, with one Keeper per template. Elite Lancer/Bulwark cost 75 intentionally cannot be bought by the 60-credit boss profile. All values remain editable provisional tuning, **not balance acceptance**. The create menu now refuses existing fixture assets before any mutation, preserving Inspector edits. **Review outcomes:** independent pre/post technical/Ponytail, gameplay and design/authoring reviews (Sol 6.1 Medium) clear S1 after compact delta rechecks. Four blockers were reproduced and corrected: ordinary future-credit spending, specialist integer overflow, intermediate income overflow before a reducing difficulty factor, and create-menu tuning overwrite. Actual specialist template/pending limits received additional proof. No optional refactor or later milestone was added. **Observed checks (not historical reuse):** | Evidence | Actual result / limits | | --- | --- | | Initial RED: `TestResults/foundation-runs/spawn-s1-red-9b16c7c052394c4aa6211b66b3f796c5/` | 28 exact leaves, 8 pass / 20 fail, zero skips. Placeholder accrual/selection/saving failed; two pool-reference setup failures were repaired explicitly. This is failed evidence, not a pass. | | Rules/clock checkpoint: `spawn-s1-rules-green-clock-red-d48a9861d76546db8bfe4d38dc0cb29a/` under the same root | 30 leaves, 27 pass / 3 fail: two expected clock placeholders and one exact-floating comparison, corrected with numerical tolerance. One earlier unready request was rejected before execution; no result was claimed. | | Focused checkpoint: `spawn-s1-focused-06bf6e650d68488a9500cef1f064f267/` | 147/147 pass, zero skips, 6.837 s execution, before review fixes. Includes retained legacy roster, geometry, identity, pacing and run anchors. Not reused as final-source proof. | | Review RED: `spawn-s1-review-red-ac44d4ca28074f6ebd21330dfbfbb12b/` | 48 leaves, 43 pass / 5 fail, zero skips, 4.540 s. All four reported defects reproduced (specialist has two tier-independent cases). | | Frozen full EditMode: `spawn-s1-final-editmode-c91460d29fc340788560165662e17ef3/` | **1,180/1,180 pass**, zero failures/skips, 1,180 unique expected/executed leaves, one genuine stopped-session reload, no conflict and matched terminal; 57.813 s execution. Includes all **51 S1 leaves**, with corrected review regressions. | | Saved authoring: `TestResults/spawn-s1-final/authoring-inventory.json` | Editor capture validates 14 cards/13 templates/2 profiles and exact twelve-copy member/faction equality. No native spawning/route/ability claim. | Final source identity: `F51BCA09E4AA70328A38365F1D1D9B54CFC5E573E830A1298D485B6EF4DBEE99`; full EditMode compiled identity: `82EA2CE948643C6AD2883E206AA1F426694E3644AE95B678FF959C6758C2235F`. Initial CLI discovery returned empty while imports were pending; it is not positive proof. All accepted runs use the runner's exact, positive current discovery before execution. A compiler alias collision with the existing `ProjectI.Settings` namespace was fixed; no upgrade or assertion weakening was used. Unity launcher sandbox access required approved external connection execution; no gameplay or paid service was involved. **Frozen build/exclusion proof:** all three native Windows builds succeeded with zero errors. Each unique `TestResults/spawn-s1-final//` contains the native summary, retained `LastBuild.buildreport` and packed inventory; `build-audit.json` binds executable, managed assembly and complete built-data hashes through the existing TestEvidence helper. Source before, after and final Editor capture equals the frozen full-EditMode identity above. | Variant | Build GUID | Native duration / warnings | | --- | --- | --- | | Normal development | `75bae1b1cc3e4e6f92473bbd18beb68c` | 115.399 s / 635 | | Debug development | `a3e53eaa5274468c8559f9224d96bb80` | 27.248 s / 640 | | Release | `b3d6a1b2de05484789664d01e8c49be8` | 65.210 s / 769 | No S1 fixture asset is packed in any build; Editor authoring is absent from player assemblies. Release's fixture assembly has no executable types. The first broad release path audit incorrectly treated seven **pre-existing `.cs` MonoScript metadata paths** as executable fixtures; its failing summary is retained. Corrected asset/type inspection passes without rebuild or source change. The first audit serializer also failed on an empty release type array under StrictMode; original script/error and corrected script are retained. Normal build's CLI caller timed out after native success; native final report and a subsequent idle/stopped Editor check established completion before the Debug build. No duplicate build was launched. Warnings were retained, not repaired outside scope. `authoring-final.json` records each selected prefab GUID, explicit tier, type, cost/weight, eligibility, registration count and native envelope, plus every ordered template and both profile snapshots. `final-editor-state.json` confirms clean saved PlayTestScene, no Play Mode, build, compilation/import or active test request. Existing scenes, terrain/NavMeshes, registry, GUIDs and package/settings pins remain unchanged. No player processes were launched. **Decision:** keep S1 as validated, inspectable opt-in rules/authoring. All six S1 checklist items are supported by the final 51 S1 cases inside full 1,180-case proof, the twelve-copy authoring comparison, three builds/audits and independent delta-clear reviews. This accepts neither balance nor scheduling/birth/gameplay behavior. Scoped local commit includes S1-owned code/assets/metas and catalogue only; this companion execution record stays untracked alongside the pre-existing planning/research work, by the user's explicit exclusion. No push. Staged inspection confirms 52 owned paths and exact verified working/index contents; no plan, research, build/cache, package/settings or unrelated edits are staged. Code/docs/assets pass whitespace inspection. The general checker reports only Unity-generated `.meta` empty-key trailing spaces; those supported-Editor bytes/GUIDs are preserved rather than rewritten after proof. Local closure commit: `aa22b26b992ff42a364727d2332648f0bd40b138` (`Add validated enemy director composition rules`). Post-commit status contains only the pre-existing dirty parent plan and untracked research/companion; the index is empty. No push. **S2 handoff/limits:** consume captured settings and run inputs on the server, with one owner of RNG/bank/reservations. Advance scheduler-owned RNG even after a failed choice (the S1 result only returns updated RNG on success). Apply the .25 chance at normal opportunities and hold one immutable candidate through its inclusive original expiry; recheck identity/eligibility, funding, current live-plus-pending capacity and geometry before reservation. Prove cancellation returns only at the next opportunity, ordinary-first recovery, one purchase/no catch-up, partial refund and arrival readiness in S2. Named S1 scheduler cases prove only immutable inputs/no side effects and cannot close those transitions. No PlayMode birth, built-peer, human feel, balance, representative hardware or separate-network claim is made; those gates remain with their actual consumers/S2–S4. No historical evidence is used as fresh proof. Planning record, 15 October: read accepted research, current status, M6/affected downstream contracts, spawning/perception/graph seams, testing procedure/catalogue and dependency pins. Updated only this companion and the parent M6 section. No runtime, asset, test, Editor, package or build changes; no implementation checkboxes are complete. The pre-existing research file remains unchanged and uncommitted. Original document review: local links and heading anchors resolved; the parent was unchanged outside M6; its first unchecked item was the S1–S4 handoff; all companion implementation boxes remained unchecked. Whitespace inspection passed. Self-review clarified one ledger owner for accrual, explicit selection context and template tiers, pending specialist capacity, diagnostic consumers and the actual built-peer verification route. No gameplay checks were run. Post-review amendment, 15 October: the user authorized plan corrections, deliberate bounded saving and the clarified boss/child exceptions recorded above. Independent read-only technical, gameplay and design/UX delta reviews cleared the companion's admission origin, eligibility, no-backlog, boss-start, saving and pressure-accounting changes. Parent M6 and the directly affected M13/M14/M17 paragraphs are reconciled; milestone numbering/split and the single first-M6 spawning prerequisite remain. Original historical records/research stay unchanged. Proposed bank, timing, scoring and saving-probability numbers remain provisional; all implementation gates are still unchecked. No implementation, tests/builds, Unity operations, staging or commits occurred. For each later milestone append: scoped files; source/profile/build identity; RED and final focused/integrated manifests; review outcomes; actual gameplay; elapsed time; reused evidence and its limits; omitted/pending gates; keep/tune/revert and next owner. Keep detailed results here, with only the corresponding completion summary/link in parent M6. Do not claim prior passive/historical evidence as active director or coordination proof.