feat(render #53): DEBUG cross-check guards against the prior Tier 1 bug class
Adds EntityClassificationCache.DebugCrossCheck(entityId, liveBatches) that asserts cached state matches a live re-classification. Wires a simpler predicate assert into WbDrawDispatcher's cache-hit branch (asserts isAnimated == false on cache hit). Tests #13a and #13b cover the batch-count mismatch and clean-match cases via a custom TraceListener that captures Debug.Assert calls. Zero cost in Release. In DEBUG, the assert fires immediately if a future regression mutates static-entity state outside the audit's known write sites — the same failure mode that bit the prior Tier 1 attempt. Phase 4 complete. Cache + invalidation + safety net all in place. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
parent
489174f21c
commit
f16604b60b
3 changed files with 149 additions and 0 deletions
|
|
@ -478,6 +478,23 @@ public sealed unsafe class WbDrawDispatcher : IDisposable
|
|||
|
||||
if (diag) _entitiesDrawn++;
|
||||
lastHitEntityId = entity.Id;
|
||||
|
||||
#if DEBUG
|
||||
// Cross-check guard: assert the membership predicate held at hit time.
|
||||
// The full re-classification cross-check (spec section 6.5) is a stretch
|
||||
// goal; this simpler assert catches the prior Tier 1 bug class — a
|
||||
// static entity that turns out to actually be animated would fire here.
|
||||
//
|
||||
// Structurally redundant with the `if (!isAnimated && ...)` branch
|
||||
// condition, but serves as a TRIPWIRE: a future refactor that
|
||||
// incorrectly relaxes the branch condition (e.g., removes
|
||||
// `!isAnimated` from the guard) would silently allow animated
|
||||
// entities into the fast path; the assert catches that immediately.
|
||||
System.Diagnostics.Debug.Assert(
|
||||
!isAnimated,
|
||||
$"EntityClassificationCache hit on animated entity {entity.Id} — invariant violated");
|
||||
#endif
|
||||
|
||||
continue;
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue