From the full review of 2026-11-10. Moved out of 1.1.1 by the owner's decision; planned for 1.2.0.
What happens
A workspace decides what may run from several independent busy flags, and some commands start work without asking them. Seen by reading the code at 1.1.0 (re-verify each against current main):
Retry failed checks only the busy flags and then runs the sync without the sync command's own guards. After the Organization box was edited, the first organization's repositories are cloned into the second one's folder; with an empty target folder the user sees a raw argument error.
The lockout for Resolve paths starts after two awaits and does not know about a load in flight. Sync all can start a second git operation in a folder while the Resolve dialog is open; a reload during the dialog ends the command with an unhandled lookup failure.
Recovery uses the inputs as they are now, not those of the run that failed: an edited target folder points Resolve at another directory.
A successful organization lookup closes the error bar that a failed repository load opened, and overwrites the status text in the middle of a run.
After a run-level fault, rows stay "Queued" under an error result; Retry failed permanently narrows the selection.
To confirm: a cancellation caused by an HTTP timeout is treated as "superseded" and not shown; the short-token path may clear a typed Organization.
Expected
One activity state per workspace (Idle, Loading, Running, RecoveryPending, Resolving) from which every command's CanExecute derives, and a run that keeps the inputs it started with.
Notes
This is also the structural item of the 1.2.0 plan for WorkspaceViewModel; do them together.
Every fix needs a regression test that fails without it.
From the full review of 2026-11-10. Moved out of 1.1.1 by the owner's decision; planned for 1.2.0.
## What happens
A workspace decides what may run from several independent busy flags, and some commands start work without asking them. Seen by reading the code at 1.1.0 (re-verify each against current `main`):
- **Retry failed** checks only the busy flags and then runs the sync without the sync command's own guards. After the Organization box was edited, the first organization's repositories are cloned into the second one's folder; with an empty target folder the user sees a raw argument error.
- The lockout for **Resolve paths** starts after two awaits and does not know about a load in flight. Sync all can start a second git operation in a folder while the Resolve dialog is open; a reload during the dialog ends the command with an unhandled lookup failure.
- Recovery uses the inputs as they are now, not those of the run that failed: an edited target folder points Resolve at another directory.
- A successful organization lookup closes the error bar that a failed repository load opened, and overwrites the status text in the middle of a run.
- After a run-level fault, rows stay "Queued" under an error result; Retry failed permanently narrows the selection.
- To confirm: a cancellation caused by an HTTP timeout is treated as "superseded" and not shown; the short-token path may clear a typed Organization.
## Expected
One activity state per workspace (Idle, Loading, Running, RecoveryPending, Resolving) from which every command's `CanExecute` derives, and a run that keeps the inputs it started with.
## Notes
- This is also the structural item of the 1.2.0 plan for `WorkspaceViewModel`; do them together.
- Every fix needs a regression test that fails without it.
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
From the full review of 2026-11-10. Moved out of 1.1.1 by the owner's decision; planned for 1.2.0.
What happens
A workspace decides what may run from several independent busy flags, and some commands start work without asking them. Seen by reading the code at 1.1.0 (re-verify each against current
main):Expected
One activity state per workspace (Idle, Loading, Running, RecoveryPending, Resolving) from which every command's
CanExecutederives, and a run that keeps the inputs it started with.Notes
WorkspaceViewModel; do them together.