diff --git a/docs/plans/2026-07-25-modern-runtime-slice-i.md b/docs/plans/2026-07-25-modern-runtime-slice-i.md index cb7d4122..27d97196 100644 --- a/docs/plans/2026-07-25-modern-runtime-slice-i.md +++ b/docs/plans/2026-07-25-modern-runtime-slice-i.md @@ -3,7 +3,7 @@ **Status:** I0-I5 COMPLETE - retail oracle, zero-allocation transition scratch, deterministic immutable collision records, complete prepared package, exact flat traversal, dual publication, and connected shadow gate; -I6 active +I6 production cutover committed; visual/correctness acceptance active **Parent:** `2026-07-24-modern-runtime-architecture.md`, Slice I **Purpose:** remove parsed DAT object graphs and steady collision allocations without changing one retail collision decision, float, comparison, or traversal @@ -272,6 +272,25 @@ Gate: trajectories and collision fixtures remain bit-identical, package-only startup succeeds, and retained-memory accounting shows no parsed collision DBObj graph after stable world reveal. +**Production cutover landed 2026-07-25 at +`068a06518dd710ca5e7f166754cbb7789ca1ed0f`.** Gameplay is now +flat-authoritative, package publication is strict, and the parsed graph runs +only as a sampled referee. The exact rollback for this cutover is: + +```text +git revert 068a06518dd710ca5e7f166754cbb7789ca1ed0f +``` + +Do not revert I3–I5 package/publication work. The pre-visual automated gate +passes 8,402 Release tests / 5 skips and a strict dense-Arwic connected run +with 46,309/46,309 exact graph-referee matches, zero mismatch/fault/artifact, +and graceful shutdown. Production-like uncapped dense Arwic (15,530 entities, +no automation oracle) sustained roughly 190–200 FPS with stable CPU p50 +~5.0 ms / p95 ~5.9–7.3 ms and GPU p95 ~2.1 ms. Evidence: +[`../research/2026-07-25-slice-i6-flat-production-cutover.md`](../research/2026-07-25-slice-i6-flat-production-cutover.md). + +Parsed-graph removal remains gated on the user correctness/visual pass. + ### I7 — allocation, soak, and documentation closeout 1. Measure capped and uncapped resolve allocation separately for player, diff --git a/docs/research/2026-07-25-slice-i6-flat-production-cutover.md b/docs/research/2026-07-25-slice-i6-flat-production-cutover.md new file mode 100644 index 00000000..2b9da10c --- /dev/null +++ b/docs/research/2026-07-25-slice-i6-flat-production-cutover.md @@ -0,0 +1,98 @@ +# Slice I6 — flat production collision cutover + +## Result + +Commit `068a06518dd710ca5e7f166754cbb7789ca1ed0f` makes the immutable +prepared collision representation authoritative for gameplay. The parsed DAT +graph remains temporarily resident only as the automated differential referee. + +Production now: + +- creates its `PhysicsDataCache` through the explicit production factory; +- fails publication when a required prepared GfxObj, Setup, CellStruct, or + EnvCell topology record is genuinely absent; +- accepts idempotent publication when that flat asset is already resident; +- returns flat results even when the graph referee disagrees; +- uses flat containment for the unified cell graph; +- uses flat polygon tables for nearest indoor floor lookup; +- derives live/static BSP shape bounds and camera diagnostics from flat data. + +Graph-only cache construction remains an explicit test/tooling oracle seam +until the post-acceptance deletion commit. + +## Exact rollback + +```text +git revert 068a06518dd710ca5e7f166754cbb7789ca1ed0f +``` + +Do not revert the I3 package schema, I4 traversal, or I5 dual-publication +commits. + +## Automated conformance + +- Release build: pass. +- Complete Release solution: 8,402 passed / 5 skipped. +- Warm flat traversal: 0 B. +- Reused resolver scratch across player, remote, projectile, camera, and + grounded mover families: 0 B/resolve. +- Retained render hot-path allocation fixtures: pass. +- Flat-authoritative mismatch fixture proves the graph cannot change gameplay. +- Production publication fixtures prove missing prepared data fails and an + already-resident prepared asset remains idempotent. + +## Connected strict-publication/referee gate + +Evidence: +`logs/connected-dense-town-20260725-165758.report.json`. + +- PASS with graceful authoritative logout and `WM_CLOSE`. +- Dense Arwic: 15,530 entities / 111 animated. +- Collision referee: 46,309 queries, 46,309 exact matches. +- Mismatches: 0. +- Referee faults: 0. +- Mismatch artifacts: 0. +- Stable cell residency: 292 graph / 292 flat during the referee window. + +The first strict attempt correctly exposed an idempotency-contract defect: +`LiveCollisionAssetPublisher` passed `null` after finding the prepared asset +already resident, and the guard interpreted that as absent. The root fix makes +the cache distinguish “already published” from “not provided”; strict missing +package data still fails. + +## Production-like performance check + +The normal connected gate intentionally enables the complete current-path +render oracle and allocates about 10.8 MiB/frame in dense Arwic. It is a +correctness observer, not a production performance measurement. + +A separate Release run used the same dense-Arwic arrival and six-second camera +turn with: + +- uncapped rendering; +- no lifecycle artifact directory; +- no current-path render oracle; +- no collision referee; +- no runtime counter attachment. + +Stable result: + +- about 190–200 FPS; +- CPU p50 about 5.0 ms; +- CPU p95 about 5.9–7.3 ms; +- GPU p95 about 2.1 ms; +- update p95 about 1.4–1.8 ms; +- roughly 8% total-machine CPU; +- working set about 1.12 GiB; +- private bytes about 1.41 GiB; +- warm allocation about 84.6 KiB/frame in the dense scene. + +The parsed graph is still resident in those memory figures. I6 graph removal +must reduce that footprint and prove stable production graph counts are zero. + +## Acceptance boundary + +The automated cutover gate is complete. Before deleting the referee and parsed +graph, the user must verify outdoor/indoor movement, doors, ramps/stairs, +jump/fall, camera-wall collision, object interaction, combat/projectiles, and +portal/reconnect behavior on the cutover commit.