docs(linux): close Slice L0

This commit is contained in:
Erik 2026-07-27 11:59:58 +02:00
parent 66f114b258
commit 07bb1c5a74
9 changed files with 264 additions and 14 deletions

View file

@ -241,6 +241,9 @@ src/
World/
RuntimeWorldEnvironmentState.cs -> canonical calendar/time/weather owner
RuntimeWorldTransitState.cs -> canonical reveal generation/readiness owner
Platform/
ApplicationPathSet.cs -> shared BCL-only XDG/Windows config, data,
cache, plugin, screenshot, and diagnostic paths
RuntimeGenerationReset.cs -> one retryable canonical-generation reset
-> Slice J complete; graphical and no-window hosts share one GameRuntime
-> may reference Core, Core.Net, Content, and Plugin.Abstractions only
@ -266,6 +269,11 @@ src/
ISelectionService.cs -> done
AcDream.App/ Layer 1 + Layer 4 wiring
Platform/
GraphicalHostPlatformServices.cs -> one startup OS/architecture/RID,
native-manifest, path, pacing owner
GraphicalLegacyConfigurationMigrator.cs -> no-overwrite Windows
LocalAppData migration
Physics/
ProjectileController.cs -> live-record projectile orchestration/corrections
RemotePhysicsUpdater.cs -> ordinary/Hidden remote narrow-tick integration
@ -283,6 +291,8 @@ src/
RetailLiveFrameCoordinator.cs -> object/physics-before-network frame barrier
Rendering/
GameWindow.cs -> native composition/callback shell
FramePacingWaiterFactory.cs -> startup-selected Windows/Linux waiter
LinuxMonotonicFramePacingWaiter.cs -> absolute CLOCK_MONOTONIC sleep
LiveEntityAnimationScheduler.cs -> canonical ordinary live-object workset
RetailStaticAnimatingObjectScheduler.cs -> retail static-animation workset
StaticLiveRootCommitter.cs -> static root pose/collision commit boundary

View file

@ -3,6 +3,12 @@
**Status:** Living document. Updated 2026-07-27. **M3 landed; M4 is active.** M3's retail casting/UI, R6 locomotion/collision/projectile/teleport/radar rebaseline, deterministic fresh-login/portal world lifecycle, and final two-client portal observer flow are user-gated. All eight slices of the behavior-preserving ownership campaign in [`docs/architecture/code-structure.md`](../architecture/code-structure.md), their automated closeout, and the user's connected visual matrix are complete. Modern Runtime J3 canonical entity/object lifetime and J4 gameplay-state ownership are closed at `89e6b207`; J5.1 canonical selection/combat/target-mode ownership is closed at `b298f99f`, J5.2 interaction transactions at `f5f7b417`, J5.3 combat/magic intent at `20df9d15`, J5.4 local movement/outbound cadence at `aa3f4a60`, J5.5 per-session physics/remote simulation at `7e6033d0`, J5.6 projectile simulation at `2aee3356`, and J5.7 combined simulation closeout at `cdee7a4b`. J6.1 world-environment ownership is closed at `902076c0`; J6.2 canonical reveal generation and typed destination readiness is closed at `a6860d55` plus `acb845d8`; J6.3 exact F751/Position destination correlation is closed at `6a063a27`; J6.4 exact graphical-host acknowledgement and owner cleanup is closed at `18d17d8b`. J7's one graphical `GameRuntime` root is closed at `ce41efb9`, including the user's 2026-07-27 exact post-cutover visual acceptance. J8 closed Slice J at `a9a822f2` with one shared graphical/no-window root and generation-reset transaction. Slice K Linux headless/multi-session work is closed. K0's tested no-presentation Windows/Linux boundary closed at `aada8a37`, K1's portable single-session host at `f8cb840f`, K2's deterministic scheduler and shared bot API at `7e8acb74` plus `38e83640`, and K3's shared-content/isolation plus connected observer gate at `3f340125`. K4 closed through `776482da`: 1/5/10/30-root isolation and two-hour simulated endurance, death/randomized cancellation, committed resource ceilings, ten minutes of exact native Linux two-account connected sampling, ACE-confirmed graceful logout, and zero-debt Runtime/content convergence all pass. Slice L Linux graphical/platform work is active. Issue #225's lifestone/particle alpha comparison remains a separate rendering visual gate.
**Purpose:** One source of truth for where the project is and where it's going. Every observed defect or missing feature has a named phase that owns it; when something looks wrong in-game, look here to find the phase that'll address it. Implementation details live in per-phase specs under `docs/superpowers/specs/`, not in this file.
**Slice L checkpoint:** L0 closed at `66f114b2` with one typed graphical
platform/native manifest, shared XDG/Windows paths, factory-selected
Windows/Linux frame waits, portable persistence/plugin discovery, RID-safe
App publish, and an Ubuntu graphical CI/package gate. Slice L1
context/extension/native-backend validation is active.
---
## Current program: world interaction completion (M4 prelude)
@ -1816,7 +1822,7 @@ port in any phase — no separate listing here.
> Headless tests pass 67/67 and the complete Release suite passes 8,784 / 5
> skips. The exact two-account connected soak then passed 20 periodic samples,
> ACE-confirmed graceful logout, and a zero-debt `disposed` record. Slice K is
> closed and Slice L is active.
> closed. Slice L0 completed at `66f114b2`; L1 is active.
> The historical exact cutover
> rollback remains
> `git revert ef1d263337997bb030eadb7b8e71d73dc659907a`. Slice H is complete:
@ -1863,7 +1869,8 @@ hitch and follows.
> no-window Linux host and approximately 30-session target from
> [`2026-07-26-modern-runtime-slice-k.md`](2026-07-26-modern-runtime-slice-k.md);
> Slice L executes the graphical Linux/platform work. K0-K4 and Slice K are
> complete through `776482da`. Its automated 1/5/10/30-root
> complete through `776482da`. L0 is complete at `66f114b2`; L1 is active.
> K's automated 1/5/10/30-root
> isolation, two-hour simulated endurance, death/cancellation, and committed
> resource-envelope gates pass; the exact two-account connected process added
> ten minutes of passing samples, graceful logout, and complete terminal

View file

@ -317,6 +317,16 @@ residency is `0/0/0` at every stable checkpoint and teardown converges. Slice I
logout for both accounts and a passing `disposed` record with two converged
Runtime roots, zero entities/inventory/host/content leases, and disposed
shared content. K4 and Slice K are closed; Slice L is active.
L0 completed at `66f114b2`: one startup-owned graphical platform/native
manifest, the shared Runtime XDG/Windows path set, factory-selected Windows
and absolute-monotonic Linux frame waits, portable settings/keybindings/
diagnostics/plugins, RID-safe plugin build/publish, and Ubuntu graphical CI
are in production. Windows passes 415 Runtime, 67 Headless, 543 UI, and
3,736 App tests / 3 skips; the complete Release suite passes 8,799 / 5
skips. Native Ubuntu passes the portable Runtime/Headless/UI and 14 L0 App
tests, and the exact `linux-x64` package contains resolved GLFW, OpenAL
Soft, cimgui, shaders, and smoke plugin. Slice L1 context/extension/native-
backend validation is next.
Slice-I closeout evidence is
[`../research/2026-07-25-slice-i7-closeout.md`](../research/2026-07-25-slice-i7-closeout.md).
Slice-J2 closeout evidence is

View file

@ -1,6 +1,6 @@
# Modern runtime Slice L — Linux graphical host and evidence-gated GPU work
**Status:** PREPARED — BEGINS AFTER SLICE K CLOSEOUT
**Status:** ACTIVE — L0 COMPLETE; L1 NEXT
**Parent:** `2026-07-24-modern-runtime-architecture.md`, Slice L
**Authorization:** the user approved Slices FL on 2026-07-24
**Purpose:** ship the existing modern OpenGL client on supported Linux drivers
@ -156,6 +156,15 @@ Provide:
### L0 — platform services and Linux build
**Complete at `66f114b2` (2026-07-27).** Runtime now owns the shared
XDG/Windows `ApplicationPathSet`; App owns one typed graphical platform/native
manifest and factory-selected Windows/Linux kernel waiter. Settings,
keybindings, Studio, diagnostics, and user plugins consume the portable paths,
with no-overwrite Windows legacy migration. The RID-aware smoke-plugin build
and publish paths and the Ubuntu graphical CI/package guard pass. Exact
Windows/Linux evidence and rollback are recorded in
[`../research/2026-07-27-slice-l0-platform-services.md`](../research/2026-07-27-slice-l0-platform-services.md).
- Add Linux App build/publish jobs to CI after K's non-graphical Linux jobs.
- Add typed platform capability, path, pacing, and native-dependency owners.
- Implement the Linux monotonic frame waiter and factory selection.

View file

