| Download Failure | ClientStrategy.DownloadAndApplyAsync() | Check FailedCount > 0, throw exception | Bubbles to ExecuteAsync() catch $\rightarrow$ triggers error hooks + failure reporting |
| Chain Package Pipeline Failure (with FallbackFull) | AbstractStrategy.ExecuteAsync() catch | Rebuild PipelineContext, set PackageType=Full, re-run Hash $\rightarrow$ Compress | Update eventually succeeds; fallbackEffectiveVersion records the fallback version |
| Chain Package Pipeline Failure (without FallbackFull) | AbstractStrategy.ExecuteAsync() catch | Set AllPackagesSucceeded=false, trigger HandleExecuteException; if no previous version succeeded, call TryRollback() | Version fails; proceed to next version |
| Fallback Full also fails | AbstractStrategy.ExecuteAsync() catch (inner try) | Set AllPackagesSucceeded=false | Version fails; proceed to next version |
| Upgrade Package Failure (Both scenarios) | ClientStrategy.cs Both branches | Abort IPC sending + Upgrade process startup | Prevents Upgrade process from receiving an invalid TempPath |
| Upgrade Process Pipeline Failure | UpdateStrategy.ExecuteAsync() | Set AllPackagesSucceeded=false, skip manifest write-back, skip main program startup | Next Client startup will re-detect the update |
| Rollback Failure | AbstractStrategy.TryRollback() | Log only, do not block | Installation directory may be in an inconsistent state |
| ZIP Hash Mismatch | HashMiddleware | Throw CryptographicException | Pipeline for that version fails immediately, triggering Chain $\rightarrow$ Full fallback or version failure |
| File Locked | IpcEncryption.DecryptFromFile() | Catch IOException, return null | IPC file is not ready; Upgrade process waits or exits |