Summary
aspire start from the 13.5 CLI fails for TypeScript AppHosts on macOS arm64. The same projects start with 13.4.6, and aspire run still works with 13.5.
Repro
- Install Aspire CLI 13.5.0 on macOS arm64.
- Create or open a TypeScript AppHost.
- Run
aspire start.
The outer command exits with code 2. The detached child is reported as exit code 255.
Root cause
#18678 changed Unix detached startup to launch through DCP fork-process. A NativeAOT Aspire CLI launched through that path segfaults while deserializing the TypeScript generateCode JSON-RPC response:
System.Text.Json.Utf8JsonReader.ConsumeStringAndValidate
StreamJsonRpc.SystemTextJsonFormatter.JsonRpcResult.SetExpectedResultType
StreamJsonRpc.JsonRpc.HandleRpcAsync
DCP reports the signaled child as -1, which is exposed as Unix exit code 255. Direct launch and direct setsid() launch both succeed; DCP launch reproduces without monitoring and through re-exec wrappers. The exact lower-level macOS/runtime process-state difference is not yet identified, but the DCP launch boundary is deterministic.
The Security.framework frames in the crash report are from an unrelated finalizer thread. Certificate export is not reached.
CI gap
The TypeScript aspire start E2E test runs only on Linux. macOS unit tests use a fake DCP and a shell child, so they validate launcher plumbing without exercising the shipped macOS arm64 NativeAOT CLI and TypeScript JSON-RPC path. There is no post-publication smoke test for the macOS asset.
Proposed fix
Use the pre-13.5 direct detached launch path on macOS while retaining DCP fork-process on Linux. Add a macOS test that fails if the DCP launcher is invoked.
Summary
aspire startfrom the 13.5 CLI fails for TypeScript AppHosts on macOS arm64. The same projects start with 13.4.6, andaspire runstill works with 13.5.Repro
aspire start.The outer command exits with code 2. The detached child is reported as exit code 255.
Root cause
#18678 changed Unix detached startup to launch through DCP
fork-process. A NativeAOT Aspire CLI launched through that path segfaults while deserializing the TypeScriptgenerateCodeJSON-RPC response:DCP reports the signaled child as
-1, which is exposed as Unix exit code 255. Direct launch and directsetsid()launch both succeed; DCP launch reproduces without monitoring and through re-exec wrappers. The exact lower-level macOS/runtime process-state difference is not yet identified, but the DCP launch boundary is deterministic.The Security.framework frames in the crash report are from an unrelated finalizer thread. Certificate export is not reached.
CI gap
The TypeScript
aspire startE2E test runs only on Linux. macOS unit tests use a fake DCP and a shell child, so they validate launcher plumbing without exercising the shipped macOS arm64 NativeAOT CLI and TypeScript JSON-RPC path. There is no post-publication smoke test for the macOS asset.Proposed fix
Use the pre-13.5 direct detached launch path on macOS while retaining DCP
fork-processon Linux. Add a macOS test that fails if the DCP launcher is invoked.