#119 decisive probe: ACDREAM_DUMP_ENTITY one-shot entity dump (H-A/H-B/H-C discriminator)
The broken-state log (user-session-capture2.log) shows meshMissing=0 / entSeen==entDrawn WHILE broken stairs are on screen - the staircase is DRAWN WRONG, not missing. This probe discriminates the three live hypotheses in ONE launch (handoff 2026-06-11 s4): - HYDRATE dump (GameWindow.BuildInteriorEntitiesForStreaming): per-part placement-frame translations + dropped-part accounting at the MOMENT MeshRefs are constructed. H-A (SetupMesh.Flatten identity fallback / silent gfx-null part drops under degraded dat reads) shows here as zero translations or built<43. - DRAW dump (WbDrawDispatcher, first tuple per entity): live MeshRefs translation summary + per-part loaded flags + Tier-1 classification cache state (batch count + RestPose translation summary), re-emitted compactly on signature change. H-B (partial/stale cached batch set) shows as correct translations + odd batch count. - WALK-REJECT lines (rate-limited): attributes 'entity never reaches the draw loop' to the specific gate (visibleCellIds/frustum). - Correct everything -> H-C (draw-side compose), instrument next. Targets: ACDREAM_DUMP_ENTITY=0x020003F2,0x020005D8 (the 43-part spiral staircase Setup + the wall barrels; H-A predicts the user's 'barrel' IS the collapsed staircase). Probe is inert when the env var is unset. Parser in RenderingDiagnostics (diagnostic-owner pattern) + 5 unit tests. Suites: App 242+1skip / Core 1427+2skip / UI 420 / Net 294. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
parent
d82f070b88
commit
3cf6bcc219
4 changed files with 246 additions and 2 deletions
|
|
@ -373,6 +373,47 @@ public static class RenderingDiagnostics
|
|||
/// </summary>
|
||||
public static bool IsEnvCellId(ulong id) => (id & 0xFFFFu) >= 0x0100u;
|
||||
|
||||
/// <summary>
|
||||
/// #119 tower-staircase decisive probe (2026-06-11). Comma-separated
|
||||
/// Setup / GfxObj source ids (hex, optional 0x prefix) from
|
||||
/// <c>ACDREAM_DUMP_ENTITY</c>. Any <c>WorldEntity</c> whose
|
||||
/// <c>SourceGfxObjOrSetupId</c> is in this set emits:
|
||||
/// (a) a <c>[dump-entity] HYDRATE</c> dump at MeshRef construction time
|
||||
/// (<c>GameWindow.BuildInteriorEntitiesForStreaming</c>) — per-part
|
||||
/// placement-frame translations + dropped-part accounting — discriminating
|
||||
/// hydration-time corruption (H-A: SetupMesh.Flatten identity fallback /
|
||||
/// silent gfx-null part drops under degraded dat reads);
|
||||
/// (b) a <c>[dump-entity] DRAW</c> dump in <c>WbDrawDispatcher</c> at first
|
||||
/// draw — live MeshRefs translations + Tier-1 classification cache state —
|
||||
/// re-emitted compactly whenever that state changes (H-B: stale/partial
|
||||
/// cached batch set); and
|
||||
/// (c) rate-limited <c>[dump-entity] WALK-REJECT</c> lines when the
|
||||
/// dispatcher's walk filters the entity out (absence-of-draw attribution).
|
||||
/// Empty set = probe off; every call site early-outs on <c>Count == 0</c>.
|
||||
/// </summary>
|
||||
public static IReadOnlySet<uint> DumpEntitySourceIds { get; } =
|
||||
ParseDumpEntityIds(Environment.GetEnvironmentVariable("ACDREAM_DUMP_ENTITY"));
|
||||
|
||||
/// <summary>
|
||||
/// Parse the <c>ACDREAM_DUMP_ENTITY</c> value: comma-separated hex ids,
|
||||
/// optional 0x prefix, whitespace tolerated, malformed segments ignored
|
||||
/// (probes are forgiving — a typo'd segment must not take the launch down).
|
||||
/// Internal for unit tests.
|
||||
/// </summary>
|
||||
internal static IReadOnlySet<uint> ParseDumpEntityIds(string? raw)
|
||||
{
|
||||
var set = new HashSet<uint>();
|
||||
if (string.IsNullOrWhiteSpace(raw)) return set;
|
||||
foreach (var seg in raw.Split(',', StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries))
|
||||
{
|
||||
var s = seg.StartsWith("0x", StringComparison.OrdinalIgnoreCase) ? seg[2..] : seg;
|
||||
if (uint.TryParse(s, System.Globalization.NumberStyles.HexNumber,
|
||||
System.Globalization.CultureInfo.InvariantCulture, out var id))
|
||||
set.Add(id);
|
||||
}
|
||||
return set;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// The top-level render branch: should this frame run the indoor (DrawInside) path?
|
||||
///
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue