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 ccc7975d..547c3e49 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 @@ -26,8 +26,9 @@ retail-faithful gameplay | 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 | 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. | +| G3 — retained classification/storage | complete | Exact `6a026c5a` passed capped and uncapped nine-stop routes plus dense Arwic with 17,069 + 16,827 + 757 exact comparisons in every channel, zero mismatch, warm cross-frame reuse, and graceful shutdown. Evidence: `docs/research/2026-07-25-slice-g3-retained-classification-gate.md`. | +| G4 — production cutover | active | Switch one production draw consumer to the exact retained frame product, record the exact cutover hash before the visual gate, then remove no oracle evidence until parity and fixed-camera image checks pass. | +| G5 | pending | Physical performance/lifecycle closeout follows the user visual gate. | The exact pre-F/G runtime rollback anchor remains `e7d9d6fa`. F0 is non-drawing diagnostic infrastructure and therefore is not a visual-cutover @@ -602,6 +603,23 @@ clip slots, light sets, selection parts, alpha records, and draw counts. **Commit gate:** warm unchanged frames rebuild no static classification and allocate no core scene/dispatcher memory. +**Completed 2026-07-25.** Exact `6a026c5a` passed capped and uncapped +nine-stop routes plus uncapped dense Arwic. Candidate order, packed input, +classified output, and selection completed 17,069 + 16,827 + 757 continuous +comparisons with zero mismatch. Dense Arwic's final warm frame reused all +3,828 unchanged visible classifications, rebuilt zero static projections, and +kept 410 active animated classifications on the live path. + +The first development pass exposed a reveal-edge ownership gap: inbound state +continues while portal reveal blocks ordinary simulation, but the derived +render projection had also been blocked. A narrow hidden-frame projection sync +now follows inbound network/command mutation without advancing effects, +particles, attachments, lights, animation, or physics. Dirty state is +acknowledged only after every packed comparison succeeds. Deterministic tests +also pin generation/incarnation replacement, incomplete resources, retirement, +and 1,000 warm reuse frames with zero thread allocation. Evidence: +`docs/research/2026-07-25-slice-g3-retained-classification-gate.md`. + ### G4 — Cutover 1. Run old and new input construction in compare-only mode; draw only the old diff --git a/docs/research/2026-07-25-slice-g3-retained-classification-gate.md b/docs/research/2026-07-25-slice-g3-retained-classification-gate.md new file mode 100644 index 00000000..24345141 --- /dev/null +++ b/docs/research/2026-07-25-slice-g3-retained-classification-gate.md @@ -0,0 +1,84 @@ +# Slice G3 Retained Classification Gate + +**Date:** 2026-07-25 + +**Candidate:** `6a026c5ab04b3a0148045490fcb33d86084e0c0d` + +**Result:** accepted; G3 complete + +## Purpose + +G3 retains mesh/material classification per visible render projection while +refreshing frame-varying transforms, clip slots, selected lights, opacity, +selection lighting, and picking transforms. Classification remains live for +active animation, incomplete mesh/texture resources, and active translucency +fades. The production renderer still draws the accepted path; this is +compare-only evidence and not a visual-cutover rollback unit. + +## Exact physical evidence + +| Route | Report | Exact comparisons per channel | Final static rebuild / cross-frame reuse | Exit | +|---|---|---:|---:|---| +| Uncapped nine-stop | `logs/connected-r6-soak-20260725-031419.report.json` | 16,827 / 16,827 | 2 / 6,037 | graceful | +| Capped nine-stop | `logs/connected-r6-soak-20260725-032350.report.json` | 17,069 / 17,069 | 2 / 6,038 | graceful | +| Uncapped dense Arwic | `logs/connected-dense-town-20260725-033339.report.json` | 757 / 757 | 0 / 3,828 | graceful | + +For every route, all four continuously sampled channels had zero cumulative +mismatches: + +- ordered PView candidates; +- packed dispatcher input; +- classified opaque/transparent output; +- accepted selection parts. + +Every process used a Release binary whose embedded commit exactly matched +source, carried zero pending render-journal entries and zero rejected deltas at +canonical checkpoints, and closed through the graceful logout path. Dense +Arwic exercised 15,530 resident objects and 111 active animated statics. Its +final retained classification payload was 4,937,760 bytes; active animation +remained on the live path while all 3,828 unchanged visible projections reused +their prior classification. + +## Reveal-edge correction + +The first development gate on `54d17eb4` exposed transient mismatches that the +older checkpoint-only acceptance had not rejected. At a portal reveal, inbound +network dispatch continued mutating hidden live objects while ordinary world +simulation and full presentation reconciliation were intentionally blocked. +The derived render scene therefore retained an older transform until the +update after the first visible frame. + +The stronger ordered diagnostics named the exact live projection and transform +fingerprint. Corrective commit `6a026c5a` splits out a narrow render-projection +sync after hidden-frame network and command phases. It updates only the derived +scene; physics, animation, effects, particles, attachments, and lights remain +quiesced. The capped and uncapped nine-stop reruns prove that initial reveal, +all portal generations, and the final Caul revisit now maintain exact +same-frame parity. + +## Deterministic gate + +- Exact identity includes projection ID, owner incarnation, mesh/material, + degrade state, and geometry/appearance fingerprints. +- Transform-only dirtiness reuses classification; appearance dirtiness, + incarnation changes, incomplete resources, and active animation rebuild. +- Generation replacement and unseen projection retirement release retained + payload. +- A warmed projection completes 1,000 reuse frames with zero thread + allocations. +- Dirty acknowledgement occurs only after candidate, packed-input, + classified-output, and selection comparisons all succeed. +- Hidden world frames synchronize only the derived render projection after + inbound mutation. +- App Release: 3,767 passed / 3 skipped. +- Complete Release solution: 8,251 passed / 5 skipped. +- Release build: zero warnings and zero errors. + +## Rollback + +G3 remains compare-only. Commits through `6a026c5a` are safe to retain if a +later production visual cutover is reverted. The exact pre-cutover runtime +rollback anchor remains `e7d9d6fa`. G4 must record its exact production +cutover commit in the F/G plan and render-pipeline memory before the user +visual gate; that cutover commit, not G3, will be tomorrow's surgical rollback +unit.