# Slice K2 — deterministic scheduler and bot parity closeout **Date:** 2026-07-27 **Implementation:** `38e83640d907ee3e0819f3b38ca117ca60914d6b` **Status:** COMPLETE ## Outcome Graphical and headless clients now drive the same Runtime-owned local-player frame sequence, movement controller, action owners, typed commands, and ordered event stream. Headless is not a second gameplay implementation and does not poll mutable App state. One monotonic `HeadlessProcessScheduler` owns absolute deadlines for every configured session. Due sessions execute in stable configuration order, long pauses use bounded catch-up while preserving elapsed time, and reconnect quiescence is an absolute deadline rather than a blocking sleep. ## Shipped mechanisms - Complete generation-gated direct command coverage for selection, use, appraisal, pickup, combat, spell casting, sustained movement, stance, inventory shortcuts, spellbook state, advancement, character options, social state, chat, and recalls. - Exact object selection and persistent movement intent are first-class typed commands shared by graphical and headless consumers. - `RuntimeLocalPlayerFrameController` owns retail's pre-network object phase, inbound barrier, and post-network AutonomousPosition phase. App is a thin graphical adapter; headless uses the same controller with no render mirror. - Runtime-owned hostile-target query and retail spell-target policy are presentation-independent. - Runtime remote-physics wall-clock reads use the instance `TimeProvider`. - Headless combat and magic operations route through the same canonical action owners and live `WorldSession` as the graphical client. - The lazy event hub now publishes combat-state outcomes in addition to lifecycle, entity, inventory, chat, movement, portal, and command outcomes. With no subscriber, it attaches no gameplay callbacks. - Accepted inbound work remains serialized inside each session's Runtime turn; bot policy runs after inbound, post-network position, and combat simulation. The synchronous Core.Net connect handshake retains its bounded wall-clock timeout and retail/ACE 200 ms ConnectResponse race suffix. It is outside the steady scheduler, creates no per-session thread, and is not used for movement or packet cadence. ## Deterministic gates - Absolute-deadline stable-order execution for multiple sessions. - Bounded catch-up with exact elapsed-time preservation. - Monotonic reconnect deadline without a blocked scheduler. - 100,000 idle pre-deadline dispatch probes: zero turns and zero managed allocation. - Graphical wrapper versus direct Runtime local-frame trace equality. - Headless packet order: MoveToState before AutonomousPosition. - AutonomousPosition cadence remains elapsed-time based at the retail one-second boundary; unchanged movement emits no duplicate MoveToState. - Stale generation movement and selection commands are inert. - Horizontal/vertical landblock target distance and hostile-only filters. - Combat-state and command outcomes share the generation-stamped ordered event sequence. ## Automated gates - Runtime: 411/411. - Headless: 31/31. - App: 3,732 passed / 3 intentional skips. - Complete Release solution: 8,744 passed / 5 intentional skips. - Release build succeeds. The 17 warnings are pre-existing nullable/analyzer warnings in Core test fixtures; the changed projects build without warnings. ## K3 carry K3 introduces a process content owner with exact leases: - one mapped `acdream.pak`, synchronized DAT access, and immutable lookup tables per process; - per-session physics engine, mutable cache/bookkeeping, body graph, scratch, command state, and diagnostics; - content-backed local-player physics/spell hydration in headless sessions; - 1/5/10-session isolation, same-GUID, reconnect, and policy-fault gates. ## Rollback The scheduler foundation landed separately: ```text git revert 7e8acb74dd20931d5ba88430fd100cd074a32e4d ``` The K2 parity cutover is: ```text git revert 38e83640d907ee3e0819f3b38ca117ca60914d6b ```