The known-issues sweep: every open review finding and enhancement that could be fixed without an owner decision, on top of #51. Twelve commits from dev, CI + CodeQL green on the head.
Load/org-lookup failures get a red InfoBar with Retry; editing the organization after a load marks the table stale and blocks Sync until a reload; an empty load gets a real empty state; the header checkbox selects the visible rows; Settings no longer resets Quick Sync's parallelism.
Account workspaces get a real "Edit account…" path from the chip; Quick Sync gets "Save as account…" (wizard seeded from the connection); wizard steps 3/4 show why Next did nothing; the path-recovery dialog defaults suggestion-less rows to Skip and pre-flights the choices.
Diverged-history and detached-HEAD pulls give actionable messages.
Performance: incremental FilteredRepos updates (no Reset per progress report), failure logging off the UI thread, O(n) select-all/retry/sort, diff-only path validation on pull, one Octokit client per token, idle workspace pages released.
#39 — update flow shows checking/downloading progress inline, with outcomes in the bar; only "update available" asks. #40 — every user and app action is logged (startup/shutdown, token entered/cleared by length, lookups, retries, recovery, accounts, wizard, settings diff, updates, navigation, dialogs); no entry ever contains a token.
Engine: invisible-organization 404s fail loudly instead of syncing public repos; default-branch renames are followed (prune + remote HEAD); cancellation cannot be held by a wedged transport; secondary rate limits are no longer mistaken for a missing scope; the recovery file is atomic with actionable corruption errors, deletes what left the tree, and skips rewriting an unchanged tip; clone checkout is cancellable; device-name repositories fail their own row; the credentials handler stops replaying a bad token.
XAML: 900 px floor, Mica→acrylic→background fallback, theme-correct status brushes + title bar, scrolling active strip, one ConnectionFormControl, GridLength column resources, stable wizard footprint, data-driven About.
Tests: real cancellation tests via a post-fetch hook, deterministic UI oracles, VM lifecycle tests (and the double-Dispose crash they found), cleanup on every path, a generous debounce window.
#32 — security / CLI / release-engineering review (27 of 28; the 28th is #57)
Security: actions SHA-pinned; publishing secrets step-scoped; vpk and wingetcreate pinned (hash-verified); build-provenance attestations on every release asset; stored tokens never redisplayed; SECURITY.md rewritten; background update check on launch.
After merge:#55 (v1.0.1-beta.1 rehearsal of the gated release chain on the dev channel), then #56 on that beta. Owner items remain #7 and #57. #33's trigger has fired upstream (WinUI.TableView 1.5.0 shipped with UIA support) and is proposed for the release after this one.
Checklist
dotnet build gclo.slnx -p:Platform=x64 -warnaserror succeeds with 0 warnings (and in locked-restore mode)
dotnet format gclo.slnx --verify-no-changes --severity error is clean
No business logic in the gclo UI project — engine work lives in gclo.Engine (new: RepositoryPathResolver, GitHubAccessException, WindowsPathValidator.ValidateIncoming; view-model work in gclo.ViewModels)
## What
The known-issues sweep: every open review finding and enhancement that could be fixed without an owner decision, on top of #51. Twelve commits from `dev`, CI + CodeQL green on the head.
**#30 — verified UX + performance review (17 findings)**
- Load/org-lookup failures get a red InfoBar with Retry; editing the organization after a load marks the table stale and blocks Sync until a reload; an empty load gets a real empty state; the header checkbox selects the visible rows; Settings no longer resets Quick Sync's parallelism.
- Account workspaces get a real "Edit account…" path from the chip; Quick Sync gets "Save as account…" (wizard seeded from the connection); wizard steps 3/4 show why Next did nothing; the path-recovery dialog defaults suggestion-less rows to Skip and pre-flights the choices.
- Diverged-history and detached-HEAD pulls give actionable messages.
- Performance: incremental FilteredRepos updates (no Reset per progress report), failure logging off the UI thread, O(n) select-all/retry/sort, diff-only path validation on pull, one Octokit client per token, idle workspace pages released.
**#39** — update flow shows checking/downloading progress inline, with outcomes in the bar; only "update available" asks.
**#40** — every user and app action is logged (startup/shutdown, token entered/cleared by length, lookups, retries, recovery, accounts, wizard, settings diff, updates, navigation, dialogs); no entry ever contains a token.
**#31 — engine / XAML / test-quality review (25 findings, verified then fixed)**
- Engine: invisible-organization 404s fail loudly instead of syncing public repos; default-branch renames are followed (prune + remote HEAD); cancellation cannot be held by a wedged transport; secondary rate limits are no longer mistaken for a missing scope; the recovery file is atomic with actionable corruption errors, deletes what left the tree, and skips rewriting an unchanged tip; clone checkout is cancellable; device-name repositories fail their own row; the credentials handler stops replaying a bad token.
- XAML: 900 px floor, Mica→acrylic→background fallback, theme-correct status brushes + title bar, scrolling active strip, one `ConnectionFormControl`, GridLength column resources, stable wizard footprint, data-driven About.
- Tests: real cancellation tests via a post-fetch hook, deterministic UI oracles, VM lifecycle tests (and the double-Dispose crash they found), cleanup on every path, a generous debounce window.
**#32 — security / CLI / release-engineering review (27 of 28; the 28th is #57)**
- Security: actions SHA-pinned; publishing secrets step-scoped; vpk and wingetcreate pinned (hash-verified); build-provenance attestations on every release asset; stored tokens never redisplayed; SECURITY.md rewritten; background update check on launch.
- CLI: `gclo repos`, `--include/--exclude/--skip-archived`, `--dry-run`, `--json-lines`, full JSON contract (sanitized repos, every invalid path), `accounts add/edit/remove`, exit codes 3 (auth) / 4 (transient) / 70 (unexpected), `--parallel` range, `help <cmd>`. docs/CLI.md rewritten.
- Release engineering: packages.lock.json + locked restores + restore cache, UI-test diagnostics artifact, NuGet package metadata/symbols, honest CONTRIBUTING branch model.
## Why
Closes #30
Closes #31
Closes #32
Closes #39
Closes #40
**After merge:** #55 (`v1.0.1-beta.1` rehearsal of the gated release chain on the dev channel), then #56 on that beta. Owner items remain #7 and #57. #33's trigger has fired upstream (WinUI.TableView 1.5.0 shipped with UIA support) and is proposed for the release after this one.
## Checklist
- [x] `dotnet build gclo.slnx -p:Platform=x64 -warnaserror` succeeds with **0 warnings** (and in locked-restore mode)
- [x] `dotnet test gclo.Engine.Tests` passes — 392 Engine + 126 CLI tests, coverage gate 100% on `gclo.Engine`, `gclo.ViewModels`, `gclo`; FlaUI e2e 8/8
- [x] `dotnet format gclo.slnx --verify-no-changes --severity error` is clean
- [x] No business logic in the `gclo` UI project — engine work lives in `gclo.Engine` (new: `RepositoryPathResolver`, `GitHubAccessException`, `WindowsPathValidator.ValidateIncoming`; view-model work in `gclo.ViewModels`)
- [x] Docs updated (`docs/CLI.md`, `SECURITY.md`, `CONTRIBUTING.md`, `README.md`)
🤖 Generated with [Claude Code](https://claude.com/claude-code)
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.
What
The known-issues sweep: every open review finding and enhancement that could be fixed without an owner decision, on top of #51. Twelve commits from
dev, CI + CodeQL green on the head.#30 — verified UX + performance review (17 findings)
#39 — update flow shows checking/downloading progress inline, with outcomes in the bar; only "update available" asks.
#40 — every user and app action is logged (startup/shutdown, token entered/cleared by length, lookups, retries, recovery, accounts, wizard, settings diff, updates, navigation, dialogs); no entry ever contains a token.
#31 — engine / XAML / test-quality review (25 findings, verified then fixed)
ConnectionFormControl, GridLength column resources, stable wizard footprint, data-driven About.#32 — security / CLI / release-engineering review (27 of 28; the 28th is #57)
gclo repos,--include/--exclude/--skip-archived,--dry-run,--json-lines, full JSON contract (sanitized repos, every invalid path),accounts add/edit/remove, exit codes 3 (auth) / 4 (transient) / 70 (unexpected),--parallelrange,help <cmd>. docs/CLI.md rewritten.Why
Closes #30
Closes #31
Closes #32
Closes #39
Closes #40
After merge: #55 (
v1.0.1-beta.1rehearsal of the gated release chain on the dev channel), then #56 on that beta. Owner items remain #7 and #57. #33's trigger has fired upstream (WinUI.TableView 1.5.0 shipped with UIA support) and is proposed for the release after this one.Checklist
dotnet build gclo.slnx -p:Platform=x64 -warnaserrorsucceeds with 0 warnings (and in locked-restore mode)dotnet test gclo.Engine.Testspasses — 392 Engine + 126 CLI tests, coverage gate 100% ongclo.Engine,gclo.ViewModels,gclo; FlaUI e2e 8/8dotnet format gclo.slnx --verify-no-changes --severity erroris cleangcloUI project — engine work lives ingclo.Engine(new:RepositoryPathResolver,GitHubAccessException,WindowsPathValidator.ValidateIncoming; view-model work ingclo.ViewModels)docs/CLI.md,SECURITY.md,CONTRIBUTING.md,README.md)🤖 Generated with Claude Code