4.7 KiB
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:
GraphicalHostPlatformServicesowns the process OS, architecture, supported RID, native-dependency manifest, portable paths, and frame-waiter factory.- Runtime's
ApplicationPathSetis the shared XDG/Windows path authority used by graphical and headless hosts. PlatformFramePacingWaiterFactoryselects the existing Windows high-resolution waitable timer or the new Linux absoluteCLOCK_MONOTONICwaiter. 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:
dotnet publish src/AcDream.App/AcDream.App.csproj \
-c Release -r linux-x64 --self-contained false
The artifact contains:
- executable
AcDream.Appplus its managed closure; libglfw.so.3,libopenal.so, andlibcimgui.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-x64build 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
EINTRagainst 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
git revert 66f114b258c0c37b51a7c0e04ca0d6441f4b1699