From fe1d03450485b1987d4d0e7b5562fb36afe30e03 Mon Sep 17 00:00:00 2001 From: Codex Date: Thu, 4 Jun 2026 17:31:15 +0000 Subject: [PATCH] fix: relax hwlab v02 web asset probe --- scripts/hwlab-g14-contract-test.ts | 16 ++++++++++++++++ scripts/src/hwlab-g14.ts | 8 ++++++-- 2 files changed, 22 insertions(+), 2 deletions(-) diff --git a/scripts/hwlab-g14-contract-test.ts b/scripts/hwlab-g14-contract-test.ts index b66e2523..e230a9be 100644 --- a/scripts/hwlab-g14-contract-test.ts +++ b/scripts/hwlab-g14-contract-test.ts @@ -174,6 +174,7 @@ assertCondition(gitMirrorSummary.githubInSync === false, "git mirror status summ assertCondition(gitMirrorSummary.sourceInSync === true && gitMirrorSummary.gitopsInSync === false, "git mirror status must split source and gitops GitHub sync state", gitMirrorSummary); const renderScript = v02ControlPlaneRenderScript("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"); const renderScriptHash = v02ControlPlaneRefreshScriptHash("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"); +const sourceText = await Bun.file(new URL("./src/hwlab-g14.ts", import.meta.url)).text(); assertCondition( renderScript.includes("git clone --shared --no-checkout \"$cicd_repo\" \"$worktree_dir\"") && renderScript.includes("git -C \"$worktree_dir\" checkout --detach \"$source_commit\"") @@ -275,6 +276,21 @@ assertCondition( "v0.2 PipelineRun service matrix must not build hwlab-cli because cli is short-connection source tool", v02PipelineServiceIds(), ); +assertCondition( + sourceText.includes("curl -fsS --connect-timeout 2 --max-time 10") + && !sourceText.includes("curl -fsS --connect-timeout 2 --max-time 5"), + "v0.2 web asset probes must not use a 5s app.js timeout that creates false deployment failures", +); +assertCondition( + sourceText.includes("printf 'probeElapsedMs\\\\t%s\\\\n'") + && sourceText.includes("probeElapsedMs: numericField(fields.probeElapsedMs)"), + "v0.2 web asset probes must expose probeElapsedMs for timeout diagnostics", +); +assertCondition( + sourceText.includes("probe_start_s=$(date +%s") + && !sourceText.includes("date +%s%3N"), + "v0.2 web asset elapsed timing must avoid non-portable date +%s%3N in k3s probe shells", +); const staleSuccessAlignment = v02CommitAlignment({ expectedSourceHead: "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", diff --git a/scripts/src/hwlab-g14.ts b/scripts/src/hwlab-g14.ts index 304ddc02..5c95ec23 100644 --- a/scripts/src/hwlab-g14.ts +++ b/scripts/src/hwlab-g14.ts @@ -1073,15 +1073,16 @@ function v02WebAssetsProbeScript(): string { `api=${shellQuote(V02_CLOUD_API_URL)}`, "fetch_url() {", " if command -v curl >/dev/null 2>&1; then", - " curl -fsS --connect-timeout 2 --max-time 5 \"$1\"", + " curl -fsS --connect-timeout 2 --max-time 10 \"$1\"", " elif command -v wget >/dev/null 2>&1; then", - " wget -q -T 5 -O - \"$1\"", + " wget -q -T 10 -O - \"$1\"", " else", " return 127", " fi", "}", "printf 'baseUrl\\t%s\\n' \"$base\"", "printf 'apiUrl\\t%s\\n' \"$api\"", + "probe_start_s=$(date +%s 2>/dev/null || printf '0')", "html=$(fetch_url \"$base/\" 2>/dev/null)", "html_code=$?", "printf 'htmlOk\\t%s\\n' \"$html_code\"", @@ -1102,8 +1103,10 @@ function v02WebAssetsProbeScript(): string { "printf 'cssBytes\\t%s\\n' \"$(printf '%s' \"$css\" | wc -c | tr -d ' ')\"", "app_js=$(fetch_url \"$base/app.js\" 2>/dev/null)", "app_js_code=$?", + "probe_end_s=$(date +%s 2>/dev/null || printf '0')", "printf 'appJsOk\\t%s\\n' \"$app_js_code\"", "printf 'appJsBytes\\t%s\\n' \"$(printf '%s' \"$app_js\" | wc -c | tr -d ' ')\"", + "printf 'probeElapsedMs\\t%s\\n' \"$(((probe_end_s - probe_start_s) * 1000))\"", "fetch_url \"$base/styles.css\" >/dev/null 2>&1", "legacy_styles_code=$?", "if [ \"$legacy_styles_code\" = \"0\" ]; then legacy_styles_absent=1; else legacy_styles_absent=0; fi", @@ -1284,6 +1287,7 @@ function v02WebAssetsFromText( css: numericField(fields.cssBytes), appJs: numericField(fields.appJsBytes), }, + probeElapsedMs: numericField(fields.probeElapsedMs), apiRevision, note: webAssetsRevisionNote(apiRevision, sourceCommit, activePipelineRuns), exitCode,