docs: hand off placement campaign finish

This commit is contained in:
Erik 2026-08-03 12:54:47 +02:00
parent 175ad6b0d0
commit 205f3fea6f
8 changed files with 441 additions and 176 deletions

View file

@ -52,26 +52,17 @@ What does NOT go here:
review). Related narrowing: a remote whose landblock leaves the review). Related narrowing: a remote whose landblock leaves the
headless service window between ProjectSpawn and placement commit headless service window between ProjectSpawn and placement commit
still parks (route 8, rarer than the pre-F7 leak). still parks (route 8, rarer than the pre-F7 leak).
- **#278 — OPEN — post-C3c user-session triage bundle (2026-08-02 - **#278 — NARROWED 2026-08-03 — post-C3c user-session triage bundle.**
observations).** (a) purple materialization haze re-fires while Resolved and user-verified: (a) the persistent login purple haze no longer
standing still — traced to the Hidden/UnHide script re-firing on a races raw PlayerCreate receipt (`175ad6b0`); (c) `/ls` works; (d) remote
visibility edge; most plausible driver is the pre-existing `6b28ff99` monsters no longer pop in behind the player or place/attack in a different
streaming-convergence regression (its dedicated slice precedes C5) — coordinate frame (`670f307c`); (e) the retirement-receipt replay loop that
re-observe after that slice; (b) no lateral glide when walking against stalled streaming and portal convergence is gone (`01f4791e`); and (f)
impassable slopes — verify against open #269 (Campaign P slope-slide materialization/effect presentation is bound after canonical placement
residual) in the session before treating as new; (c) ~~`/ls` command (`f24532ad`, `175ad6b0`). The remaining item is (b): explicitly compare
reported non-working~~ — RESOLVED 2026-08-02: user confirmed `/ls` lateral glide against impassable slopes with open #269 before closing this
works in-client; the earlier report was environmental noise. bundle. Far terrain that can visibly continue building after portal reveal
**Smoke-test additions (2026-08-02 evening, retail-UI session):** is tracked separately as #280.
(d) monsters pop into existence late — appear on radar BEHIND the
running player; (e) recall spends far longer in portal space than
retail, occasionally sticks there; (f) on portal exit the character
pops in instead of being visible at reveal. (d)/(e)/(f) are the
`6b28ff99` publication-throughput regression made user-visible by
C3c's retail-correct wait-for-collision placement order (spawns no
longer hand-place ahead of publication); expected to resolve with the
O(changed)-clone slice — re-verify all three in its acceptance
session.
- **#279 — DONE (2026-08-03, user-verified) — one-shot spell/effect - **#279 — DONE (2026-08-03, user-verified) — one-shot spell/effect
scripts arriving during the suppressed-until-receipt window were lost.** scripts arriving during the suppressed-until-receipt window were lost.**
`EntityEffectController` now retains the mixed F754/F755 FIFO behind an `EntityEffectController` now retains the mixed F754/F755 FIFO behind an
@ -80,7 +71,7 @@ What does NOT go here:
resources. Live rebuckets also keep the effect cell synchronized with the resources. Live rebuckets also keep the effect cell synchronized with the
entity cell. Spell buffs, recalls, arrows, and combat spell projectiles were entity cell. Spell buffs, recalls, arrows, and combat spell projectiles were
verified in the connected client; focused effect, projectile, and verified in the connected client; focused effect, projectile, and
cell-transition tests cover the race. cell-transition tests cover the race. Landed at `f24532ad`.
- **#280 — OPEN — portal reveal can expose an incompletely streamed distant - **#280 — OPEN — portal reveal can expose an incompletely streamed distant
landscape.** User-observed 2026-08-03: after some recalls, the nearby landscape.** User-observed 2026-08-03: after some recalls, the nearby
destination is playable but terrain near the far end of the view continues destination is playable but terrain near the far end of the view continues

View file

