Skip to content

Fix mixed-quality staging package discovery - #19426

Merged
Mitch Denny (mitchdenny) merged 2 commits into
mainfrom
mitchdenny-fix-polyglot-package-filtering
Aug 17, 2026
Merged

Fix mixed-quality staging package discovery#19426
Mitch Denny (mitchdenny) merged 2 commits into
mainfrom
mitchdenny-fix-polyglot-package-filtering

Conversation

@mitchdenny

@mitchdenny Mitch Denny (mitchdenny) commented Aug 17, 2026

Copy link
Copy Markdown
Member

Description

Stable-shaped staging builds can publish a mixed package set to their SHA-specific feed: most packages use the stable build version, while integrations such as Azure Kubernetes deliberately remain prerelease. The TypeScript/polyglot aspire add path used the explicit staging channel and filtered it as stable-only, so those integrations disappeared from discovery. C# appeared to work because its generated NuGet configuration exposed the same feed through an implicit Both channel, masking the incorrectly narrow staging channel.

Official staging identities now discover both stable and prerelease packages from their SHA-specific feed. This is intentionally scoped to staging channel construction: released Stable broad discovery remains stable-only, Daily remains prerelease-only, and feature-flag-only staging retains its existing stable-only behavior. Existing exact-package fallback is unchanged, so a released CLI can still add a release-matched integration that deliberately remains prerelease.

The regression coverage includes real PackagingService channel construction and polyglot tag discovery, strict Stable/Prerelease/Both package-channel contracts, and a C#/TypeScript × staging/daily/PR command-selection matrix. The staging validation scripts now create a minimal TypeScript AppHost so they reach package discovery.

User-facing usage

On a stable-shaped staging CLI, Azure Kubernetes is now available from both C# and TypeScript AppHosts:

aspire add azure-kubernetes

Validation

The PR dogfood CLI was verified across fresh C# and TypeScript AppHosts for all supported identity shapes:

Effective identity Result in both AppHost languages
PR 13.6.0-pr.19426.g6c29f90e Redis and Azure Kubernetes resolved from the matching PR hive
Daily 13.6.0-preview.1.26416.1 Both packages resolved from the shared daily feed
Stable-shaped staging 13.5.0+45f7776d... Redis 13.5.0 and Azure Kubernetes 13.5.0-preview.1.26415.2 resolved from the same SHA feed with quality=Both
Released stable 13.4.6 NuGet.org behavior remained unchanged, including the existing exact-package fallback for Azure Kubernetes 13.4.6-preview.1.26319.6

All eight runtime cells passed. The full Aspire.Cli.Tests project also passed with 4,991 tests succeeding and 34 platform-specific tests skipped. See the full PR testing report.

Fixes #19423

Checklist

  • Is this feature complete?
    • Yes. Ready to ship.
    • No. Follow-up changes expected.
  • Are you including unit tests for the changes and scenario tests if relevant?
    • Yes
    • No
  • Did you add public API?
    • Yes
      • If yes, did you have an API Review for it?
        • Yes
        • No
      • Did you add <remarks /> and <code /> elements on your triple slash comments?
        • Yes
        • No
    • No
  • Does the change make any security assumptions or guarantees?
    • Yes
      • If yes, have you done a threat model and had a security review?
        • Yes
        • No
    • No

Official staging feeds can contain stable packages alongside integrations that deliberately remain prerelease. Discover both qualities for staging identities while preserving strict stable and daily channel filtering.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

Copilot-Session: 2b95dfd3-c558-45ae-8d8e-d798fbd8d10c
Copilot AI balanced review requested due to automatic review settings August 17, 2026 00:20
@github-actions

Copy link
Copy Markdown
Contributor

🚀 Dogfood this PR with:

⚠️ WARNING: Do not do this without first carefully reviewing the code of this PR to satisfy yourself it is safe.

curl -fsSL https://raw.githubusercontent.com/microsoft/aspire/main/eng/scripts/get-aspire-cli-pr.sh | bash -s -- 19426

Or

  • Run remotely in PowerShell:
iex "& { $(irm https://raw.githubusercontent.com/microsoft/aspire/main/eng/scripts/get-aspire-cli-pr.ps1) } 19426"

@github-actions

This comment has been minimized.

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Fixes staging package discovery so stable-shaped staging CLIs can find prerelease-only integrations.

Changes:

  • Uses Both quality for official staging identities.
  • Expands package-discovery and command-selection regression tests.
  • Updates staging validation scripts and documentation.
Show a summary per file
File Description
src/Aspire.Cli/Packaging/PackagingService.cs Changes staging quality selection.
tests/Aspire.Cli.Tests/Packaging/PackagingServiceTests.cs Tests staging channel construction.
tests/Aspire.Cli.Tests/Packaging/PackageChannelTests.cs Tests quality-specific discovery.
tests/Aspire.Cli.Tests/Commands/AddCommandTests.cs Adds language/channel selection coverage.
tests/Aspire.Cli.Tests/Projects/PrebuiltAppHostServerTests.cs Updates real service construction.
tests/Aspire.Cli.Tests/TestServices/TestAppHostProjectFactory.cs Adds package callback support.
tests/Aspire.Cli.Tests/Utils/CliTestHelper.cs Removes version-shape override.
eng/scripts/debug-stable.sh Updates expected staging quality.
eng/scripts/debug-stable.ps1 Updates expected staging quality.
eng/scripts/debug-aspire-channel.sh Adds a minimal TypeScript AppHost.
eng/scripts/debug-aspire-channel.ps1 Adds a minimal TypeScript AppHost.
docs/cli-staging-validation.md Documents mixed-quality staging behavior.
.agents/skills/cli-channel-debugging/SKILL.md Updates channel-emulation guidance.

Review details

💡 Add a code-review agent skill for context-aware, tailored reviews. Learn more in the docs.

  • Files reviewed: 13/13 changed files
  • Comments generated: 1
  • Review effort level: Balanced

Comment thread src/Aspire.Cli/Packaging/PackagingService.cs
@mitchdenny

Copy link
Copy Markdown
Member Author

PR Testing Report

PR Information

  • PR Number: Fix mixed-quality staging package discovery #19426
  • Title: Fix mixed-quality staging package discovery
  • Head Commit: 6c29f90e5c3b6d8f8b824cc35fdc6b8b21b71c40
  • Tested At: 2026-08-17T11:00:54+10:00
  • Execution Target: Local isolated temporary workspace on macOS arm64

Artifact Version Verification

  • Expected Commit: 6c29f90e5c3b6d8f8b824cc35fdc6b8b21b71c40
  • Installed PR CLI: 13.6.0-pr.19426.g6c29f90e
  • PR Hive Package: Aspire.Hosting.Azure.Kubernetes.13.6.0-pr.19426.g6c29f90e.nupkg
  • Status: ✅ Verified

The CLI and packages were installed using the PR's dogfood command into an isolated path. The CLI's embedded short SHA, 6c29f90e, matches the PR head.

Changes Analyzed

Files Changed

  • src/Aspire.Cli/Packaging/PackagingService.cs - official staging identities now use PackageChannelQuality.Both
  • tests/Aspire.Cli.Tests/Packaging/PackagingServiceTests.cs - stable-shaped mixed-quality staging regression coverage
  • tests/Aspire.Cli.Tests/Packaging/PackageChannelTests.cs - strict Stable/Prerelease/Both channel contracts
  • tests/Aspire.Cli.Tests/Commands/AddCommandTests.cs - C#/TypeScript × staging/daily/PR selection matrix
  • eng/scripts/debug-aspire-channel.* and debug-stable.* - stable-shaped staging validation
  • Supporting test helpers and staging validation documentation

Change Categories

  • CLI package discovery and channel-routing changes
  • Unit and command-level test changes
  • Validation script and documentation changes
  • Hosting integration implementation changes
  • Dashboard changes
  • VS Code extension changes
  • CI infrastructure changes

Test Method

The PR dogfood CLI was the only binary under test.

  1. The PR identity used the installed binary and its co-installed pr-19426 hive without identity overrides.
  2. Daily, staging, and released identities used a neutral copy of the same PR binary with ASPIRE_CLI_CHANNEL, ASPIRE_CLI_VERSION, and, for staging, ASPIRE_CLI_COMMIT.
  3. Each emulated non-PR identity used an isolated ASPIRE_HOME and NuGet cache. ASPIRE_CLI_PACKAGES was explicitly unset, so the PR hive could not replace or mask its remote channel.
  4. Every matrix cell created a fresh AppHost using aspire new:
    • C#: aspire-starter with Redis disabled
    • TypeScript: aspire-ts-empty
  5. Every AppHost then ran non-interactive aspire add for:
    • redis, representing a package finalized with the build
    • azure-kubernetes, representing an integration that deliberately remains prerelease
  6. Debug logs, generated channel configuration, NuGet sources, exit codes, and selected package versions were captured.

Result Matrix

Identity AppHost Persisted channel Redis selected Azure Kubernetes selected Source / quality evidence Status
PR 13.6.0-pr.19426.g6c29f90e C# pr-19426 13.6.0-pr.19426.g6c29f90e 13.6.0-pr.19426.g6c29f90e Local pr-19426 hive
PR 13.6.0-pr.19426.g6c29f90e TypeScript pr-19426 13.6.0-pr.19426.g6c29f90e 13.6.0-pr.19426.g6c29f90e Local pr-19426 hive
Daily 13.6.0-preview.1.26416.1 C# daily 13.6.0-preview.1.26416.1 13.6.0-preview.1.26416.1 Shared dotnet9 feed; prerelease query
Daily 13.6.0-preview.1.26416.1 TypeScript daily 13.6.0-preview.1.26416.1 13.6.0-preview.1.26416.1 Shared dotnet9 feed; prerelease query
Staging 13.5.0+45f7776d... C# staging 13.5.0 13.5.0-preview.1.26415.2 SHA feed darc-pub-microsoft-aspire-45f7776d; quality=Both
Staging 13.5.0+45f7776d... TypeScript staging 13.5.0 13.5.0-preview.1.26415.2 SHA feed darc-pub-microsoft-aspire-45f7776d; quality=Both
Released stable 13.4.6 C# none 13.4.6 13.4.6-preview.1.26319.6 NuGet.org; existing exact-ID prerelease fallback
Released stable 13.4.6 TypeScript none 13.4.6 13.4.6-preview.1.26319.6 NuGet.org; existing exact-ID prerelease fallback

All template and package-add commands exited 0.

Test Scenarios Executed

Scenario 1: Actual PR build and local hive

Objective: Verify the PR build resolves packages from its co-installed hive and does not fall through to daily or stable packages.

Coverage Type: Happy path and source-isolation boundary
Status: ✅ Passed

Evidence:

  • Both AppHosts persisted "channel": "pr-19426".
  • Their generated NuGet configuration mapped Aspire* to /tmp/aspire-pr-19426-channel-matrix/install/hives/pr-19426/packages.
  • Both Redis and Azure Kubernetes resolved to 13.6.0-pr.19426.g6c29f90e.
  • Debug output reported the local package source for channel pr-19426.

Observation: The package and template hive behavior is intact for both AppHost languages.


Scenario 2: Daily build emulation

Objective: Verify a daily identity stays on the shared prerelease feed for both AppHost languages.

Coverage Type: Happy path and channel-precedence boundary
Status: ✅ Passed

Evidence:

  • Effective identity warning: daily, version 13.6.0-preview.1.26416.1.
  • Both AppHosts persisted "channel": "daily".
  • NuGet search queried the shared dotnet9 feed with prerelease=true.
  • Both packages resolved to 13.6.0-preview.1.26416.1.
  • No package from the installed PR hive was selected.

Observation: The staging fix does not alter daily package selection.


Scenario 3: Stable-shaped staging build emulation

Objective: Verify a stable-shaped staging build can discover stable and deliberately prerelease packages from the same SHA-specific feed.

Coverage Type: Primary regression scenario
Status: ✅ Passed

Evidence:

Resolved 'staging' channel: feed=https://pkgs.dev.azure.com/dnceng/public/_packaging/darc-pub-microsoft-aspire-45f7776d/nuget/v3/index.json, quality=Both, pinnedVersion=(none)
  • Both AppHosts persisted "channel": "staging".
  • C# generated a NuGet mapping from Aspire* to the SHA-specific darc feed.
  • TypeScript used the explicit staging channel from aspire.config.json, exercising the originally broken path.
  • Logs showed both prerelease=false and prerelease=true searches against the staging feed.
  • Both languages selected:
    • Redis 13.5.0
    • Azure Kubernetes 13.5.0-preview.1.26415.2

Observation: This directly proves the feed is mixed-quality and that Both is required on the explicit staging channel. C# and TypeScript now agree.


Scenario 4: Current released build emulation

Objective: Verify the latest released identity remains on NuGet.org and preserves shipped package-selection behavior.

Coverage Type: Regression boundary
Status: ✅ Passed

Evidence:

  • Latest GitHub release: Aspire 13.4.6.
  • Effective identity warning: stable, version 13.4.6.
  • Neither AppHost persisted a non-stable channel.
  • NuGet searches used only NuGet.org.
  • Both languages selected Redis 13.4.6.
  • An exact azure-kubernetes add selected its matching prerelease-only integration, 13.4.6-preview.1.26319.6.

Observation: The Azure Kubernetes result is the existing exact-ID fallback/implicit-channel behavior that allows a prerelease-only integration to accompany a stable release. It does not indicate that the explicit Stable broad-discovery contract was relaxed; production changes did not touch PackageChannel.

Negative and Boundary Coverage

Remote identities cannot leak the PR hive

Expected Outcome: Daily, staging, and stable emulations must not select 13.6.0-pr.19426....

Status: ✅ Passed

The neutral CLI copy used identity-specific ASPIRE_HOME directories and explicitly removed ASPIRE_CLI_PACKAGES. Every remote identity selected only its own matching package versions.

Stable broad discovery remains strict

Expected Outcome: PackageChannelQuality.Stable must issue only a stable broad-discovery query and hide prerelease-only IDs.

Status: ✅ Passed

The added PackageChannelTests assert that a Stable remote channel performs one stable query, performs zero prerelease queries, and returns only the stable package. Separate tests cover Prerelease and Both contracts. The full CLI unit test project passed.

Language-path parity

Expected Outcome: C# and TypeScript must select the same package version for each identity even though C# can obtain feed mappings through NuGet configuration while TypeScript relies on its explicit configured channel.

Status: ✅ Passed

All four identity rows produced identical package versions across both languages.

Additional Validation

  • Full Aspire.Cli.Tests project:
    • Total: 5,025
    • Succeeded: 4,991
    • Skipped: 34 platform-specific
    • Failed: 0
  • Stable-shaped staging helper:
    • debug-stable.sh resolved the 45f7776d darc feed with quality=Both
  • At report time, PR CI had:
    • 362 successful checks
    • 2 skipped checks
    • 1 check still in progress

Evidence

  • Archived logs and generated channel configuration: pr-19426-channel-matrix-evidence.tar.gz
  • Matrix results inside archive: results.tsv
  • Per-cell logs inside archive: scenarios/<identity>-<language>/{new,add-redis,add-azure-kubernetes}.log
  • Generated channel configuration inside archive: aspire.config.json and NuGet.config where applicable

No screenshots were captured because this PR changes package resolution rather than visual UI.

Summary

Scenario Status Notes
Actual PR build + hive, C# and TypeScript ✅ Passed Matching PR packages selected locally
Daily emulation, C# and TypeScript ✅ Passed Matching daily packages selected from shared feed
Stable-shaped staging, C# and TypeScript ✅ Passed Stable and prerelease integration selected from one SHA feed with Both
Released 13.4.6, C# and TypeScript ✅ Passed NuGet.org behavior unchanged
Remote identity isolation from PR hive ✅ Passed No PR package leaked into another channel
Strict Stable channel unit contract ✅ Passed Stable broad discovery remains stable-only

Overall Result

✅ PR VERIFIED

The fix is correctly scoped to official staging identities. It resolves the TypeScript/polyglot staging regression without changing PR hive selection, daily prerelease selection, released stable behavior, or the strict broad-discovery semantics of PackageChannelQuality.Stable.

@github-actions

Copy link
Copy Markdown
Contributor

Retrying the failed CI jobs for this pull request from the CI run attempt. The rerun is being tracked in the rerun attempt.

Cover both stable-versus-same-line-preview and current-preview-versus-older-stable selection through staging package discovery and the add version picker.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

Copilot-Session: 2b95dfd3-c558-45ae-8d8e-d798fbd8d10c
Copilot AI review requested due to automatic review settings August 17, 2026 01:20
@github-actions

Copy link
Copy Markdown
Contributor

Tests selector (audit mode)

The full test matrix and all jobs still run in audit mode. The tests and jobs below are what selective CI would run under enforcement.

2 / 101 test projects · 5 jobs, from 11 changed files.

Selected test projects (2 / 101)

Aspire.Cli.EndToEnd.Tests, Aspire.Cli.Tests

Selected jobs (5)

cli-starter, deployment-e2e, extension-e2e, polyglot, typescript-api-compat


How these were chosen — grouped by what changed

📦 affected project Aspire.Cli
1 test: Aspire.Cli.EndToEnd.Tests

🧪 tests/Aspire.Cli.Tests/Commands/AddCommandTests.cs (changed test)
1 directly: Aspire.Cli.Tests

🧪 tests/Aspire.Cli.Tests/Packaging/PackageChannelTests.cs (changed test)
1 directly: Aspire.Cli.Tests

🧪 tests/Aspire.Cli.Tests/Packaging/PackagingServiceTests.cs (changed test)
1 directly: Aspire.Cli.Tests

🧪 tests/Aspire.Cli.Tests/Projects/PrebuiltAppHostServerTests.cs (changed test)
1 directly: Aspire.Cli.Tests

🧪 tests/Aspire.Cli.Tests/TestServices/TestAppHostProjectFactory.cs (changed test)
1 directly: Aspire.Cli.Tests

🧪 tests/Aspire.Cli.Tests/Utils/CliTestHelper.cs (changed test)
1 directly: Aspire.Cli.Tests

Job reasons

Job Triggered by
cli-starter • affected project Aspire.Cli
• selected test Aspire.Cli.Tests
deployment-e2e affected project Aspire.Cli
extension-e2e src/Aspire.Cli/Packaging/PackagingService.cs, tests/Aspire.Cli.Tests/Commands/AddCommandTests.cs, tests/Aspire.Cli.Tests/Packaging/PackageChannelTests.cs, tests/Aspire.Cli.Tests/Packaging/PackagingServiceTests.cs, tests/Aspire.Cli.Tests/Projects/PrebuiltAppHostServerTests.cs, tests/Aspire.Cli.Tests/TestServices/TestAppHostProjectFactory.cs, tests/Aspire.Cli.Tests/Utils/CliTestHelper.cs
• affected project Aspire.Cli
polyglot affected project Aspire.Cli
typescript-api-compat affected project Aspire.Cli

Selection computed for commit ce1c3f9.

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Review details

  • Files reviewed: 13/13 changed files
  • Comments generated: 0 new
  • Review effort level: Balanced

@github-actions

Copy link
Copy Markdown
Contributor

Retrying the failed CI jobs for this pull request from the CI run attempt. The rerun is being tracked in the rerun attempt.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Reviewed staging channel construction, package/version selection consumers, cross-shell diagnostics, and the added regression coverage at ce1c3f99.

I also installed the PR CLI (13.6.0-pr.19426.gce1c3f99) and exercised stable-shaped staging discovery from fresh C# and TypeScript AppHosts. Both resolved the SHA-specific feed with quality=Both; stable Redis 13.5.0 and prerelease-only Azure Kubernetes 13.5.0-preview.1.26415.2 were both discoverable.

No blocking issues found.

@mitchdenny

Copy link
Copy Markdown
Member Author

PR Testing Report: aspire new and aspire init Identity Matrix

PR Information

  • PR: microsoft/aspire#19426
  • Title: Fix mixed-quality staging package discovery
  • Head commit: ce1c3f99b52507e61e8b61d222638f84fd66ac0c
  • Tested at: 2026-08-17T12:22:25+10:00
  • Execution target: Local isolated temporary workspace on macOS arm64

Artifact Version Verification

  • Expected PR commit: ce1c3f99b52507e61e8b61d222638f84fd66ac0c
  • Installed PR CLI: 13.6.0-pr.19426.gce1c3f99
  • Installed PR hive: install/hives/pr-19426/packages
  • Example PR package: Aspire.ProjectTemplates.13.6.0-pr.19426.gce1c3f99.nupkg
  • Status: ✅ Verified

The PR CLI and CI-built packages were installed from workflow run
31984649396. The CLI's embedded
short SHA and package versions match the current PR head.

Changes Under Test

The production change makes official staging identities construct their explicit package channel
with PackageChannelQuality.Both. Because that channel is consumed by more than aspire add, this
run exercised template and skeleton creation through:

  • aspire new with C# and TypeScript AppHosts.
  • aspire init with a brownfield C# solution and a brownfield TypeScript/npm project.
  • Template package selection, generated source mappings, persisted polyglot channels, generated
    AppHost package versions, restore, and build.

Identity Emulation

Scenario Identity knobs Aspire package source
PR hive Baked pr-19426 / 13.6.0-pr.19426.gce1c3f99; no ASPIRE_CLI_* overrides CI-built pr-19426 local hive
Daily ASPIRE_CLI_CHANNEL=daily, ASPIRE_CLI_VERSION=13.6.0-preview.1.26416.1 Shared dotnet9 daily feed
Stable-shaped staging ASPIRE_CLI_CHANNEL=staging, ASPIRE_CLI_VERSION=13.5.0, ASPIRE_CLI_COMMIT=45f7776ddb51ba976a32ece224ef8b23ed989a91 SHA-specific darc-pub-microsoft-aspire-45f7776d feed
Released stable ASPIRE_CLI_CHANNEL=stable, ASPIRE_CLI_VERSION=13.4.6 NuGet.org

ASPIRE_CLI_PACKAGES was unset in every row. Daily, staging, and stable used a neutral copy of the
PR CLI plus isolated ASPIRE_HOME, NuGet, npm, and .NET caches, so the installed PR hive could not
replace or mask their remote channels.

Scenarios

Each identity used fresh directories for these four cells:

  1. aspire new aspire-empty --language csharp followed by dotnet build apphost.cs.
  2. aspire new aspire-ts-empty followed by npm run aspire:build.
  3. aspire init --language csharp in a solution containing an existing ASP.NET Core project,
    followed by dotnet build of the generated AppHost project.
  4. aspire init --language typescript in an existing npm project, followed by the generated
    npm run aspire:build delegation.

Every CLI invocation was non-interactive and suppressed agent initialization.

Result Matrix

Identity Command AppHost Selected/pinned package identity Persisted TS channel CLI Build Metadata
PR new C# single-file Aspire.AppHost.Sdk@13.6.0-pr.19426.gce1c3f99 N/A
PR new TypeScript PR template/hive pr-19426
PR init C# project Aspire.AppHost.Sdk/13.6.0-pr.19426.gce1c3f99 N/A
PR init TypeScript brownfield Aspire.Hosting.JavaScript 13.6.0-pr.19426.gce1c3f99 pr-19426
Daily new C# single-file Aspire.AppHost.Sdk@13.6.0-preview.1.26416.1 N/A
Daily new TypeScript Daily template daily
Daily init C# project Aspire.AppHost.Sdk/13.6.0-preview.1.26416.1 N/A
Daily init TypeScript brownfield Aspire.Hosting.JavaScript 13.6.0-preview.1.26416.1 daily
Staging new C# single-file Aspire.AppHost.Sdk@13.5.0 N/A
Staging new TypeScript Staging template staging
Staging init C# project Aspire.AppHost.Sdk/13.5.0 N/A
Staging init TypeScript brownfield Aspire.Hosting.JavaScript 13.5.0 staging
Stable new C# single-file Aspire.AppHost.Sdk@13.4.6 N/A
Stable new TypeScript Stable template none
Stable init C# project Aspire.AppHost.Sdk/13.4.6 N/A
Stable init TypeScript brownfield Aspire.Hosting.JavaScript 13.4.6 none

All 16 cells returned:

  • command_exit=0
  • build_exit=0
  • metadata_exit=0

Channel and Version Evidence

PR hive

  • C# new and init generated NuGet mappings to the isolated
    install/hives/pr-19426/packages directory.
  • C# project-mode init installed the exact local package:
    Aspire.ProjectTemplates.13.6.0-pr.19426.gce1c3f99.nupkg.
  • TypeScript new and init persisted channel: "pr-19426".

Daily

  • C# new and init generated mappings to the shared dotnet9 feed.
  • C# project-mode init installed:
    Aspire.ProjectTemplates@13.6.0-preview.1.26416.1.
  • TypeScript new and init persisted channel: "daily".
  • TypeScript init pinned Aspire.Hosting.JavaScript to
    13.6.0-preview.1.26416.1.

Stable-shaped staging

  • All four staging commands resolved:

    feed=.../darc-pub-microsoft-aspire-45f7776d/nuget/v3/index.json, quality=Both
    
  • C# new pinned the single-file SDK to stable 13.5.0.

  • C# project-mode init queried both stable and prerelease results, then installed stable
    Aspire.ProjectTemplates@13.5.0 from the SHA-specific staging feed.

  • TypeScript new and init persisted channel: "staging".

  • TypeScript init pinned stable Aspire.Hosting.JavaScript 13.5.0.

This is the important boundary for the production change: Both does not cause the stable staging
template or stable JavaScript integration to drift to a prerelease. SemVer still selects stable
13.5.0, while prerelease-only integrations remain discoverable from the same staging feed.

Released stable

  • C# new and init pinned Aspire.AppHost.Sdk to 13.4.6.
  • C# project-mode init installed Aspire.ProjectTemplates@13.4.6 from NuGet.org.
  • TypeScript did not persist a channel, preserving released stable's implicit public-feed behavior.
  • TypeScript init pinned Aspire.Hosting.JavaScript to 13.4.6.

Isolation and Boundary Checks

  • No generated daily, staging, or stable project contained a reference to
    13.6.0-pr.19426....
  • PR-generated C# NuGet configurations mapped Aspire packages to the PR hive.
  • Daily-generated C# NuGet configurations mapped Aspire packages to dotnet9.
  • Staging-generated C# NuGet configurations mapped Aspire packages to the SHA-specific darc feed.
  • Stable generated no unnecessary channel-specific NuGet configuration.
  • TypeScript channel persistence matched the identity in every non-stable row and remained absent
    for stable.
  • PR CI currently reports 364 successful checks, zero failures, and zero pending checks.

Harness Note

An initial harness pass assumed C# aspire-empty produced a .csproj. The command correctly
produced the current single-file apphost.cs shape, so the artifact detector was corrected and the
entire matrix was rerun from fresh directories. The final results above are from that clean rerun.

Evidence

  • pr-19426-new-init-matrix-results.tsv
  • pr-19426-new-init-evidence.tar.gz
    • Per-cell command.log, build.log, and preparation logs.
    • Generated aspire.config.json, NuGet configuration, AppHost source/projects, and package
      manifests.
  • run-pr-19426-new-init-matrix.sh

No screenshots were captured because the changed behavior is package/channel resolution rather than
visual UI.

Overall Result

✅ PR VERIFIED

aspire new and aspire init remain functional and buildable for C# and TypeScript AppHosts across
PR hives, daily builds, stable-shaped staging builds, and the current released stable build. The
staging Both change preserves stable template/package selection while enabling mixed-quality
staging discovery.

@mitchdenny

Copy link
Copy Markdown
Member Author

/backport to release/13.5

@github-actions

Copy link
Copy Markdown
Contributor

Started backporting to release/13.5 (link to workflow run)

@mitchdenny
Mitch Denny (mitchdenny) merged commit 207a672 into main Aug 17, 2026
726 of 731 checks passed
@mitchdenny
Mitch Denny (mitchdenny) deleted the mitchdenny-fix-polyglot-package-filtering branch August 17, 2026 02:43
@github-actions github-actions Bot added this to the 13.6 milestone Aug 17, 2026
@aspire-repo-bot

Copy link
Copy Markdown
Contributor

Mitch Denny (@mitchdenny) backporting to release/13.5 failed, the patch most likely resulted in conflicts. Please backport manually!

git am output
$ git am --3way --empty=keep --ignore-whitespace --keep-non-patch changes.patch

Applying: Fix mixed-quality staging package discovery
Using index info to reconstruct a base tree...
M	src/Aspire.Cli/Packaging/PackagingService.cs
M	tests/Aspire.Cli.Tests/Packaging/PackageChannelTests.cs
M	tests/Aspire.Cli.Tests/Packaging/PackagingServiceTests.cs
M	tests/Aspire.Cli.Tests/Projects/PrebuiltAppHostServerTests.cs
M	tests/Aspire.Cli.Tests/Utils/CliTestHelper.cs
Falling back to patching base and 3-way merge...
Auto-merging src/Aspire.Cli/Packaging/PackagingService.cs
Auto-merging tests/Aspire.Cli.Tests/Packaging/PackageChannelTests.cs
CONFLICT (content): Merge conflict in tests/Aspire.Cli.Tests/Packaging/PackageChannelTests.cs
Auto-merging tests/Aspire.Cli.Tests/Packaging/PackagingServiceTests.cs
Auto-merging tests/Aspire.Cli.Tests/Projects/PrebuiltAppHostServerTests.cs
Auto-merging tests/Aspire.Cli.Tests/Utils/CliTestHelper.cs
error: Failed to merge in the changes.
hint: Use 'git am --show-current-patch=diff' to see the failed patch
hint: When you have resolved this problem, run "git am --continue".
hint: If you prefer to skip this patch, run "git am --skip" instead.
hint: To restore the original branch and stop patching, run "git am --abort".
hint: Disable this message with "git config set advice.mergeConflict false"
Patch failed at 0001 Fix mixed-quality staging package discovery
Error: The process '/usr/bin/git' failed with exit code 128

Link to workflow output

aspire-repo-bot Bot added a commit to microsoft/aspire.dev that referenced this pull request Aug 17, 2026
Documents microsoft/aspire#19426 - Fix mixed-quality staging package discovery.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@aspire-repo-bot

Copy link
Copy Markdown
Contributor

Pull request created: #1505

Generated by PR Documentation Check · auto · 112.5 AIC · ⌖ 9.59 AIC · ⊞ 19.6K

@aspire-repo-bot

Copy link
Copy Markdown
Contributor

📝 Documentation has been drafted in microsoft/aspire.dev#1505 targeting release/13.5.

Added a note and example to the aspire add command reference (src/frontend/src/content/docs/reference/cli/commands/aspire-add.mdx) explaining that staging/dev quality CLI builds discover both stable and prerelease integration packages (e.g. Aspire.Hosting.Azure.Kubernetes), while release quality CLI builds remain stable-only unless a specific version is requested.

Note

This draft PR needs human review before merging.

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

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

TypeScript aspire add omits prerelease-only integrations from stable-shaped staging builds

3 participants