diff --git a/assets/theme-v2/svg/README.md b/assets/theme-v2/svg/README.md
new file mode 100644
index 000000000..8e6708164
--- /dev/null
+++ b/assets/theme-v2/svg/README.md
@@ -0,0 +1,35 @@
+# GFS Icon Pack v1 Core
+
+The SVG files in `assets/theme-v2/svg/` are the authoritative Theme V2 icon source.
+
+These files are user-authored and approved. Do not regenerate, redesign, simplify, optimize, or redraw these SVG files during validation-only PRs.
+
+If a required SVG is missing, report validation failure instead of generating a replacement.
+
+Required validation:
+- each required file exists under `assets/theme-v2/svg/`
+- each SVG is well-formed XML
+- each SVG uses `viewBox="0 0 24 24"`
+- each SVG uses `fill="none"`
+- each SVG uses `stroke="currentColor"`
+- each SVG uses `stroke-linecap="round"`
+- each SVG uses `stroke-linejoin="round"`
+
+Required filenames:
+- `gfs-chevron-left.svg`
+- `gfs-chevron-right.svg`
+- `gfs-chevron-up.svg`
+- `gfs-chevron-down.svg`
+- `gfs-add.svg`
+- `gfs-subtract.svg`
+- `gfs-trash.svg`
+- `gfs-close.svg`
+- `gfs-warning.svg`
+- `gfs-error.svg`
+- `gfs-success.svg`
+- `gfs-info.svg`
+- `gfs-fullscreen.svg`
+- `gfs-exit-fullscreen.svg`
+- `gfs-menu.svg`
+- `gfs-search.svg`
+- `gfs-settings.svg`
diff --git a/assets/theme-v2/svg/gfs-add.svg b/assets/theme-v2/svg/gfs-add.svg
new file mode 100644
index 000000000..fc1f55539
--- /dev/null
+++ b/assets/theme-v2/svg/gfs-add.svg
@@ -0,0 +1,3 @@
+
diff --git a/assets/theme-v2/svg/gfs-chevron-down.svg b/assets/theme-v2/svg/gfs-chevron-down.svg
new file mode 100644
index 000000000..d0d8fc919
--- /dev/null
+++ b/assets/theme-v2/svg/gfs-chevron-down.svg
@@ -0,0 +1,4 @@
+
diff --git a/assets/theme-v2/svg/gfs-chevron-left.svg b/assets/theme-v2/svg/gfs-chevron-left.svg
new file mode 100644
index 000000000..4eb2f252b
--- /dev/null
+++ b/assets/theme-v2/svg/gfs-chevron-left.svg
@@ -0,0 +1,4 @@
+
diff --git a/assets/theme-v2/svg/gfs-chevron-right.svg b/assets/theme-v2/svg/gfs-chevron-right.svg
new file mode 100644
index 000000000..fa1c8756b
--- /dev/null
+++ b/assets/theme-v2/svg/gfs-chevron-right.svg
@@ -0,0 +1,4 @@
+
diff --git a/assets/theme-v2/svg/gfs-chevron-up.svg b/assets/theme-v2/svg/gfs-chevron-up.svg
new file mode 100644
index 000000000..7a78b6228
--- /dev/null
+++ b/assets/theme-v2/svg/gfs-chevron-up.svg
@@ -0,0 +1,4 @@
+
diff --git a/assets/theme-v2/svg/gfs-close.svg b/assets/theme-v2/svg/gfs-close.svg
new file mode 100644
index 000000000..39102f591
--- /dev/null
+++ b/assets/theme-v2/svg/gfs-close.svg
@@ -0,0 +1,5 @@
+
diff --git a/assets/theme-v2/svg/gfs-error.svg b/assets/theme-v2/svg/gfs-error.svg
new file mode 100644
index 000000000..4a238b039
--- /dev/null
+++ b/assets/theme-v2/svg/gfs-error.svg
@@ -0,0 +1,6 @@
+
diff --git a/assets/theme-v2/svg/gfs-exit-fullscreen.svg b/assets/theme-v2/svg/gfs-exit-fullscreen.svg
new file mode 100644
index 000000000..1668df0cb
--- /dev/null
+++ b/assets/theme-v2/svg/gfs-exit-fullscreen.svg
@@ -0,0 +1,10 @@
+
diff --git a/assets/theme-v2/svg/gfs-fullscreen.svg b/assets/theme-v2/svg/gfs-fullscreen.svg
new file mode 100644
index 000000000..01e9038db
--- /dev/null
+++ b/assets/theme-v2/svg/gfs-fullscreen.svg
@@ -0,0 +1,10 @@
+
diff --git a/assets/theme-v2/svg/gfs-info.svg b/assets/theme-v2/svg/gfs-info.svg
new file mode 100644
index 000000000..09d7d69cf
--- /dev/null
+++ b/assets/theme-v2/svg/gfs-info.svg
@@ -0,0 +1,6 @@
+
diff --git a/assets/theme-v2/svg/gfs-menu.svg b/assets/theme-v2/svg/gfs-menu.svg
new file mode 100644
index 000000000..b0c5e2f3f
--- /dev/null
+++ b/assets/theme-v2/svg/gfs-menu.svg
@@ -0,0 +1,5 @@
+
diff --git a/assets/theme-v2/svg/gfs-search.svg b/assets/theme-v2/svg/gfs-search.svg
new file mode 100644
index 000000000..b510e781d
--- /dev/null
+++ b/assets/theme-v2/svg/gfs-search.svg
@@ -0,0 +1,6 @@
+
diff --git a/assets/theme-v2/svg/gfs-settings.svg b/assets/theme-v2/svg/gfs-settings.svg
new file mode 100644
index 000000000..dd6c28ab9
--- /dev/null
+++ b/assets/theme-v2/svg/gfs-settings.svg
@@ -0,0 +1,4 @@
+
diff --git a/assets/theme-v2/svg/gfs-subtract.svg b/assets/theme-v2/svg/gfs-subtract.svg
new file mode 100644
index 000000000..ce6830ad6
--- /dev/null
+++ b/assets/theme-v2/svg/gfs-subtract.svg
@@ -0,0 +1,3 @@
+
diff --git a/assets/theme-v2/svg/gfs-success.svg b/assets/theme-v2/svg/gfs-success.svg
new file mode 100644
index 000000000..75250a125
--- /dev/null
+++ b/assets/theme-v2/svg/gfs-success.svg
@@ -0,0 +1,5 @@
+
diff --git a/assets/theme-v2/svg/gfs-trash.svg b/assets/theme-v2/svg/gfs-trash.svg
new file mode 100644
index 000000000..cefdcd71f
--- /dev/null
+++ b/assets/theme-v2/svg/gfs-trash.svg
@@ -0,0 +1,8 @@
+
diff --git a/assets/theme-v2/svg/gfs-warning.svg b/assets/theme-v2/svg/gfs-warning.svg
new file mode 100644
index 000000000..f02b83750
--- /dev/null
+++ b/assets/theme-v2/svg/gfs-warning.svg
@@ -0,0 +1,6 @@
+
diff --git a/docs_build/design/theme-v2-icons/theme-v2-icon-style-guide.md b/docs_build/design/theme-v2-icons/theme-v2-icon-style-guide.md
new file mode 100644
index 000000000..1cece82cc
--- /dev/null
+++ b/docs_build/design/theme-v2-icons/theme-v2-icon-style-guide.md
@@ -0,0 +1,55 @@
+# Theme V2 Icon Style Guide
+
+## Purpose
+Provide the approved validation and usage language for shared Theme V2 SVG icons.
+
+The SVG files in `assets/theme-v2/svg/` are the authoritative Theme V2 icon source.
+
+## Artwork Authority
+The SVG artwork is user-authored and approved.
+
+Do not regenerate, redesign, simplify, optimize, or redraw these SVG files during validation-only PRs.
+
+If a required SVG is missing, report validation failure instead of generating a replacement.
+
+Do not replace the SVG files with CSS-only or JS-only icon generation.
+
+## SVG Validation Standard
+Every required SVG must be a standalone file under `assets/theme-v2/svg/`.
+
+Every required SVG must be well-formed XML.
+
+Every required SVG must use:
+- `viewBox="0 0 24 24"`
+- `fill="none"`
+- `stroke="currentColor"`
+- `stroke-linecap="round"`
+- `stroke-linejoin="round"`
+
+The approved files may include additional SVG attributes or path geometry as authored. Validation should not inspect, simplify, optimize, or rewrite artwork geometry.
+
+## Required Icon Files
+- `gfs-chevron-left.svg`
+- `gfs-chevron-right.svg`
+- `gfs-chevron-up.svg`
+- `gfs-chevron-down.svg`
+- `gfs-add.svg`
+- `gfs-subtract.svg`
+- `gfs-trash.svg`
+- `gfs-close.svg`
+- `gfs-warning.svg`
+- `gfs-error.svg`
+- `gfs-success.svg`
+- `gfs-info.svg`
+- `gfs-fullscreen.svg`
+- `gfs-exit-fullscreen.svg`
+- `gfs-menu.svg`
+- `gfs-search.svg`
+- `gfs-settings.svg`
+
+## Naming Rules
+Use `trash` naming instead of `delete`.
+
+Use `fullscreen` and `exit-fullscreen` naming.
+
+Do not add `expand`, `collapse`, or `delete` SVG names in this registry.
diff --git a/docs_build/dev/BUILD_PR.md b/docs_build/dev/BUILD_PR.md
index f4bc1e8e4..0a9dd074a 100644
--- a/docs_build/dev/BUILD_PR.md
+++ b/docs_build/dev/BUILD_PR.md
@@ -1,74 +1,109 @@
-# PR_26175_ALFA_011-status-bar-journey-progress-context
+# PR_26175_ALFA_047-theme-v2-svg-icon-registry
## Purpose
-Add right-anchored progress context to the shared toolbox status bar using the existing Game Journey completion metrics/API pipeline.
+Create a shared Theme V2 SVG icon asset registry and authoritative validation specification so toolbox and platform UI can use approved standalone SVG files from one repo-owned source instead of page-local SVG, ad hoc CSS drawings, Font Awesome glyphs, conversation screenshots, vague row references, CSS-only generation, or a JS-only registry.
## Source Of Truth
-This `BUILD_PR.md` is the source of truth for `PR_26175_ALFA_011-status-bar-journey-progress-context`.
+This `BUILD_PR.md` is the source of truth for `PR_26175_ALFA_047-theme-v2-svg-icon-registry`.
## Exact Scope
-- Preserve the ALFA_009 single-row toolbox status bar behavior:
- - left side displays only the selected Game Hub game name.
- - center displays only the current status message.
-- Add right-anchored progress text in this format:
- - `{CurrentTool} {complete}/{total} ({percent}%) | Journey {complete}/{total} ({percent}%)`
-- Use existing Game Journey completion metrics/API pipeline for Journey totals.
-- Derive current-tool progress from the existing completion metrics record that matches the current toolbox tool/section.
-- Do not add new storage.
-- Do not use browser-owned authoritative progress data.
-- Preserve fullscreen bottom anchoring and existing fullscreen content bottom reserve.
-- Preserve normal placement above the footer.
-- Use shared Theme V2 CSS/classes only.
-- Update targeted Playwright coverage for the right-anchored progress text and existing left/center behavior.
+- Remove the incorrect JS-only icon registry implementation from the ALFA_047 delta.
+- Use the user-authored SVG files already present under `assets/theme-v2/svg/` as the authoritative source.
+- Do not regenerate, redesign, simplify, optimize, or redraw any SVG icon artwork in this PR.
+- Required SVG files:
+ - `gfs-chevron-left.svg`
+ - `gfs-chevron-right.svg`
+ - `gfs-chevron-up.svg`
+ - `gfs-chevron-down.svg`
+ - `gfs-add.svg`
+ - `gfs-subtract.svg`
+ - `gfs-trash.svg`
+ - `gfs-close.svg`
+ - `gfs-warning.svg`
+ - `gfs-error.svg`
+ - `gfs-success.svg`
+ - `gfs-info.svg`
+ - `gfs-fullscreen.svg`
+ - `gfs-exit-fullscreen.svg`
+ - `gfs-menu.svg`
+ - `gfs-search.svg`
+ - `gfs-settings.svg`
+- Validate each required SVG is well-formed XML.
+- Validate each SVG uses `viewBox="0 0 24 24"`, `fill="none"`, `stroke="currentColor"`, `stroke-linecap="round"`, and `stroke-linejoin="round"`.
+- Do not create `expand` or `collapse` icon naming.
+- Do not create `delete` icon naming.
+- Do not replace the standalone SVG assets with a JS-only icon registry.
+- Do not replace the standalone SVG assets with CSS-only icon generation.
+- Create `docs_build/design/theme-v2-icons/theme-v2-icon-style-guide.md` as the authoritative specification for all future Theme V2 SVG icons.
+- Create or update `assets/theme-v2/svg/README.md` as the registry documentation for the authoritative SVG asset pack.
+- Document the approved validation rules and the no-regeneration/no-redesign policy.
+- If any required SVG is missing, report validation failure instead of generating a replacement.
+- Do not convert existing UI controls in this PR.
## Exact Targets
- `docs_build/dev/BUILD_PR.md`
-- `assets/theme-v2/js/toolbox-status-bar.js`
-- `assets/theme-v2/css/status.css`
-- `tests/playwright/tools/ToolboxSelectedGameStatusBar.spec.mjs`
-- `docs_build/dev/reports/PR_26175_ALFA_011-status-bar-journey-progress-context_report.md`
-- `docs_build/dev/reports/PR_26175_ALFA_011-status-bar-journey-progress-context_validation-lane.md`
-- `docs_build/dev/reports/PR_26175_ALFA_011-status-bar-journey-progress-context_requirements-checklist.md`
+- `assets/theme-v2/svg/gfs-chevron-left.svg`
+- `assets/theme-v2/svg/gfs-chevron-right.svg`
+- `assets/theme-v2/svg/gfs-chevron-up.svg`
+- `assets/theme-v2/svg/gfs-chevron-down.svg`
+- `assets/theme-v2/svg/gfs-add.svg`
+- `assets/theme-v2/svg/gfs-subtract.svg`
+- `assets/theme-v2/svg/gfs-trash.svg`
+- `assets/theme-v2/svg/gfs-close.svg`
+- `assets/theme-v2/svg/gfs-warning.svg`
+- `assets/theme-v2/svg/gfs-error.svg`
+- `assets/theme-v2/svg/gfs-success.svg`
+- `assets/theme-v2/svg/gfs-info.svg`
+- `assets/theme-v2/svg/gfs-fullscreen.svg`
+- `assets/theme-v2/svg/gfs-exit-fullscreen.svg`
+- `assets/theme-v2/svg/gfs-menu.svg`
+- `assets/theme-v2/svg/gfs-search.svg`
+- `assets/theme-v2/svg/gfs-settings.svg`
+- `assets/theme-v2/svg/README.md`
+- `docs_build/design/theme-v2-icons/theme-v2-icon-style-guide.md`
+- `tests/playwright/tools/ThemeV2SvgIconRegistry.spec.mjs`
+- `docs_build/dev/reports/PR_26175_ALFA_047-theme-v2-svg-icon-registry_report.md`
+- `docs_build/dev/reports/PR_26175_ALFA_047-theme-v2-svg-icon-registry_validation-lane.md`
+- `docs_build/dev/reports/PR_26175_ALFA_047-theme-v2-svg-icon-registry_requirements-checklist.md`
+- `docs_build/dev/reports/PR_26175_ALFA_047-theme-v2-svg-icon-registry_manual-validation-notes.md`
- `docs_build/dev/reports/codex_review.diff`
- `docs_build/dev/reports/codex_changed_files.txt`
## Evidence Sources
-- `assets/js/shared/game-journey-api-client.js`
-- `src/api/game-journey-completion-api-client.js`
-- `src/dev-runtime/server/local-api-router.mjs`
-- `src/dev-runtime/persistence/game-journey-completion-metrics-store.mjs`
+- `docs_build/pr/PLAN_PR_26175_ALFA_047-theme-v2-svg-icon-registry.md`
+- `assets/theme-v2/images/gfs-chevron-down.svg`
+- `assets/theme-v2/images/gfs-chevron-up.svg`
## Out Of Scope
-- No Game Journey API/service/repository contract changes.
-- No new persistence/storage.
+- No chevron conversion.
+- No status/action icon conversion.
+- No layout utility icon conversion.
+- No JS-only icon registry.
+- No CSS-only icon generation.
+- No Theme V2 CSS changes.
+- No runtime UI conversion.
+- No accordion conversion.
+- No Font Awesome removal.
+- No broad visual redesign.
+- No page-local CSS.
+- No inline styles.
+- No style blocks.
- No browser-owned product data as source of truth.
-- No silent fallback data.
-- No environment/server details in the status bar.
-- No selected game purpose in the visible status bar.
-- No visible status category labels in the status bar.
-- No large banners.
-- No modal messages or modal-style status messages.
-- No row highlights.
-- No inline styles, style blocks, or page-local CSS.
+- No API/service/repository contract changes.
- No engine core changes.
- No `start_of_day` folder changes.
## Validation
-Run targeted Playwright coverage:
+Run exactly:
```powershell
-npx playwright test tests/playwright/tools/ToolboxSelectedGameStatusBar.spec.mjs --workers=1
-```
-
-Also verify changed source does not introduce inline styles or style blocks:
-
-```powershell
-rg -n "<[s]tyle|[s]tyle=" assets/theme-v2/js/toolbox-status-bar.js assets/theme-v2/css/status.css tests/playwright/tools/ToolboxSelectedGameStatusBar.spec.mjs
+npx playwright test tests/playwright/tools/ThemeV2SvgIconRegistry.spec.mjs --workers=1
+rg -n "<[s]tyle|[s]tyle=" docs_build/design/theme-v2-icons/theme-v2-icon-style-guide.md tests/playwright/tools/ThemeV2SvgIconRegistry.spec.mjs
```
## Artifact
Create repo-structured delta ZIP:
```text
-tmp/PR_26175_ALFA_011-status-bar-journey-progress-context_delta.zip
+tmp/PR_26175_ALFA_047-theme-v2-svg-icon-registry_delta.zip
```
diff --git a/docs_build/dev/reports/PR_26175_ALFA_047-theme-v2-svg-icon-registry_manual-validation-notes.md b/docs_build/dev/reports/PR_26175_ALFA_047-theme-v2-svg-icon-registry_manual-validation-notes.md
new file mode 100644
index 000000000..e469a9b5f
--- /dev/null
+++ b/docs_build/dev/reports/PR_26175_ALFA_047-theme-v2-svg-icon-registry_manual-validation-notes.md
@@ -0,0 +1,25 @@
+# PR_26175_ALFA_047-theme-v2-svg-icon-registry Manual Validation Notes
+
+## Branch
+PASS: Work remained on `codex/pr-26175-alfa-047-theme-v2-svg-icon-registry`.
+
+## Scope Review
+PASS: ALFA_047 remains limited to standalone SVG assets, registry/style-guide documentation, targeted tests, BUILD doc updates, and reports.
+
+PASS: No runtime UI conversion, accordion conversion, Theme V2 CSS change, or Theme V2 JS change is included.
+
+## Artwork Policy Review
+PASS: The current SVG files under `assets/theme-v2/svg/` are treated as user-authored authoritative artwork.
+
+PASS: Validation was updated to avoid redesigning, redrawing, simplifying, optimizing, or enforcing path geometry.
+
+PASS: If a required SVG is missing, the Playwright validation fails instead of generating a replacement.
+
+## Validation Review
+PASS: Required filenames are checked.
+
+PASS: Each SVG is parsed as well-formed XML.
+
+PASS: Each SVG is checked for `viewBox="0 0 24 24"`, `fill="none"`, `stroke="currentColor"`, `stroke-linecap="round"`, and `stroke-linejoin="round"`.
+
+PASS: Registry documentation and the Theme V2 icon style guide document the authoritative-source policy.
diff --git a/docs_build/dev/reports/PR_26175_ALFA_047-theme-v2-svg-icon-registry_report.md b/docs_build/dev/reports/PR_26175_ALFA_047-theme-v2-svg-icon-registry_report.md
new file mode 100644
index 000000000..8dc8263f5
--- /dev/null
+++ b/docs_build/dev/reports/PR_26175_ALFA_047-theme-v2-svg-icon-registry_report.md
@@ -0,0 +1,40 @@
+# PR_26175_ALFA_047-theme-v2-svg-icon-registry Report
+
+## Status
+PASS
+
+## Rework Input State
+- Branch at update start: `codex/pr-26175-alfa-047-theme-v2-svg-icon-registry`.
+- The working tree contained manually designed SVG files under `assets/theme-v2/svg/`.
+- Those SVG files are treated as user-authored authoritative artwork.
+
+## Summary
+- Kept the existing SVG artwork unchanged during this update.
+- Updated registry documentation in `assets/theme-v2/svg/README.md`.
+- Updated the Theme V2 icon style guide to state that `assets/theme-v2/svg/` is the authoritative SVG source.
+- Updated Playwright validation to check only:
+ - required filenames exist
+ - forbidden filenames are absent
+ - SVG files are well-formed XML
+ - required shared SVG attributes are present and valid
+ - SVG files are served as external assets
+ - documentation records the no-regeneration policy
+- Removed geometry-specific validation from the test expectations.
+
+## Evidence
+- Source of truth: `docs_build/dev/BUILD_PR.md`
+- SVG assets: `assets/theme-v2/svg/`
+- Registry documentation: `assets/theme-v2/svg/README.md`
+- Icon style guide: `docs_build/design/theme-v2-icons/theme-v2-icon-style-guide.md`
+- Test coverage: `tests/playwright/tools/ThemeV2SvgIconRegistry.spec.mjs`
+- Manual validation notes: `docs_build/dev/reports/PR_26175_ALFA_047-theme-v2-svg-icon-registry_manual-validation-notes.md`
+- Changed-file manifest: `docs_build/dev/reports/codex_changed_files.txt`
+- Review diff: `docs_build/dev/reports/codex_review.diff`
+
+## Validation
+- PASS: `npx playwright test tests/playwright/tools/ThemeV2SvgIconRegistry.spec.mjs --workers=1` ran 5 tests.
+- PASS: `rg -n "<[s]tyle|[s]tyle=" docs_build/design/theme-v2-icons/theme-v2-icon-style-guide.md tests/playwright/tools/ThemeV2SvgIconRegistry.spec.mjs` returned no matches.
+- PASS: Branch validation stayed on `codex/pr-26175-alfa-047-theme-v2-svg-icon-registry`.
+
+## Artifact
+- `tmp/PR_26175_ALFA_047-theme-v2-svg-icon-registry_delta.zip`
diff --git a/docs_build/dev/reports/PR_26175_ALFA_047-theme-v2-svg-icon-registry_requirements-checklist.md b/docs_build/dev/reports/PR_26175_ALFA_047-theme-v2-svg-icon-registry_requirements-checklist.md
new file mode 100644
index 000000000..c4942c482
--- /dev/null
+++ b/docs_build/dev/reports/PR_26175_ALFA_047-theme-v2-svg-icon-registry_requirements-checklist.md
@@ -0,0 +1,28 @@
+# PR_26175_ALFA_047-theme-v2-svg-icon-registry Requirements Checklist
+
+| Requirement | Status | Evidence |
+| --- | --- | --- |
+| Stay on the current Team Alfa PR branch. | PASS | Work stayed on `codex/pr-26175-alfa-047-theme-v2-svg-icon-registry`. |
+| Use SVG files already present under `assets/theme-v2/svg/` as authoritative source. | PASS | Tests validate the current file set in `assets/theme-v2/svg/`; docs state those files are authoritative. |
+| Do not regenerate SVG artwork. | PASS | No generation command was used; tests/docs only were updated for validation behavior. |
+| Do not redesign SVG artwork. | PASS | This update did not edit SVG geometry. |
+| Do not simplify or optimize path geometry. | PASS | Playwright no longer asserts or rewrites path geometry. |
+| Do not redraw any icon. | PASS | Existing SVG artwork is treated as user-authored content. |
+| Required SVG filenames exist. | PASS | Playwright verifies the exact required filename list. |
+| Missing required SVGs are validation failures, not generated replacements. | PASS | Style guide and README document failure behavior; tests fail if the required list is incomplete. |
+| Forbidden names `expand`, `collapse`, and `delete` are absent. | PASS | Playwright verifies those filenames do not exist. |
+| Each SVG is well-formed. | PASS | Playwright parses each SVG with `DOMParser` as `image/svg+xml`. |
+| Each SVG uses `viewBox="0 0 24 24"`. | PASS | Playwright verifies every required SVG. |
+| Each SVG uses `fill="none"`. | PASS | Playwright verifies every `fill` attribute value is `none`. |
+| Each SVG uses `stroke="currentColor"`. | PASS | Playwright verifies every `stroke` attribute value is `currentColor`. |
+| Each SVG uses rounded line caps. | PASS | Playwright verifies `stroke-linecap="round"`. |
+| Each SVG uses rounded line joins. | PASS | Playwright verifies `stroke-linejoin="round"`. |
+| Do not use CSS-only or JS-only icon generation. | PASS | No Theme V2 CSS/JS generator files are included; docs forbid replacement with CSS-only or JS-only generation. |
+| Update registry documentation. | PASS | `assets/theme-v2/svg/README.md` documents the authoritative asset pack and validation policy. |
+| Update Theme V2 icon style guide. | PASS | `docs_build/design/theme-v2-icons/theme-v2-icon-style-guide.md` documents the same authority and validation policy. |
+| Update Playwright validation. | PASS | `tests/playwright/tools/ThemeV2SvgIconRegistry.spec.mjs` now validates presence, XML, attributes, serving, and docs without geometry assertions. |
+| No accordion conversion in ALFA_047. | PASS | No runtime UI files were modified. |
+| No runtime UI conversion in ALFA_047. | PASS | Final delta is assets, docs, tests, reports, and BUILD metadata only. |
+
+## Overall Status
+PASS
diff --git a/docs_build/dev/reports/PR_26175_ALFA_047-theme-v2-svg-icon-registry_validation-lane.md b/docs_build/dev/reports/PR_26175_ALFA_047-theme-v2-svg-icon-registry_validation-lane.md
new file mode 100644
index 000000000..4f5b45e61
--- /dev/null
+++ b/docs_build/dev/reports/PR_26175_ALFA_047-theme-v2-svg-icon-registry_validation-lane.md
@@ -0,0 +1,29 @@
+# PR_26175_ALFA_047-theme-v2-svg-icon-registry Validation Lane
+
+## Commands
+
+```powershell
+npx playwright test tests/playwright/tools/ThemeV2SvgIconRegistry.spec.mjs --workers=1
+```
+
+Result: PASS
+
+Evidence:
+- 5 tests passed.
+- Coverage verifies required filenames, forbidden filenames, well-formed SVG XML, required shared SVG attributes, static serving, registry documentation, and style-guide authority.
+- Coverage does not inspect, simplify, optimize, redraw, or enforce artwork geometry.
+
+```powershell
+rg -n "<[s]tyle|[s]tyle=" docs_build/design/theme-v2-icons/theme-v2-icon-style-guide.md tests/playwright/tools/ThemeV2SvgIconRegistry.spec.mjs
+```
+
+Result: PASS
+
+Evidence:
+- No matches were returned.
+
+## Final Validation Status
+PASS
+
+## Branch Validation
+PASS: Work remained on `codex/pr-26175-alfa-047-theme-v2-svg-icon-registry`.
diff --git a/docs_build/dev/reports/codex_changed_files.txt b/docs_build/dev/reports/codex_changed_files.txt
index 274329a5e..a4b5f90f6 100644
--- a/docs_build/dev/reports/codex_changed_files.txt
+++ b/docs_build/dev/reports/codex_changed_files.txt
@@ -1,78 +1,38 @@
-admin/system-health.html
-assets/theme-v2/js/admin-system-health.js
-docs_build/dev/reports/PR_26175_CHARLIE_012-017-system-health-phase-2-closeout.md
-docs_build/dev/reports/PR_26175_CHARLIE_012-runtime-health-branch-validation.md
-docs_build/dev/reports/PR_26175_CHARLIE_012-runtime-health-manual-validation-notes.md
-docs_build/dev/reports/PR_26175_CHARLIE_012-runtime-health-requirement-checklist.md
-docs_build/dev/reports/PR_26175_CHARLIE_012-runtime-health-validation.md
-docs_build/dev/reports/PR_26175_CHARLIE_012-runtime-health.md
-docs_build/dev/reports/PR_26175_CHARLIE_013-service-health-dashboard-branch-validation.md
-docs_build/dev/reports/PR_26175_CHARLIE_013-service-health-dashboard-manual-validation-notes.md
-docs_build/dev/reports/PR_26175_CHARLIE_013-service-health-dashboard-requirement-checklist.md
-docs_build/dev/reports/PR_26175_CHARLIE_013-service-health-dashboard-validation.md
-docs_build/dev/reports/PR_26175_CHARLIE_013-service-health-dashboard.md
-docs_build/dev/reports/PR_26175_CHARLIE_014-configuration-summary-branch-validation.md
-docs_build/dev/reports/PR_26175_CHARLIE_014-configuration-summary-manual-validation-notes.md
-docs_build/dev/reports/PR_26175_CHARLIE_014-configuration-summary-requirement-checklist.md
-docs_build/dev/reports/PR_26175_CHARLIE_014-configuration-summary-validation.md
-docs_build/dev/reports/PR_26175_CHARLIE_014-configuration-summary.md
-docs_build/dev/reports/PR_26175_CHARLIE_015-manual-health-actions-branch-validation.md
-docs_build/dev/reports/PR_26175_CHARLIE_015-manual-health-actions-manual-validation-notes.md
-docs_build/dev/reports/PR_26175_CHARLIE_015-manual-health-actions-requirement-checklist.md
-docs_build/dev/reports/PR_26175_CHARLIE_015-manual-health-actions-validation.md
-docs_build/dev/reports/PR_26175_CHARLIE_015-manual-health-actions.md
-docs_build/dev/reports/PR_26175_CHARLIE_016-scheduled-health-monitoring-branch-validation.md
-docs_build/dev/reports/PR_26175_CHARLIE_016-scheduled-health-monitoring-manual-validation-notes.md
-docs_build/dev/reports/PR_26175_CHARLIE_016-scheduled-health-monitoring-requirement-checklist.md
-docs_build/dev/reports/PR_26175_CHARLIE_016-scheduled-health-monitoring-validation.md
-docs_build/dev/reports/PR_26175_CHARLIE_016-scheduled-health-monitoring.md
-docs_build/dev/reports/PR_26175_CHARLIE_017-health-notifications-foundation-branch-validation.md
-docs_build/dev/reports/PR_26175_CHARLIE_017-health-notifications-foundation-manual-validation-notes.md
-docs_build/dev/reports/PR_26175_CHARLIE_017-health-notifications-foundation-requirement-checklist.md
-docs_build/dev/reports/PR_26175_CHARLIE_017-health-notifications-foundation-validation.md
-docs_build/dev/reports/PR_26175_CHARLIE_017-health-notifications-foundation.md
-docs_build/dev/reports/PR_26175_CHARLIE_018-health-api-contract-cleanup-branch-validation.md
-docs_build/dev/reports/PR_26175_CHARLIE_018-health-api-contract-cleanup-manual-validation-notes.md
-docs_build/dev/reports/PR_26175_CHARLIE_018-health-api-contract-cleanup-requirement-checklist.md
-docs_build/dev/reports/PR_26175_CHARLIE_018-health-api-contract-cleanup-validation.md
-docs_build/dev/reports/PR_26175_CHARLIE_018-health-api-contract-cleanup.md
-docs_build/dev/reports/PR_26175_CHARLIE_019-environment-capabilities-branch-validation.md
-docs_build/dev/reports/PR_26175_CHARLIE_019-environment-capabilities-manual-validation-notes.md
-docs_build/dev/reports/PR_26175_CHARLIE_019-environment-capabilities-requirement-checklist.md
-docs_build/dev/reports/PR_26175_CHARLIE_019-environment-capabilities-validation.md
-docs_build/dev/reports/PR_26175_CHARLIE_019-environment-capabilities.md
-docs_build/dev/reports/PR_26175_CHARLIE_020-admin-api-registry-branch-validation.md
-docs_build/dev/reports/PR_26175_CHARLIE_020-admin-api-registry-manual-validation-notes.md
-docs_build/dev/reports/PR_26175_CHARLIE_020-admin-api-registry-requirement-checklist.md
-docs_build/dev/reports/PR_26175_CHARLIE_020-admin-api-registry-validation.md
-docs_build/dev/reports/PR_26175_CHARLIE_020-admin-api-registry.md
-docs_build/dev/reports/PR_26175_CHARLIE_021-runtime-feature-flags-branch-validation.md
-docs_build/dev/reports/PR_26175_CHARLIE_021-runtime-feature-flags-manual-validation-notes.md
-docs_build/dev/reports/PR_26175_CHARLIE_021-runtime-feature-flags-requirement-checklist.md
-docs_build/dev/reports/PR_26175_CHARLIE_021-runtime-feature-flags-validation.md
-docs_build/dev/reports/PR_26175_CHARLIE_021-runtime-feature-flags.md
-docs_build/dev/reports/PR_26175_CHARLIE_022-admin-health-test-suite-branch-validation.md
-docs_build/dev/reports/PR_26175_CHARLIE_022-admin-health-test-suite-manual-validation-notes.md
-docs_build/dev/reports/PR_26175_CHARLIE_022-admin-health-test-suite-requirement-checklist.md
-docs_build/dev/reports/PR_26175_CHARLIE_022-admin-health-test-suite-validation.md
-docs_build/dev/reports/PR_26175_CHARLIE_022-admin-health-test-suite.md
-docs_build/dev/reports/PR_26175_CHARLIE_023-system-health-documentation-closeout-branch-validation.md
-docs_build/dev/reports/PR_26175_CHARLIE_023-system-health-documentation-closeout-manual-validation-notes.md
-docs_build/dev/reports/PR_26175_CHARLIE_023-system-health-documentation-closeout-requirement-checklist.md
-docs_build/dev/reports/PR_26175_CHARLIE_023-system-health-documentation-closeout-validation.md
-docs_build/dev/reports/PR_26175_CHARLIE_023-system-health-documentation-closeout.md
-docs_build/dev/reports/PR_26175_CHARLIE_024-system-health-operational-docs-branch-validation.md
-docs_build/dev/reports/PR_26175_CHARLIE_024-system-health-operational-docs-manual-validation-notes.md
-docs_build/dev/reports/PR_26175_CHARLIE_024-system-health-operational-docs-requirement-checklist.md
-docs_build/dev/reports/PR_26175_CHARLIE_024-system-health-operational-docs-validation.md
-docs_build/dev/reports/PR_26175_CHARLIE_024-system-health-operational-docs.md
-docs_build/dev/reports/codex_changed_files.txt
-docs_build/dev/reports/codex_review.diff
-docs_build/dev/reports/coverage_changed_js_guardrail.txt
-docs_build/dev/reports/playwright_v8_coverage_report.txt
-docs_build/operations/system-health-v1-operational-guide.md
-src/api/admin-system-health-api-client.js
-src/dev-runtime/server/local-api-router.mjs
-tests/api/admin-system-health/contract.test.mjs
-tests/dev-runtime/AdminHealthOperations.test.mjs
-tests/playwright/tools/AdminHealthOperationsPage.spec.mjs
+# PR_26175_ALFA_047-theme-v2-svg-icon-registry Changed Files
+
+## Source, Test, Documentation, And Report Files
+
+- `docs_build/dev/BUILD_PR.md` - updated
+- `assets/theme-v2/svg/README.md` - added
+- `assets/theme-v2/svg/gfs-add.svg` - added
+- `assets/theme-v2/svg/gfs-chevron-down.svg` - added
+- `assets/theme-v2/svg/gfs-chevron-left.svg` - added
+- `assets/theme-v2/svg/gfs-chevron-right.svg` - added
+- `assets/theme-v2/svg/gfs-chevron-up.svg` - added
+- `assets/theme-v2/svg/gfs-close.svg` - added
+- `assets/theme-v2/svg/gfs-error.svg` - added
+- `assets/theme-v2/svg/gfs-exit-fullscreen.svg` - added
+- `assets/theme-v2/svg/gfs-fullscreen.svg` - added
+- `assets/theme-v2/svg/gfs-info.svg` - added
+- `assets/theme-v2/svg/gfs-menu.svg` - added
+- `assets/theme-v2/svg/gfs-search.svg` - added
+- `assets/theme-v2/svg/gfs-settings.svg` - added
+- `assets/theme-v2/svg/gfs-subtract.svg` - added
+- `assets/theme-v2/svg/gfs-success.svg` - added
+- `assets/theme-v2/svg/gfs-trash.svg` - added
+- `assets/theme-v2/svg/gfs-warning.svg` - added
+- `docs_build/design/theme-v2-icons/theme-v2-icon-style-guide.md` - added
+- `tests/playwright/tools/ThemeV2SvgIconRegistry.spec.mjs` - added
+- `docs_build/pr/APPLY_PR_26175_ALFA_047-theme-v2-svg-icon-registry.md` - added
+- `docs_build/dev/reports/PR_26175_ALFA_047-theme-v2-svg-icon-registry_report.md` - added
+- `docs_build/dev/reports/PR_26175_ALFA_047-theme-v2-svg-icon-registry_validation-lane.md` - added
+- `docs_build/dev/reports/PR_26175_ALFA_047-theme-v2-svg-icon-registry_requirements-checklist.md` - added
+- `docs_build/dev/reports/PR_26175_ALFA_047-theme-v2-svg-icon-registry_manual-validation-notes.md` - added
+- `docs_build/dev/reports/codex_changed_files.txt` - updated
+- `docs_build/dev/reports/codex_review.diff` - updated
+
+## Validation
+
+- PASS: `npx playwright test tests/playwright/tools/ThemeV2SvgIconRegistry.spec.mjs --workers=1` ran 5 tests successfully.
+- PASS: `rg -n "<[s]tyle|[s]tyle=" docs_build/design/theme-v2-icons/theme-v2-icon-style-guide.md tests/playwright/tools/ThemeV2SvgIconRegistry.spec.mjs` returned no matches.
+- PASS: Repo-structured ZIP refreshed at `tmp/PR_26175_ALFA_047-theme-v2-svg-icon-registry_delta.zip`.
diff --git a/docs_build/dev/reports/codex_review.diff b/docs_build/dev/reports/codex_review.diff
index 093b19950..14fe543ad 100644
--- a/docs_build/dev/reports/codex_review.diff
+++ b/docs_build/dev/reports/codex_review.diff
@@ -1,3666 +1,772 @@
-diff --git a/admin/system-health.html b/admin/system-health.html
-index 8573b3310..abe5c4f97 100644
---- a/admin/system-health.html
-+++ b/admin/system-health.html
-@@ -40,9 +40,19 @@
-
-
Environment Identity
-
Environment Map
-+
Environment Capabilities
-+
Health API Contract
-+
Admin API Registry
-+
Runtime Feature Flags
-+
Service Health
-+
Configuration Summary
-+
Manual Health Actions
-+
Scheduled Health Monitoring
-+
Notifications & Alerts
-
Local API Startup
-
Database Health
-
Storage Health
-+
Runtime Health
-
Health Check History
-
Runtime Environment
-
Limits & Capacity
-@@ -99,6 +109,156 @@
-
-
-
-+
-+
-+ Environment Capabilities
-+
-+
-+ | Capability |
-+ Current Deployment |
-+ Status |
-+
-+
-+
-+ | Environment Capabilities | Waiting for safe API status | PENDING |
-+
-+
-+
-+
-+
-+ Health API Contract
-+
-+
-+ | Field |
-+ Contract |
-+ Status |
-+
-+
-+
-+ | Health API Contract | Waiting for safe API status | PENDING |
-+
-+
-+
-+
-+
-+ Admin API Registry
-+
-+
-+ | Method |
-+ Route |
-+ Owner |
-+ Status |
-+
-+
-+
-+ | GET | Waiting for safe API status | Team Charlie | PENDING |
-+
-+
-+
-+
-+
-+ Runtime Feature Flags
-+
-+
-+ | Flag |
-+ Current Deployment |
-+ Status |
-+
-+
-+
-+ | Runtime Feature Flags | Waiting for safe API status | PENDING |
-+
-+
-+
-+
-+
-+
Current Deployment
-+
Service Health
-+
-+
-+
-+
-+
Loading
-+
PENDING
-+
Waiting for safe API status.
-+
-+
-+
-+
-+
-+
-+ Configuration Summary
-+
-+
-+ | Field |
-+ Read-only Value |
-+ Status |
-+
-+
-+
-+ | Configuration Summary | Waiting for safe API status | PENDING |
-+
-+
-+
-+
-+
-+
Current Deployment
-+
Manual Health Actions
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+ Manual Health Action Results
-+
-+
-+ | Action |
-+ Last Checked |
-+ Status |
-+ Result |
-+
-+
-+
-+ | Manual health actions | not run | PENDING | Waiting for Admin action. |
-+
-+
-+
-+
-+
-+
-+ Scheduled Health Monitoring
-+
-+
-+ | Field |
-+ Current Deployment |
-+ Status |
-+
-+
-+
-+ | Scheduled Health Monitoring | Not Configured | PENDING |
-+
-+
-+
-+
-+
-+ Notifications & Alerts
-+
-+
-+ | Integration |
-+ Current Deployment |
-+ Status |
-+
-+
-+
-+ | Notifications & Alerts | Not Configured | PENDING |
-+
-+
-+
-
-
- Local API Startup Diagnostics
-@@ -153,6 +313,27 @@
-
-
-
-+
-+
-+ Runtime Health
-+
-+
-+ | Field |
-+ Current Deployment |
-+ Status |
-+
-+
-+
-+ | Environment | Loading | PENDING |
-+ | App/runtime version | Loading | PENDING |
-+ | API version | Loading | PENDING |
-+ | Node version | Loading | PENDING |
-+ | Server start time | Loading | PENDING |
-+ | Uptime | Loading | PENDING |
-+ | Last checked | Loading | PENDING |
-+
-+
-+
-
-
- Health Check History
-diff --git a/assets/theme-v2/js/admin-system-health.js b/assets/theme-v2/js/admin-system-health.js
-index e0c2cab9f..656394104 100644
---- a/assets/theme-v2/js/admin-system-health.js
-+++ b/assets/theme-v2/js/admin-system-health.js
-@@ -1,5 +1,6 @@
- import {
- readAdminSystemHealthStatus,
-+ runAdminSystemHealthAction,
- runAdminSystemHealthStorageConnectivityAction,
- } from "../../../src/api/admin-system-health-api-client.js";
- import {
-@@ -15,11 +16,17 @@ const STORAGE_DIAGNOSTIC_ACTIONS = Object.freeze([
- Object.freeze({ actionId: "storage-read-test-object", key: "read" }),
- Object.freeze({ actionId: "storage-delete-test-object", key: "delete" }),
- ]);
-+const STORAGE_DIAGNOSTIC_ACTION_KEY_BY_ID = new Map(STORAGE_DIAGNOSTIC_ACTIONS.map((action) => [action.actionId, action.key]));
-
- function asText(value, fallback = "not available") {
- return statusText(value, fallback);
- }
-
-+function formatUptimeSeconds(value) {
-+ const seconds = Number(value);
-+ return Number.isFinite(seconds) ? `${Math.max(0, Math.floor(seconds))} s` : "not available";
-+}
-+
- class AdminSystemHealthController {
- constructor(root) {
- this.root = root;
-@@ -47,7 +54,25 @@ class AdminSystemHealthController {
- node.dataset.adminSystemHealthStorageStatus,
- node,
- ]));
-+ this.runtimeHealthValues = new Map(Array.from(root.querySelectorAll("[data-admin-system-health-runtime-health-value]")).map((node) => [
-+ node.dataset.adminSystemHealthRuntimeHealthValue,
-+ node,
-+ ]));
-+ this.runtimeHealthStatuses = new Map(Array.from(root.querySelectorAll("[data-admin-system-health-runtime-health-status]")).map((node) => [
-+ node.dataset.adminSystemHealthRuntimeHealthStatus,
-+ node,
-+ ]));
- this.historyRows = root.querySelector("[data-admin-system-health-history-rows]");
-+ this.apiContractRows = root.querySelector("[data-admin-system-health-api-contract-rows]");
-+ this.apiRegistryRows = root.querySelector("[data-admin-system-health-api-registry-rows]");
-+ this.capabilityRows = root.querySelector("[data-admin-system-health-capability-rows]");
-+ this.featureFlagRows = root.querySelector("[data-admin-system-health-feature-flag-rows]");
-+ this.actionRows = root.querySelector("[data-admin-system-health-action-rows]");
-+ this.actionButtons = Array.from(root.querySelectorAll("[data-admin-system-health-action]"));
-+ this.configurationRows = root.querySelector("[data-admin-system-health-configuration-rows]");
-+ this.scheduledRows = root.querySelector("[data-admin-system-health-scheduled-rows]");
-+ this.notificationRows = root.querySelector("[data-admin-system-health-notification-rows]");
-+ this.serviceCards = root.querySelector("[data-admin-system-health-service-cards]");
- this.startupRows = root.querySelector("[data-admin-system-health-startup-rows]");
- this.runtimeRows = root.querySelector("[data-admin-system-health-runtime-rows]");
- }
-@@ -56,6 +81,7 @@ class AdminSystemHealthController {
- if ((!this.environmentValues.size && !this.dbValues.size && !this.storageValues.size) || document.querySelector("[data-session-access-blocked='admin']") || window.GameFoundrySessionGuard?.blocked === true) {
- return;
- }
-+ this.bindManualActions();
- this.load();
- }
-
-@@ -95,6 +121,18 @@ class AdminSystemHealthController {
- this.setStatusNode(node, status, reason);
- }
-
-+ setRuntimeHealthValue(key, value, fallback) {
-+ const node = this.runtimeHealthValues.get(key);
-+ if (node) {
-+ node.textContent = asText(value, fallback);
-+ }
-+ }
-+
-+ setRuntimeHealthStatus(key, status, reason = "") {
-+ const node = this.runtimeHealthStatuses.get(key);
-+ this.setStatusNode(node, status, reason);
-+ }
-+
- setStatusNode(node, status, reason = "") {
- applyStatusNode(node, status, { reason });
- }
-@@ -108,9 +146,32 @@ class AdminSystemHealthController {
- });
- this.renderStartupPending(reason);
- this.renderStoragePending(reason);
-+ this.renderRuntimeHealthPending(reason);
-+ this.renderEnvironmentCapabilitiesPending(reason);
-+ this.renderApiContractPending(reason);
-+ this.renderAdminApiRegistryPending(reason);
-+ this.renderRuntimeFeatureFlagsPending(reason);
-+ this.renderServiceHealthPending(reason);
-+ this.renderConfigurationSummaryPending(reason);
-+ this.renderScheduledMonitoringPending(reason);
-+ this.renderNotificationsFoundationPending(reason);
- this.renderHistoryPending(reason);
- }
-
-+ bindManualActions() {
-+ this.actionButtons.forEach((button) => {
-+ button.addEventListener("click", () => {
-+ this.runManualHealthAction(button.dataset.adminSystemHealthAction);
-+ });
-+ });
-+ }
-+
-+ setManualActionsDisabled(disabled) {
-+ this.actionButtons.forEach((button) => {
-+ button.disabled = disabled;
-+ });
-+ }
-+
- renderEnvironmentIdentity(environmentIdentity = {}) {
- const reason = environmentIdentity.message || "Current deployment environment identity returned by the safe Admin System Health API.";
- this.setEnvironmentValue("name", environmentIdentity.name, "Unknown");
-@@ -162,6 +223,369 @@ class AdminSystemHealthController {
- this.setStorageStatus("lastChecked", storageStatus.lastChecked ? "PASS" : "WARN", reason);
- }
-
-+ renderRuntimeHealthPending(reason) {
-+ ["environment", "appVersion", "apiVersion", "nodeVersion", "serverStartTime", "uptime", "lastChecked"].forEach((key) => {
-+ this.setRuntimeHealthValue(key, "not available");
-+ this.setRuntimeHealthStatus(key, "PENDING", reason);
-+ });
-+ }
-+
-+ renderRuntimeHealth(runtimeHealth = {}) {
-+ const reason = runtimeHealth.message || "Current deployment runtime health returned by the safe Admin System Health API.";
-+ if (runtimeHealth?.secretsExposed === true || runtimeHealth?.secretEditingAllowed === true) {
-+ this.renderRuntimeHealthPending("Safe runtime health response was blocked because it exposed secret controls.");
-+ return;
-+ }
-+ this.setRuntimeHealthValue("environment", runtimeHealth.environmentName, "Unknown");
-+ this.setRuntimeHealthStatus("environment", runtimeHealth.environmentName ? runtimeHealth.status : "WARN", reason);
-+ this.setRuntimeHealthValue("appVersion", runtimeHealth.appVersion, "not available");
-+ this.setRuntimeHealthStatus("appVersion", runtimeHealth.appVersion ? "PASS" : "WARN", reason);
-+ this.setRuntimeHealthValue("apiVersion", runtimeHealth.apiVersion, "not available");
-+ this.setRuntimeHealthStatus("apiVersion", runtimeHealth.apiVersion ? "PASS" : "WARN", reason);
-+ this.setRuntimeHealthValue("nodeVersion", runtimeHealth.nodeVersion, "not available");
-+ this.setRuntimeHealthStatus("nodeVersion", runtimeHealth.nodeVersion ? "PASS" : "WARN", reason);
-+ this.setRuntimeHealthValue("serverStartTime", runtimeHealth.serverStartTime, "not available");
-+ this.setRuntimeHealthStatus("serverStartTime", runtimeHealth.serverStartTime ? "PASS" : "WARN", reason);
-+ this.setRuntimeHealthValue("uptime", formatUptimeSeconds(runtimeHealth.uptimeSeconds));
-+ this.setRuntimeHealthStatus("uptime", Number.isFinite(Number(runtimeHealth.uptimeSeconds)) ? "PASS" : "WARN", reason);
-+ this.setRuntimeHealthValue("lastChecked", runtimeHealth.lastChecked, "not available");
-+ this.setRuntimeHealthStatus("lastChecked", runtimeHealth.lastChecked ? "PASS" : "WARN", reason);
-+ }
-+
-+ renderApiContractPending(reason) {
-+ if (!this.apiContractRows) {
-+ return;
-+ }
-+ const row = document.createElement("tr");
-+ row.append(
-+ this.createCell("Health API Contract"),
-+ this.createCell("not available"),
-+ this.createStatusCell("PENDING", reason),
-+ );
-+ this.apiContractRows.replaceChildren(row);
-+ }
-+
-+ renderApiContract(apiContract = {}) {
-+ if (!this.apiContractRows) {
-+ return;
-+ }
-+ if (apiContract?.secretsExposed === true || apiContract?.secretEditingAllowed === true) {
-+ this.renderApiContractPending("Safe API contract response was blocked because it exposed secret controls.");
-+ return;
-+ }
-+ const rows = Array.isArray(apiContract.rows) ? apiContract.rows : [];
-+ if (!rows.length) {
-+ this.renderApiContractPending("Safe Admin System Health API returned no contract rows.");
-+ return;
-+ }
-+ const fragment = document.createDocumentFragment();
-+ rows.forEach((contractRow) => {
-+ const row = document.createElement("tr");
-+ row.append(
-+ this.createCell(contractRow.field),
-+ this.createCell(contractRow.value),
-+ this.createStatusCell(contractRow.status, apiContract.message),
-+ );
-+ fragment.append(row);
-+ });
-+ this.apiContractRows.replaceChildren(fragment);
-+ }
-+
-+ renderEnvironmentCapabilitiesPending(reason) {
-+ if (!this.capabilityRows) {
-+ return;
-+ }
-+ const row = document.createElement("tr");
-+ row.append(
-+ this.createCell("Environment Capabilities"),
-+ this.createCell("not available"),
-+ this.createStatusCell("PENDING", reason),
-+ );
-+ this.capabilityRows.replaceChildren(row);
-+ }
-+
-+ renderEnvironmentCapabilities(environmentCapabilities = {}) {
-+ if (!this.capabilityRows) {
-+ return;
-+ }
-+ if (environmentCapabilities?.secretsExposed === true || environmentCapabilities?.secretEditingAllowed === true) {
-+ this.renderEnvironmentCapabilitiesPending("Safe environment capabilities response was blocked because it exposed secret controls.");
-+ return;
-+ }
-+ const rows = Array.isArray(environmentCapabilities.rows) ? environmentCapabilities.rows : [];
-+ if (!rows.length) {
-+ this.renderEnvironmentCapabilitiesPending("Safe Admin System Health API returned no environment capability rows.");
-+ return;
-+ }
-+ const fragment = document.createDocumentFragment();
-+ rows.forEach((capabilityRow) => {
-+ const row = document.createElement("tr");
-+ row.append(
-+ this.createCell(capabilityRow.capability),
-+ this.createCell(capabilityRow.value),
-+ this.createStatusCell(capabilityRow.status, environmentCapabilities.message),
-+ );
-+ fragment.append(row);
-+ });
-+ this.capabilityRows.replaceChildren(fragment);
-+ }
-+
-+ renderAdminApiRegistryPending(reason) {
-+ if (!this.apiRegistryRows) {
-+ return;
-+ }
-+ const row = document.createElement("tr");
-+ row.append(
-+ this.createCell("GET"),
-+ this.createCell("not available"),
-+ this.createCell("Team Charlie"),
-+ this.createStatusCell("PENDING", reason),
-+ );
-+ this.apiRegistryRows.replaceChildren(row);
-+ }
-+
-+ renderAdminApiRegistry(adminApiRegistry = {}) {
-+ if (!this.apiRegistryRows) {
-+ return;
-+ }
-+ if (adminApiRegistry?.secretsExposed === true || adminApiRegistry?.secretEditingAllowed === true) {
-+ this.renderAdminApiRegistryPending("Safe Admin API registry response was blocked because it exposed secret controls.");
-+ return;
-+ }
-+ const rows = Array.isArray(adminApiRegistry.rows) ? adminApiRegistry.rows : [];
-+ if (!rows.length) {
-+ this.renderAdminApiRegistryPending("Safe Admin System Health API returned no Admin API registry rows.");
-+ return;
-+ }
-+ const fragment = document.createDocumentFragment();
-+ rows.forEach((registryRow) => {
-+ const row = document.createElement("tr");
-+ row.append(
-+ this.createCell(registryRow.method),
-+ this.createCell(`${registryRow.path} - ${registryRow.purpose}`),
-+ this.createCell(registryRow.owner),
-+ this.createStatusCell(registryRow.status, adminApiRegistry.message),
-+ );
-+ fragment.append(row);
-+ });
-+ this.apiRegistryRows.replaceChildren(fragment);
-+ }
-+
-+ renderRuntimeFeatureFlagsPending(reason) {
-+ if (!this.featureFlagRows) {
-+ return;
-+ }
-+ const row = document.createElement("tr");
-+ row.append(
-+ this.createCell("Runtime Feature Flags"),
-+ this.createCell("not available"),
-+ this.createStatusCell("PENDING", reason),
-+ );
-+ this.featureFlagRows.replaceChildren(row);
-+ }
-+
-+ renderRuntimeFeatureFlags(runtimeFeatureFlags = {}) {
-+ if (!this.featureFlagRows) {
-+ return;
-+ }
-+ if (runtimeFeatureFlags?.secretsExposed === true || runtimeFeatureFlags?.secretEditingAllowed === true) {
-+ this.renderRuntimeFeatureFlagsPending("Safe runtime feature flags response was blocked because it exposed secret controls.");
-+ return;
-+ }
-+ const rows = Array.isArray(runtimeFeatureFlags.rows) ? runtimeFeatureFlags.rows : [];
-+ if (!rows.length) {
-+ this.renderRuntimeFeatureFlagsPending("Safe Admin System Health API returned no runtime feature flag rows.");
-+ return;
-+ }
-+ const fragment = document.createDocumentFragment();
-+ rows.forEach((featureRow) => {
-+ const row = document.createElement("tr");
-+ row.append(
-+ this.createCell(featureRow.flag),
-+ this.createCell(featureRow.value),
-+ this.createStatusCell(featureRow.status, runtimeFeatureFlags.message),
-+ );
-+ fragment.append(row);
-+ });
-+ this.featureFlagRows.replaceChildren(fragment);
-+ }
-+
-+ renderServiceHealthPending(reason) {
-+ if (!this.serviceCards) {
-+ return;
-+ }
-+ const card = this.createServiceHealthCard({
-+ healthStatus: "PENDING",
-+ label: "Service Health",
-+ status: "Not Configured",
-+ summary: reason,
-+ });
-+ this.serviceCards.replaceChildren(card);
-+ }
-+
-+ createServiceHealthCard(service = {}) {
-+ const card = document.createElement("article");
-+ card.className = "card";
-+ card.dataset.adminSystemHealthServiceCard = service.id || "";
-+ const body = document.createElement("div");
-+ body.className = "card-body content-stack content-stack--compact";
-+ const title = document.createElement("h4");
-+ title.textContent = asText(service.label, "Service");
-+ const status = document.createElement("p");
-+ const healthStatus = normalizeStatusValue(service.healthStatus);
-+ status.dataset.healthStatus = healthStatus;
-+ status.textContent = asText(service.status, "Not Configured");
-+ if (healthStatus !== "PASS") {
-+ const reason = asText(service.summary, "Safe server diagnostics did not provide a reason.");
-+ status.setAttribute("title", `Reason: ${reason}`);
-+ status.setAttribute("aria-label", `${status.textContent}: ${reason}`);
-+ }
-+ const summary = document.createElement("p");
-+ summary.textContent = asText(service.summary, "Status unavailable.");
-+ const checkedAt = document.createElement("p");
-+ checkedAt.textContent = `Last checked: ${asText(service.lastChecked, "not available")}`;
-+ body.append(title, status, summary, checkedAt);
-+ card.append(body);
-+ return card;
-+ }
-+
-+ renderServiceHealth(serviceHealth = {}) {
-+ if (!this.serviceCards) {
-+ return;
-+ }
-+ if (serviceHealth?.secretsExposed === true || serviceHealth?.secretEditingAllowed === true) {
-+ this.renderServiceHealthPending("Safe service health response was blocked because it exposed secret controls.");
-+ return;
-+ }
-+ const services = Array.isArray(serviceHealth.services) ? serviceHealth.services : [];
-+ if (!services.length) {
-+ this.renderServiceHealthPending("Safe Admin System Health API returned no service health cards.");
-+ return;
-+ }
-+ const fragment = document.createDocumentFragment();
-+ services.forEach((service) => {
-+ fragment.append(this.createServiceHealthCard(service));
-+ });
-+ this.serviceCards.replaceChildren(fragment);
-+ }
-+
-+ renderConfigurationSummaryPending(reason) {
-+ if (!this.configurationRows) {
-+ return;
-+ }
-+ const row = document.createElement("tr");
-+ row.append(
-+ this.createCell("Configuration Summary"),
-+ this.createCell("not available"),
-+ this.createStatusCell("PENDING", reason),
-+ );
-+ this.configurationRows.replaceChildren(row);
-+ }
-+
-+ renderConfigurationSummary(configurationSummary = {}) {
-+ if (!this.configurationRows) {
-+ return;
-+ }
-+ if (configurationSummary?.secretsExposed === true || configurationSummary?.secretEditingAllowed === true) {
-+ this.renderConfigurationSummaryPending("Safe configuration summary response was blocked because it exposed secret controls.");
-+ return;
-+ }
-+ const rows = Array.isArray(configurationSummary.rows) ? configurationSummary.rows : [];
-+ if (!rows.length) {
-+ this.renderConfigurationSummaryPending("Safe Admin System Health API returned no configuration summary rows.");
-+ return;
-+ }
-+ const fragment = document.createDocumentFragment();
-+ rows.forEach((configurationRow) => {
-+ const row = document.createElement("tr");
-+ row.append(
-+ this.createCell(configurationRow.field),
-+ this.createCell(configurationRow.value),
-+ this.createStatusCell(configurationRow.status, configurationSummary.message),
-+ );
-+ fragment.append(row);
-+ });
-+ this.configurationRows.replaceChildren(fragment);
-+ }
-+
-+ renderScheduledMonitoringPending(reason) {
-+ if (!this.scheduledRows) {
-+ return;
-+ }
-+ const row = document.createElement("tr");
-+ row.append(
-+ this.createCell("Scheduled Health Monitoring"),
-+ this.createCell("Not Configured"),
-+ this.createStatusCell("PENDING", reason),
-+ );
-+ this.scheduledRows.replaceChildren(row);
-+ }
-+
-+ renderScheduledMonitoring(scheduledMonitoring = {}) {
-+ if (!this.scheduledRows) {
-+ return;
-+ }
-+ if (scheduledMonitoring?.secretsExposed === true || scheduledMonitoring?.secretEditingAllowed === true) {
-+ this.renderScheduledMonitoringPending("Safe scheduled monitoring response was blocked because it exposed secret controls.");
-+ return;
-+ }
-+ const rows = Array.isArray(scheduledMonitoring.rows) ? scheduledMonitoring.rows : [];
-+ if (!rows.length) {
-+ this.renderScheduledMonitoringPending("Safe Admin System Health API returned no scheduled monitoring rows.");
-+ return;
-+ }
-+ const fragment = document.createDocumentFragment();
-+ rows.forEach((scheduledRow) => {
-+ const row = document.createElement("tr");
-+ row.append(
-+ this.createCell(scheduledRow.field),
-+ this.createCell(scheduledRow.value),
-+ this.createStatusCell(scheduledRow.status, scheduledMonitoring.message),
-+ );
-+ fragment.append(row);
-+ });
-+ this.scheduledRows.replaceChildren(fragment);
-+ }
-+
-+ renderNotificationsFoundationPending(reason) {
-+ if (!this.notificationRows) {
-+ return;
-+ }
-+ const row = document.createElement("tr");
-+ row.append(
-+ this.createCell("Notifications & Alerts"),
-+ this.createCell("Not Configured"),
-+ this.createStatusCell("PENDING", reason),
-+ );
-+ this.notificationRows.replaceChildren(row);
-+ }
-+
-+ renderNotificationsFoundation(notificationsFoundation = {}) {
-+ if (!this.notificationRows) {
-+ return;
-+ }
-+ if (notificationsFoundation?.secretsExposed === true || notificationsFoundation?.secretEditingAllowed === true) {
-+ this.renderNotificationsFoundationPending("Safe notifications response was blocked because it exposed secret controls.");
-+ return;
-+ }
-+ const rows = Array.isArray(notificationsFoundation.rows) ? notificationsFoundation.rows : [];
-+ if (!rows.length) {
-+ this.renderNotificationsFoundationPending("Safe Admin System Health API returned no notifications rows.");
-+ return;
-+ }
-+ const fragment = document.createDocumentFragment();
-+ rows.forEach((notificationRow) => {
-+ const row = document.createElement("tr");
-+ row.append(
-+ this.createCell(notificationRow.field),
-+ this.createCell(notificationRow.value),
-+ this.createStatusCell(notificationRow.status, notificationsFoundation.message),
-+ );
-+ fragment.append(row);
-+ });
-+ this.notificationRows.replaceChildren(fragment);
-+ }
-+
- renderStartupPending(reason) {
- if (!this.startupRows) {
- return;
-@@ -290,6 +714,71 @@ class AdminSystemHealthController {
- return cell;
- }
-
-+ renderManualActionResult(result = {}) {
-+ if (!this.actionRows) {
-+ return;
-+ }
-+ const blocked = result?.secretsExposed === true || result?.secretEditingAllowed === true;
-+ const row = document.createElement("tr");
-+ row.append(
-+ this.createCell(result.label || "Manual health action"),
-+ this.createCell(result.checkedAt || result.lastChecked || "not available"),
-+ this.createStatusCell(blocked ? "PENDING" : result.status, blocked ? "Safe manual action response was blocked because it exposed secret controls." : result.message),
-+ this.createCell(blocked ? "Safe manual action response was blocked." : result.message),
-+ );
-+ this.actionRows.replaceChildren(row);
-+ }
-+
-+ applyManualActionResult(result = {}) {
-+ if (result.statusSnapshot) {
-+ this.renderStatusData(result.statusSnapshot);
-+ }
-+ if (result.runtimeHealth) {
-+ this.renderRuntimeHealth(result.runtimeHealth);
-+ }
-+ if (result.databaseStatus) {
-+ this.renderPostgresStatus(result.databaseStatus);
-+ }
-+ if (result.storageStatus) {
-+ this.renderStorageStatus(result.storageStatus);
-+ }
-+ const storageDiagnostics = Array.isArray(result.storageDiagnostics) ? result.storageDiagnostics : [];
-+ storageDiagnostics.forEach((storageResult) => {
-+ const key = STORAGE_DIAGNOSTIC_ACTION_KEY_BY_ID.get(storageResult.actionId);
-+ if (key) {
-+ this.renderStorageResult(key, storageResult);
-+ }
-+ });
-+ }
-+
-+ runManualHealthAction(actionId) {
-+ if (!actionId) {
-+ return;
-+ }
-+ this.setManualActionsDisabled(true);
-+ this.renderManualActionResult({
-+ checkedAt: new Date().toISOString(),
-+ label: "Manual health action",
-+ message: "Manual health action is running through the safe Admin System Health API.",
-+ status: "PENDING",
-+ });
-+ try {
-+ const result = runAdminSystemHealthAction(actionId);
-+ this.renderManualActionResult(result);
-+ this.applyManualActionResult(result);
-+ } catch (error) {
-+ const message = error instanceof Error ? error.message : "Safe Admin System Health action API is unavailable.";
-+ this.renderManualActionResult({
-+ checkedAt: new Date().toISOString(),
-+ label: "Manual health action",
-+ message,
-+ status: "FAIL",
-+ });
-+ } finally {
-+ this.setManualActionsDisabled(false);
-+ }
-+ }
-+
- renderRuntimePending(reason) {
- if (!this.runtimeRows) {
- return;
-@@ -331,20 +820,33 @@ class AdminSystemHealthController {
- this.runtimeRows.replaceChildren(fragment);
- }
-
-+ renderStatusData(data = {}) {
-+ if (data?.secretsExposed === true || data?.secretEditingAllowed === true) {
-+ this.renderPending("Safe Admin System Health API refused to render because the response exposed secret controls.");
-+ return;
-+ }
-+ this.renderEnvironmentIdentity(data?.environmentIdentity || {});
-+ this.renderPostgresStatus(data?.databaseStatus || {});
-+ this.renderStartupDiagnostics(data?.localApiStartup || {});
-+ this.renderStorageStatus(data?.storageStatus || {});
-+ this.runStorageDiagnostics();
-+ this.renderRuntimeHealth(data?.runtimeHealth || {});
-+ this.renderEnvironmentCapabilities(data?.environmentCapabilities || {});
-+ this.renderApiContract(data?.apiContract || {});
-+ this.renderAdminApiRegistry(data?.adminApiRegistry || {});
-+ this.renderRuntimeFeatureFlags(data?.runtimeFeatureFlags || {});
-+ this.renderServiceHealth(data?.serviceHealth || {});
-+ this.renderConfigurationSummary(data?.configurationSummary || {});
-+ this.renderScheduledMonitoring(data?.scheduledMonitoring || {});
-+ this.renderNotificationsFoundation(data?.notificationsFoundation || {});
-+ this.renderHealthCheckHistory(data?.healthCheckHistory || []);
-+ this.renderRuntimeEnvironment(data?.runtimeEnvironment || {});
-+ }
-+
- load() {
- try {
- const data = readAdminSystemHealthStatus();
-- if (data?.secretsExposed === true || data?.secretEditingAllowed === true) {
-- this.renderPending("Safe Admin System Health API refused to render because the response exposed secret controls.");
-- return;
-- }
-- this.renderEnvironmentIdentity(data?.environmentIdentity || {});
-- this.renderPostgresStatus(data?.databaseStatus || {});
-- this.renderStartupDiagnostics(data?.localApiStartup || {});
-- this.renderStorageStatus(data?.storageStatus || {});
-- this.runStorageDiagnostics();
-- this.renderHealthCheckHistory(data?.healthCheckHistory || []);
-- this.renderRuntimeEnvironment(data?.runtimeEnvironment || {});
-+ this.renderStatusData(data);
- } catch (error) {
- const message = error instanceof Error ? error.message : "Safe Admin System Health API is unavailable.";
- this.renderPending(message);
-diff --git a/docs_build/dev/reports/PR_26175_CHARLIE_012-017-system-health-phase-2-closeout.md b/docs_build/dev/reports/PR_26175_CHARLIE_012-017-system-health-phase-2-closeout.md
-new file mode 100644
-index 000000000..769036e82
---- /dev/null
-+++ b/docs_build/dev/reports/PR_26175_CHARLIE_012-017-system-health-phase-2-closeout.md
-@@ -0,0 +1,43 @@
-+# PR_26175_CHARLIE_012-017 System Health Phase 2 Closeout
-+
-+## Scope
-+
-+Team: Charlie
-+
-+Workstream branch: `pr/26175-CHARLIE-010-system-health-history-and-closeout`
-+
-+## Completed Phase 2 Slices
-+
-+- PASS: PR_26175_CHARLIE_012-runtime-health
-+- PASS: PR_26175_CHARLIE_013-service-health-dashboard
-+- PASS: PR_26175_CHARLIE_014-configuration-summary
-+- PASS: PR_26175_CHARLIE_015-manual-health-actions
-+- PASS: PR_26175_CHARLIE_016-scheduled-health-monitoring
-+- PASS: PR_26175_CHARLIE_017-health-notifications-foundation
-+
-+## Architecture Closeout
-+
-+- PASS: System Health remains one page per deployed environment.
-+- PASS: Each deployment actively checks only itself.
-+- PASS: Environment Map remains reference-only.
-+- PASS: No cross-environment checks were added.
-+- PASS: Web UI calls API/service contracts.
-+- PASS: Browser does not own infrastructure health state.
-+- PASS: Not Configured placeholders do not fake success.
-+
-+## Validation Closeout
-+
-+- PASS: Targeted System Health API/unit tests passed for each slice.
-+- PASS: Targeted System Health Playwright tests passed for each slice.
-+- PASS: Syntax checks passed for touched JavaScript modules.
-+- PASS: `git diff --check` passed for each slice with CRLF warnings only.
-+- NOT RUN: Full samples smoke; not required for System Health Phase 2.
-+
-+## ZIP Artifacts
-+
-+- `tmp/PR_26175_CHARLIE_012-runtime-health_delta.zip`
-+- `tmp/PR_26175_CHARLIE_013-service-health-dashboard_delta.zip`
-+- `tmp/PR_26175_CHARLIE_014-configuration-summary_delta.zip`
-+- `tmp/PR_26175_CHARLIE_015-manual-health-actions_delta.zip`
-+- `tmp/PR_26175_CHARLIE_016-scheduled-health-monitoring_delta.zip`
-+- `tmp/PR_26175_CHARLIE_017-health-notifications-foundation_delta.zip`
-diff --git a/docs_build/dev/reports/PR_26175_CHARLIE_012-runtime-health-branch-validation.md b/docs_build/dev/reports/PR_26175_CHARLIE_012-runtime-health-branch-validation.md
-new file mode 100644
-index 000000000..58442a3f7
---- /dev/null
-+++ b/docs_build/dev/reports/PR_26175_CHARLIE_012-runtime-health-branch-validation.md
-@@ -0,0 +1,14 @@
-+# PR_26175_CHARLIE_012 Branch Validation
-+
-+## Start Gate
-+
-+- PASS: Worktree was clean before Phase 2 implementation started.
-+- PASS: Current branch was `pr/26175-CHARLIE-010-system-health-history-and-closeout`.
-+- PASS: Branch history contained Charlie PRs 007 through 011.
-+
-+## Branch Rules
-+
-+- PASS: Continued on the existing Charlie workstream branch.
-+- PASS: No merge was performed.
-+- PASS: No rebase was performed.
-+- PASS: No new root branch was created.
-diff --git a/docs_build/dev/reports/PR_26175_CHARLIE_012-runtime-health-manual-validation-notes.md b/docs_build/dev/reports/PR_26175_CHARLIE_012-runtime-health-manual-validation-notes.md
-new file mode 100644
-index 000000000..7eb85fd46
---- /dev/null
-+++ b/docs_build/dev/reports/PR_26175_CHARLIE_012-runtime-health-manual-validation-notes.md
-@@ -0,0 +1,7 @@
-+# PR_26175_CHARLIE_012 Manual Validation Notes
-+
-+- Verified the Runtime Health table is present on `admin/system-health.html`.
-+- Verified Runtime Health values are rendered from `/api/admin/system-health/status`.
-+- Verified the page still blocks Creator sessions before System Health API calls.
-+- Verified Runtime Environment remains a masked variable table and was not repurposed as Runtime Health.
-+- Verified no cross-environment health checks were introduced.
-diff --git a/docs_build/dev/reports/PR_26175_CHARLIE_012-runtime-health-requirement-checklist.md b/docs_build/dev/reports/PR_26175_CHARLIE_012-runtime-health-requirement-checklist.md
-new file mode 100644
-index 000000000..5c744daaf
---- /dev/null
-+++ b/docs_build/dev/reports/PR_26175_CHARLIE_012-runtime-health-requirement-checklist.md
-@@ -0,0 +1,15 @@
-+# PR_26175_CHARLIE_012 Requirement Checklist
-+
-+- PASS: Added Runtime Health section.
-+- PASS: Shows current environment.
-+- PASS: Shows app/runtime version when available.
-+- PASS: Shows API version when available.
-+- PASS: Shows Node version from the server.
-+- PASS: Shows server start time from the server.
-+- PASS: Shows uptime from the server.
-+- PASS: Shows last checked from the server.
-+- PASS: Uses API/service contract data.
-+- PASS: Browser does not own runtime health state.
-+- PASS: Does not actively check other environments.
-+- PASS: Tests were updated.
-+- PASS: Required reports were generated.
-diff --git a/docs_build/dev/reports/PR_26175_CHARLIE_012-runtime-health-validation.md b/docs_build/dev/reports/PR_26175_CHARLIE_012-runtime-health-validation.md
-new file mode 100644
-index 000000000..4cce6df84
---- /dev/null
-+++ b/docs_build/dev/reports/PR_26175_CHARLIE_012-runtime-health-validation.md
-@@ -0,0 +1,18 @@
-+# PR_26175_CHARLIE_012 Validation Report
-+
-+## Commands
-+
-+- PASS: `node --check src/dev-runtime/server/local-api-router.mjs`
-+- PASS: `node --check assets/theme-v2/js/admin-system-health.js`
-+- PASS: `git diff --check`
-+ - Result: no whitespace errors; CRLF conversion warnings only.
-+- PASS: `node --test tests/dev-runtime/AdminHealthOperations.test.mjs`
-+ - Result: 4 passed.
-+- PASS: `npx playwright test tests/playwright/tools/AdminHealthOperationsPage.spec.mjs --workers=1 --reporter=line`
-+ - Result: 3 passed.
-+
-+## Validation Lane
-+
-+- Targeted System Health API/unit lane: PASS.
-+- Targeted System Health Playwright lane: PASS.
-+- Full samples smoke: not run; not required for this System Health-only slice.
-diff --git a/docs_build/dev/reports/PR_26175_CHARLIE_012-runtime-health.md b/docs_build/dev/reports/PR_26175_CHARLIE_012-runtime-health.md
-new file mode 100644
-index 000000000..c653f5faf
---- /dev/null
-+++ b/docs_build/dev/reports/PR_26175_CHARLIE_012-runtime-health.md
-@@ -0,0 +1,26 @@
-+# PR_26175_CHARLIE_012 Runtime Health
-+
-+## Scope
-+
-+Team: Charlie
-+
-+Purpose: Add current-deployment Runtime Health to Admin System Health Phase 2.
-+
-+## Changes
-+
-+- Added server-owned `runtimeHealth` to the Admin System Health status API.
-+- Added Runtime Health UI table for environment, app/runtime version, API version, Node version, server start time, uptime, and last checked.
-+- Kept Runtime Environment masking as a separate existing section.
-+- Updated API and Playwright System Health tests for the Runtime Health contract.
-+
-+## Architecture Notes
-+
-+- PASS: Current deployment only.
-+- PASS: Environment Map remains reference-only.
-+- PASS: Browser renders API-owned runtime health state.
-+- PASS: No cross-environment runtime checks were added.
-+- PASS: No secrets are exposed.
-+
-+## Artifact
-+
-+- `tmp/PR_26175_CHARLIE_012-runtime-health_delta.zip`
-diff --git a/docs_build/dev/reports/PR_26175_CHARLIE_013-service-health-dashboard-branch-validation.md b/docs_build/dev/reports/PR_26175_CHARLIE_013-service-health-dashboard-branch-validation.md
-new file mode 100644
-index 000000000..4a6555ee3
---- /dev/null
-+++ b/docs_build/dev/reports/PR_26175_CHARLIE_013-service-health-dashboard-branch-validation.md
-@@ -0,0 +1,9 @@
-+# PR_26175_CHARLIE_013 Branch Validation
-+
-+## Branch Rules
-+
-+- PASS: Continued on `pr/26175-CHARLIE-010-system-health-history-and-closeout`.
-+- PASS: Stacked on PR_26175_CHARLIE_012.
-+- PASS: No merge was performed.
-+- PASS: No rebase was performed.
-+- PASS: No new root branch was created.
-diff --git a/docs_build/dev/reports/PR_26175_CHARLIE_013-service-health-dashboard-manual-validation-notes.md b/docs_build/dev/reports/PR_26175_CHARLIE_013-service-health-dashboard-manual-validation-notes.md
-new file mode 100644
-index 000000000..120527618
---- /dev/null
-+++ b/docs_build/dev/reports/PR_26175_CHARLIE_013-service-health-dashboard-manual-validation-notes.md
-@@ -0,0 +1,7 @@
-+# PR_26175_CHARLIE_013 Manual Validation Notes
-+
-+- Verified Service Health cards render on `admin/system-health.html`.
-+- Verified all seven requested service labels are present.
-+- Verified visible card statuses are limited to Healthy, Warning, Failed, and Not Configured.
-+- Verified Email and Background Jobs remain Not Configured placeholders.
-+- Verified no peer environment health checks were introduced.
-diff --git a/docs_build/dev/reports/PR_26175_CHARLIE_013-service-health-dashboard-requirement-checklist.md b/docs_build/dev/reports/PR_26175_CHARLIE_013-service-health-dashboard-requirement-checklist.md
-new file mode 100644
-index 000000000..ab51aae0b
---- /dev/null
-+++ b/docs_build/dev/reports/PR_26175_CHARLIE_013-service-health-dashboard-requirement-checklist.md
-@@ -0,0 +1,15 @@
-+# PR_26175_CHARLIE_013 Requirement Checklist
-+
-+- PASS: Added Service Health summary cards.
-+- PASS: Added Runtime card.
-+- PASS: Added API card.
-+- PASS: Added Database card.
-+- PASS: Added Storage card.
-+- PASS: Added Authentication placeholder/status.
-+- PASS: Added Email placeholder/status.
-+- PASS: Added Background Jobs placeholder/status.
-+- PASS: Used statuses Healthy, Warning, Failed, and Not Configured.
-+- PASS: Current environment only.
-+- PASS: Browser does not own service health state.
-+- PASS: Tests were updated.
-+- PASS: Required reports were generated.
-diff --git a/docs_build/dev/reports/PR_26175_CHARLIE_013-service-health-dashboard-validation.md b/docs_build/dev/reports/PR_26175_CHARLIE_013-service-health-dashboard-validation.md
-new file mode 100644
-index 000000000..b7d181b37
---- /dev/null
-+++ b/docs_build/dev/reports/PR_26175_CHARLIE_013-service-health-dashboard-validation.md
-@@ -0,0 +1,18 @@
-+# PR_26175_CHARLIE_013 Validation Report
-+
-+## Commands
-+
-+- PASS: `node --check src/dev-runtime/server/local-api-router.mjs`
-+- PASS: `node --check assets/theme-v2/js/admin-system-health.js`
-+- PASS: `git diff --check`
-+ - Result: no whitespace errors; CRLF conversion warnings only.
-+- PASS: `node --test tests/dev-runtime/AdminHealthOperations.test.mjs`
-+ - Result: 4 passed.
-+- PASS: `npx playwright test tests/playwright/tools/AdminHealthOperationsPage.spec.mjs --workers=1 --reporter=line`
-+ - Result: 3 passed.
-+
-+## Validation Lane
-+
-+- Targeted System Health API/unit lane: PASS.
-+- Targeted System Health Playwright lane: PASS.
-+- Full samples smoke: not run; not required for this System Health-only slice.
-diff --git a/docs_build/dev/reports/PR_26175_CHARLIE_013-service-health-dashboard.md b/docs_build/dev/reports/PR_26175_CHARLIE_013-service-health-dashboard.md
-new file mode 100644
-index 000000000..99d98533d
---- /dev/null
-+++ b/docs_build/dev/reports/PR_26175_CHARLIE_013-service-health-dashboard.md
-@@ -0,0 +1,26 @@
-+# PR_26175_CHARLIE_013 Service Health Dashboard
-+
-+## Scope
-+
-+Team: Charlie
-+
-+Purpose: Add current-environment Service Health summary cards to Admin System Health Phase 2.
-+
-+## Changes
-+
-+- Added server-owned `serviceHealth` payload to the Admin System Health status API.
-+- Added compact Service Health cards for Runtime, API, Database, Storage, Authentication, Email, and Background Jobs.
-+- Used the requested visible statuses: Healthy, Warning, Failed, and Not Configured.
-+- Kept Email and Background Jobs as production-safe Not Configured placeholders.
-+- Updated API and Playwright System Health tests.
-+
-+## Architecture Notes
-+
-+- PASS: Current deployment only.
-+- PASS: No cross-environment health checks were added.
-+- PASS: Browser renders API/service contract state only.
-+- PASS: Placeholder services do not fake successful health.
-+
-+## Artifact
-+
-+- `tmp/PR_26175_CHARLIE_013-service-health-dashboard_delta.zip`
-diff --git a/docs_build/dev/reports/PR_26175_CHARLIE_014-configuration-summary-branch-validation.md b/docs_build/dev/reports/PR_26175_CHARLIE_014-configuration-summary-branch-validation.md
-new file mode 100644
-index 000000000..9bf1bf62d
---- /dev/null
-+++ b/docs_build/dev/reports/PR_26175_CHARLIE_014-configuration-summary-branch-validation.md
-@@ -0,0 +1,9 @@
-+# PR_26175_CHARLIE_014 Branch Validation
-+
-+## Branch Rules
-+
-+- PASS: Continued on `pr/26175-CHARLIE-010-system-health-history-and-closeout`.
-+- PASS: Stacked on PR_26175_CHARLIE_013.
-+- PASS: No merge was performed.
-+- PASS: No rebase was performed.
-+- PASS: No new root branch was created.
-diff --git a/docs_build/dev/reports/PR_26175_CHARLIE_014-configuration-summary-manual-validation-notes.md b/docs_build/dev/reports/PR_26175_CHARLIE_014-configuration-summary-manual-validation-notes.md
-new file mode 100644
-index 000000000..1a03e013b
---- /dev/null
-+++ b/docs_build/dev/reports/PR_26175_CHARLIE_014-configuration-summary-manual-validation-notes.md
-@@ -0,0 +1,7 @@
-+# PR_26175_CHARLIE_014 Manual Validation Notes
-+
-+- Verified Configuration Summary renders on `admin/system-health.html`.
-+- Verified the summary contains only read-only fields.
-+- Verified site/API URL credentials are not displayed.
-+- Verified no raw database or auth secrets are included.
-+- Verified no peer environment health checks were introduced.
-diff --git a/docs_build/dev/reports/PR_26175_CHARLIE_014-configuration-summary-requirement-checklist.md b/docs_build/dev/reports/PR_26175_CHARLIE_014-configuration-summary-requirement-checklist.md
-new file mode 100644
-index 000000000..e08c7873b
---- /dev/null
-+++ b/docs_build/dev/reports/PR_26175_CHARLIE_014-configuration-summary-requirement-checklist.md
-@@ -0,0 +1,15 @@
-+# PR_26175_CHARLIE_014 Requirement Checklist
-+
-+- PASS: Added read-only Configuration Summary.
-+- PASS: Shows current environment.
-+- PASS: Shows hosting model.
-+- PASS: Shows site URL.
-+- PASS: Shows API URL.
-+- PASS: Shows database provider/type.
-+- PASS: Shows storage provider/folder.
-+- PASS: Shows auth provider/status.
-+- PASS: Does not expose secrets.
-+- PASS: Masks sensitive URL values.
-+- PASS: Uses API/service contract data.
-+- PASS: Tests were updated.
-+- PASS: Required reports were generated.
-diff --git a/docs_build/dev/reports/PR_26175_CHARLIE_014-configuration-summary-validation.md b/docs_build/dev/reports/PR_26175_CHARLIE_014-configuration-summary-validation.md
-new file mode 100644
-index 000000000..12f7143cc
---- /dev/null
-+++ b/docs_build/dev/reports/PR_26175_CHARLIE_014-configuration-summary-validation.md
-@@ -0,0 +1,18 @@
-+# PR_26175_CHARLIE_014 Validation Report
-+
-+## Commands
-+
-+- PASS: `node --check src/dev-runtime/server/local-api-router.mjs`
-+- PASS: `node --check assets/theme-v2/js/admin-system-health.js`
-+- PASS: `git diff --check`
-+ - Result: no whitespace errors; CRLF conversion warnings only.
-+- PASS: `node --test tests/dev-runtime/AdminHealthOperations.test.mjs`
-+ - Result: 4 passed.
-+- PASS: `npx playwright test tests/playwright/tools/AdminHealthOperationsPage.spec.mjs --workers=1 --reporter=line`
-+ - Result: 3 passed.
-+
-+## Validation Lane
-+
-+- Targeted System Health API/unit lane: PASS.
-+- Targeted System Health Playwright lane: PASS.
-+- Full samples smoke: not run; not required for this System Health-only slice.
-diff --git a/docs_build/dev/reports/PR_26175_CHARLIE_014-configuration-summary.md b/docs_build/dev/reports/PR_26175_CHARLIE_014-configuration-summary.md
-new file mode 100644
-index 000000000..b576b4fff
---- /dev/null
-+++ b/docs_build/dev/reports/PR_26175_CHARLIE_014-configuration-summary.md
-@@ -0,0 +1,26 @@
-+# PR_26175_CHARLIE_014 Configuration Summary
-+
-+## Scope
-+
-+Team: Charlie
-+
-+Purpose: Add a read-only current-environment Configuration Summary to Admin System Health Phase 2.
-+
-+## Changes
-+
-+- Added server-owned `configurationSummary` to the Admin System Health status API.
-+- Added a Configuration Summary table with current environment, hosting model, site URL, API URL, database provider/type, storage provider/folder, and auth provider/status.
-+- Reused existing URL redaction so credentials are masked before the browser receives display values.
-+- Updated API and Playwright System Health tests.
-+
-+## Architecture Notes
-+
-+- PASS: Summary is read-only.
-+- PASS: No secrets are exposed.
-+- PASS: Current environment only.
-+- PASS: Browser renders API-owned configuration state only.
-+- PASS: No cross-environment checks were added.
-+
-+## Artifact
-+
-+- `tmp/PR_26175_CHARLIE_014-configuration-summary_delta.zip`
-diff --git a/docs_build/dev/reports/PR_26175_CHARLIE_015-manual-health-actions-branch-validation.md b/docs_build/dev/reports/PR_26175_CHARLIE_015-manual-health-actions-branch-validation.md
-new file mode 100644
-index 000000000..32175f177
---- /dev/null
-+++ b/docs_build/dev/reports/PR_26175_CHARLIE_015-manual-health-actions-branch-validation.md
-@@ -0,0 +1,9 @@
-+# PR_26175_CHARLIE_015 Branch Validation
-+
-+## Branch Rules
-+
-+- PASS: Continued on `pr/26175-CHARLIE-010-system-health-history-and-closeout`.
-+- PASS: Stacked on PR_26175_CHARLIE_014.
-+- PASS: No merge was performed.
-+- PASS: No rebase was performed.
-+- PASS: No new root branch was created.
-diff --git a/docs_build/dev/reports/PR_26175_CHARLIE_015-manual-health-actions-manual-validation-notes.md b/docs_build/dev/reports/PR_26175_CHARLIE_015-manual-health-actions-manual-validation-notes.md
-new file mode 100644
-index 000000000..019226334
---- /dev/null
-+++ b/docs_build/dev/reports/PR_26175_CHARLIE_015-manual-health-actions-manual-validation-notes.md
-@@ -0,0 +1,7 @@
-+# PR_26175_CHARLIE_015 Manual Validation Notes
-+
-+- Verified all five requested manual action controls are visible on `admin/system-health.html`.
-+- Verified Run Runtime Check posts to `/api/admin/system-health/action`.
-+- Verified manual action results are rendered in the action results table.
-+- Verified storage health action is server-side and current-environment scoped.
-+- Verified no peer environment health checks were introduced.
-diff --git a/docs_build/dev/reports/PR_26175_CHARLIE_015-manual-health-actions-requirement-checklist.md b/docs_build/dev/reports/PR_26175_CHARLIE_015-manual-health-actions-requirement-checklist.md
-new file mode 100644
-index 000000000..992ba2925
---- /dev/null
-+++ b/docs_build/dev/reports/PR_26175_CHARLIE_015-manual-health-actions-requirement-checklist.md
-@@ -0,0 +1,12 @@
-+# PR_26175_CHARLIE_015 Requirement Checklist
-+
-+- PASS: Added Refresh control.
-+- PASS: Added Run Runtime Check control.
-+- PASS: Added Run Database Check control.
-+- PASS: Added Run Storage Check control.
-+- PASS: Added Run Full Health Check control.
-+- PASS: Actions call API/service contracts.
-+- PASS: No browser-owned fake health success.
-+- PASS: Current environment only.
-+- PASS: Tests were updated.
-+- PASS: Required reports were generated.
-diff --git a/docs_build/dev/reports/PR_26175_CHARLIE_015-manual-health-actions-validation.md b/docs_build/dev/reports/PR_26175_CHARLIE_015-manual-health-actions-validation.md
-new file mode 100644
-index 000000000..7d7a5af14
---- /dev/null
-+++ b/docs_build/dev/reports/PR_26175_CHARLIE_015-manual-health-actions-validation.md
-@@ -0,0 +1,19 @@
-+# PR_26175_CHARLIE_015 Validation Report
-+
-+## Commands
-+
-+- PASS: `node --check src/dev-runtime/server/local-api-router.mjs`
-+- PASS: `node --check assets/theme-v2/js/admin-system-health.js`
-+- PASS: `node --check src/api/admin-system-health-api-client.js`
-+- PASS: `git diff --check`
-+ - Result: no whitespace errors; CRLF conversion warnings only.
-+- PASS: `node --test tests/dev-runtime/AdminHealthOperations.test.mjs`
-+ - Result: 4 passed.
-+- PASS: `npx playwright test tests/playwright/tools/AdminHealthOperationsPage.spec.mjs --workers=1 --reporter=line`
-+ - Result: 3 passed.
-+
-+## Validation Lane
-+
-+- Targeted System Health API/unit lane: PASS.
-+- Targeted System Health Playwright lane: PASS.
-+- Full samples smoke: not run; not required for this System Health-only slice.
-diff --git a/docs_build/dev/reports/PR_26175_CHARLIE_015-manual-health-actions.md b/docs_build/dev/reports/PR_26175_CHARLIE_015-manual-health-actions.md
-new file mode 100644
-index 000000000..467ed14a4
---- /dev/null
-+++ b/docs_build/dev/reports/PR_26175_CHARLIE_015-manual-health-actions.md
-@@ -0,0 +1,27 @@
-+# PR_26175_CHARLIE_015 Manual Health Actions
-+
-+## Scope
-+
-+Team: Charlie
-+
-+Purpose: Add manual current-environment health action controls to Admin System Health Phase 2.
-+
-+## Changes
-+
-+- Added `/api/admin/system-health/action` for Refresh, Run Runtime Check, Run Database Check, Run Storage Check, and Run Full Health Check.
-+- Added manual action buttons and an action result table to `admin/system-health.html`.
-+- Added client API support for manual health actions.
-+- Updated the controller so action results render only from server responses.
-+- Updated API and Playwright System Health tests.
-+
-+## Architecture Notes
-+
-+- PASS: Actions call API/service contracts.
-+- PASS: Browser does not fake successful health.
-+- PASS: Storage action runs bucket connectivity, list, upload, read, and delete through the current deployment API.
-+- PASS: Current environment only.
-+- PASS: No cross-environment checks were added.
-+
-+## Artifact
-+
-+- `tmp/PR_26175_CHARLIE_015-manual-health-actions_delta.zip`
-diff --git a/docs_build/dev/reports/PR_26175_CHARLIE_016-scheduled-health-monitoring-branch-validation.md b/docs_build/dev/reports/PR_26175_CHARLIE_016-scheduled-health-monitoring-branch-validation.md
-new file mode 100644
-index 000000000..9ad64a553
---- /dev/null
-+++ b/docs_build/dev/reports/PR_26175_CHARLIE_016-scheduled-health-monitoring-branch-validation.md
-@@ -0,0 +1,9 @@
-+# PR_26175_CHARLIE_016 Branch Validation
-+
-+## Branch Rules
-+
-+- PASS: Continued on `pr/26175-CHARLIE-010-system-health-history-and-closeout`.
-+- PASS: Stacked on PR_26175_CHARLIE_015.
-+- PASS: No merge was performed.
-+- PASS: No rebase was performed.
-+- PASS: No new root branch was created.
-diff --git a/docs_build/dev/reports/PR_26175_CHARLIE_016-scheduled-health-monitoring-manual-validation-notes.md b/docs_build/dev/reports/PR_26175_CHARLIE_016-scheduled-health-monitoring-manual-validation-notes.md
-new file mode 100644
-index 000000000..010238f9a
---- /dev/null
-+++ b/docs_build/dev/reports/PR_26175_CHARLIE_016-scheduled-health-monitoring-manual-validation-notes.md
-@@ -0,0 +1,6 @@
-+# PR_26175_CHARLIE_016 Manual Validation Notes
-+
-+- Verified Scheduled Health Monitoring renders on `admin/system-health.html`.
-+- Verified Not Configured appears instead of fake scheduler success.
-+- Verified the table includes last run, next run, duration, recent result, and failures/warnings.
-+- Verified no scheduler side effects or cross-environment checks were introduced.
-diff --git a/docs_build/dev/reports/PR_26175_CHARLIE_016-scheduled-health-monitoring-requirement-checklist.md b/docs_build/dev/reports/PR_26175_CHARLIE_016-scheduled-health-monitoring-requirement-checklist.md
-new file mode 100644
-index 000000000..d099700d5
---- /dev/null
-+++ b/docs_build/dev/reports/PR_26175_CHARLIE_016-scheduled-health-monitoring-requirement-checklist.md
-@@ -0,0 +1,12 @@
-+# PR_26175_CHARLIE_016 Requirement Checklist
-+
-+- PASS: Added Scheduled Health Monitoring foundation.
-+- PASS: Shows last scheduled run.
-+- PASS: Shows next scheduled run if available.
-+- PASS: Shows duration.
-+- PASS: Shows recent result.
-+- PASS: Shows failures/warnings.
-+- PASS: Shows production-safe Not Configured state when scheduler is not implemented.
-+- PASS: Current environment only.
-+- PASS: Tests were updated.
-+- PASS: Required reports were generated.
-diff --git a/docs_build/dev/reports/PR_26175_CHARLIE_016-scheduled-health-monitoring-validation.md b/docs_build/dev/reports/PR_26175_CHARLIE_016-scheduled-health-monitoring-validation.md
-new file mode 100644
-index 000000000..2d660b368
---- /dev/null
-+++ b/docs_build/dev/reports/PR_26175_CHARLIE_016-scheduled-health-monitoring-validation.md
-@@ -0,0 +1,18 @@
-+# PR_26175_CHARLIE_016 Validation Report
-+
-+## Commands
-+
-+- PASS: `node --check src/dev-runtime/server/local-api-router.mjs`
-+- PASS: `node --check assets/theme-v2/js/admin-system-health.js`
-+- PASS: `git diff --check`
-+ - Result: no whitespace errors; CRLF conversion warnings only.
-+- PASS: `node --test tests/dev-runtime/AdminHealthOperations.test.mjs`
-+ - Result: 4 passed.
-+- PASS: `npx playwright test tests/playwright/tools/AdminHealthOperationsPage.spec.mjs --workers=1 --reporter=line`
-+ - Result: 3 passed.
-+
-+## Validation Lane
-+
-+- Targeted System Health API/unit lane: PASS.
-+- Targeted System Health Playwright lane: PASS.
-+- Full samples smoke: not run; not required for this System Health-only slice.
-diff --git a/docs_build/dev/reports/PR_26175_CHARLIE_016-scheduled-health-monitoring.md b/docs_build/dev/reports/PR_26175_CHARLIE_016-scheduled-health-monitoring.md
-new file mode 100644
-index 000000000..a07e997e2
---- /dev/null
-+++ b/docs_build/dev/reports/PR_26175_CHARLIE_016-scheduled-health-monitoring.md
-@@ -0,0 +1,26 @@
-+# PR_26175_CHARLIE_016 Scheduled Health Monitoring
-+
-+## Scope
-+
-+Team: Charlie
-+
-+Purpose: Add the Scheduled Health Monitoring foundation to Admin System Health Phase 2.
-+
-+## Changes
-+
-+- Added server-owned `scheduledMonitoring` to the Admin System Health status API.
-+- Added Scheduled Health Monitoring table for last scheduled run, next scheduled run, duration, recent result, and failures/warnings.
-+- Returned production-safe Not Configured values because no scheduler contract is implemented.
-+- Updated API and Playwright System Health tests.
-+
-+## Architecture Notes
-+
-+- PASS: Scheduler success is not faked.
-+- PASS: Not Configured state is explicit and safe.
-+- PASS: Current environment only.
-+- PASS: Browser renders API-owned state only.
-+- PASS: No cross-environment checks were added.
-+
-+## Artifact
-+
-+- `tmp/PR_26175_CHARLIE_016-scheduled-health-monitoring_delta.zip`
-diff --git a/docs_build/dev/reports/PR_26175_CHARLIE_017-health-notifications-foundation-branch-validation.md b/docs_build/dev/reports/PR_26175_CHARLIE_017-health-notifications-foundation-branch-validation.md
-new file mode 100644
-index 000000000..23f700f3c
---- /dev/null
-+++ b/docs_build/dev/reports/PR_26175_CHARLIE_017-health-notifications-foundation-branch-validation.md
-@@ -0,0 +1,9 @@
-+# PR_26175_CHARLIE_017 Branch Validation
-+
-+## Branch Rules
-+
-+- PASS: Continued on `pr/26175-CHARLIE-010-system-health-history-and-closeout`.
-+- PASS: Stacked on PR_26175_CHARLIE_016.
-+- PASS: No merge was performed.
-+- PASS: No rebase was performed.
-+- PASS: No new root branch was created.
-diff --git a/docs_build/dev/reports/PR_26175_CHARLIE_017-health-notifications-foundation-manual-validation-notes.md b/docs_build/dev/reports/PR_26175_CHARLIE_017-health-notifications-foundation-manual-validation-notes.md
-new file mode 100644
-index 000000000..a3f0ef546
---- /dev/null
-+++ b/docs_build/dev/reports/PR_26175_CHARLIE_017-health-notifications-foundation-manual-validation-notes.md
-@@ -0,0 +1,6 @@
-+# PR_26175_CHARLIE_017 Manual Validation Notes
-+
-+- Verified Notifications & Alerts renders on `admin/system-health.html`.
-+- Verified Email alerts, Admin notifications, Webhook alerts, and Messages integration show Not Configured.
-+- Verified no send controls or delivery actions were added.
-+- Verified no peer environment health checks were introduced.
-diff --git a/docs_build/dev/reports/PR_26175_CHARLIE_017-health-notifications-foundation-requirement-checklist.md b/docs_build/dev/reports/PR_26175_CHARLIE_017-health-notifications-foundation-requirement-checklist.md
-new file mode 100644
-index 000000000..9455d7554
---- /dev/null
-+++ b/docs_build/dev/reports/PR_26175_CHARLIE_017-health-notifications-foundation-requirement-checklist.md
-@@ -0,0 +1,12 @@
-+# PR_26175_CHARLIE_017 Requirement Checklist
-+
-+- PASS: Added Email alerts status placeholder.
-+- PASS: Added Admin notification status placeholder.
-+- PASS: Added Webhook status placeholder.
-+- PASS: Added Messages integration placeholder because a messages service surface exists.
-+- PASS: Did not add actual sending behavior.
-+- PASS: Shows Not Configured safely.
-+- PASS: Added final Phase 2 closeout report.
-+- PASS: Current environment only.
-+- PASS: Tests were updated.
-+- PASS: Required reports were generated.
-diff --git a/docs_build/dev/reports/PR_26175_CHARLIE_017-health-notifications-foundation-validation.md b/docs_build/dev/reports/PR_26175_CHARLIE_017-health-notifications-foundation-validation.md
-new file mode 100644
-index 000000000..4d1bd2871
---- /dev/null
-+++ b/docs_build/dev/reports/PR_26175_CHARLIE_017-health-notifications-foundation-validation.md
-@@ -0,0 +1,18 @@
-+# PR_26175_CHARLIE_017 Validation Report
-+
-+## Commands
-+
-+- PASS: `node --check src/dev-runtime/server/local-api-router.mjs`
-+- PASS: `node --check assets/theme-v2/js/admin-system-health.js`
-+- PASS: `git diff --check`
-+ - Result: no whitespace errors; CRLF conversion warnings only.
-+- PASS: `node --test tests/dev-runtime/AdminHealthOperations.test.mjs`
-+ - Result: 4 passed.
-+- PASS: `npx playwright test tests/playwright/tools/AdminHealthOperationsPage.spec.mjs --workers=1 --reporter=line`
-+ - Result: 3 passed.
-+
-+## Validation Lane
-+
-+- Targeted System Health API/unit lane: PASS.
-+- Targeted System Health Playwright lane: PASS.
-+- Full samples smoke: not run; not required for this System Health-only slice.
-diff --git a/docs_build/dev/reports/PR_26175_CHARLIE_017-health-notifications-foundation.md b/docs_build/dev/reports/PR_26175_CHARLIE_017-health-notifications-foundation.md
-new file mode 100644
-index 000000000..128662d81
---- /dev/null
-+++ b/docs_build/dev/reports/PR_26175_CHARLIE_017-health-notifications-foundation.md
-@@ -0,0 +1,28 @@
-+# PR_26175_CHARLIE_017 Health Notifications Foundation
-+
-+## Scope
-+
-+Team: Charlie
-+
-+Purpose: Add Notifications & Alerts foundation placeholders to Admin System Health Phase 2.
-+
-+## Changes
-+
-+- Added server-owned `notificationsFoundation` to the Admin System Health status API.
-+- Added Notifications & Alerts table with Email alerts, Admin notifications, Webhook alerts, and Messages integration placeholders.
-+- Returned production-safe Not Configured values for every notification path.
-+- Added final Phase 2 closeout report.
-+- Updated API and Playwright System Health tests.
-+
-+## Architecture Notes
-+
-+- PASS: No email sending was added.
-+- PASS: No webhook sending was added.
-+- PASS: No admin notification delivery was added.
-+- PASS: Messages integration is placeholder-only.
-+- PASS: Current environment only.
-+- PASS: Browser renders API-owned state only.
-+
-+## Artifact
-+
-+- `tmp/PR_26175_CHARLIE_017-health-notifications-foundation_delta.zip`
-diff --git a/docs_build/dev/reports/PR_26175_CHARLIE_018-health-api-contract-cleanup-branch-validation.md b/docs_build/dev/reports/PR_26175_CHARLIE_018-health-api-contract-cleanup-branch-validation.md
-new file mode 100644
-index 000000000..b10a284e8
---- /dev/null
-+++ b/docs_build/dev/reports/PR_26175_CHARLIE_018-health-api-contract-cleanup-branch-validation.md
-@@ -0,0 +1,6 @@
-+# PR_26175_CHARLIE_018 Branch Validation
-+
-+- PASS: Started from clean `pr/26175-CHARLIE-010-system-health-history-and-closeout`.
-+- PASS: Stacked on PR_26175_CHARLIE_017.
-+- PASS: No merge performed.
-+- PASS: No rebase performed.
-diff --git a/docs_build/dev/reports/PR_26175_CHARLIE_018-health-api-contract-cleanup-manual-validation-notes.md b/docs_build/dev/reports/PR_26175_CHARLIE_018-health-api-contract-cleanup-manual-validation-notes.md
-new file mode 100644
-index 000000000..a54b303eb
---- /dev/null
-+++ b/docs_build/dev/reports/PR_26175_CHARLIE_018-health-api-contract-cleanup-manual-validation-notes.md
+diff --git a/docs_build/dev/BUILD_PR.md b/docs_build/dev/BUILD_PR.md
+@@ -1,74 +1,109 @@
+-# PR_26175_ALFA_011-status-bar-journey-progress-context
++# PR_26175_ALFA_047-theme-v2-svg-icon-registry
+
+ ## Purpose
+-Add right-anchored progress context to the shared toolbox status bar using the existing Game Journey completion metrics/API pipeline.
++Create a shared Theme V2 SVG icon asset registry and authoritative validation specification so toolbox and platform UI can use approved standalone SVG files from one repo-owned source instead of page-local SVG, ad hoc CSS drawings, Font Awesome glyphs, conversation screenshots, vague row references, CSS-only generation, or a JS-only registry.
+
+ ## Source Of Truth
+-This `BUILD_PR.md` is the source of truth for `PR_26175_ALFA_011-status-bar-journey-progress-context`.
++This `BUILD_PR.md` is the source of truth for `PR_26175_ALFA_047-theme-v2-svg-icon-registry`.
+
+ ## Exact Scope
+-- Preserve the ALFA_009 single-row toolbox status bar behavior:
+- - left side displays only the selected Game Hub game name.
+- - center displays only the current status message.
+-- Add right-anchored progress text in this format:
+- - `{CurrentTool} {complete}/{total} ({percent}%) | Journey {complete}/{total} ({percent}%)`
+-- Use existing Game Journey completion metrics/API pipeline for Journey totals.
+-- Derive current-tool progress from the existing completion metrics record that matches the current toolbox tool/section.
+-- Do not add new storage.
+-- Do not use browser-owned authoritative progress data.
+-- Preserve fullscreen bottom anchoring and existing fullscreen content bottom reserve.
+-- Preserve normal placement above the footer.
+-- Use shared Theme V2 CSS/classes only.
+-- Update targeted Playwright coverage for the right-anchored progress text and existing left/center behavior.
++- Remove the incorrect JS-only icon registry implementation from the ALFA_047 delta.
++- Use the user-authored SVG files already present under `assets/theme-v2/svg/` as the authoritative source.
++- Do not regenerate, redesign, simplify, optimize, or redraw any SVG icon artwork in this PR.
++- Required SVG files:
++ - `gfs-chevron-left.svg`
++ - `gfs-chevron-right.svg`
++ - `gfs-chevron-up.svg`
++ - `gfs-chevron-down.svg`
++ - `gfs-add.svg`
++ - `gfs-subtract.svg`
++ - `gfs-trash.svg`
++ - `gfs-close.svg`
++ - `gfs-warning.svg`
++ - `gfs-error.svg`
++ - `gfs-success.svg`
++ - `gfs-info.svg`
++ - `gfs-fullscreen.svg`
++ - `gfs-exit-fullscreen.svg`
++ - `gfs-menu.svg`
++ - `gfs-search.svg`
++ - `gfs-settings.svg`
++- Validate each required SVG is well-formed XML.
++- Validate each SVG uses `viewBox="0 0 24 24"`, `fill="none"`, `stroke="currentColor"`, `stroke-linecap="round"`, and `stroke-linejoin="round"`.
++- Do not create `expand` or `collapse` icon naming.
++- Do not create `delete` icon naming.
++- Do not replace the standalone SVG assets with a JS-only icon registry.
++- Do not replace the standalone SVG assets with CSS-only icon generation.
++- Create `docs_build/design/theme-v2-icons/theme-v2-icon-style-guide.md` as the authoritative specification for all future Theme V2 SVG icons.
++- Create or update `assets/theme-v2/svg/README.md` as the registry documentation for the authoritative SVG asset pack.
++- Document the approved validation rules and the no-regeneration/no-redesign policy.
++- If any required SVG is missing, report validation failure instead of generating a replacement.
++- Do not convert existing UI controls in this PR.
+
+ ## Exact Targets
+ - `docs_build/dev/BUILD_PR.md`
+-- `assets/theme-v2/js/toolbox-status-bar.js`
+-- `assets/theme-v2/css/status.css`
+-- `tests/playwright/tools/ToolboxSelectedGameStatusBar.spec.mjs`
+-- `docs_build/dev/reports/PR_26175_ALFA_011-status-bar-journey-progress-context_report.md`
+-- `docs_build/dev/reports/PR_26175_ALFA_011-status-bar-journey-progress-context_validation-lane.md`
+-- `docs_build/dev/reports/PR_26175_ALFA_011-status-bar-journey-progress-context_requirements-checklist.md`
++- `assets/theme-v2/svg/gfs-chevron-left.svg`
++- `assets/theme-v2/svg/gfs-chevron-right.svg`
++- `assets/theme-v2/svg/gfs-chevron-up.svg`
++- `assets/theme-v2/svg/gfs-chevron-down.svg`
++- `assets/theme-v2/svg/gfs-add.svg`
++- `assets/theme-v2/svg/gfs-subtract.svg`
++- `assets/theme-v2/svg/gfs-trash.svg`
++- `assets/theme-v2/svg/gfs-close.svg`
++- `assets/theme-v2/svg/gfs-warning.svg`
++- `assets/theme-v2/svg/gfs-error.svg`
++- `assets/theme-v2/svg/gfs-success.svg`
++- `assets/theme-v2/svg/gfs-info.svg`
++- `assets/theme-v2/svg/gfs-fullscreen.svg`
++- `assets/theme-v2/svg/gfs-exit-fullscreen.svg`
++- `assets/theme-v2/svg/gfs-menu.svg`
++- `assets/theme-v2/svg/gfs-search.svg`
++- `assets/theme-v2/svg/gfs-settings.svg`
++- `assets/theme-v2/svg/README.md`
++- `docs_build/design/theme-v2-icons/theme-v2-icon-style-guide.md`
++- `tests/playwright/tools/ThemeV2SvgIconRegistry.spec.mjs`
++- `docs_build/dev/reports/PR_26175_ALFA_047-theme-v2-svg-icon-registry_report.md`
++- `docs_build/dev/reports/PR_26175_ALFA_047-theme-v2-svg-icon-registry_validation-lane.md`
++- `docs_build/dev/reports/PR_26175_ALFA_047-theme-v2-svg-icon-registry_requirements-checklist.md`
++- `docs_build/dev/reports/PR_26175_ALFA_047-theme-v2-svg-icon-registry_manual-validation-notes.md`
+ - `docs_build/dev/reports/codex_review.diff`
+ - `docs_build/dev/reports/codex_changed_files.txt`
+
+ ## Evidence Sources
+-- `assets/js/shared/game-journey-api-client.js`
+-- `src/api/game-journey-completion-api-client.js`
+-- `src/dev-runtime/server/local-api-router.mjs`
+-- `src/dev-runtime/persistence/game-journey-completion-metrics-store.mjs`
++- `docs_build/pr/PLAN_PR_26175_ALFA_047-theme-v2-svg-icon-registry.md`
++- `assets/theme-v2/images/gfs-chevron-down.svg`
++- `assets/theme-v2/images/gfs-chevron-up.svg`
+
+ ## Out Of Scope
+-- No Game Journey API/service/repository contract changes.
+-- No new persistence/storage.
++- No chevron conversion.
++- No status/action icon conversion.
++- No layout utility icon conversion.
++- No JS-only icon registry.
++- No CSS-only icon generation.
++- No Theme V2 CSS changes.
++- No runtime UI conversion.
++- No accordion conversion.
++- No Font Awesome removal.
++- No broad visual redesign.
++- No page-local CSS.
++- No inline styles.
++- No style blocks.
+ - No browser-owned product data as source of truth.
+-- No silent fallback data.
+-- No environment/server details in the status bar.
+-- No selected game purpose in the visible status bar.
+-- No visible status category labels in the status bar.
+-- No large banners.
+-- No modal messages or modal-style status messages.
+-- No row highlights.
+-- No inline styles, style blocks, or page-local CSS.
++- No API/service/repository contract changes.
+ - No engine core changes.
+ - No `start_of_day` folder changes.
+
+ ## Validation
+-Run targeted Playwright coverage:
++Run exactly:
+
+ ```powershell
+-npx playwright test tests/playwright/tools/ToolboxSelectedGameStatusBar.spec.mjs --workers=1
+-```
+-
+-Also verify changed source does not introduce inline styles or style blocks:
+-
+-```powershell
+-rg -n "<[s]tyle|[s]tyle=" assets/theme-v2/js/toolbox-status-bar.js assets/theme-v2/css/status.css tests/playwright/tools/ToolboxSelectedGameStatusBar.spec.mjs
++npx playwright test tests/playwright/tools/ThemeV2SvgIconRegistry.spec.mjs --workers=1
++rg -n "<[s]tyle|[s]tyle=" docs_build/design/theme-v2-icons/theme-v2-icon-style-guide.md tests/playwright/tools/ThemeV2SvgIconRegistry.spec.mjs
+ ```
+
+ ## Artifact
+ Create repo-structured delta ZIP:
+
+ ```text
+-tmp/PR_26175_ALFA_011-status-bar-journey-progress-context_delta.zip
++tmp/PR_26175_ALFA_047-theme-v2-svg-icon-registry_delta.zip
+ ```
+diff --git a/assets/theme-v2/svg/README.md b/assets/theme-v2/svg/README.md
+new file mode 100644
+index 000000000..000000000
+@@ -0,0 +1,35 @@
++# GFS Icon Pack v1 Core
++
++The SVG files in `assets/theme-v2/svg/` are the authoritative Theme V2 icon source.
++
++These files are user-authored and approved. Do not regenerate, redesign, simplify, optimize, or redraw these SVG files during validation-only PRs.
++
++If a required SVG is missing, report validation failure instead of generating a replacement.
++
++Required validation:
++- each required file exists under `assets/theme-v2/svg/`
++- each SVG is well-formed XML
++- each SVG uses `viewBox="0 0 24 24"`
++- each SVG uses `fill="none"`
++- each SVG uses `stroke="currentColor"`
++- each SVG uses `stroke-linecap="round"`
++- each SVG uses `stroke-linejoin="round"`
++
++Required filenames:
++- `gfs-chevron-left.svg`
++- `gfs-chevron-right.svg`
++- `gfs-chevron-up.svg`
++- `gfs-chevron-down.svg`
++- `gfs-add.svg`
++- `gfs-subtract.svg`
++- `gfs-trash.svg`
++- `gfs-close.svg`
++- `gfs-warning.svg`
++- `gfs-error.svg`
++- `gfs-success.svg`
++- `gfs-info.svg`
++- `gfs-fullscreen.svg`
++- `gfs-exit-fullscreen.svg`
++- `gfs-menu.svg`
++- `gfs-search.svg`
++- `gfs-settings.svg`
+diff --git a/assets/theme-v2/svg/gfs-add.svg b/assets/theme-v2/svg/gfs-add.svg
+new file mode 100644
+index 000000000..000000000
+@@ -0,0 +1,3 @@
++
+diff --git a/assets/theme-v2/svg/gfs-chevron-down.svg b/assets/theme-v2/svg/gfs-chevron-down.svg
+new file mode 100644
+index 000000000..000000000
+@@ -0,0 +1,4 @@
++
+diff --git a/assets/theme-v2/svg/gfs-chevron-left.svg b/assets/theme-v2/svg/gfs-chevron-left.svg
+new file mode 100644
+index 000000000..000000000
+@@ -0,0 +1,4 @@
++
+diff --git a/assets/theme-v2/svg/gfs-chevron-right.svg b/assets/theme-v2/svg/gfs-chevron-right.svg
+new file mode 100644
+index 000000000..000000000
+@@ -0,0 +1,4 @@
++
+diff --git a/assets/theme-v2/svg/gfs-chevron-up.svg b/assets/theme-v2/svg/gfs-chevron-up.svg
+new file mode 100644
+index 000000000..000000000
+@@ -0,0 +1,4 @@
++
+diff --git a/assets/theme-v2/svg/gfs-close.svg b/assets/theme-v2/svg/gfs-close.svg
+new file mode 100644
+index 000000000..000000000
+@@ -0,0 +1,5 @@
++
+diff --git a/assets/theme-v2/svg/gfs-error.svg b/assets/theme-v2/svg/gfs-error.svg
+new file mode 100644
+index 000000000..000000000
@@ -0,0 +1,6 @@
-+# PR_26175_CHARLIE_018 Manual Validation Notes
-+
-+- Verified Health API Contract table appears on System Health.
-+- Verified contract rows come from `/api/admin/system-health/status`.
-+- Verified Environment Map remains reference-only.
-+- Verified no response shape removals were made.
-diff --git a/docs_build/dev/reports/PR_26175_CHARLIE_018-health-api-contract-cleanup-requirement-checklist.md b/docs_build/dev/reports/PR_26175_CHARLIE_018-health-api-contract-cleanup-requirement-checklist.md
-new file mode 100644
-index 000000000..8ffb3f1c1
---- /dev/null
-+++ b/docs_build/dev/reports/PR_26175_CHARLIE_018-health-api-contract-cleanup-requirement-checklist.md
-@@ -0,0 +1,9 @@
-+# PR_26175_CHARLIE_018 Requirement Checklist
-+
-+- PASS: Cleaned up API contract visibility.
-+- PASS: Preserved current response fields.
-+- PASS: Added explicit current-deployment-only contract.
-+- PASS: Added explicit no-cross-environment-checks contract.
-+- PASS: Added endpoint list.
-+- PASS: Browser renders API-owned contract state.
-+- PASS: Required reports generated.
-diff --git a/docs_build/dev/reports/PR_26175_CHARLIE_018-health-api-contract-cleanup-validation.md b/docs_build/dev/reports/PR_26175_CHARLIE_018-health-api-contract-cleanup-validation.md
-new file mode 100644
-index 000000000..407a3065d
---- /dev/null
-+++ b/docs_build/dev/reports/PR_26175_CHARLIE_018-health-api-contract-cleanup-validation.md
-@@ -0,0 +1,12 @@
-+# PR_26175_CHARLIE_018 Validation Report
-+
-+## Commands
-+
-+- PASS: `node --check src/dev-runtime/server/local-api-router.mjs`
-+- PASS: `node --check assets/theme-v2/js/admin-system-health.js`
-+- PASS: `git diff --check`
-+ - Result: no whitespace errors; CRLF conversion warnings only.
-+- PASS: `node --test tests/dev-runtime/AdminHealthOperations.test.mjs`
-+ - Result: 4 passed.
-+- PASS: `npx playwright test tests/playwright/tools/AdminHealthOperationsPage.spec.mjs --workers=1 --reporter=line`
-+ - Result: 3 passed.
-diff --git a/docs_build/dev/reports/PR_26175_CHARLIE_018-health-api-contract-cleanup.md b/docs_build/dev/reports/PR_26175_CHARLIE_018-health-api-contract-cleanup.md
-new file mode 100644
-index 000000000..e513dee45
---- /dev/null
-+++ b/docs_build/dev/reports/PR_26175_CHARLIE_018-health-api-contract-cleanup.md
-@@ -0,0 +1,25 @@
-+# PR_26175_CHARLIE_018 Health API Contract Cleanup
-+
-+## Scope
-+
-+Team: Charlie
-+
-+Purpose: Add explicit Admin System Health API contract metadata and UI visibility.
-+
-+## Changes
-+
-+- Added server-owned `apiContract` to `/api/admin/system-health/status`.
-+- Added contract version, data boundary, current-deployment-only rule, reference-only Environment Map rule, secret handling rule, and endpoint registry.
-+- Added Health API Contract table to `admin/system-health.html`.
-+- Updated API and Playwright tests.
-+
-+## Validation
-+
-+- PASS: Targeted System Health API/unit tests.
-+- PASS: Targeted System Health Playwright tests.
-+- PASS: Syntax checks.
-+- PASS: `git diff --check`.
-+
-+## Artifact
-+
-+- `tmp/PR_26175_CHARLIE_018-health-api-contract-cleanup_delta.zip`
-diff --git a/docs_build/dev/reports/PR_26175_CHARLIE_019-environment-capabilities-branch-validation.md b/docs_build/dev/reports/PR_26175_CHARLIE_019-environment-capabilities-branch-validation.md
-new file mode 100644
-index 000000000..519a012e3
---- /dev/null
-+++ b/docs_build/dev/reports/PR_26175_CHARLIE_019-environment-capabilities-branch-validation.md
++
+diff --git a/assets/theme-v2/svg/gfs-exit-fullscreen.svg b/assets/theme-v2/svg/gfs-exit-fullscreen.svg
+new file mode 100644
+index 000000000..000000000
+@@ -0,0 +1,10 @@
++
+diff --git a/assets/theme-v2/svg/gfs-fullscreen.svg b/assets/theme-v2/svg/gfs-fullscreen.svg
+new file mode 100644
+index 000000000..000000000
+@@ -0,0 +1,10 @@
++
+diff --git a/assets/theme-v2/svg/gfs-info.svg b/assets/theme-v2/svg/gfs-info.svg
+new file mode 100644
+index 000000000..000000000
@@ -0,0 +1,6 @@
-+# PR_26175_CHARLIE_019 Branch Validation
-+
-+- PASS: Continued on `pr/26175-CHARLIE-010-system-health-history-and-closeout`.
-+- PASS: Stacked on PR_26175_CHARLIE_018.
-+- PASS: No merge performed.
-+- PASS: No rebase performed.
-diff --git a/docs_build/dev/reports/PR_26175_CHARLIE_019-environment-capabilities-manual-validation-notes.md b/docs_build/dev/reports/PR_26175_CHARLIE_019-environment-capabilities-manual-validation-notes.md
-new file mode 100644
-index 000000000..7e0d1b58a
---- /dev/null
-+++ b/docs_build/dev/reports/PR_26175_CHARLIE_019-environment-capabilities-manual-validation-notes.md
++
+diff --git a/assets/theme-v2/svg/gfs-menu.svg b/assets/theme-v2/svg/gfs-menu.svg
+new file mode 100644
+index 000000000..000000000
@@ -0,0 +1,5 @@
-+# PR_26175_CHARLIE_019 Manual Validation Notes
-+
-+- Verified Environment Capabilities table renders after Environment Map.
-+- Verified the table reflects the current deployment only.
-+- Verified no `/uat`, `/prd`, or peer environment checks appear in current capability rows.
-diff --git a/docs_build/dev/reports/PR_26175_CHARLIE_019-environment-capabilities-requirement-checklist.md b/docs_build/dev/reports/PR_26175_CHARLIE_019-environment-capabilities-requirement-checklist.md
-new file mode 100644
-index 000000000..0109a4580
---- /dev/null
-+++ b/docs_build/dev/reports/PR_26175_CHARLIE_019-environment-capabilities-requirement-checklist.md
-@@ -0,0 +1,7 @@
-+# PR_26175_CHARLIE_019 Requirement Checklist
-+
-+- PASS: Added current environment capabilities.
-+- PASS: Did not add peer environment checks.
-+- PASS: Browser renders API-owned capability state.
-+- PASS: Not Configured placeholders do not fake success.
-+- PASS: Required reports generated.
-diff --git a/docs_build/dev/reports/PR_26175_CHARLIE_019-environment-capabilities-validation.md b/docs_build/dev/reports/PR_26175_CHARLIE_019-environment-capabilities-validation.md
-new file mode 100644
-index 000000000..5d523af39
---- /dev/null
-+++ b/docs_build/dev/reports/PR_26175_CHARLIE_019-environment-capabilities-validation.md
-@@ -0,0 +1,12 @@
-+# PR_26175_CHARLIE_019 Validation Report
-+
-+## Commands
-+
-+- PASS: `node --check src/dev-runtime/server/local-api-router.mjs`
-+- PASS: `node --check assets/theme-v2/js/admin-system-health.js`
-+- PASS: `git diff --check`
-+ - Result: no whitespace errors; CRLF conversion warnings only.
-+- PASS: `node --test tests/dev-runtime/AdminHealthOperations.test.mjs`
-+ - Result: 4 passed.
-+- PASS: `npx playwright test tests/playwright/tools/AdminHealthOperationsPage.spec.mjs --workers=1 --reporter=line`
-+ - Result: 3 passed.
-diff --git a/docs_build/dev/reports/PR_26175_CHARLIE_019-environment-capabilities.md b/docs_build/dev/reports/PR_26175_CHARLIE_019-environment-capabilities.md
-new file mode 100644
-index 000000000..a5a68d926
---- /dev/null
-+++ b/docs_build/dev/reports/PR_26175_CHARLIE_019-environment-capabilities.md
-@@ -0,0 +1,25 @@
-+# PR_26175_CHARLIE_019 Environment Capabilities
-+
-+## Scope
-+
-+Team: Charlie
-+
-+Purpose: Add current-environment capability summary to Admin System Health.
-+
-+## Changes
-+
-+- Added server-owned `environmentCapabilities` to the System Health status API.
-+- Added Environment Capabilities table to the System Health page.
-+- Covered Hosting, API, Database, Storage, Authentication, Scheduled Monitoring, and Notifications.
-+- Updated API and Playwright tests.
-+
-+## Validation
-+
-+- PASS: Targeted System Health API/unit tests.
-+- PASS: Targeted System Health Playwright tests.
-+- PASS: Syntax checks.
-+- PASS: `git diff --check`.
-+
-+## Artifact
-+
-+- `tmp/PR_26175_CHARLIE_019-environment-capabilities_delta.zip`
-diff --git a/docs_build/dev/reports/PR_26175_CHARLIE_020-admin-api-registry-branch-validation.md b/docs_build/dev/reports/PR_26175_CHARLIE_020-admin-api-registry-branch-validation.md
-new file mode 100644
-index 000000000..d79bac325
---- /dev/null
-+++ b/docs_build/dev/reports/PR_26175_CHARLIE_020-admin-api-registry-branch-validation.md
++
+diff --git a/assets/theme-v2/svg/gfs-search.svg b/assets/theme-v2/svg/gfs-search.svg
+new file mode 100644
+index 000000000..000000000
@@ -0,0 +1,6 @@
-+# PR_26175_CHARLIE_020 Branch Validation
-+
-+- PASS: Continued on `pr/26175-CHARLIE-010-system-health-history-and-closeout`.
-+- PASS: Stacked on PR_26175_CHARLIE_019.
-+- PASS: No merge performed.
-+- PASS: No rebase performed.
-diff --git a/docs_build/dev/reports/PR_26175_CHARLIE_020-admin-api-registry-manual-validation-notes.md b/docs_build/dev/reports/PR_26175_CHARLIE_020-admin-api-registry-manual-validation-notes.md
-new file mode 100644
-index 000000000..5c9360e50
---- /dev/null
-+++ b/docs_build/dev/reports/PR_26175_CHARLIE_020-admin-api-registry-manual-validation-notes.md
++
+diff --git a/assets/theme-v2/svg/gfs-settings.svg b/assets/theme-v2/svg/gfs-settings.svg
+new file mode 100644
+index 000000000..000000000
+@@ -0,0 +1,4 @@
++
+diff --git a/assets/theme-v2/svg/gfs-subtract.svg b/assets/theme-v2/svg/gfs-subtract.svg
+new file mode 100644
+index 000000000..000000000
+@@ -0,0 +1,3 @@
++
+diff --git a/assets/theme-v2/svg/gfs-success.svg b/assets/theme-v2/svg/gfs-success.svg
+new file mode 100644
+index 000000000..000000000
@@ -0,0 +1,5 @@
-+# PR_26175_CHARLIE_020 Manual Validation Notes
-+
-+- Verified Admin API Registry table renders on System Health.
-+- Verified System Health, Infrastructure, Operations, and Admin navigation routes are listed.
-+- Verified no additional route probes were introduced.
-diff --git a/docs_build/dev/reports/PR_26175_CHARLIE_020-admin-api-registry-requirement-checklist.md b/docs_build/dev/reports/PR_26175_CHARLIE_020-admin-api-registry-requirement-checklist.md
-new file mode 100644
-index 000000000..2aef80253
---- /dev/null
-+++ b/docs_build/dev/reports/PR_26175_CHARLIE_020-admin-api-registry-requirement-checklist.md
-@@ -0,0 +1,7 @@
-+# PR_26175_CHARLIE_020 Requirement Checklist
-+
-+- PASS: Added Admin API Registry.
-+- PASS: Registry is read-only.
-+- PASS: Registry is server-owned.
-+- PASS: Browser renders API-owned registry state.
-+- PASS: Required reports generated.
-diff --git a/docs_build/dev/reports/PR_26175_CHARLIE_020-admin-api-registry-validation.md b/docs_build/dev/reports/PR_26175_CHARLIE_020-admin-api-registry-validation.md
-new file mode 100644
-index 000000000..6f789bfb3
---- /dev/null
-+++ b/docs_build/dev/reports/PR_26175_CHARLIE_020-admin-api-registry-validation.md
-@@ -0,0 +1,12 @@
-+# PR_26175_CHARLIE_020 Validation Report
-+
-+## Commands
-+
-+- PASS: `node --check src/dev-runtime/server/local-api-router.mjs`
-+- PASS: `node --check assets/theme-v2/js/admin-system-health.js`
-+- PASS: `git diff --check`
-+ - Result: no whitespace errors; CRLF conversion warnings only.
-+- PASS: `node --test tests/dev-runtime/AdminHealthOperations.test.mjs`
-+ - Result: 4 passed.
-+- PASS: `npx playwright test tests/playwright/tools/AdminHealthOperationsPage.spec.mjs --workers=1 --reporter=line`
-+ - Result: 3 passed.
-diff --git a/docs_build/dev/reports/PR_26175_CHARLIE_020-admin-api-registry.md b/docs_build/dev/reports/PR_26175_CHARLIE_020-admin-api-registry.md
-new file mode 100644
-index 000000000..a573c14f4
---- /dev/null
-+++ b/docs_build/dev/reports/PR_26175_CHARLIE_020-admin-api-registry.md
-@@ -0,0 +1,25 @@
-+# PR_26175_CHARLIE_020 Admin API Registry
-+
-+## Scope
-+
-+Team: Charlie
-+
-+Purpose: Add a read-only Admin API Registry to System Health.
-+
-+## Changes
-+
-+- Added server-owned `adminApiRegistry` to the System Health status API.
-+- Added Admin API Registry table to `admin/system-health.html`.
-+- Listed System Health, Infrastructure, Operations, and Admin navigation routes used by the admin health surface.
-+- Updated API and Playwright tests.
-+
-+## Validation
-+
-+- PASS: Targeted System Health API/unit tests.
-+- PASS: Targeted System Health Playwright tests.
-+- PASS: Syntax checks.
-+- PASS: `git diff --check`.
-+
-+## Artifact
-+
-+- `tmp/PR_26175_CHARLIE_020-admin-api-registry_delta.zip`
-diff --git a/docs_build/dev/reports/PR_26175_CHARLIE_021-runtime-feature-flags-branch-validation.md b/docs_build/dev/reports/PR_26175_CHARLIE_021-runtime-feature-flags-branch-validation.md
-new file mode 100644
-index 000000000..dda6a5907
---- /dev/null
-+++ b/docs_build/dev/reports/PR_26175_CHARLIE_021-runtime-feature-flags-branch-validation.md
++
+diff --git a/assets/theme-v2/svg/gfs-trash.svg b/assets/theme-v2/svg/gfs-trash.svg
+new file mode 100644
+index 000000000..000000000
+@@ -0,0 +1,8 @@
++
+diff --git a/assets/theme-v2/svg/gfs-warning.svg b/assets/theme-v2/svg/gfs-warning.svg
+new file mode 100644
+index 000000000..000000000
@@ -0,0 +1,6 @@
-+# PR_26175_CHARLIE_021 Branch Validation
-+
-+- PASS: Continued on `pr/26175-CHARLIE-010-system-health-history-and-closeout`.
-+- PASS: Stacked on PR_26175_CHARLIE_020.
-+- PASS: No merge performed.
-+- PASS: No rebase performed.
-diff --git a/docs_build/dev/reports/PR_26175_CHARLIE_021-runtime-feature-flags-manual-validation-notes.md b/docs_build/dev/reports/PR_26175_CHARLIE_021-runtime-feature-flags-manual-validation-notes.md
-new file mode 100644
-index 000000000..e0db010b0
---- /dev/null
-+++ b/docs_build/dev/reports/PR_26175_CHARLIE_021-runtime-feature-flags-manual-validation-notes.md
-@@ -0,0 +1,5 @@
-+# PR_26175_CHARLIE_021 Manual Validation Notes
++
+diff --git a/docs_build/design/theme-v2-icons/theme-v2-icon-style-guide.md b/docs_build/design/theme-v2-icons/theme-v2-icon-style-guide.md
+new file mode 100644
+index 000000000..000000000
+@@ -0,0 +1,55 @@
++# Theme V2 Icon Style Guide
+
-+- Verified Runtime Feature Flags table renders on System Health.
-+- Verified completed System Health flags show Enabled.
-+- Verified scheduled monitoring and notifications remain Not Configured.
-diff --git a/docs_build/dev/reports/PR_26175_CHARLIE_021-runtime-feature-flags-requirement-checklist.md b/docs_build/dev/reports/PR_26175_CHARLIE_021-runtime-feature-flags-requirement-checklist.md
-new file mode 100644
-index 000000000..51a7c1be6
---- /dev/null
-+++ b/docs_build/dev/reports/PR_26175_CHARLIE_021-runtime-feature-flags-requirement-checklist.md
-@@ -0,0 +1,7 @@
-+# PR_26175_CHARLIE_021 Requirement Checklist
-+
-+- PASS: Added runtime feature flags.
-+- PASS: Flags are read-only.
-+- PASS: Flags are server-owned.
-+- PASS: Not Configured placeholders do not fake enabled behavior.
-+- PASS: Required reports generated.
-diff --git a/docs_build/dev/reports/PR_26175_CHARLIE_021-runtime-feature-flags-validation.md b/docs_build/dev/reports/PR_26175_CHARLIE_021-runtime-feature-flags-validation.md
-new file mode 100644
-index 000000000..4cdbaaedd
---- /dev/null
-+++ b/docs_build/dev/reports/PR_26175_CHARLIE_021-runtime-feature-flags-validation.md
-@@ -0,0 +1,12 @@
-+# PR_26175_CHARLIE_021 Validation Report
-+
-+## Commands
-+
-+- PASS: `node --check src/dev-runtime/server/local-api-router.mjs`
-+- PASS: `node --check assets/theme-v2/js/admin-system-health.js`
-+- PASS: `git diff --check`
-+ - Result: no whitespace errors; CRLF conversion warnings only.
-+- PASS: `node --test tests/dev-runtime/AdminHealthOperations.test.mjs`
-+ - Result: 4 passed.
-+- PASS: `npx playwright test tests/playwright/tools/AdminHealthOperationsPage.spec.mjs --workers=1 --reporter=line`
-+ - Result: 3 passed.
-diff --git a/docs_build/dev/reports/PR_26175_CHARLIE_021-runtime-feature-flags.md b/docs_build/dev/reports/PR_26175_CHARLIE_021-runtime-feature-flags.md
-new file mode 100644
-index 000000000..9f8607a0c
---- /dev/null
-+++ b/docs_build/dev/reports/PR_26175_CHARLIE_021-runtime-feature-flags.md
-@@ -0,0 +1,25 @@
-+# PR_26175_CHARLIE_021 Runtime Feature Flags
-+
-+## Scope
++## Purpose
++Provide the approved validation and usage language for shared Theme V2 SVG icons.
++
++The SVG files in `assets/theme-v2/svg/` are the authoritative Theme V2 icon source.
++
++## Artwork Authority
++The SVG artwork is user-authored and approved.
++
++Do not regenerate, redesign, simplify, optimize, or redraw these SVG files during validation-only PRs.
++
++If a required SVG is missing, report validation failure instead of generating a replacement.
++
++Do not replace the SVG files with CSS-only or JS-only icon generation.
++
++## SVG Validation Standard
++Every required SVG must be a standalone file under `assets/theme-v2/svg/`.
++
++Every required SVG must be well-formed XML.
++
++Every required SVG must use:
++- `viewBox="0 0 24 24"`
++- `fill="none"`
++- `stroke="currentColor"`
++- `stroke-linecap="round"`
++- `stroke-linejoin="round"`
++
++The approved files may include additional SVG attributes or path geometry as authored. Validation should not inspect, simplify, optimize, or rewrite artwork geometry.
++
++## Required Icon Files
++- `gfs-chevron-left.svg`
++- `gfs-chevron-right.svg`
++- `gfs-chevron-up.svg`
++- `gfs-chevron-down.svg`
++- `gfs-add.svg`
++- `gfs-subtract.svg`
++- `gfs-trash.svg`
++- `gfs-close.svg`
++- `gfs-warning.svg`
++- `gfs-error.svg`
++- `gfs-success.svg`
++- `gfs-info.svg`
++- `gfs-fullscreen.svg`
++- `gfs-exit-fullscreen.svg`
++- `gfs-menu.svg`
++- `gfs-search.svg`
++- `gfs-settings.svg`
++
++## Naming Rules
++Use `trash` naming instead of `delete`.
++
++Use `fullscreen` and `exit-fullscreen` naming.
++
++Do not add `expand`, `collapse`, or `delete` SVG names in this registry.
+diff --git a/tests/playwright/tools/ThemeV2SvgIconRegistry.spec.mjs b/tests/playwright/tools/ThemeV2SvgIconRegistry.spec.mjs
+new file mode 100644
+index 000000000..000000000
+@@ -0,0 +1,138 @@
++import { expect, test } from "@playwright/test";
++import fs from "node:fs/promises";
++import path from "node:path";
++import { fileURLToPath } from "node:url";
++import { startRepoServer } from "../../helpers/playwrightRepoServer.mjs";
++
++const __filename = fileURLToPath(import.meta.url);
++const __dirname = path.dirname(__filename);
++const repoRoot = path.resolve(__dirname, "..", "..", "..");
++const svgRoot = path.join(repoRoot, "assets", "theme-v2", "svg");
++const readmePath = path.join(svgRoot, "README.md");
++const styleGuidePath = path.join(repoRoot, "docs_build", "design", "theme-v2-icons", "theme-v2-icon-style-guide.md");
++
++const REQUIRED_SVG_FILES = [
++ "gfs-add.svg",
++ "gfs-chevron-down.svg",
++ "gfs-chevron-left.svg",
++ "gfs-chevron-right.svg",
++ "gfs-chevron-up.svg",
++ "gfs-close.svg",
++ "gfs-error.svg",
++ "gfs-exit-fullscreen.svg",
++ "gfs-fullscreen.svg",
++ "gfs-info.svg",
++ "gfs-menu.svg",
++ "gfs-search.svg",
++ "gfs-settings.svg",
++ "gfs-subtract.svg",
++ "gfs-success.svg",
++ "gfs-trash.svg",
++ "gfs-warning.svg",
++];
++
++const FORBIDDEN_SVG_FILES = [
++ "gfs-collapse.svg",
++ "gfs-delete.svg",
++ "gfs-expand.svg",
++];
++
++function attributeValues(content, attributeName) {
++ return [...content.matchAll(new RegExp(`\\s${attributeName}="([^"]+)"`, "g"))].map((match) => match[1]);
++}
+
-+Team: Charlie
++async function fileExists(filePath) {
++ try {
++ await fs.access(filePath);
++ return true;
++ } catch {
++ return false;
++ }
++}
+
-+Purpose: Add read-only runtime feature flags to Admin System Health.
++async function readSvg(fileName) {
++ return fs.readFile(path.join(svgRoot, fileName), "utf8");
++}
+
-+## Changes
++test("provides the required standalone Theme V2 SVG files", async () => {
++ const actualFiles = (await fs.readdir(svgRoot)).filter((name) => name.endsWith(".svg")).sort();
++ expect(actualFiles).toEqual(REQUIRED_SVG_FILES);
+
-+- Added server-owned `runtimeFeatureFlags` to the System Health status API.
-+- Added Runtime Feature Flags table to the System Health page.
-+- Reported completed System Health features as Enabled and placeholders as Not Configured.
-+- Updated API and Playwright tests.
++ for (const fileName of FORBIDDEN_SVG_FILES) {
++ await expect(fileExists(path.join(svgRoot, fileName))).resolves.toBe(false);
++ }
++});
+
-+## Validation
++test("validates every SVG as well-formed XML", async ({ page }) => {
++ for (const fileName of REQUIRED_SVG_FILES) {
++ const content = await readSvg(fileName);
++ const result = await page.evaluate((svgText) => {
++ const document = new DOMParser().parseFromString(svgText, "image/svg+xml");
++ const parserError = document.querySelector("parsererror");
++ const root = document.documentElement;
++ return {
++ error: parserError?.textContent?.replace(/\s+/g, " ").trim() || "",
++ rootName: root?.tagName || "",
++ };
++ }, content);
++ expect(result.error, fileName).toBe("");
++ expect(result.rootName.toLowerCase(), fileName).toBe("svg");
++ }
++});
+
-+- PASS: Targeted System Health API/unit tests.
-+- PASS: Targeted System Health Playwright tests.
-+- PASS: Syntax checks.
-+- PASS: `git diff --check`.
++test("validates required shared SVG attributes without inspecting artwork geometry", async () => {
++ for (const fileName of REQUIRED_SVG_FILES) {
++ const content = await readSvg(fileName);
++ const fillValues = attributeValues(content, "fill");
++ const strokeValues = attributeValues(content, "stroke");
++ const linecapValues = attributeValues(content, "stroke-linecap");
++ const linejoinValues = attributeValues(content, "stroke-linejoin");
++
++ expect(content, fileName).toContain("