Dashboard › cli › Distillation
9f4ec157-56a1-4c39-9982-c9a76e584f42["lore_tm_v1_t9LUOieAaE7q6LbysNnfZoX0JvOSWAc9FO3YFVTCuzE","lore_tm_v1_DyKHbjAl_NK3JuB1hMUepUnxNyM376L1bdiqv5xTd3I","lore_tm_v1_jPGLxN0bBjnU4_6u1BQcagBomv6eL97IH-R3NZq81OA"]
110d6530e57ca4fbfb2a3f98e52013d2668b5b5e and b291f0ba3965767a808fa1eba1129f8dea9b427e, followed by b07e44a7bdf5101f1a4e09a23949467e77e5055105c9f0d03d3f293ab9566259 - and the exact count 17.packages/cli/src/lib/delta-upgrade.ts: patch-cache keys at lines 133–135 include only fromVersion and toVersion; one global patch-cache is created at lines 172–174; that cache is supplied to every SourceStrategy at lines 566–575; Toolkit versus legacy network resolution is selected while retaining the shared cache at lines 638–644; and source-specific chains are prefetched into the same unbranded cache at lines 696–724.getsentry/cli can satisfy a later Toolkit-selected upgrade without consulting Toolkit. The cached chain’s expected SHA authenticates the legacy result rather than the Toolkit-selected artifact, violating strict source affinity and potentially crossing a supply-chain boundary when repositories differ. Automatic transport fallback worsens this because persisted cache data lacks source provenance and the offline path defaults to the primary source.githubRepo, ghcrRepo, and tagPrefix; or (2) store and verify equivalent source provenance in every cached chain. Assistant additionally required persisting source identity alongside cached version information so explicit and automatic offline resolution use the matching cache namespace.attemptDeltaUpgrade() for that same pair with Toolkit selected and offline: true. 3. Assert the legacy cached chain is rejected and no legacy output is written. 4. Repeat online with Toolkit returning no chain; assert a Toolkit request occurs and the legacy cache cannot supply success. 5. Add the inverse case with Toolkit cache and legacy selection.packages/cli/test/lib/delta-upgrade.test.ts:1944-2035 insufficient because they assert only network URLs while the cache is empty, so they cannot expose cross-source cache reuse.fetchWithUpgradeError() in packages/cli/src/lib/binary.ts:501-509 returns the exact caller abort reason, with a second-page regression at packages/cli/test/lib/upgrade.test.ts:246-266.UpgradeTransportError enables fallback in packages/cli/src/commands/cli/upgrade.ts:221-236; HTTP errors and malformed metadata remain terminal.semver.valid and prereleases are rejected in packages/cli/src/lib/upgrade.ts:556-589,829-845.401, 403, 429, or 5xx, although all currently prevent installation. 3. No regression combines source selection with a previously populated patch cache, which exposes the MUST-FIX boundary defect.DO-NOT-MERGE.