docs(issues): file #76 — Step 2 LiveSessionController attempt regressed
A first attempt at extracting LiveSessionController out of GameWindow.cs (Step 2 of docs/architecture/code-structure.md §4) was implemented and reverted in the same session after visual verification at Holtburg exposed three regressions: chat input field accepted text but nothing was sent; door/NPC double-click fired the Use packet outbound but had no visible client-side effect; R + click-target auto-walk no longer fired the deferred Use on arrival (re-opens issue #63 / #75 territory). Filing as a tracked open issue so the next refactor attempt has a clear root-cause-investigation starting point with four hypotheses to test. Step 1 (eda936d) and the Rule 5 follow-up (32423c2) remain clean and verified. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
parent
32423c2ba2
commit
4f3b8a6824
1 changed files with 80 additions and 0 deletions
|
|
@ -46,6 +46,86 @@ Copy this block when adding a new issue:
|
||||||
|
|
||||||
# Active issues
|
# Active issues
|
||||||
|
|
||||||
|
## #76 — LiveSessionController extraction (Step 2) regresses interaction + chat outbound
|
||||||
|
|
||||||
|
**Status:** OPEN
|
||||||
|
**Severity:** MEDIUM (refactor blocker; doesn't affect main branch which is unchanged)
|
||||||
|
**Filed:** 2026-05-16
|
||||||
|
**Component:** app / refactor (Step 2 of `docs/architecture/code-structure.md` §4)
|
||||||
|
|
||||||
|
**Description:** A first attempt at Step 2 — extracting `LiveSessionController`
|
||||||
|
out of `GameWindow.cs` — was implemented and reverted in the same session
|
||||||
|
on the `claude/hungry-tharp-b4a27b` worktree. Visual verification at
|
||||||
|
Holtburg revealed:
|
||||||
|
|
||||||
|
- Chat input field accepts text + Enter but nothing is sent (no echo, no
|
||||||
|
ACE response).
|
||||||
|
- Double-click on doors / NPCs fires `[B.4b] use guid=... seq=N` outbound
|
||||||
|
(verified in `launch.log`) but no visible client-side effect (door doesn't
|
||||||
|
swing, NPC doesn't dialogue).
|
||||||
|
- R + click-target produces `[B.4b] use-deferred guid=... seq=N`, the
|
||||||
|
player auto-walks to the target, but the deferred Use does NOT fire on
|
||||||
|
arrival (regresses the Phase B.6 / issue #63 / #75 work).
|
||||||
|
|
||||||
|
The Step 1 (`eda936d` RuntimeOptions) and Rule 5 follow-up
|
||||||
|
(`32423c2` DumpSteepRoof → PhysicsDiagnostics) commits are NOT affected
|
||||||
|
and stay clean.
|
||||||
|
|
||||||
|
**Root cause / status:** Unknown. The refactor preserved every event
|
||||||
|
subscription line-for-line (verified by `git diff` — only one `_liveSession.X +=`
|
||||||
|
line moved, all others present). The new shape:
|
||||||
|
|
||||||
|
```
|
||||||
|
TryStartLiveSession()
|
||||||
|
→ _liveSessionController.CreateAndWire(_options, WireLiveSessionEvents)
|
||||||
|
→ new WorldSession(endpoint)
|
||||||
|
→ wireEvents(session) // i.e. WireLiveSessionEvents(session)
|
||||||
|
→ Chat.OnSystemMessage("connecting...")
|
||||||
|
→ _liveSession.Connect(user, pass)
|
||||||
|
→ ...character validation + EnterWorld + post-setup...
|
||||||
|
```
|
||||||
|
|
||||||
|
Looks identical to the original control flow. Hypotheses to test on a
|
||||||
|
clean re-attempt:
|
||||||
|
|
||||||
|
1. **Timing of `_liveSession` field assignment.** The new code assigns
|
||||||
|
`_liveSession` inside `WireLiveSessionEvents` before subscriptions
|
||||||
|
run, and again after CreateAndWire returns. The original code set
|
||||||
|
`_liveSession` once at the inline `new WorldSession(...)` site. A
|
||||||
|
subtle ordering bug between subscriptions and `_liveSession`'s
|
||||||
|
externally visible state may matter.
|
||||||
|
2. **LiveCommandBus closure capture.** The `var liveSession = _liveSession;`
|
||||||
|
capture inside the chat handler block may have been getting a
|
||||||
|
different value than before — though the field IS set by the time
|
||||||
|
the capture happens (line 1 of `WireLiveSessionEvents`).
|
||||||
|
3. **Inbound packet ordering.** ACE may be sending the first
|
||||||
|
StateUpdate / spawn stream BEFORE the EnterWorld dance completes in
|
||||||
|
the new flow; if subscriptions are wired but `_liveSession` field
|
||||||
|
is briefly inconsistent, an early handler call could see a partial
|
||||||
|
state. The `_liveSession?.Tick()` route now goes through
|
||||||
|
`_liveSessionController?.Tick()`; verify that's not the difference.
|
||||||
|
4. **Some non-subscription side effect** in `WireLiveSessionEvents`
|
||||||
|
that wasn't carried over correctly — over-indentation suggests a
|
||||||
|
diff-friendly intermediate state; full re-indentation may surface
|
||||||
|
the bug.
|
||||||
|
|
||||||
|
**Files (in the reverted state — recover from worktree git reflog or
|
||||||
|
re-write):**
|
||||||
|
- `src/AcDream.App/Net/LiveSessionController.cs` (new, ~115 LOC)
|
||||||
|
- `src/AcDream.App/Rendering/GameWindow.cs` — `TryStartLiveSession` split
|
||||||
|
+ new `WireLiveSessionEvents` method
|
||||||
|
|
||||||
|
**Research:** No memory entry yet. If the re-attempt succeeds, add a
|
||||||
|
`feedback_step2_extraction_pitfalls.md` capturing whichever hypothesis
|
||||||
|
turned out to be the bug.
|
||||||
|
|
||||||
|
**Acceptance:** Step 2 lands when the full M1 demo loop (walk Holtburg,
|
||||||
|
double-click inn door + door swings, double-click NPC + NPC dialogues,
|
||||||
|
F-key pickup on a ground item) works identically to the pre-refactor
|
||||||
|
behavior, AND chat input echoes back through the panel.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
## #75 — [DONE 2026-05-16 · `f035ea3`] Auto-walk should drive body directly, not synthesize player-input
|
## #75 — [DONE 2026-05-16 · `f035ea3`] Auto-walk should drive body directly, not synthesize player-input
|
||||||
|
|
||||||
**Status:** DONE
|
**Status:** DONE
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue