112 lines
7.2 KiB
Markdown
112 lines
7.2 KiB
Markdown
# R5 entry handoff — fresh-session entry point (2026-07-03, night)
|
|
|
|
Successor to `2026-07-03-r4-verify-session-handoff.md` (now fully closed
|
|
out — its items 1-4 are all struck through with outcomes). Worktree
|
|
`vigorous-joliot-f0c3ad`, branch `claude/vigorous-joliot-f0c3ad`, tree
|
|
CLEAN at `304327b0`. Full suite green: **3,964**.
|
|
|
|
## State — the R2-R4 arc is DONE
|
|
|
|
R4 shipped + user-verified; the whole follow-up queue closed **today,
|
|
all user-verified live**:
|
|
|
|
| Item | Outcome |
|
|
|---|---|
|
|
| #161 landing pose | FIXED `b1cf0102` — retail's apply pass runs with `ModifyInterpretedState=false` (the BN decomp SMEARS the params bitfield store into the mush at raw 305778: `(word & 0x37ff) \| cancelMoveTo<<15 \| disableJump<<17`; ACE MotionInterp.cs:444-449 confirms). Fwd is PRESERVED through a fall; HitGround re-dispatches it → landing link. Plus: HitGround must run BEFORE the DR gravity-bit clear (its verbatim `state&0x400` gate — AP-81); K-fix17 SetCycle blocks deleted; `copy_movement_from` now copies `current_style` (raw 0051e757); ALL apply_current_movement caller polarities fixed (raw arg3 = DisableJumpDuringLink → `(N,0)` = allowJump TRUE). Lesson: [[feedback-bn-decomp-field-names]] (2nd artifact class). |
|
|
| #162 glide class | CLOSED, **no adaptation**. User A/B: retail does NOT glide — and post-#161 acdream matches (walk/run-by-distance movetos + clean mid-chain key takeover). Head-interrupt + CancelMoveTo re-audited retail-verbatim; ACE's mt-0 reflections carry the mover's REAL locomotion, so cancels never strand the legs. Evidence: ISSUES Recently-closed #162 + the launch-162 capture analysis. |
|
|
| #163 temp diags | STRIPPED `5ebe2be3` ([autowalk-gate]+clock, [autowalk-feed], [MOVETO-CANCEL]). Durable ProbeAutoWalk family kept. |
|
|
| R2-R4 visual pass | **PASSED** (jump/ledge momentum, run-in-circles, stop settle, retail-observer view). Filed #165 (remote wall-swallow) + #166 (slope-landing sled — the AD-25+AP-7+TS-4 composite, post-R6 per user). |
|
|
|
|
## NEXT: R5 — MovementManager facade + PositionManager (Sticky/Constraint) + TargetManager
|
|
|
|
**Retires: TS-39** (MoveToManager `StickTo`/`Unstick` are unbound no-op
|
|
seams — sticky movetos complete-and-stop instead of sticking; retail
|
|
hands off to `PositionManager::StickTo(tlid, radius, height)`, and every
|
|
`PerformMovement` head calls `unstick_from_object` →
|
|
`PositionManager::UnStick`) **and AP-79** (the P4 TargetTracker minimal
|
|
adapter — GameWindow feeds `HandleUpdateTarget` from the entity table;
|
|
retail's TargetManager is a full voyeur-subscription system with
|
|
per-target quantums).
|
|
|
|
### Retail function inventory (grep'd, addresses verified)
|
|
|
|
- **MovementManager** (facade, mostly thin): 00524000 MakeMoveToManager ·
|
|
00524020 SetWeenieObject · 005240d0 PerformMovement · 00524170
|
|
move_to_interpreted_state · 005241b0 CancelMoveTo · 005241c0
|
|
EnterDefaultState · 00524260 IsMovingTo · 00524280 motions_pending ·
|
|
005242d0 MotionDone · 005242f0 UseTime · 00524300 HitGround · 00524320
|
|
LeaveGround · 00524340/00524350 HandleEnter/ExitWorld · 00524360
|
|
ReportExhaustion · 00524440 unpack_movement · 00524790
|
|
HandleUpdateTarget (routes TargetInfo → MoveToManager). Much of this
|
|
facade's BEHAVIOR is already ported piecemeal (funnel, RouteServerMoveTo,
|
|
TickRemoteMoveTo, the UseTime/CheckForCompletedMotions slots) — R5's job
|
|
is the STRUCTURE: one owner object per entity replacing the GameWindow
|
|
wiring sprawl, without changing dispatch behavior pinned by the
|
|
183-case + funnel + moveto suites.
|
|
- **StickyManager**: 00555400 UnStick · 00555430 adjust_offset · 00555610
|
|
UseTime · 005556e0 SetPhysicsObject · 00555710 StickTo · 00555780
|
|
HandleUpdateTarget.
|
|
- **ConstraintManager**: 00556090 SetPhysicsObject · 005560c0 UnConstrain ·
|
|
005560d0 IsFullyConstrained · 00556180 adjust_offset · 00556240
|
|
ConstrainTo. (`jump_is_allowed` already calls an `IsFullyConstrained`
|
|
stub — find it before re-porting.)
|
|
- **PositionManager** (owns the two): CPhysicsObj::MakePositionManager
|
|
00510210 (also sets transient bit 0x80 + update_time). `stick_to_object`
|
|
/ `unstick_from_object` on CPhysicsObj are the entry seams (today
|
|
Action seams on MotionInterpreter, wired per-entity in GameWindow).
|
|
- **TargetManager**: 0051a370 ctor · 0051a4a0 SetTargetQuantum · 0051a4f0
|
|
SendVoyeurUpdate · 0051a5e0 GetInterpolatedPosition · 0051a650
|
|
CheckAndUpdateVoyeur · 0051a6f0 NotifyVoyeurOfEvent · 0051a7e0
|
|
ClearTarget · 0051a830 AddVoyeur · 0051a930 ReceiveUpdate · 0051aa90
|
|
HandleTargetting · 0051ac30 SetTarget · 0051ad90 RemoveVoyeur.
|
|
AP-79's seams (`_setTarget`/`_clearTarget`/quantum get/set +
|
|
GameWindow's tracker blocks for remotes AND the `_playerMoveToTarget*`
|
|
player twin) are the integration points to replace.
|
|
|
|
### Already ported — do NOT re-port
|
|
|
|
MoveToManager (R4, full incl. the queue model), MotionInterpreter (R3
|
|
full; #161 corrected the apply-pass params), MotionTableManager +
|
|
GetObjectSequence (R2), CSequence (R1), RemoteWeenie + PhysicsBody.InWorld
|
|
(R4-V5), DefaultSink binding order (bind BEFORE SetPosition — the
|
|
`LoginQueue_DrainsToEmpty_UnderProductionFeed` invariant).
|
|
|
|
### R5-adjacent verification items (found reading unpack_movement this session)
|
|
|
|
1. **Head stance-change dispatch**: raw @00524502-0052452c — before the
|
|
type switch, for ALL movement types: `if (InqStyle() !=
|
|
command_ids[stanceIdx]) CMotionInterp::DoMotion(style, defaults)` (BN
|
|
mislabels InqStyle as `CBaseFilter::GetPinVersion`). Verify our UM
|
|
path does this for types 6-9 (mt-0 handles style inside the funnel).
|
|
2. **mt-0 header flags**: 0x100 → read sticky guid → `stick_to_object`
|
|
(raw @00524589); 0x200 → `standing_longjump` store (raw @0052458e).
|
|
`UpdateMotion.cs` PARSES both (cited §2f) — verify they're APPLIED
|
|
(sticky needs TS-39's machinery = this phase; longjump flag should
|
|
reach `MotionInterpreter.StandingLongJump`).
|
|
3. **#164** (filed): action-replay dispatches drop the per-action
|
|
Autonomous bit (raw 305982 sets params bit 0x1000 → AddAction). Fix
|
|
while touching the action path.
|
|
|
|
## The load-bearing lessons (compressed)
|
|
|
|
- **The queue model** (unchanged from R4): every `pending_motions`
|
|
enqueue needs a manager completion partner; one orphan = permanent
|
|
MotionsPending wedge.
|
|
- **BN smeared bitfield stores**: a fresh local struct + later "mush"
|
|
expression = decode the mush BEFORE porting "ctor defaults". ACE's C#
|
|
port of the same function is the fastest cross-check. Cost of missing
|
|
it: #161 + the wrong W6 entry-cache theory + a wrong pinned test.
|
|
- **Tests can pin bug values**: `AirborneBody_NoCycleDispatches_...`
|
|
asserted the CLOBBERED fwd (0x40000015) with a comment admitting it was
|
|
untested. When flipping behavior, audit what the old assertions PINNED.
|
|
|
|
## Session gotchas
|
|
|
|
- Launch recipe unchanged (CLAUDE.md). Client LOCKS builds — ask the user
|
|
to close it, never kill. Graceful close clears the ACE session in ~5 s.
|
|
- PowerShell `Tee-Object` writes UTF-16 → grep the background task's
|
|
plain-text output file instead of the tee'd log.
|
|
- ACDREAM_DUMP_MOTION=1 + ACDREAM_REMOTE_VEL_DIAG=1 give the full UM/seq
|
|
evidence chain ([UM_RAW] hex incl. autonomy byte, [FWD_WIRE],
|
|
[SEQSTATE], [MOTIONDONE]); #165's first step is ACDREAM_PROBE_RESOLVE
|
|
at a wall.
|