Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
42 commits
Select commit Hold shift + click to select a range
b7acfb7
test(e2e): execute real shell assertions; delete dry-run, --validate-…
jyaunches May 28, 2026
2716ab0
Merge remote-tracking branch 'origin/main' into feat/e2e-real-execution
jyaunches May 28, 2026
a5aabd7
fix(e2e): flush log writeStream before evidence read; replace source-…
jyaunches May 28, 2026
903f90b
fix(e2e): drop extra trailing newline (end-of-file-fixer)
jyaunches May 28, 2026
628870c
feat(e2e): wire install/onboard into typed phase orchestrators
jyaunches May 28, 2026
f81cf5a
fix(e2e): emit context.env in TS framework + cross-phase short-circuit
jyaunches May 28, 2026
2dc9439
fix(e2e): stop dispatcher from truncating context.env; alias onboard.log
jyaunches May 28, 2026
0aa107a
fix(e2e): tighten preflight-passed regex to actual failure markers
jyaunches May 28, 2026
1d128a1
style(e2e): shfmt indentation on preflight-passed continuation lines
jyaunches May 28, 2026
c359f8a
fix(e2e): address CodeRabbit batch (3 quick wins)
jyaunches May 28, 2026
f923597
Merge origin/main into feat/e2e-real-execution
jyaunches May 28, 2026
34f3ca2
fix(e2e): remove residual E2E_DRY_RUN branch and phase-1-skeleton refs
jyaunches May 28, 2026
083b9b6
test(e2e): wrap openshell sandbox exec with per-call timeout + diagno…
jyaunches May 28, 2026
14ab98f
ci(e2e): silence SC2034 on prefix-env sandbox exec timeout overrides
jyaunches May 28, 2026
c167d35
feat(e2e): framework-owned secret hygiene at the spawn boundary
jyaunches May 28, 2026
cc6b7a2
fix(e2e): fail-closed for required security probes and expected-failu…
jyaunches May 28, 2026
5bb3bc7
test(e2e): prefer openshell sandbox ssh-config + ssh -F transport
jyaunches May 28, 2026
10230d9
test(e2e): route rebuild_upgrade.sh sandbox exec through canonical wr…
jyaunches May 28, 2026
72185d7
test(e2e): align status_fields_present with real nemoclaw status output
jyaunches May 28, 2026
0d531d9
test(e2e): wire negative preflight scenario end-to-end
jyaunches May 28, 2026
3198d37
feat(e2e): typed negative-scenario contract matcher (PR #4380 advisor…
jyaunches May 28, 2026
2008d0d
test(e2e): switch policy_presets_preserved to host-side openshell pol…
jyaunches May 28, 2026
6ecd198
test(e2e): land typed probe registry with diagnostics + docs validation
jyaunches May 28, 2026
ff4b0a8
feat(e2e): typed state-validation phase gates runtime suites (PR #438…
jyaunches May 28, 2026
f61bcd2
test(e2e): land security probes (shields, network policy, injection)
jyaunches May 28, 2026
9da75ac
chore(e2e): retire legacy expected-states.yaml + runtime/resolver pat…
jyaunches May 28, 2026
46e6dde
test(e2e): map inference route slug to inference.local DNS host
jyaunches May 28, 2026
9932bbb
test(e2e): route sandbox_lifecycle.sh sandbox-exec calls through cano…
jyaunches May 28, 2026
9afeedc
test(e2e): land lifecycle phase + ubuntu-rebuild-openclaw scenario
jyaunches May 29, 2026
f899439
fix(e2e): ensure ~/.local/bin on PATH and correct snapshot argv
jyaunches Jun 8, 2026
354dfa2
merge: bring main into feat/e2e-real-execution
jyaunches Jun 8, 2026
863e8eb
merge: fold in #4939 single-runner doc + reconcile retired YAML resolver
jyaunches Jun 8, 2026
3d8adfa
fix(e2e): post-merge CI fixes - probe shebangs + retired-link cleanup
jyaunches Jun 8, 2026
381d654
fix(e2e): remove last 2 stale dry-run references the PR audit missed
jyaunches Jun 8, 2026
fc06168
style(e2e): apply shfmt + executable bits to satisfy static-checks
jyaunches Jun 8, 2026
c8ae688
Merge remote-tracking branch 'origin/main' into feat/e2e-real-execution
jyaunches Jun 8, 2026
b41c17b
test(e2e): refactor redaction parity to behavior-based to clear sourc…
jyaunches Jun 8, 2026
bd4d3ce
fix(e2e): address CodeRabbit major and CodeQL alert 715 on PR review
jyaunches Jun 8, 2026
415c577
Merge remote-tracking branch 'origin/main' into feat/e2e-real-execution
jyaunches Jun 8, 2026
7887adb
fix(e2e): suppress CodeQL alert 792 with explicit safety contract
jyaunches Jun 8, 2026
8c6261d
Merge remote-tracking branch 'origin/main' into feat/e2e-real-execution
jyaunches Jun 8, 2026
70df051
fix(e2e): place lgtm[] directive on the line immediately preceding sp…
jyaunches Jun 8, 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
7 changes: 7 additions & 0 deletions .github/workflows/e2e-scenarios-all.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -83,3 +83,10 @@ jobs:
scenarios: ${{ matrix.id }}
secrets:
NVIDIA_API_KEY: ${{ secrets.NVIDIA_API_KEY }}

ubuntu-rebuild-openclaw:
uses: ./.github/workflows/e2e-scenarios.yaml
with:
scenarios: ubuntu-rebuild-openclaw
secrets:
NVIDIA_API_KEY: ${{ secrets.NVIDIA_API_KEY }}
27 changes: 19 additions & 8 deletions .github/workflows/e2e-scenarios.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,7 @@ jobs:
[ubuntu-gateway-port-conflict-negative]=ubuntu-latest
[ubuntu-invalid-nvidia-key-negative]=ubuntu-latest
[ubuntu-no-docker-preflight-negative]=ubuntu-latest
[ubuntu-rebuild-openclaw]=ubuntu-latest
[ubuntu-repo-cloud-hermes]=ubuntu-latest
[ubuntu-repo-cloud-hermes-discord]=ubuntu-latest
[ubuntu-repo-cloud-hermes-slack]=ubuntu-latest
Expand All @@ -84,7 +85,6 @@ jobs:
for raw in "${IDS[@]}"; do
id="${raw//[[:space:]]/}"
[ -n "${id}" ] || continue
npx tsx test/e2e-scenario/scenarios/run.ts --scenarios "${id}" --plan-only >/dev/null
runner="${ROUTES[$id]:-}"
if [ -z "${runner}" ]; then
echo "::error::No runner route for scenario: ${id}" >&2
Expand Down Expand Up @@ -138,7 +138,7 @@ jobs:
echo "::error::Invalid scenario input: ${SCENARIOS}" >&2
exit 1
fi
npx tsx test/e2e-scenario/scenarios/run.ts --scenarios "${SCENARIOS}" --dry-run
npx tsx test/e2e-scenario/scenarios/run.ts --scenarios "${SCENARIOS}"

- name: Resolve workspace paths for WSL
if: contains(inputs.scenarios || github.event.inputs.scenarios, 'wsl-repo-cloud-openclaw')
Expand Down Expand Up @@ -302,7 +302,7 @@ jobs:
export E2E_CONTEXT_DIR="`$workdir"
npm ci --ignore-scripts
set +e
npx tsx test/e2e-scenario/scenarios/run.ts --scenarios "`$scenarios" --dry-run
npx tsx test/e2e-scenario/scenarios/run.ts --scenarios "`$scenarios"
status=`$?
if [ -d "`$workdir/.e2e" ]; then
rm -rf "`$checkout_dir/.e2e"
Expand All @@ -324,14 +324,14 @@ jobs:
exit $LASTEXITCODE
}

- name: Append typed dry-run summary
- name: Append typed scenario summary
if: always()
shell: bash
run: |
{
echo '## E2E typed scenario dry-run'
echo '## E2E typed scenario run'
echo ''
echo 'Mode: `test/e2e-scenario/scenarios/run.ts --dry-run`.'
echo 'Mode: `test/e2e-scenario/scenarios/run.ts --scenarios <id[,id...]>` (live).'
echo ''
if [ -f .e2e/run-plan.json ]; then
python3 - <<'PY'
Expand Down Expand Up @@ -368,14 +368,25 @@ jobs:
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
with:
name: e2e-scenario-${{ inputs.scenarios || github.event.inputs.scenarios }}
# Explicit subpath list, NOT a blanket .e2e/ + hidden files.
# The framework redacts every byte that flows from spawned
# children into actions/*.log, logs/*.log, and onboard.log via
# orchestrators/redaction.ts::pipeRedacted. Anything outside
# the listed paths (notably the raw context.env file) is
# excluded so secret-bearing key=value lines cannot leak via
# the artifact even if a future helper writes there.
# Diagnostic dumps of context use e2e_context_dump, which
# redacts on emit (runtime/lib/context.sh).
path: |
.e2e/run-plan.json
.e2e/plan.txt
.e2e/environment.result.json
.e2e/onboarding.result.json
.e2e/runtime.result.json
.e2e/
.e2e/actions/
.e2e/logs/
.e2e/onboard.log
test/e2e/logs/
if-no-files-found: warn
retention-days: 14
include-hidden-files: true
include-hidden-files: false
6 changes: 3 additions & 3 deletions test/e2e-scenario/docs/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -24,9 +24,10 @@ Use the source that matches the task while the migration is in progress:

| Task | Current source |
| --- | --- |
| Scenario workflow fan-out and dry-run planning | `test/e2e-scenario/scenarios/registry.ts`, `test/e2e-scenario/scenarios/scenarios/baseline.ts`, and `test/e2e-scenario/scenarios/run.ts` |
| Scenario workflow fan-out and live execution | `test/e2e-scenario/scenarios/registry.ts`, `test/e2e-scenario/scenarios/scenarios/baseline.ts`, and `test/e2e-scenario/scenarios/run.ts` |
| Typed expected-state registry (single source of truth) | `test/e2e-scenario/scenarios/expected-states.ts` |
| Product-facing desired setup/onboarding state | `test/e2e-scenario/manifests/*.yaml` |
| Shell runner scenario resolution and live scenario execution | `test/e2e-scenario/nemoclaw_scenarios/scenarios.yaml`, `expected-states.yaml`, and `validation_suites/suites.yaml` |
| Shell runner scenario resolution and live scenario execution | `test/e2e-scenario/nemoclaw_scenarios/scenarios.yaml` and `validation_suites/suites.yaml` (legacy YAML resolver path retired) |
| Reusable live suite assertions | `test/e2e-scenario/validation_suites/` |
| Existing nightly and platform E2E coverage | legacy `test/e2e/test-*.sh` scripts and their workflows |

Expand Down Expand Up @@ -158,7 +159,6 @@ test/e2e-scenario/
scenarios/ # Typed builders, registry, compiler, assertions, dry-run orchestration
nemoclaw_scenarios/ # YAML runtime metadata and setup helpers
scenarios.yaml
expected-states.yaml
install/
onboard/
fixtures/
Expand Down
35 changes: 0 additions & 35 deletions test/e2e-scenario/framework-tests/e2e-context-helper.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,6 @@ import path from "node:path";

const REPO_ROOT = path.resolve(import.meta.dirname, "../../..");
const CONTEXT_LIB = path.join(REPO_ROOT, "test/e2e-scenario/runtime/lib/context.sh");
const RUN_SCENARIO = path.join(REPO_ROOT, "test/e2e-scenario/runtime/run-scenario.sh");

function runBash(script: string, env: Record<string, string> = {}): SpawnSyncReturns<string> {
return spawnSync("bash", ["-c", script], {
Expand Down Expand Up @@ -86,38 +85,4 @@ describe("E2E context helper (runtime/lib/context.sh)", () => {
}
});

it("scenario_plan_execution_should_emit_context_under_dry_run", () => {
const tmp = fs.mkdtempSync(path.join(os.tmpdir(), "e2e-ctx-"));
try {
const r = spawnSync(
"bash",
[RUN_SCENARIO, "ubuntu-repo-cloud-openclaw", "--dry-run"],
{
env: { ...process.env, E2E_CONTEXT_DIR: tmp },
encoding: "utf8",
timeout: Number(process.env.E2E_SPAWN_TIMEOUT_MS ?? 60_000),
cwd: REPO_ROOT,
},
);
expect(r.status, r.stderr).toBe(0);
const ctxPath = path.join(tmp, "context.env");
expect(fs.existsSync(ctxPath), `context.env missing in ${tmp}`).toBe(true);
const ctx = fs.readFileSync(ctxPath, "utf8");
for (const key of [
"E2E_SCENARIO",
"E2E_PLATFORM_OS",
"E2E_INSTALL_METHOD",
"E2E_ONBOARDING_PATH",
"E2E_AGENT",
"E2E_PROVIDER",
"E2E_SANDBOX_NAME",
"E2E_GATEWAY_URL",
"E2E_INFERENCE_ROUTE",
]) {
expect(ctx, `${key} missing from context.env`).toMatch(new RegExp(`^${key}=`, "m"));
}
} finally {
fs.rmSync(tmp, { recursive: true, force: true });
}
});
});
89 changes: 0 additions & 89 deletions test/e2e-scenario/framework-tests/e2e-coverage-report.test.ts

This file was deleted.

Loading
Loading