# Session handoff — 2026-08-03 Branch `claude/acdream-physics-divergence-5aa784`. `main` is still at `c7d5fc14`; nothing here is merged. Complete Release suite green at **10,904 passed / 4 skipped / 0 failed** (session start: 10,844). ## What landed | Commit | What | |---|---| | `9966b531` | **C4 route 2 — ForcePosition** through the canonical placement | | `69ba9486` | Retail `@pklite` client command (`EnterPkLite` 0x028F) | | `3ef61eb6` | Route 2 visual gate, rewritten with the real recipe | | `d980456f` | Route 2 connected gate **user-accepted** | | `e3b766d9` | Filed #297-#299 | | `40f57213` | **Route 4 scoping — budget failed, stop and re-plan** | | `88348f67` | **#299** mover-side `IsImpenetrable` exemption branch | | `9b1e6fc6` | **#297** keep the PWD bitfield live so PK status reaches the client | | `bc0077a5` | **#298** admit player targets to melee/missile attack and the camera | ## Needs your eyes (nothing below is user-verified) Route 2 is accepted. These three are not: 1. **Collision with PKLite players** (#297). Both parties `@pklite`, walk into each other — you should now collide instead of phasing through. Then have them **equip or unequip something** and try again: that is the case round 1 got wrong, and the fix is specifically about surviving it. 2. **Melee/bow on a PKLite player** (#298). Select them, attack. Should work now. Also confirm auto-target still refuses to acquire a player — pull a monster with a PKLite player nearby and check auto-target picks the monster. 3. **The combat camera** (#298). With `ViewCombatTarget` on (default), attacking a PKLite opponent should now track them. Retail gates the camera on the same predicate as the attack; we were using the narrow one. Recipe for getting into PK Lite is in [`2026-08-03-c4-route-2-visual-gate.md`](2026-08-03-c4-route-2-visual-gate.md). Remember PK Lite is a **one-way** character state. ## The decision waiting for you: route 4 I stopped rather than starting it. After route 2 I pinned a falsifiable budget — *if route 4 also costs ~900 production lines, the bet is dead* — and scoping came back at **1,500-2,500 lines** plus ~1,700 lines of test re-modelling. The seam generalises fine; route 2 just was not a representative unit (1 entity vs N, 1 disposition vs 4, 1 execution path vs 2, 2 duplicate authorities vs 6). **Recommendation: split route 4 into 4a and 4b.** 4a = near/interpolate + airborne no-op — the observable win, no park hazard. 4b = teleport/far/cellless, where the parks, the service-window guard, N3 and #277 all live. Full analysis, including four findings that change the campaign plan (route 4's Create half is already done; AP-131 cannot be retired by route 4; #277's safety bound breaks; N3 stops being latent) is in [`2026-08-03-c4-route-4-scoping.md`](2026-08-03-c4-route-4-scoping.md). ## Open follow-ups filed this session - **#300** — `Properties.Ints[134]` vs `PublicWeenieBitfield` mirror gap. - **#301** — retail's `OnStatUpdated` also rewrites radar blip colour and radar behaviour; acdream ignores both. #297 for the radar. - **#302** — `PortalProjectionTests.ClipToRegion_FrameOwnedStore_ReusesExactResultArray` is flaky, ~1 run in 6, a `GC.GetAllocatedBytesForCurrentThread` assertion. **A green suite is not proof this is gone.** - **#303** — `LiveEntityPvpBitfieldSync` is App-resident but touches only Runtime-owned state. - **#304** — `SelectionInteractionController.GetSelectedOrClosestCombatTarget` has no production caller; one of #298's two widened call sites is dead code. - **#305** — `HeadlessGameplayOperations` has #298's bug unpatched, so the graphical and headless hosts now diverge. Register rows added: **AP-134** (the replicated PWD-bitfield coherence invariant). **TS-23**'s retirement narrative corrected — it claimed since July that every mover-flags site read the mover's "real" PK bits; the bits existed but their source was frozen, so that only became true at #297. ## Process notes worth keeping - **Four implementation passes and five review rounds on route 2, and every intermediate state was green** — 10,848, 10,853, 10,856, 10,858. The suite caught none of the four real defects. Two of them were introduced *by* the fixes for the other two. - **Demanded regression tests found root causes that review missed.** #297's "assert the flags survive an appearance rebuild" test is what exposed the second snapshot store. - **Three false claims reached documentation and were retracted before commit** — a "retail fidelity gain" that was a fixture artifact, an acceptance-coverage claim in the cutover plan, and an IA-19 citation covering a divergence it does not reach. Each would have become the thing a future session trusted. - **Go to the bytes when the decompiler is ambiguous.** #299 turned on whether `if (state_1 < 0)` was a 0x80 or 0x8000 test; decoding the PDB-paired binary settled it (`test al,al; js`).