acdream/docs/research/2026-08-03-session-handoff.md
Erik b17f5cee49 docs: close #297-#299 with SHAs; session handoff
Marks #297 (9b1e6fc6), #298 (bc0077a5) and #299 (88348f67) DONE per the
issue-tracking rule, and adds a handoff covering what landed, what still needs
the user's eyes, and the route 4 decision waiting on them.

Three items are implemented and suite-green but NOT user-verified: collision
with PKLite players (including the equip/unequip case round 1 got wrong),
melee/bow on a PKLite player plus the auto-target guard, and combat-camera
tracking of a PKLite opponent.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-03 21:30:17 +02:00

4.9 KiB

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. 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.

Open follow-ups filed this session

  • #300Properties.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.
  • #302PortalProjectionTests.ClipToRegion_FrameOwnedStore_ReusesExactResultArray is flaky, ~1 run in 6, a GC.GetAllocatedBytesForCurrentThread assertion. A green suite is not proof this is gone.
  • #303LiveEntityPvpBitfieldSync is App-resident but touches only Runtime-owned state.
  • #304SelectionInteractionController.GetSelectedOrClosestCombatTarget has no production caller; one of #298's two widened call sites is dead code.
  • #305HeadlessGameplayOperations 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).