Skip to content
Open
Show file tree
Hide file tree
Changes from 58 commits
Commits
Show all changes
66 commits
Select commit Hold shift + click to select a range
a55fa46
Explore lean native hosting feasibility
davidfowl Oct 10, 2026
41ec4cb
Explore native hosting compatibility edges
davidfowl Oct 10, 2026
999d9d9
Explore native DCP primitives with Redis and PostgreSQL ports
davidfowl Oct 10, 2026
357d7ac
Explore custom resource lifecycle with a Dev Tunnels port
davidfowl Oct 10, 2026
bb6f2ae
Explore ATS-native AppHost server and integration ports
davidfowl Oct 10, 2026
c44bd60
Wire the native ATS hosting experiment into aspire run
davidfowl Oct 10, 2026
8145040
Explore ATS-native AppHost contracts and v2 integration authoring
davidfowl Oct 10, 2026
d8bd7f6
Add validated ATS-native model annotations to hosting experiment
davidfowl Oct 10, 2026
f95c659
Build ATS-native AppHost server with resource-preserving revisions
davidfowl Oct 11, 2026
586ee2e
Preserve CLI contracts and generalize native server policies
davidfowl Oct 11, 2026
1d10f9e
Document current native composition comparison boundaries
davidfowl Oct 11, 2026
6ec0462
Record native server swap measurements and neutralize fixture process…
davidfowl Oct 11, 2026
8167609
Implement native auxiliary backchannel contracts and verify server swaps
davidfowl Oct 11, 2026
d5f3fa4
Extract minimal native hosting kernel and generalize workload contracts
davidfowl Oct 11, 2026
d1f8583
Record final native baseline and diagnose stalled fixture shutdown
davidfowl Oct 11, 2026
3e73af9
Preserve auxiliary removals and isolate unexpected request failures
davidfowl Oct 11, 2026
acd0823
Document verified auxiliary semantics and refreshed native footprint
davidfowl Oct 11, 2026
5d493ca
Complete dismissed native Dashboard confirmations as rejected
davidfowl Oct 11, 2026
0c53af0
Use typed native boundaries, diagnostic channels, and injectable clocks
davidfowl Oct 11, 2026
55a766a
Fix native compiler references and PR feedback regressions
davidfowl Oct 11, 2026
5b41044
Release backchannel stream capacity on natural completion
davidfowl Oct 11, 2026
d60a260
Pass explicit server launch mode from the native CLI override
davidfowl Oct 11, 2026
b16ea9f
Target native hosting at .NET 11 with replaceable RPC and logging
davidfowl Oct 11, 2026
b602d1e
Exclude non-integration native bindings from managed ATS compatibilit…
davidfowl Oct 11, 2026
92e34d7
Clarify native integration authoring and existing-integration accepta…
davidfowl Oct 11, 2026
e39f682
Add native declarative hosting and real C# and TypeScript Redis integ…
davidfowl Oct 12, 2026
89d4f08
Preserve fluent builder authoring over native ATS hosting
davidfowl Oct 12, 2026
d14684c
Fix native provider shutdown and lifecycle cleanup
davidfowl Oct 12, 2026
6817d94
Refine native hosting lifetime and authoring contracts
davidfowl Oct 12, 2026
6c392b7
Separate provider protocol parsing from invocation ownership
davidfowl Oct 12, 2026
6e18215
Bound native provider shutdown and tolerate normal exit races
davidfowl Oct 12, 2026
8664899
Drain C# provider resource invocations before local disposal
davidfowl Oct 12, 2026
440f6f1
Preserve cleanup-only workspace authority for retirement retries
davidfowl Oct 12, 2026
43a46a1
Serialize native workload mutations with symbolic configuration
davidfowl Oct 12, 2026
4f7a4db
Drain native integration fixture requests before disconnecting
davidfowl Oct 12, 2026
3421174
Reduce native RPC parsing and observation allocations
davidfowl Oct 12, 2026
c91a59d
Remove obsolete native hosting prototypes and simplify model guide
davidfowl Oct 12, 2026
4592de5
Refine native hosting boundaries and provider activation cleanup
davidfowl Oct 13, 2026
c114106
Refactor native provider projections and RPC protocol boundaries
davidfowl Oct 13, 2026
4f1f3c9
Release disconnected provider routes and bound activation cleanup
davidfowl Oct 13, 2026
9b61bb9
Ship AppHost Server v2 behind a project-scoped CLI feature flag
davidfowl Oct 13, 2026
6384d47
Merge latest main into AppHost Server v2
davidfowl Oct 13, 2026
69dea46
Retain independent workload cleanup leases and monitor the launching CLI
davidfowl Oct 13, 2026
2fe389d
Fix CI bundle publish logging and update native payload fixtures
davidfowl Oct 13, 2026
e399feb
Use the repository dotnet host for ATS build-time generators
davidfowl Oct 13, 2026
5ead876
Retain bundle tooling for AppHost Server v2 developer overrides
davidfowl Oct 13, 2026
0b74e0b
Address v2 feedback and support Windows guest RPC
davidfowl Oct 13, 2026
6b6c18a
Keep named-pipe regression paths within Unix socket limits
davidfowl Oct 13, 2026
b940090
Expand v2 integration authoring with worked code examples
davidfowl Oct 14, 2026
ef1c879
Add native RPC authoring and cycle-safe workload allocation
davidfowl Oct 14, 2026
6ed4096
Document integration-host codegen discovery and process lifetimes
davidfowl Oct 14, 2026
f756cd0
Separate native provider parsing, policy and code generation
davidfowl Oct 15, 2026
441c568
Merge latest main into native runtime feasibility branch
davidfowl Oct 15, 2026
729a089
Address native host review feedback and repair CI smoke expectations
davidfowl Oct 15, 2026
d5d2604
Fix readiness-cycle expectation in native revision smoke
davidfowl Oct 15, 2026
8f236b5
Align v2 Compose authoring and deployment pipelines
davidfowl Oct 17, 2026
5521946
Add native CSharp Docker Compose comparison integration
davidfowl Oct 17, 2026
1e2cec0
Address native backchannel, layout and feature configuration reviews
davidfowl Oct 17, 2026
c277c18
Use portable executable paths in native Compose test fixture
davidfowl Oct 17, 2026
705c640
Align native IPC ownership and DCP environment policy with Hosting
davidfowl Oct 18, 2026
b8b4a24
Address native host project and integration lifecycle feedback
davidfowl Oct 18, 2026
246ff36
Await ordered native retirement without replaying startup failures
davidfowl Oct 18, 2026
105693e
Drain native guest lifetimes before host shutdown
davidfowl Oct 18, 2026
64e5860
Cover managed dashboard assembly launch and scoped CLI stops
davidfowl Oct 18, 2026
d54aa38
Make native hosting tests deterministic and snapshot generated artifacts
davidfowl Oct 19, 2026
564f480
Validate native contract fingerprints without platform-specific snaps…
davidfowl Oct 19, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
127 changes: 127 additions & 0 deletions .github/workflows/native-hosting-validation.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,127 @@
# Native.Core.Tests builds AotSmoke but does not execute it. This independent lane
# executes the published binaries and generated SDK against real Docker, DCP and Chromium.
name: Native hosting validation

