docs: reconcile project state and refresh README
Some checks failed
Headless portability / portable-headless (ubuntu-latest) (push) Has been cancelled
Headless portability / portable-headless (windows-latest) (push) Has been cancelled
Headless portability / linux-graphical (push) Has been cancelled

This commit is contained in:
Erik 2026-07-27 12:53:31 +02:00
parent 97a095d628
commit f6275f4501
12 changed files with 432 additions and 295 deletions

View file

@ -116,24 +116,24 @@ user-gated. Deterministic world-lifecycle automation protects fresh login,
outdoor/world-edge/dungeon travel, same-location revisit, exact graceful
disconnect, and uncapped fresh-process reconnect with JSON/PNG artifacts.
Release builds; the current performance-program checkpoint passes
3,731 App tests / 3 skips and 8,708 complete-solution tests / 5 skips.
3,763 App tests / 3 skips and 8,826 complete-solution tests / 5 skips.
**M4 feature work order (paused while the authorized performance program
executes):** the six-slice pre-M4 world-interaction completion
**M4 feature work order (active after the Modern Runtime closeout and Slice L
deferral):** the six-slice pre-M4 world-interaction completion
program in `docs/plans/2026-07-23-world-interaction-completion.md`: favorite
spell-bar overflow, status Use/Assess, assessment information,
equipped-child picking, vendor browsing, and authoritative vendor
transactions. Slices 1 and 2 plus the adjacent shared-cooldown presentation are
user-accepted. Slice 3's first connected gate exposed and corrected the
monster-response flag mismatch, non-retail shared-panel mounting, and missing
inscription transaction. The creature and common-item report corrections are
user-accepted. Favorite-spell press-time selection and right-click local
examination are implemented; the current visual gate is its corrected modern
scarab/prismatic formula, DAT component icons, and authored 310 x 400 extent.
transactions. Slices 13 plus the adjacent shared-cooldown presentation are
user-accepted, including exact response flags, independent examination
window, inscription transaction, complete creature/item/spell reports,
favorite-spell press/right-click behavior, modern scarab/prismatic formula,
DAT component icons, foreground stacking, and authored 310 x 400 extent.
Resume at Slice 4 equipped-child world picking, then vendor browse and
authoritative transactions.
**Current active engineering work:** complete Slices DL of
`docs/plans/2026-07-24-modern-runtime-architecture.md` under the recorded
approval interlocks. Slices AH completed by 2026-07-25.
**Modern Runtime/performance status:** Slices AK of
`docs/plans/2026-07-24-modern-runtime-architecture.md` are complete. Slice L is
parked at its L1 implementation checkpoint by user direction on 2026-07-27.
Production world-mesh streaming now consumes the validated machine-local
`acdream.pak` through `IPreparedAssetSource`; live DAT extraction remains
explicit bake/equivalence/UI-Studio tooling. Capped, uncapped, dense-Arwic,

View file

@ -114,24 +114,24 @@ user-gated. Deterministic world-lifecycle automation protects fresh login,
outdoor/world-edge/dungeon travel, same-location revisit, exact graceful
disconnect, and uncapped fresh-process reconnect with JSON/PNG artifacts.
Release builds; the current performance-program checkpoint passes
3,731 App tests / 3 skips and 8,708 complete-solution tests / 5 skips.
3,763 App tests / 3 skips and 8,826 complete-solution tests / 5 skips.
**M4 feature work order (paused while the authorized performance program
executes):** the six-slice pre-M4 world-interaction completion
**M4 feature work order (active after the Modern Runtime closeout and Slice L
deferral):** the six-slice pre-M4 world-interaction completion
program in `docs/plans/2026-07-23-world-interaction-completion.md`: favorite
spell-bar overflow, status Use/Assess, assessment information,
equipped-child picking, vendor browsing, and authoritative vendor
transactions. Slices 1 and 2 plus the adjacent shared-cooldown presentation are
user-accepted. Slice 3's first connected gate exposed and corrected the
monster-response flag mismatch, non-retail shared-panel mounting, and missing
inscription transaction. The creature and common-item report corrections are
user-accepted. Favorite-spell press-time selection and right-click local
examination are implemented; the current visual gate is its corrected modern
scarab/prismatic formula, DAT component icons, and authored 310 x 400 extent.
transactions. Slices 13 plus the adjacent shared-cooldown presentation are
user-accepted, including exact response flags, independent examination
window, inscription transaction, complete creature/item/spell reports,
favorite-spell press/right-click behavior, modern scarab/prismatic formula,
DAT component icons, foreground stacking, and authored 310 x 400 extent.
Resume at Slice 4 equipped-child world picking, then vendor browse and
authoritative transactions.
**Current active engineering work:** complete Slices DL of
`docs/plans/2026-07-24-modern-runtime-architecture.md` under the recorded
approval interlocks. Slices AH completed by 2026-07-25.
**Modern Runtime/performance status:** Slices AK of
`docs/plans/2026-07-24-modern-runtime-architecture.md` are complete. Slice L is
parked at its L1 implementation checkpoint by user direction on 2026-07-27.
Production world-mesh streaming now consumes the validated machine-local
`acdream.pak` through `IPreparedAssetSource`; live DAT extraction remains
explicit bake/equivalence/UI-Studio tooling. Capped, uncapped, dense-Arwic,

385
README.md
View file

