Skip to content

Commit 8455fb6

Browse files
committed
Expand System Health R2 validation
1 parent da879b9 commit 8455fb6

16 files changed

Lines changed: 851 additions & 511 deletions

admin/system-health.html

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -316,16 +316,17 @@ <h3>Manual Health Actions</h3>
316316
<tr>
317317
<th scope="col">Check</th>
318318
<th scope="col">Target</th>
319+
<th scope="col">Timing</th>
319320
<th scope="col">Status</th>
320321
</tr>
321322
</thead>
322323
<tbody>
323-
<tr><td>Bucket connectivity</td><td data-admin-system-health-storage-value="bucket">Loading</td><td data-health-status="PENDING" data-admin-system-health-storage-status="bucket" title="Reason: R2 bucket connectivity has not loaded yet." aria-label="PENDING: R2 bucket connectivity has not loaded yet.">PENDING</td></tr>
324-
<tr><td>List</td><td data-admin-system-health-storage-value="list">Loading</td><td data-health-status="PENDING" data-admin-system-health-storage-status="list" title="Reason: R2 list check has not loaded yet." aria-label="PENDING: R2 list check has not loaded yet.">PENDING</td></tr>
325-
<tr><td>Upload</td><td data-admin-system-health-storage-value="upload">Loading</td><td data-health-status="PENDING" data-admin-system-health-storage-status="upload" title="Reason: R2 upload check has not loaded yet." aria-label="PENDING: R2 upload check has not loaded yet.">PENDING</td></tr>
326-
<tr><td>Read</td><td data-admin-system-health-storage-value="read">Loading</td><td data-health-status="PENDING" data-admin-system-health-storage-status="read" title="Reason: R2 read check has not loaded yet." aria-label="PENDING: R2 read check has not loaded yet.">PENDING</td></tr>
327-
<tr><td>Delete</td><td data-admin-system-health-storage-value="delete">Loading</td><td data-health-status="PENDING" data-admin-system-health-storage-status="delete" title="Reason: R2 delete check has not loaded yet." aria-label="PENDING: R2 delete check has not loaded yet.">PENDING</td></tr>
328-
<tr><td>Last checked</td><td data-admin-system-health-storage-value="lastChecked">Loading</td><td data-health-status="PENDING" data-admin-system-health-storage-status="lastChecked" title="Reason: R2 health has not loaded yet." aria-label="PENDING: R2 health has not loaded yet.">PENDING</td></tr>
324+
<tr><td>Bucket connectivity</td><td data-admin-system-health-storage-value="bucket">Loading</td><td data-admin-system-health-storage-timing="bucket">Loading</td><td data-health-status="PENDING" data-admin-system-health-storage-status="bucket" title="Reason: R2 bucket connectivity has not loaded yet." aria-label="PENDING: R2 bucket connectivity has not loaded yet.">PENDING</td></tr>
325+
<tr><td>List</td><td data-admin-system-health-storage-value="list">Loading</td><td data-admin-system-health-storage-timing="list">Loading</td><td data-health-status="PENDING" data-admin-system-health-storage-status="list" title="Reason: R2 list check has not loaded yet." aria-label="PENDING: R2 list check has not loaded yet.">PENDING</td></tr>
326+
<tr><td>Upload</td><td data-admin-system-health-storage-value="upload">Loading</td><td data-admin-system-health-storage-timing="upload">Loading</td><td data-health-status="PENDING" data-admin-system-health-storage-status="upload" title="Reason: R2 upload check has not loaded yet." aria-label="PENDING: R2 upload check has not loaded yet.">PENDING</td></tr>
327+
<tr><td>Read</td><td data-admin-system-health-storage-value="read">Loading</td><td data-admin-system-health-storage-timing="read">Loading</td><td data-health-status="PENDING" data-admin-system-health-storage-status="read" title="Reason: R2 read check has not loaded yet." aria-label="PENDING: R2 read check has not loaded yet.">PENDING</td></tr>
328+
<tr><td>Delete</td><td data-admin-system-health-storage-value="delete">Loading</td><td data-admin-system-health-storage-timing="delete">Loading</td><td data-health-status="PENDING" data-admin-system-health-storage-status="delete" title="Reason: R2 delete check has not loaded yet." aria-label="PENDING: R2 delete check has not loaded yet.">PENDING</td></tr>
329+
<tr><td>Last checked</td><td data-admin-system-health-storage-value="lastChecked">Loading</td><td data-admin-system-health-storage-timing="lastChecked">Loading</td><td data-health-status="PENDING" data-admin-system-health-storage-status="lastChecked" title="Reason: R2 health has not loaded yet." aria-label="PENDING: R2 health has not loaded yet.">PENDING</td></tr>
329330
</tbody>
330331
</table>
331332
</div>

assets/theme-v2/js/admin-system-health.js

Lines changed: 33 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import {
22
readAdminSystemHealthStatus,
33
runAdminSystemHealthAction,
4-
runAdminSystemHealthStorageConnectivityAction,
4+
runAdminSystemHealthStorageExpandedValidation,
55
} from "../../../src/api/admin-system-health-api-client.js";
66
import {
77
applyStatusNode,
@@ -54,6 +54,10 @@ class AdminSystemHealthController {
5454
node.dataset.adminSystemHealthStorageStatus,
5555
node,
5656
]));
57+
this.storageTimings = new Map(Array.from(root.querySelectorAll("[data-admin-system-health-storage-timing]")).map((node) => [
58+
node.dataset.adminSystemHealthStorageTiming,
59+
node,
60+
]));
5761
this.runtimeHealthValues = new Map(Array.from(root.querySelectorAll("[data-admin-system-health-runtime-health-value]")).map((node) => [
5862
node.dataset.adminSystemHealthRuntimeHealthValue,
5963
node,
@@ -122,6 +126,13 @@ class AdminSystemHealthController {
122126
this.setStatusNode(node, status, reason);
123127
}
124128

129+
setStorageTiming(key, value, fallback) {
130+
const node = this.storageTimings.get(key);
131+
if (node) {
132+
node.textContent = asText(value, fallback);
133+
}
134+
}
135+
125136
setRuntimeHealthValue(key, value, fallback) {
126137
const node = this.runtimeHealthValues.get(key);
127138
if (node) {
@@ -195,6 +206,7 @@ class AdminSystemHealthController {
195206
renderStoragePending(reason) {
196207
["bucket", "list", "upload", "read", "delete", "lastChecked"].forEach((key) => {
197208
this.setStorageStatus(key, "PENDING", reason);
209+
this.setStorageTiming(key, "not available");
198210
});
199211
this.renderRuntimePending(reason);
200212
}
@@ -261,8 +273,10 @@ class AdminSystemHealthController {
261273
const reason = storageStatus.message || "Cloudflare R2 configuration status returned by the safe Admin System Health API.";
262274
this.setStorageValue("bucket", storageStatus.environmentFolder ? `${storageStatus.bucket || "not configured"} ${storageStatus.environmentFolder}` : storageStatus.bucket, "not configured");
263275
this.setStorageStatus("bucket", storageStatus.bucketStatus || storageStatus.status, reason);
276+
this.setStorageTiming("bucket", storageStatus.lastChecked ? "configuration status" : "not available");
264277
this.setStorageValue("lastChecked", storageStatus.lastChecked, "not available");
265278
this.setStorageStatus("lastChecked", storageStatus.lastChecked ? "PASS" : "WARN", reason);
279+
this.setStorageTiming("lastChecked", storageStatus.lastChecked ? "configuration status" : "not available");
266280
}
267281

268282
renderRuntimeHealthPending(reason) {
@@ -684,9 +698,11 @@ class AdminSystemHealthController {
684698
}
685699
this.setStorageValue(key, this.storageResultTarget(result));
686700
this.setStorageStatus(key, result.status, result.message || "R2 diagnostic returned without a message.");
701+
this.setStorageTiming(key, Number.isFinite(Number(result.durationMs)) ? `${result.durationMs} ms` : "not available");
687702
if (result.lastChecked) {
688703
this.setStorageValue("lastChecked", result.lastChecked);
689704
this.setStorageStatus("lastChecked", "PASS", "Most recent current-environment R2 health check timestamp.");
705+
this.setStorageTiming("lastChecked", Number.isFinite(Number(result.durationMs)) ? `${result.durationMs} ms` : "not available");
690706
}
691707
}
692708

@@ -732,15 +748,24 @@ class AdminSystemHealthController {
732748
runStorageDiagnostics() {
733749
STORAGE_DIAGNOSTIC_ACTIONS.forEach(({ key }) => {
734750
this.setStorageStatus(key, "PENDING", "R2 diagnostic is running through the safe Admin System Health API.");
751+
this.setStorageTiming(key, "running");
735752
});
736-
STORAGE_DIAGNOSTIC_ACTIONS.forEach(({ actionId, key }) => {
737-
try {
738-
this.renderStorageResult(key, runAdminSystemHealthStorageConnectivityAction(actionId));
739-
} catch (error) {
740-
const message = error instanceof Error ? error.message : "Safe R2 diagnostic API is unavailable.";
753+
try {
754+
const validation = runAdminSystemHealthStorageExpandedValidation();
755+
const diagnostics = Array.isArray(validation.storageDiagnostics) ? validation.storageDiagnostics : [];
756+
diagnostics.forEach((storageResult) => {
757+
const key = STORAGE_DIAGNOSTIC_ACTION_KEY_BY_ID.get(storageResult.actionId);
758+
if (key) {
759+
this.renderStorageResult(key, storageResult);
760+
}
761+
});
762+
} catch (error) {
763+
const message = error instanceof Error ? error.message : "Safe R2 diagnostic API is unavailable.";
764+
STORAGE_DIAGNOSTIC_ACTIONS.forEach(({ key }) => {
741765
this.setStorageStatus(key, "PENDING", message);
742-
}
743-
});
766+
this.setStorageTiming(key, "not available");
767+
});
768+
}
744769
}
745770

746771
createCell(text) {
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
# PR_26177_CHARLIE_030-r2-storage-health-expanded-validation
2+
3+
Team: Charlie
4+
Branch: pr/26177-CHARLIE-030-r2-storage-health-expanded-validation
5+
Base: pr/26177-CHARLIE-029-system-health-postgres-metrics-panel
6+
Lifecycle: Build / Validation
7+
Repair: Rebased onto repaired PR_26177_CHARLIE_029 branch on 2026-06-25.
8+
9+
## Scope
10+
- Expanded System Health R2 validation into an API-owned current-environment validation run.
11+
- Added safe list/upload/read/delete diagnostics with duration, operation label, cleanup status, and permanent-object metadata.
12+
- Updated the System Health UI to show storage timing without adding inline styles, script blocks, or page-local CSS.
13+
14+
## Changed Files
15+
- admin/system-health.html
16+
- assets/theme-v2/js/admin-system-health.js
17+
- src/api/admin-system-health-api-client.js
18+
- src/dev-runtime/server/local-api-router.mjs
19+
- tests/api/admin-system-health/contract.test.mjs
20+
- tests/dev-runtime/AdminHealthOperations.test.mjs
21+
- tests/playwright/tools/AdminHealthOperationsPage.spec.mjs
22+
- docs_build/dev/reports/coverage_changed_js_guardrail.txt
23+
- docs_build/dev/reports/playwright_v8_coverage_report.txt
24+
25+
## Validation
26+
- PASS: node --check src/dev-runtime/server/local-api-router.mjs
27+
- PASS: node --check assets/theme-v2/js/admin-system-health.js
28+
- PASS: node --check src/api/admin-system-health-api-client.js
29+
- PASS: node --test tests/api/admin-system-health/contract.test.mjs
30+
- PASS: node --test tests/dev-runtime/AdminHealthOperations.test.mjs
31+
- PASS: npx playwright test tests/playwright/tools/AdminHealthOperationsPage.spec.mjs --workers=1 --reporter=line
32+
- PASS: git diff --check
33+
34+
## ZIP
35+
- Generated after repair: C:\Users\DavidQ\Documents\GitHub\HTML-JavaScript-Gaming\tmp\PR_26177_CHARLIE_030-r2-storage-health-expanded-validation_delta.zip
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
# PR_26177_CHARLIE_030-r2-storage-health-expanded-validation Branch Validation
2+
3+
Branch: pr/26177-CHARLIE-030-r2-storage-health-expanded-validation
4+
Expected stack base: pr/26177-CHARLIE-029-system-health-postgres-metrics-panel
5+
Current status at validation:
6+
## pr/26177-CHARLIE-030-r2-storage-health-expanded-validation
7+
Updated onto repaired PR_26177_CHARLIE_029 stack base.
8+
9+
Result: PASS
10+
11+
Checks:
12+
- PASS: Branch created from PR 029 branch for the approved stacked chain.
13+
- PASS: Active branch matches PR identity.
14+
- PASS: Worktree contained only scoped PR changes and generated validation reports.
15+
- PASS: Branch is based on repaired PR 029 branch.
16+
- PASS: Rebase conflict scope was generated report artifacts only.
17+
- PASS: No start_of_day files modified.
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
# PR_26177_CHARLIE_030-r2-storage-health-expanded-validation Manual Validation Notes
2+
3+
- Confirmed the browser calls one expanded R2 validation action instead of owning the list/upload/read/delete sequence itself.
4+
- Confirmed Storage Health displays timing values for list, upload, read, and delete rows.
5+
- Confirmed storage validation payload includes cleanup status and permanent-object metadata.
6+
- Confirmed storage diagnostics stay scoped to the current environment folder.
7+
- Confirmed no storage credentials or secrets are displayed.
8+
- Confirmed branch repair conflict was limited to generated report artifacts.
9+
- Confirmed no start_of_day files changed.
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
# PR_26177_CHARLIE_030-r2-storage-health-expanded-validation Requirement Checklist
2+
3+
- PASS: Expanded Cloud/R2 storage health validation.
4+
- PASS: Included safe bucket/list/write/read/delete validation through API-owned action contract.
5+
- PASS: Included timing/status fields where available.
6+
- PASS: Does not create browser-owned storage health state.
7+
- PASS: Test object cleanup is attempted in the same expanded validation run.
8+
- PASS: Does not expose secrets.
9+
- PASS: Current environment folder only.
10+
- PASS: No unrelated files modified.
11+
- PASS: No start_of_day files modified.
12+
- PASS: Rebased onto repaired PR_26177_CHARLIE_029 branch.
13+
- PASS: Shows unavailable/not configured states explicitly.
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
# PR_26177_CHARLIE_030-r2-storage-health-expanded-validation Validation Lane Report
2+
3+
Impacted lanes:
4+
- runtime: Local API Admin System Health R2 action contract.
5+
- contract: Admin System Health API contract tests.
6+
- UI: Admin System Health Theme V2 page controller and markup.
7+
- Playwright: targeted Admin System Health page spec.
8+
9+
Commands:
10+
- PASS: node --check src/dev-runtime/server/local-api-router.mjs
11+
- PASS: node --check assets/theme-v2/js/admin-system-health.js
12+
- PASS: node --check src/api/admin-system-health-api-client.js
13+
- PASS: node --test tests/api/admin-system-health/contract.test.mjs
14+
- PASS: node --test tests/dev-runtime/AdminHealthOperations.test.mjs
15+
- PASS: npx playwright test tests/playwright/tools/AdminHealthOperationsPage.spec.mjs --workers=1 --reporter=line
16+
- PASS: git diff --check
17+
18+
Skipped lanes:
19+
- Full samples smoke skipped; not impacted by System Health storage diagnostics.
20+
- Full Project Workspace suite skipped; targeted Admin/System Health coverage was sufficient for this scoped page/API change.
21+
22+
Result: PASS
Lines changed: 30 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -1,44 +1,45 @@
1-
# git diff --name-only origin/main --
1+
# git diff --name-only pr/26177-CHARLIE-029-system-health-postgres-metrics-panel --
22
admin/system-health.html
33
assets/theme-v2/js/admin-system-health.js
4-
docs_build/dev/reports/PR_26177_CHARLIE_029-system-health-postgres-metrics-panel.md
5-
docs_build/dev/reports/PR_26177_CHARLIE_029-system-health-postgres-metrics-panel_branch-validation.md
6-
docs_build/dev/reports/PR_26177_CHARLIE_029-system-health-postgres-metrics-panel_manual-validation-notes.md
7-
docs_build/dev/reports/PR_26177_CHARLIE_029-system-health-postgres-metrics-panel_requirements-checklist.md
8-
docs_build/dev/reports/PR_26177_CHARLIE_029-system-health-postgres-metrics-panel_validation-lane.md
4+
docs_build/dev/reports/PR_26177_CHARLIE_030-r2-storage-health-expanded-validation.md
5+
docs_build/dev/reports/PR_26177_CHARLIE_030-r2-storage-health-expanded-validation_branch-validation.md
6+
docs_build/dev/reports/PR_26177_CHARLIE_030-r2-storage-health-expanded-validation_manual-validation-notes.md
7+
docs_build/dev/reports/PR_26177_CHARLIE_030-r2-storage-health-expanded-validation_requirements-checklist.md
8+
docs_build/dev/reports/PR_26177_CHARLIE_030-r2-storage-health-expanded-validation_validation-lane.md
99
docs_build/dev/reports/codex_changed_files.txt
1010
docs_build/dev/reports/codex_review.diff
1111
docs_build/dev/reports/coverage_changed_js_guardrail.txt
1212
docs_build/dev/reports/playwright_v8_coverage_report.txt
13+
src/api/admin-system-health-api-client.js
1314
src/dev-runtime/server/local-api-router.mjs
1415
tests/api/admin-system-health/contract.test.mjs
1516
tests/dev-runtime/AdminHealthOperations.test.mjs
1617
tests/playwright/tools/AdminHealthOperationsPage.spec.mjs
1718

1819
# git status --short
19-
M docs_build/dev/reports/PR_26177_CHARLIE_029-system-health-postgres-metrics-panel.md
20-
M docs_build/dev/reports/PR_26177_CHARLIE_029-system-health-postgres-metrics-panel_branch-validation.md
21-
M docs_build/dev/reports/PR_26177_CHARLIE_029-system-health-postgres-metrics-panel_manual-validation-notes.md
22-
M docs_build/dev/reports/PR_26177_CHARLIE_029-system-health-postgres-metrics-panel_requirements-checklist.md
23-
M docs_build/dev/reports/PR_26177_CHARLIE_029-system-health-postgres-metrics-panel_validation-lane.md
20+
M docs_build/dev/reports/PR_26177_CHARLIE_030-r2-storage-health-expanded-validation.md
21+
M docs_build/dev/reports/PR_26177_CHARLIE_030-r2-storage-health-expanded-validation_branch-validation.md
22+
M docs_build/dev/reports/PR_26177_CHARLIE_030-r2-storage-health-expanded-validation_manual-validation-notes.md
23+
M docs_build/dev/reports/PR_26177_CHARLIE_030-r2-storage-health-expanded-validation_requirements-checklist.md
24+
M docs_build/dev/reports/PR_26177_CHARLIE_030-r2-storage-health-expanded-validation_validation-lane.md
2425
M docs_build/dev/reports/codex_review.diff
25-
M docs_build/dev/reports/coverage_changed_js_guardrail.txt
2626
M docs_build/dev/reports/playwright_v8_coverage_report.txt
2727

28-
# git diff --stat origin/main --
29-
admin/system-health.html | 16 +
30-
assets/theme-v2/js/admin-system-health.js | 42 ++
31-
...LIE_029-system-health-postgres-metrics-panel.md | 39 +
32-
...lth-postgres-metrics-panel_branch-validation.md | 17 +
33-
...stgres-metrics-panel_manual-validation-notes.md | 9 +
34-
...ostgres-metrics-panel_requirements-checklist.md | 16 +
35-
...ealth-postgres-metrics-panel_validation-lane.md | 21 +
36-
docs_build/dev/reports/codex_changed_files.txt | 42 +-
37-
docs_build/dev/reports/codex_review.diff | 794 +++++++++++++++------
38-
.../dev/reports/coverage_changed_js_guardrail.txt | 4 +-
39-
.../dev/reports/playwright_v8_coverage_report.txt | 24 +-
40-
src/dev-runtime/server/local-api-router.mjs | 115 ++-
41-
tests/api/admin-system-health/contract.test.mjs | 15 +
42-
tests/dev-runtime/AdminHealthOperations.test.mjs | 20 +
43-
.../tools/AdminHealthOperationsPage.spec.mjs | 11 +
44-
15 files changed, 924 insertions(+), 261 deletions(-)
28+
# git diff --stat pr/26177-CHARLIE-029-system-health-postgres-metrics-panel --
29+
admin/system-health.html | 13 +-
30+
assets/theme-v2/js/admin-system-health.js | 41 +-
31+
...IE_030-r2-storage-health-expanded-validation.md | 35 +
32+
...health-expanded-validation_branch-validation.md | 17 +
33+
...-expanded-validation_manual-validation-notes.md | 9 +
34+
...h-expanded-validation_requirements-checklist.md | 13 +
35+
...e-health-expanded-validation_validation-lane.md | 22 +
36+
docs_build/dev/reports/codex_changed_files.txt | 70 +-
37+
docs_build/dev/reports/codex_review.diff | 988 +++++++++++----------
38+
.../dev/reports/coverage_changed_js_guardrail.txt | 6 +-
39+
.../dev/reports/playwright_v8_coverage_report.txt | 17 +-
40+
src/api/admin-system-health-api-client.js | 4 +
41+
src/dev-runtime/server/local-api-router.mjs | 105 ++-
42+
tests/api/admin-system-health/contract.test.mjs | 19 +
43+
tests/dev-runtime/AdminHealthOperations.test.mjs | 6 +
44+
.../tools/AdminHealthOperationsPage.spec.mjs | 8 +-
45+
16 files changed, 851 insertions(+), 522 deletions(-)

0 commit comments

Comments
 (0)