diff --git a/AGENTS.md b/AGENTS.md index 7479fb18..fa25fe60 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -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 1–3 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 D–L of -`docs/plans/2026-07-24-modern-runtime-architecture.md` under the recorded -approval interlocks. Slices A–H completed by 2026-07-25. +**Modern Runtime/performance status:** Slices A–K 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, diff --git a/CLAUDE.md b/CLAUDE.md index e6697fbd..cca915be 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -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 1–3 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 D–L of -`docs/plans/2026-07-24-modern-runtime-architecture.md` under the recorded -approval interlocks. Slices A–H completed by 2026-07-25. +**Modern Runtime/performance status:** Slices A–K 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, diff --git a/README.md b/README.md index 6b35d6aa..d9b668c2 100644 --- a/README.md +++ b/README.md @@ -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 1–3, 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 +`\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 --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 `/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. diff --git a/docs/ISSUES.md b/docs/ISSUES.md index 6483848e..a9c38a4c 100644 --- a/docs/ISSUES.md +++ b/docs/ISSUES.md @@ -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 1–3, including the complete assessment surface, are user-accepted. + Equipped-child picking and vendor browse/transactions remain Slices 4–6. - **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 A–E 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 F–L, 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 F–I 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 A–K 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 L2–L6 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 diff --git a/docs/README.md b/docs/README.md index 0f70a026..328d201e 100644 --- a/docs/README.md +++ b/docs/README.md @@ -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 A–I and J0–J5 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 4–6. +- **Structural/runtime state:** all eight `GameWindow` decomposition slices, + Modern Runtime Slices A–J, 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 L2–L6 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 diff --git a/docs/architecture/code-structure.md b/docs/architecture/code-structure.md index 09c2cd70..f332629c 100644 --- a/docs/architecture/code-structure.md +++ b/docs/architecture/code-structure.md @@ -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. diff --git a/docs/architecture/retail-divergence-register.md b/docs/architecture/retail-divergence-register.md index 5a41e852..1fc3c0f5 100644 --- a/docs/architecture/retail-divergence-register.md +++ b/docs/architecture/retail-divergence-register.md @@ -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 | |---|---|---|---|---|---| diff --git a/docs/plans/2026-04-11-roadmap.md b/docs/plans/2026-04-11-roadmap.md index 2770d573..c7d143be 100644 --- a/docs/plans/2026-04-11-roadmap.md +++ b/docs/plans/2026-04-11-roadmap.md @@ -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 1–3 are complete; M4 resumes at Slice 4 equipped-child picking, +followed by vendor browsing and authoritative transactions. --- @@ -753,7 +755,7 @@ behavior. Estimated 17–26 days focused work, 3–5 weeks calendar. - **Missile/portal VFX cell-less rule clarified 2026-07-16.** The Steps 0–5 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 1–9 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 1–9 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. diff --git a/docs/plans/2026-05-12-milestones.md b/docs/plans/2026-05-12-milestones.md index 59ae59f1..5b4b6e0e 100644 --- a/docs/plans/2026-05-12-milestones.md +++ b/docs/plans/2026-05-12-milestones.md @@ -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 1–3 are user-accepted; resume at Slice 4 +equipped-child picking. The separately authorized modern-runtime performance program has completed Slices A–D: 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 1–3 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 (~6–10 weeks) +### M4 — "Live in the world" — 🟡 ACTIVE (~6–10 weeks) **Entry condition:** complete the behavior-preserving `GameWindow` decomposition campaign before adding H.3/H.4/L.1e feature bodies. This protects diff --git a/docs/plans/2026-07-23-world-interaction-completion.md b/docs/plans/2026-07-23-world-interaction-completion.md index 03b0658e..36d4e371 100644 --- a/docs/plans/2026-07-23-world-interaction-completion.md +++ b/docs/plans/2026-07-23-world-interaction-completion.md @@ -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 1–3 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. diff --git a/docs/plans/2026-07-24-modern-runtime-architecture.md b/docs/plans/2026-07-24-modern-runtime-architecture.md index 33e9a0e1..8485568a 100644 --- a/docs/plans/2026-07-24-modern-runtime-architecture.md +++ b/docs/plans/2026-07-24-modern-runtime-architecture.md @@ -2,33 +2,24 @@ **Date:** 2026-07-24 -**Status:** Slices A–I and J0–J5 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 F–L were -explicitly approved 2026-07-24. Slice J0–J1 established the enforced Runtime -boundary and borrowed contract seam; J2 moved canonical session/transport -lifetime and ordered inbound routing; J3.1–J3.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 A–K 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 L2–L6 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 L2–L6 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 diff --git a/memory/project_ui_architecture.md b/memory/project_ui_architecture.md index 85879794..5f31fbcb 100644 --- a/memory/project_ui_architecture.md +++ b/memory/project_ui_architecture.md @@ -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 1–3 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 5–6 then add +vendor browsing and server-authoritative transactions through the same Runtime +inventory/action owners.