on:
pull_request:
paths:
# Broad source/build coverage intentionally includes transitive MSBuild dependencies,
# linked files and runtime-only CLI/Dashboard/codegen inputs without a second project graph.
- 'src/**'
- 'playground/NativeIntegrations/**'
- 'eng/**'
- 'tests/Aspire.Hosting.Native.Core.Tests/**'
- 'tests/PolyglotAppHosts/Aspire.Hosting/TypeScript/package.json'
Comment thread
davidfowl marked this conversation as resolved.
- 'tests/PolyglotAppHosts/Aspire.Hosting.Docker/TypeScript/apphost.mts'
- 'tests/Directory.Build.*'
- 'tests/Shared/**'
- 'Directory.*'
- '*.props'
- '*.targets'
- '.editorconfig'
- '.config/**'
- 'global.json'
- 'NuGet.config'
- 'Aspire.slnx'
- 'restore.sh'
- 'build.sh'
- '.github/workflows/native-hosting-validation.yml'
push:
branches: [main, 'release/**']
paths:
- 'src/**'
- 'playground/NativeIntegrations/**'
- 'eng/**'
- 'tests/Aspire.Hosting.Native.Core.Tests/**'
- 'tests/PolyglotAppHosts/Aspire.Hosting/TypeScript/package.json'
- 'tests/PolyglotAppHosts/Aspire.Hosting.Docker/TypeScript/apphost.mts'
- 'tests/Directory.Build.*'
- 'tests/Shared/**'
- 'Directory.*'
- '*.props'
- '*.targets'
- '.editorconfig'
- '.config/**'
- 'global.json'
- 'NuGet.config'
- 'Aspire.slnx'
- 'restore.sh'
- 'build.sh'
- '.github/workflows/native-hosting-validation.yml'
workflow_dispatch:

permissions:
contents: read

concurrency:
group: native-hosting-${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
cancel-in-progress: true

jobs:
windows_rpc:
name: Windows v2 CLI and named-pipe RPC
runs-on: windows-latest
timeout-minutes: 25
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
persist-credentials: false
- uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0
with:
node-version: '24'
package-manager-cache: false
- name: Execute Windows product and transport tests
shell: pwsh
run: |
./restore.cmd
if ($LASTEXITCODE -ne 0) { exit $LASTEXITCODE }
$env:DOTNET_ROOT = "$env:GITHUB_WORKSPACE/.dotnet"
$env:PATH = "$env:DOTNET_ROOT;$env:PATH"
$env:MSBUILDTERMINALLOGGER = 'false'
dotnet build src/Aspire.Cli/Aspire.Cli.csproj -c Debug
if ($LASTEXITCODE -ne 0) { exit $LASTEXITCODE }
dotnet publish src/Aspire.Hosting.Native.Server/Aspire.Hosting.Native.Server.csproj -c Release -r win-x64 -o artifacts/native-hosting/windows/server
if ($LASTEXITCODE -ne 0) { exit $LASTEXITCODE }
$cli = dotnet msbuild src/Aspire.Cli/Aspire.Cli.csproj -nologo -getProperty:TargetPath
if ($LASTEXITCODE -ne 0) { exit $LASTEXITCODE }
$env:ASPIRE_NATIVE_PRODUCT_CLI = Join-Path (Split-Path $cli) 'aspire.exe'
$env:ASPIRE_NATIVE_CSHARP_TEST_SERVER = "$env:GITHUB_WORKSPACE/artifacts/native-hosting/windows/server/Aspire.Hosting.Native.Server.exe"
dotnet test --project tests/Aspire.Hosting.Native.Core.Tests/Aspire.Hosting.Native.Core.Tests.csproj --no-launch-profile -- --filter-class '*.NativeNamedPipeTests' --filter-class '*.NativeProductCliTests' --filter-not-trait 'quarantined=true' --filter-not-trait 'outerloop=true' --report-trx --report-trx-filename native-windows.trx --results-directory artifacts/TestResults/native-windows
exit $LASTEXITCODE
- name: Upload Windows test evidence
if: always()
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
with:
name: native-hosting-windows
path: artifacts/TestResults/
if-no-files-found: warn
retention-days: 7

native_hosting:
name: Native AOT, generated SDK, Docker, DCP, CLI and Dashboard
runs-on: ubuntu-latest
timeout-minutes: 35
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
persist-credentials: false
- uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0
Comment thread
davidfowl marked this conversation as resolved.
Fixed
with:
node-version: '24'
package-manager-cache: false
- name: Execute native hosting validation
run: bash eng/scripts/test-native-hosting.sh linux-x64
- name: Upload native hosting evidence
if: always()
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
with:
name: native-hosting-linux-x64
path: |
artifacts/native-hosting/ci/logs/
artifacts/native-hosting/native-dashboard.png
artifacts/native-hosting/ci/cli-apphost/*proof.json
artifacts/native-hosting/ci/compose-apphosts/**/proof.json
artifacts/native-hosting/ci/compose-apphosts/**/*.log
artifacts/native-hosting/ci/compose-apphosts/**/published/compose.yaml
if-no-files-found: warn
retention-days: 7
8 changes: 8 additions & 0 deletions .github/workflows/typescript-api-compat.yml
Original file line number Diff line number Diff line change
Expand Up @@ -113,6 +113,14 @@ jobs:
proj_name=$(basename "$proj")
csproj="$proj/$proj_name.csproj"
if [ -f "$csproj" ]; then
# Native server bindings have their own ATS contract, not a managed
# Hosting integration surface that sdk dump can load.
polyglot_compatible=$(./dotnet.sh msbuild "$csproj" -nologo -getProperty:IsAspirePolyglotCompatible | tr -d '[:space:]' | tr '[:upper:]' '[:lower:]')
if [ "$polyglot_compatible" = "false" ]; then
echo "Skipping non-integration project $proj_name"
continue
fi

disable_package_baseline_validation=$(./dotnet.sh msbuild "$csproj" -nologo -getProperty:DisablePackageBaselineValidation | tr -d '[:space:]' | tr '[:upper:]' '[:lower:]')
if [ "$disable_package_baseline_validation" = "true" ]; then
echo "$proj_name" >> "$EXCLUDED_PACKAGES_FILE"
Expand Down
17 changes: 17 additions & 0 deletions Aspire.slnx
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,7 @@
<Project Path="src/Aspire.Dashboard/Aspire.Dashboard.csproj" />
<Project Path="src/Aspire.Hosting.Analyzers/Aspire.Hosting.Analyzers.csproj" />
<Project Path="src/Aspire.Hosting.AppHost/Aspire.Hosting.AppHost.csproj" />
<Project Path="src/Aspire.Hosting.Ats.Abstractions/Aspire.Hosting.Ats.Abstractions.csproj" />
<Project Path="src/Aspire.Hosting.Blazor/Aspire.Hosting.Blazor.csproj" />
<Project Path="src/Aspire.Hosting.Browsers/Aspire.Hosting.Browsers.csproj" />
<Project Path="src/Aspire.Hosting.DevTunnels/Aspire.Hosting.DevTunnels.csproj" />
Expand All @@ -65,6 +66,10 @@
<Project Path="src/Aspire.Hosting.Milvus/Aspire.Hosting.Milvus.csproj" />
<Project Path="src/Aspire.Hosting.MongoDB/Aspire.Hosting.MongoDB.csproj" />
<Project Path="src/Aspire.Hosting.MySql/Aspire.Hosting.MySql.csproj" />
<Project Path="src/Aspire.Hosting.Native.Client/Aspire.Hosting.Native.Client.csproj" />
<Project Path="src/Aspire.Hosting.Native.CodeGeneration/Aspire.Hosting.Native.CodeGeneration.csproj" />
<Project Path="src/Aspire.Hosting.Native.Core/Aspire.Hosting.Native.Core.csproj" />
<Project Path="src/Aspire.Hosting.Native.Server/Aspire.Hosting.Native.Server.csproj" />
<Project Path="src/Aspire.Hosting.Nats/Aspire.Hosting.Nats.csproj" />
<Project Path="src/Aspire.Hosting.OpenAI/Aspire.Hosting.OpenAI.csproj" />
<Project Path="src/Aspire.Hosting.Oracle/Aspire.Hosting.Oracle.csproj" />
Expand Down Expand Up @@ -149,6 +154,17 @@
<File Path="playground/README.md" />
<Project Path="playground/Playground.ServiceDefaults/Playground.ServiceDefaults.csproj" />
</Folder>
<Folder Name="/playground/NativeIntegrations/">
<Project Path="playground/NativeIntegrations/CSharp/ExternalApi/NativeIntegrations.ExternalApi.csproj" />
<Project Path="playground/NativeIntegrations/CSharp/Contracts/NativeIntegrations.Contracts.csproj" />
<Project Path="playground/NativeIntegrations/CSharp/Provider/NativeIntegrations.Provider.csproj" />
<Project Path="playground/NativeIntegrations/CSharp/AppHost/NativeIntegrations.AppHost.Sample.csproj" />
<Project Path="playground/NativeIntegrations/CSharp/Redis/NativeIntegrations.Redis.csproj" />
<Project Path="playground/NativeIntegrations/CSharp/RedisContracts/NativeIntegrations.Redis.Contracts.csproj" />
<Project Path="playground/NativeIntegrations/CSharp/RedisProvider/NativeIntegrations.Redis.Provider.csproj" />
<Project Path="playground/NativeIntegrations/CSharp/RedisAppHost/NativeIntegrations.Redis.AppHost.Sample.csproj" />
<Project Path="playground/NativeIntegrations/CSharp/RedisValidation/NativeIntegrations.Redis.Validation.csproj" />
</Folder>
<Folder Name="/playground/BlazorHosted/">
<Project Path="playground/BlazorHosted/BlazorHosted.AppHost/BlazorHosted.AppHost.csproj" />
<Project Path="playground/BlazorHosted/BlazorHosted.Client/BlazorHosted.Client.csproj" />
Expand Down Expand Up @@ -586,6 +602,7 @@
<Project Path="tests/Aspire.Hosting.Milvus.Tests/Aspire.Hosting.Milvus.Tests.csproj" />
<Project Path="tests/Aspire.Hosting.MongoDB.Tests/Aspire.Hosting.MongoDB.Tests.csproj" />
<Project Path="tests/Aspire.Hosting.MySql.Tests/Aspire.Hosting.MySql.Tests.csproj" />
<Project Path="tests/Aspire.Hosting.Native.Core.Tests/Aspire.Hosting.Native.Core.Tests.csproj" />
<Project Path="tests/Aspire.Hosting.Nats.Tests/Aspire.Hosting.Nats.Tests.csproj" />
<Project Path="tests/Aspire.Hosting.OpenAI.Tests/Aspire.Hosting.OpenAI.Tests.csproj" />
<Project Path="tests/Aspire.Hosting.Oracle.Tests/Aspire.Hosting.Oracle.Tests.csproj" />
Expand Down
42 changes: 42 additions & 0 deletions docs/ci/test-trigger-map.md
Original file line number Diff line number Diff line change
Expand Up @@ -102,6 +102,48 @@ The map stays small by keeping each dependency in the layer that can prove it:
Unconditional baseline builds are not selector targets. Gated reusable
workflows are routed to the target they implement or serve.

### Independent native hosting lane

[`native-hosting-validation.yml`](../../.github/workflows/native-hosting-validation.yml)
is a dedicated PR/push/manual workflow, not a `tests.yml` selector target. Its
path filters conservatively cover all `src/**` and `eng/**`, root build/restore
inputs, shared test inputs, and `tests/Aspire.Hosting.Native.Core.Tests/**`.
The TypeScript Polyglot AppHost manifest copied into the CLI fixture is also
explicitly routed to this lane.
This deliberately includes transitive build dependencies and runtime-only
generated SDK, CLI, Dashboard, and smoke fixtures without maintaining another
project dependency list. Its workflow is classified in `ignore`; the general
workflow rule and the harness's path rule still select infrastructure validation.

The lane runs the published Native AOT executable smoke and all six TypeScript
smoke entry points using fresh generated SDK output, real Docker/DCP workloads,
the repo-built CLI/Dashboard, and headless Chromium. Building `AotSmoke` through
a project reference is not a substitute for executing this lane. Its existing
cleanup assertions remain enabled. Evidence is uploaded even on failure.

Both Linux and Windows run a fresh, opted-in TypeScript AppHost through the
repo-built CLI and published server, including `aspire describe` over the
existing CLI backchannels and clean guest/server exit. Windows additionally
exercises authenticated named-pipe RPC and listener ownership.

Run the same harness locally with Node.js 24+, Docker, and Native AOT build
prerequisites:

```bash
bash eng/scripts/test-native-hosting.sh linux-x64
# On an Apple Silicon host:
bash eng/scripts/test-native-hosting.sh osx-arm64
```

The harness restores the repository, builds CLI/Dashboard in Debug using the
default framework, publishes server/smoke in Release for net11, and installs
isolated npm/browser dependencies under `artifacts/native-hosting/ci` without
editing repository manifests. It executes RPC, runtime, workloads, revisions,
CLI, and auxiliary protocol/command scenarios; workload/revision/CLI scenarios
require the actual browser Dashboard. Logs and AppHost proof JSON are retained.
After pushing changes, inspect this workflow's real run and uploaded evidence;
local script or routing-test success alone does not prove GitHub CI passed.

## Rule categories

Rules are **additive**: a changed file activates the union of targets from every
Expand Down
5 changes: 5 additions & 0 deletions docs/ci/typescript-api-compat.md
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,11 @@ In pull request CI, `.github/workflows/typescript-api-compat.yml` compares the c

The current pull request surface is generated with a single batched `aspire sdk dump --format ci --output-directory ...` invocation for integration projects. This lets the CLI build and start one capability-scanner AppHost for all integrations, then write one ATS file per integration assembly.

Projects that explicitly evaluate `IsAspirePolyglotCompatible` to `false` are
not included in that managed integration scanner. In particular, native server
bindings expose a separate ATS contract validated by the native hosting lane;
their export attributes do not make them managed Hosting integration packages.

This intentionally differs from a plain git diff. The pull request check compares the release baseline files with generated pull request output instead of only checking whether the committed ATS files changed.

After a new version ships, reset the compatibility baseline by updating the checked-in ATS files to the shipped surface. Suppressions for breaks that are now part of that new baseline should be deleted in the same change; keep only suppressions that still describe intentional breaks relative to the release baseline. The compatibility checker fails on unused suppressions added by a pull request, but suppressions already present in the target branch are allowed to become unused against the checked-in release baseline so merged intentional breaks do not block unrelated pull requests before the next release reset.
Expand Down
1 change: 1 addition & 0 deletions docs/specs/appmodel.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
# Aspire Resource Model: Concepts, Design, and Authoring Guidance
> **Audience** – Aspire integrators, advanced users, and contributors who are defining custom resource types, implementing publishers, or working across both runtime and publish workflows.
> This documentation's focus is on hosting integrations *NOT* client integrations.
> For the ATS-native model being explored in the native hosting proof of concept, see [App Model v2](appmodelv2.md). That document describes proposed contracts, not supported APIs.
> *Just getting started? Jump straight to [Quick Start](#quick-start) and come back later for the deep‑dive.*

---
Expand Down
Loading
Loading