Eight self-contained HTML reports auditing the real source in src/PoMiniGames/.... Every asset is inlined — no CDN for Chart.js, Mermaid, fonts or CSS — so the files open safely over file://.
DOCS/
├── README.md # this file
├── build.mjs # assembles DOCS/*.html from _src/pages/*.html
├── _src/
│ ├── partials/
│ │ ├── theme.css # tokens + .card / .tiles / .chip / .sec + Okabe-Ito palette
│ │ └── shell.js # theme toggle + inline SVG chart helpers (no Chart.js)
│ ├── diagrams/ # hand-authored SVG (Mermaid output is one possible source)
│ └── pages/ # one .html per report, with <!--@MARKER--> placeholders
└── *.html # build output (do not edit by hand)
| Marker | What it expands to |
|---|---|
<!--@STYLE--> |
Inlined _src/partials/theme.css |
<!--@SHELL--> |
Inlined _src/partials/shell.js |
<!--@SVG:name--> |
Inlined _src/diagrams/<name>.svg |
<!--@RAIL:file--> |
Inlined _src/rails/<file> raw text (for code excerpts) |
<!--@HISTORY--> |
Inlined diagnostic_history.json if present; otherwise a labelled gap marker |
node DOCS/build.mjs --no-mmd # offline; uses pre-stored SVGs only
node DOCS/build.mjs # also runs `mmdc` on any *.mmd in _src/diagrams/ if installed
Dark by default. Toggle in the top-right persists per browser via localStorage. Tokens are CSS variables on :root and :root[data-theme="light"] — every chart picks them up automatically.
Every report is grounded in real source paths in src/PoMiniGames/.... Invented numbers are never used; gaps are surfaced as findings.
| Report | Source audit |
|---|---|
ai-services.html |
src/PoMiniGames/Features/*/*.cs, Infrastructure/GameServicesExtensions.cs, AI/AIFoundryOptions.cs |
architecture.html |
Program.cs, Infrastructure/EndpointRouteExtensions.cs, Features/*/*Endpoints.cs |
slice-isolation.html |
*.csproj ProjectReferences, layer-leak heuristics |
auth-lifecycle.html |
Features/Auth/, Infrastructure/AuthExtensions.cs, DataProtectionExtensions.cs, Client/Services/AuthStateService.cs |
diagnostic-metrics.html |
Features/Diagnostics/*, ConfigurationDiagnosticsSnapshotProvider.cs, TelemetryExtensions.cs |
testing-tier-hierarchy.html |
tests/*TestCountCeilingTests.cs, scripts/_count-tests.ps1 |
roles-permissions-matrix.html |
grep across src/ for RequireRole, [Authorize(Roles=…)], IsInRole |
user-workflow.html |
Features/PoCoupleQuiz/, Features/PoFunQuiz/, Features/MatchHistory/, Infrastructure/Services/StorageService.cs |
The DIAGNOSTIC_METRICS report reads DOCS/diagnostic_history.json via <!--@HISTORY-->. If that JSON is absent (this workspace), the build emits a labelled gap token and the page shows:
- Three empty charts (interactiveMs, CLS, WASM memory) with a clear "no samples" badge.
- A live inventory of what the app does instrument (
/api/diag,/api/diag/telemetry,/api/health,/api/mockables,/api/logs/tail) — all configuration/status, no client-runtime TTFB/CLS/JS-heap.
The pipeline is not rebuilt from scratch. To populate it, write a DOCS/collect-vitals.mjs that:
- Starts Azurite + the API host if they aren't already up (idempotent).
- Navigates to representative routes with Playwright, recording
performance.now()deltas around theloadevent, the WASMinteractiveMsbaseline (e.g. the time the Blazor runtime raisesenhancedloador the firstrenderof the root component), CLS viaPerformanceObserver, andperformance.memory.usedJSHeapSizesnapshots every 250 ms. - Appends samples to
DOCS/diagnostic_history.jsonwithruns >= 8per prompt Step 0.
Until that script exists, the report is honest about its absence.