docs(rendering): close slice F shadow gate

Record exact capped, uncapped, and dense physical parity evidence before any production draw-source cutover. The pre-F/G runtime rollback anchor remains e7d9d6fa.
This commit is contained in:
Erik 2026-07-24 23:52:07 +02:00
parent 81e2f1a575
commit 9b5a530e7b
2 changed files with 105 additions and 3 deletions

View file

@ -2,7 +2,7 @@
**Date:** 2026-07-24
**Status:** approved 2026-07-24; Slice F active
**Status:** approved 2026-07-24; Slice F complete, Slice G active
**Program:** `docs/plans/2026-07-24-modern-runtime-architecture.md`
@ -22,8 +22,8 @@ retail-faithful gameplay
| F2 — static projection journal | complete | Static and EnvCell-shell projections now append ordered deltas only after the final activation receipt and exact detach receipt. Same-landblock rehydrate reconciles retained/new/omitted identities; stale Far completions are inert. Seven focused lifecycle tests pass inside the 3,708-App / 8,192-solution Release gate. The scene remains unconstructed and non-drawing in production. |
| F3 — live/equipped projection | complete | Exact EntityReady/resource teardown, visibility, attachment pose/removal, and active-only final-frame seams now drive generation/incarnation-gated live records. Duplicate CreateObject, pending/loaded rebucket, hidden/appearance, reentrancy, session clear, attachment, and GUID-generation replacement pass 11 focused tests. Production still constructs no render scene. |
| F4 — dynamic indices | complete | The contained scene now maintains outdoor/static, per-cell static/dynamic, special dynamic-route, translucent, selectable, light-candidate, and dirty indices incrementally. Final-frame live/equipped synchronization remains active-only, and active animated statics are synchronized from the scheduler's active workset rather than a resident-world scan. The production scene remains unconstructed and non-drawing. |
| F5 | active — connected redrive | Lifecycle automation now constructs the otherwise-absent non-drawing scene, drains ordered static/live deltas after post-network spatial reconciliation, compares the accepted current partition every 30 rendered frames and at every canonical checkpoint, retains only the first field-level mismatch, and publishes scene/journal/index/memory evidence in checkpoint JSON. The first exact `056bbd4e` capped route passed the harness and graceful-shutdown gates but correctly exposed missing live roots after a same-location Sawato revisit. Root synchronization now recovers ordinary roots from `LiveEntityRuntime`'s canonical active spatial workset while attached children remain callback-authoritative. Immutable selection geometry is fingerprinted once per GfxObj/mesh identity, and retained scene/journal update paths have zero-allocation regression tests. Release is green at 3,733 App tests / 3 skips and 8,217 complete-solution tests / 5 skips; all three connected routes must be redriven before F5 closes. |
| G0G5 | pending | No production consumer has switched. |
| 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`. |
| G0G5 | active | F's non-drawing referee is accepted. No production consumer has switched yet; G0 begins the borrowed double-buffered frame product. |
The exact pre-F/G runtime rollback anchor remains `e7d9d6fa`. F0 is
non-drawing diagnostic infrastructure and therefore is not a visual-cutover
@ -479,6 +479,23 @@ removal, and final logical teardown. Missing-projection diagnostics also carry
the expected class, server GUID, local ID, and parent cell for any further
failure. Repeat capped F5 on the exact corrective commit before advancing.
The exact corrective commit `81e2f1a5` passed the complete physical gate:
- capped nine-stop route `connected-r6-soak-20260724-232827`: 1,663/1,663
successful comparisons;
- uncapped nine-stop route `connected-r6-soak-20260724-233826`: 1,677/1,677
successful comparisons;
- uncapped dense-Arwic route `connected-dense-town-20260724-234807`: 81/81
successful comparisons.
Every canonical checkpoint had the shadow enabled, the active projection count
equal to the current-path oracle, no first mismatch, no journal carry-over, and
no rejected delta. All three processes used a Release binary whose embedded
commit exactly matched source and all closed gracefully. This closes Slice F.
The shadow scene remains diagnostic-only and is safe to retain if a later
production cutover is reverted. The pre-cutover runtime rollback anchor remains
`e7d9d6fa`.
## 6. Slice G — Frame product and production cutover
### G0 — Borrowed double-buffered frame product

View file

@ -0,0 +1,85 @@
# Slice F5 Render-Scene Shadow Gate
**Date:** 2026-07-24
**Candidate:** `81e2f1a57577457436f244f8c9d083e14a9de362`
**Result:** accepted; Slice F is complete
## Purpose
Slice F built the future render scene without allowing it to draw. The physical
gate compared its active projections with the accepted current renderer after
streaming, network, teleport, animation, attachment composition, and the final
update-boundary journal publication. This was an exact state referee, not a
screenshot approximation.
The retained scene can contain inactive identities that have temporarily left
spatial presentation. Therefore the binding count is the active matched
projection count, not total retained entity capacity. Logical teardown still
removes those identities through `OnResourceUnregister`.
## Exact physical evidence
| Route | Report | Final comparisons | Mismatch | Pending | Rejected | Exit |
|---|---|---:|---:|---:|---:|---|
| Capped nine-stop | `logs/connected-r6-soak-20260724-232827.report.json` | 1,663 / 1,663 | 0 | 0 | 0 | graceful |
| Uncapped nine-stop | `logs/connected-r6-soak-20260724-233826.report.json` | 1,677 / 1,677 | 0 | 0 | 0 | graceful |
| Uncapped dense Arwic | `logs/connected-dense-town-20260724-234807.report.json` | 81 / 81 | 0 | 0 | 0 | graceful |
Every route reported:
- `Passed=true`, `ExitCode=0`, and `GracefulExit=true`;
- source commit, embedded binary commit, and candidate commit equal to
`81e2f1a57577457436f244f8c9d083e14a9de362`;
- shadow comparison enabled at every canonical checkpoint;
- active matched projections equal to the current-path oracle;
- `firstMismatch=null`;
- cumulative rejected-generation, out-of-order, stale-incarnation, and
missing-record counts all zero.
The two nine-stop routes covered Caul, Sawato, Rynthid, Aerlinthe, Holtburg,
same-location Sawato revisit, Caul return, Sawato plateau, and Caul plateau.
The route exercised movement, jump, combat, portal churn, repeated
materialization, generation replacement, and graceful shutdown. Dense Arwic
covered 15,040 active projections and 111 animated entities during the turn
sample.
## Shadow footprint
The final checkpoint's estimated retained shadow footprint was:
- capped Caul plateau: 21,891,296 bytes for 21,216 retained identities;
- uncapped Caul plateau: 21,894,656 bytes for 21,218 retained identities;
- dense Arwic: 20,001,016 bytes for 15,791 retained identities.
This footprint is intentionally additional during Slice F because both the
current and candidate representations coexist. Slice G must remove the old
whole-world partition ownership after production parity; Slice F numbers are
not the post-cutover steady-state memory target.
## Rejected evidence and root corrections
Earlier physical runs were deliberately rejected:
- `056bbd4e`: ordinary roots could not be recovered after same-location
rehydration because derived synchronization walked only retained records;
- `91463db5`: the ordinary journal drain was skipped while simulation was
quiesced instead of being a final update-frame commit;
- `9fab1feb`: destination pose could not restore an equipped projection after
presentation withdrawal;
- `bb1f4a64`: equipped spatial withdrawal was incorrectly treated as logical
identity destruction.
The final model separates logical lifetime from spatial presence. Ordinary
roots reconcile from `LiveEntityRuntime`'s canonical active workset. Equipped
children remain callback-owned, retain their exact inactive scene identity
during spatial withdrawal, reactivate only from an authoritative visibility or
pose edge, and unregister only on logical resource teardown.
## Rollback
No production draw consumer changed in Slice F. The exact pre-F/G runtime
rollback anchor remains `e7d9d6fa`. A later visual failure in Slice G must
revert the exact production cutover commit recorded in the plan and render
pipeline digest; it must not discard this referee or evidence work.