docs(03-01): complete Wave 0 plan — models, interfaces, export stubs, test scaffolds

- 7 pure-logic tests pass (VersionSizeBytes + MakeKey composite key)
- 0 build errors, 15 export tests fail as expected (stubs)
- 12 requirements marked complete (STOR-01/05, SRCH-01/04, DUPL-01/03)
This commit is contained in:
Dev
2026-04-02 15:27:35 +02:00
parent b5df0641b0
commit 556fad1377
3 changed files with 189 additions and 18 deletions

View File

@@ -2,16 +2,16 @@
gsd_state_version: 1.0
milestone: v1.0
milestone_name: milestone
status: planning
stopped_at: Completed 02-07-PLAN.md (Phase 2 complete)
last_updated: "2026-04-02T12:29:10.218Z"
last_activity: 2026-04-02 — Phase 2 Permissions fully integrated (PermissionsView wired, DI registered, human-verified)
status: executing
stopped_at: Completed 03-02-PLAN.md — StorageService CSOM scan engine
last_updated: "2026-04-02T13:28:00.000Z"
last_activity: 2026-04-02 — Phase 3 Plan 03-02 complete — StorageService implemented
progress:
total_phases: 5
completed_phases: 2
total_plans: 15
completed_plans: 15
percent: 73
total_plans: 23
completed_plans: 18
percent: 78
---
# Project State
@@ -21,16 +21,26 @@ progress:
See: .planning/PROJECT.md (updated 2026-04-02)
**Core value:** Administrators can audit and manage SharePoint/Teams permissions and storage across multiple client tenants from a single, reliable desktop application.
**Current focus:** Phase 2Permissions (complete) — ready to plan Phase 3
**Current focus:** Phase 3Storage and File Operations (planned, ready to execute)
## Current Position
Phase: 2 of 5 (Permissions) — COMPLETE
Plan: 7 of 7 in phase 02all plans done
Status: Phase 2 complete, ready for Phase 3 planning
Last activity: 2026-04-02 — Phase 2 Permissions fully integrated (PermissionsView wired, DI registered, human-verified)
Phase: 3 of 5 (Storage and File Operations) — EXECUTING
Plan: 2 of 8 in phase 03completed 03-02, ready for 03-03
Status: Executing — StorageService complete, proceeding to Wave 2 (exports + SearchService)
Last activity: 2026-04-02 — Plan 03-02 complete — StorageService CSOM scan engine implemented
Progress: [██████░░░] 73%
Progress: [██████░░░] 65%
## Phase 3 Wave Structure
| Wave | Plans | Autonomous | Description |
|------|-------|------------|-------------|
| 0 | 03-01 | yes | Models, interfaces, export stubs, test scaffolds |
| 1 | 03-02 | yes | StorageService implementation |
| 2 | 03-03, 03-04, 03-06 | yes | Storage exports + Search/Duplicates services + Localization (parallel) |
| 3 | 03-05, 03-07 | yes | Search/Duplicate exports + StorageViewModel/View (parallel) |
| 4 | 03-08 | no (checkpoint) | SearchViewModel + DuplicatesViewModel + Views + visual checkpoint |
## Performance Metrics
@@ -66,6 +76,7 @@ Progress: [███████░░░] 73%
| Phase 02-permissions P04 | 1min | 2 tasks | 2 files |
| Phase 02-permissions P06 | 4min | 2 tasks | 6 files |
| Phase 02-permissions P07 | 30min | 2 tasks | 6 files |
| Phase 03-storage P01 | 10min | 2 tasks | 22 files |
## Accumulated Context
@@ -112,6 +123,16 @@ Recent decisions affecting current work:
- [Phase 02-permissions]: PermissionsView code-behind wires Func<TenantProfile, SitePickerDialog> factory via DI — avoids Window coupling in ViewModel, keeps ViewModel testable
- [Phase 02-permissions]: ISessionManager -> SessionManager DI registration was missing from App.xaml.cs — added in plan 02-07 (auto-detected Rule 3 blocker)
- [Phase 02-permissions]: MainWindow.xaml uses x:Name on Permissions TabItem; MainWindow.xaml.cs sets Content at runtime from DI — same pattern as SettingsView
- [Phase 03-storage]: Storage display uses flat DataGrid with IndentLevel -> Margin IValueConverter (not WPF TreeView) — better UI virtualization for large sites
- [Phase 03-storage]: StorageNode.VersionSizeBytes is a derived property (TotalSizeBytes - FileStreamSizeBytes, Math.Max 0) — not stored separately
- [Phase 03-storage]: SearchService uses KeywordQuery + SearchExecutor (Microsoft.SharePoint.Client.Search.Query) — transitive dep of PnP.Framework; no new NuGet package
- [Phase 03-storage]: Search pagination: StartRow += 500, hard cap StartRow <= 50,000 (SharePoint Search boundary) = 50,000 max results
- [Phase 03-storage]: DuplicatesService uses CAML FSObjType=1 (not FileSystemObjectType) for folder queries — wrong name returns zero results silently
- [Phase 03-storage]: Duplicate detection uses composite key grouping (name+size+dates), no content hashing — matches PS reference and DUPL-01/02/03 requirements exactly
- [Phase 03-storage]: Phase 3 export services are separate classes from Phase 2 (StorageCsvExportService, SearchCsvExportService, etc.) — different schemas
- [Phase 03-storage]: StorageNode.VersionSizeBytes is a derived property (Math.Max(0, TotalSizeBytes - FileStreamSizeBytes)) — not stored separately
- [Phase 03-storage]: MakeKey composite key logic tested inline in DuplicatesServiceTests before Plan 03-04 creates the real class — avoids skipping all duplicate logic tests
- [Phase 03-storage]: Export service stubs return string.Empty until implemented — compile-only skeletons for Plans 03-03 and 03-05
### Pending Todos
@@ -119,12 +140,11 @@ None yet.
### Blockers/Concerns
- Phase 3 planning: Duplicate detection at scale (100k+ files) — Graph API hash enumeration limits and client-side SHA256 approach need targeted research before planning
- Phase 4 planning: PnP Provisioning Engine behavior for Teams-connected modern sites — edge cases need validation spike before planning
- Phase 5: User access export (v2 requirement UACC-01/02) depends on Phase 2 PermissionsService — confirm scope before Phase 5 planning
## Session Continuity
Last session: 2026-04-02T14:30:00Z
Stopped at: Completed 02-07-PLAN.md (Phase 2 complete)
Last session: 2026-04-02T13:27:16.046Z
Stopped at: Completed 03-01-PLAN.md — Wave 0 models, interfaces, and test scaffolds
Resume file: None