Closes #312 as user-confirmed, with the caveat recorded rather than buried: the accepting session's probe capture showed 22 parks and zero park-restores, so the restoration path was not observed executing. If an invisible-remote report recurs, that is where to start. Re-scopes #309 as largely superseded by #312 — the presentation restore is the behaviour its connected check was written to probe. What survives is the narrower faithfulness question: retail's GotoLostCell keeps a lost-cell object hidden until reenter_visibility, where acdream re-shows it on cancel. Adds the handoff itself: branch state and the measured 11,027 baseline, the two known flakes and the standing instruction not to conflate them, per-route scope with the retail addresses and the traps already paid for (teleport_hook runs BEFORE the placement; route 5 has no possible live gate because ACE never sends UpdatePosition for a missile; route 6 needs zero production lines and the campaign plan carries a false premise about create-time effects; route 7 must write the child cell at BOTH the set_parent analog and the per-commit position analog), and the six process rules this session paid for — chiefly that the contract causes the defect, that a slice must split on discovery, and that a green suite and a clean-looking live session are both non-evidence. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
7.6 KiB
C4 handoff — routes 4b-3, 5, 6, 7, 3 (2026-08-04)
Written at the end of a long session. Read this before touching anything.
Where the branch is
- Worktree
C:\Users\erikn\source\repos\acdream\.claude\worktrees\peaceful-visvesvaraya-e0a196 - Branch
claude/acdream-physics-divergence-5aa784, HEAD2eb39a02 mainis atc7d5fc14and must stay there. The commits on this branch are deliberately unmerged. Do not merge, rebase, or push unless the user asks.- Complete Release suite: 11,027 passed / 4 skipped / 0 failed. This is the
baseline. Any deviation is a regression you introduced.
$env:ACDREAM_PAK_PATH = "$env:USERPROFILE\Documents\Asheron's Call\acdream.pak" dotnet test AcDream.slnx -c Release -m:1 - Two known flakes — do not chase, and do not conflate (they have been
conflated twice): #302
PortalProjectionTests.ClipToRegion_FrameOwnedStore_…, a GC-allocation assertion in App.Tests; #308NakEmissionTests.LossSoak_…, a wall-clock deadline in Core.Net.Tests that fails only under full-suite load.
What landed this session (all user-accepted)
| commit | what |
|---|---|
634bc551 |
park restore — shipped defect, separate from the feature it was found in |
2e8e09ac |
route 4b-1, dormant infrastructure |
7f1c1f5a |
route 4b-2 — remote far snap; far-snap walk passed |
204d0ae0 |
remote slide on steep faces (#32 remote half) |
b1f914d5 |
presentation restored on cancelled park (#312) |
2eb39a02 |
AP-140 — route remote Positions on contact, not walkability |
Plus scoping/research commits 07e97939, 11a87428, 1b631f12 and doc
corrections f058dfc9, 97b22b86, f4f25795.
What is left, in order
4b-3 — remote teleport + cell-less. ~400-700 production lines. Deletes
RemoteTeleportController (605 lines), RemoteTeleportPlacement (85),
RemoteShadowPlacementSynchronizer (49) and ~1,709 lines of their tests.
Retail: MoveOrTeleport @0x00516330's cell-less/teleport branch @0x00516386 →
teleport_hook @0x005163EF → SetFlags(0x1012) @0x00516414 → SetPosition
@0x00516420 → return 1 @0x00516438. teleport_hook @0x00514ED0 runs BEFORE
the placement and is CancelMoveTo + UnStick + StopInterpolating +
UnConstrain + TargetManager teardown + report_collision_end(this, 1)
@0x00514F31. The classifier already carries
RuntimeTeleportHookPhase.BeforePositionOperation for that branch
(RuntimeAuthoritativePositionRouteClassifier.cs:410) and currently
records-and-drops it for the remote arm. 4b-3 retires AP-137's cell-less
enqueue-vs-place delta — today acdream enqueues where retail places
unconditionally, at any distance.
5 — projectile. ~180 non-comment lines; half already shipped (the
Create half and the residence-window Position half are canonical). What remains
is the post-residence accepted Position, short-circuited before the classifier
at LiveEntityNetworkUpdateController.cs:1428-1448. Must land after 4b-2
(done) because it widens RuntimeRemotePlacementDriveController.OwnsPlacement,
which excludes ProjectileAuthoritative today. No live gate is possible:
ACE never sends UpdatePosition for a missile (the one site is commented out at
WorldObject_Tick.cs:333-334). Test-gated; say so rather than inventing a gate.
Scoping: docs/research/2026-08-04-c4-route-5-scoping.md.
6 — drops. ZERO production lines. C3c already satisfied it; a dropped item
classifies as route 1's shape and both drop flavours converge on
LiveEntityHydrationController.OnCreate. The campaign plan's "replay
create-time effects" requirement is a false premise — correct
docs/plans/2026-08-02-placement-cutover.md:98-100. Retail's "split-recovery
marking" is a selection transfer (UIAttemptSplitTo3D @0x0058D850,
DeclareValid @0x0058E340), missing but not placement — file outside C4.
Scoping: docs/research/2026-08-04-c4-routes-6-7-scoping.md.
7 — pickup / parent / delete. ~300-490 lines, one slice, must not be
split. Retail performs NO placement here (DoPickupEvent @0x00452240 =
unset_parent + leave_world; DoParentEvent @0x00452290 = set_parent +
SetPlacementFrame), so it inverts 4b-2's rule: never arm ConstrainTo.
The real defect: a parented child's canonical cell has two writers, and acdream
re-cells it from a render tick (EquippedChildRenderController.TickChild:408),
so headless parented children stay cell-less forever.
Blocker resolved — docs/research/2026-08-04-retail-child-cell-ownership.md:
retail propagates via enter_cell @0x00510ed0 recursion and an explicit
depth-1 child loop in SetPositionInternal @0x0051539c-@0x005153d8. set_parent
@0x00515a90 contains no cell write. The Runtime replacement must write the
child's cell at BOTH the set_parent analog AND the per-commit position
analog — a set_parent-only write is correct at attach and stale on the
parent's first cell crossing.
3 — portal (local player). Last. Needs the
RuntimeWorldTransitState → RuntimePortalPlacementAuthority adapter, which
does not exist. #280 rides with it.
Process rules learned the hard way this session
- The contract causes the defect. Route 4b-2's round-1 freeze traced
directly to my contract saying "arm
ConstrainToon refusal" without saying "and still advance the pose." Write what must remain true, not only what must change. - Split on discovery. When a slice uncovers a defect outside its scope, commit it separately immediately. 4b-2 carried a shared-core park defect through three extra review rounds because it wasn't split.
- A green suite is not evidence. This slice was green at 10,990 / 10,997 / 11,004 while containing real defects, twice including a permanently invisible-and-intangible entity.
- Tests must assert the layer that broke. #312 shipped because the park
restore's tests asserted
InWorld/ clock / residency — exactly the three fields eight reviews had named — while presentation stayed torn down. - A clean-looking live session is not a passed gate. Confirm the code path actually executed (probe line, counter), not just that nothing looked wrong.
- Stale comments are endemic — six consecutive slices shipped comments asserting behaviour the code no longer had, including inside the round meant to end it. Verify every comment you touch against the code beside it, and prefer symbol references to line numbers.
Open, not blocking
- #309 — largely superseded by #312; re-scope before running. What survives
is narrow: retail's
GotoLostCellkeeps a lost-cell object hidden untilreenter_visibility; acdream re-shows it on cancel. - #32 residuals —
LeaveGroundchatter bound, the!Okairborne latch, and thecontact_allows_movewatch item (a remote lacking Contact|OnWalkable silently loses action animations — the literal root cause of closed #270). If a "missing attack/cast animation on flat ground" report appears, start there. - Diagnostic probes are still in the tree and are marked TEMPORARY:
ACDREAM_PROBE_REMOTE_LANDING,ACDREAM_PROBE_REMOTE_SLIDE,ACDREAM_PROBE_PARK. Strip as a family when the physics work settles.
Connected-test recipes that worked
- Far snap: stand still; second character runs past ~100 m, stops, turns, runs back. Three or four times.
- Steep slide: second character jumps onto a sloped roof.
- Park: move to a landblock not visited this session, have the remote arrive while it is still streaming, have them take a step, then stand still.
- Graceful close matters — a hard kill leaves ACE holding the session ~3 minutes.