Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
26 commits
Select commit Hold shift + click to select a range
00e44db
test(e2e): migrate test-issue-2478-crash-loop-recovery.sh to vitest
jyaunches Jun 12, 2026
ec14702
test(e2e): add issue 2478 vitest coverage
jyaunches Jun 12, 2026
1cfaa8e
fix(e2e): restore issue 2478 proxy env file
jyaunches Jun 12, 2026
8553cb6
fix(e2e): preserve guard files in issue 2478 test
jyaunches Jun 12, 2026
4a4d432
Merge remote-tracking branch 'origin/main' into e2e-migrate/test-issu…
jyaunches Jun 12, 2026
c262c0b
fix(e2e): isolate issue 2478 Docker auth
jyaunches Jun 12, 2026
13a51a0
fix(e2e): tolerate 2478 watchdog respawn race
jyaunches Jun 13, 2026
7fbd5e8
Merge remote-tracking branch 'origin/main' into e2e-migrate/test-issu…
jyaunches Jun 13, 2026
2f9b9ca
style(e2e): apply static hook formatting
jyaunches Jun 13, 2026
b6a825c
test(e2e): align issue 2478 guard contract
jyaunches Jun 13, 2026
7bcb91b
Merge remote-tracking branch 'origin/main' into e2e-migrate/test-issu…
cv Jun 13, 2026
8d07c9e
Merge remote-tracking branch 'origin/main' into e2e-migrate/test-issu…
jyaunches Jun 13, 2026
62297fa
Merge remote-tracking branch 'origin/main' into e2e-migrate/test-issu…
cv Jun 13, 2026
3108ae3
Merge remote-tracking branch 'origin/main' into e2e-migrate/test-issu…
jyaunches Jun 13, 2026
ef9b850
Merge remote-tracking branch 'origin/e2e-migrate/test-issue-2478-cras…
cv Jun 13, 2026
9bbaacc
Merge remote-tracking branch 'origin/main' into e2e-migrate/test-issu…
cv Jun 13, 2026
0e03778
test(e2e): relax workflow inventory support timeout
cv Jun 13, 2026
b90accb
fix(e2e): use compatible endpoint for issue 2478
jyaunches Jun 13, 2026
86414e9
Merge remote-tracking branch 'origin/main' into e2e-migrate/test-issu…
cv Jun 13, 2026
0e692dc
Merge remote-tracking branch 'origin/main' into e2e-migrate/test-issu…
jyaunches Jun 13, 2026
05bfcfe
Merge remote-tracking branch 'origin/main' into e2e-migrate/test-issu…
jyaunches Jun 13, 2026
894d406
Merge remote-tracking branch 'origin/main' into e2e-migrate/test-issu…
jyaunches Jun 13, 2026
19a7aba
Merge remote-tracking branch 'origin/main' into e2e-migrate/test-issu…
jyaunches Jun 13, 2026
eac88c7
chore: merge main E2E workflow updates
cv Jun 13, 2026
9efc1ac
Merge remote-tracking branch 'origin/main' into e2e-migrate/test-issu…
jyaunches Jun 13, 2026
d736865
merge(main): sync issue 2478 scenario with main
cv Jun 13, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
106 changes: 104 additions & 2 deletions .github/workflows/e2e-vitest-scenarios.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -841,7 +841,6 @@ jobs:
if-no-files-found: ignore
retention-days: 14


credential-sanitization-vitest:
needs: generate-matrix
if: ${{ (inputs.jobs == '' && inputs.scenarios == '') || contains(format(',{0},', inputs.jobs), ',credential-sanitization-vitest,') || contains(format(',{0},', inputs.scenarios), ',credential-sanitization,') }}
Expand Down Expand Up @@ -927,7 +926,6 @@ jobs:
run: |
docker logout docker.io >/dev/null 2>&1 || true


credential-migration-vitest:
needs: generate-matrix
if: ${{ (inputs.jobs == '' && inputs.scenarios == '') || contains(format(',{0},', inputs.jobs), ',credential-migration-vitest,') }}
Expand Down Expand Up @@ -2844,6 +2842,109 @@ jobs:
docker logout docker.io || true
rm -rf "${DOCKER_CONFIG}"

