From 60fa729f326017e5842b227af93415da88ae6743 Mon Sep 17 00:00:00 2001 From: Claude Date: Fri, 31 Jul 2026 06:37:33 +0000 Subject: [PATCH 1/2] ci(temporal-conformance): wrap both skewed-zone test steps in run-with-stall-guard (#4331) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The two Temporal Conformance test legs still ran bare after #4298 gave Test Core the stall guard, so a mid-suite stall burned the full 30-minute job timeout and ended as an uninformative "The operation was canceled" (#4331: once frozen mid-file in core's kernel.test, once silent for 24 minutes after every suite printed Done). Same wiring and parameters as Test Core: silence past 10 minutes becomes a labeled red naming the last output line, and the guard's process-group kill covers the refused-to-exit shape too. The zone-assert node -e lines stay outside the wrapper — a one-shot print cannot stall. Closes #4331 Co-Authored-By: Claude Fable 5 Claude-Session: https://claude.ai/code/session_01HXjVcohpYTsZY7D5p91dJQ --- .github/workflows/ci.yml | 34 ++++++++++++++++++++++++++-------- 1 file changed, 26 insertions(+), 8 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 9dbecfcd13..4cb3a20bb5 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -312,6 +312,19 @@ jobs: # The whole driver-sql suite runs under the skewed process zone — not # just the live-server files — so a TZ-sensitive assumption anywhere in # the driver's tests fails here before it can ship. + # + # run-with-stall-guard: same wiring as Test Core (see the comment there; + # #4250). Both of this job's test legs have hit the same nondeterministic + # stall (#4331) — once frozen mid-file in core's kernel.test, once silent + # for 24 minutes AFTER every suite printed `Done` (a process that never + # exited) — and each burned the full 30-minute job timeout to end as an + # uninformative "The operation was canceled". The guard watches output + # silence, so both shapes become a labeled red naming the last line after + # 10 quiet minutes, and its process-group kill takes down whatever + # refused to exit. `--log` is the guard's own tee (mandatory); no + # completeness guard reads these files yet. The zone-assert `node -e` + # stays outside the wrapper: a one-shot print cannot stall, and the + # guard should time the suite only. - name: Run driver-sql suite against both live servers env: TZ: America/New_York @@ -323,7 +336,8 @@ jobs: # everything still passes — the same vacuous-pass hole the live-server # suites close by asserting a non-UTC SERVER. node -e "const tz=Intl.DateTimeFormat().resolvedOptions().timeZone,off=new Date().getTimezoneOffset();if(!tz||tz==='UTC'||off===0){console.error('process zone is '+tz+' (offset '+off+') — this job must run skewed');process.exit(1)}console.log('process zone: '+tz+' (offset '+off+')')" - pnpm --filter @objectstack/driver-sql test + node scripts/run-with-stall-guard.mjs --log "$RUNNER_TEMP/temporal-driver-sql.log" --stall-minutes 10 -- \ + pnpm --filter @objectstack/driver-sql test # The non-SQL half of the same axis. `driver-sql` has run under a skewed # process zone since #3979, but the other backends the temporal @@ -359,13 +373,17 @@ jobs: # everything still passes — the same vacuous-pass hole the live-server # suites close by asserting a non-UTC SERVER. node -e "const tz=Intl.DateTimeFormat().resolvedOptions().timeZone,off=new Date().getTimezoneOffset();if(!tz||tz==='UTC'||off===0){console.error('process zone is '+tz+' (offset '+off+') — this job must run skewed');process.exit(1)}console.log('process zone: '+tz+' (offset '+off+')')" - pnpm \ - --filter @objectstack/core \ - --filter @objectstack/formula \ - --filter @objectstack/driver-memory \ - --filter @objectstack/driver-mongodb \ - --filter @objectstack/service-analytics \ - test + # Stall guard: same wiring and rationale as the driver-sql step above + # (#4250/#4331) — the "silent after every suite printed Done" + # occurrence was on THIS leg. + node scripts/run-with-stall-guard.mjs --log "$RUNNER_TEMP/temporal-non-sql.log" --stall-minutes 10 -- \ + pnpm \ + --filter @objectstack/core \ + --filter @objectstack/formula \ + --filter @objectstack/driver-memory \ + --filter @objectstack/driver-mongodb \ + --filter @objectstack/service-analytics \ + test dogfood: # Sharded 2-way: the suite is ~60 independent test files, each booting its From a3822f1d4503908454c7318a0b842670a57915ab Mon Sep 17 00:00:00 2001 From: Claude Date: Fri, 31 Jul 2026 06:38:47 +0000 Subject: [PATCH 2/2] =?UTF-8?q?chore:=20empty=20changeset=20=E2=80=94=20CI?= =?UTF-8?q?-only=20change,=20releases=20nothing?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Fable 5 Claude-Session: https://claude.ai/code/session_01HXjVcohpYTsZY7D5p91dJQ --- .changeset/temporal-conformance-stall-guard.md | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 .changeset/temporal-conformance-stall-guard.md diff --git a/.changeset/temporal-conformance-stall-guard.md b/.changeset/temporal-conformance-stall-guard.md new file mode 100644 index 0000000000..e9f0dca79d --- /dev/null +++ b/.changeset/temporal-conformance-stall-guard.md @@ -0,0 +1,4 @@ +--- +--- + +ci: wrap the Temporal Conformance job's two skewed-zone test steps in run-with-stall-guard (#4331). CI-only — releases nothing.