You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Master status issue. Mirrors / pairs with microsoft/aspire#15949 but lives on this fork because most of the work is research, decisions, and runbooks rather than mainline code.
Why
Aspire CLI now ships through 5 acquisition routes:
These routes share ~/.aspire/ for config, hives, caches, bundles, sdks. They have independent update mechanisms but mutate shared state. aspire update --self is route-aware only for dotnet-tool — for all other routes it silently clobbers the on-disk binary, often corrupting the package manager's view of what's installed.
The 36-scenario Windows playbook (gist bae142…) confirmed cross-contamination is a real, reproducible bug today — the most severe being W34/W35 where a winget binary silently inherits a removed PR install's channel + hive.
Goal
Every cell in the user-scenarios matrix green or knowingly deferred, validated by a mix of unit tests, E2E tests, and manual runbooks. No silent clobber. No cross-contamination. Clean uninstall. Predictable update flow per route.
Approach — three tracks
Track A — Research. Document current behavior, state-sharing, and pipeline shape. Mostly done.
Track B — Implementation. Make the CLI install-route aware (InstallRoute enum + detector), fix --self per route, ship aspire uninstall, scope channel + bundle correctly.
Track C — Validation. Automated tests + manual runbooks for every cell of the user-scenarios matrix.
Track A — Research deliverables (✅ done)
Stored under docs/specs/cli-acquisition/ on this fork (or in the linked session files until promoted). Headlines:
aspire-home-map.md — 23 paths in ~/.aspire/ classified for cross-route safety. Critical hazard: bundle/<version>/ is keyed on process path, not install identity — two installs at the same version race the same dir.
pkgmgr-pipelines.md — winget has prerelease infra (disabled); Homebrew doesn't. winget cask uses UpgradeBehavior: uninstallPrevious.
reparse-flip-risk.md — Windows bundle/ flip is not atomic (RemoveIfExists+Move); Unix uses atomic rename(2). 6 risks total incl. legacy managed/ migration hard-failure if dir is in use.
Aspire CLI Acquisition Coherence — Status Tracker
Why
Aspire CLI now ships through 5 acquisition routes:
get-aspire-cli.{sh,ps1}(release / staging / dev) →~/.aspire/binget-aspire-cli-pr.{sh,ps1}(PR dogfood, hive-isolated) →~/.aspire/bin+~/.aspire/hives/pr-N/Microsoft.Aspire, stable;Microsoft.Aspire.Prereleaseinfrastructure exists but disabled)aspirecask, stable only)Aspire.Cli, native-AOT post-Embed distribution channel in CLI binary instead of relying onaspire.config.jsonmicrosoft/aspire#15947)These routes share
~/.aspire/for config, hives, caches, bundles, sdks. They have independent update mechanisms but mutate shared state.aspire update --selfis route-aware only for dotnet-tool — for all other routes it silently clobbers the on-disk binary, often corrupting the package manager's view of what's installed.The 36-scenario Windows playbook (gist bae142…) confirmed cross-contamination is a real, reproducible bug today — the most severe being W34/W35 where a winget binary silently inherits a removed PR install's channel + hive.
Goal
Every cell in the user-scenarios matrix green or knowingly deferred, validated by a mix of unit tests, E2E tests, and manual runbooks. No silent clobber. No cross-contamination. Clean uninstall. Predictable update flow per route.
Approach — three tracks
InstallRouteenum + detector), fix--selfper route, shipaspire uninstall, scope channel + bundle correctly.Track A — Research deliverables (✅ done)
Stored under
docs/specs/cli-acquisition/on this fork (or in the linked session files until promoted). Headlines:behavior-matrix.md— 5 routes × 7 actions; 7 gaps cited. Top:--selfredirect only fires for dotnet-tool path-shape; winget/brew silently overwrite.aspire-home-map.md— 23 paths in~/.aspire/classified for cross-route safety. Critical hazard:bundle/<version>/is keyed on process path, not install identity — two installs at the same version race the same dir.pkgmgr-pipelines.md— winget has prerelease infra (disabled); Homebrew doesn't. winget cask usesUpgradeBehavior: uninstallPrevious.reparse-flip-risk.md— Windowsbundle/flip is not atomic (RemoveIfExists+Move); Unix uses atomicrename(2). 6 risks total incl. legacymanaged/migration hard-failure if dir is in use.Track B — Implementation tracker
InstallRouteenum + detectoraspire update --selfper-route dispatchaspire uninstall --self+--state-only<install-id>scoping + Windows atomic flipTrack B work is intended to land upstream in microsoft/aspire as PRs against microsoft#15949.
Track C — Validation tracker
See user-scenarios.md. 9 categories, ~40 scenarios. Per-category test issues filed with
track-c-validationlabel:Decisions (Q1–Q7)
bundle/<install-id>/<ver>/, kill shared symlinkaspire uninstallcommand surface--state-only--selfguarantees--self --channel Xfrom pkg-mgr install--break-installescape hatch)Each "recommend" decision has a draft writeup; team sign-off required before implementation lands.
User-scenarios
The acceptance matrix lives in
user-scenarios.md. Categories:aspire update --selfper route (broken today for S2.3, S2.4, S2.6)aspire update --non-interactivecrashes at PromptForSelectionAsync when hive directories exist microsoft/aspire#15600,aspire update --non-interactivecrashes at ConfirmAsync when version downgrade is detected microsoft/aspire#15601)Every Track-B implementation issue lists which S-IDs it advances. Every Track-C issue maps to specific S-IDs.
Linked upstream issues
aspire update --non-interactivecrashes at PromptForSelectionAsync when hive directories exist microsoft/aspire#15600 —aspire update --non-interactivechannel-prompt crashaspire update --non-interactivecrashes at ConfirmAsync when version downgrade is detected microsoft/aspire#15601 —aspire update --non-interactivedowngrade crashaspire.config.jsonmicrosoft/aspire#15947 — native-AOT dotnet-tool (✅ landed; impacts Track B detection)aspire updatesays 'up to date' whendevCLI checksstableproject — potentially confusing UX microsoft/aspire#15604 — channel resolutionHow to read this issue
user-scenarios.md— that's the goal-state.Status updates
I'll update the checkbox tracker below and post comments at milestone boundaries.
Track A — Research
~/.aspire/mapTrack B — Implementation (gated on decisions)
InstallRouteenum + detector — [B0] InstallRoute enum + detector (replaces IsRunningAsDotNetTool) #33aspire update --selfdispatch — [B2] aspire update --self per-route dispatch #39aspire uninstall— [B4] aspire uninstall --self / --state-only #41<install-id>scoping — [B5] Bundle install-id scoping + Windows atomic flip #42Track C — Validation