test(app): D.2b-B B-Wire — burden wire-first + live-refresh tests + review notes

Final-review response. Adds the spec §5 / Task-16 burden end-to-end coverage
the per-task plan missed: (1) burden reads wire EncumbranceVal over the carried
sum (asserts 50% from wire 7500, not 20% from sum 3000 — retires AP-48's
fallback as the primary), (2) a live player-int update repaints the bar (60%),
which only happens via the C1d Concerns `o.ObjectId == p` branch. Both are
discriminating (fail if the respective branch is reverted).

Plus two clarifying comments from the review: the 0x02CD player route depends on
the login PD upsert having created the player object (no-ops, no phantom, if
not); and a TODO that the container-open phase must treat ViewContents as a full
replace, not the additive merge used here.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
Erik 2026-06-21 19:19:13 +02:00
parent aa0ecaeb4d
commit 7badecf387
3 changed files with 48 additions and 1 deletions

View file

@ -253,6 +253,10 @@ public static class GameEventWiring
// B-Wire: ViewContents (0x0196) — the server's full contents list for a
// container you opened. Record membership for each entry so the table is
// correct before the container-open UI mounts the second item list.
// TODO(container-open): ViewContents is the AUTHORITATIVE full snapshot. When the
// container-open phase consumes it, treat it as a full REPLACE (flush the container's
// prior membership first), not the additive merge below — otherwise items removed
// server-side since the last open would linger.
dispatcher.Register(GameEventType.ViewContents, e =>
{
var p = GameEvents.ParseViewContents(e.Payload.Span);