| … | … | @@ -0,0 +1,379 @@ | |
| 205 | + | if (initial.phase === "local") { | |
| 206 | + | if (!app) return; | |
| 207 | + | if (app.status === "claimed") { | |
| 208 | + | if (app.claimId !== ports.claimId && ports.recoveringClaims) await pause("unknown"); | |
🟠 High sidebar/updateEverythingPlan.ts:208
Opening or reloading a second window while the original window is downloading or counting down pauses the healthy app update, forcing a manual Retry. The second window sets recoveringClaims even though the original renderer still owns the claim, so this branch marks the plan paused; the owner then fails its phase check and releases the claim. Confirm the claim owner is actually abandoned before pausing the plan.
No longer relevant as of 278e64c34f17f4f2f0a658f075d0c2efb74e8792
Fixed in 0cc17105686e4a2e8243a1a62b2e0e5af403d1bf. Each renderer holds its own Web Lock before it can claim work. Recovery checks the observed owner, then atomically rechecks the same plan, phase, item and claim before pausing. A live owner is left alone; its exit wakes recovery. Added healthy/dead owner, claim-change and phase-change regressions plus real Web Locks/IndexedDB tests.
Sorry, I'm unable to act on this request because you do not have permissions within this repository.
| … | … | @@ -0,0 +1,56 @@ | |
| 39 | + | const hosted = snapshot.machines.filter((machine) => machine.hostedByThisApp); | |
| 40 | + | if ( | |
| 41 | + | !snapshot.ready || | |
| 42 | + | hosted.length === 0 || | |
🟠 High sidebar/updateEverythingMaintenance.ts:42
When the catalog is ready but there are no hostedByThisApp machines, waitForHostedMaintenance rejects with A local connection is not ready, blocking desktop updates in remote-only mode. The hosted.length === 0 rejection and the hosted.length > 0 requirement in isHostedMaintenanceReady both cause this; treat an empty hosted set as ready once the catalog is ready.
No longer relevant as of a2562316fd2dafbd2b0d5f4d718f18cb0b10c8ef
Fixed in 0cc17105686e4a2e8243a1a62b2e0e5af403d1bf. A ready catalog with no hosted machines passes the automatic gate only when the primary is null and the local server is explicitly off. Failed discovery with the local server on still rejects. Added positive and negative maintenance tests.
Sorry, I'm unable to act on this request because you do not have permissions within this repository.
| … | … | @@ -323,15 +280,430 @@ export function DesktopUpdateLaunchNotice() { | |
| 520 | + | async function wakeUpdatePlan(): Promise<void> { | |
| 521 | + | if (storageStopped) return; | |
| 522 | + | if (coordinatorRunning) { | |
| 523 | + | coordinatorAgain = true; | |
🟡 Medium sidebar/updateEverythingRun.tsx:523
The capsule keeps showing stale progress until the entire runUpdatePlan call finishes, so completed devices remain pending and failures stay hidden while other updates are still running. Store and snapshot notifications only set coordinatorAgain while the coordinator is awaiting execution; refresh showPlan independently of that serialized loop.
No longer relevant as of 278e64c34f17f4f2f0a658f075d0c2efb74e8792
Fixed in 0cc17105686e4a2e8243a1a62b2e0e5af403d1bf. Store notifications now publish committed progress while the runner is still waiting. A shared generation prevents older reads from replacing fresh results. The browser regression shows completed and failed devices while another update is blocked, then releases an old read and checks that progress stays current.
Sorry, I'm unable to act on this request because you do not have permissions within this repository.