acdream/tests/AcDream.Core.Tests
Erik 5c6bdbe30d test(phys): A6.P3 #98 — harness deep investigation; airborne-at-tick-1 root cause not yet isolated
Multi-step investigation of the airborne-at-tick-1 bug per the
systematic-debugging skill. Several hypotheses tested via the
harness, each producing the same (0,1,0) hit normal at tick 1:

1. WalkablePolygon seeding ADDED to BuildInitialBody (was missing).
   PhysicsEngine.cs:665-673 requires body.WalkablePolygonValid +
   WalkableVertices to call SpherePath.SetWalkable. With seeded
   walkable poly: walkPoly=True survives tick 1 (was False before).
   BUT engine still reports hit=(0,1,0) and body goes airborne.
2. Initial Z lift removed (back to 0): same airborne behavior.
3. Synthetic stair GfxObj DISABLED: same (0,1,0) hit. Hit is not
   from FindObjCollisions.
4. Stub landblock REMOVED: same (0,1,0). FindObjCollisions early-
   returns without landblock context, FindEnvCollisions's outdoor
   terrain returns null. Hit is not from terrain.
5. SYNTHETIC BSP attached to cell fixtures (Hydrate sets BSP=null
   per its xmldoc; without BSP the indoor branch is skipped, falls
   through to outdoor terrain). One-leaf BSP referencing every poly
   in cell.Resolved. Indoor BSP path now runs. Same (0,1,0) hit.

Trace timeline at tick 1:
  find-start: walkPoly=True, CP valid, oi=0x303 (Contact+OnWalkable)
  after-adjust: req=(0,-0.1,0) adj=(0,-0.1,0) — no projection change
  before-insert: check=(141.5, 9.4, 91.43)
  stepdown-enter (Contact-recovery): stepDown=True, height=0.04
  stepdown-after-offset: check=(141.5, 9.4, 91.39) — moved DOWN 0.04
  stepdown-after-insert: state=OK, cp=n/a (no walkable found)
  stepdown-reject
  (second stepdown attempt — same outcome)
  after-insert: state=Collided, hit=n/a, walkPoly=False
  after-validate: state=OK, hit=(0,1,0), slide=(0,1,0)
                   oi=0x300 (Contact+OnWalkable CLEARED)

The (0,1,0) hit is set by ValidateTransition between after-insert
and after-validate. ValidateTransition's default-push-up code path
sets UnitZ=(0,0,1), NOT UnitY=(0,1,0). So something INSIDE
TransitionalInsert sets ci.CollisionNormal=(0,1,0) before
ValidateTransition runs (12 SetCollisionNormal call sites in
TransitionTypes.cs — root cause not isolated to one).

Per systematic-debugging skill: 5+ hypotheses tested without
convergence = "question architecture". The bug is hidden deeper
than a single misconfigured init field.

Next session pickup: build a side-by-side instrumentation harness
that mimics PlayerMovementController's EXACT call sequence
(PhysicsBody field state, ResolveWithTransition args, frame
ordering) and compare per-tick divergence against a live capture.
The harness is missing some piece of state production carries
across ticks — find what piece.

Apparatus progress (committed):
- Harness with synthetic stair GfxObj registration (Issue #98 ramp polygon now constructable programmatically)
- Synthetic cell-BSP attachment (AttachSyntheticBsp) — unlocks indoor
  BSP collision path for hydrated cell fixtures
- WalkablePolygon seeding in BuildInitialBody (PhysicsBody seeding pattern documented)
- Three diagnostic dump tests for tick-by-tick traces

Test baseline: 1167 + 5 (harness) = 1172 + 8 pre-existing failures.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-23 19:04:36 +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 capture(phys): A6.P3 #98 — cellar/cottage cell fixtures from live capture 2026-05-23 15:21:44 +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 — harness deep investigation; airborne-at-tick-1 root cause not yet isolated 2026-05-23 19:04:36 +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