--- gsd_state_version: 1.0 milestone: v1.0 milestone_name: milestone status: completed stopped_at: Completed 06-01-PLAN.md — GlobalSitesChangedMessage and FeatureViewModelBase extension done last_updated: "2026-04-07T08:04:57.041Z" last_activity: 2026-04-07 — Roadmap created (Phases 6-9), 10/10 requirements mapped progress: total_phases: 4 completed_phases: 0 total_plans: 5 completed_plans: 2 --- # Project State ## Project Reference See: .planning/PROJECT.md (updated 2026-04-07) **Core value:** Administrators can audit and manage SharePoint/Teams permissions and storage across multiple client tenants from a single, reliable desktop application. **Current focus:** v1.1 Enhanced Reports — global site selection, user access audit, simplified permissions, storage visualization ## Current Position Phase: 6 — Global Site Selection (not started) Plan: — Status: Roadmap complete, awaiting first plan Last activity: 2026-04-07 — Roadmap created (Phases 6-9), 10/10 requirements mapped ``` v1.1 Progress: [ ] 0% Phase 6 [ ] → Phase 7 [ ] → Phase 8 [ ] → Phase 9 [ ] ``` ## Performance Metrics | Metric | v1.0 | v1.1 (running) | |--------|------|----------------| | Phases | 5 | 4 planned | | Plans | 36 | TBD | | Commits | 164 | 0 | | Tests | 134 pass / 22 skip | — | | Phase 06-global-site-selection P02 | 8 | 1 tasks | 1 files | | Phase 06-global-site-selection P01 | 2 | 2 tasks | 3 files | ## Accumulated Context ### Decisions Decisions are logged in PROJECT.md Key Decisions table. **v1.1 architectural notes:** - Global site selection (Phase 6) changes the toolbar; all tabs must bind to a shared `GlobalSiteSelectionViewModel` or equivalent. Use `WeakReferenceMessenger` for cross-tab site-changed notifications, consistent with v1.0 messenger usage. - Per-tab override (SITE-02) means each `FeatureViewModelBase` subclass stores a nullable local site override; null means "use global". - Storage Visualization (Phase 9) requires a WPF charting NuGet (LiveCharts2 recommended — actively maintained, WPF-native, self-contained friendly). Wire chart data binding to the existing storage scan result model. - Self-contained EXE constraint: charting library must not require runtime DLLs outside the publish output. - [Phase 06-02]: MainWindowViewModel uses Func? factory for SitePickerDialog and broadcasts GlobalSitesChangedMessage via WeakReferenceMessenger on collection change - [Phase 06-01]: GlobalSitesChangedMessage uses IReadOnlyList (snapshot, not ObservableCollection) so receivers cannot mutate sender state - [Phase 06-01]: FeatureViewModelBase.OnGlobalSitesReceived (private) updates GlobalSites then calls OnGlobalSitesChanged (protected virtual) — separates storage from derived class hooks ### Pending Todos 1. Add global multi-site selection option (ui) — `todos/pending/2026-04-07-add-global-multi-site-selection-option.md` — **addressed by Phase 6** ### Blockers/Concerns None. ## Session Continuity Last session: 2026-04-07T08:04:57.038Z Stopped at: Completed 06-01-PLAN.md — GlobalSitesChangedMessage and FeatureViewModelBase extension done Resume file: None