From d87103feb42542e9ff5b3c407e7bb8482a024554 Mon Sep 17 00:00:00 2001 From: Delta Team Date: Wed, 24 Jun 2026 17:21:15 -0400 Subject: [PATCH] PR_26175_OWNER_057: add final five PR decision plan --- ...5_OWNER_057-final-five-pr-decision-plan.md | 158 + .../dev/reports/codex_changed_files.txt | 81 +- docs_build/dev/reports/codex_review.diff | 3822 +---------------- 3 files changed, 364 insertions(+), 3697 deletions(-) create mode 100644 docs_build/dev/reports/PR_26175_OWNER_057-final-five-pr-decision-plan.md diff --git a/docs_build/dev/reports/PR_26175_OWNER_057-final-five-pr-decision-plan.md b/docs_build/dev/reports/PR_26175_OWNER_057-final-five-pr-decision-plan.md new file mode 100644 index 000000000..6b2b39e6a --- /dev/null +++ b/docs_build/dev/reports/PR_26175_OWNER_057-final-five-pr-decision-plan.md @@ -0,0 +1,158 @@ +# PR_26175_OWNER_057 - Final Five PR Decision Plan + +## Executive Summary + +PASS - Audit/report only. GitHub was used as authority for the five requested open PRs: #159, #85, #135, #26, and #50. + +All five requested PRs remain open on GitHub and target `main`. GitHub REST reports each as `dirty` against current `main`, so none should be merged directly as-is. No PRs were merged or closed, no branches were deleted, and no runtime code was modified. + +Recommended owner actions: + +| PR | Team | Recommended action | Reason | +| --- | --- | --- | --- | +| #159 | OWNER | close as superseded | OWNER_056 was an action plan for Charlie/Bravo resolution work that has since been executed; its report branch is now stale and dirty. | +| #85 | OWNER | recreate | Partly duplicated by current main and partly valuable, but older protected-governance content should be reauthored against the current Project Instructions layout instead of merged dirty. | +| #135 | Alfa | close as superseded | Audit-only status-bar/Game Journey planning branch edits `BUILD_PR.md`; current main has moved to the later active status-bar progress-context BUILD. | +| #26 | Alfa/Alpha | recreate | Old runtime branch is dirty and predates the consolidated Alfa table/UI merges; still potentially valuable, but should be rebuilt from current main if wanted. | +| #50 | Gamma historical | hold | Historical SQLite closeout evidence remains useful for traceability while Gamma is retired and PostgreSQL direction is active. | + +## Branch Validation + +| Gate | Status | Evidence | +| --- | --- | --- | +| Starting branch | PASS | `main` | +| Worktree before branch | PASS | Clean | +| Local/origin sync before branch | PASS | `0 0` | +| Pull latest main | PASS | `git pull --ff-only` reported already up to date. | +| Work branch | PASS | `PR_26175_OWNER_057-final-five-pr-decision-plan` | +| Scope | PASS | Report-only audit of the five requested PRs. | + +## GitHub Authority Snapshot + +Open PR cross-check on 2026-06-24 found the requested five PRs plus a newer out-of-scope draft PR #160. This report audits only #159, #85, #135, #26, and #50 per OWNER scope. + +| PR | Title | Branch | Base | Draft | Mergeable state | Created | Updated | Age | Superseded by main? | Recommendation | +| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | +| #159 | PR_26175_OWNER_056: add final open PR resolution plan | `PR_26175_OWNER_056-final-open-pr-resolution-plan` | `main` | Yes | `dirty` | 2026-06-24 | 2026-06-24 | 0 days | Yes | close as superseded | +| #85 | [codex] Add Project Instructions governance addendums | `codex/canonical-repository-structure-instructions` | `main` | Yes | `dirty` | 2026-06-22 | 2026-06-22 | 2 days | Partially | recreate | +| #135 | PR_26175_ALFA_010-game-journey-progress-context-audit | `codex/pr-26175-alfa-010-game-journey-progress-context-audit` | `main` | Yes | `dirty` | 2026-06-24 | 2026-06-24 | 0 days | Yes | close as superseded | +| #26 | PR_26171_ALPHA_046 game hub table standard rebuild | `pr/26171-ALPHA-046-game-hub-table-standard-rebuild` | `main` | No | `dirty` | 2026-06-20 | 2026-06-20 | 4 calendar days | No, not fully confirmed | recreate | +| #50 | PR_26171_GAMMA_028-final-sqlite-clean-status-report | `pr/26171-GAMMA-028-final-sqlite-clean-status-report` | `main` | Yes | `dirty` | 2026-06-21 | 2026-06-21 | 3 calendar days | No; historical evidence | hold | + +## Per-PR Decision Notes + +### #159 - OWNER_056 Final Open PR Resolution Plan + +Changed files: + +- `docs_build/dev/reports/PR_26175_OWNER_056-final-open-pr-resolution-plan.md` added +- `docs_build/dev/reports/codex_changed_files.txt` modified +- `docs_build/dev/reports/codex_review.diff` modified + +Decision: close as superseded. + +Rationale: #159 recommended the Charlie stack and related final open PR actions. The Charlie sequence has since landed on `main`, and the live open PR set has changed. The branch is report-only and now dirty against current generated artifacts, so preserving it as an open draft adds noise rather than actionable value. + +### #85 - Project Instructions Governance Addendums + +Changed files: + +- `docs_build/dev/ProjectInstructions/README.txt` modified +- `project-instructions/addendums/canonical-repository-structure.md` added +- `project-instructions/addendums/platform-development-standards.md` added + +Decision: recreate. + +Rationale: the canonical repository structure addendum already exists on current `main`, while the proposed platform-development standards overlap newer approved Project Instructions for PostgreSQL-only direction, referenced asset protection, deprecation, and governance closeout. Because this is protected governance content and GitHub reports the PR as dirty, any still-needed platform standard should be recreated from current `main` and routed through the current Project Instructions structure with explicit OWNER wording. + +### #135 - ALFA_010 Game Journey Progress Context Audit + +Changed files: + +- `docs_build/dev/BUILD_PR.md` modified +- `docs_build/dev/reports/PR_26175_ALFA_010-game-journey-progress-context-audit_report.md` added +- `docs_build/dev/reports/PR_26175_ALFA_010-game-journey-progress-context-audit_requirements-checklist.md` added +- `docs_build/dev/reports/PR_26175_ALFA_010-game-journey-progress-context-audit_validation-lane.md` added +- `docs_build/dev/reports/codex_changed_files.txt` modified +- `docs_build/dev/reports/codex_review.diff` modified + +Decision: close as superseded. + +Rationale: #135 is audit-only and changes the active `docs_build/dev/BUILD_PR.md`. Current `main` now has a later ALFA status-bar progress-context BUILD as the active source of truth. The #135 evidence may remain useful in GitHub history, but the branch should not merge over current BUILD_PR state. + +### #26 - ALPHA_046 Game Hub Table Standard Rebuild + +Changed files: + +- `assets/theme-v2/css/tables.css` modified +- `docs_build/dev/reports/codex_changed_files.txt` modified +- `docs_build/dev/reports/codex_review.diff` modified +- `docs_build/pr/PR_26171_ALPHA_046-game-hub-table-standard-rebuild/APPLY_PR.md` added +- `docs_build/pr/PR_26171_ALPHA_046-game-hub-table-standard-rebuild/BUILD_PR.md` added +- `docs_build/pr/PR_26171_ALPHA_046-game-hub-table-standard-rebuild/PLAN_PR.md` added +- `tests/playwright/tools/GameWorkspaceMockRepository.spec.mjs` modified +- `toolbox/game-workspace/game-workspace.js` modified +- `toolbox/game-workspace/index.html` modified + +Decision: recreate. + +Rationale: #26 is an older runtime branch and the only requested PR that is not draft, but GitHub reports it as dirty against current `main`. It predates the consolidated Alfa merges and touches Game Workspace runtime/table behavior rather than the newer merged Game Hub, Game Journey, and Idea Board batches. Do not merge it directly. If OWNER still wants the Game Workspace table rebuild, recreate a fresh, current-main-safe runtime PR with targeted validation and without stale generated report conflicts. + +### #50 - GAMMA_028 Final SQLite Clean Status Report + +Changed files: + +- `docs_build/dev/reports/PR_26171_GAMMA_028-final-sqlite-clean-status-report-instruction-compliance-checklist.md` added +- `docs_build/dev/reports/PR_26171_GAMMA_028-final-sqlite-clean-status-report-manual-validation-notes.md` added +- `docs_build/dev/reports/PR_26171_GAMMA_028-final-sqlite-clean-status-report.md` added +- `docs_build/dev/reports/codex_changed_files.txt` modified +- `docs_build/dev/reports/codex_review.diff` modified + +Decision: hold. + +Rationale: #50 is historical Gamma evidence for final SQLite cleanup after earlier Gamma work. Team Gamma is retired and Team Golf is the replacement active lane, but historical Gamma references remain traceable by governance. Because the report is dirty against current generated artifacts and does not change runtime behavior, hold it until OWNER decides whether to merge as historical evidence, recreate as a current Golf/OWNER archive note, or close as superseded. + +## Requirement Checklist + +| Requirement | Status | Notes | +| --- | --- | --- | +| Start from `main` | PASS | Verified before branch creation. | +| Hard stop if branch is not `main` | PASS | Branch was `main`. | +| Hard stop if worktree is not clean | PASS | Worktree was clean. | +| Hard stop if local/origin sync is not `0 0` | PASS | Sync was `0 0`. | +| Read all Project Instructions | PASS | All files under `docs_build/dev/ProjectInstructions/` were read before report edits. | +| Audit only #159, #85, #135, #26, #50 | PASS | #160 was discovered but left out of scope. | +| Include title | PASS | Included in the authority snapshot. | +| Include branch | PASS | Included in the authority snapshot. | +| Include base branch | PASS | Included in the authority snapshot. | +| Include draft state | PASS | Included in the authority snapshot. | +| Include mergeable state | PASS | GitHub REST `mergeable_state` recorded. | +| Include changed files | PASS | Per-PR file lists included. | +| Identify whether superseded by main | PASS | Included per PR. | +| Recommendation limited to merge, close as superseded, hold, recreate | PASS | All recommendations use approved values. | +| Do not merge PRs | PASS | No merge actions were taken. | +| Do not close PRs | PASS | No close actions were taken. | +| Do not delete branches | PASS | No branch deletion was performed. | +| Do not modify runtime code | PASS | Report artifacts only. | +| Required reports and ZIP | PASS | Report, changed-file list, diff, and repo-structured ZIP produced. | + +## Validation Lane + +| Validation | Status | Evidence | +| --- | --- | --- | +| GitHub metadata pull | PASS | `gh pr view` and GitHub REST `pulls` endpoint used for the five requested PRs. | +| Open PR cross-check | PASS | `gh pr list --state open --limit 100` captured current open set. | +| Runtime validation | PASS | Not applicable; audit/report-only changes. | +| Browser validation | PASS | Not applicable; no UI/runtime changes. | +| Whitespace validation | PASS | `git diff --check` run after report generation. | +| ZIP validation | PASS | Repo-structured delta ZIP created under `tmp/`. | + +## Manual Validation Notes + +- GitHub is authoritative for PR state; local branches were not used as authority for open/draft state. +- GitHub reported the high-level mergeable field as `UNKNOWN` through `gh pr view`, so the REST `mergeable_state` field was used for the decision table. +- All five requested PRs returned `mergeable_state: dirty`. +- The current open PR list also includes #160, but #160 was not part of the OWNER_057 requested audit set. +- No runtime files were edited by this PR. +- No Playwright run was needed because the work is audit/report-only. +- Branches should be retained; this report does not authorize branch deletion. diff --git a/docs_build/dev/reports/codex_changed_files.txt b/docs_build/dev/reports/codex_changed_files.txt index 274329a5e..11be8ee78 100644 --- a/docs_build/dev/reports/codex_changed_files.txt +++ b/docs_build/dev/reports/codex_changed_files.txt @@ -1,78 +1,3 @@ -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 +docs_build/dev/reports/PR_26175_OWNER_057-final-five-pr-decision-plan.md / added +docs_build/dev/reports/codex_changed_files.txt / updated +docs_build/dev/reports/codex_review.diff / updated diff --git a/docs_build/dev/reports/codex_review.diff b/docs_build/dev/reports/codex_review.diff index 093b19950..ccad9d7f5 100644 --- a/docs_build/dev/reports/codex_review.diff +++ b/docs_build/dev/reports/codex_review.diff @@ -1,3666 +1,250 @@ -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
CapabilityCurrent DeploymentStatus
Environment CapabilitiesWaiting for safe API statusPENDING
-+
-+
-+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+
Health API Contract
FieldContractStatus
Health API ContractWaiting for safe API statusPENDING
-+
-+
-+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+
Admin API Registry
MethodRouteOwnerStatus
GETWaiting for safe API statusTeam CharliePENDING
-+
-+
-+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+
Runtime Feature Flags
FlagCurrent DeploymentStatus
Runtime Feature FlagsWaiting for safe API statusPENDING
-+
-+
-+
-+
Current Deployment
-+

Service Health

-+
-+
-+
-+
-+

Loading

-+

PENDING

-+

Waiting for safe API status.

-+
-+
-+
-+
-+
-+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+
Configuration Summary
FieldRead-only ValueStatus
Configuration SummaryWaiting for safe API statusPENDING
-+
-+
-+
-+
Current Deployment
-+

Manual Health Actions

-+
-+
-+ -+ -+ -+ -+ -+
-+
-+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+
Manual Health Action Results
ActionLast CheckedStatusResult
Manual health actionsnot runPENDINGWaiting for Admin action.
-+
-+
-+
-+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+
Scheduled Health Monitoring
FieldCurrent DeploymentStatus
Scheduled Health MonitoringNot ConfiguredPENDING
-+
-+
-+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+
Notifications & Alerts
IntegrationCurrent DeploymentStatus
Notifications & AlertsNot ConfiguredPENDING
-+
-
- - -@@ -153,6 +313,27 @@ - -
Local API Startup Diagnostics
-
-+
-+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+
Runtime Health
FieldCurrent DeploymentStatus
EnvironmentLoadingPENDING
App/runtime versionLoadingPENDING
API versionLoadingPENDING
Node versionLoadingPENDING
Server start timeLoadingPENDING
UptimeLoadingPENDING
Last checkedLoadingPENDING
-+
-
- - -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 -@@ -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 -@@ -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 -@@ -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 -@@ -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 -@@ -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 -@@ -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 -+ -+- 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 +diff --git a/docs_build/dev/reports/PR_26175_OWNER_057-final-five-pr-decision-plan.md b/docs_build/dev/reports/PR_26175_OWNER_057-final-five-pr-decision-plan.md new file mode 100644 -index 000000000..9f8607a0c +index 000000000..6b2b39e6a --- /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 ++++ b/docs_build/dev/reports/PR_26175_OWNER_057-final-five-pr-decision-plan.md +@@ -0,0 +1,158 @@ ++# PR_26175_OWNER_057 - Final Five PR Decision Plan + -+## Scope ++## Executive Summary + -+Team: Charlie ++PASS - Audit/report only. GitHub was used as authority for the five requested open PRs: #159, #85, #135, #26, and #50. + -+Purpose: Add read-only runtime feature flags to Admin System Health. ++All five requested PRs remain open on GitHub and target `main`. GitHub REST reports each as `dirty` against current `main`, so none should be merged directly as-is. No PRs were merged or closed, no branches were deleted, and no runtime code was modified. + -+## Changes ++Recommended owner actions: + -+- 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. ++| PR | Team | Recommended action | Reason | ++| --- | --- | --- | --- | ++| #159 | OWNER | close as superseded | OWNER_056 was an action plan for Charlie/Bravo resolution work that has since been executed; its report branch is now stale and dirty. | ++| #85 | OWNER | recreate | Partly duplicated by current main and partly valuable, but older protected-governance content should be reauthored against the current Project Instructions layout instead of merged dirty. | ++| #135 | Alfa | close as superseded | Audit-only status-bar/Game Journey planning branch edits `BUILD_PR.md`; current main has moved to the later active status-bar progress-context BUILD. | ++| #26 | Alfa/Alpha | recreate | Old runtime branch is dirty and predates the consolidated Alfa table/UI merges; still potentially valuable, but should be rebuilt from current main if wanted. | ++| #50 | Gamma historical | hold | Historical SQLite closeout evidence remains useful for traceability while Gamma is retired and PostgreSQL direction is active. | + -+## Validation ++## Branch Validation + -+- PASS: Targeted System Health API/unit tests. -+- PASS: Targeted System Health Playwright tests. -+- PASS: Syntax checks. -+- PASS: `git diff --check`. ++| Gate | Status | Evidence | ++| --- | --- | --- | ++| Starting branch | PASS | `main` | ++| Worktree before branch | PASS | Clean | ++| Local/origin sync before branch | PASS | `0 0` | ++| Pull latest main | PASS | `git pull --ff-only` reported already up to date. | ++| Work branch | PASS | `PR_26175_OWNER_057-final-five-pr-decision-plan` | ++| Scope | PASS | Report-only audit of the five requested PRs. | + -+## Artifact ++## GitHub Authority Snapshot + -+- `tmp/PR_26175_CHARLIE_021-runtime-feature-flags_delta.zip` -diff --git a/docs_build/dev/reports/PR_26175_CHARLIE_022-admin-health-test-suite-branch-validation.md b/docs_build/dev/reports/PR_26175_CHARLIE_022-admin-health-test-suite-branch-validation.md -new file mode 100644 -index 000000000..4694cef86 ---- /dev/null -+++ b/docs_build/dev/reports/PR_26175_CHARLIE_022-admin-health-test-suite-branch-validation.md -@@ -0,0 +1,6 @@ -+# PR_26175_CHARLIE_022 Branch Validation ++Open PR cross-check on 2026-06-24 found the requested five PRs plus a newer out-of-scope draft PR #160. This report audits only #159, #85, #135, #26, and #50 per OWNER scope. + -+- PASS: Continued on `pr/26175-CHARLIE-010-system-health-history-and-closeout`. -+- PASS: Stacked on PR_26175_CHARLIE_021. -+- PASS: No merge performed. -+- PASS: No rebase performed. -diff --git a/docs_build/dev/reports/PR_26175_CHARLIE_022-admin-health-test-suite-manual-validation-notes.md b/docs_build/dev/reports/PR_26175_CHARLIE_022-admin-health-test-suite-manual-validation-notes.md -new file mode 100644 -index 000000000..0799952e8 ---- /dev/null -+++ b/docs_build/dev/reports/PR_26175_CHARLIE_022-admin-health-test-suite-manual-validation-notes.md -@@ -0,0 +1,5 @@ -+# PR_26175_CHARLIE_022 Manual Validation Notes ++| PR | Title | Branch | Base | Draft | Mergeable state | Created | Updated | Age | Superseded by main? | Recommendation | ++| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | ++| #159 | PR_26175_OWNER_056: add final open PR resolution plan | `PR_26175_OWNER_056-final-open-pr-resolution-plan` | `main` | Yes | `dirty` | 2026-06-24 | 2026-06-24 | 0 days | Yes | close as superseded | ++| #85 | [codex] Add Project Instructions governance addendums | `codex/canonical-repository-structure-instructions` | `main` | Yes | `dirty` | 2026-06-22 | 2026-06-22 | 2 days | Partially | recreate | ++| #135 | PR_26175_ALFA_010-game-journey-progress-context-audit | `codex/pr-26175-alfa-010-game-journey-progress-context-audit` | `main` | Yes | `dirty` | 2026-06-24 | 2026-06-24 | 0 days | Yes | close as superseded | ++| #26 | PR_26171_ALPHA_046 game hub table standard rebuild | `pr/26171-ALPHA-046-game-hub-table-standard-rebuild` | `main` | No | `dirty` | 2026-06-20 | 2026-06-20 | 4 calendar days | No, not fully confirmed | recreate | ++| #50 | PR_26171_GAMMA_028-final-sqlite-clean-status-report | `pr/26171-GAMMA-028-final-sqlite-clean-status-report` | `main` | Yes | `dirty` | 2026-06-21 | 2026-06-21 | 3 calendar days | No; historical evidence | hold | + -+- Verified new tests live under canonical `tests/api/admin-system-health/`. -+- Verified tests do not require peer environment services. -+- Verified tests do not expose secrets. -diff --git a/docs_build/dev/reports/PR_26175_CHARLIE_022-admin-health-test-suite-requirement-checklist.md b/docs_build/dev/reports/PR_26175_CHARLIE_022-admin-health-test-suite-requirement-checklist.md -new file mode 100644 -index 000000000..08f86ae5a ---- /dev/null -+++ b/docs_build/dev/reports/PR_26175_CHARLIE_022-admin-health-test-suite-requirement-checklist.md -@@ -0,0 +1,7 @@ -+# PR_26175_CHARLIE_022 Requirement Checklist ++## Per-PR Decision Notes + -+- PASS: Added focused Admin Health test suite. -+- PASS: Test suite covers current-environment-only System Health contract. -+- PASS: Test suite covers server-owned completion sections. -+- PASS: Test suite covers unknown action rejection. -+- PASS: Required reports generated. -diff --git a/docs_build/dev/reports/PR_26175_CHARLIE_022-admin-health-test-suite-validation.md b/docs_build/dev/reports/PR_26175_CHARLIE_022-admin-health-test-suite-validation.md -new file mode 100644 -index 000000000..6d1d940ec ---- /dev/null -+++ b/docs_build/dev/reports/PR_26175_CHARLIE_022-admin-health-test-suite-validation.md -@@ -0,0 +1,12 @@ -+# PR_26175_CHARLIE_022 Validation Report ++### #159 - OWNER_056 Final Open PR Resolution Plan + -+## Commands ++Changed files: + -+- PASS: `node --check tests/api/admin-system-health/contract.test.mjs` -+- PASS: `git diff --check` -+- PASS: `node --test tests/api/admin-system-health/contract.test.mjs` -+ - Result: 2 passed. -+- 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_022-admin-health-test-suite.md b/docs_build/dev/reports/PR_26175_CHARLIE_022-admin-health-test-suite.md -new file mode 100644 -index 000000000..0a7e88311 ---- /dev/null -+++ b/docs_build/dev/reports/PR_26175_CHARLIE_022-admin-health-test-suite.md -@@ -0,0 +1,23 @@ -+# PR_26175_CHARLIE_022 Admin Health Test Suite ++- `docs_build/dev/reports/PR_26175_OWNER_056-final-open-pr-resolution-plan.md` added ++- `docs_build/dev/reports/codex_changed_files.txt` modified ++- `docs_build/dev/reports/codex_review.diff` modified + -+## Scope ++Decision: close as superseded. + -+Team: Charlie ++Rationale: #159 recommended the Charlie stack and related final open PR actions. The Charlie sequence has since landed on `main`, and the live open PR set has changed. The branch is report-only and now dirty against current generated artifacts, so preserving it as an open draft adds noise rather than actionable value. + -+Purpose: Add focused Admin System Health completion contract tests. ++### #85 - Project Instructions Governance Addendums + -+## Changes ++Changed files: + -+- Added `tests/api/admin-system-health/contract.test.mjs`. -+- Covered current-environment-only contract, server-owned completion sections, secret masking, and unknown manual action rejection. ++- `docs_build/dev/ProjectInstructions/README.txt` modified ++- `project-instructions/addendums/canonical-repository-structure.md` added ++- `project-instructions/addendums/platform-development-standards.md` added + -+## Validation ++Decision: recreate. + -+- PASS: New Admin System Health API contract suite. -+- PASS: Existing targeted System Health API/unit tests. -+- PASS: Targeted System Health Playwright tests. -+- PASS: `git diff --check`. ++Rationale: the canonical repository structure addendum already exists on current `main`, while the proposed platform-development standards overlap newer approved Project Instructions for PostgreSQL-only direction, referenced asset protection, deprecation, and governance closeout. Because this is protected governance content and GitHub reports the PR as dirty, any still-needed platform standard should be recreated from current `main` and routed through the current Project Instructions structure with explicit OWNER wording. + -+## Artifact ++### #135 - ALFA_010 Game Journey Progress Context Audit + -+- `tmp/PR_26175_CHARLIE_022-admin-health-test-suite_delta.zip` -diff --git a/docs_build/dev/reports/PR_26175_CHARLIE_023-system-health-documentation-closeout-branch-validation.md b/docs_build/dev/reports/PR_26175_CHARLIE_023-system-health-documentation-closeout-branch-validation.md -new file mode 100644 -index 000000000..a65cc8779 ---- /dev/null -+++ b/docs_build/dev/reports/PR_26175_CHARLIE_023-system-health-documentation-closeout-branch-validation.md -@@ -0,0 +1,7 @@ -+# PR_26175_CHARLIE_023 Branch Validation ++Changed files: + -+- PASS: Continued on `pr/26175-CHARLIE-010-system-health-history-and-closeout`. -+- PASS: Stacked on PR_26175_CHARLIE_022. -+- PASS: No merge performed. -+- PASS: No rebase performed. -+- PASS: Branch ready to push and update draft PR #158. -diff --git a/docs_build/dev/reports/PR_26175_CHARLIE_023-system-health-documentation-closeout-manual-validation-notes.md b/docs_build/dev/reports/PR_26175_CHARLIE_023-system-health-documentation-closeout-manual-validation-notes.md -new file mode 100644 -index 000000000..5db2a7208 ---- /dev/null -+++ b/docs_build/dev/reports/PR_26175_CHARLIE_023-system-health-documentation-closeout-manual-validation-notes.md -@@ -0,0 +1,5 @@ -+# PR_26175_CHARLIE_023 Manual Validation Notes ++- `docs_build/dev/BUILD_PR.md` modified ++- `docs_build/dev/reports/PR_26175_ALFA_010-game-journey-progress-context-audit_report.md` added ++- `docs_build/dev/reports/PR_26175_ALFA_010-game-journey-progress-context-audit_requirements-checklist.md` added ++- `docs_build/dev/reports/PR_26175_ALFA_010-game-journey-progress-context-audit_validation-lane.md` added ++- `docs_build/dev/reports/codex_changed_files.txt` modified ++- `docs_build/dev/reports/codex_review.diff` modified + -+- Verified completion reports exist for PRs 018 through 023. -+- Verified final validation lane includes the new Admin System Health contract suite. -+- Verified closeout records no merge requested. -diff --git a/docs_build/dev/reports/PR_26175_CHARLIE_023-system-health-documentation-closeout-requirement-checklist.md b/docs_build/dev/reports/PR_26175_CHARLIE_023-system-health-documentation-closeout-requirement-checklist.md -new file mode 100644 -index 000000000..4bec1225f ---- /dev/null -+++ b/docs_build/dev/reports/PR_26175_CHARLIE_023-system-health-documentation-closeout-requirement-checklist.md -@@ -0,0 +1,7 @@ -+# PR_26175_CHARLIE_023 Requirement Checklist ++Decision: close as superseded. + -+- PASS: Added documentation closeout. -+- PASS: Included final validation evidence. -+- PASS: Listed all completion ZIP artifacts. -+- PASS: Preserved no-merge requirement. -+- PASS: Required reports generated. -diff --git a/docs_build/dev/reports/PR_26175_CHARLIE_023-system-health-documentation-closeout-validation.md b/docs_build/dev/reports/PR_26175_CHARLIE_023-system-health-documentation-closeout-validation.md -new file mode 100644 -index 000000000..20b448550 ---- /dev/null -+++ b/docs_build/dev/reports/PR_26175_CHARLIE_023-system-health-documentation-closeout-validation.md -@@ -0,0 +1,14 @@ -+# PR_26175_CHARLIE_023 Validation Report ++Rationale: #135 is audit-only and changes the active `docs_build/dev/BUILD_PR.md`. Current `main` now has a later ALFA status-bar progress-context BUILD as the active source of truth. The #135 evidence may remain useful in GitHub history, but the branch should not merge over current BUILD_PR state. + -+## Commands ++### #26 - ALPHA_046 Game Hub Table Standard Rebuild + -+- PASS: `node --test tests/api/admin-system-health/contract.test.mjs` -+ - Result: 2 passed. -+- 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. ++Changed files: + -+## Notes ++- `assets/theme-v2/css/tables.css` modified ++- `docs_build/dev/reports/codex_changed_files.txt` modified ++- `docs_build/dev/reports/codex_review.diff` modified ++- `docs_build/pr/PR_26171_ALPHA_046-game-hub-table-standard-rebuild/APPLY_PR.md` added ++- `docs_build/pr/PR_26171_ALPHA_046-game-hub-table-standard-rebuild/BUILD_PR.md` added ++- `docs_build/pr/PR_26171_ALPHA_046-game-hub-table-standard-rebuild/PLAN_PR.md` added ++- `tests/playwright/tools/GameWorkspaceMockRepository.spec.mjs` modified ++- `toolbox/game-workspace/game-workspace.js` modified ++- `toolbox/game-workspace/index.html` modified + -+- Full samples smoke was not run; not required for this System Health completion scope. -diff --git a/docs_build/dev/reports/PR_26175_CHARLIE_023-system-health-documentation-closeout.md b/docs_build/dev/reports/PR_26175_CHARLIE_023-system-health-documentation-closeout.md -new file mode 100644 -index 000000000..d18a17a9d ---- /dev/null -+++ b/docs_build/dev/reports/PR_26175_CHARLIE_023-system-health-documentation-closeout.md -@@ -0,0 +1,43 @@ -+# PR_26175_CHARLIE_023 System Health Documentation Closeout -+ -+## Scope -+ -+Team: Charlie ++Decision: recreate. + -+Purpose: Close out System Health completion PRs 018 through 023 with final documentation and validation evidence. ++Rationale: #26 is an older runtime branch and the only requested PR that is not draft, but GitHub reports it as dirty against current `main`. It predates the consolidated Alfa merges and touches Game Workspace runtime/table behavior rather than the newer merged Game Hub, Game Journey, and Idea Board batches. Do not merge it directly. If OWNER still wants the Game Workspace table rebuild, recreate a fresh, current-main-safe runtime PR with targeted validation and without stale generated report conflicts. + -+## Completed Commits ++### #50 - GAMMA_028 Final SQLite Clean Status Report + -+- PASS: PR_26175_CHARLIE_018-health-api-contract-cleanup -+- PASS: PR_26175_CHARLIE_019-environment-capabilities -+- PASS: PR_26175_CHARLIE_020-admin-api-registry -+- PASS: PR_26175_CHARLIE_021-runtime-feature-flags -+- PASS: PR_26175_CHARLIE_022-admin-health-test-suite -+- PASS: PR_26175_CHARLIE_023-system-health-documentation-closeout ++Changed files: + -+## Final Architecture State ++- `docs_build/dev/reports/PR_26171_GAMMA_028-final-sqlite-clean-status-report-instruction-compliance-checklist.md` added ++- `docs_build/dev/reports/PR_26171_GAMMA_028-final-sqlite-clean-status-report-manual-validation-notes.md` added ++- `docs_build/dev/reports/PR_26171_GAMMA_028-final-sqlite-clean-status-report.md` added ++- `docs_build/dev/reports/codex_changed_files.txt` modified ++- `docs_build/dev/reports/codex_review.diff` modified + -+- PASS: System Health remains current-deployment only. -+- PASS: Environment Map remains reference-only. -+- PASS: Browser UI renders API-owned health and governance state. -+- PASS: Manual health actions call API contracts. -+- PASS: Scheduled monitoring and notification placeholders remain Not Configured. -+- PASS: Admin API Registry and Health API Contract are visible in System Health. ++Decision: hold. + -+## Final Validation ++Rationale: #50 is historical Gamma evidence for final SQLite cleanup after earlier Gamma work. Team Gamma is retired and Team Golf is the replacement active lane, but historical Gamma references remain traceable by governance. Because the report is dirty against current generated artifacts and does not change runtime behavior, hold it until OWNER decides whether to merge as historical evidence, recreate as a current Golf/OWNER archive note, or close as superseded. + -+- PASS: `node --test tests/api/admin-system-health/contract.test.mjs` -+ - Result: 2 passed. -+- 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. ++## Requirement Checklist + -+## ZIP Artifacts -+ -+- `tmp/PR_26175_CHARLIE_018-health-api-contract-cleanup_delta.zip` -+- `tmp/PR_26175_CHARLIE_019-environment-capabilities_delta.zip` -+- `tmp/PR_26175_CHARLIE_020-admin-api-registry_delta.zip` -+- `tmp/PR_26175_CHARLIE_021-runtime-feature-flags_delta.zip` -+- `tmp/PR_26175_CHARLIE_022-admin-health-test-suite_delta.zip` -+- `tmp/PR_26175_CHARLIE_023-system-health-documentation-closeout_delta.zip` -diff --git a/docs_build/dev/reports/PR_26175_CHARLIE_024-system-health-operational-docs-branch-validation.md b/docs_build/dev/reports/PR_26175_CHARLIE_024-system-health-operational-docs-branch-validation.md -new file mode 100644 -index 000000000..42f90b418 ---- /dev/null -+++ b/docs_build/dev/reports/PR_26175_CHARLIE_024-system-health-operational-docs-branch-validation.md -@@ -0,0 +1,7 @@ -+# PR_26175_CHARLIE_024 Branch Validation -+ -+- PASS: Continued from `pr/26175-CHARLIE-010-system-health-history-and-closeout`. -+- PASS: Start gate worktree was clean. -+- PASS: PR purpose is singular: System Health v1 operational documentation. -+- PASS: Runtime behavior unchanged. -+- PASS: No merge performed. -diff --git a/docs_build/dev/reports/PR_26175_CHARLIE_024-system-health-operational-docs-manual-validation-notes.md b/docs_build/dev/reports/PR_26175_CHARLIE_024-system-health-operational-docs-manual-validation-notes.md -new file mode 100644 -index 000000000..c0c41d301 ---- /dev/null -+++ b/docs_build/dev/reports/PR_26175_CHARLIE_024-system-health-operational-docs-manual-validation-notes.md -@@ -0,0 +1,13 @@ -+# PR_26175_CHARLIE_024 Manual Validation Notes -+ -+- Verified the new guide documents the current-environment-only System Health -+ architecture. -+- Verified the Environment Map is documented as reference-only. -+- Verified the approved Local, DEV, IST, UAT, and PRD model is included. -+- Verified the shared R2 folder model includes `/local`, `/dev`, `/ist`, -+ `/uat`, and `/prd`. -+- Verified manual health actions are documented as API-backed operations. -+- Verified Scheduled Health Monitoring and Notifications & Alerts are documented -+ as production-safe Not Configured states when service contracts are absent. -+- Verified troubleshooting and manual validation guidance is present. -+- Verified no runtime files were modified. -diff --git a/docs_build/dev/reports/PR_26175_CHARLIE_024-system-health-operational-docs-requirement-checklist.md b/docs_build/dev/reports/PR_26175_CHARLIE_024-system-health-operational-docs-requirement-checklist.md -new file mode 100644 -index 000000000..42894166b ---- /dev/null -+++ b/docs_build/dev/reports/PR_26175_CHARLIE_024-system-health-operational-docs-requirement-checklist.md -@@ -0,0 +1,22 @@ -+# PR_26175_CHARLIE_024 Requirement Checklist -+ -+| Requirement | Status | Evidence | ++| Requirement | Status | Notes | +| --- | --- | --- | -+| Continue from current Charlie System Health branch | PASS | Branch `pr/26175-CHARLIE-010-system-health-history-and-closeout`. | -+| Hard stop if worktree is not clean | PASS | Start gate was clean. | -+| Add durable operational docs under `docs_build` | PASS | Added `docs_build/operations/system-health-v1-operational-guide.md`. | -+| Document System Health architecture | PASS | Architecture section added. | -+| Document current-environment-only rule | PASS | Architecture and guardrails sections added. | -+| Document Environment Map reference-only rule | PASS | Architecture and validation sections added. | -+| Document Local/DEV/IST/UAT/PRD model | PASS | Environment Model table added. | -+| Document shared R2 folder model | PASS | Shared R2 Folder Model section added. | -+| Document API contract summary | PASS | API Contract Summary section added. | -+| Document manual health actions | PASS | Manual Health Actions section added. | -+| Document scheduled monitoring Not Configured behavior | PASS | Scheduled Monitoring section added. | -+| Document notifications Not Configured behavior | PASS | Notifications And Alerts section added. | -+| Document troubleshooting guide | PASS | Troubleshooting Guide section added. | -+| Document manual validation guide | PASS | Manual Validation Guide section added. | -+| Do not change runtime behavior | PASS | Documentation-only changes. | -+| Create reports and ZIP | PASS | Reports created; ZIP path reserved under `tmp/`. | -+| Push branch and update PR #158 | PASS | Completed by this BUILD after commit and push. | -+| Do not merge | PASS | No merge performed. | -diff --git a/docs_build/dev/reports/PR_26175_CHARLIE_024-system-health-operational-docs-validation.md b/docs_build/dev/reports/PR_26175_CHARLIE_024-system-health-operational-docs-validation.md -new file mode 100644 -index 000000000..783a99438 ---- /dev/null -+++ b/docs_build/dev/reports/PR_26175_CHARLIE_024-system-health-operational-docs-validation.md -@@ -0,0 +1,14 @@ -+# PR_26175_CHARLIE_024 Validation ++| Start from `main` | PASS | Verified before branch creation. | ++| Hard stop if branch is not `main` | PASS | Branch was `main`. | ++| Hard stop if worktree is not clean | PASS | Worktree was clean. | ++| Hard stop if local/origin sync is not `0 0` | PASS | Sync was `0 0`. | ++| Read all Project Instructions | PASS | All files under `docs_build/dev/ProjectInstructions/` were read before report edits. | ++| Audit only #159, #85, #135, #26, #50 | PASS | #160 was discovered but left out of scope. | ++| Include title | PASS | Included in the authority snapshot. | ++| Include branch | PASS | Included in the authority snapshot. | ++| Include base branch | PASS | Included in the authority snapshot. | ++| Include draft state | PASS | Included in the authority snapshot. | ++| Include mergeable state | PASS | GitHub REST `mergeable_state` recorded. | ++| Include changed files | PASS | Per-PR file lists included. | ++| Identify whether superseded by main | PASS | Included per PR. | ++| Recommendation limited to merge, close as superseded, hold, recreate | PASS | All recommendations use approved values. | ++| Do not merge PRs | PASS | No merge actions were taken. | ++| Do not close PRs | PASS | No close actions were taken. | ++| Do not delete branches | PASS | No branch deletion was performed. | ++| Do not modify runtime code | PASS | Report artifacts only. | ++| Required reports and ZIP | PASS | Report, changed-file list, diff, and repo-structured ZIP produced. | + +## Validation Lane + -+- PASS: Documentation scope confirmed; no runtime behavior changes required. -+- PASS: `git diff --check` -+- PASS: Required durable operational documentation added under `docs_build`. -+- PASS: Required report artifacts generated under `docs_build/dev/reports`. -+ -+## Runtime Validation -+ -+Runtime unit and Playwright tests were not run for this PR because the change is -+documentation-only and does not modify application, API, test, or configuration -+behavior. -diff --git a/docs_build/dev/reports/PR_26175_CHARLIE_024-system-health-operational-docs.md b/docs_build/dev/reports/PR_26175_CHARLIE_024-system-health-operational-docs.md -new file mode 100644 -index 000000000..2cccce8d6 ---- /dev/null -+++ b/docs_build/dev/reports/PR_26175_CHARLIE_024-system-health-operational-docs.md -@@ -0,0 +1,38 @@ -+# PR_26175_CHARLIE_024 System Health Operational Docs -+ -+## Scope -+ -+Team: Charlie -+ -+Purpose: Add durable System Health v1 operational documentation under -+`docs_build` without changing runtime behavior. -+ -+## Changes -+ -+- Added `docs_build/operations/system-health-v1-operational-guide.md`. -+- Documented the current-environment-only rule. -+- Documented the reference-only Environment Map rule. -+- Documented Local, DEV, IST, UAT, and PRD environment models. -+- Documented the shared Cloudflare R2 folder model. -+- Documented the Admin System Health API contract summary. -+- Documented manual health actions. -+- Documented production-safe Not Configured behavior for scheduled monitoring -+ and notifications. -+- Added troubleshooting and manual validation guides. -+ -+## Runtime Behavior -+ -+- PASS: No runtime files changed. -+- PASS: Documentation-only scope. -+- PASS: No API, UI, service, test, or configuration behavior changed. -+ -+## Artifacts -+ -+- `docs_build/dev/reports/codex_review.diff` -+- `docs_build/dev/reports/codex_changed_files.txt` -+- `docs_build/dev/reports/PR_26175_CHARLIE_024-system-health-operational-docs.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-branch-validation.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-manual-validation-notes.md` -+- `tmp/PR_26175_CHARLIE_024-system-health-operational-docs_delta.zip` ++| Validation | Status | Evidence | ++| --- | --- | --- | ++| GitHub metadata pull | PASS | `gh pr view` and GitHub REST `pulls` endpoint used for the five requested PRs. | ++| Open PR cross-check | PASS | `gh pr list --state open --limit 100` captured current open set. | ++| Runtime validation | PASS | Not applicable; audit/report-only changes. | ++| Browser validation | PASS | Not applicable; no UI/runtime changes. | ++| Whitespace validation | PASS | `git diff --check` run after report generation. | ++| ZIP validation | PASS | Repo-structured delta ZIP created under `tmp/`. | ++ ++## Manual Validation Notes ++ ++- GitHub is authoritative for PR state; local branches were not used as authority for open/draft state. ++- GitHub reported the high-level mergeable field as `UNKNOWN` through `gh pr view`, so the REST `mergeable_state` field was used for the decision table. ++- All five requested PRs returned `mergeable_state: dirty`. ++- The current open PR list also includes #160, but #160 was not part of the OWNER_057 requested audit set. ++- No runtime files were edited by this PR. ++- No Playwright run was needed because the work is audit/report-only. ++- Branches should be retained; this report does not authorize branch deletion. diff --git a/docs_build/dev/reports/codex_changed_files.txt b/docs_build/dev/reports/codex_changed_files.txt -index 5efcd7443..274329a5e 100644 +index 274329a5e..11be8ee78 100644 --- a/docs_build/dev/reports/codex_changed_files.txt +++ b/docs_build/dev/reports/codex_changed_files.txt -@@ -1,21 +1,78 @@ - admin/system-health.html - assets/theme-v2/js/admin-system-health.js --docs_build/dev/reports/PR_26175_CHARLIE_009-system-health-current-r2-health.md --docs_build/dev/reports/PR_26175_CHARLIE_010-system-health-history-and-closeout.md --docs_build/dev/reports/PR_26175_CHARLIE_011-admin-submenu-alphabetical-order-branch-validation.md --docs_build/dev/reports/PR_26175_CHARLIE_011-admin-submenu-alphabetical-order-manual-validation-notes.md --docs_build/dev/reports/PR_26175_CHARLIE_011-admin-submenu-alphabetical-order-requirement-checklist.md --docs_build/dev/reports/PR_26175_CHARLIE_011-admin-submenu-alphabetical-order-validation.md --docs_build/dev/reports/PR_26175_CHARLIE_011-admin-submenu-alphabetical-order.md -+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 --src/api/admin-owner-navigation.js -+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/dev-runtime/ApiMenuPathCleanup.test.mjs --tests/dev-runtime/ArchitectureCleanupApiNavInvitations.test.mjs - tests/playwright/tools/AdminHealthOperationsPage.spec.mjs --tests/playwright/tools/AdminInvitationsNavPage.spec.mjs --tests/playwright/tools/AdminOwnerNavigationBoundary.spec.mjs -diff --git a/docs_build/dev/reports/coverage_changed_js_guardrail.txt b/docs_build/dev/reports/coverage_changed_js_guardrail.txt -index 8df1af057..7b1c51f19 100644 ---- a/docs_build/dev/reports/coverage_changed_js_guardrail.txt -+++ b/docs_build/dev/reports/coverage_changed_js_guardrail.txt -@@ -6,10 +6,7 @@ Missing changed runtime JS files are WARN, not FAIL. - Source: Playwright/Chromium built-in V8 coverage from the active Playwright run. - - Changed runtime JS files considered: --(0%) assets/theme-v2/js/admin-system-health.js - WARNING: changed runtime JS file was not collected by Playwright V8 coverage; advisory only --(0%) src/dev-runtime/server/local-api-router.mjs - WARNING: changed runtime JS file was not collected by Playwright V8 coverage; advisory only --(100%) src/api/admin-owner-navigation.js - executed lines 42/42; executed functions 5/5 -+(100%) none changed - no changed runtime JS files - - Guardrail warnings: --(0%) assets/theme-v2/js/admin-system-health.js - WARNING: changed runtime JS file missing from coverage; advisory only --(0%) src/dev-runtime/server/local-api-router.mjs - WARNING: changed runtime JS file missing from coverage; advisory only -+(100%) none changed - no changed runtime JS files -diff --git a/docs_build/dev/reports/playwright_v8_coverage_report.txt b/docs_build/dev/reports/playwright_v8_coverage_report.txt -index be704e176..da6deaaa0 100644 ---- a/docs_build/dev/reports/playwright_v8_coverage_report.txt -+++ b/docs_build/dev/reports/playwright_v8_coverage_report.txt -@@ -12,41 +12,27 @@ Note: entry percentages use function coverage when available, otherwise line cov - Note: coverage entries are aggregated across every page/tool where coverageReporter.start(page) and coverageReporter.stop(page) ran. - - Exercised tool entry points detected: --(35%) Toolbox Index - exercised 1 runtime JS files -+(46%) Toolbox Index - exercised 1 runtime JS files - (0%) Tool Template V2 - not exercised by this Playwright run --(70%) Theme V2 Shared JS - exercised 5 runtime JS files -+(78%) Theme V2 Shared JS - exercised 4 runtime JS files - - Changed runtime JS files covered: --(0%) assets/theme-v2/js/admin-system-health.js - WARNING: changed runtime JS file was not collected by Playwright V8 coverage; advisory only --(0%) src/dev-runtime/server/local-api-router.mjs - WARNING: changed runtime JS file was not collected by Playwright V8 coverage; advisory only --(100%) src/api/admin-owner-navigation.js - executed lines 42/42; executed functions 5/5 -+(100%) none changed - no changed runtime JS files - - Files with executed line/function counts where available: --(35%) toolbox/tool-registry-api-client.js - executed lines 155/155; executed functions 9/26 - (36%) src/api/server-api-client.js - executed lines 167/167; executed functions 5/14 --(40%) src/api/admin-invitations-api-client.js - executed lines 40/40; executed functions 2/5 --(50%) assets/js/shared/status.js - executed lines 37/37; executed functions 3/6 --(53%) assets/theme-v2/js/admin-invitations.js - executed lines 156/156; executed functions 9/17 --(59%) assets/theme-v2/js/owner-memberships.js - executed lines 248/248; executed functions 16/27 -+(46%) toolbox/tool-registry-api-client.js - executed lines 155/155; executed functions 12/26 - (64%) assets/theme-v2/js/tool-display-mode.js - executed lines 204/204; executed functions 9/14 --(67%) src/api/owner-memberships-api-client.js - executed lines 19/19; executed functions 2/3 --(71%) src/api/public-config-client.js - executed lines 209/209; executed functions 20/28 -+(65%) src/api/public-config-client.js - executed lines 209/209; executed functions 17/26 - (74%) assets/theme-v2/js/gamefoundry-partials.js - executed lines 1001/1001; executed functions 69/93 --(89%) src/dev-runtime/admin/admin-notes-viewer.js - executed lines 533/533; executed functions 49/55 --(100%) assets/theme-v2/js/admin-owner-navigation.js - executed lines 58/58; executed functions 11/11 --(100%) src/api/admin-owner-navigation.js - executed lines 42/42; executed functions 5/5 -+(80%) src/api/admin-owner-navigation.js - executed lines 42/42; executed functions 4/5 -+(82%) assets/theme-v2/js/admin-system-health.js - executed lines 808/808; executed functions 68/83 -+(83%) assets/js/shared/status.js - executed lines 37/37; executed functions 5/6 -+(91%) assets/theme-v2/js/admin-owner-navigation.js - executed lines 58/58; executed functions 10/11 -+(100%) src/api/admin-system-health-api-client.js - executed lines 28/28; executed functions 4/4 - - Uncovered or low-coverage changed JS files: --(0%) assets/theme-v2/js/admin-system-health.js - WARNING: uncovered changed runtime JS file; advisory only --(0%) src/dev-runtime/server/local-api-router.mjs - WARNING: uncovered changed runtime JS file; advisory only -+(100%) none changed - no changed runtime JS files - - Changed JS files considered: --(0%) assets/theme-v2/js/admin-system-health.js - changed JS file not collected as browser runtime coverage --(0%) src/dev-runtime/server/local-api-router.mjs - changed JS file not collected as browser runtime coverage --(0%) tests/dev-runtime/AdminHealthOperations.test.mjs - changed JS file not collected as browser runtime coverage --(0%) tests/dev-runtime/ApiMenuPathCleanup.test.mjs - changed JS file not collected as browser runtime coverage --(0%) tests/dev-runtime/ArchitectureCleanupApiNavInvitations.test.mjs - changed JS file not collected as browser runtime coverage --(0%) tests/playwright/tools/AdminHealthOperationsPage.spec.mjs - changed JS file not collected as browser runtime coverage --(0%) tests/playwright/tools/AdminInvitationsNavPage.spec.mjs - changed JS file not collected as browser runtime coverage --(0%) tests/playwright/tools/AdminOwnerNavigationBoundary.spec.mjs - changed JS file not collected as browser runtime coverage --(100%) src/api/admin-owner-navigation.js - changed JS file with browser V8 coverage -+(0%) tests/api/admin-system-health/contract.test.mjs - changed JS file not collected as browser runtime coverage -diff --git a/docs_build/operations/system-health-v1-operational-guide.md b/docs_build/operations/system-health-v1-operational-guide.md -new file mode 100644 -index 000000000..afe83ac09 ---- /dev/null -+++ b/docs_build/operations/system-health-v1-operational-guide.md -@@ -0,0 +1,240 @@ -+# System Health v1 Operational Guide -+ -+## Purpose -+ -+System Health v1 is the Team Charlie admin surface for confirming the health of -+the currently deployed Game Foundry Studio environment. It is an operational -+read model: the browser renders server-owned status returned by the Admin System -+Health API, and operators use manual actions to ask the API to run specific -+checks. -+ -+This guide is the durable operator reference for System Health v1. It describes -+the approved environment model, storage model, API contract, manual actions, -+safe placeholder behavior, troubleshooting steps, and manual validation path. -+ -+## Architecture -+ -+System Health is one page per deployed environment. A deployment actively checks -+only itself. -+ -+The page may display a static Environment Map for operator reference, but the -+Environment Map must not trigger active peer-environment checks. For example, -+the UAT deployment may show Local, DEV, IST, UAT, and PRD in the reference map, -+but it must only check UAT infrastructure. -+ -+The browser does not own infrastructure health state. It loads and renders the -+server-owned API payload from `/api/admin/system-health/status` and submits -+manual health actions to Admin System Health API endpoints. Browser-side -+fallback rows may show safe pending or unavailable states while loading, but a -+successful health result must come from the API/service contract. -+ -+## Environment Model -+ -+| Environment | Hosting model | Database model | Storage folder | -+| --- | --- | --- | --- | -+| Local | VS Code + Local API | Local Docker PostgreSQL | `/local` | -+| DEV | Local Docker | Local Docker PostgreSQL | `/dev` | -+| IST | Local Docker | Local Docker PostgreSQL | `/ist` | -+| UAT | Cloudflare | Supabase PostgreSQL | `/uat` | -+| PRD | Cloudflare | Supabase PostgreSQL | `/prd` | -+ -+The Environment Identity section displays the current deployment only: -+ -+- environment name -+- hosting model -+- site URL -+- API URL -+- database model -+- storage folder -+- last health check -+ -+The Environment Map is reference-only and lists all approved environments. -+ -+## Shared R2 Folder Model -+ -+GFS uses one shared Cloudflare R2 bucket with environment-scoped folders: -+ -+- `/local` -+- `/dev` -+- `/ist` -+- `/uat` -+- `/prd` -+ -+Storage Health must use the folder for the current environment only. The active -+diagnostic operations are: -+ -+- bucket connectivity -+- list -+- upload -+- read -+- delete -+ -+Do not run storage diagnostics against another environment folder from the -+current deployment. -+ -+## API Contract Summary -+ -+Contract version: `2026-06-24.system-health.v1` -+ -+| Method | Path | Purpose | -+| --- | --- | --- | -+| GET | `/api/admin/system-health/status` | Read current deployment System Health status. | -+| POST | `/api/admin/system-health/action` | Run current deployment manual health actions. | -+| POST | `/api/admin/system-health/storage-connectivity-action` | Run current deployment R2 folder diagnostics. | -+ -+The status API owns the System Health data boundary. It reports: -+ -+- current environment identity -+- reference Environment Map -+- environment capabilities -+- Health API Contract -+- Admin API Registry -+- runtime feature flags -+- runtime health -+- service health -+- configuration summary -+- database health -+- storage health -+- scheduled monitoring foundation -+- notifications foundation -+- health check history -+ -+The contract must not expose secrets. Configuration values that could contain -+credentials, tokens, keys, or connection strings must be omitted or masked by -+the server before reaching the browser. -+ -+## Manual Health Actions -+ -+Manual health action controls submit API requests. They do not create browser -+owned successful health results. -+ -+Supported controls: -+ -+- Refresh -+- Run Runtime Check -+- Run Database Check -+- Run Storage Check -+- Run Full Health Check -+ -+Each manual action is scoped to the current deployment. A Run Storage Check must -+use the current environment folder, and a Run Database Check must use the -+current environment database model. -+ -+## Scheduled Monitoring -+ -+Scheduled Health Monitoring is production-safe when the scheduler is not -+implemented or not configured. In that state, System Health shows Not Configured -+or pending rows for: -+ -+- last scheduled run -+- next scheduled run -+- duration -+- recent result -+- failures/warnings -+ -+This state is intentional and must not be treated as a hidden success. Operators -+should treat it as a clear statement that automatic scheduled checks are not -+active for the deployment. -+ -+## Notifications And Alerts -+ -+Notifications and alerts are production-safe when no sending contract is -+configured. In that state, System Health shows Not Configured or pending rows -+for: -+ -+- email alerts -+- admin notifications -+- webhook alerts -+- messages integration, when present -+ -+System Health v1 must not send email, admin notifications, webhooks, or messages -+unless an approved service contract exists. -+ -+## Troubleshooting Guide -+ -+### Page Does Not Load Status -+ -+1. Confirm the current deployment serves `admin/system-health.html`. -+2. Confirm the API route `GET /api/admin/system-health/status` is reachable. -+3. Check the browser console for network failures. -+4. Check the Local API or deployment logs for route errors. -+5. Confirm any admin authorization requirement for the deployment is satisfied. -+ -+### Environment Identity Looks Wrong -+ -+1. Confirm the deployment environment variables identify the intended -+ environment. -+2. Confirm the storage folder maps to the intended environment. -+3. Restart the API after changing environment variables. -+4. Reopen System Health and verify only the current deployment identity changed. -+5. Do not use the Environment Map as proof of active environment selection; it -+ is reference-only. -+ -+### Database Health Fails -+ -+1. For Local, DEV, and IST, confirm Local Docker PostgreSQL is running. -+2. For UAT and PRD, confirm Supabase PostgreSQL configuration is present -+ server-side. -+3. Run the manual Database Check. -+4. Review response time, connectivity, version, and last checked values. -+5. Check server logs for connection errors without exposing credentials. -+ -+### Storage Health Fails -+ -+1. Confirm Cloudflare R2 bucket configuration is present server-side. -+2. Confirm the storage folder matches the current environment. -+3. Run the manual Storage Check. -+4. Review bucket connectivity, list, upload, read, and delete results. -+5. If upload or delete fails, confirm the deployment credentials allow test -+ object writes and cleanup in the current environment folder. -+ -+### Runtime Health Fails -+ -+1. Confirm the API process is running. -+2. Confirm runtime version, API version, Node version, server start time, and -+ uptime fields are returned when available. -+3. Run the manual Runtime Check. -+4. Review deployment logs for startup or route errors. -+ -+### Scheduled Or Notification Sections Show Not Configured -+ -+This is expected until approved scheduler or notification service contracts are -+implemented. Do not patch the browser to display a healthy state. Add or update -+the server-side service contract first, then update System Health to render the -+server-owned result. -+ -+## Manual Validation Guide -+ -+Use this checklist after System Health v1 changes or deployment configuration -+changes: -+ -+1. Open the System Health page for the deployment being validated. -+2. Confirm Environment Identity shows the current deployment only. -+3. Confirm Environment Map lists Local, DEV, IST, UAT, and PRD as reference -+ entries only. -+4. Confirm no network call attempts to health-check another environment. -+5. Confirm Configuration Summary contains no secrets. -+6. Confirm Database Health matches the current environment database model. -+7. Confirm Storage Health uses the current environment R2 folder. -+8. Run Refresh. -+9. Run Runtime Check. -+10. Run Database Check. -+11. Run Storage Check. -+12. Run Full Health Check. -+13. Confirm action results come from API responses. -+14. Confirm Scheduled Health Monitoring shows Not Configured when no scheduler -+ contract exists. -+15. Confirm Notifications & Alerts shows Not Configured when no notification -+ contract exists. -+16. Review Health Check History for recent checks, warnings, and failures for -+ the current environment only. -+ -+## Operator Guardrails -+ -+- Do not add cross-environment health checks. -+- Do not let the browser invent healthy infrastructure state. -+- Do not expose credentials or raw connection strings. -+- Do not change environment folder mappings without updating this guide, -+ Project Instructions, and the System Health API contract tests. -+- Do not treat Not Configured placeholders as failures when the underlying -+ scheduler or notification service contract is intentionally absent. -diff --git a/src/api/admin-system-health-api-client.js b/src/api/admin-system-health-api-client.js -index dcac596fd..9b166d097 100644 ---- a/src/api/admin-system-health-api-client.js -+++ b/src/api/admin-system-health-api-client.js -@@ -19,3 +19,13 @@ export function runAdminSystemHealthStorageConnectivityAction(actionId) { - "Admin System Health storage connectivity action", - ); - } -+ -+export function runAdminSystemHealthAction(actionId) { -+ return requireServerApiData( -+ safeRequestServerApi("/admin/system-health/action", { -+ body: { actionId }, -+ method: "POST", -+ }), -+ "Admin System Health action", -+ ); -+} -diff --git a/src/dev-runtime/server/local-api-router.mjs b/src/dev-runtime/server/local-api-router.mjs -index 194ba4622..993e14a59 100644 ---- a/src/dev-runtime/server/local-api-router.mjs -+++ b/src/dev-runtime/server/local-api-router.mjs -@@ -321,6 +321,8 @@ const LOCAL_API_STARTUP_DEFAULT_PORT_BY_PROTOCOL = Object.freeze({ - "http:": "80", - "https:": "443", - }); -+const LOCAL_API_PROCESS_STARTED_AT = new Date().toISOString(); -+const SYSTEM_HEALTH_API_CONTRACT_VERSION = "2026-06-24.system-health.v1"; - const SYSTEM_HEALTH_USAGE_NOT_AVAILABLE = "NOT AVAILABLE"; - const SYSTEM_HEALTH_USAGE_CONTRACTS = Object.freeze({ - GAMEFOUNDRY_DB_CONNECTION_LIMIT: Object.freeze({ -@@ -347,6 +349,35 @@ const STORAGE_CONNECTIVITY_ACTIONS = Object.freeze([ - Object.freeze({ id: "storage-read-test-object", label: "Read test object", operation: "read" }), - Object.freeze({ id: "storage-delete-test-object", label: "Delete test object", operation: "delete" }), - ]); -+const SYSTEM_HEALTH_STORAGE_ACTION_IDS = Object.freeze([ -+ "storage-bucket-connectivity", -+ "storage-list", -+ "storage-upload-test-object", -+ "storage-read-test-object", -+ "storage-delete-test-object", -+]); -+const SYSTEM_HEALTH_MANUAL_ACTION_LABELS = Object.freeze({ -+ "database-check": "Run Database Check", -+ "full-health-check": "Run Full Health Check", -+ refresh: "Refresh", -+ "runtime-check": "Run Runtime Check", -+ "storage-check": "Run Storage Check", -+}); -+const SYSTEM_HEALTH_API_ENDPOINTS = Object.freeze([ -+ Object.freeze({ method: "GET", path: "/api/admin/system-health/status", purpose: "Read current deployment System Health status." }), -+ Object.freeze({ method: "POST", path: "/api/admin/system-health/action", purpose: "Run current deployment manual health actions." }), -+ Object.freeze({ method: "POST", path: "/api/admin/system-health/storage-connectivity-action", purpose: "Run current deployment R2 folder diagnostics." }), -+]); -+const ADMIN_API_REGISTRY_ENTRIES = Object.freeze([ -+ Object.freeze({ method: "GET", owner: "Team Charlie", path: "/api/admin/system-health/status", purpose: "System Health status contract" }), -+ Object.freeze({ method: "POST", owner: "Team Charlie", path: "/api/admin/system-health/action", purpose: "System Health manual actions" }), -+ Object.freeze({ method: "POST", owner: "Team Charlie", path: "/api/admin/system-health/storage-connectivity-action", purpose: "System Health R2 diagnostics" }), -+ Object.freeze({ method: "GET", owner: "Team Charlie", path: "/api/admin/infrastructure/storage-path-status", purpose: "Infrastructure storage path status" }), -+ Object.freeze({ method: "POST", owner: "Team Charlie", path: "/api/admin/infrastructure/storage-connectivity-action", purpose: "Infrastructure R2 diagnostics" }), -+ Object.freeze({ method: "GET", owner: "Team Charlie", path: "/api/admin/operations/status", purpose: "Admin Operations status" }), -+ Object.freeze({ method: "POST", owner: "Team Charlie", path: "/api/admin/operations/action", purpose: "Admin Operations actions" }), -+ Object.freeze({ method: "GET", owner: "Shared Admin Navigation", path: "/api/navigation/admin-menu", purpose: "Admin navigation menu contract" }), -+]); - const STORAGE_CONNECTIVITY_TEST_OBJECT_CONTENT = "Game Foundry Studio storage connectivity test object.\n"; - const STORAGE_CONNECTIVITY_TEST_OBJECT_RELATIVE_PATH = "connectivity/storage-connectivity-test.txt"; - const SYSTEM_HEALTH_ENVIRONMENT_MODELS = Object.freeze([ -@@ -993,6 +1024,94 @@ function systemHealthSummary(rows) { - }; - } - -+function systemHealthApiContract(checkedAt = new Date().toISOString()) { -+ const endpointValue = SYSTEM_HEALTH_API_ENDPOINTS -+ .map((endpoint) => `${endpoint.method} ${endpoint.path}`) -+ .join("; "); -+ const rows = [ -+ { -+ field: "Contract version", -+ status: "PASS", -+ value: SYSTEM_HEALTH_API_CONTRACT_VERSION, -+ }, -+ { -+ field: "Data boundary", -+ status: "PASS", -+ value: SERVER_DATA_BOUNDARY_RULE, -+ }, -+ { -+ field: "Deployment scope", -+ status: "PASS", -+ value: "Current deployment only", -+ }, -+ { -+ field: "Environment Map", -+ status: "PASS", -+ value: "Reference only; no peer environment checks", -+ }, -+ { -+ field: "Secret handling", -+ status: "PASS", -+ value: "No secret editing; secret values hidden", -+ }, -+ { -+ field: "Endpoints", -+ status: "PASS", -+ value: endpointValue, -+ }, -+ ]; -+ return { -+ contractVersion: SYSTEM_HEALTH_API_CONTRACT_VERSION, -+ currentDeploymentOnly: true, -+ endpointCount: SYSTEM_HEALTH_API_ENDPOINTS.length, -+ endpoints: SYSTEM_HEALTH_API_ENDPOINTS.map((endpoint) => ({ ...endpoint })), -+ lastChecked: checkedAt, -+ message: "Admin System Health API contract is current-deployment only and server-owned.", -+ noCrossEnvironmentChecks: true, -+ referenceEnvironmentMapOnly: true, -+ rows, -+ secretEditingAllowed: false, -+ secretsExposed: false, -+ status: "PASS", -+ }; -+} -+ -+function systemHealthAdminApiRegistry(checkedAt = new Date().toISOString()) { -+ const rows = ADMIN_API_REGISTRY_ENTRIES.map((entry) => ({ -+ ...entry, -+ status: "PASS", -+ })); -+ return { -+ lastChecked: checkedAt, -+ message: "Admin API Registry lists server routes used by Admin System Health and adjacent Charlie-owned admin operations.", -+ routeCount: rows.length, -+ rows, -+ secretEditingAllowed: false, -+ secretsExposed: false, -+ status: "PASS", -+ }; -+} -+ -+function systemHealthRuntimeFeatureFlags(checkedAt = new Date().toISOString()) { -+ const rows = [ -+ { flag: "system-health.api-contract", status: "PASS", value: "Enabled" }, -+ { flag: "system-health.environment-capabilities", status: "PASS", value: "Enabled" }, -+ { flag: "system-health.admin-api-registry", status: "PASS", value: "Enabled" }, -+ { flag: "system-health.runtime-health", status: "PASS", value: "Enabled" }, -+ { flag: "system-health.manual-actions", status: "PASS", value: "Enabled" }, -+ { flag: "system-health.scheduled-monitoring", status: "PENDING", value: "Not Configured" }, -+ { flag: "system-health.notifications", status: "PENDING", value: "Not Configured" }, -+ ]; -+ return { -+ lastChecked: checkedAt, -+ message: "Runtime Feature Flags are read-only server-reported System Health capability flags.", -+ rows, -+ secretEditingAllowed: false, -+ secretsExposed: false, -+ status: overallHealthStatus(rows.map((row) => ({ status: row.status }))), -+ }; -+} -+ - function isSecretLikeRuntimeEnvKey(key) { - const upperKey = String(key || "").toUpperCase(); - return RUNTIME_ENV_SECRET_MARKERS.some((marker) => upperKey.includes(marker)); -@@ -1028,6 +1147,328 @@ function systemHealthRuntimeEnvironment(env = process.env) { - }; - } - -+let cachedProjectVersion = null; -+ -+function projectVersion() { -+ if (cachedProjectVersion !== null) { -+ return cachedProjectVersion; -+ } -+ try { -+ const packageJson = JSON.parse(readFileSync(path.join(process.cwd(), "package.json"), "utf8")); -+ cachedProjectVersion = String(packageJson.version || "").trim(); -+ } catch { -+ cachedProjectVersion = ""; -+ } -+ return cachedProjectVersion; -+} -+ -+function systemHealthRuntimeHealth(environmentIdentity = {}, checkedAt = new Date().toISOString()) { -+ const version = projectVersion(); -+ const nodeVersion = String(process.version || "").trim(); -+ const uptimeSeconds = Math.max(0, Math.floor(process.uptime())); -+ return { -+ apiVersion: version, -+ appVersion: version, -+ environmentName: environmentIdentity.name || "Unknown", -+ lastChecked: checkedAt, -+ message: "Runtime health is reported by the current deployment Local API only.", -+ nodeVersion, -+ secretEditingAllowed: false, -+ secretsExposed: false, -+ serverStartTime: LOCAL_API_PROCESS_STARTED_AT, -+ status: "PASS", -+ uptimeSeconds, -+ }; -+} -+ -+function systemHealthServiceDisplayStatus(status, configured = true) { -+ if (configured === false) { -+ return { healthStatus: "PENDING", status: "Not Configured" }; -+ } -+ const normalized = normalizeHealthStatus(status); -+ if (normalized === "PASS") { -+ return { healthStatus: "PASS", status: "Healthy" }; -+ } -+ if (normalized === "FAIL") { -+ return { healthStatus: "FAIL", status: "Failed" }; -+ } -+ return { healthStatus: "WARN", status: "Warning" }; -+} -+ -+function systemHealthServiceCard({ configured = true, id, label, lastChecked, status = "WARN", summary }) { -+ const displayStatus = systemHealthServiceDisplayStatus(status, configured); -+ return { -+ configured, -+ healthStatus: displayStatus.healthStatus, -+ id, -+ label, -+ lastChecked, -+ status: displayStatus.status, -+ summary: String(summary || "Service health status unavailable."), -+ }; -+} -+ -+function systemHealthServiceHealth({ -+ authStatus = {}, -+ checkedAt, -+ databaseStatus = {}, -+ runtimeHealth = {}, -+ session = {}, -+ storageStatus = {}, -+}) { -+ const databaseConfigured = databaseStatus.configured !== false && databaseStatus.connectivity !== "not configured"; -+ const storageConfigured = storageStatus.configured === true; -+ const authConfigured = authStatus.configured === true || authStatus.ready === true; -+ const services = [ -+ systemHealthServiceCard({ -+ id: "runtime", -+ label: "Runtime", -+ lastChecked: runtimeHealth.lastChecked || checkedAt, -+ status: runtimeHealth.status || "WARN", -+ summary: runtimeHealth.message || "Runtime health status unavailable.", -+ }), -+ systemHealthServiceCard({ -+ id: "api", -+ label: "API", -+ lastChecked: checkedAt, -+ status: session.authenticated && session.isAdmin ? "PASS" : "FAIL", -+ summary: session.authenticated && session.isAdmin -+ ? "Current deployment API responded to the Admin System Health request." -+ : "Admin System Health API requires an authenticated Admin session.", -+ }), -+ systemHealthServiceCard({ -+ configured: databaseConfigured, -+ id: "database", -+ label: "Database", -+ lastChecked: databaseStatus.lastChecked || checkedAt, -+ status: databaseStatus.connectivityStatus || databaseStatus.status || "WARN", -+ summary: databaseStatus.message || `${databaseStatus.databaseType || "PostgreSQL"} status unavailable.`, -+ }), -+ systemHealthServiceCard({ -+ configured: storageConfigured, -+ id: "storage", -+ label: "Storage", -+ lastChecked: storageStatus.lastChecked || checkedAt, -+ status: storageStatus.status || "WARN", -+ summary: storageStatus.message || "Cloudflare R2 storage status unavailable.", -+ }), -+ systemHealthServiceCard({ -+ configured: authConfigured, -+ id: "authentication", -+ label: "Authentication", -+ lastChecked: checkedAt, -+ status: authStatus.ready === true ? "PASS" : "WARN", -+ summary: authStatus.operatorDiagnostic || authStatus.message || "Authentication provider status unavailable.", -+ }), -+ systemHealthServiceCard({ -+ configured: false, -+ id: "email", -+ label: "Email", -+ lastChecked: checkedAt, -+ status: "PENDING", -+ summary: "Email health contract is not configured for this deployment.", -+ }), -+ systemHealthServiceCard({ -+ configured: false, -+ id: "background-jobs", -+ label: "Background Jobs", -+ lastChecked: checkedAt, -+ status: "PENDING", -+ summary: "Background job health contract is not configured for this deployment.", -+ }), -+ ]; -+ return { -+ lastChecked: checkedAt, -+ message: "Service Health summarizes current-deployment service contracts only.", -+ secretEditingAllowed: false, -+ secretsExposed: false, -+ services, -+ status: overallHealthStatus(services.map((service) => ({ status: service.healthStatus }))), -+ }; -+} -+ -+function systemHealthConfigurationSummary({ -+ authStatus = {}, -+ checkedAt, -+ databaseStatus = {}, -+ environmentIdentity = {}, -+ storageStatus = {}, -+}) { -+ const authConfigured = authStatus.configured === true || authStatus.ready === true; -+ const rows = [ -+ { -+ field: "Current environment", -+ status: environmentIdentity.status || "WARN", -+ value: environmentIdentity.name || "Unknown", -+ }, -+ { -+ field: "Hosting model", -+ status: environmentIdentity.hostingModel ? "PASS" : "WARN", -+ value: environmentIdentity.hostingModel || "not configured", -+ }, -+ { -+ field: "Site URL", -+ status: environmentIdentity.siteUrlStatus || "WARN", -+ value: environmentIdentity.siteUrl || "not configured", -+ }, -+ { -+ field: "API URL", -+ status: environmentIdentity.apiUrlStatus || "WARN", -+ value: environmentIdentity.apiUrl || "not configured", -+ }, -+ { -+ field: "Database provider/type", -+ status: databaseStatus.databaseType || environmentIdentity.databaseModel ? "PASS" : "WARN", -+ value: databaseStatus.databaseType || environmentIdentity.databaseModel || "PostgreSQL", -+ }, -+ { -+ field: "Storage provider/folder", -+ status: storageStatus.environmentFolderStatus || environmentIdentity.storageFolderStatus || "WARN", -+ value: `Cloudflare R2 ${storageStatus.environmentFolder || environmentIdentity.storageFolder || "not configured"}`, -+ }, -+ { -+ field: "Auth provider/status", -+ status: authConfigured ? "PASS" : "PENDING", -+ value: `${authStatus.providerId || SUPABASE_AUTH_PROVIDER_ID} ${authConfigured ? "ready" : "not configured"}`, -+ }, -+ ]; -+ return { -+ lastChecked: checkedAt, -+ message: "Configuration Summary is read-only and contains no secret values.", -+ rows, -+ secretEditingAllowed: false, -+ secretsExposed: false, -+ status: overallHealthStatus(rows), -+ }; -+} -+ -+function systemHealthEnvironmentCapabilities({ -+ authStatus = {}, -+ checkedAt, -+ databaseStatus = {}, -+ environmentIdentity = {}, -+ storageStatus = {}, -+}) { -+ const rows = [ -+ { -+ capability: "Hosting", -+ status: environmentIdentity.hostingModel ? "PASS" : "WARN", -+ value: environmentIdentity.hostingModel || "not configured", -+ }, -+ { -+ capability: "API", -+ status: environmentIdentity.apiUrlStatus || "WARN", -+ value: environmentIdentity.apiUrl || "not configured", -+ }, -+ { -+ capability: "Database", -+ status: databaseStatus.connectivityStatus || databaseStatus.status || "WARN", -+ value: databaseStatus.databaseType || environmentIdentity.databaseModel || "PostgreSQL", -+ }, -+ { -+ capability: "Storage", -+ status: storageStatus.environmentFolderStatus || environmentIdentity.storageFolderStatus || "WARN", -+ value: `Cloudflare R2 ${storageStatus.environmentFolder || environmentIdentity.storageFolder || "not configured"}`, -+ }, -+ { -+ capability: "Authentication", -+ status: authStatus.ready === true ? "PASS" : "PENDING", -+ value: authStatus.ready === true ? "Configured" : "Not Configured", -+ }, -+ { -+ capability: "Scheduled Monitoring", -+ status: "PENDING", -+ value: "Not Configured", -+ }, -+ { -+ capability: "Notifications", -+ status: "PENDING", -+ value: "Not Configured", -+ }, -+ ]; -+ return { -+ currentEnvironment: environmentIdentity.name || "Unknown", -+ lastChecked: checkedAt, -+ message: "Environment Capabilities describes the current deployment only.", -+ peerEnvironmentChecks: false, -+ rows, -+ secretEditingAllowed: false, -+ secretsExposed: false, -+ status: overallHealthStatus(rows.map((row) => ({ status: row.status }))), -+ }; -+} -+ -+function systemHealthScheduledMonitoring(checkedAt = new Date().toISOString()) { -+ const rows = [ -+ { -+ field: "Last scheduled run", -+ status: "PENDING", -+ value: "Not Configured", -+ }, -+ { -+ field: "Next scheduled run", -+ status: "PENDING", -+ value: "Not Configured", -+ }, -+ { -+ field: "Duration", -+ status: "PENDING", -+ value: "Not Configured", -+ }, -+ { -+ field: "Recent result", -+ status: "PENDING", -+ value: "Not Configured", -+ }, -+ { -+ field: "Failures/warnings", -+ status: "PENDING", -+ value: "Scheduler contract is not configured.", -+ }, -+ ]; -+ return { -+ lastChecked: checkedAt, -+ message: "Scheduled Health Monitoring is not configured for this deployment.", -+ rows, -+ secretEditingAllowed: false, -+ secretsExposed: false, -+ status: "PENDING", -+ }; -+} -+ -+function systemHealthNotificationsFoundation(checkedAt = new Date().toISOString()) { -+ const rows = [ -+ { -+ field: "Email alerts", -+ status: "PENDING", -+ value: "Not Configured", -+ }, -+ { -+ field: "Admin notifications", -+ status: "PENDING", -+ value: "Not Configured", -+ }, -+ { -+ field: "Webhook alerts", -+ status: "PENDING", -+ value: "Not Configured", -+ }, -+ { -+ field: "Messages integration", -+ status: "PENDING", -+ value: "Not Configured", -+ }, -+ ]; -+ return { -+ lastChecked: checkedAt, -+ message: "Notifications and alerts are placeholders only; no alert sending contract is configured for this deployment.", -+ rows, -+ secretEditingAllowed: false, -+ secretsExposed: false, -+ status: "PENDING", -+ }; -+} -+ - function systemHealthHistoryRow({ checkedAt, environmentName, area, result, summary, kind = "recent check" }) { - return { - area, -@@ -1043,6 +1484,7 @@ function systemHealthCheckHistory({ - checkedAt, - databaseStatus = {}, - environmentIdentity = {}, -+ runtimeHealth = {}, - runtimeEnvironment = {}, - storageStatus = {}, - }) { -@@ -1076,8 +1518,8 @@ function systemHealthCheckHistory({ - area: "Runtime Health", - checkedAt, - environmentName, -- result: runtimeEnvironment.status, -- summary: runtimeEnvironment.message || "Runtime environment health unavailable.", -+ result: runtimeHealth.status || runtimeEnvironment.status, -+ summary: runtimeHealth.message || runtimeEnvironment.message || "Runtime health unavailable.", - }), - ]; - const issueRows = recentChecks -@@ -3886,10 +4328,85 @@ LIMIT 1; - return this.runStorageConnectivityAction(String(body.actionId || "").trim(), { scope: "environment-folder" }); - } - -+ async adminSystemHealthStorageHealthCheck() { -+ const results = []; -+ for (const actionId of SYSTEM_HEALTH_STORAGE_ACTION_IDS) { -+ results.push(await this.runStorageConnectivityAction(actionId, { scope: "environment-folder" })); -+ } -+ return { -+ actionId: "storage-check", -+ checkedAt: new Date().toISOString(), -+ label: SYSTEM_HEALTH_MANUAL_ACTION_LABELS["storage-check"], -+ message: "Storage health check executed bucket connectivity, list, upload, read, and delete through the current deployment API.", -+ secretEditingAllowed: false, -+ secretsExposed: false, -+ status: overallHealthStatus(results.map((result) => ({ status: result.status }))), -+ storageDiagnostics: results, -+ storageStatus: this.ownerStorageStatus(), -+ }; -+ } -+ -+ async adminSystemHealthAction(body = {}) { -+ const session = await this.requireAdminSession(); -+ const actionId = String(body.actionId || "").trim(); -+ const label = SYSTEM_HEALTH_MANUAL_ACTION_LABELS[actionId]; -+ if (!label) { -+ throw httpError(`Unknown Admin System Health action: ${actionId || "missing actionId"}.`, 400); -+ } -+ const checkedAt = new Date().toISOString(); -+ const environmentIdentity = systemHealthEnvironmentIdentity(process.env, checkedAt); -+ if (actionId === "refresh" || actionId === "full-health-check") { -+ const statusSnapshot = await this.adminSystemHealthStatus(); -+ return { -+ actionId, -+ checkedAt, -+ label, -+ message: `${label} completed through the current deployment Admin System Health API.`, -+ secretEditingAllowed: false, -+ secretsExposed: false, -+ status: statusSnapshot.status, -+ statusSnapshot, -+ }; -+ } -+ if (actionId === "runtime-check") { -+ const runtimeHealth = systemHealthRuntimeHealth(environmentIdentity, checkedAt); -+ return { -+ actionId, -+ checkedAt, -+ label, -+ message: "Runtime health check completed through the current deployment API.", -+ runtimeHealth, -+ secretEditingAllowed: false, -+ secretsExposed: false, -+ status: runtimeHealth.status, -+ }; -+ } -+ if (actionId === "database-check") { -+ const databaseStatus = await this.ownerDatabaseStatus(environmentIdentity); -+ return { -+ actionId, -+ checkedAt, -+ databaseStatus, -+ label, -+ message: "Database health check completed through the current deployment API.", -+ secretEditingAllowed: false, -+ secretsExposed: false, -+ status: databaseStatus.connectivityStatus || databaseStatus.status, -+ }; -+ } -+ if (session.isAdmin !== true) { -+ throw httpError("Admin role required.", 403); -+ } -+ return this.adminSystemHealthStorageHealthCheck(); -+ } -+ - async adminSystemHealthStatus() { - const session = await this.requireAdminSession(); - const authStatus = this.authStatus(); - const checkedAt = new Date().toISOString(); -+ const apiContract = systemHealthApiContract(checkedAt); -+ const adminApiRegistry = systemHealthAdminApiRegistry(checkedAt); -+ const runtimeFeatureFlags = systemHealthRuntimeFeatureFlags(checkedAt); - const environmentIdentity = systemHealthEnvironmentIdentity(process.env, checkedAt); - const environmentMap = systemHealthEnvironmentMap(); - const databaseStatus = await this.ownerDatabaseStatus(environmentIdentity); -@@ -3902,11 +4419,37 @@ LIMIT 1; - const promotionFoundation = this.ownerPromotionFoundation(); - const r2Readiness = systemHealthR2Readiness(storageStatus); - const runtimeEnvironment = systemHealthRuntimeEnvironment(); -+ const runtimeHealth = systemHealthRuntimeHealth(environmentIdentity, checkedAt); -+ const serviceHealth = systemHealthServiceHealth({ -+ authStatus, -+ checkedAt, -+ databaseStatus, -+ runtimeHealth, -+ session, -+ storageStatus, -+ }); -+ const configurationSummary = systemHealthConfigurationSummary({ -+ authStatus, -+ checkedAt, -+ databaseStatus, -+ environmentIdentity, -+ storageStatus, -+ }); -+ const environmentCapabilities = systemHealthEnvironmentCapabilities({ -+ authStatus, -+ checkedAt, -+ databaseStatus, -+ environmentIdentity, -+ storageStatus, -+ }); -+ const scheduledMonitoring = systemHealthScheduledMonitoring(checkedAt); -+ const notificationsFoundation = systemHealthNotificationsFoundation(checkedAt); - const operationsHealth = adminOperationsHealth(this.standaloneTables); - const healthCheckHistory = systemHealthCheckHistory({ - checkedAt, - databaseStatus, - environmentIdentity, -+ runtimeHealth, - runtimeEnvironment, - storageStatus, - }); -@@ -4033,16 +4576,25 @@ LIMIT 1; - message: "Admin System Health loaded safe status only.", - environmentIdentity, - environmentMap, -+ environmentCapabilities, - healthCheckHistory, -+ notificationsFoundation, - operationsHealth, - overview, - pressureLabels: SYSTEM_HEALTH_LIMIT_PRESSURE_LABELS, - connectionSummary: this.ownerConnectionSummary(), - databaseStatus, -+ adminApiRegistry, -+ apiContract, -+ configurationSummary, - r2Readiness, - secretEditingAllowed: false, - secretsExposed: false, - runtimeEnvironment, -+ runtimeFeatureFlags, -+ runtimeHealth, -+ scheduledMonitoring, -+ serviceHealth, - storageStatus, - summary: systemHealthSummary(overview), - status: overallHealthStatus(overview), -@@ -6056,6 +6608,12 @@ export function createLocalApiRouter({ - return true; - } - -+ if (parts[1] === "admin" && parts[2] === "system-health" && request.method === "POST" && parts[3] === "action") { -+ const body = await readRequestJson(request); -+ ok(response, await dataSource.adminSystemHealthAction(body)); -+ return true; -+ } -+ - if (parts[1] === "admin" && parts[2] === "operations" && request.method === "GET" && parts[3] === "status") { - ok(response, await dataSource.adminOperationsStatus()); - return true; -diff --git a/tests/api/admin-system-health/contract.test.mjs b/tests/api/admin-system-health/contract.test.mjs -new file mode 100644 -index 000000000..e9e366882 ---- /dev/null -+++ b/tests/api/admin-system-health/contract.test.mjs -@@ -0,0 +1,156 @@ -+import http from "node:http"; -+import test from "node:test"; -+import assert from "node:assert/strict"; -+import { createLocalApiRouter } from "../../../src/dev-runtime/server/local-api-router.mjs"; -+import { SEED_DB_KEYS } from "../../../src/dev-runtime/seed/seed-db-keys.mjs"; -+ -+function withEnv(nextEnv, callback) { -+ const previousEnv = {}; -+ Object.keys(nextEnv).forEach((key) => { -+ previousEnv[key] = process.env[key]; -+ if (nextEnv[key] === undefined) { -+ delete process.env[key]; -+ } else { -+ process.env[key] = nextEnv[key]; -+ } -+ }); -+ return Promise.resolve() -+ .then(callback) -+ .finally(() => { -+ Object.entries(previousEnv).forEach(([key, value]) => { -+ if (value === undefined) { -+ delete process.env[key]; -+ } else { -+ process.env[key] = value; -+ } -+ }); -+ }); -+} -+ -+function startApiServer() { -+ const handleRequest = createLocalApiRouter(); -+ const server = http.createServer((request, response) => { -+ const address = server.address(); -+ const port = address && typeof address !== "string" ? address.port : 0; -+ const requestUrl = new URL(request.url || "/", `http://127.0.0.1:${port}`); -+ handleRequest(request, response, requestUrl).catch((error) => { -+ response.statusCode = error?.statusCode || 500; -+ response.setHeader("Content-Type", "application/json; charset=utf-8"); -+ response.end(JSON.stringify({ -+ error: error instanceof Error ? error.message : String(error || "Admin System Health contract test server error."), -+ ok: false, -+ })); -+ }); -+ }); -+ return new Promise((resolve, reject) => { -+ server.once("error", reject); -+ server.listen(0, "127.0.0.1", () => { -+ const address = server.address(); -+ if (!address || typeof address === "string") { -+ reject(new Error("Unable to start Admin System Health contract API server.")); -+ return; -+ } -+ resolve({ -+ baseUrl: `http://127.0.0.1:${address.port}`, -+ close: () => new Promise((closeResolve) => { -+ server.closeAllConnections?.(); -+ server.close(closeResolve); -+ }), -+ }); -+ }); -+ }); -+} -+ -+async function apiPayload(baseUrl, pathName, request = {}) { -+ const init = request.body === undefined -+ ? request -+ : { -+ ...request, -+ body: JSON.stringify(request.body), -+ headers: { -+ "content-type": "application/json", -+ ...(request.headers || {}), -+ }, -+ }; -+ const response = await fetch(`${baseUrl}${pathName}`, init); -+ const payload = await response.json(); -+ return { payload, status: response.status }; -+} -+ -+async function apiJson(baseUrl, pathName, request = {}) { -+ const { payload, status } = await apiPayload(baseUrl, pathName, request); -+ assert.equal(status, 200, `${pathName} should return 200: ${payload.error || ""}`); -+ assert.equal(payload.ok, true); -+ return payload.data; -+} -+ -+test("Admin System Health completion contract remains server-owned and current-environment only", async () => { -+ await withEnv({ -+ GAMEFOUNDRY_API_URL: "http://api-user:api-secret@127.0.0.1:5501/api", -+ GAMEFOUNDRY_ENVIRONMENT_LABEL: "DEV", -+ GAMEFOUNDRY_SITE_URL: "http://site-user:site-secret@127.0.0.1:5500", -+ GAMEFOUNDRY_STORAGE_PROJECTS_PREFIX: "/dev/projects/", -+ }, async () => { -+ const server = await startApiServer(); -+ try { -+ await apiJson(server.baseUrl, "/api/session/user", { -+ body: { userKey: SEED_DB_KEYS.users.admin }, -+ method: "POST", -+ }); -+ const health = await apiJson(server.baseUrl, "/api/admin/system-health/status"); -+ assert.equal(health.environmentIdentity.name, "DEV"); -+ assert.equal(health.apiContract.currentDeploymentOnly, true); -+ assert.equal(health.apiContract.noCrossEnvironmentChecks, true); -+ assert.equal(health.environmentCapabilities.peerEnvironmentChecks, false); -+ assert.equal(health.environmentMap.some((row) => Object.hasOwn(row, "status")), false); -+ assert.deepEqual( -+ [ -+ "apiContract", -+ "adminApiRegistry", -+ "environmentCapabilities", -+ "runtimeFeatureFlags", -+ "serviceHealth", -+ "configurationSummary", -+ "scheduledMonitoring", -+ "notificationsFoundation", -+ ].filter((key) => Object.hasOwn(health, key)), -+ [ -+ "apiContract", -+ "adminApiRegistry", -+ "environmentCapabilities", -+ "runtimeFeatureFlags", -+ "serviceHealth", -+ "configurationSummary", -+ "scheduledMonitoring", -+ "notificationsFoundation", -+ ], -+ ); -+ const healthText = JSON.stringify(health); -+ assert.equal(healthText.includes("api-secret"), false); -+ assert.equal(healthText.includes("site-secret"), false); -+ assert.equal(healthText.includes("/uat/projects"), false); -+ assert.equal(health.secretEditingAllowed, false); -+ assert.equal(health.secretsExposed, false); -+ } finally { -+ await server.close(); -+ } -+ }); -+}); -+ -+test("Admin System Health rejects unknown manual health actions", async () => { -+ const server = await startApiServer(); -+ try { -+ await apiJson(server.baseUrl, "/api/session/user", { -+ body: { userKey: SEED_DB_KEYS.users.admin }, -+ method: "POST", -+ }); -+ const rejected = await apiPayload(server.baseUrl, "/api/admin/system-health/action", { -+ body: { actionId: "peer-environment-check" }, -+ method: "POST", -+ }); -+ assert.equal(rejected.status, 400); -+ assert.match(rejected.payload.error, /Unknown Admin System Health action/); -+ } finally { -+ await server.close(); -+ } -+}); -diff --git a/tests/dev-runtime/AdminHealthOperations.test.mjs b/tests/dev-runtime/AdminHealthOperations.test.mjs -index fc0d28ea7..e682005b2 100644 ---- a/tests/dev-runtime/AdminHealthOperations.test.mjs -+++ b/tests/dev-runtime/AdminHealthOperations.test.mjs -@@ -142,6 +142,58 @@ test("Admin can view operational health while Creator sessions are blocked", asy - assert.equal(typeof health.databaseStatus.lastChecked, "string"); - assert.equal(typeof health.databaseStatus.responseTimeMs === "number" || health.databaseStatus.responseTimeMs === null, true); - assert.equal(typeof health.databaseStatus.version, "string"); -+ assert.equal(health.runtimeHealth.environmentName, "Local"); -+ assert.equal(health.runtimeHealth.appVersion, "1.0.0"); -+ assert.equal(health.runtimeHealth.apiVersion, "1.0.0"); -+ assert.match(health.runtimeHealth.nodeVersion, /^v\d+\./); -+ assert.equal(typeof health.runtimeHealth.serverStartTime, "string"); -+ assert.equal(typeof health.runtimeHealth.uptimeSeconds, "number"); -+ assert.equal(typeof health.runtimeHealth.lastChecked, "string"); -+ assert.deepEqual( -+ health.serviceHealth.services.map((service) => service.label), -+ ["Runtime", "API", "Database", "Storage", "Authentication", "Email", "Background Jobs"], -+ ); -+ assert.equal( -+ health.serviceHealth.services.every((service) => ["Healthy", "Warning", "Failed", "Not Configured"].includes(service.status)), -+ true, -+ ); -+ assert.equal(health.serviceHealth.services.every((service) => typeof service.summary === "string"), true); -+ assert.equal(JSON.stringify(health.serviceHealth).includes("/uat"), false); -+ assert.deepEqual( -+ health.configurationSummary.rows.map((row) => row.field), -+ [ -+ "Current environment", -+ "Hosting model", -+ "Site URL", -+ "API URL", -+ "Database provider/type", -+ "Storage provider/folder", -+ "Auth provider/status", -+ ], -+ ); -+ assert.equal(JSON.stringify(health.configurationSummary).includes("site-user"), false); -+ assert.equal(JSON.stringify(health.configurationSummary).includes("site-secret"), false); -+ assert.equal(JSON.stringify(health.configurationSummary).includes("api-user"), false); -+ assert.equal(JSON.stringify(health.configurationSummary).includes("api-secret"), false); -+ assert.deepEqual( -+ health.scheduledMonitoring.rows.map((row) => row.field), -+ ["Last scheduled run", "Next scheduled run", "Duration", "Recent result", "Failures/warnings"], -+ ); -+ assert.equal(health.scheduledMonitoring.rows.some((row) => row.value === "Not Configured"), true); -+ assert.equal(health.scheduledMonitoring.status, "PENDING"); -+ assert.deepEqual( -+ health.notificationsFoundation.rows.map((row) => row.field), -+ ["Email alerts", "Admin notifications", "Webhook alerts", "Messages integration"], -+ ); -+ assert.equal(health.notificationsFoundation.rows.every((row) => row.value === "Not Configured"), true); -+ assert.equal(health.notificationsFoundation.status, "PENDING"); -+ assert.equal(health.environmentCapabilities.currentEnvironment, "Local"); -+ assert.equal(health.environmentCapabilities.peerEnvironmentChecks, false); -+ assert.deepEqual( -+ health.environmentCapabilities.rows.map((row) => row.capability), -+ ["Hosting", "API", "Database", "Storage", "Authentication", "Scheduled Monitoring", "Notifications"], -+ ); -+ assert.equal(JSON.stringify(health.environmentCapabilities).includes("/uat"), false); - assert.equal(health.storageStatus.environmentFolder, "/local"); - assert.equal(typeof health.storageStatus.lastChecked, "string"); - assert.equal(Array.isArray(health.healthCheckHistory), true); -@@ -156,6 +208,43 @@ test("Admin can view operational health while Creator sessions are blocked", asy - health.environmentMap.map((row) => row.name), - ["Local", "DEV", "IST", "UAT", "PRD"], - ); -+ assert.equal(health.apiContract.contractVersion, "2026-06-24.system-health.v1"); -+ assert.equal(health.apiContract.currentDeploymentOnly, true); -+ assert.equal(health.apiContract.noCrossEnvironmentChecks, true); -+ assert.equal(health.apiContract.referenceEnvironmentMapOnly, true); -+ assert.deepEqual( -+ health.apiContract.endpoints.map((endpoint) => `${endpoint.method} ${endpoint.path}`), -+ [ -+ "GET /api/admin/system-health/status", -+ "POST /api/admin/system-health/action", -+ "POST /api/admin/system-health/storage-connectivity-action", -+ ], -+ ); -+ assert.deepEqual( -+ health.adminApiRegistry.rows.map((row) => `${row.method} ${row.path}`), -+ [ -+ "GET /api/admin/system-health/status", -+ "POST /api/admin/system-health/action", -+ "POST /api/admin/system-health/storage-connectivity-action", -+ "GET /api/admin/infrastructure/storage-path-status", -+ "POST /api/admin/infrastructure/storage-connectivity-action", -+ "GET /api/admin/operations/status", -+ "POST /api/admin/operations/action", -+ "GET /api/navigation/admin-menu", -+ ], -+ ); -+ assert.deepEqual( -+ health.runtimeFeatureFlags.rows.map((row) => `${row.flag}:${row.value}`), -+ [ -+ "system-health.api-contract:Enabled", -+ "system-health.environment-capabilities:Enabled", -+ "system-health.admin-api-registry:Enabled", -+ "system-health.runtime-health:Enabled", -+ "system-health.manual-actions:Enabled", -+ "system-health.scheduled-monitoring:Not Configured", -+ "system-health.notifications:Not Configured", -+ ], -+ ); - assert.equal( - health.environmentMap.some((row) => Object.prototype.hasOwnProperty.call(row, "status")), - false, -@@ -176,6 +265,44 @@ test("Admin can view operational health while Creator sessions are blocked", asy - assert.equal(startupText.includes("api-secret"), false); - assert.equal(startupText.includes("site-user"), false); - assert.equal(startupText.includes("site-secret"), false); -+ const runtimeAction = await apiJson(server.baseUrl, "/api/admin/system-health/action", { -+ body: { actionId: "runtime-check" }, -+ method: "POST", -+ }); -+ assert.equal(runtimeAction.runtimeHealth.environmentName, "Local"); -+ assert.equal(runtimeAction.actionId, "runtime-check"); -+ const databaseAction = await apiJson(server.baseUrl, "/api/admin/system-health/action", { -+ body: { actionId: "database-check" }, -+ method: "POST", -+ }); -+ assert.equal(databaseAction.databaseStatus.databaseType, "Local Docker PostgreSQL"); -+ assert.equal(databaseAction.actionId, "database-check"); -+ const storageAction = await apiJson(server.baseUrl, "/api/admin/system-health/action", { -+ body: { actionId: "storage-check" }, -+ method: "POST", -+ }); -+ assert.equal(storageAction.actionId, "storage-check"); -+ assert.deepEqual( -+ storageAction.storageDiagnostics.map((row) => row.actionId), -+ [ -+ "storage-bucket-connectivity", -+ "storage-list", -+ "storage-upload-test-object", -+ "storage-read-test-object", -+ "storage-delete-test-object", -+ ], -+ ); -+ assert.equal(storageAction.storageDiagnostics.every((row) => row.environmentFolder === "/local"), true); -+ const refreshAction = await apiJson(server.baseUrl, "/api/admin/system-health/action", { -+ body: { actionId: "refresh" }, -+ method: "POST", -+ }); -+ assert.equal(refreshAction.statusSnapshot.environmentIdentity.name, "Local"); -+ const fullAction = await apiJson(server.baseUrl, "/api/admin/system-health/action", { -+ body: { actionId: "full-health-check" }, -+ method: "POST", -+ }); -+ assert.equal(fullAction.statusSnapshot.environmentIdentity.name, "Local"); - assert.equal(Array.isArray(health.operationsHealth.summaryRows), true); - assert.deepEqual( - health.operationsHealth.summaryRows.map((row) => row.area), -diff --git a/tests/playwright/tools/AdminHealthOperationsPage.spec.mjs b/tests/playwright/tools/AdminHealthOperationsPage.spec.mjs -index 021c845c5..52d7acf50 100644 ---- a/tests/playwright/tools/AdminHealthOperationsPage.spec.mjs -+++ b/tests/playwright/tools/AdminHealthOperationsPage.spec.mjs -@@ -145,6 +145,65 @@ test("Admin System Health renders Postgres diagnostics through the safe status A - await expect(page.getByRole("table", { name: "Environment map" })).toContainText("UAT"); - await expect(page.getByRole("table", { name: "Environment map" })).toContainText("PRD"); - await expect(page.getByRole("table", { name: "Environment map" }).locator("[data-health-status]")).toHaveCount(0); -+ const capabilitiesTable = page.getByRole("table", { name: "Environment capabilities" }); -+ await expect(capabilitiesTable).toContainText("Hosting"); -+ await expect(capabilitiesTable).toContainText("API"); -+ await expect(capabilitiesTable).toContainText("Database"); -+ await expect(capabilitiesTable).toContainText("Storage"); -+ await expect(capabilitiesTable).toContainText("Scheduled Monitoring"); -+ await expect(capabilitiesTable).not.toContainText("/uat"); -+ const apiContractTable = page.getByRole("table", { name: "Health API contract" }); -+ await expect(apiContractTable).toContainText("2026-06-24.system-health.v1"); -+ await expect(apiContractTable).toContainText("Current deployment only"); -+ await expect(apiContractTable).toContainText("Reference only"); -+ await expect(apiContractTable).toContainText("GET /api/admin/system-health/status"); -+ const apiRegistryTable = page.getByRole("table", { name: "Admin API registry" }); -+ await expect(apiRegistryTable).toContainText("/api/admin/system-health/status"); -+ await expect(apiRegistryTable).toContainText("/api/admin/system-health/action"); -+ await expect(apiRegistryTable).toContainText("/api/admin/infrastructure/storage-path-status"); -+ await expect(apiRegistryTable).toContainText("/api/admin/operations/status"); -+ await expect(apiRegistryTable).toContainText("/api/navigation/admin-menu"); -+ const featureFlagsTable = page.getByRole("table", { name: "Runtime feature flags" }); -+ await expect(featureFlagsTable).toContainText("system-health.api-contract"); -+ await expect(featureFlagsTable).toContainText("system-health.environment-capabilities"); -+ await expect(featureFlagsTable).toContainText("system-health.manual-actions"); -+ await expect(featureFlagsTable).toContainText("system-health.notifications"); -+ await expect(featureFlagsTable).toContainText("Not Configured"); -+ const serviceCards = page.locator("[data-admin-system-health-service-card]"); -+ await expect(serviceCards).toHaveCount(7); -+ const serviceCardText = (await serviceCards.allTextContents()).join("\n"); -+ ["Runtime", "API", "Database", "Storage", "Authentication", "Email", "Background Jobs"].forEach((label) => { -+ expect(serviceCardText).toContain(label); -+ }); -+ const serviceStatuses = await serviceCards.locator("[data-health-status]").allTextContents(); -+ expect(serviceStatuses.every((status) => ["Healthy", "Warning", "Failed", "Not Configured"].includes(status.trim()))).toBe(true); -+ const configurationTable = page.getByRole("table", { name: "Configuration summary" }); -+ await expect(configurationTable).toContainText("Current environment"); -+ await expect(configurationTable).toContainText("Hosting model"); -+ await expect(configurationTable).toContainText("Site URL"); -+ await expect(configurationTable).toContainText("API URL"); -+ await expect(configurationTable).toContainText("Database provider/type"); -+ await expect(configurationTable).toContainText("Storage provider/folder"); -+ await expect(configurationTable).toContainText("Auth provider/status"); -+ await expect(configurationTable).not.toContainText("env-secret"); -+ await expect(page.getByRole("button", { name: "Refresh" })).toBeVisible(); -+ await expect(page.getByRole("button", { name: "Run Runtime Check" })).toBeVisible(); -+ await expect(page.getByRole("button", { name: "Run Database Check" })).toBeVisible(); -+ await expect(page.getByRole("button", { name: "Run Storage Check" })).toBeVisible(); -+ await expect(page.getByRole("button", { name: "Run Full Health Check" })).toBeVisible(); -+ const scheduledTable = page.getByRole("table", { name: "Scheduled health monitoring" }); -+ await expect(scheduledTable).toContainText("Last scheduled run"); -+ await expect(scheduledTable).toContainText("Next scheduled run"); -+ await expect(scheduledTable).toContainText("Duration"); -+ await expect(scheduledTable).toContainText("Recent result"); -+ await expect(scheduledTable).toContainText("Failures/warnings"); -+ await expect(scheduledTable).toContainText("Not Configured"); -+ const notificationsTable = page.getByRole("table", { name: "Notifications and alerts" }); -+ await expect(notificationsTable).toContainText("Email alerts"); -+ await expect(notificationsTable).toContainText("Admin notifications"); -+ await expect(notificationsTable).toContainText("Webhook alerts"); -+ await expect(notificationsTable).toContainText("Messages integration"); -+ await expect(notificationsTable).toContainText("Not Configured"); - await expect(page.getByRole("table", { name: "Local API startup diagnostics" })).toContainText("Approved diagnostics format"); - await expect(page.getByRole("table", { name: "Local API startup diagnostics" })).toContainText("Environment Variables + All Runtime Ports"); - await expect(page.getByRole("table", { name: "Local API startup diagnostics" })).toContainText("Configurable multiple runtime ports"); -@@ -164,6 +223,14 @@ test("Admin System Health renders Postgres diagnostics through the safe status A - await expect(page.locator("[data-admin-system-health-storage-value='upload']")).toContainText("/dev"); - await expect(page.locator("[data-admin-system-health-storage-value='read']")).not.toHaveText("Health object"); - await expect(page.locator("[data-admin-system-health-storage-value='delete']")).not.toHaveText("Health object"); -+ await expect(page.getByRole("table", { name: "Runtime health" })).toContainText("Runtime Health"); -+ await expect(page.locator("[data-admin-system-health-runtime-health-value='environment']")).toHaveText("DEV"); -+ await expect(page.locator("[data-admin-system-health-runtime-health-value='appVersion']")).toHaveText("1.0.0"); -+ await expect(page.locator("[data-admin-system-health-runtime-health-value='apiVersion']")).toHaveText("1.0.0"); -+ await expect(page.locator("[data-admin-system-health-runtime-health-value='nodeVersion']")).toContainText("v"); -+ await expect(page.locator("[data-admin-system-health-runtime-health-value='serverStartTime']")).not.toHaveText("Loading"); -+ await expect(page.locator("[data-admin-system-health-runtime-health-value='uptime']")).toContainText("s"); -+ await expect(page.locator("[data-admin-system-health-runtime-health-value='lastChecked']")).not.toHaveText("Loading"); - const historyTable = page.getByRole("table", { name: "Health check history" }); - await expect(historyTable).toContainText("DEV"); - await expect(historyTable).toContainText("Environment Summary"); -@@ -210,6 +277,9 @@ test("Admin System Health renders Postgres diagnostics through the safe status A - } - expect(context.requestUrls.some((url) => url.includes("/api/admin/system-health/status"))).toBe(true); - expect(context.requestUrls.filter((url) => url.includes("/api/admin/system-health/storage-connectivity-action"))).toHaveLength(5); -+ await page.getByRole("button", { name: "Run Runtime Check" }).click(); -+ await expect(page.getByRole("table", { name: "Manual health action results" })).toContainText("Run Runtime Check"); -+ expect(context.requestUrls.some((url) => url.includes("/api/admin/system-health/action"))).toBe(true); - await expectClientToHideSecretValues(page, context); - await expect(page.locator("[data-admin-system-health-storage-action]")).toHaveCount(0); - await expect(page.locator("[data-owner-ai-save], [data-owner-membership-save], [data-owner-ai-credits], [data-owner-memberships]")).toHaveCount(0); -@@ -251,6 +321,16 @@ test("Admin System Health operations page keeps scripts and styles external", as - expect(pageSource).not.toContain("SQLite"); - expect(pageSource).toContain("Environment Identity"); - expect(pageSource).toContain("Environment Map"); -+ expect(pageSource).toContain("Environment Capabilities"); -+ expect(pageSource).toContain("Health API Contract"); -+ expect(pageSource).toContain("Admin API Registry"); -+ expect(pageSource).toContain("Runtime Feature Flags"); -+ expect(pageSource).toContain("Service Health"); -+ expect(pageSource).toContain("Configuration Summary"); -+ expect(pageSource).toContain("Manual Health Actions"); -+ expect(pageSource).toContain("Scheduled Health Monitoring"); -+ expect(pageSource).toContain("Notifications & Alerts"); -+ expect(pageSource).toContain("Runtime Health"); - expect(pageSource).toContain("Diagnostics Plan"); - expect(pageSource).toContain("Local API Startup Diagnostics"); - expect(pageSource).toContain("Server-owned Postgres health reader"); -@@ -261,5 +341,6 @@ test("Admin System Health operations page keeps scripts and styles external", as - expect(runtimeSource).not.toContain("SQLite"); - expect(runtimeSource).not.toContain("localStorage"); - expect(runtimeSource).not.toContain("sessionStorage"); -+ expect(runtimeSource).toContain("runAdminSystemHealthAction"); - expect(runtimeSource).toContain("runAdminSystemHealthStorageConnectivityAction"); - }); +@@ -1,78 +1,3 @@ +-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 ++docs_build/dev/reports/PR_26175_OWNER_057-final-five-pr-decision-plan.md / added ++docs_build/dev/reports/codex_changed_files.txt / updated ++docs_build/dev/reports/codex_review.diff / updated
Health Check History