docs: close out C4 — all routes landed, with the four owed gates and the process findings

C4's route work is complete. Records the landings, corrects the campaign
plan's now-false claims, updates the roadmap, and writes the successor
handoff at docs/research/2026-08-05-c4-closeout-handoff.md.

Routes, with review rounds and gate status:
  4a    44830a0e   |  4b-1  2e8e09ac
  4b-3  6dc7ba51   2 rounds; gate PASSED-partial (21cd6e9b), cellless unexercised
  5     36255af0   3 rounds, 8 MAJORs; NO live gate possible by design
  6     1b484937   zero production lines; its tests found #314
  7     cd3129e9   2 rounds + a required third pass, 5 MAJORs
  3     e0f96a55   3 rounds; found a 100%-dead production path
plus edc911b0 (the OnPosition dual-tail collapse), aaf0811f (#315),
daef7c98 (#314), a89bcb39 (#316 filed).

Suite 11,027 -> 11,090 passed / 4 skipped / 0 failed. Every checkpoint
0-failed; no test weakened, no Skip introduced.

FOUR CONNECTED GATES ARE OWED and none has been run. Each is recorded with
its recipe and a probe-gated pass criterion, because a clean-looking session
is not a pass: route 6 drops; route 7 equip/carry with
ACDREAM_PROBE_CHILD_CELL=1 (counts only if cause=propagate appears); route 3
portal/recall with ACDREAM_PROBE_LOCAL_TELEPORT=1 (counts only if [local-tp]
appears, and is explicitly NOT scored as covering #318); and 4b-3's
cause=cellless case — whose recorded recipe route 7 INVALIDATED, since
unwield-to-3D no longer yields a cell-less pre-merge cell. Its replacement
trigger is stated as UNESTABLISHED rather than guessed.

Campaign-plan corrections beyond the C4 section, all found by checking
against HEAD rather than trusting the text:
  - "six fixture failures ... classify before C5" — resolved as #281, and
    "six" was a mis-measurement; the measured baseline was 43.
  - "fold in #276 and #277" — #276 only partially (projectile half); #277 not
    at all, its trigger never fired.
  - "#269 slope-glide visual check" — #269 was closed 2026-07-31, BEFORE the
    plan was written. The surviving item is #278(b).
  - the 4b-2 bullet's "Still outstanding: #309" — re-scoped 2026-08-04;
    only the GotoLostCell half survives.

Seven process findings, each cited to a commit so a successor can check them:
  (a) THE CONTRACT CAUSES THE DEFECT — three defects this campaign came from
      a contract asserting a mechanism that did not exist; route 3's "Place
      re-fires" assumption released the player at the pre-teleport position.
      Route 7 adds the variant: enter_cell's part_array guard was correctly
      called load-bearing by the research, dropped by the contract, and
      inherited as an omission by the code — a right finding that evaporated
      across two handoffs with nobody re-reading the source.
  (b) INFERRING A FACT YOU CAN OBSERVE IS HOW A FIX GOES SILENT — route 3's
      round-2 fix inferred "committed" from a global PendingCount that three
      non-committing paths also clear, so the same bug completed cleanly and
      PASSED its invariant. Strictly worse than the defect it replaced.
  (c) PLANNING DOCS GO STALE ACROSS CUTOVERS — at least five were wrong
      against HEAD. Re-verify by symbol, never by line number; route 3's
      by-symbol sweep proved only 2 of 5 flagged files actually intersected.
  (d) A SKIPPED TEST IS A PERMANENT FALSE SIGNAL — refusing 7 skips uncovered
      a production bug that had made the entire portal arm dead code.
  (e) SABOTAGE-VERIFY, AND WATCH FOR TESTS READING A CONSTANT THEY PERTURB —
      one built a 64,000-node chain and stack-overflowed the host; another
      survived deleting the whole behaviour it claimed to pin, because its
      assertion read a field written unconditionally one line earlier.
  (f) REVIEWERS RETRACT, AND THAT IS THE PROCESS WORKING — three self-
      retractions, two of which prevented shipping a wrong register row or a
      relocated defect.
  (g) A GATE MUST BE ABLE TO SEE THE DEFECT IT GATES — three gates were
      unpassable or blind as specified and were corrected BEFORE being run.

Issues: #313, #316, #317, #318 open; #314, #315 closed. Register rows AP-141
through AP-145 added; AD-42 deleted, AD-2 amended.

C5 inherits #318's composition test (discriminating assertion:
PhysicsEngine.ShadowObjects must hold a row at the destination, not merely
the dedup cache), AP-145's cache-without-publish asymmetry, the #276/#277
remainders, and the probe-family strip.

Three things the closeout could NOT verify are stated as such rather than
smoothed: route 3 has no standalone round-3 review document (acceptance lives
in e0f96a55's message and both round-2 pass conditions); route 7's round
terminology differs across its own artifacts; and route 6's lack of dual
reviews is inferred from absent review docs, not stated anywhere.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Erik 2026-08-05 04:13:08 +02:00
parent e0f96a55bf
commit e0f788255d
4 changed files with 497 additions and 11 deletions

View file

@ -1417,8 +1417,9 @@ it. Do #297 FIRST — #298 depends on it.
stalled streaming and portal convergence is gone (`01f4791e`); and (f)
materialization/effect presentation is bound after canonical placement
(`f24532ad`, `175ad6b0`). The remaining item is (b): explicitly compare
lateral glide against impassable slopes with open #269 before closing this
bundle. Far terrain that can visibly continue building after portal reveal
lateral glide against impassable slopes before closing this bundle (the
original wording said "with open #269", but #269 was already DONE
2026-07-31 — the comparison itself is what survives). Far terrain that can visibly continue building after portal reveal
is tracked separately as #280.
- **#279 — DONE (2026-08-03, user-verified) — one-shot spell/effect
scripts arriving during the suppressed-until-receipt window were lost.**

View file

@ -89,12 +89,26 @@ The O(changed) collision-publication checkpoint and five stabilization fixes
through `175ad6b0` restore recenter convergence, remote world-frame placement
and targeting, distant Use, one-shot spell/projectile/static effects, and
login materialization; the corresponding connected user gates passed. The
campaign remains open for six fixture reconciliations, C4 routes 27, portal
destination prefetch #280, the final-binary C5 suite/soak/visual matrix,
AP-22 authored object shapes, and AD-10 remote contact-plane projection.
Current plan and copy-ready handoff:
fixture reconciliation closed 2026-08-03 as #281 (the recorded "six" measured
as 43). **C4 is implementation-complete 2026-08-05**: routes 2 (`9966b531`,
user-accepted), 4a (`44830a0e`), 4b-1/4b-2/4b-3
(`2e8e09ac`/`7f1c1f5a`/`6dc7ba51` — 4b-2's far-snap and 4b-3's teleport-ts
connected gates user-passed), 5 (`36255af0`, test-gated by design — ACE never
sends a missile UpdatePosition), 6 (`1b484937`, a zero-production-line
closure whose coverage tests found and fixed #314), 7 (`cd3129e9`, child-cell
propagation moved from a render tick into Runtime), and 3 (`e0f96a55`, the
canonical portal placement authority) all place through the canonical Runtime
owner; the complete Release suite measures 11,090 passed / 4 skipped /
0 failed. The campaign remains open for C4's four owed connected gates
(route 6 drops; route 7 equip/carry counted only with `cause=propagate`
probe lines; route 3 portal/recall counted only with `[local-tp]` probe
lines and not scored against #318; 4b-3's `cause=cellless` case, whose
recorded trigger route 7 invalidated), portal destination prefetch #280, the
final-binary C5 legacy-deletion/suite/soak/visual matrix, AP-22 authored
object shapes, and AD-10 remote contact-plane projection.
Current plan and successor handoff:
[`2026-08-02-placement-cutover.md`](2026-08-02-placement-cutover.md) and
[`NEXT-AGENT-PROMPT.md`](../research/2026-08-02-collision-throughput-handoff/NEXT-AGENT-PROMPT.md).
[`2026-08-05-c4-closeout-handoff.md`](../research/2026-08-05-c4-closeout-handoff.md).
---

View file

@ -43,19 +43,34 @@ with zero errors. The long connected soak and complete solution suite have
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.
**Resolved 2026-08-03 as #281 (DONE):** the "six selected fixture failures"
figure was itself a mis-measurement — the measured baseline found **43**
(28 App broken by `670f307c`, 2 more by `f24532ad`, 13 Runtime) — repaired
without weakening assertions (`6dcb94ac`, `98e9f9e8` and the recent-regression
cleanup closed at `2ef02f8c`); every later checkpoint's complete suite ran
0-failed.
Remaining campaign work, in order:
1. Reproduce and repair the six fixture failures without weakening their
assertions or adding compatibility bypasses.
assertions or adding compatibility bypasses. **DONE 2026-08-03 (#281
the real count was 43; see the correction above).**
2. Finish C4's routes 27 and remove their legacy placement writers; fold in
#276 and #277 where their route becomes authoritative.
#276 and #277 where their route becomes authoritative. **DONE 2026-08-05
except the four owed connected gates (see the C4 slice below). #276 was
folded only PARTIALLY — route 5 closed its projectile half; the
`SpawnPlacementSettler` settle-cell discard remains OPEN. #277 was NOT
folded: no streaming/broadcast radius changed, so its service-window
conversion remains a trigger-conditioned carry, not a completed item.**
3. Resolve #280 with retail's configured destination-prefetch window so the
portal viewport never reveals visibly constructing far terrain.
4. 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 `01f4791e` is evidence for that fix, not a
substitute for the final-binary soak.
substitute for the final-binary soak. **Correction 2026-08-05: #269 was
already closed and user-accepted 2026-07-31 (before this plan was
written); the surviving visual item is #278(b)'s lateral-glide
comparison, not #269.**
5. 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.
@ -309,6 +324,84 @@ same commit) → docs/handoff commit. No workarounds; no fused slices.
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.**
**C4 IMPLEMENTATION COMPLETE 2026-08-05.** Every route now places through
the canonical Runtime owner; the campaign's remaining C4 debt is exactly
the four owed connected gates listed at the end of this bullet. Per-route
record (each with contract + independent dual reviews per the standing
discipline; suite counts measured, never inherited — final complete
Release suite **11,090 passed / 4 skipped / 0 failed** at `e0f96a55`):
- **4a LANDED `44830a0e`; 4b-1 LANDED `2e8e09ac` (dormant
infrastructure); 4b-2 LANDED `7f1c1f5a`** (recorded in the sub-bullets
below with its four fix rounds and user-passed far-snap gate).
- **4b-3 LANDED `6dc7ba51` (2026-08-04)** — remote teleport + cell-less
through the canonical placement; `RemoteTeleportController` (605 lines),
`RemoteTeleportPlacement` (85), and ~1,709 test lines deleted. Dual
round 1 FAIL/FAIL → round 2 delta PASS/PASS; three NPC-arm MAJORs
closed. **Connected gate PASSED-partial (`21cd6e9b`)**: 16
`[remote-teleport]` probe lines over 7 creatures, all
`cause=teleport-ts``cause=cellless` was never observed and remains
test-covered only (owed gate 4 below). Docs at `8c269ad1`; findings
chain in `2026-08-04-c4-route-4b-3-*.md`.
- **Route 5 LANDED `36255af0` (2026-08-04)** — projectile authoritative
placement (#276 partial), preceded by a mandatory byte-decode gate
(`MoveOrTeleport` @0x00516330 never reads its velocity argument, which
also spawned #317). Three dual review rounds closing 8 MAJORs; round 3
retail PASS with the AP-141 risk-column retraction (C1), architecture
FAIL on a coverage-only C1 closed in-commit with two sabotage-verified
retry-arm tests. **NO connected gate exists for this route, by
design** — ACE never sends a missile UpdatePosition
(`WorldObject_Tick.cs:333-334`); every proof is deterministic-test-gated
and recorded as such. Interim landings alongside: the OnPosition
dual-tail collapse (`edc911b0`, whose scoping found and filed #316),
#315 closed (`aaf0811f`), #314 closed (`daef7c98`).
- **Route 6 CLOSED `1b484937` (2026-08-04) with ZERO production lines**
C3c had already flipped both drop flavours onto the canonical create
transaction; the landing is 7 sabotage-verified coverage tests, the
retail split-marking record (#313 filed for the `DeclareValid`
selection transfer), and the correction of this plan's own false
effect-replay premise (see the corrected gap list above). Its coverage
tests immediately found #314 (split recovery threw on retained
timestamps), fixed in its own commit `daef7c98`. **Connected gate owed**
(drops recipe — owed gate 1 below).
- **Route 7 LANDED `cd3129e9` (2026-08-04)** — child cell propagation
moved from a render tick into Runtime: retail `set_parent`'s attach-time
re-cell completed in `CommitAcceptedParentCellless`, the recursive
parent-cell-crossing propagation at the one directory funnel (iterative
worklist — the initial depth-64 cap was deleted after both round-2
reviews independently found its truncation residue was the #184 shape),
`TickChild` demoted to presentation-only, the headless parent-realize
drive added (its direct regression test failed before this work), and
the dead `ClassifyLeaveWorld` family deleted. Dual round 1 FAIL/FAIL →
round 2 delta PASS/PASS plus a coordinator-required third pass; 5
MAJORs. AP-142/AP-143 filed. **Connected gate owed** (equip/carry with
`cause=propagate` probe evidence — owed gate 2 below). Route 7 also
INVALIDATED 4b-3's recorded cell-less live recipe (contract §11; the
supersession note is appended to the 4b-3 contract).
- **Route 3 LANDED `e0f96a55` (2026-08-05)** — the LAST route: the first
production `RuntimePortalPlacementAuthority` producer, the portal arm on
route 2's drive controller, `CommitCanonicalTeleportFrame` with the
`PlayerTeleported` port (autorun cancel + one movement event), and both
duplicate authorities deleted (`LocalPlayerTeleportPlacement.Place`,
`ResynchronizeLocalPlayerForPortalArrival` — AD-42's row deleted with
them). Contract at `19ebf043`; scoping/propagation research at
`ca96ea5e`. Dual round 1 FAIL/FAIL → dual round 2 FAIL/FAIL (near miss)
→ round-3 fix pass accepted per both round-2 reviews' explicit pass
conditions; the round-3 record is the commit message plus #318 and
AP-144/AP-145 (no standalone round-3 review doc). The fix pass's
refusal to accept 7 skipped tests uncovered a real production bug (the
canonical portal arm was 100% dead code — the accepted-destination slot
it re-read at Place time was already consumed at Aim time). **Connected
gate owed** (portal/recall with `[local-tp]` probe evidence — owed gate
3 below — and explicitly NOT scored as covering #318).
- **The four owed connected gates**, with recipes and pass criteria in
[`2026-08-05-c4-closeout-handoff.md`](../research/2026-08-05-c4-closeout-handoff.md):
(1) route 6 drops; (2) route 7 equip/carry across landblock boundaries,
counted only with `[child-cell]` `cause=propagate` lines; (3) route 3
portal/recall, counted only with `[local-tp]` lines, not scored against
#318; (4) 4b-3's `cause=cellless` case, whose recorded trigger route 7
invalidated — the replacement provocation is UNESTABLISHED and needs its
own investigation. None has been run.
**Route 4 SPLIT into 4a and 4b (user-directed 2026-08-03).** Scoping
([`2026-08-03-c4-route-4-scoping.md`](../research/2026-08-03-c4-route-4-scoping.md))
put whole-route 4 at 1,500-2,500 production lines against a stated ~400
@ -386,7 +479,11 @@ same commit) → docs/handoff commit. No workarounds; no fused slices.
accepting session shows 11 parks, all `cause=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.
recorded as a pass. **Re-scoped 2026-08-04: #309 is largely superseded
by #312 (closed `b1f914d5`, user-passed); what survives is the narrow
`GotoLostCell` half — retail keeps a lost-cell object hidden until
`reenter_visibility`; acdream re-shows it on cancel. Re-scope before
running it.**
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
@ -485,6 +582,21 @@ same commit) → docs/handoff commit. No workarounds; no fused slices.
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.
**Inheritance recorded at C4 closeout (2026-08-05, full detail in
[`2026-08-05-c4-closeout-handoff.md`](../research/2026-08-05-c4-closeout-handoff.md)):**
the #318 end-to-end portal composition test, whose discriminating
assertion is that **`PhysicsEngine.ShadowObjects` holds a row at the
destination — not just `LocalPlayerShadowState`'s dedup cache** (AP-145's
cache-without-publish asymmetry is why a cache-only assertion is satisfied
by the bug); the route-3 C5 sweep candidates (`ILocalPlayerTeleportPlacement`
as a thin acknowledge seam; the test-only `BeginAcceptedPlacement`/
`BeginAuthoredPlacement` wrappers); #276's settle-cell remainder and
#277's trigger-conditioned conversion; #316's measure-before-fix, #317's
velocity-chain audit, #313, and #309's re-scoped narrow half; the
cell-less live-trigger investigation (owed gate 4); and the TEMPORARY
physics probe family strip (`REMOTE_LANDING`/`REMOTE_SLIDE`/`PARK`/
`REMOTE_TELEPORT`/`CHILD_CELL`/`LOCAL_TELEPORT`) — after, never before,
the four owed gates consume them.
After C5: AP-22 (authored collision shapes), then AD-10 (remote
contact-plane projection), then the campaign's final matrix and ledger

View file

@ -0,0 +1,359 @@
# C4 closeout handoff — every route landed; four connected gates owed (2026-08-05)
Written at C4's implementation closeout. **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`, HEAD **`e0f96a55`**
- **`main` is at `c7d5fc14` and 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,090 passed / 4 skipped / 0 failed** at
`e0f96a55`. This is the measured baseline (up from 11,027 at `2eb39a02`,
the previous handoff's figure). Any deviation is a regression you
introduced. Measure, never inherit:
```
$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; **#308** `NakEmissionTests.LossSoak_…`,
a wall-clock deadline in Core.Net.Tests that fails only under full-suite
load. A third look-alike (`WarmedSteadyContactRefreshDoesNotAllocate`)
appeared once during route 7 and was proven NOT route 7's by reachability
(zero `SetFullCell`/`ParentAttachments` references in the measured window) —
it is the #302 class.
## What landed this session
C4 is **implementation-complete**. Every route now places through the
canonical Runtime owner; what remains for C4 is exclusively the four owed
connected gates below, then C5.
| commit | what | review record |
|---|---|---|
| `6dc7ba51` | **route 4b-3** — remote teleport + cell-less through canonical placement; deletes `RemoteTeleportController` (605), `RemoteTeleportPlacement` (85), ~1,709 test lines | dual round 1 FAIL/FAIL → round 2 delta PASS/PASS; three NPC-arm MAJORs closed (A1 zero-arm leash regression, R1 missing D2 shape, R3/A2 synthesized run-cycle velocity). Docs at `8c269ad1` |
| `21cd6e9b` | 4b-3's connected gate recorded **PASSED (partial)** — 16 `[remote-teleport]` probe lines, 7 creatures, all `cause=teleport-ts`; `cause=cellless` never observed (gate 4 below) | — |
| `1b484937` | **route 6** — drops/split-recovery **closure, zero production lines**; 7 sabotage-verified coverage tests over the C3c-flipped path; corrected the campaign plan's false effect-replay premise | contract-governed closure, no dual reviews (nothing to review — the stop condition was "any production diff means the finding is wrong") |
| `daef7c98` / `b260bcd1` | **#314** — split recovery threw instead of recovering (retained Movement/ServerControlledMove timestamps). Found BY route 6's coverage tests, in the exact mechanism the scoping cited as evidence drops converge. Split into its own commit immediately (process rule 2) | — |
| `a89bcb39` | **#316 filed** — player-arm LANDING TRANSITION block never publishes the collision shadow. Found by the OnPosition-collapse scoping; neither 4b-3 review round caught it | — |
| `edc911b0` | the **OnPosition dual-tail collapse** — one shared player/NPC remote tail | — |
| `aaf0811f` / `30d3d114` | **#315 closed** — cached remote-arm callbacks instead of a per-packet `Func<bool>` closure (+ closing-SHA correction) | — |
| `36255af0` | **route 5** — projectile authoritative placement (#276 partial). Byte-decode hard gate first (`MoveOrTeleport` @0x00516330 never reads its velocity arg); conjunctive `ProjectileAuthoritative` predicate; AP-141 filed | three dual rounds, 8 MAJORs closed; round 3: retail PASS (C1 must-fix doc correction), architecture FAIL on coverage-only C1, closed in-commit with two sabotage-verified `Advance()` retry-arm tests |
| `cff52c44` | stale `set_velocity` comment correction at the 4a velocity commit (spawned #317) | — |
| `ca96ea5e` | research: retail parent-cell propagation settled + route 3 scoped | — |
| `19ebf043` | route 3 contract pinned (the portal producer adapter) | — |
| `cd3129e9` | **route 7** — child cell propagation moves from a render tick into Runtime; `ClassifyLeaveWorld` family deleted; headless parent-realize drive; iterative-worklist propagation (depth cap deleted); AP-142/AP-143 filed | dual round 1 FAIL/FAIL (R1R11 / A1A10) → round 2 delta PASS/PASS (N/B findings) → coordinator-required third pass (the depth-cap deletion both round-2 reviews independently demanded, N4/B3); 5 MAJORs total |
| `e0f96a55` | **route 3** — portal placement authority (local player); the first `RuntimePortalPlacementAuthority` producer; both duplicate authorities deleted; AP-144/AP-145 filed, AD-42 deleted, #318 filed | dual round 1 FAIL/FAIL → dual round 2 FAIL/FAIL (near miss) → round-3 fix pass accepted per both round-2 reviews' explicit pass conditions (§G of each). **No standalone round-3 review doc exists** — the round-3 record is the commit message, #318, and AP-144/AP-145 |
Suite trajectory across the session, all measured: 11,027 (`2eb39a02`) →
11,013 (`6dc7ba51`, net of the 1,709-line test deletion) → 11,020
(`1b484937`) → 11,036 (`30d3d114`) → 11,063 (`36255af0`) → 11,079
(`cd3129e9`) → **11,090 (`e0f96a55`)**. Zero failures at every checkpoint.
## The four owed connected gates — NONE has been run
These are the whole of C4's remaining debt. Each pass criterion includes its
probe evidence: **a clean-looking session with no probe lines is a not-run,
never a pass** (process rule 5; the 4b-2 #309 precedent and the 4b-3 partial
both exist because of this rule).
### Gate 1 — route 6: drops (user-run, visual)
Recipe (route 6 contract, Gates section):
1. Drop a whole item on open ground — lands at your feet, resting,
immediately pickable.
2. Split a partial stack to the ground — correct quantity on the pile,
remainder in inventory.
3. Drop a second item within ~1 m — both remain visible and separately
pickable.
4. Repeat once indoors and once after a portal recall.
5. Walk two landblocks away and back — both piles still there, still
pickable.
Pass criterion: all five visuals clean. Regressions to watch: item at world
origin or your *previous* position (stale pose); invisible but blocking
(#184 class); sunk into / floating above the floor; not pickable; the split
pile never appears (recovery window failed — the #314 mechanism); the second
drop swallowed by the first. No probe exists for this route (it is route-1
traffic); this is the one purely visual gate.
### Gate 2 — route 7: equip/carry across landblock boundaries (two-client)
`ACDREAM_PROBE_CHILD_CELL=1`. Recipe (route 7 contract §7):
1. Equip/unequip cycle — weapon then shield, five times, observer watching:
in the hand, at the hand, oriented with the hand, clean disappearance on
unwield.
2. **Carry across ≥2 landblock boundaries and back**, both directions of
observation, including one indoor/dungeon traversal (EnvCell-to-EnvCell
crossings are the high-frequency case).
3. Pickup: drop the weapon, pick it back up — leaves the ground, no ghost,
no invisible collider at the drop site.
4. Loot an equipped item from a kill (the delete edge under load).
5. Reconnect with equipment — re-attaches.
6. Portal recall while equipped — equipment present and following after
arrival.
**Pass criterion: the session counts ONLY if `[child-cell]` lines with
`cause=propagate` appear during step 2**, child cell always equal to the
player's. Regressions: weapon drawn at the world origin or its last ground
position; invisible while equipped; **left behind at a landblock boundary**
(the D4 demotion's specific risk); invisible-but-solid at a former position
(#184); child culled while the parent is visible or vice versa. The headless
half's direct regression test
(`DirectSink_D5_StandaloneParentEventCommitsChildToParentsExactCell`) is
already in-tree and green; a headless probe session
(`cause=headless-attach`/`propagate`) remains a nice-to-have per the
contract.
### Gate 3 — route 3: portal/recall (user-run, two-client)
Release build, `ACDREAM_RETAIL_UI=1`, `ACDREAM_PROBE_LOCAL_TELEPORT=1`, live
ACE. One session exercising, in order (route 3 contract §9):
1. a physical outdoor portal (e.g. Holtburg portal);
2. a dungeon portal (indoor destination — the EnvCell readiness path);
3. `/ls` lifestone recall AND one spell recall (the F751 recall family);
4. an ACE admin teleport of the LOCAL player (`@teleto`/`@teleloc`);
5. a same-destination revisit (ACE may omit CreateObject on revisit);
6. autorun through a portal — arrival must be at REST (the
`PlayerTeleported` port observable: autorun cancels on arrival);
7. graceful close.
**Pass criterion: the session counts ONLY if `[local-tp]` lines actually
appear** — one per arrival with `placement=Committed`, the portal
generation/sequence, resolved destination cell, `leash=armed`,
`autorun=cancelled`, and zero `Refused`/`Contention` lines in ordinary play.
Plus: the accepted purple-materialization visuals with no opaque pop, camera
reset behind the player, movement works immediately with W held, idle stance
(no run-in-place), no rubber-band/tether; a second client observing sees a
normal materialization and stance; the exact lifecycle/reconnect gate passes
with every `transitOwnership` counter zero at stable checkpoints. The two
refusal causes (`stale-reveal`, `host-token-unavailable`) now log through
`LogLocalTeleportArrival` under the same probe flag — the round-2 review's
blindness finding is fixed, so refusals cannot hide.
**This gate is explicitly NOT scored as covering #318.** The connected
session exercises the live path but asserts nothing about
`PhysicsEngine.ShadowObjects`; #318's composition test is a separate, C5
deliverable. Do not fold them.
Honest-gap rule carried from the contract: mid-transit supersession and
mid-transit disconnect are hard to provoke against ACE — if the session does
not produce them, record the stale-generation behaviour as
test-verified-only, never inside a blanket "gate passed".
### Gate 4 — route 4b-3's `cause=cellless` case: still unexercised, and its recorded recipe is now INVALID
The 4b-3 gate passed for `cause=teleport-ts` only (`21cd6e9b`). The recorded
closure recipe — "unwield-to-3D is the cheapest reachable trigger" — **was
invalidated by route 7** (route 7 contract §11; the supersession note is
already appended to the 4b-3 contract): after D1/D2, a committed child's
canonical cell is deterministically the parent's, so an unwield Position
arrives with a NON-zero pre-merge cell and classifies by
TELEPORT_TS/distance — which is retail's own predicate population (retail's
`unset_parent` does no cell work either). The old recipe only ever worked
because of the render-tick two-writer defect route 7 closed.
**The replacement trigger is UNESTABLISHED.** What is needed: a Position on
a body that is genuinely withdrawn/never-celled at merge time (between a
`CommitWithdrawal`/`CommitAcceptedParentCellless` cell-less edge and its
next accepted Position, or an initial Create that never resolved a cell).
Whether ACE ever emits an UpdatePosition in that exact window is not
established — this needs its own investigation before a live recipe can be
written down. Until then the cell-less arm remains covered by the synthetic
`PreMergeCommittedCellId == 0` fixtures only; do not re-label those as live
behaviour, and do not score any teleport-ts session against this gate.
## Open issues created or touched this session
| # | status | one line |
|---|---|---|
| #313 | OPEN | retail `DeclareValid`'s `SetSelectedObject` split-recovery selection transfer not ported; selection UX, deliberately kept out of the placement closure |
| #314 | **CLOSED** (`daef7c98`) | split recovery threw on nonzero retained Movement/ServerControlledMove timestamps — found by route 6's coverage tests in the exact mechanism cited as evidence of convergence |
| #315 | **CLOSED** (`aaf0811f`; SHA corrected `30d3d114`) | per-packet `runTeleportHook` closures replaced by cached remote-arm callbacks |
| #316 | OPEN | player-arm LANDING TRANSITION block never publishes the collision shadow. **Measure before fixing** — either a ~33 ms cosmetic lag or a real #184 instance; the issue names the measurement |
| #317 | OPEN | `TryCommitAuthoritativeVelocity`'s call site has no established retail basis (route 5's byte-decode disproved the comment it carried); needs a full accepted-Position velocity-chain audit |
| #318 | OPEN → C5 | route 3 §8 items 8/9/10 residual: no end-to-end composition test, no shadow assertion, no T8 ordering proof (below) |
| #309 | OPEN, re-scoped | largely superseded by #312 (closed `b1f914d5` last session); the surviving narrow half is retail's `GotoLostCell` hidden-until-`reenter_visibility` behaviour |
Register rows this session: **AP-141** (route 5 projectile shapes; narrowed
round 2, risk column corrected round 3 — the "drag toward a stale anchor"
claim retracted by its own author), **AP-142** (parented-child single-field
cell model; amended twice; clause (e)'s depth cap RETIRED outright —
replaced by the iterative worklist), **AP-143** (headless parent-realize
skips all three graphical attach validations; inertness argued per check),
**AP-144** (portal movement-event send gates on `UsePositionFromServer`
(`autonomy_level != 2`) where retail's `SendMovementEvent` gate is
`!= 0`; diverges only at unreachable level 1), **AP-145** (the
collision-shadow cache-without-publish asymmetry, carried as #318). AD-42
deleted (route 3 ported its last citation); AD-2 amended.
## What C5 inherits
1. **The #318 composition test** — drive a real portal arrival through the
canonical drive controller and the REAL `RuntimePlacementPresentationSink`
against a REAL `PhysicsEngine`, then assert
**`PhysicsEngine.ShadowObjects` holds a row at the destination
cell/position — not just `LocalPlayerShadowState`'s internal dedup
cache** — plus the T8 write ordering. That discriminating assertion
exists because of **AP-145's asymmetry**: `TryPublishPlace` calls
`LocalPlayerShadowState.Set` directly, a plain cache write that bypasses
`LocalPlayerShadowSynchronizer.SyncPose`'s `ShadowObjects` publish AND
pre-seeds `SyncPose`'s dedup check with the destination pose — so the
next movement tick can skip its own publish too. A test that asserts only
the cache is satisfied by the bug.
2. **The legacy-deletion sweep + closeout gates** (the C5 slice as planned):
parity tests, final-binary suite/soak/lifecycle routes, two-client
observation, user visual matrix; retire AP-1, AD-1, AP-131, AD-60's
legacy half; close #275. Named sweep candidates recorded by route 3:
`ILocalPlayerTeleportPlacement` (now a thin acknowledge seam) and the
test-only `BeginAcceptedPlacement`/`BeginAuthoredPlacement` wrappers.
3. **#280** (portal destination prefetch) — campaign plan item 3, its own
slice with its own visual gate; deliberately NOT bundled with route 3.
4. **#276 remainder** — route 5 closed only its projectile half; the
`SpawnPlacementSettler` settle-cell discard stays open. **#277** was not
folded (no radius changed); its service-window conversion remains
trigger-conditioned on any streaming/broadcast radius change.
5. **#316's measurement**, **#317's velocity-chain audit**, **#313**
(selection UX, outside placement), **#309's re-scoped narrow half**.
6. **The cell-less live-trigger investigation** (gate 4 above).
7. **The TEMPORARY probe family strip** once physics settles:
`ACDREAM_PROBE_REMOTE_LANDING`, `ACDREAM_PROBE_REMOTE_SLIDE`,
`ACDREAM_PROBE_PARK`, `ACDREAM_PROBE_REMOTE_TELEPORT`,
`ACDREAM_PROBE_CHILD_CELL`, `ACDREAM_PROBE_LOCAL_TELEPORT` — strip as a
family, but NOT before the four owed gates have consumed them.
## Process findings — stated as rules for the next session
These are distilled from what actually went wrong (and right) this campaign.
Each carries its citation so you can check it instead of trusting it.
**(a) The contract causes the defect.** Three separate defects came from a
contract asserting a mechanism that did not exist. Route 4b-2 round 1: the
contract said "arm `ConstrainTo` on refusal" without "and still advance the
pose" — a frozen remote. Route 7 R1: the contract enumerated `enter_cell`'s
five writes but silently dropped the `part_array` guard AROUND them — a
guard the propagation research itself had called "load-bearing"; the commit
message names it "a right finding that evaporated across two handoffs with
nobody re-reading the source". Route 3 round 1 (the worst): the contract
assumed `TeleportAnimEvent.Place` re-fires on later Ticks after a refusal;
it does not, so a refused Place released the player at the pre-teleport
position while the anim stream marched on. **Rule: before building on a
load-bearing premise, verify it in code at implementation start — a
contract's "the mechanism will retry" is a claim, not a fact, until you have
read the retry.**
**(b) Inferring a fact you can observe is how a fix becomes silent.** Route
3 round 2 "fixed" round 1 by inferring "the placement committed" from a
global `PendingCount == 0` — which three non-committing paths also produce
(including the drive's own documented modal outcome). The SAME bug then
completed cleanly and passed its invariant: strictly worse than round 1,
which at least tripped the portal-complete-before-materialized invariant.
Round 3 latches the commit where it actually happens
(`ReconcileAndAcknowledgePortal``TryConsumePortalCommit`, keyed on reveal
generation + teleport sequence), sabotage-verified on both hosts. **Rule:
never infer from an aggregate what the system can tell you directly. If the
observable exists, read it; if it does not, build it — an inference that
happens to correlate today is a defect with a delay timer.** (Commit
`e0f96a55`; arch round-2 B1.)
**(c) Planning documents go stale across cutovers.** Five (at least) were
wrong against HEAD this session: the campaign plan (route 6's effect-replay
premise `:98-100`, unsubstantiated — corrected at `1b484937`; the route-3
"adapter does not exist" line — only the producer was missing, corrected at
`e0f96a55`'s docs); the 2026-08-02 cutover route inventory (wrong in eight
enumerated ways — route 3 scoping §3); the routes-6-7 scoping (five
substantively false or superseded claims — route 7 contract §10); the
2026-07-16 portal-completion pseudocode (portal arrival attributed to
`enter_world`, which is the login path — corrected in `e0f96a55`); and the
2026-08-04 session handoff (#280 bundling overridden with cause; its
cell-less recipe later invalidated by route 7). Related: the 2026-08-03
handoff's "six fixture failures" was a mis-measurement — the baseline found
43 (#281). **Rule: re-verify every inherited claim by symbol, never by line
number; measure every count, never inherit one; and when you correct a
document, date the correction in place rather than deleting the history.**
**(d) A skipped test is a permanent false signal.** Route 3's fix pass
refused to accept 7 skipped tests and drove the count to zero — and that
refusal uncovered a production bug that made an entire code path dead:
`TryExecuteCanonicalPortalPlacement` re-read the accepted destination at
Place time, but `TryBeginPortalReveal` had already consumed that slot at Aim
time, so the canonical portal arm was 100% dead code and every real Place
would have refused with `host-token-unavailable`. The skips were the only
symptom. **Rule: a skip is an assertion nobody is making. Do not park a
test as skipped to protect a green count — the thing it cannot assert is
exactly where the defect is.** (Commit `e0f96a55`.)
**(e) Sabotage-verify — and beware a test that reads a production constant
it also perturbs.** Every new discriminating test this session was
sabotage-verified (break the behaviour, watch the test fail, restore). Two
findings sharpen the practice. First: route 7 shipped a test that survived
deleting the entire behaviour it claimed to pin, because its assertion read
a field (`WorldEntity.ParentCellId`) written unconditionally one line before
the demoted call — the sabotage must be run in BOTH directions (canonical
half and presentation half separately; route 7 contract §6 test 10).
Second: the route-7 depth test both READ `MaxPropagationDepth` and SIZED its
chain by it — so a perturbation of the constant built a 64,000-node chain
and stack-overflowed the test host (arch round-2 B7, which then swept
`tests/` for the same shape and found one more with real blast radius:
`LandblockLoaderTests.cs:210`). **Rule: sabotage both halves of every
dual-layer assertion, and never derive a test's workload from the constant
under test — pin the constant with a literal first, then use literals.**
**(f) Reviewers retract; that is the process working.** Three
self-retractions this campaign, two of which prevented shipping a wrong
register row or a relocated defect: (1) route 5 round 1's R6 finding was
retracted the following round as factually wrong — and complying with it had
produced the campaign's one recorded fix-round defect, the `ParentCellId`
regression; the round-3 fix is the REVERT to `record.FullCellId`, not the
relocation R6 demanded. (2) Route 5 round 3's §C1: the retail reviewer
retracted their OWN round-2 claim that a stale leash "would drag the body
toward a stale anchor" ("I wrote the mistake it was copied from") — the
port's `ConstraintManager` brakes, never pulls — preventing a wrong AP-141
risk column from landing in the register. (3) Route 3's retail round-1 §3.4
premise (that `TryApplyRuntimePlacementPlace` writes no pose) was verified
WRONG by round 3 — it does write pose/rotation/`ParentCellId` and rebucket —
dissolving the original blocking concern into #318's narrower coverage gap
instead of a relocated "fix". **Rule (recorded in route 5's own commit):
review findings are evidence to re-verify against the code, not commands to
obey unconditionally — and a reviewer who retracts with cause is
strengthening the record, not losing face.**
**(g) Gates must be able to see the defect they gate.** Three gates were
unpassable or blind as originally specified and were corrected BEFORE being
run: (1) 4b-3's recipe named "a second character" as the teleport target —
but a player-guid target cannot reach the NPC arm at all
(`RemoteServerControlledVelocityCycle.Apply` early-returns for `0x50xxxxxx`
guids), and all three of the fix round's MAJORs lived on the NPC branch, so
a player-target run would have reported a clean pass over all three;
corrected to creature-target (`@teleto` a drudge), and the passed gate's 16
probe lines prove the NPC branch ran. (2) Route 3's two refusal causes
logged under `ACDREAM_PROBE_TELEPORT` — a DIFFERENT flag from the gate's
pinned `ACDREAM_PROBE_LOCAL_TELEPORT` environment — so a refusing session
would have looked identical to a committing one; rerouted through
`LogLocalTeleportArrival` before the gate (retail round-2 finding). (3)
4b-3's cell-less closure recipe was invalidated by route 7 and is recorded
as UNESTABLISHED (gate 4) instead of being left on file as a recipe that can
no longer fire. Related in kind: route 5 has NO live gate by design (ACE
never sends a missile UpdatePosition — `WorldObject_Tick.cs:333-334`) and
says so, rather than inventing one. **Rule: before running any gate, walk
the chain from the defect to the evidence channel and confirm each link
actually fires under the gate's exact environment — and when a gate cannot
exist, record that, never a substitute that measures something else.**
## Connected-test recipes that worked (carried forward)
- **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.
- **Remote teleport (4b-3):** `@teleto`/`@teleloc` a CREATURE into view —
never a player character (see rule (g)).
- Graceful close matters — a hard kill leaves ACE holding the session
~3 minutes.