diff --git a/docs/plans/2026-07-24-modern-runtime-slices-f-g-render-scene.md b/docs/plans/2026-07-24-modern-runtime-slices-f-g-render-scene.md index 3d01a300..ccc7975d 100644 --- a/docs/plans/2026-07-24-modern-runtime-slices-f-g-render-scene.md +++ b/docs/plans/2026-07-24-modern-runtime-slices-f-g-render-scene.md @@ -25,8 +25,9 @@ retail-faithful gameplay | F5 | complete | Exact `81e2f1a5` passed capped and uncapped nine-stop routes plus uncapped dense Arwic. Across the final checkpoints the referee completed 1,663 + 1,677 + 81 comparisons with zero mismatches, zero pending deltas, zero rejected operations, exact binary/source identity, and graceful shutdown. Evidence: `docs/research/2026-07-24-slice-f5-render-scene-shadow-gate.md`. | | G0 — borrowed frame product | complete | Two reusable arenas publish exact generation/frame-stamped borrowed views for scene candidates, cell ranges, transforms, classification, light sets, selection, PView/clip references, counts, and source digest. Release/reuse invalidates every copied view; abort never publishes; frame N may build while N-1 is borrowed; the warm path allocates zero bytes. Eight focused tests pass inside the 3,743-App / 8,227-solution Release gate. | | G1 — scene-query replacement | complete | Exact `e346f8bb` passed capped and uncapped nine-stop routes plus uncapped dense Arwic: 29,392 + 29,025 + 1,522 same-frame candidate comparisons, zero mismatches, equal counts/digests at every checkpoint, exact binary/source identity, and graceful shutdown. Evidence: `docs/research/2026-07-25-slice-g1-scene-query-candidate-gate.md`. | -| G2 — packed dispatcher input | source-packing gate active | The scene now retains an immutable presentation payload and the frame product flattens each unique projection into entity and mesh-part spans, including palette and surface-override identity. The compare-only controller expands exact PView routes and checks every current dispatcher input tuple without drawing twice. The full Release gate is 3,746 App tests / 3 skips and 8,230 solution tests / 5 skips. Connected source-input parity and final instance-output parity remain before G2 closes. | -| G3–G5 | pending | No production consumer has switched. | +| G2 — packed dispatcher input | complete | Exact `f9829d5f` passed capped and uncapped nine-stop routes plus dense Arwic. Candidate order, packed input, classified output, and selection each completed 16,879 + 17,282 + 770 comparisons with zero mismatch; journal/rejection counts were zero and shutdown graceful. Evidence: `docs/research/2026-07-25-slice-g2-packed-dispatcher-gate.md`. | +| G3 — retained classification/storage | active | Restore the isolated retained-classification cache after G2's exact-order correction, then prove dirty-only rebuild and zero-allocation warm reuse before any draw-source switch. | +| G4–G5 | pending | No production consumer has switched. | The exact pre-F/G runtime rollback anchor remains `e7d9d6fa`. F0 is non-drawing diagnostic infrastructure and therefore is not a visual-cutover @@ -572,6 +573,17 @@ door apertures, look-ins, non-flooded rooms, and portal straddles. 4. Keep Wb/texture/selection/light/alpha owners unchanged. 5. Add old-input/new-input instance-set comparison at the dispatcher boundary. +**Completed 2026-07-25.** Exact `f9829d5f` passed capped and uncapped +nine-stop routes plus uncapped dense Arwic. Candidate order, packed mesh-part +input, classified opaque/alpha output, and selection each completed +16,879 + 17,282 + 770 comparisons with zero mismatch. The stronger gate +corrected two referee blind spots: route canonicalization had hidden source +order, and the no-VAO diagnostic path had hashed stale reusable group lists +despite accepting zero instances. `GpuWorldState` now owns explicit traversal +slots plus mutable bucket indices; zero-instance fingerprints describe empty +accepted output. Evidence: +`docs/research/2026-07-25-slice-g2-packed-dispatcher-gate.md`. + **Commit gate:** identical instance keys, model matrices, material identities, clip slots, light sets, selection parts, alpha records, and draw counts. diff --git a/docs/research/2026-07-25-slice-g1-scene-query-candidate-gate.md b/docs/research/2026-07-25-slice-g1-scene-query-candidate-gate.md index 8113a82d..e1e03da6 100644 --- a/docs/research/2026-07-25-slice-g1-scene-query-candidate-gate.md +++ b/docs/research/2026-07-25-slice-g1-scene-query-candidate-gate.md @@ -13,10 +13,15 @@ incremental render scene instead of walking `LandblockEntries`. It remains a compare-only source: production still draws the accepted `InteriorEntityPartition`/`WorldEntity` path. -The comparison preserves route, route index, cell, duplicate membership, and -projection identity. Sorting is allowed only within those dimensions so -unordered retained scene indices cannot create a false mismatch while PView -order and route multiplicity remain exact. +The comparison preserved route, route index, cell, duplicate membership, and +projection identity. At this gate it canonicalized identities within those +dimensions because retained scene indices were unordered. + +**G2 correction:** this proved membership and multiplicity, not exact source +traversal. Stable equal-distance alpha ordering makes traversal observable. +G2 moved that order into `GpuWorldState`, removed comparator canonicalization, +and passed the stronger ordered candidate/packed/output gate. See +`docs/research/2026-07-25-slice-g2-packed-dispatcher-gate.md`. ## Exact physical evidence diff --git a/docs/research/2026-07-25-slice-g2-packed-dispatcher-gate.md b/docs/research/2026-07-25-slice-g2-packed-dispatcher-gate.md new file mode 100644 index 00000000..b0912be2 --- /dev/null +++ b/docs/research/2026-07-25-slice-g2-packed-dispatcher-gate.md @@ -0,0 +1,87 @@ +# Slice G2 Packed Dispatcher Gate + +**Date:** 2026-07-25 + +**Candidate:** `f9829d5f9ea831b67be7cf5c3c339d11c9b5d52d` + +**Result:** accepted; G2 complete + +## Purpose + +G2 proves that the retained render scene can produce the exact ordered object +and mesh-part stream consumed by the accepted dispatcher, then classifies that +stream through the same mesh, material, clip, light, translucency, alpha, and +selection owners without drawing a second time. + +The production draw source remains unchanged. This is still compare-only +evidence and does not create a visual-cutover rollback unit. + +## Exact physical evidence + +| Route | Report | Candidate order | Packed input | Classified output | Selection | Exit | +|---|---|---:|---:|---:|---:|---| +| Capped nine-stop | `logs/connected-r6-soak-20260725-021745.report.json` | 16,879 / 16,879 | 16,879 / 16,879 | 16,879 / 16,879 | 16,879 / 16,879 | graceful | +| Uncapped nine-stop | `logs/connected-r6-soak-20260725-022749.report.json` | 17,282 / 17,282 | 17,282 / 17,282 | 17,282 / 17,282 | 17,282 / 17,282 | graceful | +| Uncapped dense Arwic | `logs/connected-dense-town-20260725-023714.report.json` | 770 / 770 | 770 / 770 | 770 / 770 | 770 / 770 | graceful | + +Every canonical checkpoint reported: + +- source commit, embedded binary commit, and candidate commit equal to + `f9829d5f9ea831b67be7cf5c3c339d11c9b5d52d`; +- zero candidate, packed-input, classified-output, selection, and shadow-scene + mismatches; +- zero pending render-journal entries and zero rejected delta applications; +- equal current/product frame sequence and equal expected/actual digests; +- `Passed=true`, `ExitCode=0`, `GracefulExit=true`, and exact binary/source + identity. + +Dense Arwic exercised 15,530 resident objects and 111 active animated statics. +The nine-stop routes covered Caul, Sawato, Rynthid, Aerlinthe, Holtburg, +same-location revisits, landblock retirement/reuse, movement, jump, combat, +portal transitions, generation replacement, and graceful teardown. + +## Corrections found by the stronger gate + +### Ordered traversal is behavior + +The original G1 comparator canonicalized each route by identity. It proved +membership and multiplicity, but not the accepted traversal order. G2's stable +alpha comparison exposed that equal-distance transparent parts preserve source +order, matching retail `CShadowPart::insertion_sort` at `0x006B5130`. + +`GpuWorldState` now owns an explicit resident traversal slot plus the mutable +entity bucket index. Static publications and live projections consume that +one derived order. Swap-removal, rebucket, pending-to-loaded, same-landblock +replacement, and retired-slot reuse are permanent tests. The candidate and +packed-input comparators no longer sort away order differences. + +### Empty diagnostic submissions contain no stale groups + +The first exact capped run on `e0f36caa` had perfect candidate, packed-input, +and selection parity but seven transient classified-output mismatches. The +production no-VAO early return skipped group partitioning, so its diagnostic +fingerprint hashed stale reusable group lists even though it reported zero +accepted instances and groups. + +`f9829d5f` normalizes a zero-instance diagnostic submission to empty accepted +group sets. This changes neither GL work nor pixels; it makes the referee +describe the actual accepted output. A permanent test seeds stale opaque and +transparent scratch and proves the zero-instance fingerprint remains the +canonical empty submission. + +## Deterministic gate + +- Exact-order mismatch fixture rejects equal membership in a different route + order. +- Static and live traversal fixtures cover landblock slot order, bucket index, + swap-removal, pending state, rehydrate, and slot reuse. +- Empty/no-VAO submission fixtures cover deferral and stale scratch. +- App Release: 3,759 passed / 3 skipped. +- Complete Release solution: 8,243 passed / 5 skipped. + +## Rollback + +G2 is compare-only. Commits through `f9829d5f` are safe to retain if a later +production visual cutover is reverted. The pre-cutover runtime rollback anchor +remains `e7d9d6fa`. G4 must record its exact production cutover commit before +the user visual gate.