issue-2478-crash-loop-recovery-vitest:
needs: generate-matrix
if: ${{ (inputs.jobs == '' && inputs.scenarios == '') || contains(format(',{0},', inputs.jobs), ',issue-2478-crash-loop-recovery-vitest,') || contains(format(',{0},', inputs.scenarios), ',issue-2478-crash-loop-recovery,') }}
runs-on: ubuntu-latest
timeout-minutes: 30
env:
FREE_STANDING_VITEST_JOB: "1"
FREE_STANDING_SCENARIO_ID: "issue-2478-crash-loop-recovery"
E2E_ARTIFACT_DIR: ${{ github.workspace }}/e2e-artifacts/vitest/issue-2478-crash-loop-recovery
NEMOCLAW_CLI_BIN: ${{ github.workspace }}/bin/nemoclaw.js
NEMOCLAW_RUN_E2E_SCENARIOS: "1"
NEMOCLAW_NON_INTERACTIVE: "1"
NEMOCLAW_ACCEPT_THIRD_PARTY_SOFTWARE: "1"
NEMOCLAW_SANDBOX_NAME: "e2e-2478"
OPENSHELL_GATEWAY: "nemoclaw"
steps:
- uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
with:
persist-credentials: false

- name: Configure isolated Docker auth directory
run: echo "DOCKER_CONFIG=${RUNNER_TEMP}/docker-config-issue-2478-crash-loop-recovery" >> "$GITHUB_ENV"

- name: Authenticate to Docker Hub
env:
DOCKERHUB_USERNAME: ${{ secrets.DOCKERHUB_USERNAME }}
DOCKERHUB_TOKEN: ${{ secrets.DOCKERHUB_TOKEN }}
shell: bash
run: |
set -euo pipefail
if [[ -z "${DOCKERHUB_USERNAME}" || -z "${DOCKERHUB_TOKEN}" ]]; then
echo "::notice::Docker Hub credentials not configured; continuing with anonymous pulls."
exit 0
fi
mkdir -p "${DOCKER_CONFIG}"
chmod 700 "${DOCKER_CONFIG}"
login_succeeded=0
for attempt in 1 2 3; do
if echo "${DOCKERHUB_TOKEN}" | timeout 30s docker login docker.io --username "${DOCKERHUB_USERNAME}" --password-stdin; then
login_succeeded=1
break
fi
if [[ "$attempt" -lt 3 ]]; then
echo "::warning::Docker Hub login attempt ${attempt} failed; retrying."
sleep 5
fi
done
if [[ "$login_succeeded" -ne 1 ]]; then
echo "::warning::Docker Hub login failed after 3 attempts; continuing with anonymous pulls."
fi

- name: Set up Node
uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.0.0
with:
node-version: 22
cache: npm

- name: Install root dependencies
run: npm ci --ignore-scripts

- name: Build CLI
run: npm run build:cli

- name: Install OpenShell CLI
run: bash scripts/install-openshell.sh

- name: "Run issue #2478 crash-loop recovery live Vitest test"
run: |
set -euo pipefail
export PATH="$HOME/.local/bin:$HOME/.npm-global/bin:$PATH"
if command -v openshell >/dev/null 2>&1; then
OPENSHELL_BIN="$(command -v openshell)"
elif [ -x "$HOME/.local/bin/openshell" ]; then
OPENSHELL_BIN="$HOME/.local/bin/openshell"
else
echo "::error::OpenShell CLI not found after install"
ls -la /usr/local/bin/openshell "$HOME/.local/bin/openshell" 2>&1 || true
exit 1
fi
export OPENSHELL_BIN
echo "Using OPENSHELL_BIN=$OPENSHELL_BIN"
"$OPENSHELL_BIN" --version
npx vitest run --project e2e-scenarios-live \
test/e2e-scenario/live/issue-2478-crash-loop-recovery.test.ts \
--silent=false --reporter=default

- name: "Upload issue #2478 crash-loop recovery artifacts"
if: always()
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
with:
name: e2e-vitest-scenarios-issue-2478-crash-loop-recovery
path: e2e-artifacts/vitest/issue-2478-crash-loop-recovery/
include-hidden-files: false
if-no-files-found: ignore
retention-days: 14

- name: Clean up Docker auth
if: always()
run: |
set -euo pipefail
docker logout docker.io || true
rm -rf "${DOCKER_CONFIG}"

# ── PR result comment (mirrors nightly-e2e.yaml's report-to-pr) ───────────
# Posts a results table on the open PR for the dispatching branch (or the
# PR identified by `inputs.pr_number`). `if: always()` so the comment lands
Expand Down Expand Up @@ -2887,6 +2988,7 @@ jobs:
issue-4434-tui-unreachable-inference-vitest,
openclaw-inference-switch-vitest,
bedrock-runtime-compatible-anthropic-vitest,
issue-2478-crash-loop-recovery-vitest,
gateway-health-honest-vitest,
channels-add-remove-vitest,
]
Expand Down
Loading
Loading