Skip to content

fix(desktop): stop gating v2 workspace on flaky host online status#4430

Merged
saddlepaddle merged 1 commit into
mainfrom
remove-host-offline-screen
May 11, 2026
Merged

fix(desktop): stop gating v2 workspace on flaky host online status#4430
saddlepaddle merged 1 commit into
mainfrom
remove-host-offline-screen

Conversation

@saddlepaddle
Copy link
Copy Markdown
Collaborator

@saddlepaddle saddlepaddle commented May 11, 2026

Summary

Removes the full-screen "Host is offline" state from the v2 workspace details page.

The screen was gated on `v2Hosts.isOnline` (a DB flag written by the relay) and a `host.info` probe. Both drift from reality:

  • `isOnline` can be stuck `true` after a relay crash/redeploy, or stuck `false` if the relay's `setOnline` write blipped
  • The probe is enabled only when `isOnline === true`, so a stuck-false flag means we show offline immediately without ever asking the host

End result: users see "Host is offline" on hosts that are actually reachable.

What changes

  • `useRemoteHostStatus` no longer returns an `offline` variant; the `enabled` gate on the version probe drops the `isOnline` dependency
  • `layout.tsx` drops the offline branch
  • `WorkspaceHostOfflineState` component deleted (no other consumers)
  • The "incompatible" version-mismatch gate stays — that fires only on a successful probe with a too-old version, so it's not affected by reachability flakiness

Downstream queries (load branches, files, terminals) already surface their own errors when the host is genuinely unreachable. They're the correct place to communicate that, not a pre-emptive layout gate.

Test plan

  • Open a v2 workspace whose host has `isOnline=false` in the DB but is actually reachable → workspace renders (previously: offline screen)
  • Open a v2 workspace on a genuinely-offline host → workspace shell renders; individual queries surface their own errors
  • Open a v2 workspace on a host running an incompatible host-service version → "incompatible" screen still appears
  • `bun run lint` + `bun --bun turbo run typecheck --filter=@superset/desktop` pass

Summary by cubic

Remove the flaky “Host is offline” gate on the v2 workspace page so the workspace renders by default; only a confirmed version mismatch still blocks with the “incompatible” screen. This prevents false offline screens caused by stale v2Hosts.isOnline or transient probe failures.

  • Bug Fixes
    • Dropped offline status from useRemoteHostStatus and removed the isOnline-gated host.info probe.
    • Removed the offline branch from layout and deleted WorkspaceHostOfflineState.
    • Kept the version check: shows “incompatible” only when host.info succeeds and the version is too old.

Written for commit c2cc393. Summary will update on new commits.

Summary by CodeRabbit

  • Refactor
    • Removed offline status handling from workspace host monitoring. The system no longer tracks or displays offline states for workspace hosts.

Review Change Stack

The workspace details page previously rendered a full-screen "Host is
offline" state whenever `v2Hosts.isOnline` was false or the host.info
probe failed. That flag is written by the relay's setOnline path and
drifts from reality during relay crashes, redeploys, transient API
blips, and half-open TCP — which means users see the offline screen
on a host that's actually reachable.

Remove the offline gate entirely. The workspace renders optimistically;
downstream queries (branches, files, terminals) surface their own
errors when the host genuinely isn't reachable. The version-mismatch
("incompatible") gate stays — that's a real correctness check tied
to a successful probe, not a guess at reachability.

Also deletes the now-unused WorkspaceHostOfflineState component.
@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented May 11, 2026

Caution

Review failed

The pull request is closed.

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: ff60f75e-05df-4c6e-be17-b378f53ffe4c

📥 Commits

Reviewing files that changed from the base of the PR and between eafb0c2 and c2cc393.

📒 Files selected for processing (4)
  • apps/desktop/src/renderer/routes/_authenticated/_dashboard/v2-workspace/components/WorkspaceHostOfflineState/WorkspaceHostOfflineState.tsx
  • apps/desktop/src/renderer/routes/_authenticated/_dashboard/v2-workspace/components/WorkspaceHostOfflineState/index.ts
  • apps/desktop/src/renderer/routes/_authenticated/_dashboard/v2-workspace/hooks/useRemoteHostStatus/useRemoteHostStatus.ts
  • apps/desktop/src/renderer/routes/_authenticated/_dashboard/v2-workspace/layout.tsx

📝 Walkthrough

Walkthrough

This PR removes support for the "offline" host status. The RemoteHostStatus type is simplified to only expose skip, loading, incompatible, and ready states. The useRemoteHostStatus hook is refactored to stop checking the host's online field and instead only report incompatibility when the host version doesn't meet the minimum requirement. The WorkspaceHostOfflineState component is deleted entirely, and the layout's offline case handling is removed.

Changes

Offline Status Removal

Layer / File(s) Summary
Type Contract Update
apps/desktop/src/renderer/routes/_authenticated/_dashboard/v2-workspace/hooks/useRemoteHostStatus/useRemoteHostStatus.ts
RemoteHostStatus type removes the "offline" variant; only "skip", "loading", "incompatible", and "ready" states remain.
Hook Implementation Refactor
apps/desktop/src/renderer/routes/_authenticated/_dashboard/v2-workspace/hooks/useRemoteHostStatus/useRemoteHostStatus.ts
The hook's useLiveQuery no longer projects isOnline, the host-info query enabling condition changes from requiring hostRow?.isOnline to requiring only workspace and isLocal, and the return logic removes offline branching (no host row, isOnline false, pending/error) in favor of only checking semver incompatibility.
Component Removal
apps/desktop/src/renderer/routes/_authenticated/_dashboard/v2-workspace/components/WorkspaceHostOfflineState/WorkspaceHostOfflineState.tsx, apps/desktop/src/renderer/routes/_authenticated/_dashboard/v2-workspace/components/WorkspaceHostOfflineState/index.ts
WorkspaceHostOfflineState component, its WorkspaceHostOfflineStateProps interface, and the module re-export are deleted.
Layout Integration Cleanup
apps/desktop/src/renderer/routes/_authenticated/_dashboard/v2-workspace/layout.tsx
Removes the import of WorkspaceHostOfflineState and deletes the render branch that handled hostStatus.status === "offline", allowing offline to fall through to workspace initialization.

🎯 2 (Simple) | ⏱️ ~8 minutes

🐰 No more offline states to confound,
The host's heart beats steady and sound,
We check only what matters—can it run?
The journey continues, the cleanup is done!

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch remove-host-offline-screen

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@saddlepaddle saddlepaddle merged commit 11afdf8 into main May 11, 2026
9 of 10 checks passed
@github-actions
Copy link
Copy Markdown
Contributor

🧹 Preview Cleanup Complete

The following preview resources have been cleaned up:

  • ⚠️ Neon database branch

Thank you for your contribution! 🎉

@greptile-apps
Copy link
Copy Markdown
Contributor

greptile-apps Bot commented May 11, 2026

Greptile Summary

This PR removes the full-screen "Host is offline" gate from the v2 workspace layout, replacing flaky isOnline DB-flag and probe-gating logic with optimistic rendering that lets downstream queries surface connectivity errors directly.

  • useRemoteHostStatus: drops the offline status variant, removes the isOnline field from the DB query, and enables the version probe unconditionally for remote workspaces; the incompatible return now fires only on infoQuery.isSuccess.
  • layout.tsx: removes the offline branch and its import; incompatible and loading guards are unchanged.
  • WorkspaceHostOfflineState component and barrel export are deleted with no remaining consumers.

Confidence Score: 4/5

Safe to merge for the offline-flakiness fix; the incompatible-version path now shows a brief flash of workspace content before the gate fires.

The removal of the isOnline gate and the offline screen is clean and well-motivated. The one behavioral regression is that infoQuery.isPending no longer maps to a loading state — the workspace shell mounts optimistically while the version probe is in-flight, and child components begin their own fetches before potentially being torn down by the incompatible screen. For most users this is invisible (compatible host, quick probe), but on a slow relay or an incompatible host it produces a visible flash and wasted requests.

useRemoteHostStatus.ts — the infoQuery.isPending path now returns ready instead of loading, which is the source of the flash-before-incompatible issue.

Important Files Changed

Filename Overview
apps/desktop/src/renderer/routes/_authenticated/_dashboard/v2-workspace/hooks/useRemoteHostStatus/useRemoteHostStatus.ts Removes offline status and isOnline DB gate; probe now always fires for remote workspaces. Missing infoQuery.isPending → loading mapping causes the hook to return ready during the version probe, allowing the workspace shell to mount before an incompatible result can be detected.
apps/desktop/src/renderer/routes/_authenticated/_dashboard/v2-workspace/layout.tsx Removes the offline branch and the WorkspaceHostOfflineState import cleanly; remaining incompatible and loading checks are untouched.
apps/desktop/src/renderer/routes/_authenticated/_dashboard/v2-workspace/components/WorkspaceHostOfflineState/WorkspaceHostOfflineState.tsx Component deleted — confirmed no other consumers in the diff.
apps/desktop/src/renderer/routes/_authenticated/_dashboard/v2-workspace/components/WorkspaceHostOfflineState/index.ts Barrel re-export deleted alongside the component — clean removal.

Sequence Diagram

sequenceDiagram
    participant L as layout.tsx
    participant H as useRemoteHostStatus
    participant DB as v2Hosts (LiveQuery)
    participant P as host.info probe

    L->>H: call useRemoteHostStatus(workspace)
    H->>DB: query host row (name only, no isOnline)
    H->>P: "fire probe (enabled: workspace != null && !isLocal)"

    note over H: While probe is pending…
    H-->>L: "{ status: "ready" }"
    L-->>L: renders WorkspaceProvider + Outlet (child queries fire)

    P-->>H: probe resolves
    alt version OK
        H-->>L: "{ status: "ready" }"
        note over L: No change — workspace stays rendered
    else version too old
        H-->>L: "{ status: "incompatible", hostName, hostVersion, minVersion }"
        L-->>L: tears down workspace, shows incompatible screen
    end
Loading
Prompt To Fix All With AI
Fix the following 1 code review issue. Work through them one at a time, proposing concise fixes.

---

### Issue 1 of 1
apps/desktop/src/renderer/routes/_authenticated/_dashboard/v2-workspace/hooks/useRemoteHostStatus/useRemoteHostStatus.ts:71-83
**Workspace renders before version check completes**

Previously, `infoQuery.isPending` returned `{ status: "loading" }`, which kept the layout in the blank-div state until the probe settled. That guard is gone. Now, while the version probe is in-flight, `infoQuery.isSuccess` is false so the hook skips the `incompatible` branch and falls straight through to `return { status: "ready" }`. The layout immediately mounts `<WorkspaceProvider><Outlet /></WorkspaceProvider>`, child components (terminals, branch list, file tree) start firing their own queries, and then — after one network round-trip — the layout tears all of that down and shows the incompatible screen. The PR description says the incompatible gate "stays", but it now fires with a visible flash of workspace content preceding it.

Reviews (1): Last reviewed commit: "fix(desktop): stop gating v2 workspace o..." | Re-trigger Greptile

Comment on lines +71 to 83
if (infoQuery.isSuccess) {
const hostVersion = infoQuery.data.version;
if (!semver.satisfies(hostVersion, `>=${MIN_HOST_SERVICE_VERSION}`)) {
return {
status: "incompatible",
hostName: hostRow?.name ?? "Unknown host",
hostVersion,
minVersion: MIN_HOST_SERVICE_VERSION,
};
}
}

return { status: "ready" };
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.

P1 Workspace renders before version check completes

Previously, infoQuery.isPending returned { status: "loading" }, which kept the layout in the blank-div state until the probe settled. That guard is gone. Now, while the version probe is in-flight, infoQuery.isSuccess is false so the hook skips the incompatible branch and falls straight through to return { status: "ready" }. The layout immediately mounts <WorkspaceProvider><Outlet /></WorkspaceProvider>, child components (terminals, branch list, file tree) start firing their own queries, and then — after one network round-trip — the layout tears all of that down and shows the incompatible screen. The PR description says the incompatible gate "stays", but it now fires with a visible flash of workspace content preceding it.

Prompt To Fix With AI
This is a comment left during a code review.
Path: apps/desktop/src/renderer/routes/_authenticated/_dashboard/v2-workspace/hooks/useRemoteHostStatus/useRemoteHostStatus.ts
Line: 71-83

Comment:
**Workspace renders before version check completes**

Previously, `infoQuery.isPending` returned `{ status: "loading" }`, which kept the layout in the blank-div state until the probe settled. That guard is gone. Now, while the version probe is in-flight, `infoQuery.isSuccess` is false so the hook skips the `incompatible` branch and falls straight through to `return { status: "ready" }`. The layout immediately mounts `<WorkspaceProvider><Outlet /></WorkspaceProvider>`, child components (terminals, branch list, file tree) start firing their own queries, and then — after one network round-trip — the layout tears all of that down and shows the incompatible screen. The PR description says the incompatible gate "stays", but it now fires with a visible flash of workspace content preceding it.

How can I resolve this? If you propose a fix, please make it concise.

Kitenite added a commit that referenced this pull request May 12, 2026
#4430 just removed the equivalent full-screen "host offline" gate for
remote hosts ("render optimistically; downstream queries surface their
own errors"). Follow that direction for the local case too: remove
WorkspaceLocalHostStoppedState, useLocalHostStatus, and the layout
branch.

What stays from PR2:
- coordinator reset() + hostServiceCoordinator.reset tRPC mutation —
  useful for the planned Settings escape hatch and for support
- LocalHostServiceProvider auto-retries start() for the active org on a
  1s/4s/15s backoff (and on a post-running "stopped" status event),
  resetting the counter when status reaches "running" — transient
  spawn failures self-heal without any UI

A non-blocking recovery surface (banner, not takeover) can be a
separate PR if we still want one.
Kitenite added a commit that referenced this pull request May 12, 2026
…n stopped state (#4395)

* fix(desktop): heal stale host-service adoption; enable tray Restart in stopped state

Adopt only host-services that respond to a health check (2s timeout).
A live pid no longer serving on the recorded port was being adopted as
"running", leaving every V2 surface stuck on "Host service not available"
with no in-app recovery (#4299).

Also enable tray "Restart" in stopped state — disabling it precisely
when users need restart was backwards. Disabled now only while a start
is in flight, to avoid racing the pending start.

Adds a plan doc covering broader recovery work (banner, in-app reset,
retry-with-backoff) for follow-up PRs.

* docs(desktop): mark PR1 shipped in host-service recovery plan, prep PR2 handoff

- Status badge updated; PR #4395 link added.
- Items 1 and 5 marked shipped with implementation pointers.
- Items 2-4 (PR2) tightened with concrete file paths, the existing
  useRemoteHostStatus + WorkspaceHostOfflineState pattern to mirror,
  router shape, and test cases.
- Cross-linked #4396 (white-screen ioreg execFileSync) as the related
  but independently-fixable issue.
- Added a "Handoff checklist for PR2" listing every file to touch.

* fix(desktop): add in-app host-service reset + retry loop + recovery UI

PR2 of the recovery plan (#4299): when host-service can't be reached the
provider now auto-retries on a 1s/4s/15s backoff, and once retries
exhaust the v2-workspace layout swaps in a recovery screen with Reset
and Copy-diagnostics actions instead of a blank pane.

- coordinator: new reset() forcibly SIGKILLs any pid in the manifest,
  optionally archives host.db to host.db.broken-<ts>, then re-spawns
- tRPC: hostServiceCoordinator.reset mutation extends orgInput with
  wipeHostDb
- LocalHostServiceProvider: wraps start with exponential-backoff retry
  for the active org, resets on running, exposes lastStartError /
  lastAttemptAt / retryAttempt / retryExhausted on context
- new useLocalHostStatus hook + WorkspaceLocalHostStoppedState UI
  mirroring the existing useRemoteHostStatus / WorkspaceHostOfflineState
  pattern; layout branches on it above the offline branch

* fix(desktop): route host-service-coordinator logs through electron-log

The coordinator's narration (including PR1's adoption health-check
failures: "Adopted pid=… did not respond …, killing and respawning")
went to bare console.log, which never reaches main.log in a packaged
build. Route it through electron-log like the auto-updater does so the
next #4299-style report has breadcrumbs.

* fix(desktop): drop local-host recovery screen; keep reset + auto-retry

#4430 just removed the equivalent full-screen "host offline" gate for
remote hosts ("render optimistically; downstream queries surface their
own errors"). Follow that direction for the local case too: remove
WorkspaceLocalHostStoppedState, useLocalHostStatus, and the layout
branch.

What stays from PR2:
- coordinator reset() + hostServiceCoordinator.reset tRPC mutation —
  useful for the planned Settings escape hatch and for support
- LocalHostServiceProvider auto-retries start() for the active org on a
  1s/4s/15s backoff (and on a post-running "stopped" status event),
  resetting the counter when status reaches "running" — transient
  spawn failures self-heal without any UI

A non-blocking recovery surface (banner, not takeover) can be a
separate PR if we still want one.

* fix(desktop): address review feedback on host-service reset + tests

- reset(): read the manifest pid *before* stop() removes it, so a wedged
  tracked instance gets SIGTERM (from stop) then SIGKILL (escalation)
  instead of only SIGTERM. (cubic P1)
- log on SIGKILL failure in reset() and the adoption health-check path —
  ESRCH (pid already gone) stays silent, EPERM/etc. now surface. (cubic P2)
- tests: restore process.kill in afterEach (unconditional) and rm the
  mkdtemp dirs in afterEach; rename the "ENOENT" case to "ESRCH" (the
  errno actually simulated); add a reset test for the tracked-instance
  SIGTERM→SIGKILL escalation. (greptile/coderabbit)

* refactor(desktop): trim host-service recovery PR to the load-bearing bits

Drop the speculative pieces:
- reset({ wipeHostDb }) + host.db archival — no caller; the Settings
  "clear local data" button that would use it is out of scope here
- LocalHostServiceProvider retry-with-backoff loop — heavier than the
  #4299 fix needs and invisible without the recovery UI (already
  dropped); reverted to origin/main

What remains:
- adopt health-check (the actual #4299 fix) + tray Restart-in-stopped
- coordinator reset() (manifest-only force-kill + respawn) + tRPC
  mutation — small, tested, ready for a support escape hatch
- coordinator narration through electron-log

* docs(desktop): replace host-service recovery plan with a short shipped summary, move to plans/done

The original 220-line plan ranked six items and described a recovery
screen + retry loop that didn't ship. Replace it with a tight summary of
what landed (adopt health-check, reset(), tray fix, electron-log) and
what was considered and deferred, and move it under plans/done per the
repo convention.

* test(desktop): fix stale 'no rename' in reset test title (wipeHostDb path removed)
MocA-Love pushed a commit to MocA-Love/superset that referenced this pull request May 25, 2026
…uperset-sh#4430)

The workspace details page previously rendered a full-screen "Host is
offline" state whenever `v2Hosts.isOnline` was false or the host.info
probe failed. That flag is written by the relay's setOnline path and
drifts from reality during relay crashes, redeploys, transient API
blips, and half-open TCP — which means users see the offline screen
on a host that's actually reachable.

Remove the offline gate entirely. The workspace renders optimistically;
downstream queries (branches, files, terminals) surface their own
errors when the host genuinely isn't reachable. The version-mismatch
("incompatible") gate stays — that's a real correctness check tied
to a successful probe, not a guess at reachability.

Also deletes the now-unused WorkspaceHostOfflineState component.
MocA-Love pushed a commit to MocA-Love/superset that referenced this pull request May 25, 2026
…n stopped state (superset-sh#4395)

* fix(desktop): heal stale host-service adoption; enable tray Restart in stopped state

Adopt only host-services that respond to a health check (2s timeout).
A live pid no longer serving on the recorded port was being adopted as
"running", leaving every V2 surface stuck on "Host service not available"
with no in-app recovery (superset-sh#4299).

Also enable tray "Restart" in stopped state — disabling it precisely
when users need restart was backwards. Disabled now only while a start
is in flight, to avoid racing the pending start.

Adds a plan doc covering broader recovery work (banner, in-app reset,
retry-with-backoff) for follow-up PRs.

* docs(desktop): mark PR1 shipped in host-service recovery plan, prep PR2 handoff

- Status badge updated; PR superset-sh#4395 link added.
- Items 1 and 5 marked shipped with implementation pointers.
- Items 2-4 (PR2) tightened with concrete file paths, the existing
  useRemoteHostStatus + WorkspaceHostOfflineState pattern to mirror,
  router shape, and test cases.
- Cross-linked superset-sh#4396 (white-screen ioreg execFileSync) as the related
  but independently-fixable issue.
- Added a "Handoff checklist for PR2" listing every file to touch.

* fix(desktop): add in-app host-service reset + retry loop + recovery UI

PR2 of the recovery plan (superset-sh#4299): when host-service can't be reached the
provider now auto-retries on a 1s/4s/15s backoff, and once retries
exhaust the v2-workspace layout swaps in a recovery screen with Reset
and Copy-diagnostics actions instead of a blank pane.

- coordinator: new reset() forcibly SIGKILLs any pid in the manifest,
  optionally archives host.db to host.db.broken-<ts>, then re-spawns
- tRPC: hostServiceCoordinator.reset mutation extends orgInput with
  wipeHostDb
- LocalHostServiceProvider: wraps start with exponential-backoff retry
  for the active org, resets on running, exposes lastStartError /
  lastAttemptAt / retryAttempt / retryExhausted on context
- new useLocalHostStatus hook + WorkspaceLocalHostStoppedState UI
  mirroring the existing useRemoteHostStatus / WorkspaceHostOfflineState
  pattern; layout branches on it above the offline branch

* fix(desktop): route host-service-coordinator logs through electron-log

The coordinator's narration (including PR1's adoption health-check
failures: "Adopted pid=… did not respond …, killing and respawning")
went to bare console.log, which never reaches main.log in a packaged
build. Route it through electron-log like the auto-updater does so the
next superset-sh#4299-style report has breadcrumbs.

* fix(desktop): drop local-host recovery screen; keep reset + auto-retry

superset-sh#4430 just removed the equivalent full-screen "host offline" gate for
remote hosts ("render optimistically; downstream queries surface their
own errors"). Follow that direction for the local case too: remove
WorkspaceLocalHostStoppedState, useLocalHostStatus, and the layout
branch.

What stays from PR2:
- coordinator reset() + hostServiceCoordinator.reset tRPC mutation —
  useful for the planned Settings escape hatch and for support
- LocalHostServiceProvider auto-retries start() for the active org on a
  1s/4s/15s backoff (and on a post-running "stopped" status event),
  resetting the counter when status reaches "running" — transient
  spawn failures self-heal without any UI

A non-blocking recovery surface (banner, not takeover) can be a
separate PR if we still want one.

* fix(desktop): address review feedback on host-service reset + tests

- reset(): read the manifest pid *before* stop() removes it, so a wedged
  tracked instance gets SIGTERM (from stop) then SIGKILL (escalation)
  instead of only SIGTERM. (cubic P1)
- log on SIGKILL failure in reset() and the adoption health-check path —
  ESRCH (pid already gone) stays silent, EPERM/etc. now surface. (cubic P2)
- tests: restore process.kill in afterEach (unconditional) and rm the
  mkdtemp dirs in afterEach; rename the "ENOENT" case to "ESRCH" (the
  errno actually simulated); add a reset test for the tracked-instance
  SIGTERM→SIGKILL escalation. (greptile/coderabbit)

* refactor(desktop): trim host-service recovery PR to the load-bearing bits

Drop the speculative pieces:
- reset({ wipeHostDb }) + host.db archival — no caller; the Settings
  "clear local data" button that would use it is out of scope here
- LocalHostServiceProvider retry-with-backoff loop — heavier than the
  superset-sh#4299 fix needs and invisible without the recovery UI (already
  dropped); reverted to origin/main

What remains:
- adopt health-check (the actual superset-sh#4299 fix) + tray Restart-in-stopped
- coordinator reset() (manifest-only force-kill + respawn) + tRPC
  mutation — small, tested, ready for a support escape hatch
- coordinator narration through electron-log

* docs(desktop): replace host-service recovery plan with a short shipped summary, move to plans/done

The original 220-line plan ranked six items and described a recovery
screen + retry loop that didn't ship. Replace it with a tight summary of
what landed (adopt health-check, reset(), tray fix, electron-log) and
what was considered and deferred, and move it under plans/done per the
repo convention.

* test(desktop): fix stale 'no rename' in reset test title (wipeHostDb path removed)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant