Removes a duplicate placement authority for local-player portal arrival. Portalling worked before this change and works after it — this is not a bug fix, EXCEPT that it found and fixed one dead-code production bug. THE PRODUCTION BUG: TryExecuteCanonicalPortalPlacement re-read the accepted destination at Place time, but TryBeginPortalReveal already consumes that slot at Aim time — so the arm was 100% dead code and every real portal Place refused with host-token-unavailable. Found only because we refused to accept 7 skipped tests instead of chasing the count to zero. RETAIL IS THE GENERIC PATH FOR THE THIRD ROUTE RUNNING: SmartBox::TeleportPlayer @0x00453910 = SetPositionSimple(dest, 1) with flags 0x1012, followed by PlayerPositionUpdated. BOTH INVERSIONS, WITH THEIR ANCHORS: unlike route 2, the leash IS armed here (ConstrainTo @0x0045418A) and velocity is zeroed (set_velocity @0x004541B4); unlike route 4b-3, the local teleport_hook runs AFTER placement (@0x004538AE). THE THREE-ROUND DEFECT CHAIN, HONESTLY: - Round 1 released the player at the pre-teleport position while the anim stream marched on — the contract wrongly assumed Place re-fires (process rule 1's third occurrence this campaign). - Round 2's fix inferred commit from a global PendingCount, which three non-committing paths also clear — making the SAME bug complete cleanly and silently. Strictly worse than round 1: round 1 at least tripped portal-complete-before-materialized. - Round 3 latches the commit where it actually happens (ReconcileAndAcknowledgePortal), keyed on reveal generation and teleport sequence, via TryConsumePortalCommit. Two of the three required regression tests landed and are sabotage-verified on both hosts (ParkedPlace_ForgottenByOrdinaryMergeDoesNotLatchAsCommitted / HeadlessPortalPrepareDestinationForgottenByOrdinaryMergeDoesNotLatchAsCommitted). The third (force-arm-takes-the-slot) was judged unnecessary on review: with the inference gone, PendingCount is only a "don't ask yet" guard at both gates, so a force operation occupying or vacating the slot no longer changes an input the commit decision reads — the case collapses into what the landed test already discriminates. THE B2/P3 RESOLUTION: both round-2 reviews were right about different branches of the same synchronous call. RuntimePlacementProjectionSubscription .OnPlacement acknowledges the FIFO head only when TryApply returns true; a Place whose portal authority went stale (transit ended/superseded while parked) used to return false, wedging every later entity's placement receipt behind it forever. Both sinks (RuntimePlacementPresentationSink, HeadlessRuntimePlacementProjectionSink) now acknowledge-and-ignore a stale-authority Place instead of refusing it. The regression test (RuntimePlacementPresentationSinkTests .PortalPlace_StaleTransitHostOrSequenceIsAcknowledgedAndIgnored) had been asserting the old, wrong `false` behaviour; it now asserts and sabotage-verifies the fix. Also lands: AP-144 (register discipline — the portal movement-event send reuses the stricter UsePositionFromServer gate where retail's SendMovementEvent is the looser autonomy_level != 0 test, diverging only at level 1, currently unreachable), AP-145 + issue #318 (the local-player collision-shadow presentation write bypasses its own publisher's ShadowObjects write via a direct cache .Set(), self-healing only once dedup diverges — filed, not fixed, pending a composition test), AD-42 deleted (its last citation retired by the canonical portal arm), AD-2 updated (the wait-cue's trigger predicate now covers a second cause), and two documentation corrections: the enter_world misattribution (both call sites are in SmartBox::HandleCreateObject, only one in the player branch — portal arrival is TeleportPlayer, not enter_world) and the stale "local player never reaches this path" comment on the generic-remote-render-pose write. Suite: 11,090 passed / 4 skipped / 0 failed. No new skips, nothing weakened. STILL OWED: the connected two-client gate, with ACDREAM_PROBE_LOCAL_TELEPORT=1, scored only if [local-tp] lines actually appear in the capture — and explicitly NOT scored as covering issue #318 (no composition test yet asserts PhysicsEngine.ShadowObjects directly). Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
32 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.
Handoff checkpoint — 2026-08-03
Status: stabilization checkpoint accepted; campaign closeout is not yet complete. The C3c production cutover and the O(changed) collision publication checkpoint are now playable after five separately committed root-cause fixes:
01f4791estops origin recenter from manufacturing and replaying a second retirement receipt for a pending-only live-projection bucket. Its exact binary passed the complete Release suite, lifecycle route, and canonical nine-stop soak (connected-r6-soak-20260802-204309, nine stops, zero failures/wait cues/pending retirements).670f307ckeeps remote Create placement, the local-player physics host, targeting, chasing, and attacks in the same world-coordinate frame. The user accepted monster placement/chase/hit behavior and static placement after portals.1fc529cdmaterializes the canonical minimal static physics host before a distant Use/MoveTo route and reconciles the pre-PartArray startup motion suffix. The user accepted near and distant object use.f24532addefers one-shot F754/F755 effects until canonical placement has bound presentation, retries projectile/static-animation sidecars on the committed visibility edge, and keeps effect cells synchronized. The user accepted buffs, recalls, arrows, combat spell projectiles, portals, and static animation.175ad6b0sends LoginComplete from the local first-placement terminal edge instead of raw PlayerCreate receipt, so ACE's intentional login Hidden/ materialization state cannot race placement. The user accepted the login haze behavior.
Focused verification after the final fix passed 90 App effect/projectile/
static-scheduler tests, two Runtime login tests, the exact live-entity cell
tracking regression, all 79 Headless tests, and the Release solution build
with zero errors. The long connected soak and complete solution suite have
not been rerun on the final 175ad6b0 binary. A broader selected fixture
run also exposed five LiveEntityRuntimeTests failures tied to the still-open
placement cutover plus one old remote first-entry fixture that supplies an
empty collision source; classify and fix those before claiming C5 closure.
Remaining campaign work, in order:
- Reproduce and repair the six fixture failures without weakening their assertions or adding compatibility bypasses.
- Finish C4's routes 2–7 and remove their legacy placement writers; fold in #276 and #277 where their route becomes authoritative.
- Resolve #280 with retail's configured destination-prefetch window so the portal viewport never reveals visibly constructing far terrain.
- Run C5's complete Release suite, lifecycle/reconnect route, latest-binary
nine-stop soak, two-client observation, and the remaining #269 slope-glide
visual check. A pass from
01f4791eis evidence for that fix, not a substitute for the final-binary soak. - Delete the superseded paths, retire AP-1/AD-1/AP-131 and AD-60's legacy half only when the code proves they are gone, then complete AP-22 and AD-10 and close the campaign ledger.
Inputs (read in order):
2026-08-02-runtime-continuation-executor-handoff.md— the completed dormant mechanism and its cutover notes.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.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
PlayerMovementControllerconstruction, andSubmitPreparedPlacementrequires a canonicalPhysicsBodythat 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.RuntimePortalPlacementAuthorityhas zero producing call sites; the adapter fromRuntimeWorldTransitStatedoes not exist. Corrected 2026-08-04 (C4 route 3 closure,docs/research/2026-08-04-c4-route-3-contract.md), itself corrected 2026-08-05 (A10 architecture review — the first correction asserted a false fact of its own), and rewritten 2026-08-05 (N5 retail-review round-3 fix — the prior wording of this correction contradicted itself). The original bullet conflated two separate claims into one sentence, and only one of them was true. What pre-dated route 3 and WAS accurate: theRuntimePortalPlacementAuthoritytype existed (referenced by route 2'sPending.Portalfield, alwaysPresent: false), itsIsValidcheck existed, and the sinks' portal-authority gates plusBeginAcceptedPlacementCore's gate already read it. What was NOT accurate, and is what "zero producing call sites; the adapter does not exist" actually described: the PRODUCER half — nothing built aPresent: trueauthority and called the consumer arm (RuntimeAcceptedPositionDriveController.TryExecuteAcceptedPortalArrival/SubmitAndResolvePortal/ClassifyPortalArrival) — that consumer arm ALSO did not exist before route 3. Route 3 added the producer and the consumer together, in the same slice: the producer isLocalPlayerTeleportController.TryExecuteCanonicalPortalPlacement(nowTryAdvancePortalCommit/TryExecuteCanonicalPortalPlacementCore, per the 2026-08-05 A1 review fix), which builds the authority fromWorldRevealCoordinator/RuntimeWorldTransitStatefacts and callsTryExecuteAcceptedPortalArrival; the identical Runtime entry point is shared by the headless host. So: the type/IsValid/consumer-gate facts pre-dated route 3 and were true before it; the arm (both the producer that builds a live authority and the consumer that reads one) did not exist before route 3 and is what the original bullet's "zero producing call sites" language was pointing at.- The exact-Setup mover chain (
PrepareMover/RuntimeSetPositionMoverPreparer.TryBuild/IPreparedCollisionSource.ReadSetupCollision) exists piecewise, unwired. - Corrected 2026-08-04 (C4 route 6 closure,
docs/research/2026-08-04-c4-route-6-contract.md): all three clauses above were stale. Route-6 split-recovery does NOT need an effect-replay suppression signal — that premise was unsubstantiated; acdream's only create-time effect replay is the F754/F755 queue drain keyed by server GUID, and the one plausible mechanism (a clonedDefaultScriptTypesurvivingBuildSpawn) never fires at create in either client (CPhysicsObj::play_default_script @0x005132B0/@0x00513300has exactly two callers, both animation hooks, verified againstacclient_2013_pseudo_c.txt). Route-7'sTryCommitParent/CommitWithdrawalcancellation-symmetry fixes and host-visible cancellation receipts were BOTH closed at C0 (see the C0 slice below). What actually remained for route 7: the child's canonical cell had two writers (Runtime committed it cell-less unconditionally inCommitAcceptedParentCellless, whileEquippedChildRenderController .TickChildre-celled it from a per-frame render tick), and headless had noEquippedChildRenderControllerat all, so every headless parented child stayed cell-less forever — the same defect seen from two sides, not two separate gaps. Closed 2026-08-04 (docs/research/2026-08-04-c4-route-7-contract.md). Runtime is now the sole canonical writer:CommitAcceptedParentCelllesscompletes retailset_parent's attach-time re-cell (D1), and every canonical cell write funnels through one directory chokepoint that recursively propagates to committed children on every parent cell crossing (D2 —docs/research/2026-08-04-retail-parent-cell-propagation.md), not only at attach.TickChildis demoted to a presentation-only draw-bucket move (D4); the headless host gained its own parent-realize drive running the same commit pair the graphical host does (D5,RuntimeLiveEntitySessionController.OnParentUpdated). The direct headless regression test (a bot with an equipped item shows the child's canonicalFullCellIdequal to the parent's) now passes.
Slices
-
C0 — Runtime bridge + live inputs — COMPLETE at
67f63e85(2026-08-02, dual reviews PASS). The executor publishes an acknowledge-onlyExecutorCompletedreceipt through the one placement stream (registered before dispatch; correlation reaped on acknowledgement/discard/clear;PendingCompletionReceiptCountinIsConverged); all three production sinks acknowledge-and-ignore the kind via early returns proven behavior-preserving for every other kind (sanctioned seam completion — provably inert, no production publisher);UsePositionFromServerderives retail-exactly fromRuntimeCharacterState.AutonomyLevel != 2andPlayerDistancefrom the live movement controller with null-safe fallback to the caller struct;TryPrepareAndSubmitAuthoredPlacementchains the prepared-collision Setup read throughPrepareMoverto submission with zero validation changes;TryCommitParent/CommitWithdrawalgained the sibling cancellation flow (theLeaveWorldomission inTryCommitParentis retail-REQUIRED perset_parent0x00515A90:283832-283833's single gatedleave_world). Not fully dormant by design: the two cancellation fixes change live Runtime paths production already calls; everything else has no production caller. C3 prerequisites recorded from C0's reviews: (a) the completion receipt/trace surface is internal-only — C3 must define the public host consumption shape when it wires the hosts; (b)PlayerDistanceis resolved once perExecuteentry, not per continuation — a multi-Position FIFO classifies later entries against entry-time distance (documented deferral; refine at C3/C4 if the connected gates show it matters); (c) any future host exposure ofTrySetAutonomyLevelmust carry retail'sSendAutonomyLevelEvent(699550). -
C1 — atomic controller/body publication — SATISFIED BY EXISTING MECHANISM (research finding 2026-08-02, plan amended same session).
RuntimeLocalPlayerPhysicsPublicationState(1,033 lines) plus the ~15-method dormant local-activation family onRuntimeSetPositionStatealready implement the full sanctioned option-2 transaction: off-canonical preparation against a scratch quantum clock and a sealed candidate controller, one validated atomic Commit, and a staged Evaluate/Commit/FinalizeActivation chain re-validated against PhysicsOwnershipEpoch/ObjectClockEpoch/ControllerOwnershipEpoch/session identity at every entry — with zero production callers. See2026-08-02-canonical-body-writer-map.md(6 canonical body writers; the two host escape hatches; both hosts' divergences). The remaining work — routing both hosts' local-player construction through the publication lifecycle, sealing the publicRuntimeLocalPlayerMovementState.Controllersetter, retiring App's direct object-clock bypasses, and containing headless's uncaught prepared-collisionInvalidDataException— IS the C3 route-1 flip and moves there. No separate C1 commit. -
C2 — placement allocation budget — COMPLETE at
63c601ff(2026-08-02, dual reviews PASS after two fix rounds). 2,032 → 944 B/op via pooled operation envelopes (bounded, reset-at-rent, double- retire guarded, reset/dispose-cleared, ledger-visible), a cached collision-callback delegate over an explicit context stack, and a non-boxing pending-head read; gate tightened to 1,536. The pooling forced a class-wide staleness rework: captured-token-vs-fresh-lookup at every reentrancy-spanning frame (26-site audit), hoisted stack locals for retail's handle_all_collisions bits, token-gated bookkeeping writes, and a deliberately identity-agnostic settle path (retail's SetPositionInternal completes unconditionally even for displaced operations). Residual floor (documented at the gate, decision deferred to the C3 activation gate where the user is in the loop): ~520 B/op inside Core'sPhysicsEngine.SetPosition(transition init / query-footprint materialization — a potential C2b if C3's connected profile shows it matters) and ~208 B/op of sorted-tree node per pending receipt. Maintenance notes from review (no action): the no-reentrancy proofs on the 15 surviving reference-based currency checks are 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 — 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, butSubmitPreparedPlacementCorerequires 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 toSetPositionbut have NO production body-construction path at Create time (bodies arrive with first motion today; retail constructs physics at CreateObject viaACCObjectMaint::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 — COMPLETE at
960373df(2026-08-02, dual reviews PASS).RuntimeLocalPlayerFirstEntryState: five stages (mover-prep → publication Prepare/Commit → activation → acknowledgement → Execute) in retail's own order — mover shapes BEFORE placement, matching makeObject/set_description preceding enter_world; the original contract prose had it backwards and the tested preconditions forced the faithful order. Acknowledge-stage authority discrimination, automatic convergence through the (now multicast, snapshot-iterated) retirement fan-out, ownership-ledger fold, transactional late-bind Publication seam. Dormant: C3c's first act is the GameRuntime binding + production Advance drive. Carried findings for C3c: the controller is live from the activation commit onward (abandonment leaves it to ordinary entity teardown — retail has no entry-flow rollback); EvaluateActivation's post-commit DeferredCell overload is encapsulated behind Advance. - C3b — remote body construction at Create — COMPLETE at
0934a121(2026-08-02, dual reviews PASS).RuntimeRemoteBodyDescription+RuntimeRemoteFirstEntryState: the fullset_descriptionorder with the byte-certain gates (friction [0,1] inclusive, NaN sanctioned-skip; elasticity clamp with retail's unordered-to-zero; translucency != 0.0f), the movement-branch discriminator on retail'smovement_buffer != 0(empty-buffer → placement branch, no autonomy), motion-table zero-id pass, ctor-defaults for absent wire fields, and never-clobber coexistence with the build-at-first-motion production path. The acknowledge discriminator is one shared body (RuntimeFirstEntryAcknowledgement) for both conductors. Dormant. - C3c — the host flips (production) — COMPLETE at
529e0e9d(2026-08-02, dual Opus reviews: initial FAIL 2+2 MAJOR → R1 fix round → delta PASS both). Both hosts register initial Creates through residence + conductors via the sharedRuntimeFirstEntryDriveController; Controller setter sealed; rebucketing presentation-only strictly while the residence is ACTIVE (post-residence entities take the full legacy path including theprepare_to_enter_worldclock edges); content-less headless keeps pre-flip direct registration. Five fix slices landed inside the cutover, each connected-gated: F1 (Runtime ownership seam for movement stats/server physics — the post-logout retired-controller crash), F2 (the login activation wedge: admission-prefix gate factored from the seal, rearm generation identity, auto-entry requires the published controller), F3 (landblock-prefix 0-sentinel → explicit absent-id; corner landblocks legal), F4 (diagnosis only: the nine-stop soak's convergence failure is pre-existing6b28ff99whole-world collision-clone throughput — its fix is the next slice before C5), F5 (local-player first-entry ground contact via the sharedSpawnPlacementSettleratFinalizeActivation; the standing-cast airborne rejections are gone; register AD-61). R1 additionally armed the login constraint leash at the committed placement (HandleReceivedPosition0x00453FD0 analog) and refreshed AD-42. Final gates: complete solution 10,816/0/4 skips; lifecycle/reconnect gate PASS (connected-world-gate-20260802- 175401). Closeout:2026-08-02-c3c-cutover-closeout.md. Carried to C4/C5: route-1 far-Create service-window conversion if either streaming/broadcast radius changes (#277); the window-departure park narrowing;NotifyRetirement-on-active-entry subscriber invariant; the reachable equip-mid-conductor fail-fast; settle-CellId discard (#276-adjacent, see ISSUES).
- C3a — Runtime first-entry sequencing — COMPLETE at
-
C4 — remaining routes: 2 (ForcePosition), 3 (portal, with the
RuntimeWorldTransitState→RuntimePortalPlacementAuthorityadapter), 4 (remote Create/Position; deleteRemoteTeleportController/Placementand the inline MoveOrTeleport duplicate), 5 (projectile authoritative), 6 (drops + split-recovery marking), 7 (residual pickup/parent/delete polish). — route 2 COMPLETE AND USER-ACCEPTED 2026-08-03 (9966b531); routes 3/4/5/6/7 remain OPEN. Route 4 SPLIT into 4a and 4b (user-directed 2026-08-03). Scoping (2026-08-03-c4-route-4-scoping.md) put whole-route 4 at 1,500-2,500 production lines against a stated ~400 budget, so it is split to keep each landing reviewable:-
4a — the steady state. The classifier's
Interpolate(contact,PlayerDistance < 96 m) andNoPositionOperation(no contact) branches. NEITHER runs aSetPosition, so 4a has no deferred-cell park, no service-window work, and no placement-allocation exposure. Fixes two of the three unfiled divergences (the NPC airborne hard-snap that ignores the wireIsGroundedbit;ConstrainToarmed before the operation instead of after). Highest visible value — this is what makes creatures move smoothly. -
4b — the edges.
SetPosition/SetPositionSimple: teleport, far-snap (>= 96 m), and cell-less first placement. This is where the parks, the Position-time service-window guard, #277's broken bound, N3 (headless never callsRetryPending), and the third divergence (ConstrainTonever armed on the remote teleport branch) all live.4b also inherits 4a's ownership remainder — scheduled here, not implied by code comments. Two independent reviews flagged that 4a satisfies contract items 1 and 2 only partially, and the plan must carry that rather than leaving it in
// 4b deletes this fallbackcomments:- Runtime owns the classification, the request construction (one shared
builder,
RuntimeAcceptedPositionRouteRequests), the near-InterpolateTo decision with AP-87, and the post-operationConstrainTo. App still owns branch selection, the airborne early return, theRemoteMotion.CellIdwrite, theWorldEntitypose write, and the collision-shadow publish — all inLiveEntityNetworkUpdateController. - Item 2 ("both hosts drive the identical Runtime entry point") is
satisfied only VACUOUSLY:
RuntimeLiveEntitySessionControllerreturns early for remotes, so no no-window host exercises this path at all and nothing can diverge yet. That stops being true the moment a headless host needs remote motion. - Every legacy fallback 4a deliberately left in place is 4b's to delete:
the pre-operation unconditional
ConstrainTo, the player arm's!update.IsGroundedno-op, the player and NPC legacy near/far routing (each still carrying its own duplicate96f/4fconstants), and the airborne-precedence carve-out (LiveEntityNetworkUpdateController.ApplyRemoteContactRouting) that keeps a landing body snapping. Retiring the last one is a real behaviour decision — retail makes no player/NPC distinction there — and needs its own live evidence, not a silent convergence. - Register row AP-135 (the airborne no-op's retained acdream
bookkeeping: the server cell id for the free-fall sweep gate, and the
last-server-position sample) — CORRECTED 2026-08-04: this row does NOT
retire with 4b. Its own stated condition is retirement together with the
free-fall sweep gate (
RuntimeRemotePhysicsUpdater.cs:342), which 4b does not touch, and its sites are the airborne no-op branches — 4a-owned dispositions, not 4b's far-snap/teleport/cell-less. The trap is that those two writes sit physically insideOnPosition, which 4b rewrites heavily, so an implementer will assume they go. They stay. See2026-08-04-c4-route-4b-scoping-and-split.md. - 4b is itself split into 4b-1 / 4b-2 / 4b-3 (2026-08-04). Scoping put
4b at 1,300-2,200 production lines — 4-6x route 4a — plus ~2,500-3,500
lines of test work. 4b-1 is infrastructure with no remote behaviour change
(the per-entity placement owner, the service-window guard, the
refuse-rather-than-park policy, N3's headless
RetryPendingpump); 4b-2 is the far branch alone; 4b-3 is teleport/cell-less and the ~739-line class deletions. 4b-1 stays a separate landing regardless: it is where the park-withdraws-the-entity failure mode is decided, and it must not be reviewed alongside a large deletion. - 4b-2 LANDED at
7f1c1f5a(2026-08-04); far-snap connected gate USER-PASSED same day. Four fix rounds, eight Opus reviews; the slice was fully green at 10,990 / 10,997 / 11,004 while containing real defects (a frozen remote pinned as correct by its own test; a fallback that over-wrote on the exact retail paths that decline to store; a park guard incomplete on two independent axes). Final suite 11,009 / 4 / 0 against a measured 10,968 baseline — the 10,973 figure used earlier was wrong. Its real yield was a defect under routes 1 and 2, not the far snap:ParkDeferred's quiescence parks withdrew the entity and were never restorable whileForget(restoreCancelledPark: true)runs for every accepted Position on every entity. The restorable decision now lives insideParkDeferredafterSnapToCell, read against every live quiescence. Still outstanding: #309. TheACDREAM_PROBE_PARK=1capture from the accepting session shows 11 parks, allcause=unplaceable— zero quiescence-cause parks, so the shared-core park change is NOT yet connected-verified. Without the probe that session would have been recorded as a pass. Process lesson recorded: the round-1 defect was caused by the contract omitting "and still advance the pose", and the park defect should have been split into its own slice the moment it surfaced in round 2 instead of riding inside 4b-2 for three more rounds. Findings chain: contract → round 1 → round 2 → round 3 → round 4. Note the route-4 Create half is ALREADY DONE (C3b/C3c); the remaining work is steady-state remote Position plus the deletions. AP-131 is NOT retired by either sub-slice — see the scoping doc for why route 4 alone cannot. 4a contract:2026-08-03-c4-route-4a-contract.md. Route 2 connected gate PASSED (user, 2026-08-03). Provoked with the retail@pkliteentry-collision bump (69ba9486— the only reachable ACE trigger forObjectForcePosition; admin teleports advanceObjectTeleportand exercise route 3 instead, see2026-08-03-c4-route-2-visual-gate.md). The user observed the visible slide off the overlapped character (the ForcePosition applied), correct animation, no heading change, and no leash tethering or rubber-band after the correction — so the two named behaviour changes (ack after commit; noConstrainTore-arm on this route) are accepted live. Both Opus reviews PASS on the final diff after three FAIL rounds. Adjacent, NOT a route 2 regression: shipping@pklitemade PK Lite reachable for the first time and immediately exposed pre-existing PvP gaps — melee/ranged attacks refuse a PKLite target (auto-target retargets to the nearest other; auto-target off does nothing) while spells on the same target work. Under investigation; filed separately. Route 2 (ForcePosition) — implemented 2026-08-03, contract:2026-08-03-c4-route-2-contract.md, plan:2026-08-03-c4-route-2-implementation-plan.md.RuntimeAcceptedPositionDriveController(src/AcDream.Runtime/Session/RuntimeAcceptedPositionDriveController.cs) is the single accepted-Position execution seam for a ForcePosition on the already-live local player;LocalForcePositionTransactionandHeadlessSessionWorldProjection.BlipLocalPlayerare deleted, and the generic App render-tail is skipped for the local player's ForcePosition. Named behaviour changes (both retail-exact, ISSUES #285): the outbound ack now fires strictly after the canonical commit, and the constraint leash is no longer re-armed on this route (retail's FORCE_POSITION branch never reachesConstrainTo). Fix round (2026-08-03): both independent dual reviews (retail- conformance + architecture/adversarial) FAILed the first pass — see2026-08-03-c4-route-2-review-findings.mdfor the full R1-R9 list. The critical finding (R1) was that the DeferredCell park could not survive a single ACE broadcast interval in production (RuntimeEntityObjectLifetime.TryApplyPosition's unconditionalForgeton every accepted Position cancelled it before its collision generation could commit), silently dropping the correction forever;RuntimeAcceptedPositionDriveController.Advancenow detects the dead watch and re-issues from the entity's current canonical snapshot. R2/R3 restored headless's collision re-centering and login-window fallback; R4 stopped the force-ack from stealing a receipt the presentation sink had legitimately declined; R5/R6/R9 corrected false doc claims, closed a_pending-leak/overwrite gap, and fixed streaming-observer/pose-dirty side effects firing on a declined placement. R7 corrected a fixture bug (a dummy Setup sphere with its centre at the origin) that had been written up as a retail fidelity gain; R8 added App-layer double-write source pins and corrected an overclaimed single-ack test. Full detail:2026-08-03-c4-route-2-review-findings.md. Complete Release solution after the fix round: 10,853 passed / 4 skipped / 0 failed (baseline 10,844/4/0; first pass 10,848/4/0).
- Runtime owns the classification, the request construction (one shared
builder,
Acceptance item 2 is NOT met — recorded gap, B2 (2026-08-03 round 2). An earlier revision of this paragraph claimed R8 "added the App-layer double-write source pins the plan's own acceptance item required". That was a claim of coverage this changeset does not have, and it is corrected here rather than left as the citation a future session trusts (same rule that produced R7). The truth, per the adversarial review:
- First half — "the generic tail no longer double-writes the local
player": source-pinned, not proven. The pin is a regex/
Assert.SingleoverLiveEntityNetworkUpdateController's source text, so it would still pass if a second write were spelled differently, and no test exercises the branch at runtime. - Second half — "the committed projection is what moves the render
entity": uncovered at any layer. No test drives a route-2
ForcePosition through
RuntimePlacementPresentationSink/TryApplyRuntimePlacementPlaceand asserts theWorldEntityactually moved. Given R4 (the force-ack no longer consumes a declinedPlace), this is precisely the seam whose failure mode is silent: the canonical body moves and the render entity stays put. Closing this gap needs an App-layer test that runs the accepted ForcePosition end to end and asserts the render entity's position/cell came from the committed placement receipt — carry it into C5's parity tests or file it before this sub-landing closes. Not yet done: both reviews must be RE-RUN on this fixed diff, and the connected (user-gated) acceptance gate this campaign's standing discipline requires, before this sub-landing is considered closed — those, and the commit itself, are next. 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 — OPEN. 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.