Skip to content

Bug: Install.Tests testhost hang after MxcRuntimePayload_RequiredNativeUnit_IsPresent completes #1494

Closed

Description

@JoshuaRowePhantom

Unrelated test failure — observed during fix for #1474

Failing test batch: Phantom.Workspaces.Install.Tests (test host aborted after all tests passed)
Test running when hang was detected: Phantom.Workspaces.Install.Tests.MxcRuntimePayloadTests.MxcRuntimePayload_RequiredNativeUnit_IsPresent

Symptom

run-tests.ps1 -Mode fast reports:

Passed!  - Failed:     0, Passed:   138, Skipped:     0, Total:   138, Duration: 4 s - Phantom.Workspaces.Install.Tests.dll (net10.0)
...
=== Test Run Summary ===
Executed : 6441
Passed   : 6441
Failed   : 0
FAIL [jrowe_DAEMON_2026-09-07_18_39_41_net10.0]: test host crashed (outcome=Failed but no test failures)

The vstest console log for the Install.Tests project shows:

Test host process crashed : You are up to date; no newer release is available.
Update staged: version 0.2.0.
Update service is not available in this build.

Data collector 'Blame' message: The specified inactivity time of 90 seconds has elapsed. Collecting hang dumps from testhost and its child processes.

All 138 Install.Tests tests actually passed (Failed: 0, Passed: 138); the failure is a
test-host inactivity hang detected by Blame after the last test completed, coupled with
stray stdout from the app's auto-updater code getting interpreted by vstest as a "test host
crashed" reason line.

Dumps

Blame captured hang dumps from testhost and 17 child dotnet.exe processes. All dumps are
archived under dumps/<bug>/. The testhost main thread is parked in
DefaultEngineInvoker.Invoke waiting for xUnit's VsTestRunner.RunTests to complete; the
xUnit runner thread is blocked on RandomAccess.ReadAtOffset inside a nested
AsyncOverSyncWithIoCancellation I/O originating from a dotnet.exe child. The child
processes are the dotnet publish invocation launched by
MxcRuntimePayload_RequiredNativeUnit_IsPresent.

Parallel stacks (testhost, abridged)

System.Threading.Tasks.Task.Wait()
Microsoft.VisualStudio.TestPlatform.TestHost.DefaultEngineInvoker.Invoke(...)
Microsoft.VisualStudio.TestPlatform.TestHost.Program.Main(String[])

Xunit.Runner.VisualStudio.VsTestRunner.RunTests(...)
Xunit.Runner.VisualStudio.VsTestRunner+<RunTestsInAssembly>d__33.MoveNext()
System.IO.RandomAccess.ReadAtOffset(SafeFileHandle, Span<Byte>, Int64)
System.Threading.AsyncOverSyncWithIoCancellation+<InvokeAsync>d__8<...>.MoveNext()

Why unrelated to #1474

Branch #1474 modifies only:

  • Phantom.Workspaces.Llm.Core/Processes/ProcessExecutor.cs
  • Phantom.Workspaces.Llm.Core/Processes/WindowsCommandLine.cs
  • Phantom.Workspaces.Llm.Core/Shell/LocalShellStreamHandler.cs
  • The matching test files in Phantom.Workspaces.Llm.Core.Tests/

