Known-issues sweep: verified review findings (#30, #31, #32), update progress (#39), full action logging (#40) #58

Merged
KofTwentyTwo merged 10 commits from dev into main 2026-10-09 12:46:51 +00:00
KofTwentyTwo commented 2026-10-09 12:39:57 +00:00 (Migrated from github.com)

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

  • dotnet build gclo.slnx -p:Platform=x64 -warnaserror succeeds with 0 warnings (and in locked-restore mode)
  • dotnet test gclo.Engine.Tests passes — 392 Engine + 126 CLI tests, coverage gate 100% on gclo.Engine, gclo.ViewModels, gclo; FlaUI e2e 8/8
  • 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)
  • Docs updated (docs/CLI.md, SECURITY.md, CONTRIBUTING.md, README.md)

🤖 Generated with Claude Code

## 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)
Sign in to join this conversation.