Audit: analyzer enforcement + 28 verified findings fixed (#5) #18

Merged
KofTwentyTwo merged 3 commits from dev into main 2026-07-03 16:41:20 +00:00
3 Commits
Author SHA1 Message Date
James MaesandClaude Fable 5 54fa3624a2 Apply 28 adversarially-verified audit findings (#5)
Bugs the audit caught in the recovery feature:
- Rename composition is now prefix-aware: renaming a directory AND its
  descendant composes instead of producing contradictory paths
- ApplyRecoveryCore merges the persisted recovery with the incoming one,
  so recovery-managed repos gaining new invalid paths are fixable
  incrementally (GUI dialog and --sanitize-paths)
- Org-lookup loading spinner no longer sticks when superseded by a
  short/cleared token

Simplification and correctness:
- Path validation + core.longpaths gated on Windows; other platforms
  use plain checkouts (keeps the cross-platform CLI story true)
- Removed speculative/dead surface: ApplyRecoveryAsync token param,
  UpdateCheckResult.IsDownloaded, unused DownloadAndApplyAsync params
- One validation implementation (Validate(Tree) delegates to
  ValidatePaths); one run-summary string; shared concurrency constants
- Test fixtures deduplicated into GitTestHelpers.cs (~100 lines of
  triplication removed); 3 new regression tests (114 total)
- gclo.Engine NuGet-ready: XML docs generated and completed across the
  public surface, package metadata, PACKAGE.md readme
- Degraded org listing for classic PATs without read:org (personal
  login only) instead of a hard failure; --token-file reads first
  non-blank line
- Docs corrected to shipped reality: README GUI walkthrough, recovery
  paragraphs, CLI examples/log section, release runbook recovery steps,
  CONTRIBUTING architecture

Closes #5

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-03 11:36:54 -05:00
James MaesandClaude Fable 5 75764bda4e Local quality-gate enforcement: analyzers, style-in-build, CRLF (#5)
- Directory.Build.props: TreatWarningsAsErrors, AnalysisLevel
  latest-recommended, EnforceCodeStyleInBuild, Deterministic
- .editorconfig codifying the existing style; every suppression has an
  inline justification (incl. CA1822 for x:Bind codegen, proven needed)
- .gitattributes pins CRLF working trees (the format gate enforces
  end_of_line, so checkout line endings must be deterministic)
- Analyzer fixes: MainViewModel is IDisposable (owns its CTS, window
  disposes on close), explicit CancellationToken.None in test gates,
  discarded App construction result

All gates pass with enforcement active: 0-warning build, 111/111
tests, clean format verify.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-03 11:16:39 -05:00
James MaesandClaude Fable 5 4ff9be9506 Dependabot targets dev, matching the branch model
Dependency PRs land on the integration branch and reach main through
the same gated dev->main flow as all other changes.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-03 10:55:45 -05:00