@ -1,6 +1,6 @@
# acdream — strategic roadmap # acdream — strategic roadmap
**Status:** Living document. Updated 2026-07-27. **M3 landed; M4 is active.** M3's retail casting/UI, R6 locomotion/collision/projectile/teleport/radar rebaseline, deterministic fresh-login/portal world lifecycle, and final two-client portal observer flow are user-gated. All eight slices of the behavior-preserving ownership campaign in [`docs/architecture/code-structure.md`](../architecture/code-structure.md), their automated closeout, and the user's connected visual matrix are complete. Modern Runtime J3 canonical entity/object lifetime and J4 gameplay-state ownership are closed at `89e6b207`; J5.1 canonical selection/combat/target-mode ownership is closed at `b298f99f`, J5.2 interaction transactions at `f5f7b417`, J5.3 combat/magic intent at `20df9d15`, J5.4 local movement/outbound cadence at `aa3f4a60`, J5.5 per-session physics/remote simulation at `7e6033d0`, J5.6 projectile simulation at `2aee3356`, and J5.7 combined simulation closeout at `cdee7a4b`. J6.1 world-environment ownership is closed at `902076c0`; J6.2 canonical reveal generation and typed destination readiness is closed at `a6860d55` plus `acb845d8`; J6.3 exact F751/Position destination correlation is closed at `6a063a27`; J6.4 exact graphical-host acknowledgement and owner cleanup is closed at `18d17d8b`. J7's one graphical `GameRuntime` root is closed at `ce41efb9`, including the user's 2026-07-27 exact post-cutover visual acceptance. J8 closed Slice J at `a9a822f2` with one shared graphical/no-window root and generation-reset transaction. Slice K Linux headless/multi-session work is closed. K0's tested no-presentation Windows/Linux boundary closed at `aada8a37`, K1's portable single-session host at `f8cb840f`, K2's deterministic scheduler and shared bot API at `7e8acb74` plus `38e83640`, and K3's shared-content/isolation plus connected observer gate at `3f340125`. K4 closed through `776482da`: 1/5/10/30-root isolation and two-hour simulated endurance, death/randomized cancellation, committed resource ceilings, ten minutes of exact native Linux two-account connected sampling, ACE-confirmed graceful logout, and zero-debt Runtime/content convergence all pass. Slice L Linux graphical/platform work is parked at its L1 implementation checkpoint by user direction on 2026-07-27. Issue #225's lifestone/particle alpha comparison remains a separate rendering visual gate. **Status:** Living document. Updated 2026-08-03. **M3 landed; M4 is active.** M3's retail casting/UI, R6 locomotion/collision/projectile/teleport/radar rebaseline, deterministic fresh-login/portal world lifecycle, and final two-client portal observer flow are user-gated. All eight slices of the behavior-preserving ownership campaign in [`docs/architecture/code-structure.md`](../architecture/code-structure.md), their automated closeout, and the user's connected visual matrix are complete. Modern Runtime J3 canonical entity/object lifetime and J4 gameplay-state ownership are closed at `89e6b207`; J5.1 canonical selection/combat/target-mode ownership is closed at `b298f99f`, J5.2 interaction transactions at `f5f7b417`, J5.3 combat/magic intent at `20df9d15`, J5.4 local movement/outbound cadence at `aa3f4a60`, J5.5 per-session physics/remote simulation at `7e6033d0`, J5.6 projectile simulation at `2aee3356`, and J5.7 combined simulation closeout at `cdee7a4b`. J6.1 world-environment ownership is closed at `902076c0`; J6.2 canonical reveal generation and typed destination readiness is closed at `a6860d55` plus `acb845d8`; J6.3 exact F751/Position destination correlation is closed at `6a063a27`; J6.4 exact graphical-host acknowledgement and owner cleanup is closed at `18d17d8b`. J7's one graphical `GameRuntime` root is closed at `ce41efb9`, including the user's 2026-07-27 exact post-cutover visual acceptance. J8 closed Slice J at `a9a822f2` with one shared graphical/no-window root and generation-reset transaction. Slice K Linux headless/multi-session work is closed. K0's tested no-presentation Windows/Linux boundary closed at `aada8a37`, K1's portable single-session host at `f8cb840f`, K2's deterministic scheduler and shared bot API at `7e8acb74` plus `38e83640`, and K3's shared-content/isolation plus connected observer gate at `3f340125`. K4 closed through `776482da`: 1/5/10/30-root isolation and two-hour simulated endurance, death/randomized cancellation, committed resource ceilings, ten minutes of exact native Linux two-account connected sampling, ACE-confirmed graceful logout, and zero-debt Runtime/content convergence all pass. Slice L Linux graphical/platform work is parked at its L1 implementation checkpoint by user direction on 2026-07-27. Issue #225's lifestone/particle alpha comparison remains a separate rendering visual gate.
**Purpose:** One source of truth for where the project is and where it's going. Every observed defect or missing feature has a named phase that owns it; when something looks wrong in-game, look here to find the phase that'll address it. Implementation details live in per-phase specs under `docs/superpowers/specs/`, not in this file. **Purpose:** One source of truth for where the project is and where it's going. Every observed defect or missing feature has a named phase that owns it; when something looks wrong in-game, look here to find the phase that'll address it. Implementation details live in per-phase specs under `docs/superpowers/specs/`, not in this file.
**Slice L checkpoint:** L0 closed at `66f114b2` with one typed graphical **Slice L checkpoint:** L0 closed at `66f114b2` with one typed graphical
@ -62,7 +62,7 @@ crowd, two-client remote/door/portal, and shallow-water behavior. The user
waived the general sweep and explicitly deferred the barred-house gate as waived the general sweep and explicitly deferred the barred-house gate as
#274. The later exact-location #273 tight-gap gate is now fixed and accepted. #274. The later exact-location #273 tight-gap gate is now fixed and accepted.
**Remaining physics-divergence closeout (ACTIVE 2026-07-31):** the user then **Remaining physics-divergence closeout (ACTIVE, checkpoint 2026-08-03):** the user then
authorized retirement of the remaining proven collision/placement gaps before authorized retirement of the remaining proven collision/placement gaps before
vendor work resumes. Nested retry, edge/StepDown/Path-6 ordering, exact cell vendor work resumes. Nested retry, edge/StepDown/Path-6 ordering, exact cell
availability, atomic collision generations, canonical Core SetPosition, availability, atomic collision generations, canonical Core SetPosition,
@ -84,12 +84,17 @@ execution-time retail Position routing, shared apply bodies keeping one
snapshot store in lockstep, and converged ownership ledgers on every snapshot store in lockstep, and converged ownership ledgers on every
abandonment path — dual independent reviews PASS; register rows abandonment path — dual independent reviews PASS; register rows
AD-59/AD-60/AP-130/AP-131/AP-132/TS-62/TS-63 filed in the same commit. AD-59/AD-60/AP-130/AP-131/AP-132/TS-62/TS-63 filed in the same commit.
Production Create registration is not yet cut over (the executor has no Production initial Create registration is now cut over by C3c (`529e0e9d`).
production caller). Next is the all-host/all-route cutover which can retire The O(changed) collision-publication checkpoint and five stabilization fixes
AP-1/AD-1 behind its connected/visual gates. AP-22 authored object shapes and through `175ad6b0` restore recenter convergence, remote world-frame placement
AD-10 remote contact-plane projection follow, then the final matrix and and targeting, distant Use, one-shot spell/projectile/static effects, and
ledger closeout. Current handoff: login materialization; the corresponding connected user gates passed. The
[`2026-08-02-runtime-continuation-executor-handoff.md`](../research/2026-08-02-runtime-continuation-executor-handoff.md). 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:
[`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).
--- ---

View file

@ -109,12 +109,18 @@ through the canonical SetPosition lifecycle. Independent retail-conformance
and architecture/adversarial reviews both PASS after five implementation and architecture/adversarial reviews both PASS after five implementation
rounds; register rows AD-59/AD-60/AP-130/AP-131/AP-132/TS-62/TS-63 document rounds; register rows AD-59/AD-60/AP-130/AP-131/AP-132/TS-62/TS-63 document
the slice's deviations; Runtime tests 903/903, complete Release solution the slice's deviations; Runtime tests 903/903, complete Release solution
10,696/4 skips. Production Create registration is still NOT cut over — the 10,696/4 skips. Production initial Create registration is now cut over by C3c
executor has no production caller. The remaining order is the all-host/ (`529e0e9d`). The O(changed) collision-publication checkpoint and
all-route cutover (which can retire AP-1/AD-1 behind its connected/visual stabilization fixes `01f4791e`, `670f307c`, `1fc529cd`, `f24532ad`, and
gates), AP-22 shape fidelity, AD-10 remote contact-plane projection, and the `175ad6b0` are connected user-accepted for recenter convergence, remote
final matrix/ledger closeout. Resume Slice 5 vendor browsing only after that monster/static placement and targeting, distant Use, spell/projectile/static
closeout or a new explicit user direction. VFX, and login materialization. The remaining order is six selected-fixture
reconciliations, C4 routes 27, portal destination prefetch #280, C5's
final-binary complete suite/soak/two-client matrix, AP-22 shape fidelity,
AD-10 remote contact-plane projection, and final ledger closeout. Resume Slice
5 vendor browsing only after that closeout or a new explicit user direction.
Canonical checkpoint:
[`2026-08-02-placement-cutover.md`](2026-08-02-placement-cutover.md).
The separately authorized modern-runtime performance program has completed The separately authorized modern-runtime performance program has completed
Slices AD: corrected measurement, prepared-package bake/dedup, package-only Slices AD: corrected measurement, prepared-package bake/dedup, package-only

View file

@ -6,6 +6,60 @@ residence + continuation-executor owner (`38fd4b8d` / `30012361` /
`5db3de3c`), delete the legacy duplicate authorities, and retire AP-1/AD-1 `5db3de3c`), delete the legacy duplicate authorities, and retire AP-1/AD-1
behind connected + user-visual gates. behind connected + user-visual gates.
## Handoff checkpoint — 2026-08-03
**Status: stabilization checkpoint accepted; campaign closeout is not yet
complete.** The C3c production cutover and the O(changed) collision
publication checkpoint are now playable after five separately committed
root-cause fixes:
- `01f4791e` stops origin recenter from manufacturing and replaying a second
retirement receipt for a pending-only live-projection bucket. Its exact
binary passed the complete Release suite, lifecycle route, and canonical
nine-stop soak (`connected-r6-soak-20260802-204309`, nine stops, zero
failures/wait cues/pending retirements).
- `670f307c` keeps remote Create placement, the local-player physics host,
targeting, chasing, and attacks in the same world-coordinate frame. The
user accepted monster placement/chase/hit behavior and static placement
after portals.
- `1fc529cd` materializes the canonical minimal static physics host before a
distant Use/MoveTo route and reconciles the pre-PartArray startup motion
suffix. The user accepted near and distant object use.
- `f24532ad` defers one-shot F754/F755 effects until canonical placement has
bound presentation, retries projectile/static-animation sidecars on the
committed visibility edge, and keeps effect cells synchronized. The user
accepted buffs, recalls, arrows, combat spell projectiles, portals, and
static animation.
- `175ad6b0` sends LoginComplete from the local first-placement terminal edge
instead of raw PlayerCreate receipt, so ACE's intentional login Hidden/
materialization state cannot race placement. The user accepted the login
haze behavior.
Focused verification after the final fix passed 90 App effect/projectile/
static-scheduler tests, two Runtime login tests, the exact live-entity cell
tracking regression, all 79 Headless tests, and the Release solution build
with zero errors. The long connected soak and complete solution suite have
**not** been rerun on the final `175ad6b0` binary. A broader selected fixture
run also exposed five `LiveEntityRuntimeTests` failures tied to the still-open
placement cutover plus one old remote first-entry fixture that supplies an
empty collision source; classify and fix those before claiming C5 closure.
Remaining campaign work, in order:
1. Reproduce and repair the six fixture failures without weakening their
assertions or adding compatibility bypasses.
2. Finish C4's routes 27 and remove their legacy placement writers; fold in
#276 and #277 where their route becomes authoritative.
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.
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.
**Inputs (read in order):** **Inputs (read in order):**
1. [`2026-08-02-runtime-continuation-executor-handoff.md`](../research/2026-08-02-runtime-continuation-executor-handoff.md) 1. [`2026-08-02-runtime-continuation-executor-handoff.md`](../research/2026-08-02-runtime-continuation-executor-handoff.md)
— the completed dormant mechanism and its cutover notes. — the completed dormant mechanism and its cutover notes.
@ -189,7 +243,7 @@ same commit) → docs/handoff commit. No workarounds; no fused slices.
175401`). Closeout: 175401`). Closeout:
[`2026-08-02-c3c-cutover-closeout.md`](../research/2026-08-02-c3c-cutover-closeout.md). [`2026-08-02-c3c-cutover-closeout.md`](../research/2026-08-02-c3c-cutover-closeout.md).
**Carried to C4/C5:** route-1 far-Create service-window conversion **Carried to C4/C5:** route-1 far-Create service-window conversion
if either streaming/broadcast radius changes (#276); the if either streaming/broadcast radius changes (#277); the
window-departure park narrowing; `NotifyRetirement`-on-active-entry window-departure park narrowing; `NotifyRetirement`-on-active-entry
subscriber invariant; the reachable equip-mid-conductor fail-fast; subscriber invariant; the reachable equip-mid-conductor fail-fast;
settle-CellId discard (#276-adjacent, see ISSUES). settle-CellId discard (#276-adjacent, see ISSUES).
@ -198,9 +252,10 @@ same commit) → docs/handoff commit. No workarounds; no fused slices.
4 (remote Create/Position; delete `RemoteTeleportController`/`Placement` 4 (remote Create/Position; delete `RemoteTeleportController`/`Placement`
and the inline MoveOrTeleport duplicate), 5 (projectile authoritative), and the inline MoveOrTeleport duplicate), 5 (projectile authoritative),
6 (drops + split-recovery marking), 7 (residual pickup/parent/delete 6 (drops + split-recovery marking), 7 (residual pickup/parent/delete
polish).** May land as more than one commit if a route proves large; polish). — OPEN at the 2026-08-03 handoff.** May land as more than one
commit if a route proves large;
each sub-landing keeps the full review discipline. each sub-landing keeps the full review discipline.
- **C5 — legacy deletion + closeout gates.** Delete every superseded legacy - **C5 — legacy deletion + closeout gates — OPEN.** Delete every superseded legacy
path; parity tests; exact lifecycle/reconnect + canonical nine-stop path; parity tests; exact lifecycle/reconnect + canonical nine-stop
connected routes; two-client observation; **user visual matrix** (the connected routes; two-client observation; **user visual matrix** (the
campaign's stopping point for user acceptance). Retire AP-1, AD-1, campaign's stopping point for user acceptance). Retire AP-1, AD-1,

View file

@ -1,155 +1,285 @@
# Task: diagnose and fix the acdream collision/placement regressions, then COMMIT the fixes # Next-agent prompt — finish the retail placement/collision campaign
Work EXCLUSIVELY in `C:\Users\erikn\.codex\worktrees\af5e\acdream`, branch Continue acdream from the 2026-08-03 stabilization checkpoint. The code is
`codex/port-claude-agents`, HEAD `71604331`. Read `CLAUDE.md` at the repo modern; behavior must remain retail-faithful. The campaign is playable again,
root FIRST — its rules bind you (grep-named-retail-first workflow, no but it is **not closed**.
workarounds, divergence-register bookkeeping, connected gates, launch
instructions). The user's in-game observations quoted below are AXIOMS —
they override any green gate number.
## Standing constraints ## Start here
- NEVER `git add -A`, `git add .`, `git reset --hard`, or Use the merged local `main` worktree:
```text
C:\Users\erikn\source\repos\acdream
```
The completed fixes originated on `codex/port-claude-agents` and are merged
into local `main`. Confirm the exact starting commit with `git rev-parse HEAD`
and read the operator's handoff message for the merge SHA. Do not reset,
clean, or overwrite the main worktree's untracked research/reference files.
The original feature worktree remains at:
```text
C:\Users\erikn\.codex\worktrees\af5e\acdream
```
That feature worktree contains protected user-local modifications and is not
the preferred continuation workspace.
Read these files in order before editing:
1. `CLAUDE.md` and `AGENTS.md`.
2. `docs/plans/2026-08-02-placement-cutover.md` — canonical placement-cutover
plan and the 2026-08-03 checkpoint.
3. This prompt.
4. `docs/research/2026-08-02-collision-throughput-handoff/implementer-progress.md`
— especially `## P1` and the final stabilization checkpoint.
5. `docs/research/2026-08-02-collision-throughput-handoff/p1-retirement-receipt-loop.md`.
6. `docs/research/2026-08-02-c3c-cutover-closeout.md`.
7. `docs/ISSUES.md` #269 and #276#280.
8. `docs/architecture/retail-divergence-register.md` rows AP-1, AP-22,
AP-131, AD-1, AD-10, AD-60, and TS-28.
`docs-drafts.md` is now explicitly historical. Do **not** apply it wholesale:
it predates the final fixes and incorrectly tries to reuse issue number #280.
## Binding rules
- Grep `docs/research/named-retail/acclient_2013_pseudo_c.txt` by named
`class::method` before fresh decompilation. Retail behavior is the oracle.
- Preserve the modern Runtime-owned, presentation-independent architecture.
Graphical and headless hosts must use the same canonical gameplay owners.
- Root causes only. Do not add timeouts, grace periods, suppression flags,
catch-and-swallow paths, duplicated placement writers, or compatibility
bypasses to make a test green.
- The user's connected observations are acceptance facts. A green automated
test cannot overrule a live regression.
- Never use `git add -A`, `git add .`, `git reset --hard`, or
`git checkout -- <path>`. Stage exact paths only. `git checkout -- <path>`. Stage exact paths only.
- NEVER stage, revert, or normalize these user-local files: `AGENTS.md`, - Do not delete or normalize unrelated/untracked worktree content.
`src/AcDream.App/Interaction/PlayerInteractionMovementSink.cs`, - Each independent fix must be a bisectable commit whose message records the
`src/AcDream.App/Rendering/LiveAnimationPresentationContext.cs`, root cause and evidence.
`src/AcDream.Runtime/Physics/RuntimeRemotePhysicsUpdater.cs`, - Update the divergence register and issues in the same commit that changes
`tests/AcDream.Core.Tests/Physics/CellTransitTests.cs`, their truth. Retire a row only when its exact legacy mechanism is gone.
`tests/AcDream.Core.Tests/Physics/Issue133DungeonTeleportPrefixTests.cs`, - Do not push unless the user explicitly asks.
`tools/A8CellAudit/A8CellAudit.csproj`, the root - Connected tests require the user's ACE server at `127.0.0.1:9000`. Close
`implementer-progress.md`, and any `launch-*.log`. the client gracefully before reconnecting so ACE releases the session.
- No workarounds without explicit user approval: root causes only — no
rate knobs, grace periods, suppression flags, or catch-and-swallow.
- Do not push. Commit locally to `codex/port-claude-agents` only.
- Connected gates need the user's ACE server at `127.0.0.1:9000`
(normally up). Follow CLAUDE.md's "Logout-before-reconnect" graceful-
close discipline between client launches. If ACE is unreachable, STOP
and report — never fake or skip a connected gate.
## Where everything is ## What has been completed
- **This directory** (`docs/research/2026-08-02-collision-throughput-handoff/`): ### C3c and collision-publication checkpoint
`design-note.md` (the approved D2 delta-commit design),
`implementer-progress.md` (the complete campaign evidence trail — read
the `## Collision-clone O1/O2/O3` and `## C3c-F4` sections first),
`docs-drafts.md` (register/digest drafts NOT yet applied),
`user-observations-*.md` (the axioms).
- Campaign plan: `docs/plans/2026-08-02-placement-cutover.md`. C3c
closeout: `docs/research/2026-08-02-c3c-cutover-closeout.md`. Issues:
`docs/ISSUES.md` #276#279.
- Recent commits: `529e0e9d` (C3c production placement cutover — REVIEWED
and accepted), `f4ef2b2a`/`c52ce14a` (docs), `71604331` (the O1O3
collision delta-commit — **WIP, ON HOLD, NO review passed it**; its
commit message summarizes state).
- Logs (untracked): `launch-feeltest-oclone.log` (the FAILING user feel
test on the O-tree), `logs/connected-r6-soak-20260802-194423.*`
(current soak: Passed=false, 4 failures),
`logs/connected-r6-soak-20260802-143157.*` (pre-O soak: 37 failures),
`logs/connected-r6-soak-20260727-004942.artifacts` (last fully-PASSING
baseline), `logs/connected-world-gate-20260802-193029` (lifecycle PASS
on the O-tree).
## Problems to diagnose and fix (priority order) - `529e0e9d` — C3c production first-entry cutover for graphical and headless
hosts.
- `71604331` — O(changed) per-landblock collision publication checkpoint.
Its original commit was deliberately marked WIP after the first feel test;
do not treat that old label as the current product status. The following
fixes addressed the observed failures.
**P1 — the retirement-receipt exception loop (smoking gun).** ### Stabilization fixes, all user-verified where visual behavior applies
`launch-feeltest-oclone.log` contains **243** occurrences of
`streaming: origin-recenter preparation will resume:
System.InvalidOperationException: Landblock <id> already has a full
retirement receipt.` — a continuous catch-retry loop during origin
recenter. Find the receipt-lifecycle break introduced (or exposed) by
the O1O3 diff (`git show 71604331`): the retirement machinery is
`RuntimePhysicsState.AdvanceCollisionRetirementMutation` (~:1880-1990),
`StreamingController.cs` `AdvanceRetirements` call sites (:648/:670/:689/:736),
recenter adoption at `LandblockPresentationPipeline.cs:322-345`. The
catch-and-resume site that swallows this exception may itself violate
the no-silent-catch rule — evaluate it too.
**P2 — user-visible placement failures on the O-tree (the axioms).** 1. `01f4791e` — **retirement-receipt replay loop fixed.**
Quote: "Monsters pop into existence as I run by them. ran to a different - Root cause: a pending-only live-projection bucket was promoted to a
place, spawned in the air long in front of me, stabs are placed second full landblock cleanup receipt after the first detach had already
incorrectly. This is not how retail worked. I could see monsters way in committed. The duplicate guard threw; a broad resumable path replayed
front of me." Suspects, in order: (a) P1's stalled/looping recenter the detach 243 times.
preparation starving placement; (b) the commit-time reflood diverging - Fix: retain pending identities without manufacturing another receipt;
from the deleted staged-clone world in live conditions post-commit receipt invariants are terminal, not resumable.
(`PhysicsEngine.CommitLandblockReplacement` + - Evidence: focused recenter tests; complete Release suite 10,815 passed /
`RefloodPrefixOwnersAfterReplacement`; the oracle test 4 skipped; lifecycle report
`CommitTimeRefloodMatchesPrecomputedReflood` covers only 3 landblock `logs/connected-world-gate-20260802-203751/report.json`; nine-stop report
archetypes and may under-cover); (c) siblings of the staged-owner `logs/connected-r6-soak-20260802-204309.report.json` with `Passed=true`,
admission gap the implementer already fixed once (ShadowObjectRegistry nine checkpoints, zero failures, zero wait cues, zero pending
phase 2); (d) ordering between the reflood and admission retirements, and no recurrence of the 243x exception.
commit/RetryDeferred for operations parked on the republished prefix.
Note: under C3c rules entities WAIT for collision before placing — so
"spawned mid-air" means placement completed against wrong/incomplete
collision, not merely late.
**P3 — the soak's 4 remaining failures.** 2. `670f307c` — **remote placement and targeting share one world frame.**
`connected-r6-soak-20260802-194423.report.json`: - Root cause: CreateObject positions are landblock-local, but Runtime
`pendingLandblockRetirements`=131/122 at sawato-baseline/plateau, submitted remote first-entry placement with zero world offset; the local
`waitCueShown=true` at holtburg, cpuUs p99 over-limit at the six physics host also published a landblock-local origin to targeting.
non-Caul stops. The WIP's "exposed pre-existing" classification - Fix: Runtime owns the accepted local-player world center, converts remote
(reasoning in `implementer-progress.md ## Collision-clone`) was made Create placement before SetPosition, and publishes the local body's world
BEFORE P1 was discovered — re-judge it against the exception loop. position.
- User gate: monsters and statics place correctly; monsters chase and hit
the visible player instead of attacking another coordinate.
**P4 — door/use approach regression (in COMMITTED C3c code, `529e0e9d`).** 3. `1fc529cd` — **distant Use/approach restored.**
Quote: "I dont approach doors when I use them." Using a door no longer - Root cause: Runtime object lookup is intentionally non-constructing, so a
walks the character to it first. Prime suspect: static door/corpse could enter MoveTo without a physics host and its
`src/AcDream.App/Input/PlayerModeController.cs`'s conditional MoveTo target snapshot expired at the origin. Startup placement could also
bind (`if (controller.MoveTo is { } moveTo)`) — the legacy path CREATED leave an impossible pre-PartArray motion suffix ahead of later actions.
the MoveToManager at attach via factory; the flip only binds approach - Fix: ensure the canonical minimal static host before routing MoveTo and
callbacks IF Runtime's publication chain already ran `MakeMoveToManager` reconcile the startup suffix exactly at presentation attach.
(`RuntimeLocalPlayerPhysicsPublicationState`). Establish when (or - User gate: near and distant object use works, including approach, turn,
whether) Runtime creates it relative to player-mode attach; the and use after arrival.
interaction flow is `SelectionInteractionController`
approach-MoveTo → use (see `claude-memory/project_interaction_pipeline.md`
and register row AD-27).
**P5 — intermittent spell particle loss (#279, C3c-era).** 4. `f24532ad` — **spell, recall, projectile, and static VFX binding fixed.**
One-shot VFX/scripts arriving while their entity is in C3c's - Root cause: C3c could create effect/projectile/static-animation sidecars
suppressed-until-receipt window are dropped instead of deferred; retail before first SetPosition had bound the entity's mesh, pose, cell, and
queues scripts for not-yet-in-world objects (grep visibility. One-shot F754/F755 packets were lost and projectiles could
`docs/research/named-retail/acclient_2013_pseudo_c.txt` for the inherit a cell-less body.
PlayScript/pending-script handling around `HandleCreateObject` - Fix: exact-incarnation presentation barrier and FIFO replay; retry
0x00454C80 / `set_hidden` 0x00514C60). Route the deferral through the projectile/static binding on the committed visibility edge; synchronize
presentation-binding moment effect cells on rebucket.
(`TryApplyInitialCreateCompletionPresentation` in - User gate: buffs/protections, recall effects, arrows, combat spell
`src/AcDream.App/World/LiveEntityRuntime.cs` and the equivalent headless projectiles, portals, and static animation all work.
sink).
**P6 — verify after P1P3 land:** purple materialization haze re-firing 5. `175ad6b0` — **login materialization acknowledgement fixed.**
while standing still (#278a — believed the same root as the visibility - Root cause: ACE creates the local player Hidden and releases that state on
edges), the monster pop-in re-check, slope-glide vs open #269. LoginComplete. Sending LoginComplete from raw F746 receipt raced first
canonical placement and left the purple haze over the character.
- Fix: one completion callback from Runtime's local first-entry terminal
edge; content-less headless retains its only truthful accepted-Create
edge.
- User gate: ordinary login no longer leaves the purple haze; recall still
has the intended materialization presentation.
## Required process per fix ### Latest focused verification
1. Root cause with file:line evidence BEFORE writing the fix; for any After the final fix, these passed:
AC-specific behavior, cite the named-retail decomp.
2. Tests that fail pre-fix and pass post-fix.
3. Any new retail deviation gets its register row
(`docs/architecture/retail-divergence-register.md`) in the SAME
commit; when the collision work lands for real, APPLY the prepared
`docs-drafts.md` entries (AD-6 successor note, AD-62, digest entries,
#280) rather than re-deriving them.
4. Gates before each commit: `dotnet build AcDream.slnx -c Release`;
`dotnet test AcDream.slnx -c Release --no-build --no-restore -m:1`
with `ACDREAM_PAK_PATH=C:\Users\erikn\Documents\Asheron's Call\acdream.pak`
(baseline: 10,812 passed / 0 failed / 4 skipped);
`tools/run-connected-world-lifecycle-gate.ps1` must PASS; then
`tools/run-connected-r6-soak.ps1` — the FINAL acceptance:
`report.json` `Passed=true`, zero failures, `waitCueShown=false` at
all nine stops, per-checkpoint cpuUs p99 within +10% of the
20260727-004942 baseline. READ `report.json`, never the markers log.
A failure whose only signature is `activeTeleportCount=1` at a stable
checkpoint is user interference — one clean re-run allowed; any other
failure is real: fix it, don't re-run past it.
5. COMMIT each completed fix as its own bisectable commit on
`codex/port-claude-agents` with a message explaining the why.
6. Manual verification launch (for the user): the PowerShell launch in
CLAUDE.md "Running the client against the live server", plus
`ACDREAM_RETAIL_UI=1`.
## Final deliverable - 90 focused App effect/projectile/static-animation scheduler tests.
- Two focused Runtime login-completion tests.
- The exact live-entity cell-tracking regression.
- All 79 Headless tests.
- `dotnet build AcDream.slnx -c Release --no-restore` with zero errors
(existing warnings remain).
Per-problem disposition (root cause → fix → evidence), the commit SHAs, The long complete suite and connected nine-stop soak were **not rerun after
full gate numbers including the soak report values, and an explicit list the final four stabilization commits**. The P1 soak proves P1's binary, not
of anything left open. the final campaign binary.
## What remains — execute in this order
### 1. Reconcile the six selected-fixture failures
A broad selected run after cleanup exposed:
- five failures in `LiveEntityRuntimeTests`, associated with the still-open
placement/cell cutover;
- one old `RuntimeLiveEntitySessionControllerTests` remote-first-entry fixture
that provides an empty collision source while the production contract now
requires truthful collision admission.
Re-run these two classes first and record the exact test names and assertions.
Classify each as either a real product failure or a stale fixture. If stale,
update the fixture to provide the same valid prepared collision neighborhood
as production; never weaken the product contract or merely change expected
values. If real, fix the owning production mechanism and add a smaller
regression test.
Suggested first commands:
```powershell
$env:ACDREAM_PAK_PATH='C:\Users\erikn\Documents\Asheron''s Call\acdream.pak'
dotnet test tests/AcDream.App.Tests/AcDream.App.Tests.csproj -c Release --no-restore --filter FullyQualifiedName~LiveEntityRuntimeTests -m:1
dotnet test tests/AcDream.Runtime.Tests/AcDream.Runtime.Tests.csproj -c Release --no-restore --filter FullyQualifiedName~RuntimeLiveEntitySessionControllerTests -m:1
```
### 2. Finish C4: remaining authoritative placement routes
The plan still marks routes 27 open:
- route 2: ForcePosition;
- route 3: portal placement through `RuntimeWorldTransitState` and
`RuntimePortalPlacementAuthority`;
- route 4: remote Create/Position, deleting the remaining
`RemoteTeleportController`/inline MoveOrTeleport duplicate;
- route 5: authoritative projectile correction;
- route 6: drops and split-recovery marking;
- route 7: pickup, parent-detach, and delete/recreate residue.
Inventory every current writer before editing. For each route, prove:
- one Runtime SetPosition transaction owns accepted frame, exact cell,
collision result, shadow/workset membership, and deferred-cell lifetime;
- App only projects the committed result;
- graphical and headless hosts use the same command and state path;
- stale sequences, delete/GUID reuse, missing cells, portal generations, and
replacement collision generations cannot commit old state;
- no route reconstructs from a stale spawn or uses the legacy outdoor demote/
terrain-Z lift.
Resolve #276 when the spawn settler's resolved `CellId` becomes authoritative.
Resolve #277 with a real service-window/celless lifecycle instead of relying
on ACE's current broadcast radius.
### 3. Fix #280: destination prefetch before portal reveal
Current behavior waits only a hard-coded radius-one (3x3) outdoor
neighborhood, while the visible configured world extends farther. The user
can see distant terrain continue building after portal exit.
Port the retail mechanism, not a larger magic number:
- `CellManager::PreFetchCells @ 0x00455820`;
- `LScape::PreFetchCells @ 0x00505660`;
- `CLandBlock::PreFetchCells` and `CLandBlockInfo::PreFetchCells`;
- `SmartBox::UseTime @ 0x00455410` while `blocking_for_cells`;
- the `TAS_TUNNEL_CONTINUE` resume/reveal order.
Use the quality/view-distance configured destination window. Hold one
generation-scoped reservation across terrain, buildings/statics, EnvCells,
render publication, composite textures, and collision. Keep portal UI and
wait cue responsive. Never reveal early because of a timeout, and do not wait
for an impossible terminal marker for all dynamic ACE objects.
Acceptance: repeated login, `/ls`, spell recall, and portals at every quality
setting reveal no constructing terrain, missing nearby statics/buildings,
unready interiors, missing composites, or absent nearby collision. Dynamic
monsters/items may still arrive later from ACE.
### 4. C5 closeout and live gates
After steps 13:
1. Delete every superseded placement writer and compatibility projection.
2. Run focused Runtime/Core/App tests for every route.
3. Run the complete Release solution suite with the installed pak.
4. Run the exact lifecycle/reconnect route.
5. Run the canonical nine-stop soak on the **final binary**. Read
`report.json`, not marker output. Required: `Passed=true`, zero failures,
every canonical checkpoint, `waitCueShown=false`, zero pending
publication/retirement/reveal debt, graceful exit, and no render-shadow
mismatch. Diagnose any real failure; do not rerun past it.
6. Perform two-client observation for remote creation, chase/attack, doors,
drops/pickups, portal departure/arrival, arrows, and spells.
7. Ask the user for the remaining #269/#278 slope-glide comparison at the
known impassable slope.
Only then retire AP-1, AD-1, AP-131, and the legacy half of AD-60 and close
the corresponding placement issues.
### 5. Finish the original physics-divergence campaign
After placement C5 is green:
- **AP-22:** make `ShadowShapeBuilder` the sole authority for authored Setup
collision shapes. Preserve cylinder order; use authored spheres when there
are no cylinders; cylinder-first for mixed data; truly shapeless means no
shadow. Remove invented `Setup.Radius` cylinders, `Radius * 2` heights, and
sphere-to-cylinder coercion across graphical, headless, static, and live
paths.
- **AD-10:** prove remote motion uses the full transition sweep, remove
terrain-normal preprojection, and let `CTransition::adjust_offset` project
against the actual retained contact plane. Preserve interpolation,
correction replacement, Hidden state, and network cadence.
- Run the final movement/collision matrix and update the divergence ledger,
architecture, roadmap, milestones, memory, `CLAUDE.md`, and `AGENTS.md`.
Resume vendor Slice 5 only after this campaign is genuinely closed.
## Required deliverable
For every remaining item report:
- observed failure and deterministic reproduction;
- retail/reference evidence with named functions and addresses;
- root cause in plain language plus file/line evidence;
- exact fix and why it preserves Runtime ownership;
- tests added or corrected;
- commit SHA;
- complete build/test/connected-gate numbers;
- user visual result where required;
- divergence/issue rows retired, narrowed, or left open.
Finish with an explicit list of anything still open. Do not describe the
campaign as complete while any C4 route, #280, final-binary soak, AP-22,
AD-10, or required user visual gate remains.

View file

@ -1,5 +1,14 @@
# Docs-commit drafts — collision publication-throughput fix (O1/O2/O3) # Docs-commit drafts — collision publication-throughput fix (O1/O2/O3)
> **HISTORICAL DRAFT — DO NOT APPLY WHOLESALE (2026-08-03).** The O1/O2/O3
> implementation landed in `71604331` and the user-visible stabilization
> fixes continued through `175ad6b0`. This draft predates that work, assigns
> issue number #280 to the collision clone even though #280 now canonically
> tracks incomplete portal-destination prefetch, and names ledger edits that
> must be re-audited against the final production tree. It remains only as
> research evidence. Use `NEXT-AGENT-PROMPT.md`, the campaign plan, and the
> live divergence register for current work.
Drafted per contract; NOT applied to the repo. Apply in the docs commit after Drafted per contract; NOT applied to the repo. Apply in the docs commit after
code review. Register judgment executed as pinned: AD-6 stays retired with a code review. Register judgment executed as pinned: AD-6 stays retired with a
successor note; the residual timing/order compression gets a NEW row (AD-62). successor note; the residual timing/order compression gets a NEW row (AD-62).

View file

@ -4547,3 +4547,41 @@ _entities.AdvanceCreateAuthority in the executor, inside
ApplyWeenieDescriptionAction; registration advance still residence-gated). ApplyWeenieDescriptionAction; registration advance still residence-gated).
Focused files 82/82; Runtime 1,003/1,003; App 4,039/3 skips of 4,042; Focused files 82/82; Runtime 1,003/1,003; App 4,039/3 skips of 4,042;
git diff --check exit 0. No staging/commits. git diff --check exit 0. No staging/commits.
## 2026-08-03 stabilization checkpoint and handoff
Five separately bisectable root-cause fixes followed the O1/O2/O3 checkpoint:
1. `01f4791e` — pending-only live projection buckets no longer manufacture a
second origin-recenter retirement receipt. Complete Release, lifecycle,
and canonical nine-stop soak passed on this binary; the soak had nine
checkpoints, zero failures, zero wait cues, and zero pending retirements.
2. `670f307c` — Runtime converts remote Create frames through the accepted
local-player world center and publishes the local physics body's world
position. The user accepted monster/static placement, chase, and attacks.
3. `1fc529cd` — distant Use materializes the canonical minimal static physics
host before MoveTo, and presentation attach reconciles the pre-PartArray
startup motion suffix. The user accepted near and distant object use.
4. `f24532ad` — exact-incarnation effect packets wait for canonical
presentation binding; projectile and static-animation sidecars retry on the
committed visibility edge; effect cells follow rebuckets. The user accepted
buffs, recalls, arrows, combat spell projectiles, portals, and statics.
5. `175ad6b0` — LoginComplete is emitted from the local first-placement
terminal edge instead of raw PlayerCreate receipt. The user accepted login
materialization haze behavior.
Post-fix focused evidence: 90 App effect/projectile/static-scheduler tests,
two Runtime login tests, the exact live-entity cell tracking test, all 79
Headless tests, and a Release solution build with zero errors passed. The
complete suite and connected nine-stop soak were not rerun after the final
four stabilization commits. A broader selected fixture run exposed five
still-open `LiveEntityRuntimeTests` failures associated with the placement
cutover and one old remote-first-entry fixture that supplies an empty
collision source. These are campaign work, not evidence to weaken the new
production contracts.
Open campaign finish: classify/fix those six fixtures; finish placement routes
27 and delete legacy writers; resolve #276/#277 and portal-prefetch #280; run
the final-binary complete suite/lifecycle/nine-stop/two-client gates; perform
the #269 slope-glide visual check; retire AP-1/AD-1/AP-131/AD-60 only when the
legacy paths are gone; then land AP-22 and AD-10 and close the ledger.

