acdream/docs/plans/2026-08-02-placement-cutover.md
Erik 27e05b99e4 docs(physics): plan the placement production cutover
The continuation executor (5db3de3c) completed the dormant residence
mechanism; the cutover is the campaign leg that makes it production truth.
The committed 8-route inventory maps every duplicate placement authority in
both hosts with exact call chains, confirms the placement-receipt observer
seam is fully built but unattached, and surfaces five pre-cutover gaps the
shipped mechanism cannot yet express (executor-to-channel bridge, atomic
controller/body publication, the 1,880 B/op activation budget, Runtime-side
live-input derivation, the portal-authority adapter). The plan decomposes
the cutover into C0-C5 bisectable slices under the campaign's standing
contract/dual-review/gate discipline, ending at the connected routes and
the user visual matrix that retire AP-1/AD-1.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-02 04:10:38 +02:00

5.4 KiB

Placement production cutover — campaign plan (2026-08-02)

The final leg of the remaining physics-divergence campaign before AP-22 and AD-10: route graphical AND headless production placement through the residence + continuation-executor owner (38fd4b8d / 30012361 / 5db3de3c), delete the legacy duplicate authorities, and retire AP-1/AD-1 behind connected + user-visual gates.

Inputs (read in order):

  1. 2026-08-02-runtime-continuation-executor-handoff.md — the completed dormant mechanism and its cutover notes.
  2. 2026-08-02-cutover-route-inventory.md — the full 8-route, both-host call-chain inventory with exact file:line for every duplicate authority to remove. THE map for all slices below.
  3. 2026-07-31-remaining-physics-campaign-handoff.md — the original per-route requirements and prerequisite definitions.

Standing discipline per slice: pinned contract → single implementer → independent retail-conformance + architecture/adversarial reviews (both must PASS on the final diff) → focused + complete Runtime + Release build + complete solution gates → bisectable behavior commit (register rows in the same commit) → docs/handoff commit. No workarounds; no fused slices.

Confirmed pre-cutover gaps (from the inventory)

  • The executor publishes only generic entity deltas; nothing bridges its completion to RuntimePlacementProjectionChannel, so no host can learn "my initial placement committed" through the built observer seam.
  • No atomic controller/body publication owner exists (prerequisite C); App and headless hand-write divergent PlayerMovementController construction, and SubmitPreparedPlacement requires a canonical PhysicsBody that nothing currently publishes atomically.
  • The dormant placement path's 1,880 B/operation (2,048 cap) allocation remains the activation blocker for frame-frequency routes.
  • Execute's live inputs (UsePositionFromServer, PlayerDistance) are computed by no host; they must derive from Runtime's own character-option and local-player owners.
  • RuntimePortalPlacementAuthority has zero producing call sites; the adapter from RuntimeWorldTransitState does not exist.
  • The exact-Setup mover chain (PrepareMover / RuntimeSetPositionMoverPreparer.TryBuild / IPreparedCollisionSource.ReadSetupCollision) exists piecewise, unwired.
  • Route-6 split-recovery creates need an effect-replay suppression signal; route-7 needs TryCommitParent/CommitWithdrawal cancellation-symmetry fixes and host-visible cancellation receipts; headless lacks any parent-realize sequence (pre-existing, adjacent).

Slices

  • C0 — Runtime bridge + live inputs (dormant). Publish executor adoption/completion through Placements as the receipt stream hosts consume; derive UsePositionFromServer/PlayerDistance inside Runtime from its own owners (no host-supplied gameplay inputs); wire the exact-Setup mover chain end-to-end for the initial-Create placement; fix the route-7 cancellation asymmetries. Still no production caller.
  • C1 — atomic controller/body publication (prerequisite C). One Runtime-owned transaction publishing the exact same canonical body to graphical and no-window controllers, prepared off-canonical, committed atomically, respected by every body writer/binding/clock-epoch/teardown path. The rejected snapshot-lease design stays rejected. Adversarial-gate heavy (the campaign handoff's full list).
  • C2 — placement allocation budget. Pool or eliminate the operation/ projection envelope allocations on the accepted placement path (root cause, not a raised cap), or obtain explicit user approval for a measured budget. Re-measure; the regression gate keeps the ceiling.
  • 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.
  • C4 — remaining routes: 2 (ForcePosition), 3 (portal, with the RuntimeWorldTransitStateRuntimePortalPlacementAuthority adapter), 4 (remote Create/Position; delete RemoteTeleportController/Placement and the inline MoveOrTeleport duplicate), 5 (projectile authoritative), 6 (drops + split-recovery marking), 7 (residual pickup/parent/delete polish). May land as more than one commit if a route proves large; each sub-landing keeps the full review discipline.
  • C5 — legacy deletion + closeout gates. Delete every superseded legacy path; parity tests; exact lifecycle/reconnect + canonical nine-stop connected routes; two-client observation; user visual matrix (the campaign's stopping point for user acceptance). Retire AP-1, AD-1, AP-131, AD-60's legacy half, and close #275. Update register/roadmap/ milestones/architecture/memory + successor handoff.

After C5: AP-22 (authored collision shapes), then AD-10 (remote contact-plane projection), then the campaign's final matrix and ledger closeout; vendor Slice 5 resumes.