docs(phys L.2g): design spec for dynamic PhysicsState toggling (doors)

L.2d slice 1.5 ship identified the Holtburg doorway blocker as a closed
Door entity (Setup 0x020019FF) whose PhysicsState.Ethereal bit flips
when the player Uses the door. The L.2d shape-fidelity work doesn't
cover this — the door's collision shape is correct; what's missing is
honoring the *runtime* state change.

L.2g is the new sub-phase that handles it. Scope is narrow:

  * Parse inbound GameMessageSetState (0xF74B).
  * Plumb the new PhysicsState value into ShadowObjectRegistry's
    cached per-entity state so the existing CollisionExemption.IsExempt
    already-in-place short-circuit sees up-to-date bits.
  * Verify the Holtburg inn-door scenario: walk in blocked, Use door,
    walk through, auto-close blocks again after 30s.
  * Confirm UpdateMotion (NonCombat, On/Off) drives non-creature
    entities (door swing animation).

Why a new L.2 sub-letter (and not B.4 or Door-special-case): the wire
mechanism (SetState flipping Ethereal) is also how ACE handles activated
traps, opened chests, spell projectiles becoming ethereal. Generic
infrastructure with doors as the verification scenario; lane is the
informal sixth "dynamic state."

Roadmap state:
  * L.2 plan-of-record adds the L.2g section after L.2f.
  * Milestones doc M1 phase list extended `a-f` -> `a-g`.
  * CLAUDE.md status pointer + "next phase candidates" list updated to
    name L.2g slice 1 implementation as the natural next step.

Risk: low. Wire-byte width has a hex-dump fallback path in slice 1
(holtburger says 12 bytes, ACE writes 16, capture settles it). ETHEREAL
plumbing already exists; we feed it new data. No resolver changes.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
Erik 2026-05-12 21:00:36 +02:00
parent 9206d1d4e0
commit 2c10dd4d67
4 changed files with 353 additions and 14 deletions

View file

@ -618,10 +618,16 @@ acdream's plan lives in two files committed to the repo:
approval.
**Currently in Phase L.2 (Movement & Collision Conformance).** L.2a slices
1+2+3 shipped 2026-05-12 (this evening); the natural next step is the
L.2d slice 1 brainstorm / design spec. Cold-start prompt for the next
session: [`docs/research/2026-05-12-l2d-next-session-prompt.md`](docs/research/2026-05-12-l2d-next-session-prompt.md).
Full handoff: [`docs/research/2026-05-12-l2a-shipped-l2d-handoff.md`](docs/research/2026-05-12-l2a-shipped-l2d-handoff.md).
1+2+3 + L.2d slice 1+1.5 shipped 2026-05-12. L.2d closed at the Holtburg
site ("watch-and-wait" — no more slices until a new shape-fidelity bug
shows up elsewhere); doorway blocker identified as a Door entity, not
building BSP. L.2g (dynamic PhysicsState toggling — doors) brainstormed
and design-spec'd 2026-05-12 evening; **the natural next step is the
L.2g slice 1 implementation** (parse `SetState` 0xF74B, plumb new
PhysicsState into ShadowObjectRegistry, verify Holtburg inn doorway).
Design spec: [`docs/superpowers/specs/2026-05-12-l2g-dynamic-physicsstate-design.md`](docs/superpowers/specs/2026-05-12-l2g-dynamic-physicsstate-design.md).
L.2d ship handoff: [`docs/research/2026-05-13-l2d-slice1-shipped-handoff.md`](docs/research/2026-05-13-l2d-slice1-shipped-handoff.md).
L.2a→L.2d handoff (now superseded by the L.2d ship): [`docs/research/2026-05-12-l2a-shipped-l2d-handoff.md`](docs/research/2026-05-12-l2a-shipped-l2d-handoff.md).
**Phase L.2a (Truth & Diagnostics) slices 1-3 shipped 2026-05-12.**
Three commits land the L.2 "make every bad movement outcome explainable"
@ -699,13 +705,18 @@ together comprise the streaming + rendering perf foundation for the
project.
**Next phase candidates (in rough preference order):**
- **L.2d slice 1 brainstorm + spec** (`docs/research/2026-05-12-l2d-next-session-prompt.md`).
Direct continuation of tonight's L.2a evidence: port `CBuildingObj` collision
+ per-cell walkability so doorway gaps are walkable. Unblocks "walk into a
building" + sets up G.3 dungeon streaming. **Note:** triage the 8 pre-existing
test failures first (none introduced by L.2a slices — verified by stash + rerun
— but most touch movement/physics code L.2d will evolve). See the handoff doc's
"Open concerns" section.
- **L.2g slice 1 implementation — dynamic PhysicsState toggling for doors.**
Direct continuation of tonight's L.2d slice 1.5 evidence: parse inbound
`SetState (0xF74B)` wire message, plumb the new `PhysicsState` value into
`ShadowObjectRegistry`'s cached entity state so the existing
`CollisionExemption.IsExempt(...)` check sees up-to-date bits, and verify
the Holtburg inn-door scenario walks through cleanly when the server flips
Ethereal. Unblocks the M1 demo's *"open the inn door"* line. Spec:
[`docs/superpowers/specs/2026-05-12-l2g-dynamic-physicsstate-design.md`](docs/superpowers/specs/2026-05-12-l2g-dynamic-physicsstate-design.md).
**Note:** triage the 8 pre-existing test failures still hanging over the
physics modules first (none introduced by L.2a/L.2d slices — verified by
stash + rerun — but most touch code adjacent to where L.2g will plumb the
new state mutator).
- **Triage the chronic open-issue list** in `docs/ISSUES.md`#2 (lightning),
#4 (sky horizon-glow), #28 (aurora), #29 (cloud thinness), #37 (humanoid
coat), #50 (stray tree), #41 (remote-motion blips) have been open since