acdream/tests/AcDream.Core.Tests
Erik 44614ab591 test(phys): A6.P3 #98 — comparison harness + first evidence-driven finding
The capture apparatus pays off on the FIRST iteration. Three records
sampled from a live cottage-cellar session — tick 0 (spawn at Z=92.53),
tick 376 (player on the cellar ramp at Z=91.49), and tick 1183 (first
cap event, foot Z=92.74 with cn=(0,0,-1)) — replayed against the
harness engine reveal:

- LiveCompare_Tick0_Spawn:                  PASSES (full round-trip).
- LiveCompare_Tick376_OnRamp:               PASSES (ramp walkable
                                            polygon hydrates correctly,
                                            engine reproduces live).
- LiveCompare_FirstCap_HeadHitsCottageFloor: FAILS by exactly the
                                            divergence shape that names
                                            the missing fixture.

The cap-record divergence:
  Result.Position:       live=(141.3865,7.2243,92.7390)
                         harness=(141.3599,7.2243,92.7390)  (Y slid; X stuck)
  Result.CollisionNormal:live=(0,0,-1)  ← downward = cottage floor from below
                         harness=(0,0,+1) ← upward = some other floor

Plus the LiveCompare_FirstCap_DiagnosticDump test (always passes; it's
a probe-firing scratch test) prints every cell polygon in world frame:

  Cellar 0xA9B40147 — ceiling polys at world Z=93.80 cover X=133-142,
  Y=-1.0-11.5 but NOT the sphere XY of (141.39, 7.03) — at the right
  edge of Y=7.03 the ceiling quads are at Y<3.90 or Y>8.70.

  Cottage 0xA9B40143 — floor polys at world Z=94.0 cover X=136.7-140.5,
  Y=3.9-13.1 but NOT (141.39, 7.03) either — at X=141.39 we are 0.89m
  east of the floor quad's rightmost vertex.

  Cottage 0xA9B40146 — only 4 walls, no floor.

So both cells we have CAN'T produce the live's cn=(0,0,-1). The actual
blocking polygon must be in a cell or static object we haven't loaded
into the harness yet. The cellar is rectangularly bounded; the cottage
above has a floor that spans the cottage, but the floor polygon RIGHT
ABOVE the ramp top (which is where the freeze fires) is in some OTHER
cell — either a separate cottage-floor sub-cell or a building static
GfxObj.

This is the first evidence-driven step in the saga. Six sessions of
speculation produced ten failed fix shapes; the apparatus produced
this finding in one round trip. Next step: re-capture with
ACDREAM_PROBE_POLY_DUMP + ACDREAM_DUMP_CELLS covering 0xA9B40140-
0xA9B4014F to identify the missing fixture cell.

Adds:
- LiveCompare_Tick0_Spawn / Tick376_OnRamp / FirstCap_HeadHitsCottageFloor
- LiveCompare_FirstCap_DiagnosticDump (always passes; dumps cell polys
  in world frame + enables every relevant probe so the captured stdout
  shows the harness BSP query path)
- tests/AcDream.Core.Tests/Fixtures/issue98/live-capture.jsonl
  (3 representative records from the 41,228-record live capture)
- AssertCallMatchesCapture helper: per-field diff with Vector3 / float
  tolerances, reports every divergence not just the first.

Test baseline maintained at 1172 + 8 baseline + 5 new tests pass +
1 known-failing test that pinpoints the bug = 1178 + 9 (where the
new failure is the desired evidence-driven test).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-23 19:58:51 +02:00
..
Allegiance feat(allegiance): Phase H.2 AllegianceRequests + AllegianceTree model 2026-04-18 17:17:45 +02:00
Audio feat(audio): Phase E.2 OpenAL engine + SoundTable cookbook + hook wiring 2026-04-18 16:38:26 +02:00
Chat fix(chat): /help client-side handler + System dedup + ThatIsNotAValidCommand template 2026-04-25 21:22:07 +02:00
Combat feat(combat): Phase L.1c wire live attack input 2026-04-28 11:58:57 +02:00
Fixtures/issue98 test(phys): A6.P3 #98 — comparison harness + first evidence-driven finding 2026-05-23 19:58:51 +02:00
Input fix(camera): #38 render-interpolate player motion 2026-05-06 17:53:34 +02:00
Items feat(items): Phase F.2 ItemRepository + AppraiseRequest round-trip 2026-04-18 16:55:36 +02:00
Lighting feat(lighting): Phase G.2 — Setup.Lights + SetLightHook wiring 2026-04-19 10:46:49 +02:00
Meshing feat(vfx #C.1.5b): SetupPartTransforms helper for per-part anchor transforms 2026-05-11 23:54:33 +02:00
Physics test(phys): A6.P3 #98 — comparison harness + first evidence-driven finding 2026-05-23 19:58:51 +02:00
Player feat(player): #5 PlayerDescription parser — Stam/Mana via attribute block 2026-04-25 16:42:24 +02:00
Plugins feat(core): add IGameState, IEvents, WorldEvents with replay-on-subscribe 2026-04-10 20:29:29 +02:00
Rendering chore(O-T7): code-review housekeeping after WB extraction 2026-05-21 17:29:06 +02:00
Selection test(picker): Cluster A #86 — screen-rect cell-occlusion tests 2026-05-19 14:56:51 +02:00
Spells fix(player): EnchantmentMask bit fix + Vitae key=0 + absolute Vitals overlay 2026-04-25 18:15:20 +02:00
Streaming feat(vfx #C.1.5b): GpuWorldState fires activator for dat-hydrated entities 2026-05-12 00:07:38 +02:00
Terrain chore(phys): A6.P3 #98 triage — revert neg-poly + bldg-check experiments 2026-05-23 15:11:49 +02:00
Textures feat(O-T2): extract pure stateless helpers to AcDream.Core.Rendering.Wb 2026-05-21 15:13:26 +02:00
Ui fix(retail): rotation rate, useability gate, retail toast strings 2026-05-16 12:17:54 +02:00
Vfx fix(vfx #56): ParticleHookSink applies CreateParticleHook.PartIndex transform 2026-05-11 23:57:20 +02:00
World chore(phys): A6.P3 #98 triage — revert neg-poly + bldg-check experiments 2026-05-23 15:11:49 +02:00
AcDream.Core.Tests.csproj fix(O-T7): actually delete SplitFormulaDivergenceTest (drop workaround) 2026-05-21 17:30:30 +02:00
SmokeTest.cs chore: phase 1 — add Core, Abstractions, App, Tests projects 2026-04-10 09:22:33 +02:00