@ -2,195 +2,294 @@
A modern open-source C# / .NET 10 Asheron's Call client.
Faithful port of the retail client's behaviour to Silk.NET with a modern,
plugin-friendly architecture. The code is modern; the behaviour is retail.
acdream ports the observable behaviour of the September 2013 retail client to
Silk.NET and a modern, plugin-friendly architecture. The code is modern; the
behaviour is retail.
**Status:** playable pre-alpha; M3 ("Cast a spell") is active. The connected
client supports the complete M2 combat/loot/inventory loop plus retained
spellbook, component-book, favorite-spell, enchantment, portal-space, radar,
chat, character, and inventory UI. Current work is verification and retail
conformance, not a first-playable bring-up.
**Status:** playable pre-alpha. M3, “Cast a spell,” landed on 2026-07-21 and
M4, “Live in the world,” is active. The graphical client supports the connected
combat, magic, movement, portal, inventory, loot, and retained-UI loops used by
the current test characters. The presentation-independent `GameRuntime` and
the Linux/Windows multi-session headless host are complete. Native Linux
graphics are intentionally parked at the L1 capability checkpoint; Windows is
the currently validated graphical platform.
Start at the [documentation map](docs/README.md) for the current milestone,
roadmap, tactical issues, architecture, retail-divergence register, research,
and durable memory.
The [documentation map](docs/README.md) is the entry point for current
milestones, roadmap state, architecture, issues, retail divergences, research,
and durable project memory.
## Stack
## Technology
- **Language:** C# .NET 10
- **Graphics:** [Silk.NET](https://github.com/dotnet/Silk.NET) (OpenGL 4.3
context; `GL_ARB_bindless_texture` and `GL_ARB_shader_draw_parameters` are
mandatory)
- **Audio:** OpenAL via Silk.NET
- **Dat parsing:** [Chorizite.DatReaderWriter](https://github.com/Chorizite/DatReaderWriter)
- **Networking:** Custom UDP + ISAAC cipher + game-message layer, wire-compatible
with ACEmulator server
- **Runtime:** C# and .NET 10
- **Graphics:** [Silk.NET](https://github.com/dotnet/Silk.NET), OpenGL 4.3
core, bindless textures, shader draw parameters, SSBOs, and multi-draw
indirect
- **Audio:** OpenAL through Silk.NET
- **Content:** retail DAT files plus a machine-local, memory-mapped
`acdream.pak` produced by `AcDream.Bake`
- **Networking:** custom UDP, ISAAC cipher, and game-message layers compatible
with ACEmulator
- **UI:** retained retail gameplay UI plus opt-in ImGui developer tools
- **Automation:** the same presentation-independent `GameRuntime` is hosted by
both the graphical client and `AcDream.Headless`
## What works today
The modern renderer is mandatory. There is no legacy renderer fallback.
Startup reports an actionable error if the required OpenGL capabilities are
missing.
- ACE login, character selection, world entry, chat, client commands, and
graceful logout.
- Outdoor, building, cellar, and dungeon streaming with portal-space travel,
terrain/scenery/EnvCell rendering, collision, lighting, sky, fog, audio, and
day/night presentation.
- Local and observed player/NPC/monster movement, animation, selection, radar,
combat stances, melee and missile presentation, death, corpses, chests, and
looting.
- Inventory bags, stack splitting, paperdoll/equipment, weapon switching,
quick bars, item use, giving items to NPCs, and server-authoritative item
movement.
- Retained retail-style gameplay UI for vitals, chat, toolbar, inventory,
character/skills, spellbook/components, helpful/harmful effects, combat and
spell bars, radar/compass, indicator pages, and confirmation dialogs.
- Spell catalog, learned/favorite spells, component preflight, connected casts,
enchantments, DAT-driven missiles/effects, recall, Hidden/UnHide, and portal
materialization presentation.
- Plugin host, shared input/command abstractions, and permanent ImGui developer
tools behind `ACDREAM_DEVTOOLS=1`.
## What works
## Active gaps
- ACE login, character selection, world entry, chat, client commands,
reconnect, and graceful logout.
- Outdoor, building, cellar, and dungeon streaming with prepared terrain,
scenery, buildings, EnvCells, collision, portal visibility, sky, fog,
lighting, audio, and day/night presentation.
- Local and observed movement, animation, jumping, selection, radar, combat
stances, melee, bows, crossbows, spell projectiles, death, corpses, chests,
and looting.
- Inventory bags, stable server ordering, stack splitting, ground drops,
paperdoll equipment, weapon switching, quick bars, item use, cooldowns, and
giving items to NPCs.
- Retail-style retained UI for vitals, chat, toolbar, inventory, character,
attributes, skills, spellbook, components, effects, combat/spell/jump bars,
radar/compass, dialogs, external containers, and assessment.
- Complete end-of-retail spell catalog, learned and favorite spells,
component preflight, connected casts, enchantments, DAT-driven projectiles
and effects, recall, portal-space travel, Hidden/UnHide, and remote
materialization.
- One presentation-independent runtime owner for session, entities, objects,
inventory, character state, selection, interactions, combat, magic,
movement, physics, projectiles, world environment, and portal transit.
- A no-window Windows/Linux host with deterministic bot commands/events,
shared immutable content, multi-session scheduling, isolation, reconnect,
resource telemetry, and tested 1/5/10/30-session ownership.
- Plugin loading, shared command/input abstractions, retained markup panels,
and permanent ImGui developer tools behind `ACDREAM_DEVTOOLS=1`.
- R6's complete object-frame update path still needs the next local visual
comparison; the final M3 gate is a two-client portal-out/materialization
observer comparison.
- Issue `#225` still needs the lifestone/particle alpha-order visual check,
although its connected lifetime/performance gates pass.
- Narrow behavior debt remains in issue `#153` (an unstreamed far-teleport
edge case), issue `#116` (slide feel), and registered TS-50/TS-51 effect
timing.
- Many later retail systems remain roadmap work: advanced social/vendor/trade/
crafting UI, full weather/lightning parity, deeper combat/stat systems,
graphical Linux, and a true headless multi-session bot host.
## Current boundaries
See [docs/README.md](docs/README.md) for document authority and current links.
- The active M4 prelude is
[world interaction completion](docs/plans/2026-07-23-world-interaction-completion.md).
Slices 13, including assessment and its final formula/icon/layout
correction, are user-accepted. Equipped-child picking and vendor
browse/buy/sell are the next uncompleted slices.
- Issue `#225` retains the lifestone/particle shared-alpha visual comparison.
Its connected lifetime and performance routes already pass.
- Narrow carried behaviour debt includes issue `#153` (an unstreamed
far-teleport edge), issue `#116` (slide feel), issue `#235` (30 Hz capped/RDP
jump presentation), and the live temporary-stopgap rows in the
[retail divergence register](docs/architecture/retail-divergence-register.md).
- Native Linux graphics are deferred. L0 portability and L1 backend/capability
reporting are implemented; WSLg reaches the GPU through Mesa D3D12 but does
not expose mandatory `GL_ARB_bindless_texture`. Resume with a supported
physical Linux AMD/NVIDIA driver before beginning later Slice L work.
- Advanced vendor/trade/crafting/social surfaces and larger M4 quest,
character-creation, and emote bodies remain roadmap work.
## Building + running
## Prerequisites
**Requires:**
- .NET 10 SDK
- A retail Asheron's Call dat directory (Turbine/Microsoft property —
supply your own). Contains `client_portal.dat`, `client_cell_1.dat`,
`client_highres.dat`, `client_local_English.dat`.
- A running ACE (ACEmulator) server on `127.0.0.1:9000` (or override
via env var)
- Your own retail Asheron's Call DAT directory containing:
- `client_portal.dat`
- `client_cell_1.dat`
- `client_highres.dat`
- `client_local_English.dat`
- A machine-local `acdream.pak` built from those DATs
- A running ACE server for connected play; the examples use
`127.0.0.1:9000`
- For the graphical client, a driver exposing the mandatory modern OpenGL
capabilities
**Launch (PowerShell on Windows — bash has trouble with the apostrophe
in "Asheron's Call"):**
The project does not distribute Microsoft/Turbine DAT files or derived
prepared packages.
## Build and test
```powershell
$env:ACDREAM_DAT_DIR = "$env:USERPROFILE\Documents\Asheron's Call"
dotnet restore AcDream.slnx
dotnet build AcDream.slnx -c Release
dotnet test AcDream.slnx -c Release --no-build
```
The current baseline is a successful Release build with **8,826 passing tests
and 5 intentional skips**. The build currently reports 17 test-project
warnings tracked by [`#228`](docs/ISSUES.md#228--clean-release-build-emits-17-test-project-warnings);
production compilation has zero errors.
## Prepare content
Production rendering and collision use the validated prepared package rather
than decoding world meshes on the frame path:
```powershell
dotnet run --project src\AcDream.Bake\AcDream.Bake.csproj -c Release -- `
--dat-dir "C:\Games\Asheron's Call" `
--out "C:\Games\Asheron's Call\acdream.pak"
```
A complete package is approximately 30 GB. It is machine-local and must not be
committed. `ACDREAM_PAK_PATH` overrides the default
`<DAT directory>\acdream.pak`.
## Run the graphical client
```powershell
$env:ACDREAM_DAT_DIR = "C:\Games\Asheron's Call"
$env:ACDREAM_PAK_PATH = "C:\Games\Asheron's Call\acdream.pak"
$env:ACDREAM_LIVE = "1"
$env:ACDREAM_TEST_HOST = "127.0.0.1"
$env:ACDREAM_TEST_PORT = "9000"
$env:ACDREAM_TEST_USER = "testaccount"
$env:ACDREAM_TEST_PASS = "testpassword"
$env:ACDREAM_RETAIL_UI = "1"
$env:ACDREAM_RETAIL_UI = "1"
dotnet run --project src\AcDream.App\AcDream.App.csproj -c Release
```
Offline CLI dat inspector (no server needed):
The DAT directory can instead be supplied as the first positional argument:
```
dotnet run --project src/AcDream.Cli -- "C:\path\to\Asheron's Call"
```powershell
dotnet run --project src\AcDream.App\AcDream.App.csproj -c Release -- `
"C:\Games\Asheron's Call"
```
## Diagnostic env vars
## Run a headless session
`AcDream.Headless` loads no App, UI, OpenGL, native-window, or audio assembly.
Create a version-1 configuration such as `bot.json`:
```json
{
"version": 1,
"process": {
"content": {
"datDirectory": "/opt/ac",
"preparedAssetPath": "/opt/ac/acdream.pak"
}
},
"sessions": [
{
"id": "bot-1",
"endpoint": { "host": "127.0.0.1", "port": 9000 },
"account": "testaccount",
"character": { "index": 0 },
"policy": { "id": "idle" },
"credential": {
"provider": "environment",
"reference": "ACDREAM_BOT_PASSWORD"
}
}
]
}
```
Then validate and run it:
```bash
export ACDREAM_BOT_PASSWORD='testpassword'
dotnet run --project src/AcDream.Headless/AcDream.Headless.csproj -c Release -- \
validate --config bot.json
dotnet run --project src/AcDream.Headless/AcDream.Headless.csproj -c Release -- \
run --config bot.json
```
For a single local session, `run` also accepts
`--user <account> --password <password>`. Add uniquely identified session
entries and credential references for a multi-session process. Available
built-in policies are `idle`, `lifecycle-smoke`, `observer-movement`, and
`portal-route-smoke`.
## Useful startup options
| Variable | Effect |
|---|---|
| `ACDREAM_DUMP_SKY=1` | Per-second dump of the interpolated `SkyKeyframe` values + per-SkyObject draw info + texture alpha histograms |
| `ACDREAM_DUMP_MOTION=1` | Dump every inbound `UpdateMotion` + resulting `SetCycle` |
| `ACDREAM_STREAM_RADIUS=N` | Legacy override for the configured two-tier streaming radii |
| `ACDREAM_NO_AUDIO=1` | Suppress OpenAL init |
| `ACDREAM_RETAIL_UI=1` | Enable retained retail gameplay UI |
| `ACDREAM_DAT_DIR` | Retail DAT directory |
| `ACDREAM_PAK_PATH` | Prepared package path; defaults to `<DAT dir>/acdream.pak` |
| `ACDREAM_LIVE=1` | Enable connected mode |
| `ACDREAM_TEST_HOST` / `ACDREAM_TEST_PORT` | ACE endpoint |
| `ACDREAM_TEST_USER` / `ACDREAM_TEST_PASS` | Graphical-client credentials |
| `ACDREAM_RETAIL_UI=1` | Enable the retained retail gameplay UI |
| `ACDREAM_DEVTOOLS=1` | Enable ImGui developer tools |
| `ACDREAM_UNCAPPED_RENDER=1` | Disable normal presentation pacing for throughput measurement |
| `ACDREAM_DAY_GROUP=N` | Force a specific DayGroup index for A/B-testing weather presets |
| `ACDREAM_RUN_SKILL=N` / `ACDREAM_JUMP_SKILL=N` | Client-side run/jump skill (default 200) |
| `ACDREAM_NO_AUDIO=1` | Suppress OpenAL initialization |
| `ACDREAM_UNCAPPED_RENDER=1` | Disable normal frame pacing for diagnostics |
| `ACDREAM_DISPLAY_PROTOCOL=auto\|x11\|wayland` | Select the Linux GLFW backend |
| `ACDREAM_DAY_GROUP=N` | Force a day-group index for weather/lighting comparisons |
| `ACDREAM_STREAM_RADIUS=N` | Legacy override over configured streaming radii |
| `ACDREAM_DUMP_SKY=1` | Dump sky interpolation and draw diagnostics |
| `ACDREAM_DUMP_MOTION=1` | Dump inbound movement and motion-cycle decisions |
## Layout
Additional diagnostic and budget controls are documented beside their typed
owners and in the linked research plans; they are not stable user settings.
```
## Repository layout
```text
src/
AcDream.App/ window, retained UI, rendering, audio, runtime wiring
AcDream.Content/ GL-free DAT mesh/texture extraction
AcDream.Core/ game state, physics, movement, world, gameplay logic
AcDream.Core.Net/ UDP + ISAAC + game-message layer
AcDream.UI.Abstractions/ shared UI/input ViewModels, commands, contracts
AcDream.UI.ImGui/ permanent developer-tool renderer
AcDream.Cli/ offline dat-inspector console app
AcDream.Bake/ offline content bake tooling
AcDream.Plugin.Abstractions/ plugin host interfaces
AcDream.Plugins.Smoke/ example plugin
AcDream.Runtime/ presentation-independent GameRuntime
AcDream.App/ graphical host, retained UI, renderer, audio
AcDream.Headless/ Windows/Linux no-window multi-session host
AcDream.Core/ retail gameplay, movement, physics, world logic
AcDream.Core.Net/ UDP, ISAAC, protocol and message routing
AcDream.Content/ GL-free DAT and prepared-package content
AcDream.Bake/ offline acdream.pak builder
AcDream.Cli/ offline DAT inspector
AcDream.UI.Abstractions/ shared UI/input models and contracts
AcDream.UI.ImGui/ developer-tool presentation
AcDream.Plugin.Abstractions/ BCL-only plugin contracts
AcDream.Plugins.Smoke/ example plugin
tests/
AcDream.*.Tests/ layer-matched xUnit projects (6,452 passing,
5 intentional skips at the 2026-07-20 baseline)
tools/
RetailTimeProbe/ Win32 P/Invoke ReadProcessMemory probe of
the live retail acclient.exe — dumps
TimeOfDay + sky-lighting globals so we
can compare against acdream's state
SkyObjectInspect/ dat-inspector for Region sky objects
references/ vendored read-only reference code — ACE,
ACViewer, WorldBuilder, holtburger,
AC2D, Chorizite, DatReaderWriter.
Gitignored.
AcDream.*.Tests/ layer-matched xUnit projects
docs/
README.md documentation map + authority order
architecture/ architecture, structure, divergence, WB inventory
plans/ phase roadmaps + per-phase specs
research/ decompile-derived research, per-phase
findings, deep-dive agent reports
audit/ phase-completion audits
README.md documentation authority and current map
architecture/ ownership, structure, divergence, WB inventory
plans/ milestone, roadmap, and execution plans
research/ retail pseudocode, traces, fixtures, evidence
audit/ completion and conformance audits
memory/ durable engineering references
references/ gitignored external reference repositories
```
## Development workflow
All AC-specific behaviour is ported from the named retail client oracle
(`docs/research/named-retail/`). The workflow is:
All AC-specific behaviour starts from the named retail oracle in
`docs/research/named-retail/`:
1. **Grep named retail first.** Find the matching `class::method` in the
Sept 2013 named pseudo-C and headers.
2. **Decompile only as fallback.** Use the older Ghidra chunks when the named
oracle lacks the function.
3. **Cross-reference.** Check against ACE's C# port and ACViewer /
WorldBuilder.
4. **Write pseudocode.** Translate C to readable pseudocode first.
5. **Port faithfully.** Translate line-by-line, preserving variable
names and control flow.
6. **Conformance test.** Add tests using golden values from retail.
7. **Integrate surgically.** Minimise churn in the surrounding pipeline.
1. Search the named retail pseudo-C and headers by `class::method`.
2. Use the older Ghidra chunks only when the named oracle is insufficient.
3. Cross-reference ACE and the relevant client/viewer implementation.
4. Record readable pseudocode and exact constants/order.
5. Port the retail mechanism into the correct modern owner.
6. Add conformance, lifecycle, and failure-boundary tests.
7. Run the automated gate and the appropriate connected or visual gate.
8. Update architecture, roadmap, divergences, and durable memory with the
same change.
Guessing at AC-specific algorithms is explicitly forbidden — see
`CLAUDE.md` for the full workflow rationale and the list of failure
modes we've paid for in the past.
Guessing at AC-specific algorithms is forbidden. See
[AGENTS.md](AGENTS.md), [CLAUDE.md](CLAUDE.md), and the
[architecture guide](docs/architecture/acdream-architecture.md) for the full
rules.
## Reference repos
## Reference projects
We cross-reference six external projects for retail behavior:
- **ACE / ACEmulator:** authoritative server and protocol behaviour
- **ACViewer:** character appearance and DAT presentation cross-check
- **WorldBuilder:** extracted Silk.NET DAT/rendering foundation
- **Chorizite.ACProtocol:** clean-room protocol reference
- **holtburger:** broad non-retail client behaviour reference
- **AC2D:** terrain and movement-packet cross-checks
- **ACE** (ACEmulator) — authoritative server-side protocol
- **ACViewer** — MonoGame dat viewer; good for character appearance
- **WorldBuilder** — Silk.NET dat editor; matches our stack
- **Chorizite.ACProtocol** — clean-room C# protocol library
- **holtburger** — most complete non-retail client; Rust TUI, full
client-side behaviour
- **AC2D** — C++ AC-client emulator; has the real terrain split
formula and 0xF61C movement packet format
The retail binary/decomp remains the behavioural oracle when references
disagree.
See `CLAUDE.md` for which reference is authoritative for which domain.
## Licence and game assets
## Licence
The acdream source has not yet been assigned a top-level licence and is not
ready for public redistribution. External reference code retains its own
licence.
Not yet chosen. All external reference code is vendored under its own
licence; see `references/*/LICENSE`. The acdream source code itself is
unreleased — not yet distributed to the public. Once the licence
choice is made it will go in a top-level `LICENSE` file.
The AC dat files and the game's intellectual property remain the
property of Microsoft / Turbine. This project does not distribute any
of those files or assets — you must supply your own retail install.
Asheron's Call DAT files, art, names, and other game assets remain the property
of Microsoft/Turbine. This repository does not distribute them; users must
supply their own retail installation.

View file

@ -24,7 +24,7 @@ What does NOT go here:
- Every session: scan OPEN issues at start; promote/close anything we touched during the session before ending.
- Promoting to a Phase: mark as `DONE (promoted to Phase X)` + commit SHA where the Phase entry landed.
## Current queue — 2026-07-24
## Current queue — 2026-07-27
- **Structural handoff:** all eight `GameWindow` decomposition slices and the
automated closeout are complete. The 1,622-line native shell has typed
@ -33,6 +33,10 @@ What does NOT go here:
nine-stop soaks, and the Slice-7 framebuffer comparison pass. The user's
connected visual matrix passed 2026-07-23, so the campaign is complete in
[`docs/architecture/code-structure.md`](architecture/code-structure.md).
- **Active M4 prelude:** resume
[`plans/2026-07-23-world-interaction-completion.md`](plans/2026-07-23-world-interaction-completion.md).
Slices 13, including the complete assessment surface, are user-accepted.
Equipped-child picking and vendor browse/transactions remain Slices 46.
- **Separate rendering gate:** `#225`, lifestone/particle alpha ordering. Its
connected performance, lifetime, and unattended portal routes pass.
- **Carried behavior debt:** `#153` far-teleport unstreamed-edge arrival and
@ -44,35 +48,20 @@ What does NOT go here:
smooth and physics, collision, and wire state remain correct.
- **Build hygiene:** `#228` records 17 clean-Release test-project warnings;
production compilation and all tests pass.
- **Performance side track:** Slices AE are complete. Typed
completion admission, immediate generation-scoped old-world quiescence, and
budgeted full-window/recenter retirement are live. Publication now advances
from retained render/physics/static/building/EnvCell cursors without replay.
The canonical reveal generation now owns the destination reservation across
every typed budget dimension; incomplete worlds remain in portal space with
retail's centered wait cue. E6 deterministic/resource suites and all three
physical-local connected routes pass with zero stranded work/resource
backlog. Slices FL, including the former F/G and J gates, were explicitly
approved 2026-07-24. Slice F now executes from the pre-runtime rollback
anchor `e7d9d6fa`; its ownership, shadow-scene, cutover, and acceptance
contract is
[`plans/2026-07-24-modern-runtime-slices-f-g-render-scene.md`](plans/2026-07-24-modern-runtime-slices-f-g-render-scene.md).
Evidence:
[`research/2026-07-24-slice-e-cost-budgeted-streaming-report.md`](research/2026-07-24-slice-e-cost-budgeted-streaming-report.md).
- **Modern Runtime execution:** Slices FI are complete. Slice I removed
production parsed collision graphs after exact flat differential and user
collision acceptance; 8,413 Release tests / 5 skips and both exact-binary
connected routes pass with `0/0/0` graph residency. J0's enforced
presentation-independent project boundary and J1's borrowed
view/command/event/lifecycle contract are live. J2's canonical
session/transport lifetime and ordered inbound route are complete at
`75930787`; J3 canonical entity/object lifetime and J4 gameplay-state
ownership are complete through `89e6b207`. J5.1 canonical selection,
combat, and target-mode ownership is complete at `b298f99f`; J5.2
interaction-transaction ownership is complete at `f5f7b417`, with 8,561
Release tests / 5 skips and the exact connected gate green. J5.3
combat/magic-intent ownership is active from
[`plans/2026-07-25-modern-runtime-slice-j.md`](plans/2026-07-25-modern-runtime-slice-j.md).
- **Modern Runtime/performance program:** Slices AK are complete. Prepared
world/collision packages, typed residency, bounded publication/retirement,
retained render-scene deltas, flat-authoritative collision, and bounded
frame/network owners are production paths. Slice J closed at `a9a822f2`
with one presentation-independent `GameRuntime` shared by graphical and
no-window hosts. Slice K closed through `776482da` with the Windows/Linux
multi-session host, shared immutable content, deterministic bot API,
1/5/10/30-session and two-hour simulated gates, connected portal/movement
parity, resource ceilings, and graceful zero-debt teardown.
- **Deferred Linux graphical track:** L0 completed at `66f114b2`; L1's backend
selection/capability implementation checkpoint landed at `11501d52`.
Native Windows passes and WSLg correctly rejects its missing mandatory
bindless capability. Physical-Linux validation and L2L6 are parked by user
direction; resume at the supported AMD/NVIDIA L1 gate.
The [documentation map](README.md) defines how this tactical ledger relates to
the milestone, roadmap, architecture, divergence register, research, and

View file

@ -4,48 +4,48 @@ This page is the entry point for project documentation. It distinguishes
current sources of truth from implementation history so an old plan or issue
banner cannot silently override the current program state.
## Current snapshot — 2026-07-26
## Current snapshot — 2026-07-27
- **Milestone state:** M3, “Cast a spell,” landed 2026-07-21. M4, “Live in the
world,” is active.
- **M4 gameplay program (paused while the authorized performance program
executes):** the pre-M4 world-interaction completion program
in
[`plans/2026-07-23-world-interaction-completion.md`](plans/2026-07-23-world-interaction-completion.md).
The eight-slice `GameWindow` decomposition and its connected visual matrix
are complete.
- **Current active engineering program:** Slices AI and J0J5 of
[`plans/2026-07-24-modern-runtime-architecture.md`](plans/2026-07-24-modern-runtime-architecture.md)
are complete. Production uses prepared world/collision packages, typed
residence, retained render-scene/delta submission, bounded frame owners, and
flat-authoritative collision without parsed-graph production residency.
Runtime owns canonical session/transport, entity/object lifetime, J4
gameplay state, selection/interaction transactions, and combat/magic intent.
App materialized projections and retained widgets borrow exact Runtime
identity and action owners. Runtime also owns the sole per-session physics,
collision, body/host, remote/projectile simulation, and cell-commit graph.
J5 closed at `cdee7a4b` with one combined simulation ledger, a
Runtime-only movement/use/combat/cast/projectile host, 8,596 complete
Release tests / 5 skips, and exact-binary lifecycle plus nine-stop gates.
J6 world/portal/environment and projection-handshake ownership is active in
[`plans/2026-07-25-modern-runtime-slice-j.md`](plans/2026-07-25-modern-runtime-slice-j.md).
- **Completed gates:** R6 locomotion/collision/projectile/teleport/radar and
the final two-client portal-out/materialization observer comparison (`#218`).
- **Separate visual verification:** the shared-alpha lifestone/particle result
in `#225`; its connected resource-lifetime and performance routes pass.
- **Carried behavior debt:** `#153` (far teleport onto an unstreamed edge),
`#116` (two narrowed slide-response cases), and divergence rows TS-50/TS-51.
- **Active engineering track:** Slice J's presentation-independent runtime,
composition root, shared generation reset, and no-window closeout are
complete. Build the approved Linux/headless multi-session host in Slice K.
K0 is complete and K1 is active. K0's exact rollback is
`git revert aada8a37c1e933f9f0a3f41dc4f05615b01023bc`.
- **Divergence audit:** 178 active rows — IA 17, AD 37, AP 85, TS 34,
and UN 5 — plus the retained retired TS-37 history note.
- **Latest automated baseline:** Release build succeeds; 8,708 tests pass and
five are intentionally skipped. The exact J8 lifecycle/reconnect and
canonical nine-stop gates match embedded binary/source commit, converge
every backlog, and complete with graceful zero-code exits and zero failures.
- **M4 gameplay program:** resume the pre-M4
[world-interaction completion program](plans/2026-07-23-world-interaction-completion.md).
Favorite-spell overflow, status Use/Assess, and the complete assessment
surface are user-accepted. Equipped-child picking and vendor
browse/transactions remain Slices 46.
- **Structural/runtime state:** all eight `GameWindow` decomposition slices,
Modern Runtime Slices AJ, and the connected visual/lifecycle gates are
complete. `GameWindow` is a 1,622-line composition/callback shell.
`AcDream.Runtime.GameRuntime` owns canonical session, entity/object,
gameplay, movement, physics, projectile, environment, and portal state;
graphical and no-window hosts borrow the same owner graph.
- **Headless state:** Slice K is complete. `AcDream.Headless` is a
presentation-free Windows/Linux host with deterministic commands/events,
shared immutable content, multi-session isolation, reconnect, resource
telemetry, and 1/5/10/30-session gates. The final two-account native-Linux
soak completed ten minutes, logged out through ACE, and converged every
ownership ledger.
- **Linux graphical state:** Slice L0 and the L1 implementation checkpoint are
complete at `66f114b2` and `11501d52`. Native Windows passes the active
modern-GL/audio/window smoke. WSLg X11/Wayland correctly reject their
missing `GL_ARB_bindless_texture`. Physical-Linux validation and L2L6 are
explicitly deferred; resume at the supported AMD/NVIDIA L1 gate.
- **Completed gameplay gates:** R6 locomotion/collision/projectile/teleport/
radar, two-client portal-out/materialization, indoor prepared collision,
loot ordering, local/remote ground drops, and selection-marker lifetime.
- **Separate visual verification:** issue `#225`, the shared-alpha
lifestone/particle result; its connected resource-lifetime and performance
routes pass.
- **Carried behaviour debt:** issue `#153` (far teleport onto an unstreamed
edge), `#116` (narrowed slide response), `#235` (capped/RDP jump cadence),
and the active temporary-stopgap rows in the divergence register.
- **Divergence audit:** 189 active rows — IA 18, AD 38, AP 91, TS 38, and
UN 4 — plus retained struck/retired historical rows such as TS-37.
- **Latest automated baseline:** the Release build succeeds with the 17
test-project warnings tracked by issue `#228`; 8,826 tests pass and five are
intentionally skipped. App passes 3,763 / 3 skips. The L1 Windows supported
smoke and WSLg X11/Wayland negative-capability reports all end with zero
window/GL/input/audio ownership.
## Sources of truth

View file

@ -480,7 +480,7 @@ useful ordering seam, but its ownership status is **partial**.
| Landblock presentation | **Complete** | `LandblockBuildFactory` owns the captured-origin DAT transaction; concrete render/physics/DAT-static publishers and `LandblockPresentationPipeline` own typed-meter publication and exact retryable retirement. `StreamingController` owns stable destination/control/unload/Near/Far queues and destination reservation. CPU mesh-cache restaging requires an exact live owner. `StreamingOriginRecenterCoordinator` serializes old-window retirement with teleport/session origin lifetimes. `GameWindow` retains construction and one pipeline field only (`c79d0a49`, closeout `4a205a3e`; Slice E closeout `91e82c3c`). |
| Render-frame orchestration | **Complete** | `RenderFrameOrchestrator` owns the GPU-flight, resource, world/PView/shared-alpha, private-presentation, diagnostics, screenshot, and recovery graph. `GameWindow.OnRender` takes one logical window-size snapshot and performs one immutable handoff (`9d7df1bf`). |
| Unified `GameEntity` | **Slice J complete** | Canonical identity, retained-object lifetime, direct views, ordered entity/object deltas, gameplay state, action/combat/magic/movement/physics/remote/projectile simulation, world environment, reveal/transit truth, and host acknowledgement share failure-safe Runtime owners while exact graphical sidecars stay in App. One `GameRuntime` composes the graph. `RuntimeGenerationReset` is the sole retryable canonical-generation reset for graphical and no-window hosts; the deterministic direct host proves lifecycle, commands, portal, reconnect, GUID reuse, fault recovery, isolation, and terminal convergence without presentation assemblies (`a9a822f2`). |
| Headless host | **Slice K0 complete; K1 active** | `AcDream.Headless` references only Runtime. Its strict CLI validator, dependency closure, loaded-assembly guard, and Windows/Ubuntu CI establish a production process that cannot acquire App, UI, GL, native-window, or audio ownership (`aada8a37`). |
| Headless host | **Slice K complete** | `AcDream.Headless` references only Runtime and loads no App/UI/GL/window/audio assembly. Portable paths/config/credentials, deterministic command/event scheduling, shared immutable content, exact per-session identity, failure quarantine, reconnect, resource telemetry, 1/5/10/30-session isolation, two-hour simulated endurance, and the exact two-account native-Linux connected soak pass through `776482da`. |
### 4.3 Revised extraction sequence
@ -781,7 +781,7 @@ fresh-process nine-stop soaks and the connected lifecycle/reconnect route pass
with graceful exits; deterministic framebuffer captures preserve accepted
Slice 7 geometry, UI/paperdoll layering, private viewports, depth/alpha, and
reveal. The clean solution build retains only the 17 test-project warnings
tracked by #228, and all three final corrected-diff reviews are clean. Only the
tracked by #228, and all three final corrected-diff reviews are clean. The
user's connected visual matrix passed 2026-07-23, including first-login radar,
movement/combat, shared retained panels, recall/portal presentation, and
graceful reconnect.

View file

@ -1,4 +1,4 @@
# Retail Divergence Register — 2026-06-12
# Retail Divergence Register — current through 2026-07-27
**What this is.** The single auditable register of every known place acdream's
runtime behavior can deviate from the retail client (Sept 2013 EoR build,
@ -37,7 +37,7 @@ accepted-divergence entries (#96, #49, #50).
---
## 1. Intentional architecture (IA) — 17 rows
## 1. Intentional architecture (IA) — 18 active rows
| # | Divergence | Where (file:line) | Why it is safe / justified | Risk if assumption breaks | Retail oracle |
|---|---|---|---|---|---|

View file

@ -66,7 +66,8 @@ disabled (IA-21), installs each icon through the shared retained
`UIRegion::SetImage` seam so it keeps the authored foreground stack, and
one-time migrates stale saved examination dimensions to the authored
310 x 400 extent while preserving retail-style later resizing.
Its connected visual gate is pending. Slice 3's first connected gate exposed
The corrected formula/icons/foreground stack, authored extent, and complete
item report were user-accepted on 2026-07-24. Slice 3's first connected gate exposed
three deeper defects, now corrected: the response enum mislabeled ACE's
creature bit `0x0100` and dropped monster packets while retaining the busy
cursor; the imported 310 x 400 examination layout was incorrectly hosted as
@ -78,7 +79,8 @@ transaction under retail ownership/authorship rules; those corrections are
user-confirmed. The item view now follows the complete EoR formatter dispatch,
including literal set/rating/tinkering prose, weapon/armor/magic/XP/
activation/healer/rare branches, and installed-DAT material and creature
names. Its connected item-report comparison is Slice 3's remaining gate.
names. Slices 13 are complete; M4 resumes at Slice 4 equipped-child picking,
followed by vendor browsing and authoritative transactions.
---
@ -753,7 +755,7 @@ behavior. Estimated 1726 days focused work, 35 weeks calendar.
- **Missile/portal VFX cell-less rule clarified 2026-07-16.** The Steps 05 statement that later plays drop while an existing owner is cell-less applies only to ordinary F754/F755/default playback. Hidden/UnHide is retail's internal exception: `CPhysicsObj::set_hidden` resolves the typed script and calls `play_script_internal`, queuing it until scheduler eligibility returns. This preserves the human table's purple portal materialization across asynchronous destination placement.
- **✓ M2 local attack receive funnel (live-gated 2026-07-15).** Retail `ExecuteAttack` only sends the request; ACE chooses the concrete melee/missile action and returns it in a non-autonomous mt-0 `UpdateMotion`. The local branch now runs that state through the same constructor-defaulted `MoveToInterpretedState` funnel and 15-bit action-stamp gate as remotes, then applies sticky/long-jump tails. The old local-only direct `Commands[]` replay is deleted. Shared conversion lives in `InboundInterpretedMotionFactory`; research: `docs/research/2026-07-11-local-combat-motion-pseudocode.md`.
- **✓ M2 basic retail combat bar (live-gated 2026-07-15).** Production mounts authored `gmCombatUI` LayoutDesc `0x21000073`, shows it only for Melee/Missile, and routes mouse plus keyboard through one `CombatAttackController`. Corrections include the authored wider centered dark-red child range (accepted IA-20), full-width left-to-right bright live attack-charge feedback, exact Speed-left/Power-right justification, silent control-only `AttackDone(ActionCancelled)`, target-frame Keep in View with manual orbit, and persistent corpse motion: the AP-80 velocity-only NPC adaptation can now replace only Ready/Walk/Run, never authoritative Dead/actions. `CombatTargetController` ports the selection-cleared AutoTarget consumer, so a selected creature's authoritative Dead motion clears it and selects the nearest eligible creature when enabled. The 2026-07-12 replacement-corpse correction unifies both multi-frame and static/reactive spawns behind retail's CreateObject lifecycle: apply the wire's Dead state while detached, then `MotionTableManager::HandleEnterWorld` strips Ready→Dead links before the first in-world tick; multiple corpses remaining fallen passed the live user gate that day. Follow-up #205 makes the toolbar read the final canonical selection after a reentrant Auto Target notice and restricts automatic candidates to hostile non-player monsters (intentional PK-edge divergence IA-19); that live gate also passed 2026-07-12. Research: `docs/research/2026-07-11-retail-combat-bar-pseudocode.md`, `docs/research/2026-07-11-combat-target-camera-pseudocode.md`, `docs/research/2026-07-12-death-and-auto-target-pseudocode.md`; AP-24/AP-95 retired, AP-80 narrowed, AP-110 narrowed, AP-112 records the remaining attack-start and exact trained-Recklessness seams.
- **M3 cast lifecycle + retained magic UI implemented 2026-07-15; visual gates pending.** `SpellCastingController` ports retail's immediate targeted/untargeted request boundary, component preflight, target eligibility, movement stop, and shared UI-busy lifetime while leaving turn/cast/fizzle/impact outcomes authoritative to ACE. Formula preflight reads decrypted portal.dat formulas, the SCID↔WCID map, canonical account randomization, exact school-focus map, infused-magic properties, and scarab-only substitution. `MagicCatalog` now projects all 6,266 end-of-retail SpellTable records into the shared Core metadata table; the incomplete 3,956-row CSV is test/research-only and AP-17 is retired. Complete live enchantment packets preserve spell/layer identity, all StatMod fields, client-clock normalization, and exact purge buckets. Authored retained surfaces now include the Magic page of `gmCombatUI`, all eight favorite tabs, equipped caster endowment, `gmSpellbookUI`, `gmSpellComponentUI`, both `gmEffectsUI` windows, and the floating Helpful/Harmful effect indicators. The favorite bar now ports retail horizontal empty-cell padding, shared UIItem 19 shortcut overlays, and the Cast button's three independently reflowed DAT face segments. Spell rows resolve UIItem prototype `0x10000343`; the component page now instantiates LayoutDesc `0x21000033` category/component templates `0x10000466/67`, including localized headings, exact row textures and columns, owned/desired counts, selection, and the 0..5000 desired-value contract. The authored scrollbars, exact filters/display ordering, learned-spell drag, and shared server-authoritative delete dialog are connected. `RetailPanelUiController` ports the shared one-active-panel lifecycle so toolbar and indicator launchers converge on one owner. #L.2/#L.3 close and #L.4/AP-110 narrow. Research: `docs/research/2026-07-15-retail-magic-ui-and-casting-pseudocode.md`, `docs/research/2026-07-15-retail-spell-catalog-pseudocode.md`.
- **M3 cast lifecycle + retained magic UI shipped and user-accepted 2026-07-21.** `SpellCastingController` ports retail's immediate targeted/untargeted request boundary, component preflight, target eligibility, movement stop, and shared UI-busy lifetime while leaving turn/cast/fizzle/impact outcomes authoritative to ACE. Formula preflight reads decrypted portal.dat formulas, the SCID↔WCID map, canonical account randomization, exact school-focus map, infused-magic properties, and scarab-only substitution. `MagicCatalog` now projects all 6,266 end-of-retail SpellTable records into the shared Core metadata table; the incomplete 3,956-row CSV is test/research-only and AP-17 is retired. Complete live enchantment packets preserve spell/layer identity, all StatMod fields, client-clock normalization, and exact purge buckets. Authored retained surfaces now include the Magic page of `gmCombatUI`, all eight favorite tabs, equipped caster endowment, `gmSpellbookUI`, `gmSpellComponentUI`, both `gmEffectsUI` windows, and the floating Helpful/Harmful effect indicators. The favorite bar now ports retail horizontal empty-cell padding, shared UIItem 19 shortcut overlays, and the Cast button's three independently reflowed DAT face segments. Spell rows resolve UIItem prototype `0x10000343`; the component page now instantiates LayoutDesc `0x21000033` category/component templates `0x10000466/67`, including localized headings, exact row textures and columns, owned/desired counts, selection, and the 0..5000 desired-value contract. The authored scrollbars, exact filters/display ordering, learned-spell drag, and shared server-authoritative delete dialog are connected. `RetailPanelUiController` ports the shared one-active-panel lifecycle so toolbar and indicator launchers converge on one owner. #L.2/#L.3 close and #L.4/AP-110 narrow. Research: `docs/research/2026-07-15-retail-magic-ui-and-casting-pseudocode.md`, `docs/research/2026-07-15-retail-spell-catalog-pseudocode.md`.
- **M3 favorite-bar empty-state correction 2026-07-15; visual gate pending.** Shortcut-number arrays remain shared with the status toolbar, but the cell background is now resolved independently from the favorite ItemList's inherited `0x1000000E` cell prototype. LayoutDesc `0x21000010` selects prototype `0x10000341`, whose exact brown/gold `ItemSlot_Empty` surface is `0x06001A97`; the blue toolbar-style `0x060074CF` substitution is removed. The cross-layout resolver and controller presentation are pinned by live-DAT and retained-layout conformance tests.
- **Retail client command families implemented 2026-07-13; corrective live gate pending.** One shared typed catalog now separates retail client actions from ACE administrator commands for both chat backends. Named-decomp ports cover recall/house/PK travel; age/birth; framerate, lock, version, location, corpse, and die confirmation; clear plus named/automatic UI layouts; AFK/consent; emotes; friends; squelch/filter/message types; and fill-components. App owns execution, Core owns authoritative friends/squelch state, Core.Net owns exact UIQueue/ControlQueue packets. Confirmation reuse now ports retail `DialogFactory` contexts, queue groups/priority, fresh DAT roots, property results, callbacks/close notices, and server abort handling; `/die`, gameplay request tuples, and guarded item-use prompts share its type-1 LayoutDesc `0x2100003C` presenter. The first live gate passed the family except for raw suicide-success code `0x004A` and the title-bar-only FPS presentation; the correction maps retail's text and mounts SmartBox element `0x10000047` with live two-decimal `FPS`/`DEG`. #L.6 is closed; TS-31/TS-47 are narrowed. Research: `docs/research/2026-07-13-retail-client-command-families-pseudocode.md`, `docs/research/2026-07-13-retail-dialog-factory-pseudocode.md`.
- **✓ SHIPPED — Character window** (`LayoutDesc 0x2100002E`, `CharacterStatController`, 2026-06-26, same branch). **Visually user-confirmed 2026-06-26 — Attributes tab reads as retail.** Three tabs, header (name/heritage/PK), large-gold level number (dat font, `largeDatFont` 18px), "Total Experience (XP):" + "XP for next level:" captions, 9-row attribute list (icons + right-aligned values + Health/Stamina/Mana vitals), click-to-select (top/bottom selection bars + footer State-B "{Attr}: {value}" / "Experience To Raise: Infinity!" + affordability-gated raise triangles), centered footer. User noted "still needs some polish for later" — deferred to Issue #158.

View file

@ -87,7 +87,8 @@ program: spell-bar overflow, status Use/Assess, assessment information,
equipped-child picking, vendor browsing, and authoritative vendor
transactions. This is deliberately using the extracted interaction owners and
canonical shared main-panel host before quest/emote/character-creation bodies
broaden the feature surface.
broaden the feature surface. Slices 13 are user-accepted; resume at Slice 4
equipped-child picking.
The separately authorized modern-runtime performance program has completed
Slices AD: corrected measurement, prepared-package bake/dedup, package-only
@ -405,7 +406,8 @@ disables component enforcement (IA-21), installs each icon as its authored
template root's own foreground image, and resets obsolete saved dimensions
once to the authored 310 x 400 extent. The Release build with #228's 17
tracked test warnings, 3,557 App tests / 3 skips, and 7,988 complete-solution
tests / 5 skips pass; the connected visual gate is pending.
tests / 5 skips pass. The corrected formula/icons/foreground stack and
authored extent were user-accepted on 2026-07-24.
Slice 3's first connected gate found and corrected the real remaining defects:
ACE creature flag `0x0100` was mislabeled as a weapon profile and left the
appraisal busy reference held, retail's examination UI had been mounted as a
@ -415,8 +417,9 @@ display-only. Exact response flags, the independent
edit transaction are now ported and user-confirmed. Its item path now follows
the complete EoR formatter dispatch, including literal set/rating/tinkering
prose, weapon/armor/magic/XP/activation/healer/rare branches, and installed-DAT
material/creature names. The connected item-report comparison is Slice 3's
remaining gate.
material/creature names. The connected item-report comparison was Slice 3's
final accepted gate. Slices 13 are complete; resume at Slice 4
equipped-child picking.
Carried:
#153 far-teleport residual, #116 slide-response, the remaining R6 ownership cleanup plus
@ -1215,7 +1218,7 @@ from M3 = retail-equivalent gameplay loop for melee and casters.
---
### M4 — "Live in the world" — 🟡 NEXT (~610 weeks)
### M4 — "Live in the world" — 🟡 ACTIVE (~610 weeks)
**Entry condition:** complete the behavior-preserving `GameWindow`
decomposition campaign before adding H.3/H.4/L.1e feature bodies. This protects

View file

@ -7,14 +7,15 @@ connected gate exposed an incorrect IdentifyResponse flag table, a non-retail
shared-panel mount, and its missing inscription transaction. All three are
corrected and live-confirmed. The creature-page follow-up now has retail's
ordered stat rows and animated private preview. The follow-up item report and
authored 310 x 400 layout correction are implemented; their connected visual
gate is pending. Favorite-spell press-time selection and right-click local
SpellPanel examination are implemented. The follow-up now maps
authored 310 x 400 layout correction are implemented and user-accepted.
Favorite-spell press-time selection and right-click local SpellPanel
examination are implemented and user-accepted. The follow-up maps
component-disabled ACE characters to the modern scarab/prismatic formula,
resolves formula icons by their DAT icon DIDs, installs those icons as each
authored template root's own foreground image, and migrates stale examination
dimensions once to the authored 310 x 400 extent. Their connected visual gate
is pending.
dimensions once to the authored 310 x 400 extent. The final connected
assessment gate passed on 2026-07-24. Slices 13 are complete; resume at Slice
4, equipped-child world picking.
**Milestone:** M4 prerequisite/preamble.
**Architecture:** retained gameplay UI over shared selection, object, and
interaction state. `GameWindow` remains a composition/callback shell.
@ -192,7 +193,7 @@ Focused conformance fixtures cover the geometry layering plus melee, launcher,
armor, spell, and special-property reports. The Release solution build passes
with the 17 warnings already tracked by #228, 3,514 App tests / 3 skips, and
7,931 complete-solution tests / 5 skips. The connected visual result remains
the closeout gate.
the historical pre-acceptance checkpoint; the final gate passed 2026-07-24.
The item-format conformance correction adds literal hook-tail cursor fixtures,
wire/session/object-table propagation tests, the exact Black Phyntos Hive
@ -201,7 +202,7 @@ LayoutDesc color-palette/enchantment-style coverage. The isolated Release
solution build passes with the same 17 tracked warnings; 3,522 App tests / 3
skips and 7,942 complete-solution tests / 5 skips pass while the previously
launched client retains the normal Release output lock. The corrected
connected item visual remains the closeout gate.
connected item visual was accepted 2026-07-24.
The exhaustive item-report correction replaces the remaining generic/numeric
approximations with the complete named-retail dispatch. Equipment sets use the
@ -218,7 +219,7 @@ need live player/localization state (effective shield, cooldown remaining, and
augmentation-cost `StringInfo`), plus character and creature-font residuals.
The focused item formatter suite passes 21/21, App Release passes 3,531 tests /
3 skips, and the complete Release solution passes 7,952 tests / 5 skips. The
connected item-report comparison is the remaining Slice 3 gate.
connected item-report comparison passed on 2026-07-24.
The material-title and section-boundary correction carries
`PublicWeenieDesc.MaterialType` from CreateObject through the canonical object
@ -268,7 +269,8 @@ each component descriptor's icon DID rather than its inventory WCID, applies
the modern scarab/prismatic formula when ACE disables component enforcement
(IA-21), and introduces per-window authored-geometry revisions so an obsolete
saved examination height resets once without discarding position or future
user resizing. The connected visual gate is pending. The 61-test focused App
user resizing. The corrected formula/icons/foreground stack and authored
extent were accepted on 2026-07-24. The 61-test focused App
gate passed before this correction. The corrected focused tests, Release build
with #228's 17 tracked test warnings, 3,555 App tests / 3 skips, and 7,986
complete-solution tests / 5 skips pass.

View file

@ -2,33 +2,24 @@
**Date:** 2026-07-24
**Status:** Slices AI and J0J5 are complete. Flat-authoritative collision, zero-
allocation resolve scratch, parsed-graph removal, connected correctness/
lifetime acceptance, and Slice-I closeout landed 2026-07-25. Slices FL were
explicitly approved 2026-07-24. Slice J0J1 established the enforced Runtime
boundary and borrowed contract seam; J2 moved canonical session/transport
lifetime and ordered inbound routing; J3.1J3.6 moved canonical entity identity
and object-table lifetime to Runtime, exact graphical projection identity to
App, and one ordered canonical entity/object stream plus direct views to all
hosts and closed the failure-safe owner ledger. J4.1 moved communication and
social ownership into Runtime at `c9d25ade`; J4.2 moved inventory transaction
ownership into Runtime at `011efbea`; J4.3 moved the coupled magic/player-sheet
owner into Runtime at `d02a12ce`; J4.4 moved character settings/projections
and the shared typed state-command seam at `dcb61efb`; J4.5 closed canonical
gameplay-state ownership at `89e6b207`. J5 movement, physics, interaction,
and combat ownership closed at `cdee7a4b` after canonical action state
(`b298f99f`), interaction transactions (`f5f7b417`), and combat/magic intent
(`20df9d15`), local movement/outbound cadence (`aa3f4a60`), and per-session
physics/remote simulation (`7e6033d0`), projectile simulation (`2aee3356`),
and the combined simulation ledger/Runtime-only closeout moved to Runtime.
J6 completed at `18d17d8b`: Runtime owns world environment, canonical reveal
generation/readiness, exact F751/Position destination correlation, and the
generation/cell-scoped graphical-host acknowledgement suffix. J7 completed
at `ce41efb9` with its automated gates and the user's 2026-07-27
physical-display acceptance. J8 and Slice J closed at `a9a822f2`: graphical
and direct hosts share one `GameRuntime`, one retryable generation-reset
transaction, and one canonical gameplay-owner graph. Slice K is active; K0
established the tested Windows/Linux headless boundary at `aada8a37`.
**Status:** Slices AK are complete. Slice L is deferred at its L1
implementation checkpoint by user direction on 2026-07-27.
Flat-authoritative collision, zero-allocation resolve scratch, parsed-graph
removal, prepared content, typed residency, retained render-scene submission,
and bounded frame owners are production paths. Slice J closed at `a9a822f2`:
graphical and direct hosts share one presentation-independent `GameRuntime`,
one retryable generation-reset transaction, and one canonical session/entity/
object/gameplay/movement/physics/projectile/environment/transit owner graph.
Slice K closed through `776482da`: the Windows/Linux no-window host, shared
immutable content, deterministic bot API/scheduler, 1/5/10/30-session
isolation, two-hour simulated endurance, connected portal/movement parity,
resource ceilings, graceful reconnect/logout, and zero-debt teardown pass.
Slice L0 landed at `66f114b2`; L1's immutable Win32/X11/Wayland selection,
packaged GLFW 3.4 preference, atomic capability record, active modern-GL
probes, and safe terminal reporting landed at `11501d52`. Native Windows AMD
passes. WSLg correctly rejects its missing mandatory bindless-texture
capability. Physical-Linux validation and L2L6 are parked; resume at the
supported AMD/NVIDIA L1 gate.
**Scope:** Reconcile and sequence the existing Modern Pipeline (`MP`) and
Linux/headless (`LH`) tracks using the 2026-07-24 connected performance audit.
@ -1065,6 +1056,9 @@ host-parity tests after each move.
### Slice K — Linux headless and multi-session host
**Status:** complete through `776482da`; closeout is
[`2026-07-26-modern-runtime-slice-k.md`](2026-07-26-modern-runtime-slice-k.md).
**Prepared execution plan:**
[`2026-07-26-modern-runtime-slice-k.md`](2026-07-26-modern-runtime-slice-k.md).
Implementation began after Slice J's no-window closeout at `a9a822f2`.
@ -1100,9 +1094,14 @@ per-session incremental memory given a numeric ceiling at gate time.
### Slice L — Linux graphical host and evidence-gated GPU work
**Status:** deferred 2026-07-27. L0 is complete at `66f114b2`; the L1
implementation checkpoint is `11501d52`. Physical supported-driver validation
and L2L6 remain pending.
**Prepared execution plan:**
[`2026-07-26-modern-runtime-slice-l.md`](2026-07-26-modern-runtime-slice-l.md).
Implementation begins after Slice K closes.
Implementation began after Slice K closed and is parked at the recorded L1
gate.
**Purpose:** Finish platform portability and only then pursue remaining GPU
opportunities.
@ -1309,10 +1308,20 @@ at every stable checkpoint. J7 completed at `ce41efb9`, and the user accepted
its exact post-cutover visual matrix on 2026-07-27. J8 closed Slice J at
`a9a822f2`; 395 Runtime tests, 3,731 App tests / 3 skips, 8,696 complete-
solution tests / 5 skips, lifecycle/reconnect, and canonical nine-stop gates
pass. Slice K is the current execution point.
K0 completed at `aada8a37`: the no-App Windows/Ubuntu closure, strict
no-connect validator, dependency/assembly guards, Release build, 8,708-test /
5-skip complete suite, and local Ubuntu gates pass. K1 is active.
pass. Slice K closed through `776482da`. K0 established the no-App
Windows/Ubuntu dependency and loaded-assembly boundary; K1 added portable
paths/config/credentials and the direct Runtime host; K2 added the
deterministic scheduler and complete bot command/event API; K3 added shared
immutable content plus multi-session isolation and connected observer parity;
K4 added committed resource ceilings, 1/5/10/30-root and two-hour simulated
endurance gates, and the ten-minute two-account native-Linux connected soak.
That final process logged both accounts out through ACE and converged every
Runtime/content ledger. Slice L0 then completed at `66f114b2`, and L1's
implementation checkpoint landed at `11501d52`. App passes 3,763 / 3 skips
and the complete Release suite passes 8,826 / 5 skips. Native Windows passes
the packaged graphical/audio smoke; WSLg X11/Wayland correctly emit the
actionable mandatory-bindless rejection with zero terminal ownership. Further
Linux graphical work is deferred at the physical supported-driver L1 gate.
Evidence:
[`../research/2026-07-25-slice-g5-production-profile.md`](../research/2026-07-25-slice-g5-production-profile.md)
and
@ -1338,7 +1347,15 @@ and
and
[`../research/2026-07-26-slice-j5-7-simulation-ownership-closeout.md`](../research/2026-07-26-slice-j5-7-simulation-ownership-closeout.md)
and
[`2026-07-25-modern-runtime-slice-j.md`](2026-07-25-modern-runtime-slice-j.md).
[`2026-07-25-modern-runtime-slice-j.md`](2026-07-25-modern-runtime-slice-j.md)
and
[`../research/2026-07-27-slice-k4-resource-telemetry-checkpoint.md`](../research/2026-07-27-slice-k4-resource-telemetry-checkpoint.md)
and
[`2026-07-26-modern-runtime-slice-k.md`](2026-07-26-modern-runtime-slice-k.md)
and
[`../research/2026-07-27-slice-l0-platform-services.md`](../research/2026-07-27-slice-l0-platform-services.md)
and
[`../research/2026-07-27-slice-l1-graphical-capability-checkpoint.md`](../research/2026-07-27-slice-l1-graphical-capability-checkpoint.md).
The intended order is therefore:
@ -1352,9 +1369,9 @@ honest metrics + committed baselines (A — exit criteria block C)
-> delta GPU submission (G)
-> residual frame cleanup (H-a, H-b, H-c)
-> flat collision assets (I — COMPLETE)
-> presentation-independent runtime (J — CURRENT at J5)
-> Linux/headless/multi-session (K)
-> evidence-gated GPU jobs (L)
-> presentation-independent runtime (J — COMPLETE)
-> Linux/headless/multi-session (K — COMPLETE)
-> Linux graphical / GPU evidence (L — DEFERRED at L1)
```
This order improves the current graphical client first while laying clean

View file

@ -246,3 +246,28 @@ ordinary `ObjectUpdated` events complete inventory work.
`GameWindow` now constructs and forwards narrow lifecycle edges to these
owners; no selection algorithm or interaction request body belongs there.
## 2026-07-27 M4 world-interaction checkpoint
The six-slice world-interaction plan lives at
`docs/plans/2026-07-23-world-interaction-completion.md`. Slices 13 are
user-accepted:
- the favorite-spell bar owns its authored overflow controls and stable manual
offset;
- status Use/Assess shares canonical interaction and appraisal owners;
- `gmFloatyExaminationUI` is an independent top-level window, not a shared
primary-panel page;
- object assessment owns exact response flags, balanced busy lifetime,
selection-follow, inscription, complete EoR item/creature/spell reports, and
the animated private creature preview;
- retained items and favorite spells select on button-down; right-click uses
the correct object-appraisal or local spell-report path;
- component-disabled ACE profiles show the accepted scarab/prismatic formula,
DAT icon DIDs, authored foreground stack, and 310 x 400 window extent.
Resume at Slice 4. It must add equipped-child world picking through the
existing completed render-selection frame and exact child presentation key;
do not invent a second selection state or marker anchor. Slices 56 then add
vendor browsing and server-authoritative transactions through the same Runtime
inventory/action owners.