None of these files are referenced by Phantom.Workspaces.Install.Tests,
MxcRepositoryTestSupport, Assert-MxcRuntimePayload.ps1, or the
Phantom.Workspaces.csproj publish targets exercised by the hanging test. The stability
run of the four changed test classes passed 10/10 immediately before the fast suite. The
crash reason text ("You are up to date … Update staged: version 0.2.0. Update service is
not available in this build.") comes from the auto-updater emitting messages on stdout
during dotnet publish / app startup, not from any Llm.Core process-executor code path.

Root cause hypothesis

  1. During MxcRuntimePayload_RequiredNativeUnit_IsPresent, dotnet publish Phantom.Workspaces.csproj
    is invoked. Something in the publish target chain (or in launched
    Phantom.Workspaces.exe startup during a post-publish target) writes auto-updater
    status text to stdout. That text is picked up by vstest as the "crash reason" because
    the vstest protocol multiplexes over stdout.
  2. Meanwhile the publish child process (or one of its nodeReuse:false msbuild children)
    holds a handle that the Xunit runner is reading via RandomAccess.ReadAtOffset and
    never closes, so the runner is still blocked when Blame's 90-second inactivity timer
    fires and dumps testhost + 17 dotnet children.

Proposed solution

  • Silence the auto-updater output during Phantom.Workspaces publish/startup when running
    inside a test host (detect VSTEST_HOST or equivalent env var) so that stray stdout
    cannot masquerade as a test-host crash reason.
  • Ensure MxcRepositoryTestSupport.InvokeAsync fully drains and closes both stdout/stderr
    pipes before returning (e.g. await Task.WhenAll(stdoutTask, stderrTask) and
    process.WaitForExitAsync on the same cancellation token) so no child handle survives
    the test body.
  • Add /nodeReuse:false and /p:UseSharedCompilation=false consistently to any nested
    dotnet invocations, and dispose the returned Process explicitly, so orphan msbuild
    workers cannot keep the parent handle alive.

Once the auto-updater no longer writes to stdout in tests and the child pipes are drained,
the Blame inactivity timer will not fire on this test.

Activity

  1. JoshuaRowePhantom commented on Sep 8, 2026

    @JoshuaRowePhantom
    OwnerAuthor

    Design

    Root cause

    MxcRuntimePayload_RequiredNativeUnit_IsPresent launches a nested dotnet publish while capturing stdout and stderr with anonymous pipes. The helper correctly owns and disposes the direct Process and starts both drains before waiting, but EOF on those drains is controlled by every inherited writer. The publish starts reusable MSBuild/compiler-server descendants; those descendants can survive the direct dotnet process and retain inherited pipe write handles, leaving ReadToEndAsync parked after the test assertions have otherwise completed. The archived failure's 17 child dotnet processes and RandomAccess.ReadAtOffset stack match that ownership leak. The updater text is stderr payload from management-mode tests, not the lifecycle root cause, so suppressing it would only hide evidence.

    Chosen approach

    Make this nested publish hermetic at its process-creation boundary: disable reusable build servers and shared compilation in addition to the existing MSBuild node-reuse switch. Keep draining both redirected streams and disposing the direct process; no timeout, sleep, output suppression, or test-host detection is needed. Add deterministic regression coverage first that verifies every required process-isolation switch is supplied by the publish test.

    Alternatives considered

    • Cancelling or closing redirected reads when the direct process exits can truncate buffered output and mis-model pipe ownership.
    • Increasing Blame timeouts or suppressing updater stderr masks the leaked writer and is rejected.
    • Killing arbitrary descendant processes in teardown risks shared-machine processes; preventing their persistence at launch is the correct boundary.

    Files

    • Phantom.Workspaces.Install.Tests/MxcIntegrationTests.cs — regression assertion and isolated publish invocation.
  2. JoshuaRowePhantom commented on Sep 8, 2026

    @JoshuaRowePhantom
    OwnerAuthor

    Implementation notes

    Commit: 388216c

    Deviations from proposed design

    None.

    Scope changes

    None. Updater output remains visible because it was diagnostic payload, not the pipe-lifetime cause.

    Files changed

    • Phantom.Workspaces.Install.Tests/MxcIntegrationTests.cs

    Diagnosis and verification

    The nested publish allowed reusable MSBuild/compiler-server descendants to outlive the direct dotnet process while retaining inherited anonymous-pipe writers. The test helper then remained in ReadToEndAsync waiting for EOF. The publish now disables persistent build servers, MSBuild node reuse, and shared compilation at launch while preserving full stdout/stderr draining.

    Regression test was observed failing before the fix. Build completed with zero errors; MxcRuntimePayloadTests passed 8/8; targeted stability passed 10/10 runs (80/80 test executions), all with zero failures and no testhost hang.

  3. JoshuaRowePhantom commented on Sep 8, 2026

    @JoshuaRowePhantom
    OwnerAuthor

    Verification result

    Status: ✅ Verified
    Commits checked:

    388216c0 Fix #1494: isolate nested publish build servers
    

    Outstanding gaps

    None — all criteria satisfied.

    Tests

    • MxcRuntimePayloadTests: 8/8 passed in the prescribed targeted run.
    • Stability: 10/10 consecutive targeted runs passed (80/80 executions), with no testhost hang.
    Test run for C:\dev\Phantom.Workspaces-Skills\worktrees\9\Phantom.Dock.Avalonia.TabSwitching\Phantom.Dock.Avalonia.TabSwitching.Tests\bin\Debug\net10.0\Phantom.Dock.Avalonia.TabSwitching.Tests.dll (.NETCoreApp,Version=v10.0)
    A total of 1 test files matched the specified pattern.
    No test matches the given testcase filter `(FullyQualifiedName~MxcRuntimePayloadTests)&(Category!=SlowGit)&(Category!=SlowDocker)` in C:\dev\Phantom.Workspaces-Skills\worktrees\9\Phantom.Dock.Avalonia.TabSwitching\Phantom.Dock.Avalonia.TabSwitching.Tests\bin\Debug\net10.0\Phantom.Dock.Avalonia.TabSwitching.Tests.dll
    Data collector 'Blame' message: All tests finished running, Sequence file will not be generated.
    Results File: C:\dev\Phantom.Workspaces-Skills\worktrees\9\Phantom.Dock.Avalonia.TabSwitching\Phantom.Dock.Avalonia.TabSwitching.Tests\TestResults\jrowe_DAEMON_2026-09-08_10_00_50_net10.0.trx
    
    Test run for C:\dev\Phantom.Workspaces-Skills\worktrees\9\Phantom.Workspaces.Agent.Cli.Tests\bin\Debug\net10.0\Phantom.Workspaces.Agent.Cli.Tests.dll (.NETCoreApp,Version=v10.0)
    A total of 1 test files matched the specified pattern.
    No test matches the given testcase filter `(FullyQualifiedName~MxcRuntimePayloadTests)&(Category!=SlowGit)&(Category!=SlowDocker)` in C:\dev\Phantom.Workspaces-Skills\worktrees\9\Phantom.Workspaces.Agent.Cli.Tests\bin\Debug\net10.0\Phantom.Workspaces.Agent.Cli.Tests.dll
    Data collector 'Blame' message: All tests finished running, Sequence file will not be generated.
    Results File: C:\dev\Phantom.Workspaces-Skills\worktrees\9\Phantom.Workspaces.Agent.Cli.Tests\TestResults\jrowe_DAEMON_2026-09-08_10_00_51_net10.0.trx
    
    Test run for C:\dev\Phantom.Workspaces-Skills\worktrees\9\Phantom.Workspaces.Agent.Gui.Tests\bin\Debug\net10.0\Phantom.Workspaces.Agent.Gui.Tests.dll (.NETCoreApp,Version=v10.0)
    A total of 1 test files matched the specified pattern.
    No test matches the given testcase filter `(FullyQualifiedName~MxcRuntimePayloadTests)&(Category!=SlowGit)&(Category!=SlowDocker)` in C:\dev\Phantom.Workspaces-Skills\worktrees\9\Phantom.Workspaces.Agent.Gui.Tests\bin\Debug\net10.0\Phantom.Workspaces.Agent.Gui.Tests.dll
    Data collector 'Blame' message: All tests finished running, Sequence file will not be generated.
    Results File: C:\dev\Phantom.Workspaces-Skills\worktrees\9\Phantom.Workspaces.Agent.Gui.Tests\TestResults\jrowe_DAEMON_2026-09-08_10_00_53_net10.0.trx
    
    Test run for C:\dev\Phantom.Workspaces-Skills\worktrees\9\Phantom.Workspaces.Agent.Gui.WebViewTests\bin\Debug\net10.0-windows\Phantom.Workspaces.Agent.Gui.WebViewTests.dll (.NETCoreApp,Version=v10.0)
    A total of 1 test files matched the specified pattern.
    No test matches the given testcase filter `(FullyQualifiedName~MxcRuntimePayloadTests)&(Category!=SlowGit)&(Category!=SlowDocker)` in C:\dev\Phantom.Workspaces-Skills\worktrees\9\Phantom.Workspaces.Agent.Gui.WebViewTests\bin\Debug\net10.0-windows\Phantom.Workspaces.Agent.Gui.WebViewTests.dll
    Data collector 'Blame' message: All tests finished running, Sequence file will not be generated.
    Results File: C:\dev\Phantom.Workspaces-Skills\worktrees\9\Phantom.Workspaces.Agent.Gui.WebViewTests\TestResults\jrowe_DAEMON_2026-09-08_10_00_55_net10.0.trx
    
    Test run for C:\dev\Phantom.Workspaces-Skills\worktrees\9\Phantom.Workspaces.Containers.Tests\bin\Debug\net10.0\Phantom.Workspaces.Containers.Tests.dll (.NETCoreApp,Version=v10.0)
    A total of 1 test files matched the specified pattern.
    No test matches the given testcase filter `(FullyQualifiedName~MxcRuntimePayloadTests)&(Category!=SlowGit)&(Category!=SlowDocker)` in C:\dev\Phantom.Workspaces-Skills\worktrees\9\Phantom.Workspaces.Containers.Tests\bin\Debug\net10.0\Phantom.Workspaces.Containers.Tests.dll
    Data collector 'Blame' message: All tests finished running, Sequence file will not be generated.
    Results File: C:\dev\Phantom.Workspaces-Skills\worktrees\9\Phantom.Workspaces.Containers.Tests\TestResults\jrowe_DAEMON_2026-09-08_10_00_56_net10.0.trx
    
    Test run for C:\dev\Phantom.Workspaces-Skills\worktrees\9\Phantom.Workspaces.Data.Core.Tests\bin\Debug\net10.0\Phantom.Workspaces.Data.Core.Tests.dll (.NETCoreApp,Version=v10.0)
    A total of 1 test files matched the specified pattern.
    No test matches the given testcase filter `(FullyQualifiedName~MxcRuntimePayloadTests)&(Category!=SlowGit)&(Category!=SlowDocker)` in C:\dev\Phantom.Workspaces-Skills\worktrees\9\Phantom.Workspaces.Data.Core.Tests\bin\Debug\net10.0\Phantom.Workspaces.Data.Core.Tests.dll
    Data collector 'Blame' message: All tests finished running, Sequence file will not be generated.
    Results File: C:\dev\Phantom.Workspaces-Skills\worktrees\9\Phantom.Workspaces.Data.Core.Tests\TestResults\jrowe_DAEMON_2026-09-08_10_00_57_net10.0.trx
    
    Test run for C:\dev\Phantom.Workspaces-Skills\worktrees\9\Phantom.Workspaces.Data.MongoDB.Tests\bin\Debug\net10.0\Phantom.Workspaces.Data.MongoDB.Tests.dll (.NETCoreApp,Version=v10.0)
    A total of 1 test files matched the specified pattern.
    No test matches the given testcase filter `(FullyQualifiedName~MxcRuntimePayloadTests)&(Category!=SlowGit)&(Category!=SlowDocker)` in C:\dev\Phantom.Workspaces-Skills\worktrees\9\Phantom.Workspaces.Data.MongoDB.Tests\bin\Debug\net10.0\Phantom.Workspaces.Data.MongoDB.Tests.dll
    Data collector 'Blame' message: All tests finished running, Sequence file will not be generated.
    Results File: C:\dev\Phantom.Workspaces-Skills\worktrees\9\Phantom.Workspaces.Data.MongoDB.Tests\TestResults\jrowe_DAEMON_2026-09-08_10_00_59_net10.0.trx
    
    Test run for C:\dev\Phantom.Workspaces-Skills\worktrees\9\Phantom.Workspaces.Data.Offline.Tests\bin\Debug\net10.0\Phantom.Workspaces.Data.Offline.Tests.dll (.NETCoreApp,Version=v10.0)
    A total of 1 test files matched the specified pattern.
    No test matches the given testcase filter `(FullyQualifiedName~MxcRuntimePayloadTests)&(Category!=SlowGit)&(Category!=SlowDocker)` in C:\dev\Phantom.Workspaces-Skills\worktrees\9\Phantom.Workspaces.Data.Offline.Tests\bin\Debug\net10.0\Phantom.Workspaces.Data.Offline.Tests.dll
    Data collector 'Blame' message: All tests finished running, Sequence file will not be generated.
    Results File: C:\dev\Phantom.Workspaces-Skills\worktrees\9\Phantom.Workspaces.Data.Offline.Tests\TestResults\jrowe_DAEMON_2026-09-08_10_01_00_net10.0.trx
    
    Test run for C:\dev\Phantom.Workspaces-Skills\worktrees\9\Phantom.Workspaces.Data.Web.Client.Tests\bin\Debug\net10.0\Phantom.Workspaces.Data.Web.Client.Tests.dll (.NETCoreApp,Version=v10.0)
    A total of 1 test files matched the specified pattern.
    No test matches the given testcase filter `(FullyQualifiedName~MxcRuntimePayloadTests)&(Category!=SlowGit)&(Category!=SlowDocker)` in C:\dev\Phantom.Workspaces-Skills\worktrees\9\Phantom.Workspaces.Data.Web.Client.Tests\bin\Debug\net10.0\Phantom.Workspaces.Data.Web.Client.Tests.dll
    Data collector 'Blame' message: All tests finished running, Sequence file will not be generated.
    Results File: C:\dev\Phantom.Workspaces-Skills\worktrees\9\Phantom.Workspaces.Data.Web.Client.Tests\TestResults\jrowe_DAEMON_2026-09-08_10_01_01_net10.0.trx
    
    Test run for C:\dev\Phantom.Workspaces-Skills\worktrees\9\Phantom.Workspaces.Data.Web.Server.Tests\bin\Debug\net10.0\Phantom.Workspaces.Data.Web.Server.Tests.dll (.NETCoreApp,Version=v10.0)
    A total of 1 test files matched the specified pattern.
    No test matches the given testcase filter `(FullyQualifiedName~MxcRuntimePayloadTests)&(Category!=SlowGit)&(Category!=SlowDocker)` in C:\dev\Phantom.Workspaces-Skills\worktrees\9\Phantom.Workspaces.Data.Web.Server.Tests\bin\Debug\net10.0\Phantom.Workspaces.Data.Web.Server.Tests.dll
    Data collector 'Blame' message: All tests finished running, Sequence file will not be generated.
    Results File: C:\dev\Phantom.Workspaces-Skills\worktrees\9\Phantom.Workspaces.Data.Web.Server.Tests\TestResults\jrowe_DAEMON_2026-09-08_10_01_02_net10.0.trx
    
    Test run for C:\dev\Phantom.Workspaces-Skills\worktrees\9\Phantom.Workspaces.Docs.Tests\bin\Debug\net10.0\Phantom.Workspaces.Docs.Tests.dll (.NETCoreApp,Version=v10.0)
    A total of 1 test files matched the specified pattern.
    No test matches the given testcase filter `(FullyQualifiedName~MxcRuntimePayloadTests)&(Category!=SlowGit)&(Category!=SlowDocker)` in C:\dev\Phantom.Workspaces-Skills\worktrees\9\Phantom.Workspaces.Docs.Tests\bin\Debug\net10.0\Phantom.Workspaces.Docs.Tests.dll
    Data collector 'Blame' message: All tests finished running, Sequence file will not be generated.
    Results File: C:\dev\Phantom.Workspaces-Skills\worktrees\9\Phantom.Workspaces.Docs.Tests\TestResults\jrowe_DAEMON_2026-09-08_10_01_03_net10.0.trx
    
    Test run for C:\dev\Phantom.Workspaces-Skills\worktrees\9\Phantom.Workspaces.Gui.Shared.Tests\bin\Debug\net10.0\Phantom.Workspaces.Gui.Shared.Tests.dll (.NETCoreApp,Version=v10.0)
    A total of 1 test files matched the specified pattern.
    No test matches the given testcase filter `(FullyQualifiedName~MxcRuntimePayloadTests)&(Category!=SlowGit)&(Category!=SlowDocker)` in C:\dev\Phantom.Workspaces-Skills\worktrees\9\Phantom.Workspaces.Gui.Shared.Tests\bin\Debug\net10.0\Phantom.Workspaces.Gui.Shared.Tests.dll
    Data collector 'Blame' message: All tests finished running, Sequence file will not be generated.
    Results File: C:\dev\Phantom.Workspaces-Skills\worktrees\9\Phantom.Workspaces.Gui.Shared.Tests\TestResults\jrowe_DAEMON_2026-09-08_10_01_05_net10.0.trx
    
    Test run for C:\dev\Phantom.Workspaces-Skills\worktrees\9\Phantom.Workspaces.Install.Tests\bin\Debug\net10.0\Phantom.Workspaces.Install.Tests.dll (.NETCoreApp,Version=v10.0)
    A total of 1 test files matched the specified pattern.
    Data collector 'Blame' message: All tests finished running, Sequence file will not be generated.
    Results File: C:\dev\Phantom.Workspaces-Skills\worktrees\9\Phantom.Workspaces.Install.Tests\TestResults\jrowe_DAEMON_2026-09-08_10_01_08_net10.0.trx
    
    Passed!  - Failed:     0, Passed:     8, Skipped:     0, Total:     8, Duration: 44 s - Phantom.Workspaces.Install.Tests.dll (net10.0)
    Test run for C:\dev\Phantom.Workspaces-Skills\worktrees\9\Phantom.Workspaces.IntegrationTests\bin\Debug\net10.0\Phantom.Workspaces.IntegrationTests.dll (.NETCoreApp,Version=v10.0)
    A total of 1 test files matched the specified pattern.
    No test matches the given testcase filter `(FullyQualifiedName~MxcRuntimePayloadTests)&(Category!=SlowGit)&(Category!=SlowDocker)` in C:\dev\Phantom.Workspaces-Skills\worktrees\9\Phantom.Workspaces.IntegrationTests\bin\Debug\net10.0\Phantom.Workspaces.IntegrationTests.dll
    Data collector 'Blame' message: All tests finished running, Sequence file will not be generated.
    Results File: C:\dev\Phantom.Workspaces-Skills\worktrees\9\Phantom.Workspaces.IntegrationTests\TestResults\jrowe_DAEMON_2026-09-08_10_01_52_net10.0.trx
    
    Test run for C:\dev\Phantom.Workspaces-Skills\worktrees\9\Phantom.Workspaces.Llm.Core.Tests\bin\Debug\net10.0\Phantom.Workspaces.Llm.Core.Tests.dll (.NETCoreApp,Version=v10.0)
    A total of 1 test files matched the specified pattern.
    [xUnit.net 00:00:00.22] Phantom.Workspaces.Llm.Core.Tests: Non-serializable data ('System.Object[]') found for 'Phantom.Workspaces.Llm.Core.Tests.CopilotSdkStreamAdapterTests.TranslateCopilotSdkSessionEvents_BenignLifecycleEvent_IsConsumedSilently'; falling back to single test case.
    No test matches the given testcase filter `(FullyQualifiedName~MxcRuntimePayloadTests)&(Category!=SlowGit)&(Category!=SlowDocker)` in C:\dev\Phantom.Workspaces-Skills\worktrees\9\Phantom.Workspaces.Llm.Core.Tests\bin\Debug\net10.0\Phantom.Workspaces.Llm.Core.Tests.dll
    Data collector 'Blame' message: All tests finished running, Sequence file will not be generated.
    Results File: C:\dev\Phantom.Workspaces-Skills\worktrees\9\Phantom.Workspaces.Llm.Core.Tests\TestResults\jrowe_DAEMON_2026-09-08_10_01_53_net10.0.trx
    
    Test run for C:\dev\Phantom.Workspaces-Skills\worktrees\9\Phantom.Workspaces.Tests\bin\Debug\net10.0\Phantom.Workspaces.Tests.dll (.NETCoreApp,Version=v10.0)
    A total of 1 test files matched the specified pattern.
    No test matches the given testcase filter `(FullyQualifiedName~MxcRuntimePayloadTests)&(Category!=SlowGit)&(Category!=SlowDocker)` in C:\dev\Phantom.Workspaces-Skills\worktrees\9\Phantom.Workspaces.Tests\bin\Debug\net10.0\Phantom.Workspaces.Tests.dll
    Data collector 'Blame' message: All tests finished running, Sequence file will not be generated.
    Results File: C:\dev\Phantom.Workspaces-Skills\worktrees\9\Phantom.Workspaces.Tests\TestResults\jrowe_DAEMON_2026-09-08_10_01_56_net10.0.trx
    
    Test run for C:\dev\Phantom.Workspaces-Skills\worktrees\9\Phantom.Workspaces.Tools.Tests\bin\Debug\net10.0\Phantom.Workspaces.Tools.Tests.dll (.NETCoreApp,Version=v10.0)
    A total of 1 test files matched the specified pattern.
    No test matches the given testcase filter `(FullyQualifiedName~MxcRuntimePayloadTests)&(Category!=SlowGit)&(Category!=SlowDocker)` in C:\dev\Phantom.Workspaces-Skills\worktrees\9\Phantom.Workspaces.Tools.Tests\bin\Debug\net10.0\Phantom.Workspaces.Tools.Tests.dll
    Data collector 'Blame' message: All tests finished running, Sequence file will not be generated.
    Results File: C:\dev\Phantom.Workspaces-Skills\worktrees\9\Phantom.Workspaces.Tools.Tests\TestResults\jrowe_DAEMON_2026-09-08_10_01_57_net10.0.trx
    
    Test run for C:\dev\Phantom.Workspaces-Skills\worktrees\9\Phantom.Workspaces.Transport.Tests\bin\Debug\net10.0\Phantom.Workspaces.Transport.Tests.dll (.NETCoreApp,Version=v10.0)
    A total of 1 test files matched the specified pattern.
    No test matches the given testcase filter `(FullyQualifiedName~MxcRuntimePayloadTests)&(Category!=SlowGit)&(Category!=SlowDocker)` in C:\dev\Phantom.Workspaces-Skills\worktrees\9\Phantom.Workspaces.Transport.Tests\bin\Debug\net10.0\Phantom.Workspaces.Transport.Tests.dll
    Data collector 'Blame' message: All tests finished running, Sequence file will not be generated.
    Results File: C:\dev\Phantom.Workspaces-Skills\worktrees\9\Phantom.Workspaces.Transport.Tests\TestResults\jrowe_DAEMON_2026-09-08_10_01_59_net10.0.trx
    
    Test run for C:\dev\Phantom.Workspaces-Skills\worktrees\9\Phantom.Workspaces.Web.Server.Tests\bin\Debug\net10.0\Phantom.Workspaces.Web.Server.Tests.dll (.NETCoreApp,Version=v10.0)
    A total of 1 test files matched the specified pattern.
    No test matches the given testcase filter `(FullyQualifiedName~MxcRuntimePayloadTests)&(Category!=SlowGit)&(Category!=SlowDocker)` in C:\dev\Phantom.Workspaces-Skills\worktrees\9\Phantom.Workspaces.Web.Server.Tests\bin\Debug\net10.0\Phantom.Workspaces.Web.Server.Tests.dll
    Data collector 'Blame' message: All tests finished running, Sequence file will not be generated.
    Results File: C:\dev\Phantom.Workspaces-Skills\worktrees\9\Phantom.Workspaces.Web.Server.Tests\TestResults\jrowe_DAEMON_2026-09-08_10_02_00_net10.0.trx
    
    Test run for C:\dev\Phantom.Workspaces-Skills\worktrees\9\Phantom.Workspaces.WebViewTests\bin\Debug\net10.0-windows\Phantom.Workspaces.WebViewTests.dll (.NETCoreApp,Version=v10.0)
    A total of 1 test files matched the specified pattern.
    No test matches the given testcase filter `(FullyQualifiedName~MxcRuntimePayloadTests)&(Category!=SlowGit)&(Category!=SlowDocker)` in C:\dev\Phantom.Workspaces-Skills\worktrees\9\Phantom.Workspaces.WebViewTests\bin\Debug\net10.0-windows\Phantom.Workspaces.WebViewTests.dll
    Data collector 'Blame' message: All tests finished running, Sequence file will not be generated.
    Results File: C:\dev\Phantom.Workspaces-Skills\worktrees\9\Phantom.Workspaces.WebViewTests\TestResults\jrowe_DAEMON_2026-09-08_10_02_02_net10.0.trx
    
    
    === Test Run Summary ===
    Executed : 8
    Passed   : 8
    Failed   : 0
    
    
  4. JoshuaRowePhantom commented on Sep 8, 2026

    @JoshuaRowePhantom
    OwnerAuthor

    Verification result

    Status: ✅ Verified
    Commits checked:

    388216c0 Fix #1494: isolate nested publish build servers
    

    Outstanding gaps

    None — all criteria satisfied.

    Tests

    • MxcRuntimePayloadTests: 8/8 passed in the prescribed targeted run.
    • Stability: 10/10 consecutive targeted runs passed (80/80 executions), with no testhost hang.
    Test run for C:\dev\Phantom.Workspaces-Skills\worktrees\9\Phantom.Dock.Avalonia.TabSwitching\Phantom.Dock.Avalonia.TabSwitching.Tests\bin\Debug\net10.0\Phantom.Dock.Avalonia.TabSwitching.Tests.dll (.NETCoreApp,Version=v10.0)
    A total of 1 test files matched the specified pattern.
    No test matches the given testcase filter `(FullyQualifiedName~MxcRuntimePayloadTests)&(Category!=SlowGit)&(Category!=SlowDocker)` in C:\dev\Phantom.Workspaces-Skills\worktrees\9\Phantom.Dock.Avalonia.TabSwitching\Phantom.Dock.Avalonia.TabSwitching.Tests\bin\Debug\net10.0\Phantom.Dock.Avalonia.TabSwitching.Tests.dll
    Data collector 'Blame' message: All tests finished running, Sequence file will not be generated.
    Results File: C:\dev\Phantom.Workspaces-Skills\worktrees\9\Phantom.Dock.Avalonia.TabSwitching\Phantom.Dock.Avalonia.TabSwitching.Tests\TestResults\jrowe_DAEMON_2026-09-08_10_00_50_net10.0.trx
    
    Test run for C:\dev\Phantom.Workspaces-Skills\worktrees\9\Phantom.Workspaces.Agent.Cli.Tests\bin\Debug\net10.0\Phantom.Workspaces.Agent.Cli.Tests.dll (.NETCoreApp,Version=v10.0)
    A total of 1 test files matched the specified pattern.
    No test matches the given testcase filter `(FullyQualifiedName~MxcRuntimePayloadTests)&(Category!=SlowGit)&(Category!=SlowDocker)` in C:\dev\Phantom.Workspaces-Skills\worktrees\9\Phantom.Workspaces.Agent.Cli.Tests\bin\Debug\net10.0\Phantom.Workspaces.Agent.Cli.Tests.dll
    Data collector 'Blame' message: All tests finished running, Sequence file will not be generated.
    Results File: C:\dev\Phantom.Workspaces-Skills\worktrees\9\Phantom.Workspaces.Agent.Cli.Tests\TestResults\jrowe_DAEMON_2026-09-08_10_00_51_net10.0.trx
    
    Test run for C:\dev\Phantom.Workspaces-Skills\worktrees\9\Phantom.Workspaces.Agent.Gui.Tests\bin\Debug\net10.0\Phantom.Workspaces.Agent.Gui.Tests.dll (.NETCoreApp,Version=v10.0)
    A total of 1 test files matched the specified pattern.
    No test matches the given testcase filter `(FullyQualifiedName~MxcRuntimePayloadTests)&(Category!=SlowGit)&(Category!=SlowDocker)` in C:\dev\Phantom.Workspaces-Skills\worktrees\9\Phantom.Workspaces.Agent.Gui.Tests\bin\Debug\net10.0\Phantom.Workspaces.Agent.Gui.Tests.dll
    Data collector 'Blame' message: All tests finished running, Sequence file will not be generated.
    Results File: C:\dev\Phantom.Workspaces-Skills\worktrees\9\Phantom.Workspaces.Agent.Gui.Tests\TestResults\jrowe_DAEMON_2026-09-08_10_00_53_net10.0.trx
    
    Test run for C:\dev\Phantom.Workspaces-Skills\worktrees\9\Phantom.Workspaces.Agent.Gui.WebViewTests\bin\Debug\net10.0-windows\Phantom.Workspaces.Agent.Gui.WebViewTests.dll (.NETCoreApp,Version=v10.0)
    A total of 1 test files matched the specified pattern.
    No test matches the given testcase filter `(FullyQualifiedName~MxcRuntimePayloadTests)&(Category!=SlowGit)&(Category!=SlowDocker)` in C:\dev\Phantom.Workspaces-Skills\worktrees\9\Phantom.Workspaces.Agent.Gui.WebViewTests\bin\Debug\net10.0-windows\Phantom.Workspaces.Agent.Gui.WebViewTests.dll
    Data collector 'Blame' message: All tests finished running, Sequence file will not be generated.
    Results File: C:\dev\Phantom.Workspaces-Skills\worktrees\9\Phantom.Workspaces.Agent.Gui.WebViewTests\TestResults\jrowe_DAEMON_2026-09-08_10_00_55_net10.0.trx
    
    Test run for C:\dev\Phantom.Workspaces-Skills\worktrees\9\Phantom.Workspaces.Containers.Tests\bin\Debug\net10.0\Phantom.Workspaces.Containers.Tests.dll (.NETCoreApp,Version=v10.0)
    A total of 1 test files matched the specified pattern.
    No test matches the given testcase filter `(FullyQualifiedName~MxcRuntimePayloadTests)&(Category!=SlowGit)&(Category!=SlowDocker)` in C:\dev\Phantom.Workspaces-Skills\worktrees\9\Phantom.Workspaces.Containers.Tests\bin\Debug\net10.0\Phantom.Workspaces.Containers.Tests.dll
    Data collector 'Blame' message: All tests finished running, Sequence file will not be generated.
    Results File: C:\dev\Phantom.Workspaces-Skills\worktrees\9\Phantom.Workspaces.Containers.Tests\TestResults\jrowe_DAEMON_2026-09-08_10_00_56_net10.0.trx
    
    Test run for C:\dev\Phantom.Workspaces-Skills\worktrees\9\Phantom.Workspaces.Data.Core.Tests\bin\Debug\net10.0\Phantom.Workspaces.Data.Core.Tests.dll (.NETCoreApp,Version=v10.0)
    A total of 1 test files matched the specified pattern.
    No test matches the given testcase filter `(FullyQualifiedName~MxcRuntimePayloadTests)&(Category!=SlowGit)&(Category!=SlowDocker)` in C:\dev\Phantom.Workspaces-Skills\worktrees\9\Phantom.Workspaces.Data.Core.Tests\bin\Debug\net10.0\Phantom.Workspaces.Data.Core.Tests.dll
    Data collector 'Blame' message: All tests finished running, Sequence file will not be generated.
    Results File: C:\dev\Phantom.Workspaces-Skills\worktrees\9\Phantom.Workspaces.Data.Core.Tests\TestResults\jrowe_DAEMON_2026-09-08_10_00_57_net10.0.trx
    
    Test run for C:\dev\Phantom.Workspaces-Skills\worktrees\9\Phantom.Workspaces.Data.MongoDB.Tests\bin\Debug\net10.0\Phantom.Workspaces.Data.MongoDB.Tests.dll (.NETCoreApp,Version=v10.0)
    A total of 1 test files matched the specified pattern.
    No test matches the given testcase filter `(FullyQualifiedName~MxcRuntimePayloadTests)&(Category!=SlowGit)&(Category!=SlowDocker)` in C:\dev\Phantom.Workspaces-Skills\worktrees\9\Phantom.Workspaces.Data.MongoDB.Tests\bin\Debug\net10.0\Phantom.Workspaces.Data.MongoDB.Tests.dll
    Data collector 'Blame' message: All tests finished running, Sequence file will not be generated.
    Results File: C:\dev\Phantom.Workspaces-Skills\worktrees\9\Phantom.Workspaces.Data.MongoDB.Tests\TestResults\jrowe_DAEMON_2026-09-08_10_00_59_net10.0.trx
    
    Test run for C:\dev\Phantom.Workspaces-Skills\worktrees\9\Phantom.Workspaces.Data.Offline.Tests\bin\Debug\net10.0\Phantom.Workspaces.Data.Offline.Tests.dll (.NETCoreApp,Version=v10.0)
    A total of 1 test files matched the specified pattern.
    No test matches the given testcase filter `(FullyQualifiedName~MxcRuntimePayloadTests)&(Category!=SlowGit)&(Category!=SlowDocker)` in C:\dev\Phantom.Workspaces-Skills\worktrees\9\Phantom.Workspaces.Data.Offline.Tests\bin\Debug\net10.0\Phantom.Workspaces.Data.Offline.Tests.dll
    Data collector 'Blame' message: All tests finished running, Sequence file will not be generated.
    Results File: C:\dev\Phantom.Workspaces-Skills\worktrees\9\Phantom.Workspaces.Data.Offline.Tests\TestResults\jrowe_DAEMON_2026-09-08_10_01_00_net10.0.trx
    
    Test run for C:\dev\Phantom.Workspaces-Skills\worktrees\9\Phantom.Workspaces.Data.Web.Client.Tests\bin\Debug\net10.0\Phantom.Workspaces.Data.Web.Client.Tests.dll (.NETCoreApp,Version=v10.0)
    A total of 1 test files matched the specified pattern.
    No test matches the given testcase filter `(FullyQualifiedName~MxcRuntimePayloadTests)&(Category!=SlowGit)&(Category!=SlowDocker)` in C:\dev\Phantom.Workspaces-Skills\worktrees\9\Phantom.Workspaces.Data.Web.Client.Tests\bin\Debug\net10.0\Phantom.Workspaces.Data.Web.Client.Tests.dll
    Data collector 'Blame' message: All tests finished running, Sequence file will not be generated.
    Results File: C:\dev\Phantom.Workspaces-Skills\worktrees\9\Phantom.Workspaces.Data.Web.Client.Tests\TestResults\jrowe_DAEMON_2026-09-08_10_01_01_net10.0.trx
    
    Test run for C:\dev\Phantom.Workspaces-Skills\worktrees\9\Phantom.Workspaces.Data.Web.Server.Tests\bin\Debug\net10.0\Phantom.Workspaces.Data.Web.Server.Tests.dll (.NETCoreApp,Version=v10.0)
    A total of 1 test files matched the specified pattern.
    No test matches the given testcase filter `(FullyQualifiedName~MxcRuntimePayloadTests)&(Category!=SlowGit)&(Category!=SlowDocker)` in C:\dev\Phantom.Workspaces-Skills\worktrees\9\Phantom.Workspaces.Data.Web.Server.Tests\bin\Debug\net10.0\Phantom.Workspaces.Data.Web.Server.Tests.dll
    Data collector 'Blame' message: All tests finished running, Sequence file will not be generated.
    Results File: C:\dev\Phantom.Workspaces-Skills\worktrees\9\Phantom.Workspaces.Data.Web.Server.Tests\TestResults\jrowe_DAEMON_2026-09-08_10_01_02_net10.0.trx
    
    Test run for C:\dev\Phantom.Workspaces-Skills\worktrees\9\Phantom.Workspaces.Docs.Tests\bin\Debug\net10.0\Phantom.Workspaces.Docs.Tests.dll (.NETCoreApp,Version=v10.0)
    A total of 1 test files matched the specified pattern.
    No test matches the given testcase filter `(FullyQualifiedName~MxcRuntimePayloadTests)&(Category!=SlowGit)&(Category!=SlowDocker)` in C:\dev\Phantom.Workspaces-Skills\worktrees\9\Phantom.Workspaces.Docs.Tests\bin\Debug\net10.0\Phantom.Workspaces.Docs.Tests.dll
    Data collector 'Blame' message: All tests finished running, Sequence file will not be generated.
    Results File: C:\dev\Phantom.Workspaces-Skills\worktrees\9\Phantom.Workspaces.Docs.Tests\TestResults\jrowe_DAEMON_2026-09-08_10_01_03_net10.0.trx
    
    Test run for C:\dev\Phantom.Workspaces-Skills\worktrees\9\Phantom.Workspaces.Gui.Shared.Tests\bin\Debug\net10.0\Phantom.Workspaces.Gui.Shared.Tests.dll (.NETCoreApp,Version=v10.0)
    A total of 1 test files matched the specified pattern.
    No test matches the given testcase filter `(FullyQualifiedName~MxcRuntimePayloadTests)&(Category!=SlowGit)&(Category!=SlowDocker)` in C:\dev\Phantom.Workspaces-Skills\worktrees\9\Phantom.Workspaces.Gui.Shared.Tests\bin\Debug\net10.0\Phantom.Workspaces.Gui.Shared.Tests.dll
    Data collector 'Blame' message: All tests finished running, Sequence file will not be generated.
    Results File: C:\dev\Phantom.Workspaces-Skills\worktrees\9\Phantom.Workspaces.Gui.Shared.Tests\TestResults\jrowe_DAEMON_2026-09-08_10_01_05_net10.0.trx
    
    Test run for C:\dev\Phantom.Workspaces-Skills\worktrees\9\Phantom.Workspaces.Install.Tests\bin\Debug\net10.0\Phantom.Workspaces.Install.Tests.dll (.NETCoreApp,Version=v10.0)
    A total of 1 test files matched the specified pattern.
    Data collector 'Blame' message: All tests finished running, Sequence file will not be generated.
    Results File: C:\dev\Phantom.Workspaces-Skills\worktrees\9\Phantom.Workspaces.Install.Tests\TestResults\jrowe_DAEMON_2026-09-08_10_01_08_net10.0.trx
    
    Passed!  - Failed:     0, Passed:     8, Skipped:     0, Total:     8, Duration: 44 s - Phantom.Workspaces.Install.Tests.dll (net10.0)
    Test run for C:\dev\Phantom.Workspaces-Skills\worktrees\9\Phantom.Workspaces.IntegrationTests\bin\Debug\net10.0\Phantom.Workspaces.IntegrationTests.dll (.NETCoreApp,Version=v10.0)
    A total of 1 test files matched the specified pattern.
    No test matches the given testcase filter `(FullyQualifiedName~MxcRuntimePayloadTests)&(Category!=SlowGit)&(Category!=SlowDocker)` in C:\dev\Phantom.Workspaces-Skills\worktrees\9\Phantom.Workspaces.IntegrationTests\bin\Debug\net10.0\Phantom.Workspaces.IntegrationTests.dll
    Data collector 'Blame' message: All tests finished running, Sequence file will not be generated.
    Results File: C:\dev\Phantom.Workspaces-Skills\worktrees\9\Phantom.Workspaces.IntegrationTests\TestResults\jrowe_DAEMON_2026-09-08_10_01_52_net10.0.trx
    
    Test run for C:\dev\Phantom.Workspaces-Skills\worktrees\9\Phantom.Workspaces.Llm.Core.Tests\bin\Debug\net10.0\Phantom.Workspaces.Llm.Core.Tests.dll (.NETCoreApp,Version=v10.0)
    A total of 1 test files matched the specified pattern.
    [xUnit.net 00:00:00.22] Phantom.Workspaces.Llm.Core.Tests: Non-serializable data ('System.Object[]') found for 'Phantom.Workspaces.Llm.Core.Tests.CopilotSdkStreamAdapterTests.TranslateCopilotSdkSessionEvents_BenignLifecycleEvent_IsConsumedSilently'; falling back to single test case.
    No test matches the given testcase filter `(FullyQualifiedName~MxcRuntimePayloadTests)&(Category!=SlowGit)&(Category!=SlowDocker)` in C:\dev\Phantom.Workspaces-Skills\worktrees\9\Phantom.Workspaces.Llm.Core.Tests\bin\Debug\net10.0\Phantom.Workspaces.Llm.Core.Tests.dll
    Data collector 'Blame' message: All tests finished running, Sequence file will not be generated.
    Results File: C:\dev\Phantom.Workspaces-Skills\worktrees\9\Phantom.Workspaces.Llm.Core.Tests\TestResults\jrowe_DAEMON_2026-09-08_10_01_53_net10.0.trx
    
    Test run for C:\dev\Phantom.Workspaces-Skills\worktrees\9\Phantom.Workspaces.Tests\bin\Debug\net10.0\Phantom.Workspaces.Tests.dll (.NETCoreApp,Version=v10.0)
    A total of 1 test files matched the specified pattern.
    No test matches the given testcase filter `(FullyQualifiedName~MxcRuntimePayloadTests)&(Category!=SlowGit)&(Category!=SlowDocker)` in C:\dev\Phantom.Workspaces-Skills\worktrees\9\Phantom.Workspaces.Tests\bin\Debug\net10.0\Phantom.Workspaces.Tests.dll
    Data collector 'Blame' message: All tests finished running, Sequence file will not be generated.
    Results File: C:\dev\Phantom.Workspaces-Skills\worktrees\9\Phantom.Workspaces.Tests\TestResults\jrowe_DAEMON_2026-09-08_10_01_56_net10.0.trx
    
    Test run for C:\dev\Phantom.Workspaces-Skills\worktrees\9\Phantom.Workspaces.Tools.Tests\bin\Debug\net10.0\Phantom.Workspaces.Tools.Tests.dll (.NETCoreApp,Version=v10.0)
    A total of 1 test files matched the specified pattern.
    No test matches the given testcase filter `(FullyQualifiedName~MxcRuntimePayloadTests)&(Category!=SlowGit)&(Category!=SlowDocker)` in C:\dev\Phantom.Workspaces-Skills\worktrees\9\Phantom.Workspaces.Tools.Tests\bin\Debug\net10.0\Phantom.Workspaces.Tools.Tests.dll
    Data collector 'Blame' message: All tests finished running, Sequence file will not be generated.
    Results File: C:\dev\Phantom.Workspaces-Skills\worktrees\9\Phantom.Workspaces.Tools.Tests\TestResults\jrowe_DAEMON_2026-09-08_10_01_57_net10.0.trx
    
    Test run for C:\dev\Phantom.Workspaces-Skills\worktrees\9\Phantom.Workspaces.Transport.Tests\bin\Debug\net10.0\Phantom.Workspaces.Transport.Tests.dll (.NETCoreApp,Version=v10.0)
    A total of 1 test files matched the specified pattern.
    No test matches the given testcase filter `(FullyQualifiedName~MxcRuntimePayloadTests)&(Category!=SlowGit)&(Category!=SlowDocker)` in C:\dev\Phantom.Workspaces-Skills\worktrees\9\Phantom.Workspaces.Transport.Tests\bin\Debug\net10.0\Phantom.Workspaces.Transport.Tests.dll
    Data collector 'Blame' message: All tests finished running, Sequence file will not be generated.
    Results File: C:\dev\Phantom.Workspaces-Skills\worktrees\9\Phantom.Workspaces.Transport.Tests\TestResults\jrowe_DAEMON_2026-09-08_10_01_59_net10.0.trx
    
    Test run for C:\dev\Phantom.Workspaces-Skills\worktrees\9\Phantom.Workspaces.Web.Server.Tests\bin\Debug\net10.0\Phantom.Workspaces.Web.Server.Tests.dll (.NETCoreApp,Version=v10.0)
    A total of 1 test files matched the specified pattern.
    No test matches the given testcase filter `(FullyQualifiedName~MxcRuntimePayloadTests)&(Category!=SlowGit)&(Category!=SlowDocker)` in C:\dev\Phantom.Workspaces-Skills\worktrees\9\Phantom.Workspaces.Web.Server.Tests\bin\Debug\net10.0\Phantom.Workspaces.Web.Server.Tests.dll
    Data collector 'Blame' message: All tests finished running, Sequence file will not be generated.
    Results File: C:\dev\Phantom.Workspaces-Skills\worktrees\9\Phantom.Workspaces.Web.Server.Tests\TestResults\jrowe_DAEMON_2026-09-08_10_02_00_net10.0.trx
    
    Test run for C:\dev\Phantom.Workspaces-Skills\worktrees\9\Phantom.Workspaces.WebViewTests\bin\Debug\net10.0-windows\Phantom.Workspaces.WebViewTests.dll (.NETCoreApp,Version=v10.0)
    A total of 1 test files matched the specified pattern.
    No test matches the given testcase filter `(FullyQualifiedName~MxcRuntimePayloadTests)&(Category!=SlowGit)&(Category!=SlowDocker)` in C:\dev\Phantom.Workspaces-Skills\worktrees\9\Phantom.Workspaces.WebViewTests\bin\Debug\net10.0-windows\Phantom.Workspaces.WebViewTests.dll
    Data collector 'Blame' message: All tests finished running, Sequence file will not be generated.
    Results File: C:\dev\Phantom.Workspaces-Skills\worktrees\9\Phantom.Workspaces.WebViewTests\TestResults\jrowe_DAEMON_2026-09-08_10_02_02_net10.0.trx
    
    
    === Test Run Summary ===
    Executed : 8
    Passed   : 8
    Failed   : 0
    
  5. JoshuaRowePhantom commented on Sep 8, 2026

    @JoshuaRowePhantom
    OwnerAuthor

    Verification result

    Status: ✅ Verified
    Commits checked:

    388216c0 Fix #1494: isolate nested publish build servers
    

    Outstanding gaps

    None — all criteria satisfied.

    Tests

    • MxcRuntimePayloadTests: 8/8 passed in the prescribed targeted run.
    • Stability: 10/10 consecutive targeted runs passed (80/80 executions), with no testhost hang.
    Test run for C:\dev\Phantom.Workspaces-Skills\worktrees\9\Phantom.Dock.Avalonia.TabSwitching\Phantom.Dock.Avalonia.TabSwitching.Tests\bin\Debug\net10.0\Phantom.Dock.Avalonia.TabSwitching.Tests.dll (.NETCoreApp,Version=v10.0)
    A total of 1 test files matched the specified pattern.
    No test matches the given testcase filter `(FullyQualifiedName~MxcRuntimePayloadTests)&(Category!=SlowGit)&(Category!=SlowDocker)` in C:\dev\Phantom.Workspaces-Skills\worktrees\9\Phantom.Dock.Avalonia.TabSwitching\Phantom.Dock.Avalonia.TabSwitching.Tests\bin\Debug\net10.0\Phantom.Dock.Avalonia.TabSwitching.Tests.dll
    Data collector 'Blame' message: All tests finished running, Sequence file will not be generated.
    Results File: C:\dev\Phantom.Workspaces-Skills\worktrees\9\Phantom.Dock.Avalonia.TabSwitching\Phantom.Dock.Avalonia.TabSwitching.Tests\TestResults\jrowe_DAEMON_2026-09-08_10_00_50_net10.0.trx
    
    Test run for C:\dev\Phantom.Workspaces-Skills\worktrees\9\Phantom.Workspaces.Agent.Cli.Tests\bin\Debug\net10.0\Phantom.Workspaces.Agent.Cli.Tests.dll (.NETCoreApp,Version=v10.0)
    A total of 1 test files matched the specified pattern.
    No test matches the given testcase filter `(FullyQualifiedName~MxcRuntimePayloadTests)&(Category!=SlowGit)&(Category!=SlowDocker)` in C:\dev\Phantom.Workspaces-Skills\worktrees\9\Phantom.Workspaces.Agent.Cli.Tests\bin\Debug\net10.0\Phantom.Workspaces.Agent.Cli.Tests.dll
    Data collector 'Blame' message: All tests finished running, Sequence file will not be generated.
    Results File: C:\dev\Phantom.Workspaces-Skills\worktrees\9\Phantom.Workspaces.Agent.Cli.Tests\TestResults\jrowe_DAEMON_2026-09-08_10_00_51_net10.0.trx
    
    Test run for C:\dev\Phantom.Workspaces-Skills\worktrees\9\Phantom.Workspaces.Agent.Gui.Tests\bin\Debug\net10.0\Phantom.Workspaces.Agent.Gui.Tests.dll (.NETCoreApp,Version=v10.0)
    A total of 1 test files matched the specified pattern.
    No test matches the given testcase filter `(FullyQualifiedName~MxcRuntimePayloadTests)&(Category!=SlowGit)&(Category!=SlowDocker)` in C:\dev\Phantom.Workspaces-Skills\worktrees\9\Phantom.Workspaces.Agent.Gui.Tests\bin\Debug\net10.0\Phantom.Workspaces.Agent.Gui.Tests.dll
    Data collector 'Blame' message: All tests finished running, Sequence file will not be generated.
    Results File: C:\dev\Phantom.Workspaces-Skills\worktrees\9\Phantom.Workspaces.Agent.Gui.Tests\TestResults\jrowe_DAEMON_2026-09-08_10_00_53_net10.0.trx
    
    Test run for C:\dev\Phantom.Workspaces-Skills\worktrees\9\Phantom.Workspaces.Agent.Gui.WebViewTests\bin\Debug\net10.0-windows\Phantom.Workspaces.Agent.Gui.WebViewTests.dll (.NETCoreApp,Version=v10.0)
    A total of 1 test files matched the specified pattern.
    No test matches the given testcase filter `(FullyQualifiedName~MxcRuntimePayloadTests)&(Category!=SlowGit)&(Category!=SlowDocker)` in C:\dev\Phantom.Workspaces-Skills\worktrees\9\Phantom.Workspaces.Agent.Gui.WebViewTests\bin\Debug\net10.0-windows\Phantom.Workspaces.Agent.Gui.WebViewTests.dll
    Data collector 'Blame' message: All tests finished running, Sequence file will not be generated.
    Results File: C:\dev\Phantom.Workspaces-Skills\worktrees\9\Phantom.Workspaces.Agent.Gui.WebViewTests\TestResults\jrowe_DAEMON_2026-09-08_10_00_55_net10.0.trx
    
    Test run for C:\dev\Phantom.Workspaces-Skills\worktrees\9\Phantom.Workspaces.Containers.Tests\bin\Debug\net10.0\Phantom.Workspaces.Containers.Tests.dll (.NETCoreApp,Version=v10.0)
    A total of 1 test files matched the specified pattern.
    No test matches the given testcase filter `(FullyQualifiedName~MxcRuntimePayloadTests)&(Category!=SlowGit)&(Category!=SlowDocker)` in C:\dev\Phantom.Workspaces-Skills\worktrees\9\Phantom.Workspaces.Containers.Tests\bin\Debug\net10.0\Phantom.Workspaces.Containers.Tests.dll
    Data collector 'Blame' message: All tests finished running, Sequence file will not be generated.
    Results File: C:\dev\Phantom.Workspaces-Skills\worktrees\9\Phantom.Workspaces.Containers.Tests\TestResults\jrowe_DAEMON_2026-09-08_10_00_56_net10.0.trx
    
    Test run for C:\dev\Phantom.Workspaces-Skills\worktrees\9\Phantom.Workspaces.Data.Core.Tests\bin\Debug\net10.0\Phantom.Workspaces.Data.Core.Tests.dll (.NETCoreApp,Version=v10.0)
    A total of 1 test files matched the specified pattern.
    No test matches the given testcase filter `(FullyQualifiedName~MxcRuntimePayloadTests)&(Category!=SlowGit)&(Category!=SlowDocker)` in C:\dev\Phantom.Workspaces-Skills\worktrees\9\Phantom.Workspaces.Data.Core.Tests\bin\Debug\net10.0\Phantom.Workspaces.Data.Core.Tests.dll
    Data collector 'Blame' message: All tests finished running, Sequence file will not be generated.
    Results File: C:\dev\Phantom.Workspaces-Skills\worktrees\9\Phantom.Workspaces.Data.Core.Tests\TestResults\jrowe_DAEMON_2026-09-08_10_00_57_net10.0.trx
    
    Test run for C:\dev\Phantom.Workspaces-Skills\worktrees\9\Phantom.Workspaces.Data.MongoDB.Tests\bin\Debug\net10.0\Phantom.Workspaces.Data.MongoDB.Tests.dll (.NETCoreApp,Version=v10.0)
    A total of 1 test files matched the specified pattern.
    No test matches the given testcase filter `(FullyQualifiedName~MxcRuntimePayloadTests)&(Category!=SlowGit)&(Category!=SlowDocker)` in C:\dev\Phantom.Workspaces-Skills\worktrees\9\Phantom.Workspaces.Data.MongoDB.Tests\bin\Debug\net10.0\Phantom.Workspaces.Data.MongoDB.Tests.dll
    Data collector 'Blame' message: All tests finished running, Sequence file will not be generated.
    Results File: C:\dev\Phantom.Workspaces-Skills\worktrees\9\Phantom.Workspaces.Data.MongoDB.Tests\TestResults\jrowe_DAEMON_2026-09-08_10_00_59_net10.0.trx
    
    Test run for C:\dev\Phantom.Workspaces-Skills\worktrees\9\Phantom.Workspaces.Data.Offline.Tests\bin\Debug\net10.0\Phantom.Workspaces.Data.Offline.Tests.dll (.NETCoreApp,Version=v10.0)
    A total of 1 test files matched the specified pattern.
    No test matches the given testcase filter `(FullyQualifiedName~MxcRuntimePayloadTests)&(Category!=SlowGit)&(Category!=SlowDocker)` in C:\dev\Phantom.Workspaces-Skills\worktrees\9\Phantom.Workspaces.Data.Offline.Tests\bin\Debug\net10.0\Phantom.Workspaces.Data.Offline.Tests.dll
    Data collector 'Blame' message: All tests finished running, Sequence file will not be generated.
    Results File: C:\dev\Phantom.Workspaces-Skills\worktrees\9\Phantom.Workspaces.Data.Offline.Tests\TestResults\jrowe_DAEMON_2026-09-08_10_01_00_net10.0.trx
    
    Test run for C:\dev\Phantom.Workspaces-Skills\worktrees\9\Phantom.Workspaces.Data.Web.Client.Tests\bin\Debug\net10.0\Phantom.Workspaces.Data.Web.Client.Tests.dll (.NETCoreApp,Version=v10.0)
    A total of 1 test files matched the specified pattern.
    No test matches the given testcase filter `(FullyQualifiedName~MxcRuntimePayloadTests)&(Category!=SlowGit)&(Category!=SlowDocker)` in C:\dev\Phantom.Workspaces-Skills\worktrees\9\Phantom.Workspaces.Data.Web.Client.Tests\bin\Debug\net10.0\Phantom.Workspaces.Data.Web.Client.Tests.dll
    Data collector 'Blame' message: All tests finished running, Sequence file will not be generated.
    Results File: C:\dev\Phantom.Workspaces-Skills\worktrees\9\Phantom.Workspaces.Data.Web.Client.Tests\TestResults\jrowe_DAEMON_2026-09-08_10_01_01_net10.0.trx
    
    Test run for C:\dev\Phantom.Workspaces-Skills\worktrees\9\Phantom.Workspaces.Data.Web.Server.Tests\bin\Debug\net10.0\Phantom.Workspaces.Data.Web.Server.Tests.dll (.NETCoreApp,Version=v10.0)
    A total of 1 test files matched the specified pattern.
    No test matches the given testcase filter `(FullyQualifiedName~MxcRuntimePayloadTests)&(Category!=SlowGit)&(Category!=SlowDocker)` in C:\dev\Phantom.Workspaces-Skills\worktrees\9\Phantom.Workspaces.Data.Web.Server.Tests\bin\Debug\net10.0\Phantom.Workspaces.Data.Web.Server.Tests.dll
    Data collector 'Blame' message: All tests finished running, Sequence file will not be generated.
    Results File: C:\dev\Phantom.Workspaces-Skills\worktrees\9\Phantom.Workspaces.Data.Web.Server.Tests\TestResults\jrowe_DAEMON_2026-09-08_10_01_02_net10.0.trx
    
    Test run for C:\dev\Phantom.Workspaces-Skills\worktrees\9\Phantom.Workspaces.Docs.Tests\bin\Debug\net10.0\Phantom.Workspaces.Docs.Tests.dll (.NETCoreApp,Version=v10.0)
    A total of 1 test files matched the specified pattern.
    No test matches the given testcase filter `(FullyQualifiedName~MxcRuntimePayloadTests)&(Category!=SlowGit)&(Category!=SlowDocker)` in C:\dev\Phantom.Workspaces-Skills\worktrees\9\Phantom.Workspaces.Docs.Tests\bin\Debug\net10.0\Phantom.Workspaces.Docs.Tests.dll
    Data collector 'Blame' message: All tests finished running, Sequence file will not be generated.
    Results File: C:\dev\Phantom.Workspaces-Skills\worktrees\9\Phantom.Workspaces.Docs.Tests\TestResults\jrowe_DAEMON_2026-09-08_10_01_03_net10.0.trx
    
    Test run for C:\dev\Phantom.Workspaces-Skills\worktrees\9\Phantom.Workspaces.Gui.Shared.Tests\bin\Debug\net10.0\Phantom.Workspaces.Gui.Shared.Tests.dll (.NETCoreApp,Version=v10.0)
    A total of 1 test files matched the specified pattern.
    No test matches the given testcase filter `(FullyQualifiedName~MxcRuntimePayloadTests)&(Category!=SlowGit)&(Category!=SlowDocker)` in C:\dev\Phantom.Workspaces-Skills\worktrees\9\Phantom.Workspaces.Gui.Shared.Tests\bin\Debug\net10.0\Phantom.Workspaces.Gui.Shared.Tests.dll
    Data collector 'Blame' message: All tests finished running, Sequence file will not be generated.
    Results File: C:\dev\Phantom.Workspaces-Skills\worktrees\9\Phantom.Workspaces.Gui.Shared.Tests\TestResults\jrowe_DAEMON_2026-09-08_10_01_05_net10.0.trx
    
    Test run for C:\dev\Phantom.Workspaces-Skills\worktrees\9\Phantom.Workspaces.Install.Tests\bin\Debug\net10.0\Phantom.Workspaces.Install.Tests.dll (.NETCoreApp,Version=v10.0)
    A total of 1 test files matched the specified pattern.
    Data collector 'Blame' message: All tests finished running, Sequence file will not be generated.
    Results File: C:\dev\Phantom.Workspaces-Skills\worktrees\9\Phantom.Workspaces.Install.Tests\TestResults\jrowe_DAEMON_2026-09-08_10_01_08_net10.0.trx
    
    Passed!  - Failed:     0, Passed:     8, Skipped:     0, Total:     8, Duration: 44 s - Phantom.Workspaces.Install.Tests.dll (net10.0)
    Test run for C:\dev\Phantom.Workspaces-Skills\worktrees\9\Phantom.Workspaces.IntegrationTests\bin\Debug\net10.0\Phantom.Workspaces.IntegrationTests.dll (.NETCoreApp,Version=v10.0)
    A total of 1 test files matched the specified pattern.
    No test matches the given testcase filter `(FullyQualifiedName~MxcRuntimePayloadTests)&(Category!=SlowGit)&(Category!=SlowDocker)` in C:\dev\Phantom.Workspaces-Skills\worktrees\9\Phantom.Workspaces.IntegrationTests\bin\Debug\net10.0\Phantom.Workspaces.IntegrationTests.dll
    Data collector 'Blame' message: All tests finished running, Sequence file will not be generated.
    Results File: C:\dev\Phantom.Workspaces-Skills\worktrees\9\Phantom.Workspaces.IntegrationTests\TestResults\jrowe_DAEMON_2026-09-08_10_01_52_net10.0.trx
    
    Test run for C:\dev\Phantom.Workspaces-Skills\worktrees\9\Phantom.Workspaces.Llm.Core.Tests\bin\Debug\net10.0\Phantom.Workspaces.Llm.Core.Tests.dll (.NETCoreApp,Version=v10.0)
    A total of 1 test files matched the specified pattern.
    [xUnit.net 00:00:00.22] Phantom.Workspaces.Llm.Core.Tests: Non-serializable data ('System.Object[]') found for 'Phantom.Workspaces.Llm.Core.Tests.CopilotSdkStreamAdapterTests.TranslateCopilotSdkSessionEvents_BenignLifecycleEvent_IsConsumedSilently'; falling back to single test case.
    No test matches the given testcase filter `(FullyQualifiedName~MxcRuntimePayloadTests)&(Category!=SlowGit)&(Category!=SlowDocker)` in C:\dev\Phantom.Workspaces-Skills\worktrees\9\Phantom.Workspaces.Llm.Core.Tests\bin\Debug\net10.0\Phantom.Workspaces.Llm.Core.Tests.dll
    Data collector 'Blame' message: All tests finished running, Sequence file will not be generated.
    Results File: C:\dev\Phantom.Workspaces-Skills\worktrees\9\Phantom.Workspaces.Llm.Core.Tests\TestResults\jrowe_DAEMON_2026-09-08_10_01_53_net10.0.trx
    
    Test run for C:\dev\Phantom.Workspaces-Skills\worktrees\9\Phantom.Workspaces.Tests\bin\Debug\net10.0\Phantom.Workspaces.Tests.dll (.NETCoreApp,Version=v10.0)
    A total of 1 test files matched the specified pattern.
    No test matches the given testcase filter `(FullyQualifiedName~MxcRuntimePayloadTests)&(Category!=SlowGit)&(Category!=SlowDocker)` in C:\dev\Phantom.Workspaces-Skills\worktrees\9\Phantom.Workspaces.Tests\bin\Debug\net10.0\Phantom.Workspaces.Tests.dll
    Data collector 'Blame' message: All tests finished running, Sequence file will not be generated.
    Results File: C:\dev\Phantom.Workspaces-Skills\worktrees\9\Phantom.Workspaces.Tests\TestResults\jrowe_DAEMON_2026-09-08_10_01_56_net10.0.trx
    
    Test run for C:\dev\Phantom.Workspaces-Skills\worktrees\9\Phantom.Workspaces.Tools.Tests\bin\Debug\net10.0\Phantom.Workspaces.Tools.Tests.dll (.NETCoreApp,Version=v10.0)
    A total of 1 test files matched the specified pattern.
    No test matches the given testcase filter `(FullyQualifiedName~MxcRuntimePayloadTests)&(Category!=SlowGit)&(Category!=SlowDocker)` in C:\dev\Phantom.Workspaces-Skills\worktrees\9\Phantom.Workspaces.Tools.Tests\bin\Debug\net10.0\Phantom.Workspaces.Tools.Tests.dll
    Data collector 'Blame' message: All tests finished running, Sequence file will not be generated.
    Results File: C:\dev\Phantom.Workspaces-Skills\worktrees\9\Phantom.Workspaces.Tools.Tests\TestResults\jrowe_DAEMON_2026-09-08_10_01_57_net10.0.trx
    
    Test run for C:\dev\Phantom.Workspaces-Skills\worktrees\9\Phantom.Workspaces.Transport.Tests\bin\Debug\net10.0\Phantom.Workspaces.Transport.Tests.dll (.NETCoreApp,Version=v10.0)
    A total of 1 test files matched the specified pattern.
    No test matches the given testcase filter `(FullyQualifiedName~MxcRuntimePayloadTests)&(Category!=SlowGit)&(Category!=SlowDocker)` in C:\dev\Phantom.Workspaces-Skills\worktrees\9\Phantom.Workspaces.Transport.Tests\bin\Debug\net10.0\Phantom.Workspaces.Transport.Tests.dll
    Data collector 'Blame' message: All tests finished running, Sequence file will not be generated.
    Results File: C:\dev\Phantom.Workspaces-Skills\worktrees\9\Phantom.Workspaces.Transport.Tests\TestResults\jrowe_DAEMON_2026-09-08_10_01_59_net10.0.trx
    
    Test run for C:\dev\Phantom.Workspaces-Skills\worktrees\9\Phantom.Workspaces.Web.Server.Tests\bin\Debug\net10.0\Phantom.Workspaces.Web.Server.Tests.dll (.NETCoreApp,Version=v10.0)
    A total of 1 test files matched the specified pattern.
    No test matches the given testcase filter `(FullyQualifiedName~MxcRuntimePayloadTests)&(Category!=SlowGit)&(Category!=SlowDocker)` in C:\dev\Phantom.Workspaces-Skills\worktrees\9\Phantom.Workspaces.Web.Server.Tests\bin\Debug\net10.0\Phantom.Workspaces.Web.Server.Tests.dll
    Data collector 'Blame' message: All tests finished running, Sequence file will not be generated.
    Results File: C:\dev\Phantom.Workspaces-Skills\worktrees\9\Phantom.Workspaces.Web.Server.Tests\TestResults\jrowe_DAEMON_2026-09-08_10_02_00_net10.0.trx
    
    Test run for C:\dev\Phantom.Workspaces-Skills\worktrees\9\Phantom.Workspaces.WebViewTests\bin\Debug\net10.0-windows\Phantom.Workspaces.WebViewTests.dll (.NETCoreApp,Version=v10.0)
    A total of 1 test files matched the specified pattern.
    No test matches the given testcase filter `(FullyQualifiedName~MxcRuntimePayloadTests)&(Category!=SlowGit)&(Category!=SlowDocker)` in C:\dev\Phantom.Workspaces-Skills\worktrees\9\Phantom.Workspaces.WebViewTests\bin\Debug\net10.0-windows\Phantom.Workspaces.WebViewTests.dll
    Data collector 'Blame' message: All tests finished running, Sequence file will not be generated.
    Results File: C:\dev\Phantom.Workspaces-Skills\worktrees\9\Phantom.Workspaces.WebViewTests\TestResults\jrowe_DAEMON_2026-09-08_10_02_02_net10.0.trx
    
    
    === Test Run Summary ===
    Executed : 8
    Passed   : 8
    Failed   : 0
    
  6. added a commit that references this issue on Sep 8, 2026
    388216c
  7. JoshuaRowePhantom commented on Sep 8, 2026

    @JoshuaRowePhantom
    OwnerAuthor

    Checked in

    Commit: 388216c
    Branch fast-forwarded: features -> 388216c

  8. JoshuaRowePhantom commented on Sep 10, 2026

    @JoshuaRowePhantom
    OwnerAuthor

    New occurrence — observed during check-in for #1489

    Failing test: Phantom.Workspaces.Install.Tests.MxcRuntimePayloadTests.MxcRuntimePayload_RequiredNativeUnit_IsPresent
    Result: All 144 tests passed, but vstest aborted after the 90-second inactivity timeout.
    Dump archived: dumps\1494\testhost_24604_20260910T123818_hangdump.dmp (plus 17 child-process dumps)

    Dump evidence

    dumpasync --completed false shows MxcRepositoryTestSupport.InvokeAsync still awaiting both Process.WaitForExitAsync and stdout/stderr ReadToEndAsync. parallelstacks shows the xUnit runner blocked in RunTestsInAssembly, with two pipe reads in RandomAccess.ReadAtOffset. This is the same failure mechanism previously tracked here, despite commit 388216c0.

    Root cause hypothesis

    A descendant of the nested dotnet publish still inherits and retains the redirected output handles, so the direct process exit is insufficient to complete the drain tasks. The previous build-server isolation does not cover every descendant in this invocation.

    Proposed solution

    Run the publish in a Windows Job Object configured to terminate the full process tree and prevent surviving descendants from retaining redirected handles; after process exit, explicitly close/cancel the pipe drains with a bounded timeout. Add a repeated regression test that verifies the helper completes after the published payload has been validated.

  9. JoshuaRowePhantom commented on Sep 11, 2026

    @JoshuaRowePhantom
    OwnerAuthor

    Correction — #1490 failure is branch-related

    The observed failure is not a new #1494 occurrence. #1494 tracks a post-test nested-publish hang; #1490 instead fails deterministically inside its new nested wrapper publish graph. No dump was produced.

    PublishCopilotWrapperLoose publishes the new wrapper after the parent application publish. The wrapper references Llm.Core -> Data.MongoDB -> Phantom.Workspaces.Containers, rebuilding Phantom.Workspaces.Containers with the same Release/RID output path already used by the parent publish. Both fast-suite attempts failed while recreating Phantom.Workspaces.Containers.runtimeconfig.json because it was locked. The #1490 publish target needs to isolate or avoid the duplicate project graph/output before check-in.

  10. 69 remaining items

  11. JoshuaRowePhantom commented on Sep 15, 2026

    @JoshuaRowePhantom
    OwnerAuthor

    Checked in

    Commit: ab476c8
    Branch fast-forwarded: features → ab476c8

    Validation: build clean; changed-test stability 10/10 (28/28 each); fast suite 7,378/7,378. A cold clean-input run passed 28/28 with default Debug/Release copilot.exe absent, native build observed only before testhost, and zero dumps.

  12. JoshuaRowePhantom commented on Sep 16, 2026

    @JoshuaRowePhantom
    OwnerAuthor

    Release packaging recurrence

    Workflow run 35084206887 passed the full test gate but failed production dotnet publish -c Release -r win-x64. PublishCopilotWrapperLoose passes relative obj\Release\net10.0\win-x64\copilot-wrapper\ as the child wrapper project's PublishDir. The child resolves that path under Phantom.Workspaces.Copilot.Cli.Wrapper and successfully publishes there, while the parent checks the same relative text under Phantom.Workspaces and reports the wrapper missing. Reopened for canonical absolute publish-path ownership and a clean production Release workflow regression.

  13. JoshuaRowePhantom commented on Sep 16, 2026

    @JoshuaRowePhantom
    OwnerAuthor

    Design — retry 9 canonical wrapper publish ownership

    Root cause

    PublishCopilotWrapperLoose derives _CopilotWrapperPublishDir from the parent project's relative IntermediateOutputPath and passes that relative text as the wrapper project's PublishDir. MSBuild resolves the child property beneath the wrapper project, while the parent validates and copies beneath Phantom.Workspaces, so production release publish fails after the child succeeds.

    Chosen approach

    Resolve a canonical, absolute, parent-owned wrapper staging directory before invoking the child. The directory will remain inside the canonical parent intermediate root, include configuration/RID and an invocation-unique component, use a normalized trailing separator, reject traversal and existing reparse-point ancestors, and be passed to the child with MSBuild escaping. Parent validation and copy consume the same exact output path. Prepared test-only/provenance paths remain build-free and unchanged.

    Add regression coverage for the path contract, spaces/custom intermediate roots, independent concurrent invocations, and missing child output. Extend the pre-VSTest prerequisite to run an actual clean isolated Release/win-x64 production publish using the workflow command shape, validate the final payload and ZIP, and record evidence for testhost assertions so no cold native build moves into test execution.

    Alternatives considered

    Resolving the relative path against the child or merely prefixing .. preserves split ownership and traversal ambiguity. A deterministic shared directory collides for concurrent same-RID publishes. Quoting alone does not canonicalize ownership. Running the cold production regression inside testhost would recreate the 90-second Blame failure this issue already fixed.

    Files

    • Phantom.Workspaces/Phantom.Workspaces.csproj
    • Phantom.Workspaces.Install.Tests/MxcIntegrationTests.cs
    • Phantom.Workspaces.Install.Tests/Phantom.Workspaces.Install.Tests.csproj
    • scripts/prepare-copilot-wrapper-test-prerequisite.ps1
  14. JoshuaRowePhantom commented on Sep 16, 2026

    @JoshuaRowePhantom
    OwnerAuthor

    Implementation notes — retry 9 canonical wrapper publish ownership

    Commit: 6721198a9877b70561845831c957583cf82a28d4

    Deviations from proposed design

    The release-equivalent prerequisite uses a short explicit parent wrapper-intermediate root while keeping the rest of the production graph under isolated SDK artifacts. This avoids Windows MAX_PATH failures in the deliberately deep immutable prerequisite cache; ordinary production publishing still derives directly from the parent IntermediateOutputPath.

    The workflow validator exposed that Copilot CLI 1.0.83 no longer accepts --version. Its startup smoke now launches with no server-mode arguments and requires the runtime's exact expected argument-validation response instead of skipping host-RID startup.

    Scope changes

    Added explicit child-side equality validation for the parent-owned absolute PublishDir, reparse-point rejection, invocation-unique configuration/RID staging, custom BaseIntermediateOutputPath and IntermediateOutputPath coverage (including spaces/traversal normalization), concurrent isolation, and a fail-closed missing-child test. Prepared test-only provenance remains build-free.

    Files changed

    • Phantom.Workspaces/Phantom.Workspaces.csproj
    • Phantom.Workspaces.Copilot.Cli.Wrapper/Phantom.Workspaces.Copilot.Cli.Wrapper.csproj
    • Phantom.Workspaces.Install.Tests/MxcIntegrationTests.cs
    • Phantom.Workspaces.Install.Tests/CopilotWrapperPackagingTests.cs
    • scripts/prepare-copilot-wrapper-test-prerequisite.ps1
    • packaging/validate/Assert-CopilotRuntimePayload.ps1
    • docs/design/build-and-installation.md

    Verification

    • Build: 0 warnings, 0 errors.
    • Targeted: 18/18.
    • Targeted stability: 10/10, 180/180.
    • Fast: 7,422/7,422.
    • Full: 7,654/7,654. One earlier unrelated transient ACL assertion passed focused recheck and the full rerun.
    • Exact dotnet publish Phantom.Workspaces.csproj -c Release -r win-x64 -o <path with spaces> succeeded after deleting its Release intermediate, with identical absolute parent/child wrapper paths.
    • Workflow payload validators, release ZIP creation/checksum, and both ZIP validators passed.
  15. JoshuaRowePhantom commented on Sep 16, 2026

    @JoshuaRowePhantom
    OwnerAuthor

    Verification result

    Status: ❌ 1 issue(s) found
    Commit checked (features..HEAD): 6721198a Fix #1494: canonicalize wrapper publish ownership (424 insertions, 7 files)

    Fresh independent re-verification (no reliance on implementer notes). The wrapper publish-ownership fix itself is sound, but the same commit introduces a new, release-workflow-breaking regression in the Copilot startup smoke — so the reopen's core requirement (a clean, green production Release / win-x64 publish) is still not met.

    Outstanding gaps (1)

    1. Copilot startup-smoke change leaves $LASTEXITCODE = 1, failing the shell: pwsh publish step (release.yml + publish-validation.yml).

    • The commit flips packaging/validate/Assert-CopilotRuntimePayload.ps1's smoke from copilot.exe --version (expects exit 0, as on main) to a no-arg launch that expects exit 1:
      $startup = & $copilotExe 2>&1
      if ($LASTEXITCODE -ne 1 -or ($startup | Out-String) -notmatch 'SDK server mode requires --server or --headless') { throw ... }
      Write-Host "OK  Copilot runtime launches and validates server mode."
      On the success path it never resets $LASTEXITCODE, so it stays 1.
    • In release.yml ("Publish and package win-x64") and publish-validation.yml, the validators run in-process inside a single shell: pwsh step. The last native command in the loop body is this Copilot smoke; everything after it (Assert-MxcRuntimePayload.ps1, New-ReleaseZip.ps1, Assert-*Zip.ps1, the final Out-File) is managed and never resets $LASTEXITCODE.
    • GitHub's pwsh runner writes the step to a temp .ps1 and appends if ((Test-Path -LiteralPath variable:\LASTEXITCODE)) { exit $LASTEXITCODE }. With $LASTEXITCODE = 1 at step end, the step process exits 1 and the step FAILS even though every validation logically passed. (dotnet publish is the only native call with an explicit if ($LASTEXITCODE -ne 0){throw} guard; the smoke has none.)

    Reproduced (ironclad, current): ran the real Assert-CopilotRuntimePayload.ps1 + Assert-MxcRuntimePayload.ps1 against a real clean -c Release -r win-x64 payload (published without -p:Version), wrapped exactly as GitHub does ($ErrorActionPreference='stop' prefix + the exit $LASTEXITCODE suffix, invoked via pwsh -command ". '<tempfile>'"):

    OK  Copilot runtime present: ...\native\copilot.exe
    OK  Copilot MXC wrapper present: ...
    OK  Copilot CLI LICENSE.md present: ...
    OK  Copilot runtime launches and validates server mode.
    Copilot runtime payload validation passed for win-x64.
    MXC managed assembly/native runtime version validated: 0.8.0
    MXC runtime payload validation passed for win-x64.
    
    CHILD PWSH PROCESS EXIT CODE = 1   -> GitHub marks the step FAILED
    

    Corroboration: publish-validation.yml on main is consistently green because its --version smoke ends with exit 0; no CI run exists for 6721198a (local-only branch). copilot.exe no-arg exits 1 in ~50 ms with stderr copilot-runtime: SDK server mode requires --server or --headless.

    Suggested fix (not applied — read-only): after a passing smoke, reset the code — e.g. $global:LASTEXITCODE = 0 (or exit 0) at the end of Assert-CopilotRuntimePayload.ps1; ideally also wrap the native call in try/catch so it survives runners where $PSNativeCommandUseErrorActionPreference is $true (there the & $copilotExe exit-1 would throw before the check). Alternatively neutralise $LASTEXITCODE in the workflow steps after the payload assertions.

    Verified sound (no gaps)

    • Wrapper publish ownership (the reopen's root cause): parent ResolveCopilotWrapperPublishDirectory computes a canonical absolute dir Path.GetFullPath(<projectRoot>\<IntermediateOutputPath>)\cw\SafeSegment(Config)\SafeSegment(RID)\<16-hex GUID> and passes it to the child as both PublishDir and CopilotWrapperParentPublishDirectory (MSBuild-escaped); child ValidateParentOwnedPublishDirectory (AfterTargets=Publish) fails closed on any mismatch. Confirmed in the live test log: parent == child == ...\artifacts\cw-*\cw\Release\win-x64\<guid>, "child confirmed parent PublishDir".
    • Adversarial checks pass: custom BaseIntermediateOutputPath/IntermediateOutputPath (incl. paths with spaces) resolve under the parent root; configuration/RID separated via SafeSegment; per-invocation GUID isolates concurrent publishes; reparse/junction rejected; path traversal confined; trailing-separator/escaping handled; no local/absolute paths baked into published output or validators.
    • Real clean production publish (dotnet publish -c Release -r win-x64, no -p:Version) yields a correct nested payload; all four validators (Copilot payload/zip, MXC payload/zip) pass logically. The MXC -p:Version concern was a local-harness artifact — Phantom.Workspaces does not ProjectReference Microsoft.Mxc.Sdk (MXC native is file-copied), and publish-validation.yml is green on main with -p:Version=0.0.0-validation.
    • New child .csproj properties cannot redirect production output unsafely (parent-owned absolute path + fail-closed validation); the test-only prepared path/provenance still works without an in-testhost cold build (prep runs via BeforeTargets=VSTest, manifest-cached).

    Tests

    Targeted classes CopilotWrapperNestedPublishTests, CopilotWrapperPackagingTests, MxcRuntimePayloadTests, MxcSdkVersionTests via scripts\run-tests.ps1 — 38/38 passed, 0 failed, 0 crash dumps.

    Passed!  - Failed:     0, Passed:    38, Skipped:     0, Total:    38, Duration: 1 m 25 s - Phantom.Workspaces.Install.Tests.dll (net10.0)
    
    === Test Run Summary ===
    Executed : 38
    Passed   : 38
    Failed   : 0
    

    10-run stability (run-tests.ps1, back-to-back, -NoBuild): 10/10 × 38/38, 0 failures, 0 .dmp.

    iter  1: Passed!  - Failed: 0, Passed: 38, Total: 38 | dmp=0
    iter  2: Passed!  - Failed: 0, Passed: 38, Total: 38 | dmp=0
    iter  3: Passed!  - Failed: 0, Passed: 38, Total: 38 | dmp=0
    iter  4: Passed!  - Failed: 0, Passed: 38, Total: 38 | dmp=0
    iter  5: Passed!  - Failed: 0, Passed: 38, Total: 38 | dmp=0
    iter  6: Passed!  - Failed: 0, Passed: 38, Total: 38 | dmp=0
    iter  7: Passed!  - Failed: 0, Passed: 38, Total: 38 | dmp=0
    iter  8: Passed!  - Failed: 0, Passed: 38, Total: 38 | dmp=0
    iter  9: Passed!  - Failed: 0, Passed: 38, Total: 38 | dmp=0
    iter 10: Passed!  - Failed: 0, Passed: 38, Total: 38 | dmp=0
    

    Verdict: issues:1. The publish-ownership fix is verified sound, but the accompanying startup-smoke change must reset $LASTEXITCODE (or the workflow must neutralise it) before this can produce a green production Release publish.

  16. JoshuaRowePhantom commented on Sep 16, 2026

    @JoshuaRowePhantom
    OwnerAuthor

    Design — retry 9 verification correction

    The single outstanding gap is confined to the Copilot payload validator. Capture the no-argument runtime's expected exit code while temporarily disabling PSNativeCommandUseErrorActionPreference, preserving merged stdout/stderr and converting actual launch failures to explicit validator failures. Validate exit/message, then reset $global:LASTEXITCODE to zero so GitHub's injected pwsh epilogue cannot reinterpret accepted exit 1 as step failure.

    Add a child-pwsh regression that reproduces GitHub's ErrorActionPreference=Stop, native-error preference, final-command invocation, and exit $LASTEXITCODE epilogue against the real prepared runtime. The same seam will prove an unexpected real executable exit and an unlaunchable executable still fail. Audit confirms no other release validator directly accepts a native nonzero code; ZIP validation delegates to this validator and inherits the reset.

  17. JoshuaRowePhantom commented on Sep 16, 2026

    @JoshuaRowePhantom
    OwnerAuthor

    Retry 9 verification correction implemented

    Commit: f04c8524bccf8aab60762806e3a1ccb7474e77c9

    • The expected no-argument Copilot exit 1 is now captured with native-error promotion temporarily disabled and the caller preference restored in finally.
    • Launch exceptions, unexpected exit codes, and diagnostic mismatches still fail closed; stdout/stderr validation is unchanged.
    • A successful validator explicitly resets global LASTEXITCODE to 0, including ZIP-validator delegation.
    • Added real child-pwsh coverage reproducing GitHub's stop preference and final LASTEXITCODE epilogue under both normal and PSNativeCommandUseErrorActionPreference=true; accepted exit 1 returns 0, while real unexpected-exit and launch-failure cases return nonzero.
    • Audited all packaging/validate scripts: no other validator directly accepts a nonzero native exit. Assert-CopilotRuntimeZip.ps1 delegates to the corrected payload validator.

    Validation:

    • Targeted: 42/42 passed.
    • Stability: 10 runs, 420/420 passed.
    • Clean production Release/win-x64 publish to a path with spaces passed; canonical parent/child wrapper path logged identically.
    • Loose Copilot/MXC validators, release ZIP creation, SHA-256, and final Copilot/MXC ZIP validators all passed with native-error promotion enabled; both Copilot validators left LASTEXITCODE=0.

    No push, amend, or rebase performed.

  18. JoshuaRowePhantom commented on Sep 16, 2026

    @JoshuaRowePhantom
    OwnerAuthor

    Verification result

    Status: ✅ Verified
    Branch: fix/1494-canonical-wrapper-publish-retry9 · worktree worktrees\9
    Commits checked (features c3336da0 → HEAD):

    f04c8524 Fix Copilot validator native exit state
    6721198a Fix #1494: canonicalize wrapper publish ownership
    

    Independent, reasoning-isolated re-verification of the entire retry-9 change (base 6721198a and correction f04c8524, reviewed as a whole, not just the final diff). The prior authoritative verification (the 15:27 comment) recorded a single gap — the no-arg Copilot startup smoke leaving $LASTEXITCODE = 1 and failing the shell: pwsh publish step. That gap is now closed and every contract is independently proven.

    Outstanding gaps

    None — all criteria satisfied.

    Contract evidence

    1. Canonical, parent-owned wrapper publish path (exactly passed, validated, copied, checked).
    ResolveCopilotWrapperPublishDirectory (Roslyn task, parent .csproj) computes Path.GetFullPath(<projectDir>\<IntermediateOutputPath>)\cw\SafeSegment(Config)\SafeSegment(RID)\<16-hex GUID>\, rejects reparse-point ancestors, SafeSegment neutralises traversal/.. (.→_), enforces a StartsWith(intermediatePrefix) containment guard, and emits a normalized trailing separator. It is passed to the child as both PublishDir and CopilotWrapperParentPublishDirectory ([MSBuild]::Escape). The child's ValidateParentOwnedPublishDirectory (AfterTargets=Publish) fails closed on any canonical mismatch; the parent then !Exists-checks and copies from that same path into runtimes\<rid>\native.

    • Real clean dotnet publish -c Release -r win-x64 (deleted Release intermediates first) → exit 0, log proved parent Copilot wrapper child PublishDir: == child confirmed parent PublishDir: == ...\obj\Release\net10.0\win-x64\cw\Release\win-x64\e06e637bea744c3e (identical absolute path; config/RID separated; invocation-unique).
    • Adversarial regressions all green: custom IntermediateOutputPath/BaseIntermediateOutputPath with spaces + .. stay under the canonical root; two concurrent same-RID publishes resolve to distinct invocation dirs; a junction intermediate is rejected with cannot traverse reparse point before any child output; SimulateMissingCopilotWrapperChildOutputForTests proves the !Exists check fails closed (Copilot MXC wrapper was not published).

    2. Prepared inputs stay test-only / build-free / provenance-verified; cold native prerequisite stays outside testhost.
    ValidatePreparedCopilotPayload requires UsePreparedCopilotPayloadForTests=true (test-only), NoBuild=true (build-free), a fully-qualified existing PreparedCopilotPayloadDirectory (canonical-path restricted), rejects legacy properties, gates the new SimulateMissing… flag to true-only, and hashes every prepared artifact against its provenance SHA-256. The cold production publish runs from scripts\prepare-copilot-wrapper-test-prerequisite.ps1 via <Target BeforeTargets="VSTest"><Exec>pwsh …</Exec> — an MSBuild-phase step outside the testhost process (the original hang cause), manifest-cached (schema v4, ProductionPublishValidated).

    3. No-arg Copilot smoke — real process-exit behaviour.
    The smoke launches copilot.exe with native-error promotion temporarily disabled (restored in finally), requires exit 1 and SDK server mode requires --server or --headless, converts launch failures to explicit throws, and resets $global:LASTEXITCODE = 0 on success. Verified by actual child-process exit code, not script state:

    • RuntimePayload_GitHubFinalCommand_AcceptedNativeExitIsClean (Theory, PSNativeCommandUseErrorActionPreference ∈ {false,true}) → child pwsh -File with GitHub's exit $LASTEXITCODE epilogue exits 0.
    • Unexpected real exit (whoami.exe, exit 0) → fails with did not reach expected server-mode argument validation (exit 0).
    • Unlaunchable executable (garbage bytes) → fails with copilot.exe could not be launched.
    • End-to-end, GitHub-faithful: ran the exact release.yml post-publish body (Copilot payload → MXC payload → New-ReleaseZip → Copilot zip → MXC zip) inside pwsh -File with $ErrorActionPreference='stop', $PSNativeCommandUseErrorActionPreference=$true, and the exit $LASTEXITCODE epilogue, against the real clean Release/win-x64 payload → STEP-BODY-COMPLETED LASTEXITCODE=0 and child process exit code = 0 (smoke validated server mode twice).

    4. Sibling validator audit.
    Only Assert-CopilotRuntimePayload.ps1 accepts a non-zero native exit. Assert-MxcRuntimePayload, Assert-MxcSdkVersion (in-process NativeLibrary.Load, no subprocess), Assert-MxcRuntimeZip, Assert-CopilotSdkVersion, and New-ReleaseZip are managed/in-process and never leave a non-zero $LASTEXITCODE; Assert-CopilotRuntimeZip delegates to the corrected payload validator and inherits its reset. The end-to-end step ending at exit 0 confirms no sibling leak.

    5. Tests / stability / real publish. See below. (Data-flow: parent path → child validation → copy → payload → zip → validator, every link exercised.)

    Note (non-blocking, no gap): the smoke's exit==1 & wrong-output sub-branch has no dedicated synthetic test; the throw path (via the wrong-exit case) and the output-regex positive (via the real-copilot.exe accepted case) are both covered, so a regex regression would surface. Recorded only for transparency.

    Tests

    Targeted via scripts\run-tests.ps1 -Mode fast -TestNames CopilotWrapperNestedPublishTests,CopilotWrapperPackagingTests,MxcRuntimePayloadTests,MxcSdkVersionTests (never direct dotnet test):

    Passed!  - Failed: 0, Passed: 42, Skipped: 0, Total: 42 - Phantom.Workspaces.Install.Tests.dll (net10.0)
    === Test Run Summary ===  Executed : 42  Passed : 42  Failed : 0
    

    10-run stability (-NoBuild, isolated) — 10/10 × 42/42, 0 failed, 0 .dmp:

    iter  1: Passed! - Failed: 0, Passed: 42, Total: 42 | dmp=0
    iter  2: Passed! - Failed: 0, Passed: 42, Total: 42 | dmp=0
    iter  3: Passed! - Failed: 0, Passed: 42, Total: 42 | dmp=0
    iter  4: Passed! - Failed: 0, Passed: 42, Total: 42 | dmp=0
    iter  5: Passed! - Failed: 0, Passed: 42, Total: 42 | dmp=0
    iter  6: Passed! - Failed: 0, Passed: 42, Total: 42 | dmp=0
    iter  7: Passed! - Failed: 0, Passed: 42, Total: 42 | dmp=0
    iter  8: Passed! - Failed: 0, Passed: 42, Total: 42 | dmp=0
    iter  9: Passed! - Failed: 0, Passed: 42, Total: 42 | dmp=0
    iter 10: Passed! - Failed: 0, Passed: 42, Total: 42 | dmp=0
    

    Real clean -c Release -r win-x64 publish + full release.yml validator sequence (GitHub-faithful pwsh step) → exit 0. No skipped/quarantined tests, no Task.Delay/Thread.Sleep/polling (a test even asserts the prep script has no Start-Sleep), no new UI-thread/lock sync-blocking, no unbacked TODOs. Read-only: no source edits, commits, pushes, or merges; scratch kept under gitignored paths and removed; tracked worktree clean; 0 crash dumps.

    Verdict: verified — the reopen's core requirement (a clean, green production Release/win-x64 publish + validator path with correct canonical wrapper ownership and no leaked shell status) is met.

  19. added a commit that references this issue on Sep 16, 2026
    6721198
  20. JoshuaRowePhantom commented on Sep 16, 2026

    @JoshuaRowePhantom
    OwnerAuthor

    Checked in

    Commit: f04c852
    Branch fast-forwarded: features → f04c852

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Labels

verified-locallyImplementation has been verified locally

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions