docs(render): S2 plan packet - membership ownership map and revised chunks

Read-only trace of every production owner of cell membership (render and
physics), the retail transaction they must collapse into (Contracts A/B),
and the five S2 chunks re-cut on that evidence: the two static floods are
one CellTransit walk with different part inputs; retail uses the whole
part array once and registers every part in every array cell; children
inherit at registration; topology consolidation moves to S3.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
This commit is contained in:
Erik 2026-09-02 20:57:04 +02:00
parent 75873886f3
commit e7ad25a705
2 changed files with 139 additions and 15 deletions

View file

@ -360,24 +360,35 @@ registration transaction. Every consumer borrows it; the App-owned render
index, visual-AABB fallbacks, origin-cell fallbacks, and duplicate cell buckets
are deleted.
**Chunks:**
1. Read-only graph snapshot beside existing owners from the same accepted
publication; equality test against source publication; zero pixel change.
2. Static `AddPartsShadow` parity: ordered membership vector per visual part;
old index retained as comparator only inside this chunk; cut render lookup
after the installed-DAT comparator is zero-mismatch. Fixtures: cathedral
**Chunks (revised 2026-09-02 from the ownership trace in
`s2-membership-ownership-map.md`):**
1. Retail CELLARRAY from the whole part array (per part: physics sphere else
drawing sphere, part box) computed in `ShadowObjectRegistry` at the same
registration call as today's collision flood, retained as a new product
beside `_entityToCells`, plus per-cell part entries (entity, part, GfxObj,
cell frame, clip-planes-required) in registration order. Nothing consumes
it yet; a comparator over installed-DAT fixtures reports retail vs current
collision vs current render cells. Zero pixel change.
2. Render statics cut over to the registry's per-cell part entries; delete
`ResolveStaticRenderCells`, `ComputeStaticRenderCells`, the fingerprint
cache, and App's `FromStaticRenderParts` use. Fixtures: cathedral
ramp/stairs/walls, Facility stairs, a 24 m cell-edge crosser, a
landblock-edge object, a non-colliding decoration, a multi-part Setup whose
parts cross different cells.
3. Dynamic/child parity: `add_shadows_to_cells`, removal, movement update,
child inheritance as one transaction keyed by exact incarnation. Fixtures:
local/remote player, NPC, projectile, spell world object, equipped child,
contained child, indoor portal crossing, outdoor crossing, teardown/
reconnect.
4. Consumer cutover in order: indoor static render lookup, outdoor static
render lookup, dynamic render lookup, physics broadphase projection,
particle owner-cell lookup, point-light owner-cell lookup, directional-shadow
reachability. Delete the superseded builders.
3. Collision cut over: `_entityToCells`/`_cells` from the same CELLARRAY.
Physics suites, placement/collision replay fixtures, connected nine-stop
route.
4. Dynamics and children: `add_shadows_to_cells` recursion at registration and
movement; particles own-cell; delete the render-side parent-chain walk.
Fixtures: local/remote player, NPC, projectile, spell world object,
equipped child, contained child, indoor portal crossing, outdoor crossing,
teardown/reconnect.
5. Consumer cutover and deletion: remaining `WalkProductionWorldData` buckets
become borrowed views, particle owner union reads the same, duplicate
dictionaries and origin-cell/visual-AABB fallbacks are deleted. Lights and
directional shadows stay for S5. Topology triplication (`LoadedCell` /
`WalkCell` / flat asset) is consolidated with S3's `WalkPView` state, not
here.
**Review:** architecture (one authority; retry/recenter/reset safe; no
per-frame rebuild) and retail (crossed cells and insertion order match the