docs(rendering): close packed dispatcher gate

This commit is contained in:
Erik 2026-07-25 02:41:21 +02:00
parent f9829d5f9e
commit f10dec58ba
3 changed files with 110 additions and 6 deletions

View file

@ -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`. | | 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. | | 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`. | | 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. | | 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`. |
| G3G5 | pending | No production consumer has switched. | | 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. |
| G4G5 | pending | No production consumer has switched. |
The exact pre-F/G runtime rollback anchor remains `e7d9d6fa`. F0 is The exact pre-F/G runtime rollback anchor remains `e7d9d6fa`. F0 is
non-drawing diagnostic infrastructure and therefore is not a visual-cutover 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. 4. Keep Wb/texture/selection/light/alpha owners unchanged.
5. Add old-input/new-input instance-set comparison at the dispatcher boundary. 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, **Commit gate:** identical instance keys, model matrices, material identities,
clip slots, light sets, selection parts, alpha records, and draw counts. clip slots, light sets, selection parts, alpha records, and draw counts.

View file

@ -13,10 +13,15 @@ incremental render scene instead of walking `LandblockEntries`. It remains a
compare-only source: production still draws the accepted compare-only source: production still draws the accepted
`InteriorEntityPartition`/`WorldEntity` path. `InteriorEntityPartition`/`WorldEntity` path.
The comparison preserves route, route index, cell, duplicate membership, and The comparison preserved route, route index, cell, duplicate membership, and
projection identity. Sorting is allowed only within those dimensions so projection identity. At this gate it canonicalized identities within those
unordered retained scene indices cannot create a false mismatch while PView dimensions because retained scene indices were unordered.
order and route multiplicity remain exact.
**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 ## Exact physical evidence

View file

@ -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.