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: 4a44830a0e| 4b-12e8e09ac4b-36dc7ba512 rounds; gate PASSED-partial (21cd6e9b), cellless unexercised 536255af03 rounds, 8 MAJORs; NO live gate possible by design 61b484937zero production lines; its tests found #314 7cd3129e92 rounds + a required third pass, 5 MAJORs 3e0f96a553 rounds; found a 100%-dead production path plusedc911b0(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:
parent
e0f96a55bf
commit
e0f788255d
4 changed files with 497 additions and 11 deletions
|
|
@ -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.**
|
||||
|
|
|
|||
|
|
@ -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 2–7, 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).
|
||||
|
||||
---
|
||||
|
||||
|
|
|
|||
|
|
@ -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 2–7 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
|
||||
|
|
|
|||
359
docs/research/2026-08-05-c4-closeout-handoff.md
Normal file
359
docs/research/2026-08-05-c4-closeout-handoff.md
Normal 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 (R1–R11 / A1–A10) → 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.
|
||||
Loading…
Add table
Add a link
Reference in a new issue