View file

@ -1,7 +1,38 @@
# Collision System Port - Status and Plan # Collision System Port - Status and Plan
## 2026-08-03 production cutover stabilization checkpoint
Production initial Create placement is cut over through the Runtime residence
and continuation-executor path. The O(changed) collision-publication
checkpoint is live, followed by five root-cause fixes:
- `01f4791e`: pending-only live projections no longer create/replay a second
origin-recenter retirement receipt;
- `670f307c`: remote Create placement, local-player hosting, targeting, chase,
and attack share the same world-coordinate frame;
- `1fc529cd`: distant Use materializes the canonical minimal static host before
MoveTo;
- `f24532ad`: effects, projectiles, and static animation bind after canonical
placement and follow the committed cell;
- `175ad6b0`: LoginComplete waits for the local first-placement terminal edge.
The user accepted those connected behaviors. The campaign remains open for
six fixture reconciliations, C4 placement routes 27, #276/#277, destination
prefetch #280, C5's final-binary suite/soak/two-client matrix, AP-22, and
AD-10. Canonical continuation prompt:
`docs/research/2026-08-02-collision-throughput-handoff/NEXT-AGENT-PROMPT.md`.
**Do not use the 2026-04-29 whole-world staging-root description below as a
production blueprint.** It is retained as historical context. O1/O2/O3 at
`71604331` replaced that clone/journal/rebase design with the per-landblock
O(changed) publication mechanism; `01f4791e` then repaired its recenter
receipt lifetime.
## 2026-08-01 initial Create residence checkpoint ## 2026-08-01 initial Create residence checkpoint
> Historical checkpoint; superseded by the 2026-08-03 production cutover
> status above.
The dormant Runtime SetPosition path is now complete through activation, The dormant Runtime SetPosition path is now complete through activation,
graphical/no-window placement receipts, collision-prefix quiescence, exact graphical/no-window placement receipts, collision-prefix quiescence, exact
authoritative route classification, pre-placement App staging, and initial authoritative route classification, pre-placement App staging, and initial