Skip to content

aspire start crashes TypeScript AppHosts on macOS after DCP fork-process launch #19502

Description

@adamint

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

  1. Install Aspire CLI 13.5.0 on macOS arm64.
  2. Create or open a TypeScript AppHost.
  3. 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.

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions