From bfeca2fd52ac52b63a662c445722914b5ba5302c Mon Sep 17 00:00:00 2001 From: Libby Date: Wed, 11 Nov 2026 20:57:16 +0000 Subject: [PATCH 1/3] Portability CI: use the runner image's Node and Python, job timeout 60 Co-Authored-By: Claude Sonnet 5.5 --- .github/workflows/cultmesh-portability.yml | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/.github/workflows/cultmesh-portability.yml b/.github/workflows/cultmesh-portability.yml index 959171ce..3755c629 100644 --- a/.github/workflows/cultmesh-portability.yml +++ b/.github/workflows/cultmesh-portability.yml @@ -25,7 +25,8 @@ jobs: reactive-and-resource-lifetime: name: ${{ matrix.os }} reactive semantics and leases runs-on: ${{ matrix.os }} - timeout-minutes: 30 + # The forge runner cap is 60 minutes; the job value must match or the job dies at the lower of the two. + timeout-minutes: 60 strategy: fail-fast: false matrix: @@ -45,17 +46,31 @@ jobs: with: dotnet-version: 10.0.x + # The forge runner image (catthehacker/ubuntu:act-latest) carries Node 24 and Python 3.12 on PATH, and these two + # setup actions downloaded them again from github.com anyway (about 2.7 and 2.8 minutes, run 639) because the + # image's tool cache is not the one they read. They run only where the image does not carry the tools (the + # workflow_dispatch Windows leg); the check below fails a Linux image that stops carrying them. - name: Set up Node.js + if: runner.os != 'Linux' uses: actions/setup-node@v4 with: node-version: 24 cache: npm - name: Set up Python + if: runner.os != 'Linux' uses: actions/setup-python@v5 with: python-version: "3.12" + - name: Check the image carries Node 24 and Python 3.12 + if: runner.os == 'Linux' + shell: bash + run: | + set -euo pipefail + node --version | grep -E '^v24\.' + python --version | grep -E '^Python 3\.12\.' + - name: Install TypeScript workspace dependencies run: npm install --no-package-lock -- 2.47.3 From 44f54b80154f813f57b13ca2e9a5242c2bb824c0 Mon Sep 17 00:00:00 2001 From: Libby Date: Wed, 11 Nov 2026 21:11:09 +0000 Subject: [PATCH 2/3] Portability CI: install the Python packages into a venv (the image's Python is externally managed) Co-Authored-By: Claude Sonnet 5.5 --- .github/workflows/cultmesh-portability.yml | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/.github/workflows/cultmesh-portability.yml b/.github/workflows/cultmesh-portability.yml index 3755c629..a48583bc 100644 --- a/.github/workflows/cultmesh-portability.yml +++ b/.github/workflows/cultmesh-portability.yml @@ -71,6 +71,16 @@ jobs: node --version | grep -E '^v24\.' python --version | grep -E '^Python 3\.12\.' + # The image's Python is distro-managed (PEP 668): pip refuses to install into it, so the Linux leg installs the + # CultLib packages into a venv under RUNNER_TEMP that later steps find first on PATH. + - name: Create the Python environment + if: runner.os == 'Linux' + shell: bash + run: | + set -euo pipefail + python -m venv "$RUNNER_TEMP/venv" + echo "$RUNNER_TEMP/venv/bin" >> "$GITHUB_PATH" + - name: Install TypeScript workspace dependencies run: npm install --no-package-lock -- 2.47.3 From 3b1c39fd76d9d2b1c8d4646ecf4b3693696fe97a Mon Sep 17 00:00:00 2001 From: Libby Date: Wed, 11 Nov 2026 21:55:26 +0000 Subject: [PATCH 3/3] Portability CI: the timeout comment names the runner cap that still binds Co-Authored-By: Claude Sonnet 5.5 --- .github/workflows/cultmesh-portability.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/cultmesh-portability.yml b/.github/workflows/cultmesh-portability.yml index a48583bc..0b8aca1d 100644 --- a/.github/workflows/cultmesh-portability.yml +++ b/.github/workflows/cultmesh-portability.yml @@ -25,7 +25,8 @@ jobs: reactive-and-resource-lifetime: name: ${{ matrix.os }} reactive semantics and leases runs-on: ${{ matrix.os }} - # The forge runner cap is 60 minutes; the job value must match or the job dies at the lower of the two. + # The job dies at the lower of this value and the forge runner's own cap, which Eureka is raising from 30 to 60 minutes + # (run 1378 carried 60 and was still cancelled at 30:02); the two must both say 60 before a full run can finish. timeout-minutes: 60 strategy: fail-fast: false -- 2.47.3