docs: create milestone v2.2 roadmap (5 phases, 11 requirements)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
Dev
2026-04-08 11:22:05 +02:00
parent 5ccf1688ea
commit 59ff5184ff
3 changed files with 114 additions and 30 deletions

View File

@@ -51,23 +51,23 @@ Which phases cover which requirements. Updated during roadmap creation.
| Requirement | Phase | Status | | Requirement | Phase | Status |
|-------------|-------|--------| |-------------|-------|--------|
| BRAND-01 | | Pending | | BRAND-01 | Phase 10 | Pending |
| BRAND-02 | | Pending | | BRAND-03 | Phase 10 | Pending |
| BRAND-03 | | Pending | | BRAND-06 | Phase 10 | Pending |
| BRAND-04 | | Pending | | BRAND-05 | Phase 11 | Pending |
| BRAND-05 | | Pending | | BRAND-04 | Phase 11 | Pending |
| BRAND-06 | | Pending | | BRAND-02 | Phase 12 | Pending |
| UDIR-01 | | Pending | | UDIR-01 | Phase 13 | Pending |
| UDIR-02 | | Pending | | UDIR-02 | Phase 13 | Pending |
| UDIR-03 | | Pending | | UDIR-03 | Phase 13 | Pending |
| UDIR-04 | | Pending | | UDIR-04 | Phase 13 | Pending |
| UDIR-05 | | Pending | | UDIR-05 | Phase 14 | Pending |
**Coverage:** **Coverage:**
- v2.2 requirements: 11 total - v2.2 requirements: 11 total
- Mapped to phases: 0 - Mapped to phases: 11
- Unmapped: 11 - Unmapped: 0
--- ---
*Requirements defined: 2026-04-08* *Requirements defined: 2026-04-08*
*Last updated: 2026-04-08 after initial definition* *Last updated: 2026-04-08 after roadmap creation — all 11 requirements mapped to Phases 10-14*

View File

@@ -4,6 +4,7 @@
-**v1.0 MVP** — Phases 1-5 (shipped 2026-04-07) — [archive](milestones/v1.0-ROADMAP.md) -**v1.0 MVP** — Phases 1-5 (shipped 2026-04-07) — [archive](milestones/v1.0-ROADMAP.md)
-**v1.1 Enhanced Reports** — Phases 6-9 (shipped 2026-04-08) — [archive](milestones/v1.1-ROADMAP.md) -**v1.1 Enhanced Reports** — Phases 6-9 (shipped 2026-04-08) — [archive](milestones/v1.1-ROADMAP.md)
- 🔄 **v2.2 Report Branding & User Directory** — Phases 10-14 (active)
## Phases ## Phases
@@ -28,9 +29,80 @@
</details> </details>
### v2.2 Report Branding & User Directory (Phases 10-14)
- [ ] **Phase 10: Branding Data Foundation** — Models, repository, and services for logo storage and user directory enumeration
- [ ] **Phase 11: HTML Export Branding + ViewModel Integration** — Inject logos into all 5 HTML report types; wire branding into export-triggering ViewModels and logo management commands
- [ ] **Phase 12: Branding UI Views** — Settings and profile dialog logo sections with live preview; auto-pull client logo from Entra branding API
- [ ] **Phase 13: User Directory ViewModel** — Browse mode state, paginated directory load, member/guest filter, and department/job title columns
- [ ] **Phase 14: User Directory View** — Toggle panel in UserAccessAuditView, user selection to trigger existing audit pipeline
## Phase Details
### Phase 10: Branding Data Foundation
**Goal**: The application can store, validate, and retrieve MSP and client logos as portable base64 strings in JSON, and can enumerate a full tenant user list with pagination.
**Depends on**: Nothing (additive to existing infrastructure)
**Requirements**: BRAND-01, BRAND-03, BRAND-06
**Success Criteria** (what must be TRUE):
1. An MSP logo imported as a PNG or JPG file is persisted as a base64 string in `branding.json` and survives an application restart
2. A client logo imported per tenant profile is persisted as a base64 string inside the tenant's profile JSON and is not affected by other tenants' profiles
3. A file larger than 512 KB or not a valid PNG/JPG is rejected at import time with an error; no invalid data reaches the JSON store
4. `GraphUserDirectoryService.GetUsersAsync` returns all enabled member users for a tenant, following `@odata.nextLink` until exhausted, without truncating at 999
**Plans**: TBD
### Phase 11: HTML Export Branding + ViewModel Integration
**Goal**: All five HTML reports display MSP and client logos in a consistent header, and administrators can manage logos from Settings and the profile dialog without touching the View layer.
**Depends on**: Phase 10
**Requirements**: BRAND-05, BRAND-04
**Success Criteria** (what must be TRUE):
1. Running any of the five HTML exports (Permissions, Storage, Search, Duplicates, User Access) produces an HTML file whose header contains the MSP logo `<img>` tag when an MSP logo is configured
2. When a client logo is configured for the active tenant, the same HTML export header contains both the MSP logo and the client logo side by side
3. When no logo is configured, the HTML export header contains no broken image placeholder and the report renders identically to the pre-branding output
4. SettingsViewModel exposes browse/clear commands for MSP logo; ProfileManagementViewModel exposes browse/clear commands for client logo — both commands are exercisable without opening any View
5. Auto-pulling the client logo from the tenant's Entra branding API stores the logo in the tenant profile and falls back silently when no Entra branding is configured
**Plans**: TBD
### Phase 12: Branding UI Views
**Goal**: Administrators can see, import, preview, and clear logos directly in the Settings and profile management dialogs.
**Depends on**: Phase 11
**Requirements**: BRAND-02, BRAND-04 (view layer for Entra pull)
**Success Criteria** (what must be TRUE):
1. Opening Settings shows the MSP logo section: an import button, a live thumbnail preview of the current logo, and a clear button that removes the logo immediately
2. Opening a tenant profile dialog shows the client logo section with the same import/preview/clear controls
3. Importing a logo via the UI shows the thumbnail preview without requiring an application restart
4. Clicking "Pull from Entra" in the profile dialog fetches and displays the tenant's banner logo if one exists, and shows a clear user-facing message if none is configured
**Plans**: TBD
### Phase 13: User Directory ViewModel
**Goal**: The UserAccessAuditViewModel supports a full directory browse mode with paginated load, member/guest filtering, and department/job title display, fully testable without the View.
**Depends on**: Phase 10
**Requirements**: UDIR-01, UDIR-02, UDIR-03, UDIR-04
**Success Criteria** (what must be TRUE):
1. `UserAccessAuditViewModel` exposes a toggle property that switches between Search mode (existing people-picker behavior) and Browse mode (directory list behavior), with no regression to Search mode behavior
2. Invoking the load-directory command fetches all enabled member users via `PageIterator`, updates a progress observable with the running user count, and supports cancellation mid-load
3. A "Members only / Include guests" toggle filters the displayed list in-memory without issuing a new Graph request
4. Each user row in the observable collection exposes DisplayName, UPN, Department, and JobTitle; Department and JobTitle columns are visible and sortable in the ViewModel's `ICollectionView`
**Plans**: TBD
### Phase 14: User Directory View
**Goal**: Administrators can toggle into directory browse mode from the user access audit tab, see the paginated user list with filters, and launch an access audit for a selected user.
**Depends on**: Phase 13
**Requirements**: UDIR-05, UDIR-01 (view layer)
**Success Criteria** (what must be TRUE):
1. The user access audit tab shows a mode toggle control (e.g., radio buttons or segmented control) that visibly switches the left panel between the existing people-picker and the directory browse panel
2. In browse mode, selecting a user from the directory list and clicking Run Audit (or equivalent) launches the existing audit pipeline for that user, producing the same results as if the user had been found via search
3. While the directory is loading, the panel shows a "Loading... X users" counter and an active cancel button; the load button is disabled to prevent concurrent requests
4. When the directory load is cancelled or fails, the panel returns to a ready state with a clear status message and no broken UI
**Plans**: TBD
## Progress ## Progress
| Phase | Milestone | Plans | Status | Completed | | Phase | Milestone | Plans | Status | Completed |
|-------|-----------|-------|--------|-----------| |-------|-----------|-------|--------|-----------|
| 1-5 | v1.0 | 36/36 | Shipped | 2026-04-07 | | 1-5 | v1.0 | 36/36 | Shipped | 2026-04-07 |
| 6-9 | v1.1 | 25/25 | Shipped | 2026-04-08 | | 6-9 | v1.1 | 25/25 | Shipped | 2026-04-08 |
| 10. Branding Data Foundation | v2.2 | 0/? | Not started | — |
| 11. HTML Export Branding + ViewModel Integration | v2.2 | 0/? | Not started | — |
| 12. Branding UI Views | v2.2 | 0/? | Not started | — |
| 13. User Directory ViewModel | v2.2 | 0/? | Not started | — |
| 14. User Directory View | v2.2 | 0/? | Not started | — |

View File

@@ -2,12 +2,12 @@
gsd_state_version: 1.0 gsd_state_version: 1.0
milestone: v2.2 milestone: v2.2
milestone_name: v2.2 Report Branding & User Directory milestone_name: v2.2 Report Branding & User Directory
status: defining-requirements status: roadmap-ready
stopped_at: Defining requirements stopped_at: Roadmap created — ready to plan Phase 10
last_updated: "2026-04-08T00:00:00Z" last_updated: "2026-04-08T00:00:00Z"
last_activity: 2026-04-08 — Milestone v2.2 started last_activity: 2026-04-08 — Roadmap created for v2.2 (Phases 10-14)
progress: progress:
total_phases: 0 total_phases: 5
completed_phases: 0 completed_phases: 0
total_plans: 0 total_plans: 0
completed_plans: 0 completed_plans: 0
@@ -20,17 +20,17 @@ progress:
See: .planning/PROJECT.md (updated 2026-04-08) See: .planning/PROJECT.md (updated 2026-04-08)
**Core value:** Administrators can audit and manage SharePoint/Teams permissions and storage across multiple client tenants from a single, reliable desktop application. **Core value:** Administrators can audit and manage SharePoint/Teams permissions and storage across multiple client tenants from a single, reliable desktop application.
**Current focus:** v2.2 Report Branding & User Directory — HTML report logos, user directory browse mode **Current focus:** v2.2 Report Branding & User Directory — HTML report logos (Phases 10-12), user directory browse mode (Phases 13-14)
## Current Position ## Current Position
Phase: Not started (defining requirements) Phase: 10 (not started)
Plan: — Plan: —
Status: Defining requirements Status: Roadmap ready — awaiting phase planning
Last activity: 2026-04-08 — Milestone v2.2 started Last activity: 2026-04-08 — Roadmap created for v2.2
``` ```
v2.2 Progress: [░░░░░░░░░░] 0% v2.2 Progress: [░░░░░░░░░░] 0% (0/5 phases)
``` ```
## Accumulated Context ## Accumulated Context
@@ -39,15 +39,26 @@ v2.2 Progress: [░░░░░░░░░░] 0%
Decisions are logged in PROJECT.md Key Decisions table. Decisions are logged in PROJECT.md Key Decisions table.
**v1.1 architectural notes:** **v2.2 architectural decisions (locked at roadmap):**
- 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. - Logos stored as base64 strings in JSON (not file paths). `BrandingSettings.cs` holds MSP logo; `TenantProfile` holds client logo. File path is discarded after import. This decision is locked — all downstream phases depend on it.
- Per-tab override (SITE-02) means each `FeatureViewModelBase` subclass stores a nullable local site override; null means "use global". - Client logo lives on `TenantProfile`, NOT in `BrandingSettings`. Per-tenant ownership; prevents serialization and deletion awkwardness.
- 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. - Export services use optional `ReportBranding? branding = null` parameter. All existing call sites compile unchanged. No new `IHtmlExportService` interface needed.
- Self-contained EXE constraint: charting library must not require runtime DLLs outside the publish output. - `GraphUserDirectoryService` is a new service, separate from `GraphUserSearchService`. Different pagination model (`PageIterator`), different cancellation needs.
- Directory does NOT load automatically on tab open. Explicit "Load Directory" button required to avoid blocking UI on large tenants.
- SVG logo support: rejected. XSS risk in data-URIs. PNG/JPG only.
- No new NuGet packages for v2.2. All capabilities provided by existing stack (BCL, Microsoft.Graph 5.74.0, WPF PresentationCore).
**v1.1 architectural notes (carried forward):**
- Global site selection (Phase 6) changes the toolbar; all tabs bind to shared `GlobalSiteSelectionViewModel`. `WeakReferenceMessenger` for cross-tab site-changed notifications.
- Per-tab override (SITE-02): each `FeatureViewModelBase` subclass stores a nullable local site override; null means "use global".
- Storage Visualization (Phase 9): LiveCharts2, WPF-native, self-contained friendly.
### Pending Todos ### Pending Todos
None. - Confirm `$filter=accountEnabled eq true and userType eq 'Member'` behavior without `ConsistencyLevel: eventual` against a real tenant before Phase 13 planning.
- Verify Entra `bannerLogo` stream endpoint returns empty body (not HTTP 404) when no tenant branding is configured — determines error handling branch for BRAND-04 auto-pull.
- Decide report header layout before Phase 11: logos side-by-side (current spec: `display: flex; gap: 16px`, MSP left + client right).
- Decide "Load Directory" button placement before Phase 14: inside browse panel (recommended) or tab-level toolbar.
### Blockers/Concerns ### Blockers/Concerns
@@ -56,5 +67,6 @@ None.
## Session Continuity ## Session Continuity
Last session: 2026-04-08 Last session: 2026-04-08
Stopped at: Milestone v2.2 started — defining requirements Stopped at: Roadmap created for v2.2 — ready to plan Phase 10
Resume file: None Resume file: None
Next step: `/gsd:plan-phase 10`