@ -0,0 +1,121 @@
# Slice L0 closeout — graphical platform services and Linux publish
**Date:** 2026-07-27
**Production commit:** `66f114b258c0c37b51a7c0e04ca0d6441f4b1699`
**Status:** complete; Slice L1 is next
## Outcome
The existing `AcDream.App` now restores, builds, tests, and publishes as the
same graphical client on Windows and `linux-x64`. This is not a second Linux
renderer or gameplay host. `GameWindow`, retained UI, Runtime, rendering,
shaders, and DAT behavior remain shared.
L0 established four typed startup seams:
- `GraphicalHostPlatformServices` owns the process OS, architecture,
supported RID, native-dependency manifest, portable paths, and frame-waiter
factory.
- Runtime's `ApplicationPathSet` is the shared XDG/Windows path authority used
by graphical and headless hosts.
- `PlatformFramePacingWaiterFactory` selects the existing Windows
high-resolution waitable timer or the new Linux absolute
`CLOCK_MONOTONIC` waiter. Frame policy and missed-deadline rebasing are
unchanged.
- the App project owns RID-aware build and publish copying for the smoke
plugin, and Linux CI verifies the complete framework-dependent package
contract.
Feature code no longer resolves `%LOCALAPPDATA%` itself. Settings, key
bindings, UI Studio, texture diagnostics, and per-user plugin discovery
receive canonical paths from the composition root. Windows preserves existing
users through a no-overwrite migration of legacy LocalAppData settings and
key bindings into the shared roaming configuration root. The packaged plugin
root remains read-only and is scanned before the per-user plugin root.
## Native and package gate
An exact publish from the production commit succeeded:
```text
dotnet publish src/AcDream.App/AcDream.App.csproj \
-c Release -r linux-x64 --self-contained false
```
The artifact contains:
- executable `AcDream.App` plus its managed closure;
- `libglfw.so.3`, `libopenal.so`, and `libcimgui.so`;
- the production shader tree;
- `plugins/AcDream.Plugins.Smoke/AcDream.Plugins.Smoke.dll`;
- the matching smoke-plugin manifest.
`ldd` reports no unresolved direct dependency. The App build and publish use
the same RID-aware smoke-plugin source; no Windows separator or hard-coded
`net10.0` output assumption remains.
The new Ubuntu CI lane independently builds and publishes `linux-x64`, runs
the portable UI and L0 App tests, validates the package contents, and enforces
source guards:
- Windows kernel imports remain confined to the Windows waiter;
- platform checks remain confined to typed platform owners;
- App/UI feature code cannot reintroduce LocalAppData resolution;
- normal frame pacing cannot directly construct the Windows waiter.
## Automated evidence
Windows Release:
- Runtime: `415 / 415`
- Headless: `67 / 67`
- UI abstractions: `543 / 543`
- App: `3,736 / 3 skips`
- complete solution: `8,799 / 5 skips`
- App build: zero warnings and zero errors
Native Ubuntu/WSL:
- Runtime: `415 / 415`
- Headless: `67 / 67`
- UI abstractions: `543 / 543`
- L0 App platform/path/pacing tests: `14 / 14`
- exact `linux-x64` build and framework-dependent publish: pass
- real Linux five-millisecond absolute-monotonic wait: pass
The broader Linux App run also passed 3,734 tests and the three existing
explicit fixture skips. Two historical installed-DAT tests still hard-code
`C:\Turbine\Asheron's Call`; they are not part of L0's portable gate and do
not indicate a production Linux failure. L1/L2 test-fixture cleanup should
remove that test-only Windows assumption before claiming the complete App
suite on a clean Linux runner.
## Behavior and ownership audit
- Runtime/gameplay/network/physics/render algorithms are unchanged.
- VSync still waits in swap; uncapped diagnostics still do not wait.
- VSync-off normal play uses the same deadline/rebase policy with a
platform-owned kernel wait.
- The Linux waiter retries `EINTR` against the original absolute deadline,
owns no native handle, and rejects use after disposal.
- Existing Windows configuration is copied only when the canonical file is
absent; no existing destination is overwritten or deleted.
- Package validation does not bundle DATs, `acdream.pak`, or credentials.
- The four unrelated line-ending-only worktree files were excluded from the
commit.
## Remaining Slice L work
L0 proves build/publish and the typed platform boundary. It deliberately does
not claim that a Linux GL window, input stack, audio device, or connected game
route has passed. L1 must open the packaged client under X11 and Wayland,
capture the mandatory OpenGL capability record, validate GLFW/input/OpenAL
construction and teardown, render a smoke scene, capture a screenshot, and
fail unsupported drivers with one actionable report.
## Rollback
```text
git revert 66f114b258c0c37b51a7c0e04ca0d6441f4b1699
```