docs: M1.5 "Indoor world feels right" LANDED 2026-07-10 — advance to M2

User-gated the full dungeon round-trip (enter via portal -> navigate rooms ->
exit to the outdoor world), completing the #138 acceptance. Both M1.5 demo
halves are now confirmed: building/cellar (prior sessions) + full dungeon
round-trip (2026-07-10). Milestone-crossing artifacts per the milestones-doc
discipline:

- Pinned M1.5 landing writeup + flipped header to  LANDED; caveats explicit
  (#145-residual far-town teleport-OUT + #116 slide-response carried as
  post-M1.5 follow-ups, NOT blockers).
- Freeze list applied: all M1.5 phases (indoor render Option A, A6/A6.P4
  physics, A7 lighting, full Phase G.3 dungeon support) now frozen per rule 2.
- M2 "Kill a drudge" flipped to ACTIVE; first ports = CombatMath.ComputeDamage
  (F.3) + inventory panel (F.2) + combat anim (L.1c).
- CLAUDE.md "currently working toward" advanced to M2.
- #138 closed (user gate).

No demo video (per the user's standing preference).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
Erik 2026-07-10 09:58:48 +02:00
parent 113569b482
commit 9a772d2b2a
3 changed files with 56 additions and 32 deletions

View file

@ -108,20 +108,17 @@ movement queries.
## Current state ## Current state
**Currently working toward: M1.5 — Indoor world feels right** (building/cellar demo **Currently working toward: M2 — Kill a drudge** (equip sword → hit a drudge → damage
DONE + gated; dungeons now navigable end-to-end — **#133/#137/#95/#79/#93/#80 all in chat → loot → inventory). **M1.5 — Indoor world feels right LANDED 2026-07-10**:
CLOSED** (A7 lighting fixed, user-reverified). REMAINING = one recorded dungeon buildings/cellars/multi-floor inns + full dungeon round-trip (enter→navigate→exit) all
round-trip user gate (**#138 ESSENTIALLY RESOLVED** in code — see user-gated; #138 closed by the round-trip gate; #133/#137/#95/#79/#93/#80 CLOSED. M2
`docs/ISSUES.md`); sole live residual = far-town teleport-OUT arrival cascade first ports = `CombatMath.ComputeDamage` (F.3) + inventory panel (F.2) + combat anim
(**#145-residual, REOPENED** — capture-harness-first). One **user-report-driven (L.1c) — see the M2 section in the milestones doc + `docs/research/2026-06-04-combat-math-deep-dive.md`.
parity track** still interleaves at the issue level (NOT a milestone; see the M1.5 **Carried post-M1.5, NOT blockers:** #145-residual (far-town teleport-OUT cascade —
note in the milestones doc): **D.2b retail UI** (next: container-switching — capture-harness-first), #116 slide-response. **D.2b retail UI** parity track still
`claude-memory/project_d2b_retail_ui.md`). The **R5 movement-manager arc is DONE** interleaves at the issue level (next: container-switching — `claude-memory/project_d2b_retail_ui.md`);
(2026-07-05, V5 facade shipped; close-out banner in **R5 movement-manager arc DONE** (2026-07-05; carried #167, R6/TS-42); **Track MP** perf
`docs/research/2026-07-03-r5-managers/r5-wiring-handoff.md`; carried: #167, R6/TS-42). side track at MP0. Keep this paragraph ≤6 lines + pointers — detail in the docs below, NOT here.
**Track MP** (modern-pipeline perf side track, dedicated sessions only — roadmap
"Track MP") is at MP0. M2 (CombatMath) deferred. Keep this paragraph ≤6 lines + pointers — detail in the docs
below, NOT here.
For canonical state, read in this order: For canonical state, read in this order:
- [`docs/plans/2026-05-12-milestones.md`](docs/plans/2026-05-12-milestones.md) — milestone targets + freeze list per milestone - [`docs/plans/2026-05-12-milestones.md`](docs/plans/2026-05-12-milestones.md) — milestone targets + freeze list per milestone

View file

@ -2061,7 +2061,9 @@ See divergence register **AP-59**.
## #138 — Teleport OUT of a dungeon loads the outdoor world incompletely + position desync ## #138 — Teleport OUT of a dungeon loads the outdoor world incompletely + position desync
**Status:** ✅ ESSENTIALLY RESOLVED — position-desync FIXED via #145; server-object re-hydrate **Status:** ✅ DONE / CLOSED 2026-07-10 — full dungeon round-trip (enter → navigate → exit)
user-gated; this closed #138 and landed M1.5. (Move to Recently closed on next tidy.) Prior
resolution below: position-desync FIXED via #145; server-object re-hydrate
SHIPPED (`LandblockEntityRehydrator`, AP-48); avatar-vanish (symptom B) ACTUAL root found + SHIPPED (`LandblockEntityRehydrator`, AP-48); avatar-vanish (symptom B) ACTUAL root found +
FIXED + user-confirmed (`afd5f2a`, 2026-06-24 — skip the per-frame `RelocateEntity` while FIXED + user-confirmed (`afd5f2a`, 2026-06-24 — skip the per-frame `RelocateEntity` while
`PortalSpace`). Remaining collision residuals split out to **#152** (Holtburg/building portal-in `PortalSpace`). Remaining collision residuals split out to **#152** (Holtburg/building portal-in
@ -2119,7 +2121,7 @@ Both are the **entity-lifecycle/render path across a teleport**, NOT the streami
**Acceptance:** portal out of the 0x0007 dungeon → full outdoor world streams (trees/scenery present), **server objects (doors/NPCs/portals) render**, **own avatar renders across repeated round-trips**, collision works, position tracks (no avatar-vs-camera desync). **Acceptance:** portal out of the 0x0007 dungeon → full outdoor world streams (trees/scenery present), **server objects (doors/NPCs/portals) render**, **own avatar renders across repeated round-trips**, collision works, position tracks (no avatar-vs-camera desync).
**2026-07-10 gate progress:** the ENTER + NAVIGATE half re-confirmed working by the user (retail-UI session — dungeon streams, renders, collides, navigable, doors work). The EXIT half of the round-trip gate — portal OUT to the outdoor world, and specifically a FAR-town exit (where the `#145-residual` far-town arrival cascade could surface) — was NOT exercised this session. #138 stays OPEN pending that exit gate; M1.5 does not land until it passes. **2026-07-10 gate — PASSED, #138 CLOSED:** the user confirmed the full dungeon round-trip end-to-end — ENTER + NAVIGATE (dungeon streams, renders, collides, navigable, doors work) AND the EXIT (portal OUT to the outdoor world, world streams, collision holds, position tracks). This completes the #138 acceptance and lands M1.5. **Separate follow-up still open:** `#145-residual` (the far-town teleport-OUT arrival cascade) is a narrow far-teleport streaming edge case tracked on its own; it is NOT a #138 or M1.5 blocker and stays open for capture-harness-first work if it recurs.
--- ---

View file

@ -2,19 +2,16 @@
**Status:** Living document. Created 2026-05-12. **Status:** Living document. Created 2026-05-12.
**Sits above:** [`docs/plans/2026-04-11-roadmap.md`](2026-04-11-roadmap.md) (the strategic phase index). **Sits above:** [`docs/plans/2026-04-11-roadmap.md`](2026-04-11-roadmap.md) (the strategic phase index).
**Currently working toward:** **M1.5 — Indoor world feels right.** The **Currently working toward:** **M2 — "Kill a drudge."** **M1.5 — Indoor
building/cellar demo is DONE + user-gated. M1.5 was EXTENDED 2026-06-13 to world feels right LANDED 2026-07-10** (pinned writeup in the M1.5 section
include **dungeon support (full Phase G.3)** — dungeons initially didn't below): the building/cellar demo (prior sessions) AND the full dungeon
work at all (issue #133), but that premise was refuted at design time round-trip (enter via portal → navigate → exit to the outdoor world) are
(commit `90786c19`: the dungeon LandBlock is flat-terrain and streams via both user-gated. Dungeon support (full Phase G.3) shipped — render / stream
the existing pipeline), and G.3 has since **SHIPPED**: dungeons render, / teleport-in / collide / light / doors, each individually gated
stream, teleport-in, collide, light, and their doors work — each piece (#133/#137/#95/#79/#93/#80 CLOSED; #138 closed by the round-trip gate).
individually user-gated (#133/#137/#95/#79/#93/#80 all CLOSED). M1.5's Carried forward as post-M1.5 follow-ups (NOT M1.5 blockers): the far-town
dungeon-demo scenario is functionally met; M1.5 stays 🔵 ACTIVE / teleport-OUT arrival cascade (**#145-residual, REOPENED** —
not-yet-landed, awaiting ONE recorded end-to-end dungeon round-trip user capture-harness-first) and #116 slide-response feel-debt.
gate. The sole remaining live-code residual is the far-town teleport-OUT
arrival cascade (**#145-residual, REOPENED** — capture-harness-first). M2
stays deferred.
--- ---
@ -197,7 +194,26 @@ close range and the player sees "You pick up the X." in chat.
--- ---
### M1.5 — "Indoor world feels right" — 🔵 ACTIVE (building/cellar demo DONE; EXTENDED 2026-06-13 to include dungeon support / Phase G.3) ### M1.5 — "Indoor world feels right" — ✅ LANDED 2026-07-10 (building/cellar demo + full dungeon round-trip both user-gated; EXTENDED 2026-06-13 to include dungeon support / Phase G.3)
**✅ M1.5 LANDED 2026-07-10.** The indoor world reads as solid end-to-end.
A player can walk into a building and climb a multi-floor inn without
sling-out or wall-clip; descend a cottage cellar and ascend without falling
through; and — the piece that extended this milestone — **enter a dungeon
via portal, navigate its rooms, and portal back out to the outdoor world**,
with walls blocking, lighting reading correctly, and no position desync.
Both demo halves are user-gated: the building/cellar demo across the 2026-06
sessions, and the full dungeon round-trip (enter + navigate re-confirmed,
then the exit round-trip confirmed) on 2026-07-10. Dungeon support (full
Phase G.3) shipped with every sub-piece individually gated: teleport-in
(#133), collision (#137), portal-graph visibility (#95), doors (#187/#188),
lighting (#79/#93/#80). The indoor-physics workarounds (#90 stickiness +
`TryFindIndoorWalkablePlane` synthesis) were removed by A6.P4 — no duct-tape
left. **Explicit caveats carried forward (NOT M1.5 blockers — tracked as
their own follow-ups):** the far-town teleport-OUT arrival cascade
(#145-residual, REOPENED — a narrow far-teleport streaming edge case,
capture-harness-first) and #116 slide-response feel-debt. Next: **M2 —
"Kill a drudge."**
**EXTENDED 2026-06-13 — dungeons pulled into M1.5 scope; G.3 SHIPPED.** The **EXTENDED 2026-06-13 — dungeons pulled into M1.5 scope; G.3 SHIPPED.** The
building/cellar demo (below) is DONE + user-gated. Attempting the dungeon building/cellar demo (below) is DONE + user-gated. Attempting the dungeon
@ -381,10 +397,19 @@ patch.
- **`TryFindIndoorWalkablePlane`** — synthesis workaround removal (Bug A's original goal, finally unblocked; A6.P4) - **`TryFindIndoorWalkablePlane`** — synthesis workaround removal (Bug A's original goal, finally unblocked; A6.P4)
**Frozen phases during M1.5:** all M0 + M1 phases stay frozen. Plus **Frozen phases during M1.5:** all M0 + M1 phases stay frozen. Plus
specifically the recently-shipped A4 + #89 + #91 + #92 (today's work) — those specifically the recently-shipped A4 + #89 + #91 + #92 — those
land in main as the M1.5 baseline and shouldn't be revisited except as part land in main as the M1.5 baseline and shouldn't be revisited except as part
of A6.P4 removal of the workarounds. of A6.P4 removal of the workarounds.
**Frozen as of M1.5 landing (2026-07-10):** all M1.5 phases are now frozen
per rule 2 — the indoor render port (Option A `DrawInside(viewer_cell)`),
the A6 physics/membership family + A6.P4 per-cell shadow architecture, A7
indoor/dungeon lighting, and **full Phase G.3 dungeon support** (streaming
collapse/expand, teleport in/out, dungeon collision/lighting/doors). No
rework until M7 polish. Exempt from the freeze as still-open bugs (rule 2's
"actively broken" clause): #145-residual (far-town teleport-OUT cascade) and
#116 (slide-response) — these are tracked follow-ups, not frozen work.
**Estimated timeline:** 35 weeks calendar (1726 days focused work). Bigger **Estimated timeline:** 35 weeks calendar (1726 days focused work). Bigger
than a normal milestone because lighting is open-ended (less existing than a normal milestone because lighting is open-ended (less existing
diagnostic infrastructure than physics). Could be shorter if the cdb diagnostic infrastructure than physics). Could be shorter if the cdb
@ -401,7 +426,7 @@ unblocks that).
--- ---
### M2 — "Kill a drudge" — ⏸ DEFERRED until M1.5 lands (incl. dungeons) ### M2 — "Kill a drudge" — 🔵 ACTIVE (M1.5 landed 2026-07-10)
**Demo scenario:** Equip a sword. Walk to a drudge. Swing. See "You hit **Demo scenario:** Equip a sword. Walk to a drudge. Swing. See "You hit
Drudge for 12 slashing damage (87%)" in chat. Watch the swing animation Drudge for 12 slashing damage (87%)" in chat. Watch the swing animation