fix #435 (part 2, closes it): attribute the unowned probes — delete 7, reclassify 8, restore 1
Part 1 deleted probes whose owning issues were closed. These 14 named no issue at all, so each was traced to its introducing commit (git log -S) instead of guessed at. Attribution split them three ways: DELETED (7, investigations closed): ACDREAM_A8_DUMP_PV and ACDREAM_DUMP_LIVE_SPAWNS (Phase A8), ACDREAM_DUMP_CLOTHING (#37), ACDREAM_DUMP_EDGE_SLIDE (#32), ACDREAM_DUMP_STEPUP (L.2.3d-f), ACDREAM_DUMP_VENDOR (the vendor campaign, 25 call sites across 8 files), ACDREAM_DUMP_VITALS (#5, four independent read sites). VendorDiagnostics.cs went entirely. RECLASSIFIED (8, tools misfiled as probes): the DUMP_CELLS/DUMP_GFXOBJS fixture-extraction family (replay-harness tooling with a roundtrip test), PROBE_CELL (standing cell-transit tracer, pair of the permanent PROBE_RESOLVE), DUMP_SKY and HIDE_PART (generic isolation tools), and DUMP_STEEP_ROOF — which looked like an L.4 relic but observes LIVE divergence-register row AD-56; deleting it would have removed the only runtime lens on an active divergence. All moved to Permanent diagnostics with their attribution recorded. RESTORED (1): ACDREAM_DUMP_MOVE_TRUTH was deleted and un-deleted the same day. It is not a probe — the canonical nine-stop soak (run-connected-r6-soak.ps1) hard-fails every destination without its 'move-truth OUT' records, with a message that would misdirect the next operator. Under the no-workarounds rule the gate's mechanism is restored, not left broken with an IOU (#437, closed). Process lesson recorded on both issues: a closed owning issue is NOT sufficient to delete a probe — grep tools/ and the contract tests for consumers first. Also lands the owner-requested default-off invariant: every diagnostic in the codebase is inert until its env var is explicitly set. Exactly four flags default ON and none is a diagnostic — RETAIL_CHASE, CAMERA_COLLIDE, CAMERA_ALIGN_SLOPE, RETAIL_CLOSE_DEGRADES are retail behaviors wearing an A/B off-switch. That set is now FROZEN by LaunchOptionsDocumentationTests.OnlyTheFourRetailBehaviorFlagsDefaultOn; docs/launch-options.md's Conventions and CLAUDE.md state the rule, and CLAUDE.md now binds future probes to a documented row in the same commit. The client reads 137 environment variables (161 at audit start); 40 temporary probes remain, every one attributed. Full hermetic suite 15,322 passed / 0 failed. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
parent
0c5057c9ff
commit
c1e6e3da44
26 changed files with 256 additions and 693 deletions
|
|
@ -1,27 +0,0 @@
|
|||
using System;
|
||||
|
||||
namespace AcDream.Core.Items;
|
||||
|
||||
/// <summary>
|
||||
/// TEMPORARY diagnostic-probe owner for two live-only regressions that have
|
||||
/// each survived two green-tested fixes: Chain A (a far-click walk-to-use
|
||||
/// approaches a vendor, the vendor plays its cosmetic greeting, but the shop
|
||||
/// window never opens) and Chain B (selecting a splittable vendor stack
|
||||
/// shows the bare item name with no quantity slider). Every probe line is
|
||||
/// prefixed <c>[vendor-diag]</c> and gated on <see cref="DumpVendorEnabled"/>
|
||||
/// so the family is a true no-op when the flag is unset.
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// Read once from <c>ACDREAM_DUMP_VENDOR=1</c> at process start, per Code
|
||||
/// Structure Rule 5 (one static diagnostic-owner class per subsystem, no
|
||||
/// per-call-site <see cref="Environment.GetEnvironmentVariable"/> reads).
|
||||
/// Lives in <c>AcDream.Core</c> — the one project every call site (App,
|
||||
/// Core.Net, Runtime) already references — so a single flag instance is
|
||||
/// shared across the whole probe family regardless of which layer observes
|
||||
/// it first.
|
||||
/// </remarks>
|
||||
public static class VendorDiagnostics
|
||||
{
|
||||
public static bool DumpVendorEnabled { get; } =
|
||||
Environment.GetEnvironmentVariable("ACDREAM_DUMP_VENDOR") == "1";
|
||||
}
|
||||
|
|
@ -1637,7 +1637,7 @@ public static class PhysicsDiagnostics
|
|||
// channel), naming which phase halted the attempt and, on Collided,
|
||||
// the colliding polygon's normal and which of the three channels
|
||||
// wrote it.
|
||||
// [transit-fail-stepup] — DoStepUp entry/exit, mirroring the existing
|
||||
// [transit-fail-stepup] — DoStepUp entry/exit, mirroring the retired
|
||||
// ACDREAM_DUMP_STEPUP probe's own input-normal-and-verdict content
|
||||
// so a stuck-tick capture carries the step chain without running a
|
||||
// second flag.
|
||||
|
|
@ -1753,7 +1753,7 @@ public static class PhysicsDiagnostics
|
|||
|
||||
/// <summary>
|
||||
/// One line per <c>Transition.DoStepUp</c> entry or exit, mirroring the
|
||||
/// content of the existing <c>ACDREAM_DUMP_STEPUP</c> probe (same input
|
||||
/// content of the retired <c>ACDREAM_DUMP_STEPUP</c> probe (same input
|
||||
/// normal / walkable verdict / landing-plane fields) so a stuck-tick
|
||||
/// capture carries the step-up chain without a second flag.
|
||||
/// <paramref name="edge"/> is <c>"enter"</c> or <c>"exit"</c>;
|
||||
|
|
|
|||
|
|
@ -1349,9 +1349,6 @@ public sealed class Transition
|
|||
CollisionInfo.CopyFrom(source.CollisionInfo);
|
||||
}
|
||||
|
||||
private static bool DumpEdgeSlideEnabled =>
|
||||
Environment.GetEnvironmentVariable("ACDREAM_DUMP_EDGE_SLIDE") == "1";
|
||||
|
||||
// -----------------------------------------------------------------------
|
||||
// A6.P7 (2026-05-25) — retail-binary shape dispatch rule
|
||||
// -----------------------------------------------------------------------
|
||||
|
|
@ -2227,7 +2224,6 @@ public sealed class Transition
|
|||
if (ci.ContactPlaneValid)
|
||||
return TransitionState.OK;
|
||||
|
||||
DumpStepDownBranchGate(contactInvalid: true);
|
||||
if (oi.Contact && !sp.StepDown && sp.CheckCellId != 0 && oi.StepDown)
|
||||
{
|
||||
// L.2.3i (2026-04-29): retail uses FloorZ when OnWalkable,
|
||||
|
|
@ -2280,7 +2276,6 @@ public sealed class Transition
|
|||
// intentionally narrow: it tells the next L.2c slice whether
|
||||
// we are missing precipice context, a steep contact plane, or
|
||||
// merely the EdgeSlide flag.
|
||||
DumpEdgeSlideStepDownFailed(stepDownHeight, zVal);
|
||||
|
||||
bool stop = EdgeSlideAfterStepDownFailed(
|
||||
engine,
|
||||
|
|
@ -2469,7 +2464,6 @@ public sealed class Transition
|
|||
TransitionCellCollisionPhase.Objects,
|
||||
cellId,
|
||||
FindObjCollisionsInCell(engine, cellId));
|
||||
DumpPhase2(innerAttempt, environment, objects);
|
||||
PhysicsDiagnostics.TraceTransitInsertAttempt(
|
||||
ObjectInfo.SelfEntityId, innerAttempt, "objects",
|
||||
environment, building, objects, objects,
|
||||
|
|
@ -2501,7 +2495,6 @@ public sealed class Transition
|
|||
// No steep-plane exception precedes this gate (0050b3d8-0050b3e7).
|
||||
if (!oi.OnWalkable || !oi.EdgeSlide)
|
||||
{
|
||||
DumpEdgeSlideBranch("branch1/!onwalkable-or-!edgeslide", zVal);
|
||||
sp.ClearWalkable();
|
||||
sp.RestoreCheckPos();
|
||||
ci.ContactPlaneValid = false;
|
||||
|
|
@ -2513,7 +2506,6 @@ public sealed class Transition
|
|||
if (ci.ContactPlaneValid && ci.ContactPlane.Normal.Z < zVal)
|
||||
{
|
||||
var cliffPlane = ci.ContactPlane;
|
||||
DumpEdgeSlideBranch("branch2/steep-cliffslide", zVal);
|
||||
sp.ClearWalkable();
|
||||
sp.RestoreCheckPos();
|
||||
ci.ContactPlaneValid = false;
|
||||
|
|
@ -2536,7 +2528,6 @@ public sealed class Transition
|
|||
// rapidly down the stairs. Do not restore stale history here.
|
||||
if (sp.HasWalkablePolygon)
|
||||
{
|
||||
DumpEdgeSlideBranch("branch3/precipice-slide", zVal);
|
||||
sp.RestoreCheckPos();
|
||||
ci.ContactPlaneValid = false;
|
||||
ci.ContactPlaneIsWater = false;
|
||||
|
|
@ -2546,7 +2537,6 @@ public sealed class Transition
|
|||
|
||||
if (ci.ContactPlaneValid)
|
||||
{
|
||||
DumpEdgeSlideBranch("branch4/contact-no-walkable", zVal);
|
||||
sp.ClearWalkable();
|
||||
sp.RestoreCheckPos();
|
||||
ci.ContactPlaneValid = false;
|
||||
|
|
@ -2624,8 +2614,6 @@ public sealed class Transition
|
|||
Vector3 collideNormal = new(-contactNormal.Y, contactNormal.X, 0f);
|
||||
if (collideNormal.LengthSquared() < PhysicsGlobals.EpsilonSq)
|
||||
{
|
||||
DumpCliffSlide("degenerate-cross/last-known", contactPlane,
|
||||
new Plane(referenceNormal, 0f), contactNormal, 0f, false);
|
||||
return TransitionState.OK;
|
||||
}
|
||||
|
||||
|
|
@ -2633,8 +2621,6 @@ public sealed class Transition
|
|||
|
||||
Vector3 offset = sp.GlobalSphere[0].Origin - sp.GlobalCurrCenter[0].Origin;
|
||||
float angle = Vector3.Dot(collideNormal, offset);
|
||||
DumpCliffSlide("ok/last-known", contactPlane,
|
||||
new Plane(referenceNormal, 0f), collideNormal, angle, true);
|
||||
|
||||
if (angle <= 0f)
|
||||
{
|
||||
|
|
@ -2650,89 +2636,6 @@ public sealed class Transition
|
|||
return TransitionState.Adjusted;
|
||||
}
|
||||
|
||||
private void DumpEdgeSlideStepDownFailed(float stepDownHeight, float zVal)
|
||||
{
|
||||
if (!DumpEdgeSlideEnabled) return;
|
||||
|
||||
var sp = SpherePath;
|
||||
var ci = CollisionInfo;
|
||||
var oi = ObjectInfo;
|
||||
|
||||
Console.WriteLine(
|
||||
System.FormattableString.Invariant(
|
||||
$"edge-slide: stepdown-failed cur={Fmt(sp.CurPos)} check={Fmt(sp.CheckPos)} cell=0x{sp.CheckCellId:X8} edgeFlag={oi.EdgeSlide} contactFlag={oi.Contact} onWalkable={oi.OnWalkable} contactPlane={ci.ContactPlaneValid} lastPlane={ci.LastKnownContactPlaneValid} walkableValid={sp.WalkableValid} walkablePoly={sp.HasWalkablePolygon} lastWalkablePoly={sp.HasLastWalkablePolygon} stepDown={stepDownHeight:F3} zVal={zVal:F3}"));
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// L.4-diag: log step-down branch gate decision. Whether we entered or
|
||||
/// skipped the contact-recovery branch matters for whether CliffSlide
|
||||
/// has any chance of firing.
|
||||
/// </summary>
|
||||
private void DumpStepDownBranchGate(bool contactInvalid)
|
||||
{
|
||||
if (!DumpEdgeSlideEnabled) return;
|
||||
|
||||
var sp = SpherePath;
|
||||
var ci = CollisionInfo;
|
||||
var oi = ObjectInfo;
|
||||
|
||||
bool wouldEnter = contactInvalid && oi.Contact && !sp.StepDown
|
||||
&& sp.CheckCellId != 0 && oi.StepDown;
|
||||
|
||||
if (!wouldEnter) return; // only log when entering, to keep noise low
|
||||
|
||||
Console.WriteLine(
|
||||
System.FormattableString.Invariant(
|
||||
$"edge-slide: stepdown-branch-enter cur={Fmt(sp.CurPos)} contactValid={ci.ContactPlaneValid} contactN.Z={(ci.ContactPlaneValid ? ci.ContactPlane.Normal.Z : 0f):F3} onWalk={oi.OnWalkable} contact={oi.Contact}"));
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// L.4-diag: log Phase 2 outcome per inner attempt. Tells us whether
|
||||
/// we're churning in Slid retries or escaping to step-down branch.
|
||||
/// </summary>
|
||||
private void DumpPhase2(int attempt, TransitionState envState, TransitionState objState)
|
||||
{
|
||||
if (!DumpEdgeSlideEnabled) return;
|
||||
if (objState == TransitionState.OK) return; // skip clean attempts
|
||||
|
||||
Console.WriteLine(
|
||||
System.FormattableString.Invariant(
|
||||
$"edge-slide: phase2 attempt={attempt} env={envState} obj={objState}"));
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// L.4-diag: log which branch of EdgeSlideAfterStepDownFailed fired.
|
||||
/// Tells us whether CliffSlide gets called or whether we hit a
|
||||
/// stop-at-edge branch.
|
||||
/// </summary>
|
||||
private void DumpEdgeSlideBranch(string branch, float zVal)
|
||||
{
|
||||
if (!DumpEdgeSlideEnabled) return;
|
||||
var sp = SpherePath;
|
||||
var ci = CollisionInfo;
|
||||
var oi = ObjectInfo;
|
||||
Console.WriteLine(
|
||||
System.FormattableString.Invariant(
|
||||
$"edge-slide: branch={branch} contactValid={ci.ContactPlaneValid} contactN.Z={(ci.ContactPlaneValid ? ci.ContactPlane.Normal.Z : 0f):F3} lastValid={ci.LastKnownContactPlaneValid} lastN.Z={(ci.LastKnownContactPlaneValid ? ci.LastKnownContactPlane.Normal.Z : 0f):F3} walkPolyValid={sp.HasWalkablePolygon} walkPolyN.Z={(sp.HasWalkablePolygon ? sp.WalkablePlane.Normal.Z : 0f):F3} lastWalkPolyN.Z={(sp.HasLastWalkablePolygon ? sp.LastWalkablePlane.Normal.Z : 0f):F3} onWalk={oi.OnWalkable} edgeFlag={oi.EdgeSlide} zVal={zVal:F3}"));
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// L.4-diag: log CliffSlide invocation. Tells us whether the
|
||||
/// cross-product is degenerate (no slide) or producing a real
|
||||
/// deflection.
|
||||
/// </summary>
|
||||
private void DumpCliffSlide(string outcome, Plane current, Plane lastKnown,
|
||||
Vector3 collideNormal, float angle, bool willApply)
|
||||
{
|
||||
if (!DumpEdgeSlideEnabled) return;
|
||||
Console.WriteLine(
|
||||
System.FormattableString.Invariant(
|
||||
$"edge-slide: cliffslide outcome={outcome} curN={Fmt(current.Normal)} lastN={Fmt(lastKnown.Normal)} collideN={Fmt(collideNormal)} angle={angle:F4} apply={willApply}"));
|
||||
}
|
||||
|
||||
private static string Fmt(Vector3 value) =>
|
||||
System.FormattableString.Invariant($"({value.X:F3},{value.Y:F3},{value.Z:F3})");
|
||||
|
||||
// -----------------------------------------------------------------------
|
||||
// Environment collision — outdoor terrain
|
||||
// -----------------------------------------------------------------------
|
||||
|
|
@ -5739,29 +5642,9 @@ public sealed class Transition
|
|||
var ci = CollisionInfo;
|
||||
var oi = ObjectInfo;
|
||||
|
||||
// L.2.3f (2026-04-29): diagnostic for steep-roof bug. Logs the
|
||||
// input polygon normal that triggered step-up. The verdict tells
|
||||
// whether THIS polygon would pass FloorZ (≈ 0.66) — but actual
|
||||
// step-up acceptance depends on the polygon found by step_sphere_down
|
||||
// INSIDE the recursive TransitionalInsert, which may be different.
|
||||
// The post-step "result=" line below logs that outcome.
|
||||
bool diag = Environment.GetEnvironmentVariable("ACDREAM_DUMP_STEPUP") == "1";
|
||||
if (diag)
|
||||
{
|
||||
float floor = PhysicsGlobals.FloorZ;
|
||||
string verdict = collisionNormal.Z >= floor ? "WALKABLE" : "STEEP";
|
||||
Console.WriteLine(
|
||||
$"stepup: enter normal=({collisionNormal.X:F3},{collisionNormal.Y:F3},{collisionNormal.Z:F3}) " +
|
||||
$"|Z|={collisionNormal.Z:F3} vs FloorZ={floor:F3} → {verdict}, " +
|
||||
$"OnWalkable={(oi.State & ObjectInfoState.OnWalkable) != 0}, " +
|
||||
$"StepUpHeight={oi.StepUpHeight:F3}, " +
|
||||
$"CurPos=({sp.CurPos.X:F2},{sp.CurPos.Y:F2},{sp.CurPos.Z:F2})");
|
||||
}
|
||||
|
||||
// #345 probe (2026-08-08): mirrors the ACDREAM_DUMP_STEPUP content
|
||||
// above into the buffered stuck-tick trace (self-guards internally,
|
||||
// zero cost when ACDREAM_DUMP_TRANSIT_FAIL is unset) so a stuck-tick
|
||||
// capture carries the step-up chain without a second flag.
|
||||
// #345 probe (2026-08-08): buffers this step-up attempt into the
|
||||
// stuck-tick trace (self-guards internally, zero cost when
|
||||
// ACDREAM_DUMP_TRANSIT_FAIL is unset).
|
||||
PhysicsDiagnostics.TraceTransitStepUp(
|
||||
oi.SelfEntityId, "enter", collisionNormal,
|
||||
onWalkable: (oi.State & ObjectInfoState.OnWalkable) != 0,
|
||||
|
|
@ -5807,28 +5690,6 @@ public sealed class Transition
|
|||
sp.StepUp = false;
|
||||
sp.ClearWalkable();
|
||||
|
||||
// L.2.3f: log the result + landing plane if step-up succeeded.
|
||||
// This is the actual surface the player ended up on, which may
|
||||
// differ from the input collision normal (e.g. step-up scanned
|
||||
// past a steep slope and landed on a flatter polygon higher up).
|
||||
if (diag)
|
||||
{
|
||||
if (stepDown && ci.ContactPlaneValid)
|
||||
{
|
||||
float floor = PhysicsGlobals.FloorZ;
|
||||
string verdict = ci.ContactPlane.Normal.Z >= floor ? "WALKABLE" : "STEEP";
|
||||
Console.WriteLine(
|
||||
$"stepup: SUCCESS — landed on plane normal=" +
|
||||
$"({ci.ContactPlane.Normal.X:F3},{ci.ContactPlane.Normal.Y:F3},{ci.ContactPlane.Normal.Z:F3}) " +
|
||||
$"|Z|={ci.ContactPlane.Normal.Z:F3} vs FloorZ={floor:F3} → {verdict}, " +
|
||||
$"new CheckPos=({sp.CheckPos.X:F2},{sp.CheckPos.Y:F2},{sp.CheckPos.Z:F2})");
|
||||
}
|
||||
else
|
||||
{
|
||||
Console.WriteLine($"stepup: FAILED — sliding back along normal");
|
||||
}
|
||||
}
|
||||
|
||||
// #345 probe (2026-08-08): the matching exit line for the "enter"
|
||||
// trace above.
|
||||
PhysicsDiagnostics.TraceTransitStepUp(
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue