# 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 |