# Retrospective

## Milestone: v1.0 — MVP

**Shipped:** 2026-04-07
**Phases:** 5 | **Plans:** 36 | **Commits:** 164 | **LOC:** 10,071

### What Was Built
- Complete C#/WPF rewrite replacing 6,400-line PowerShell monolith
- 10 feature tabs: Permissions, Storage, Search, Duplicates, Transfer, Bulk Members, Bulk Sites, Folder Structure, Templates, Settings
- Multi-tenant MSAL authentication with per-tenant token caching
- CSV and interactive HTML export across all scan features
- Bulk operations with continue-on-error, per-item reporting, retry, and cancellation
- Self-contained 200 MB EXE with full EN/FR localization (199 keys)

### What Worked
- **Wave 0 scaffold pattern**: Creating models, interfaces, and test stubs before implementation gave every phase testable targets from day 1
- **FeatureViewModelBase contract**: Establishing the async/cancel/progress pattern in Phase 1 meant Phases 2-4 had zero friction adding new features
- **BulkOperationRunner abstraction**: One shared helper gave consistent error semantics across 4 different bulk operations
- **Phase dependency ordering**: Foundation → Permissions → Storage → Bulk → Hardening prevented rework
- **Atomic commits per task**: Each plan produced clear, reviewable commit history

### What Was Inefficient
- **Phase 03 missing verification**: The only phase without a VERIFICATION.md — caught during milestone audit, but should have been produced during execution
- **Stale audit notes**: Phase 2 verification reported export buttons as hardcoded English, but they were actually already localized by the time of the audit — suggests verification reads code at a point-in-time snapshot that may not reflect later fixes
- **Cancel test locale mismatch**: The French locale test failure was flagged in Phase 3 plan 08 summary but deferred until post-milestone cleanup — should have been fixed inline

### Patterns Established
- Write-then-replace JSON persistence with SemaphoreSlim for thread safety
- TranslationSource singleton with PropertyChanged(string.Empty) for runtime culture switching
- ExecuteQueryRetryHelper for throttle-aware CSOM calls (429/503 detection)
- SharePointPaginationHelper with ListItemCollectionPosition for 5,000+ item lists
- CsvValidationService with auto-delimiter detection (comma/semicolon) and BOM handling
- DataGrid RowStyle DataTrigger for invalid-row visual highlighting

### Key Lessons
- Establish shared infrastructure patterns (auth, retry, pagination, progress) in Phase 1 — every subsequent phase benefits
- Test scaffolds (Wave 0) eliminate the "no tests until the end" anti-pattern
- Phase verifications should be mandatory during execution, not optional — catching Phase 03's gap at audit time is late
- Localization tests (key parity + diacritic spot-checks) are cheap and catch real bugs

---

## Cross-Milestone Trends

| Metric | v1.0 |
|--------|------|
| Phases | 5 |
| Plans | 36 |
| LOC | 10,071 |
| Tests | 134 pass / 22 skip |
| Timeline | 28 days |
| Commits | 164 |
