docs(linux): close Slice L0
This commit is contained in:
parent
66f114b258
commit
07bb1c5a74
9 changed files with 264 additions and 14 deletions
18
AGENTS.md
18
AGENTS.md
|
|
@ -390,7 +390,17 @@ scheduler cadence, and every resource dimension inside its ceiling. SIGINT
|
||||||
produced ACE-confirmed graceful logout for both accounts and a passing final
|
produced ACE-confirmed graceful logout for both accounts and a passing final
|
||||||
`disposed` sample: two converged Runtime roots, zero entities/inventory/host
|
`disposed` sample: two converged Runtime roots, zero entities/inventory/host
|
||||||
or content leases, and disposed shared content. K4 and Slice K are closed;
|
or content leases, and disposed shared content. K4 and Slice K are closed;
|
||||||
Slice L Linux graphical/platform work is active.
|
Slice L Linux graphical/platform work is active. L0 completed at `66f114b2`:
|
||||||
|
`ApplicationPathSet` is the shared XDG/Windows path authority;
|
||||||
|
`GraphicalHostPlatformServices` owns one OS/architecture/RID, native manifest,
|
||||||
|
and frame-waiter factory; Linux uses an absolute `CLOCK_MONOTONIC` wait;
|
||||||
|
settings, keybindings, Studio, diagnostics, and user plugins consume portable
|
||||||
|
paths with no-overwrite Windows migration; and the RID-safe App publish plus
|
||||||
|
Ubuntu graphical CI/package gate pass. 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 closure, 14 L0 App
|
||||||
|
tests, and exact `linux-x64` publish. L1 context/extension/native-backend
|
||||||
|
validation is next.
|
||||||
J0's rollback is
|
J0's rollback is
|
||||||
`git revert b632672e5ccabfb44c551e08f1c411ab2669c44a`.
|
`git revert b632672e5ccabfb44c551e08f1c411ab2669c44a`.
|
||||||
J1's rollback is
|
J1's rollback is
|
||||||
|
|
@ -462,6 +472,8 @@ K4's current rollbacks, newest first, are
|
||||||
`git revert bd236ce553718cfb1248703f4a2b17b35733b11c`,
|
`git revert bd236ce553718cfb1248703f4a2b17b35733b11c`,
|
||||||
`git revert 97c174fbb2d72fb94e2fe07448bb257989ed8941`, then
|
`git revert 97c174fbb2d72fb94e2fe07448bb257989ed8941`, then
|
||||||
`git revert cb512fd0916fbf49285c9b64df1630c5a69a0d20`.
|
`git revert cb512fd0916fbf49285c9b64df1630c5a69a0d20`.
|
||||||
|
L0's rollback is
|
||||||
|
`git revert 66f114b258c0c37b51a7c0e04ca0d6441f4b1699`.
|
||||||
Slice H's retained UI/frame, bounded-light, and pooled/borrowed/direct network
|
Slice H's retained UI/frame, bounded-light, and pooled/borrowed/direct network
|
||||||
work is complete; the exact seven-checkpoint connected lifecycle/reconnect gate
|
work is complete; the exact seven-checkpoint connected lifecycle/reconnect gate
|
||||||
passes. Slice I is closed in
|
passes. Slice I is closed in
|
||||||
|
|
@ -495,7 +507,9 @@ closeout is
|
||||||
`docs/research/2026-07-27-slice-k1-single-session-headless.md`; K2 closeout is
|
`docs/research/2026-07-27-slice-k1-single-session-headless.md`; K2 closeout is
|
||||||
`docs/research/2026-07-27-slice-k2-deterministic-bot-parity.md`; Slice K is
|
`docs/research/2026-07-27-slice-k2-deterministic-bot-parity.md`; Slice K is
|
||||||
closed in `docs/plans/2026-07-26-modern-runtime-slice-k.md`; K4 evidence is
|
closed in `docs/plans/2026-07-26-modern-runtime-slice-k.md`; K4 evidence is
|
||||||
`docs/research/2026-07-27-slice-k4-resource-telemetry-checkpoint.md`. The exact G4 visual
|
`docs/research/2026-07-27-slice-k4-resource-telemetry-checkpoint.md`; Slice L
|
||||||
|
executes from `docs/plans/2026-07-26-modern-runtime-slice-l.md`; L0 evidence is
|
||||||
|
`docs/research/2026-07-27-slice-l0-platform-services.md`. The exact G4 visual
|
||||||
rollback
|
rollback
|
||||||
is `git revert ef1d263337997bb030eadb7b8e71d73dc659907a`; do not revert G3 or
|
is `git revert ef1d263337997bb030eadb7b8e71d73dc659907a`; do not revert G3 or
|
||||||
the portal-warmup corrections. Evidence:
|
the portal-warmup corrections. Evidence:
|
||||||
|
|
|
||||||
18
CLAUDE.md
18
CLAUDE.md
|
|
@ -388,7 +388,17 @@ scheduler cadence, and every resource dimension inside its ceiling. SIGINT
|
||||||
produced ACE-confirmed graceful logout for both accounts and a passing final
|
produced ACE-confirmed graceful logout for both accounts and a passing final
|
||||||
`disposed` sample: two converged Runtime roots, zero entities/inventory/host
|
`disposed` sample: two converged Runtime roots, zero entities/inventory/host
|
||||||
or content leases, and disposed shared content. K4 and Slice K are closed;
|
or content leases, and disposed shared content. K4 and Slice K are closed;
|
||||||
Slice L Linux graphical/platform work is active.
|
Slice L Linux graphical/platform work is active. L0 completed at `66f114b2`:
|
||||||
|
`ApplicationPathSet` is the shared XDG/Windows path authority;
|
||||||
|
`GraphicalHostPlatformServices` owns one OS/architecture/RID, native manifest,
|
||||||
|
and frame-waiter factory; Linux uses an absolute `CLOCK_MONOTONIC` wait;
|
||||||
|
settings, keybindings, Studio, diagnostics, and user plugins consume portable
|
||||||
|
paths with no-overwrite Windows migration; and the RID-safe App publish plus
|
||||||
|
Ubuntu graphical CI/package gate pass. 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 closure, 14 L0 App
|
||||||
|
tests, and exact `linux-x64` publish. L1 context/extension/native-backend
|
||||||
|
validation is next.
|
||||||
J0's rollback is
|
J0's rollback is
|
||||||
`git revert b632672e5ccabfb44c551e08f1c411ab2669c44a`.
|
`git revert b632672e5ccabfb44c551e08f1c411ab2669c44a`.
|
||||||
J1's rollback is
|
J1's rollback is
|
||||||
|
|
@ -460,6 +470,8 @@ K4's current rollbacks, newest first, are
|
||||||
`git revert bd236ce553718cfb1248703f4a2b17b35733b11c`,
|
`git revert bd236ce553718cfb1248703f4a2b17b35733b11c`,
|
||||||
`git revert 97c174fbb2d72fb94e2fe07448bb257989ed8941`, then
|
`git revert 97c174fbb2d72fb94e2fe07448bb257989ed8941`, then
|
||||||
`git revert cb512fd0916fbf49285c9b64df1630c5a69a0d20`.
|
`git revert cb512fd0916fbf49285c9b64df1630c5a69a0d20`.
|
||||||
|
L0's rollback is
|
||||||
|
`git revert 66f114b258c0c37b51a7c0e04ca0d6441f4b1699`.
|
||||||
Slice H's retained UI/frame, bounded-light, and pooled/borrowed/direct network
|
Slice H's retained UI/frame, bounded-light, and pooled/borrowed/direct network
|
||||||
work is complete; the exact seven-checkpoint connected lifecycle/reconnect gate
|
work is complete; the exact seven-checkpoint connected lifecycle/reconnect gate
|
||||||
passes. Slice I is closed in
|
passes. Slice I is closed in
|
||||||
|
|
@ -493,7 +505,9 @@ closeout is
|
||||||
`docs/research/2026-07-27-slice-k1-single-session-headless.md`; K2 closeout is
|
`docs/research/2026-07-27-slice-k1-single-session-headless.md`; K2 closeout is
|
||||||
`docs/research/2026-07-27-slice-k2-deterministic-bot-parity.md`; Slice K is
|
`docs/research/2026-07-27-slice-k2-deterministic-bot-parity.md`; Slice K is
|
||||||
closed in `docs/plans/2026-07-26-modern-runtime-slice-k.md`; K4 evidence is
|
closed in `docs/plans/2026-07-26-modern-runtime-slice-k.md`; K4 evidence is
|
||||||
`docs/research/2026-07-27-slice-k4-resource-telemetry-checkpoint.md`. The exact G4 visual
|
`docs/research/2026-07-27-slice-k4-resource-telemetry-checkpoint.md`; Slice L
|
||||||
|
executes from `docs/plans/2026-07-26-modern-runtime-slice-l.md`; L0 evidence is
|
||||||
|
`docs/research/2026-07-27-slice-l0-platform-services.md`. The exact G4 visual
|
||||||
rollback
|
rollback
|
||||||
is `git revert ef1d263337997bb030eadb7b8e71d73dc659907a`; do not revert G3 or
|
is `git revert ef1d263337997bb030eadb7b8e71d73dc659907a`; do not revert G3 or
|
||||||
the portal-warmup corrections. Evidence:
|
the portal-warmup corrections. Evidence:
|
||||||
|
|
|
||||||
|
|
@ -241,6 +241,9 @@ src/
|
||||||
World/
|
World/
|
||||||
RuntimeWorldEnvironmentState.cs -> canonical calendar/time/weather owner
|
RuntimeWorldEnvironmentState.cs -> canonical calendar/time/weather owner
|
||||||
RuntimeWorldTransitState.cs -> canonical reveal generation/readiness 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
|
RuntimeGenerationReset.cs -> one retryable canonical-generation reset
|
||||||
-> Slice J complete; graphical and no-window hosts share one GameRuntime
|
-> Slice J complete; graphical and no-window hosts share one GameRuntime
|
||||||
-> may reference Core, Core.Net, Content, and Plugin.Abstractions only
|
-> may reference Core, Core.Net, Content, and Plugin.Abstractions only
|
||||||
|
|
@ -266,6 +269,11 @@ src/
|
||||||
ISelectionService.cs -> done
|
ISelectionService.cs -> done
|
||||||
|
|
||||||
AcDream.App/ Layer 1 + Layer 4 wiring
|
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/
|
Physics/
|
||||||
ProjectileController.cs -> live-record projectile orchestration/corrections
|
ProjectileController.cs -> live-record projectile orchestration/corrections
|
||||||
RemotePhysicsUpdater.cs -> ordinary/Hidden remote narrow-tick integration
|
RemotePhysicsUpdater.cs -> ordinary/Hidden remote narrow-tick integration
|
||||||
|
|
@ -283,6 +291,8 @@ src/
|
||||||
RetailLiveFrameCoordinator.cs -> object/physics-before-network frame barrier
|
RetailLiveFrameCoordinator.cs -> object/physics-before-network frame barrier
|
||||||
Rendering/
|
Rendering/
|
||||||
GameWindow.cs -> native composition/callback shell
|
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
|
LiveEntityAnimationScheduler.cs -> canonical ordinary live-object workset
|
||||||
RetailStaticAnimatingObjectScheduler.cs -> retail static-animation workset
|
RetailStaticAnimatingObjectScheduler.cs -> retail static-animation workset
|
||||||
StaticLiveRootCommitter.cs -> static root pose/collision commit boundary
|
StaticLiveRootCommitter.cs -> static root pose/collision commit boundary
|
||||||
|
|
|
||||||
|
|
@ -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.
|
**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.
|
**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)
|
## 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
|
> 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,
|
> 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
|
> 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
|
> The historical exact cutover
|
||||||
> rollback remains
|
> rollback remains
|
||||||
> `git revert ef1d263337997bb030eadb7b8e71d73dc659907a`. Slice H is complete:
|
> `git revert ef1d263337997bb030eadb7b8e71d73dc659907a`. Slice H is complete:
|
||||||
|
|
@ -1863,7 +1869,8 @@ hitch and follows.
|
||||||
> no-window Linux host and approximately 30-session target from
|
> 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);
|
> [`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
|
> 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
|
> isolation, two-hour simulated endurance, death/cancellation, and committed
|
||||||
> resource-envelope gates pass; the exact two-account connected process added
|
> resource-envelope gates pass; the exact two-account connected process added
|
||||||
> ten minutes of passing samples, graceful logout, and complete terminal
|
> ten minutes of passing samples, graceful logout, and complete terminal
|
||||||
|
|
|
||||||
|
|
@ -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
|
logout for both accounts and a passing `disposed` record with two converged
|
||||||
Runtime roots, zero entities/inventory/host/content leases, and disposed
|
Runtime roots, zero entities/inventory/host/content leases, and disposed
|
||||||
shared content. K4 and Slice K are closed; Slice L is active.
|
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
|
Slice-I closeout evidence is
|
||||||
[`../research/2026-07-25-slice-i7-closeout.md`](../research/2026-07-25-slice-i7-closeout.md).
|
[`../research/2026-07-25-slice-i7-closeout.md`](../research/2026-07-25-slice-i7-closeout.md).
|
||||||
Slice-J2 closeout evidence is
|
Slice-J2 closeout evidence is
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
# Modern runtime Slice L — Linux graphical host and evidence-gated GPU work
|
# 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
|
**Parent:** `2026-07-24-modern-runtime-architecture.md`, Slice L
|
||||||
**Authorization:** the user approved Slices F–L on 2026-07-24
|
**Authorization:** the user approved Slices F–L on 2026-07-24
|
||||||
**Purpose:** ship the existing modern OpenGL client on supported Linux drivers
|
**Purpose:** ship the existing modern OpenGL client on supported Linux drivers
|
||||||
|
|
@ -156,6 +156,15 @@ Provide:
|
||||||
|
|
||||||
### L0 — platform services and Linux build
|
### 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 Linux App build/publish jobs to CI after K's non-graphical Linux jobs.
|
||||||
- Add typed platform capability, path, pacing, and native-dependency owners.
|
- Add typed platform capability, path, pacing, and native-dependency owners.
|
||||||
- Implement the Linux monotonic frame waiter and factory selection.
|
- Implement the Linux monotonic frame waiter and factory selection.
|
||||||
|
|
|
||||||
121
docs/research/2026-07-27-slice-l0-platform-services.md
Normal file
121
docs/research/2026-07-27-slice-l0-platform-services.md
Normal 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
|
||||||
|
```
|
||||||
65
memory/project_linux_graphical.md
Normal file
65
memory/project_linux_graphical.md
Normal file
|
|
@ -0,0 +1,65 @@
|
||||||
|
# Modern Runtime Linux graphical continuation
|
||||||
|
|
||||||
|
## Current checkpoint
|
||||||
|
|
||||||
|
Slice L0 completed at
|
||||||
|
`66f114b258c0c37b51a7c0e04ca0d6441f4b1699`.
|
||||||
|
|
||||||
|
The same `AcDream.App` now builds and publishes for `linux-x64`; there is no
|
||||||
|
Linux gameplay or renderer fork.
|
||||||
|
|
||||||
|
Canonical seams:
|
||||||
|
|
||||||
|
- `AcDream.Runtime.Platform.ApplicationPathSet` owns XDG/Windows config, data,
|
||||||
|
cache, plugin, screenshot, and diagnostic paths for graphical and headless
|
||||||
|
hosts.
|
||||||
|
- `AcDream.App.Platform.GraphicalHostPlatformServices` owns one startup OS,
|
||||||
|
architecture, RID, native-dependency manifest, path set, and pacing factory.
|
||||||
|
- `PlatformFramePacingWaiterFactory` selects the existing Windows
|
||||||
|
high-resolution waitable timer or Linux
|
||||||
|
`LinuxMonotonicFramePacingWaiter`.
|
||||||
|
- Linux waiting uses absolute `CLOCK_MONOTONIC` +
|
||||||
|
`clock_nanosleep(TIMER_ABSTIME)`, retries `EINTR`, does not busy-spin, and
|
||||||
|
rejects use after disposal.
|
||||||
|
- Windows legacy `%LOCALAPPDATA%\acdream\settings.json` and
|
||||||
|
`keybinds.json` are copied only when the new roaming destination is absent.
|
||||||
|
- bundled plugins are read beside the binary; user plugins are read from the
|
||||||
|
portable data root. A successful bundled ID wins; a failed load does not
|
||||||
|
reserve the ID.
|
||||||
|
|
||||||
|
Exact L0 evidence:
|
||||||
|
|
||||||
|
- Windows: Runtime 415, Headless 67, UI 543, App 3,736 / 3 skips, complete
|
||||||
|
Release 8,799 / 5 skips.
|
||||||
|
- native Ubuntu/WSL: Runtime 415, Headless 67, UI 543, 14 L0 App tests.
|
||||||
|
- exact framework-dependent `linux-x64` publish contains executable, managed
|
||||||
|
closure, GLFW, OpenAL Soft, cimgui, shaders, and smoke plugin/manifest;
|
||||||
|
direct `ldd` has no unresolved dependency.
|
||||||
|
- closeout:
|
||||||
|
`docs/research/2026-07-27-slice-l0-platform-services.md`.
|
||||||
|
|
||||||
|
Rollback:
|
||||||
|
|
||||||
|
```text
|
||||||
|
git revert 66f114b258c0c37b51a7c0e04ca0d6441f4b1699
|
||||||
|
```
|
||||||
|
|
||||||
|
## Next work — L1
|
||||||
|
|
||||||
|
Do not claim Linux graphical support merely from publish success. L1 must:
|
||||||
|
|
||||||
|
1. start the exact package under the available X11 and Wayland sessions;
|
||||||
|
2. capture OS/display/compositor/GPU/driver/OpenGL vendor, renderer, version,
|
||||||
|
mandatory extensions, swap interval, refresh, DPI, and audio backend before
|
||||||
|
renderer construction;
|
||||||
|
3. create the OpenGL 4.3 core context and reject missing bindless texture or
|
||||||
|
shader draw parameters with one actionable report;
|
||||||
|
4. validate GLFW window/input callbacks, relative mouse/focus, framebuffer
|
||||||
|
sizing, clipboard, and monitor facts;
|
||||||
|
5. initialize OpenAL fail-open exactly as current Windows behavior permits;
|
||||||
|
6. render a packaged smoke scene, capture a screenshot, and close with zero
|
||||||
|
GL/OpenAL/window debt.
|
||||||
|
|
||||||
|
Historical test-only issue: two installed-DAT App tests still hard-code
|
||||||
|
`C:\Turbine\Asheron's Call`. They are not production blockers, but clean them
|
||||||
|
before claiming the complete App test suite on a clean Linux runner.
|
||||||
|
|
@ -70,13 +70,13 @@ zero entities/inventory/host/content leases, disposed shared content, and
|
||||||
## Next work
|
## Next work
|
||||||
|
|
||||||
Slice L is active under
|
Slice L is active under
|
||||||
`docs/plans/2026-07-26-modern-runtime-slice-l.md`. The initial read-only L0
|
`docs/plans/2026-07-26-modern-runtime-slice-l.md`. L0 completed at
|
||||||
probe already proves framework-dependent `linux-x64` App publish succeeds and
|
`66f114b2`: the shared path owner, graphical platform/native manifest,
|
||||||
ships resolved GLFW, OpenAL Soft, and cimgui native libraries. The smoke plugin
|
factory-selected Linux wait, portable persistence/plugins, RID-safe publish,
|
||||||
is missing from the publish because its copy target uses Windows-shaped paths.
|
and Ubuntu graphical package gate pass. Continue from
|
||||||
Frame pacing still directly constructs the Windows waitable-timer owner, and
|
`memory/project_linux_graphical.md`; L1 must prove the actual Linux
|
||||||
App/UI persistence still defaults to Windows `LocalApplicationData`; those
|
window/context/input/audio lifecycle rather than revisiting headless
|
||||||
are the first L0 implementation seams.
|
ownership.
|
||||||
|
|
||||||
Final K3 automated counts: Runtime 412, Headless 47, App 3,722 / 3 skips,
|
Final K3 automated counts: Runtime 412, Headless 47, App 3,722 / 3 skips,
|
||||||
complete Release 8,764 / 5 skips.
|
complete Release 8,764 / 5 skips.
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue