diff --git a/tests/AcDream.Launcher.Tests/MainWindowViewTests.cs b/tests/AcDream.Launcher.Tests/MainWindowViewTests.cs index e01a0dce..6228f64f 100644 --- a/tests/AcDream.Launcher.Tests/MainWindowViewTests.cs +++ b/tests/AcDream.Launcher.Tests/MainWindowViewTests.cs @@ -48,7 +48,20 @@ public sealed class MainWindowViewTests ("UpdateCloseButton", typeof(Button)), ]; + // Lane=Manual: this is the ONE test in the repo that needs a real desktop + // session. Measured 2026-08-19 across five environments — passes on a dev + // desktop and on the CI Windows box over SSH; fails identically under + // act_runner's step context and on Linux, always in Test Case Cleanup with + // "The calling thread cannot access this object" while a compositor is + // being CONSTRUCTED (Compositor..ctor -> DefaultRenderLoop.Add -> + // VerifyAccess). Neither serializing the assembly (xunit.runner.json, then + // a compiled-in CollectionBehavior attribute) nor removing the test's only + // await changed it, so it is not parallelism and not a thread hop in the + // test body — it is Avalonia's headless session lifecycle in a + // desktop-less environment. Run it deliberately: + // dotnet test tests/AcDream.Launcher.Tests --filter Lane=Manual [AvaloniaFact] + [Trait("Lane", "Manual")] public async Task CompiledMarkupAndEveryModalFocusPathRunInOneOwnedAvaloniaSession() { // Avalonia's headless compositor is thread-affine. Keep the complete