--- phase: 11 slug: html-export-branding status: draft nyquist_compliant: true wave_0_complete: false created: 2026-04-08 --- # Phase 11 — Validation Strategy > Per-phase validation contract for feedback sampling during execution. --- ## Test Infrastructure | Property | Value | |----------|-------| | **Framework** | xUnit 2.9.3 + Moq 4.20.72 | | **Config file** | `SharepointToolbox.Tests/SharepointToolbox.Tests.csproj` | | **Quick run command** | `dotnet test SharepointToolbox.Tests --filter "FullyQualifiedName~Export" --no-build -q` | | **Full suite command** | `dotnet test SharepointToolbox.Tests --no-build` | | **Estimated runtime** | ~15 seconds | --- ## Sampling Rate - **After every task commit:** `dotnet test SharepointToolbox.Tests --filter "FullyQualifiedName~Export" --no-build -q` - **After every plan wave:** `dotnet test SharepointToolbox.Tests --no-build` - **Before `/gsd:verify-work`:** Full suite must be green - **Max feedback latency:** 15 seconds --- ## Per-Task Verification Map | Task ID | Plan | Wave | Requirement | Test Type | Automated Command | File Exists | Status | |---------|------|------|-------------|-----------|-------------------|-------------|--------| | 11-01-01 | 01 | 1 | BRAND-05 | unit | `dotnet test --filter "FullyQualifiedName~BrandingHtmlHelper" --no-build` | No (W0) | pending | | 11-02-01 | 02 | 2 | BRAND-05 | unit | `dotnet test --filter "FullyQualifiedName~Export" --no-build -q` | Yes (extend) | pending | | 11-02-02 | 02 | 2 | BRAND-05 | unit | same as above | Yes (extend) | pending | | 11-03-01 | 03 | 3 | BRAND-05 | integration | `dotnet build --no-restore -warnaserror && dotnet test --no-build -q` | Yes (compile check) | pending | | 11-04-01 | 04 | 1 | BRAND-04 | unit | `dotnet test --filter "FullyQualifiedName~ProfileService" --no-build` | Yes (extend) | pending | | 11-04-02 | 04 | 1 | BRAND-04 | unit | `dotnet test --filter "FullyQualifiedName~SettingsViewModel or FullyQualifiedName~ProfileManagement" --no-build` | No (W0) | pending | *Status: pending / green / red / flaky* --- ## Wave 0 Requirements - [ ] `SharepointToolbox.Tests/Services/Export/BrandingHtmlHelperTests.cs` — covers BRAND-05a/b/c (both logos, single logo, no logos) - [ ] `SharepointToolbox.Tests/ViewModels/SettingsViewModelLogoTests.cs` — covers MSP logo browse/clear commands - [ ] `SharepointToolbox.Tests/ViewModels/ProfileManagementViewModelLogoTests.cs` — covers client logo + auto-pull (BRAND-04) - [ ] Extend existing `HtmlExportServiceTests.cs` — covers BRAND-05d/e (branding present/absent) - [ ] Extend existing `SearchExportServiceTests.cs`, `StorageHtmlExportServiceTests.cs`, `DuplicatesHtmlExportServiceTests.cs`, `UserAccessHtmlExportServiceTests.cs` — covers BRAND-05f *Existing infrastructure covers test framework setup.* --- ## Requirements -> Test Map | Req ID | Behavior | Test Type | Automated Command | File Exists? | |--------|----------|-----------|-------------------|-------------| | BRAND-05a | BrandingHtmlHelper produces correct HTML for both logos | unit | `dotnet test --filter "FullyQualifiedName~BrandingHtmlHelper" --no-build -q` | No - Wave 0 | | BRAND-05b | BrandingHtmlHelper produces empty string for no logos | unit | same as above | No - Wave 0 | | BRAND-05c | BrandingHtmlHelper handles single logo (MSP only / client only) | unit | same as above | No - Wave 0 | | BRAND-05d | HtmlExportService.BuildHtml with branding includes header | unit | `dotnet test --filter "FullyQualifiedName~HtmlExportServiceTests" --no-build -q` | Yes (extend) | | BRAND-05e | HtmlExportService.BuildHtml without branding unchanged | unit | same as above | Yes (extend) | | BRAND-05f | Each of 5 exporters injects branding header between body and h1 | unit | `dotnet test --filter "FullyQualifiedName~Export" --no-build -q` | Partially (extend existing) | | BRAND-04a | Auto-pull handles 404 (no branding) gracefully | unit | `dotnet test --filter "FullyQualifiedName~AutoPull" --no-build -q` | No - Wave 0 | | BRAND-04b | Auto-pull handles empty stream gracefully | unit | same as above | No - Wave 0 | --- ## Manual-Only Verifications | Behavior | Requirement | Why Manual | Test Instructions | |----------|-------------|------------|-------------------| | MSP logo appears in exported HTML report | BRAND-05 | Requires visual inspection of rendered HTML | 1. Import MSP logo 2. Run permissions export 3. Open HTML in browser 4. Verify logo in header | | Both logos side by side in report header | BRAND-05 | Requires visual layout check | 1. Import MSP and client logo 2. Run any export 3. Verify both logos rendered side by side | | No broken images when no logo configured | BRAND-05 | Requires visual regression check | 1. Clear all logos 2. Run export 3. Compare output to pre-branding export | | Auto-pull from tenant without Entra branding | BRAND-04 | Requires live tenant without branding | 1. Select tenant without Entra branding 2. Click auto-pull 3. Verify silent fallback (no crash, no broken state) | --- ## Validation Sign-Off - [x] All tasks have `` verify or Wave 0 dependencies - [x] Sampling continuity: no 3 consecutive tasks without automated verify - [x] Wave 0 covers all MISSING references - [x] No watch-mode flags - [x] Feedback latency < 15s - [x] `nyquist_compliant: true` set in frontmatter **Approval:** approved