diff --git a/docs/ISSUES.md b/docs/ISSUES.md index cf81dc07..4aa93d64 100644 --- a/docs/ISSUES.md +++ b/docs/ISSUES.md @@ -97,6 +97,58 @@ Copy this block when adding a new issue: --- +## #260 — Portal-network wedge: server-round-trip actions die, LOH leaks — REPRODUCED + +**Status:** OPEN — reproduced live, forensics captured, investigation not started +**Severity:** HIGH (renders the client unplayable after sustained portal use) +**Filed:** 2026-07-29 (instrumented Coldeve session, Vulkan backend) +**Component:** interaction/use transaction gate + inbound stream + managed memory +**Supersedes framing of:** #256 (invisible portal-network objects) and #257 +(~1.5 GB working set) — both are almost certainly facets of this. + +**Reproduction (the first solid one):** on Coldeve (`play.coldeve.ac`), character +Barris, after several portal-network runs returning to the town portal network, +the client wedged: **portals unusable, combat mode won't toggle, portals/signs +missing** — while **movement still works**. + +**Evidence captured (`artifacts/coldeve-repro-20260729/`, gitignored, local):** +gcdump taken *in the broken state* (15 MB), full session log with +`[cell-transit]`/`[input]`/`[use-target]`/`equipment` traces, the +`dotnet-counters` CSV, and stderr. + +**Two symptoms, established from the traces:** +1. **The outbound action pipeline is wedged.** `CombatToggleCombat Press` × 3 + produced **zero outbound send** (movement, being client-predicted, still + produces `[cell-transit]`). Signature of the one-request-at-a-time + interaction/use gate (J5.2) latching closed because a `UseWithTarget` never + received its server ack — a burst of `[use-target] … SEND UseWithTarget` + precedes the hang. Every server-round-trip action (portal use, combat mode) + is then silently dropped; local-only actions still work. +2. **A managed leak on the LOH — this one is ours.** `dotnet-counters` at wedge: + **LOH 601,807,472 B (574 MB)**, process WS 3.2 GB — distinct from the flat + ~1.9 GB residency *level* the V11 soak plateaued at (that was benign; this + climbs under live walked play). Fingerprint matches the project's prior LOH + leak class (per-event `float[]`/`byte[]` never released). 185 `equipment: + attached … RightHandCombat` re-attach lines but only 1 CreateObject, so it is + re-attach/replay churn on existing entities, not fresh-object accumulation. + +**Hypothesis (unproven, for the investigation):** a jammed inbound stream could +both starve the ack the use-gate waits on AND accumulate LOH buffers — one root, +two symptoms. Or two bugs. The gcdump names the LOH type by retainer; the log +timeline names the unacked request. Not confirmed either way. + +**Why the scripted gates missed it:** the V11 portal-churn soak used `/teleloc`, +which enters the transit state machine by a different door than a *walked* portal +transit — exactly the gap the walked-play session was designed to probe. + +**Next (investigation, user-approved fix only):** read the gcdump retainer graph +per `reference_memory_leak_toolchain.md`; reconstruct the use-gate timeline from +the log to find the unacked request; determine shared-vs-separate root. Do NOT +patch the symptom (a gate timeout would be the classic forbidden workaround) — +find why the ack never lands. + +--- + ## #259 — Win32 Vulkan surface creation fails machine-wide (`ERROR_UNKNOWN`) **Status:** OPEN — environment fault, not a product defect; recorded so the next