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>
This commit is contained in:
parent
bc0077a55f
commit
b17f5cee49
2 changed files with 97 additions and 3 deletions
|
|
@ -446,7 +446,7 @@ diff: `9966b531` touched none of `CollisionExemption`, `CombatTargetPolicy`,
|
||||||
`0f2d98c5`). `@pklite` made pre-existing behaviour reachable; it did not create
|
`0f2d98c5`). `@pklite` made pre-existing behaviour reachable; it did not create
|
||||||
it. Do #297 FIRST — #298 depends on it.
|
it. Do #297 FIRST — #298 depends on it.
|
||||||
|
|
||||||
- **#297 — OPEN — PublicWeenieBitfield is frozen at CreateObject, so a PK
|
- **#297 — DONE `9b1e6fc6` (2026-08-03) — PublicWeenieBitfield is frozen at CreateObject, so a PK
|
||||||
status change never reaches the client. HIGH.** User symptom: after `@pklite`,
|
status change never reaches the client. HIGH.** User symptom: after `@pklite`,
|
||||||
the local player walks straight through other PKLite players.
|
the local player walks straight through other PKLite players.
|
||||||
ACE's only PK-change message is `GameMessagePublicUpdatePropertyInt` (0x02CE)
|
ACE's only PK-change message is `GameMessagePublicUpdatePropertyInt` (0x02CE)
|
||||||
|
|
@ -483,7 +483,7 @@ it. Do #297 FIRST — #298 depends on it.
|
||||||
Note the vivid target indicator (`WorldSelectionQuery.cs:271-298`) reads the
|
Note the vivid target indicator (`WorldSelectionQuery.cs:271-298`) reads the
|
||||||
spawn PWD bits directly and is stale by the same mechanism.
|
spawn PWD bits directly and is stale by the same mechanism.
|
||||||
|
|
||||||
- **#298 — OPEN — melee/missile attack admission excludes players by
|
- **#298 — DONE `bc0077a5` (2026-08-03) — melee/missile attack admission excludes players by
|
||||||
construction. MEDIUM-HIGH. Blocked on #297.** User symptom: selecting a
|
construction. MEDIUM-HIGH. Blocked on #297.** User symptom: selecting a
|
||||||
PKLite player and attacking retargets to the nearest monster (auto-target on)
|
PKLite player and attacking retargets to the nearest monster (auto-target on)
|
||||||
or does nothing (auto-target off, logging
|
or does nothing (auto-target off, logging
|
||||||
|
|
@ -531,7 +531,7 @@ it. Do #297 FIRST — #298 depends on it.
|
||||||
lets the server arbitrate PK legality (retail
|
lets the server arbitrate PK legality (retail
|
||||||
`ClientMagicSystem::ObjectCompatibleWithSpellTargetType` @0x00567230).
|
`ClientMagicSystem::ObjectCompatibleWithSpellTargetType` @0x00567230).
|
||||||
|
|
||||||
- **#299 — OPEN — CollisionExemption misses retail's mover-side
|
- **#299 — DONE `88348f67` (2026-08-03) — CollisionExemption misses retail's mover-side
|
||||||
IsImpenetrable branch, and its doc comment asserts the opposite. LOW.**
|
IsImpenetrable branch, and its doc comment asserts the opposite. LOW.**
|
||||||
`CollisionExemption.cs:103` checks only the TARGET's `IsImpenetrable`, and the
|
`CollisionExemption.cs:103` checks only the TARGET's `IsImpenetrable`, and the
|
||||||
class doc at `:33-39` claims "retail's pseudo-C only checks the target's
|
class doc at `:33-39` claims "retail's pseudo-C only checks the target's
|
||||||
|
|
|
||||||
94
docs/research/2026-08-03-session-handoff.md
Normal file
94
docs/research/2026-08-03-session-handoff.md
Normal file
|
|
@ -0,0 +1,94 @@
|
||||||
|
# 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`).
|
||||||
Loading…
Add table
Add a link
Reference in a new issue