diff --git a/docs/plans/2026-08-02-placement-cutover.md b/docs/plans/2026-08-02-placement-cutover.md index 625603dc..0917bfd5 100644 --- a/docs/plans/2026-08-02-placement-cutover.md +++ b/docs/plans/2026-08-02-placement-cutover.md @@ -114,13 +114,39 @@ same commit) → docs/handoff commit. No workarounds; no fused slices. comment-enforced; `IsCurrent(Operation)` remains available and a new reentrancy-spanning call site would silently inherit the tautology — its doc comment warns. -- **C3 — spawn-frequency cutover: routes 1 + 8.** Flip graphical AND - headless initial Create/login registration to - `RegisterEntityWithInitialResidence` + executor + placement receipts - together; `MaterializeProjection`/`BuildControllerAndCamera`/ - `SynchronizeLocalPlayer` become projection + acknowledgement only; - presentation-only rebucketing (`RebucketLiveEntity` loses `CommitRebucket`). - Gates add the exact lifecycle/reconnect connected route. +- **C3 — spawn-frequency cutover: routes 1 + 8 — DECOMPOSED 2026-08-02 + after the first implementation pass stopped with findings.** C3-1 (the + public executor-completion surface via + `RuntimePlacementProjectionChannel.TryGetInitialCreateCompletion`) + landed separately. Two structural gaps halted the flip, both real and + neither in the planning docs: + **(B)** the local player's residence lease opens its SetPosition + operation at Create time, but `SubmitPreparedPlacementCore` requires a + pre-existing canonical body that only the zero-caller publication chain + can attach — first-entry needs an explicit resumable sequence + (begin-placement → publication Prepare/Commit attaches the body → + authored-mover submit → Place receipt → Execute), which matches the + campaign handoff's route-1 required order but exists nowhere as a + driveable state machine; + **(C)** ordinary remote-creature Creates classify to `SetPosition` but + have NO production body-construction path at Create time (bodies arrive + with first motion today; retail constructs physics at CreateObject via + `ACCObjectMaint::CreateObject`/`set_description`, which our retail + notes fully document — the defaults come from the wire PhysicsDesc, + not invention). + Sub-slices, each with the standing contract/dual-review/gate + discipline: + - **C3a — Runtime first-entry sequencing (dormant):** the resumable + local-player entry transaction binding residence → publication + body-attach → mover submit → receipt → Execute, test-driven. + - **C3b — remote body construction at Create (dormant):** + retail-anchored body construction from the wire PhysicsSpawnData per + `set_description` order for residence-route remote/creature Creates. + - **C3c — the host flips (production):** both hosts onto the complete + machinery; seal the Controller setter; presentation-only + rebucketing; the connected lifecycle/reconnect + nine-stop gates + (harnesses: `tools/run-connected-world-lifecycle-gate.ps1`, + `tools/run-connected-r6-soak.ps1`). - **C4 — remaining routes: 2 (ForcePosition), 3 (portal, with the `RuntimeWorldTransitState` → `RuntimePortalPlacementAuthority` adapter), 4 (remote Create/Position; delete `RemoteTeleportController`/`Placement`