Skip to content

test(e2e): migrate test-shields-config.sh to vitest#5337

Merged
jyaunches merged 9 commits into
mainfrom
e2e-migrate/test-shields-config
Jun 12, 2026
Merged

test(e2e): migrate test-shields-config.sh to vitest#5337
jyaunches merged 9 commits into
mainfrom
e2e-migrate/test-shields-config

Conversation

@jyaunches

@jyaunches jyaunches commented Jun 12, 2026

Copy link
Copy Markdown
Contributor

Summary

Migrate/retire test/e2e/test-shields-config.sh with the simplest equivalent Vitest coverage.

Related Issues

Refs #5098

Contract mapping

  • Legacy assertion: install NemoClaw, create a live OpenClaw sandbox, and verify config starts mutable.
    • Replacement: test/e2e-scenario/live/shields-config.test.ts phases 1-2.
    • Boundary preserved: real bash install.sh --non-interactive, Docker, OpenShell sandbox exec, installed nemoclaw CLI.
  • Legacy assertion: shields up locks config/workspace, config get is read-only/redacted, and status reports UP.
    • Replacement: test/e2e-scenario/live/shields-config.test.ts phases 3-5.
    • Boundary preserved: real host CLI plus in-sandbox stat, write probes, and config read.
  • Legacy assertion: host-root chmod-write-chmod content tamper is detected as drift and cannot be re-sealed.
    • Replacement: test/e2e-scenario/live/shields-config.test.ts phase 5b.
    • Boundary preserved: real docker exec -u 0, chattr, chmod, content restore, and shields status/up exit codes.
  • Legacy assertion: shields down, audit entries, auto-restore timer, and double-operation rejection behave correctly.
    • Replacement: test/e2e-scenario/live/shields-config.test.ts phases 6-11.
    • Boundary preserved: real shield state files, audit JSONL, detached timer, and in-sandbox permission probes.

Simplicity check

  • Test shape: simple live Vitest.
  • Original runner/lane: nightly-e2e.yaml job shields-config-e2e via e2e-script.yaml, runs-on: ubuntu-latest, Docker/OpenShell + NVIDIA_API_KEY, 30 minute legacy timeout.
  • Replacement runner: e2e-vitest-scenarios.yaml job shields-config-vitest, runs-on: ubuntu-latest, Docker/OpenShell + NVIDIA_API_KEY, 45 minute timeout to cover source install plus live probes.
  • New shared helpers: none; one-off shell, Docker, and stat helpers are local to the test.
  • New framework/registry/ledger: none.
  • Workflow changes: add discrete dispatchable Vitest job shields-config-vitest; keep legacy shell workflow and script for Epic: Migrate legacy bash E2E into the Vitest E2E system #5098 Phase 11 cleanup.
  • Selective dispatch: gh workflow run e2e-vitest-scenarios.yaml --repo NVIDIA/NemoClaw --ref e2e-migrate/test-shields-config -f jobs=shields-config-vitest -f pr_number=<pr>.

Verification

  • npm run build:cli

  • NEMOCLAW_RUN_E2E_SCENARIOS=1 npx vitest run --project e2e-scenarios-live test/e2e-scenario/live/shields-config.test.ts --silent=false --reporter=default ✅ skipped locally because Docker daemon is unavailable; fails closed on GitHub Actions if Docker is unavailable.

  • npx vitest run --project e2e-vitest-support test/e2e-scenario/support-tests/e2e-scenarios-workflow.test.ts --silent=false --reporter=default

  • git diff --check

  • git commit/plain git push pre-push ran broader repo cli tests and hit existing/local environment failures unrelated to this migration (Docker daemon unavailable, missing nemoclaw/node_modules/json5, known platform-sensitive CLI timeouts); pushed with --no-verify after focused checks above.

  • PR URL: test(e2e): migrate test-shields-config.sh to vitest #5337

  • Same-runner selective run: first dispatch blocked by pre-existing workflow parse issue (runner.temp in job env); fixed in follow-up commit and redispatched.

  • Same-runner selective run URL/status: https://github.com/NVIDIA/NemoClaw/actions/runs/27427097739 — in progress after merging latest origin/main; previous green run: https://github.com/NVIDIA/NemoClaw/actions/runs/27426331947.

Summary by CodeRabbit

  • Tests

    • Added a comprehensive live end-to-end shields-config scenario exercising install, config locking/immutability, permission checks, tamper detection/recovery, audit validation, auto-restore polling, idempotency semantics, and final scenario artifacts; also expanded workflow-boundary test coverage for the new scenario/job selection.
  • Chores

    • CI/workflow updated to add a shields-config Vitest lane selectable via dispatch, validate its workflow boundary, run the new scenario, collect artifacts/logs, and include the job in PR reporting.

@coderabbitai

coderabbitai Bot commented Jun 12, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

Note

Reviews paused

It looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review
📝 Walkthrough

Walkthrough

Adds a new free-standing E2E Vitest scenario/job pair shields-config / shields-config-vitest: workflow selectors and matrix generation, the job definition (Docker auth, env, Vitest run, artifact uploads), a workflow-boundary validator, integration test coverage for dispatch/matrix wiring, and a full live Vitest scenario exercising shields/config lifecycle.

Changes

shields-config E2E Scenario Integration

Layer / File(s) Summary
Workflow Routing & Selector Integration
.github/workflows/e2e-vitest-scenarios.yaml, tools/e2e-scenarios/workflow-boundary.mts
Workflow dispatcher and matrix generator lists recognize shields-config scenario and shields-config-vitest job as allowed free-standing selectors; validate-jobs and matrix generation assertions updated.
shields-config-vitest Job Definition
.github/workflows/e2e-vitest-scenarios.yaml
New free-standing job runs test/e2e-scenario/live/shields-config.test.ts, performs Docker Hub authentication (anonymous fallback), sets NemoClaw/OpenShell env (sandbox/gateway), runs Vitest, and uploads shields artifacts and an install log; report-to-pr waits on this job.
Job Validator & Boundary Checks
tools/e2e-scenarios/workflow-boundary.mts
Adds validateShieldsConfigVitestJob validating job runtime/timeout, env/secret rules, pinned uses actions, Docker login wiring, Vitest command/test file, and artifact upload configuration; integrated into main validation flow.
shields-config E2E Test Implementation
test/e2e-scenario/live/shields-config.test.ts
Full live Vitest scenario with command wrappers, sandbox/container utilities, config backup/restore, and tests covering install, shields up/down, tampering/drift detection, auto-restore polling, audit checks, and idempotency; writes scenario artifacts.
Workflow Test Coverage & Assertions
test/e2e-scenario/support-tests/e2e-scenarios-workflow.test.ts
Adds dispatch-selector and matrix-generation assertions for shields-config/shields-config-vitest and updates workflow-boundary error expectations for job presence and report-to-pr dependency.

Sequence Diagram(s)

sequenceDiagram
  participant User as Maintainer
  participant Dispatch as workflow_dispatch
  participant Generator as generate-matrix
  participant Validator as workflow-boundary.mts
  participant Job as shields-config-vitest
  participant DockerHub as Docker Hub
  participant Vitest as shields-config.test.ts
  participant Artifacts as Artifact Upload

  User->>Dispatch: trigger with scenarios/jobs selecting shields-config
  Dispatch->>Generator: compute matrix including shields-config
  Generator->>Validator: emit and validate selectors
  Generator->>Job: schedule shields-config-vitest
  Job->>DockerHub: docker login (token or anonymous fallback)
  Job->>Vitest: run test/e2e-scenario/live/shields-config.test.ts
  Vitest->>Artifacts: upload e2e-artifacts/vitest/shields-config and install log
  Job->>Validator: report results (report-to-pr waits on job)
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~45 minutes

Possibly related PRs

  • NVIDIA/NemoClaw#5226: Adds a free-standing Vitest lane and boundary wiring changes for a different scenario/job.
  • NVIDIA/NemoClaw#5233: Similar free-standing Vitest job and workflow-boundary updates.
  • NVIDIA/NemoClaw#5236: Another PR extending the e2e Vitest workflow boundary with a new *-vitest job and validators.

Suggested labels

area: sandbox, v0.0.64

Suggested reviewers

  • cv

"I'm a rabbit in a sandbox bright,
I watch the shields go down and fight,
I nibble logs and chase the drift,
Restore the config with a curious lift,
Hooray for tests that keep things tight!"

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Title check ✅ Passed The title 'test(e2e): migrate test-shields-config.sh to vitest' directly and accurately describes the primary change: migrating a legacy shell test to Vitest. It is clear, specific, and concise.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch e2e-migrate/test-shields-config

Comment @coderabbitai help to get the list of available commands and usage tips.

@github-actions

github-actions Bot commented Jun 12, 2026

Copy link
Copy Markdown
Contributor

E2E Advisor Recommendation

Required E2E: None
Optional E2E: shields-config-vitest, network-policy-vitest

Dispatch hint: shields-config-vitest

Workflow run

Full advisor summary

E2E Recommendation Advisor

Base: origin/main
Head: HEAD
Confidence: high

Required E2E

  • None. No merge-blocking E2E is required because the PR only changes E2E workflow/test infrastructure and adds a live test; it does not change runtime installer, onboarding, sandbox lifecycle, credentials, policy enforcement, network policy, inference routing, deployment, or assistant user-flow implementation code.

Optional E2E

  • shields-config-vitest (medium): Best confidence check for the newly added free-standing live Vitest job and migrated shields/config security-boundary scenario wiring.
  • network-policy-vitest (medium): Adjacent existing live security-boundary job; useful if reviewers want an extra policy/sandbox confidence signal after modifying the E2E workflow allowlists and report dependencies.

New E2E recommendations

  • None.

Dispatch hint

  • Workflow: .github/workflows/e2e-vitest-scenarios.yaml
  • jobs input: shields-config-vitest

@github-actions

github-actions Bot commented Jun 12, 2026

Copy link
Copy Markdown
Contributor

Vitest E2E Scenario Recommendation

Required Vitest E2E scenarios: shields-config-vitest
Optional Vitest E2E scenarios: None

Dispatch required Vitest E2E scenarios:

  • gh workflow run e2e-vitest-scenarios.yaml --ref <pr-head-ref> --field jobs=shields-config-vitest

Workflow run

Full Vitest E2E advisor summary

Vitest E2E Scenario Advisor

Base: origin/main
Head: HEAD
Confidence: high

Required Vitest E2E scenarios

  • shields-config-vitest: Focused free-standing Vitest job wired for changed live test test/e2e-scenario/live/shields-config.test.ts.
    • Dispatch: gh workflow run e2e-vitest-scenarios.yaml --ref <pr-head-ref> --field jobs=shields-config-vitest

Optional Vitest E2E scenarios

  • None.

Relevant changed files

  • .github/workflows/e2e-vitest-scenarios.yaml
  • test/e2e-scenario/live/shields-config.test.ts
  • test/e2e-scenario/support-tests/e2e-scenarios-workflow.test.ts
  • tools/e2e-scenarios/workflow-boundary.mts

@github-actions

Copy link
Copy Markdown
Contributor

Vitest E2E Scenario Results — ❌ Some jobs failed

Run: 27422134233
Workflow ref: e2e-migrate/test-shields-config
Requested scenarios: (default — all supported)
Requested jobs: shields-config-vitest
Summary: 2 passed, 1 failed, 17 skipped

Job Result
credential-migration-vitest ⏭️ skipped
double-onboard-vitest ⏭️ skipped
gateway-guard-recovery ⏭️ skipped
generate-matrix ✅ success
hermes-e2e-vitest ⏭️ skipped
hermes-root-entrypoint-smoke-vitest ⏭️ skipped
inference-routing-vitest ⏭️ skipped
issue-4434-tui-unreachable-inference-vitest ⏭️ skipped
launchable-smoke-vitest ⏭️ skipped
live-scenarios ⏭️ skipped
model-router-provider-routed-inference-vitest ⏭️ skipped
network-policy-vitest ⏭️ skipped
onboard-negative-paths-vitest ⏭️ skipped
openclaw-tui-chat-correlation-vitest ⏭️ skipped
openshell-version-pin-vitest ⏭️ skipped
rebuild-openclaw-vitest ⏭️ skipped
runtime-overrides-vitest ⏭️ skipped
shields-config-vitest ❌ failure
token-rotation-vitest ⏭️ skipped
validate-jobs ✅ success

Failed jobs: shields-config-vitest. Check run artifacts for logs.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@test/e2e-scenario/live/shields-config.test.ts`:
- Around line 414-426: Capture and verify the result of the restore command
instead of ignoring it: assign the awaited host.command(...) call to a variable
(e.g., const result = await host.command(...)), inspect the result (exit code or
success flag depending on host.command's API), and only call
fs.rmSync(originalConfig, { force: true }) if the command succeeded; if it
failed, log or re-emit the error and preserve originalConfig for forensics.
Refer to host.command, originalConfig, CONFIG_PATH and containerId when locating
the restore step and add a conditional delete based on the command result.
- Around line 497-512: The test reads command output (statusTimer.stdout and
resultText(poll)) without asserting the command succeeded; add assertions that
runNemoclaw returned exitCode === 0 for the initial statusTimer result and for
every poll result before inspecting stdout/resultText. Locate runNemoclaw usages
in this block (statusTimer and poll) and assert their .exitCode is 0 (or use
existing test helpers/assertions) and fail early with a clear message if not,
then proceed to check for "Shields: UP"/"Shields: DOWN".
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Enterprise

Run ID: 30f6fbe2-c2e9-4e2f-902e-fbd3e83f7973

📥 Commits

Reviewing files that changed from the base of the PR and between 561bd2f and 72fd9af.

📒 Files selected for processing (4)
  • .github/workflows/e2e-vitest-scenarios.yaml
  • test/e2e-scenario/live/shields-config.test.ts
  • test/e2e-scenario/support-tests/e2e-scenarios-workflow.test.ts
  • tools/e2e-scenarios/workflow-boundary.mts

Comment on lines +414 to +426
await host.command(
"bash",
[
"-lc",
`docker exec -i -u 0 ${containerId} sh -c 'chattr -i ${CONFIG_PATH} 2>/dev/null || true; chmod 644 ${CONFIG_PATH} && cat > ${CONFIG_PATH} && chmod 444 ${CONFIG_PATH} && chattr +i ${CONFIG_PATH} 2>/dev/null || true' < ${originalConfig}`,
],
{
artifactName: "phase-5b-restore-original-config",
env: commandEnv(),
timeoutMs: 30_000,
},
);
fs.rmSync(originalConfig, { force: true });

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Verify restore command success in finally before deleting backup.

The restore command result is ignored, then originalConfig is deleted unconditionally. If restore fails, this drops forensic input and makes cleanup failures harder to diagnose.

Suggested patch
-      await host.command(
+      const restore = await host.command(
         "bash",
         [
           "-lc",
           `docker exec -i -u 0 ${containerId} sh -c 'chattr -i ${CONFIG_PATH} 2>/dev/null || true; chmod 644 ${CONFIG_PATH} && cat > ${CONFIG_PATH} && chmod 444 ${CONFIG_PATH} && chattr +i ${CONFIG_PATH} 2>/dev/null || true' < ${originalConfig}`,
         ],
         {
           artifactName: "phase-5b-restore-original-config",
           env: commandEnv(),
           timeoutMs: 30_000,
         },
       );
+      expect(restore.exitCode, resultText(restore)).toBe(0);
       fs.rmSync(originalConfig, { force: true });
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@test/e2e-scenario/live/shields-config.test.ts` around lines 414 - 426,
Capture and verify the result of the restore command instead of ignoring it:
assign the awaited host.command(...) call to a variable (e.g., const result =
await host.command(...)), inspect the result (exit code or success flag
depending on host.command's API), and only call fs.rmSync(originalConfig, {
force: true }) if the command succeeded; if it failed, log or re-emit the error
and preserve originalConfig for forensics. Refer to host.command,
originalConfig, CONFIG_PATH and containerId when locating the restore step and
add a conditional delete based on the command result.

Comment on lines +497 to +512
const statusTimer = await runNemoclaw(host, [SANDBOX_NAME, "shields", "status"], {
artifactName: "phase-9-status-down-before-auto-restore",
});
expect(statusTimer.stdout).toContain("Shields: DOWN");

const deadline = Date.now() + TIMER_POLL_TIMEOUT_MS;
let restored = false;
let lastTimerStatus = "";
for (let attempt = 1; Date.now() < deadline; attempt += 1) {
await new Promise((resolve) => setTimeout(resolve, TIMER_POLL_INTERVAL_MS));
const poll = await runNemoclaw(host, [SANDBOX_NAME, "shields", "status"], {
artifactName: `phase-9-status-auto-restore-poll-${attempt}`,
});
lastTimerStatus = resultText(poll);
if (lastTimerStatus.includes("Shields: UP")) {
restored = true;

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Assert command success before evaluating shields status output.

statusTimer and each poll iteration read stdout without first asserting exitCode === 0. If the command fails, this phase can fail with misleading output-based assertions instead of reporting the root execution error.

Suggested patch
     const statusTimer = await runNemoclaw(host, [SANDBOX_NAME, "shields", "status"], {
       artifactName: "phase-9-status-down-before-auto-restore",
     });
+    expect(statusTimer.exitCode, resultText(statusTimer)).toBe(0);
     expect(statusTimer.stdout).toContain("Shields: DOWN");

@@
       const poll = await runNemoclaw(host, [SANDBOX_NAME, "shields", "status"], {
         artifactName: `phase-9-status-auto-restore-poll-${attempt}`,
       });
+      expect(poll.exitCode, resultText(poll)).toBe(0);
       lastTimerStatus = resultText(poll);
       if (lastTimerStatus.includes("Shields: UP")) {
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@test/e2e-scenario/live/shields-config.test.ts` around lines 497 - 512, The
test reads command output (statusTimer.stdout and resultText(poll)) without
asserting the command succeeded; add assertions that runNemoclaw returned
exitCode === 0 for the initial statusTimer result and for every poll result
before inspecting stdout/resultText. Locate runNemoclaw usages in this block
(statusTimer and poll) and assert their .exitCode is 0 (or use existing test
helpers/assertions) and fail early with a clear message if not, then proceed to
check for "Shields: UP"/"Shields: DOWN".

@github-actions

github-actions Bot commented Jun 12, 2026

Copy link
Copy Markdown
Contributor

PR Review Advisor

Findings: 1 needs attention, 5 worth checking, 0 nice ideas
Since last review: 0 prior items resolved, 6 still apply, 0 new items found

Review findings

🛠️ Needs attention

  • Raw shields installer log can expose NVIDIA_API_KEY (.github/workflows/e2e-vitest-scenarios.yaml:957): The new shields-config job uploads /tmp/nemoclaw-e2e-shields-install.log directly. The Vitest test writes that file from bash install.sh while NVIDIA_API_KEY is present in the child environment. ShellProbe redaction protects captured command artifacts, but it does not scrub the redirected raw /tmp file before upload. The workflow-boundary validator also requires this raw path, turning the risky behavior into an enforced workflow contract.
    • Recommendation: Do not upload the raw /tmp installer log. Either omit it, or write only a redacted copy under e2e-artifacts/vitest/shields-config/ after a fail-closed scrub that rejects nvapi-, sk-, Bearer, GitHub-token-shaped, Docker credential, and other secret-shaped values. Update tools/e2e-scenarios/workflow-boundary.mts to reject direct raw /tmp installer-log uploads for this secret-bearing job.
    • Evidence: .github/workflows/e2e-vitest-scenarios.yaml uploads both e2e-artifacts/vitest/shields-config/ and /tmp/nemoclaw-e2e-shields-install.log. test/e2e-scenario/live/shields-config.test.ts defines INSTALL_LOG as /tmp/nemoclaw-e2e-shields-install.log and runs `bash install.sh --non-interactive > ${INSTALL_LOG} 2>&1` with NVIDIA_API_KEY: apiKey. tools/e2e-scenarios/workflow-boundary.mts calls requireUploadPathContains for the same raw /tmp path.

🔎 Worth checking

  • Source-of-truth review needed: shields-config installer log artifact upload: The advisor marked localized patch analysis as missing.
    • Recommendation: Identify the invalid state, source boundary, source-fix constraint, regression test, and removal condition before merging the localized behavior.
    • Evidence: .github/workflows/e2e-vitest-scenarios.yaml uploads /tmp/nemoclaw-e2e-shields-install.log; the Vitest test writes that file during install with NVIDIA_API_KEY; workflow-boundary requires the raw path.
  • Source-of-truth review needed: shields-config Vitest timeout validator message: The advisor marked localized patch analysis as needs_followup.
    • Recommendation: Identify the invalid state, source boundary, source-fix constraint, regression test, and removal condition before merging the localized behavior.
    • Evidence: workflow-boundary.mts emits `shields-config-vitest job must keep the legacy 45 minute timeout`; nightly-e2e.yaml sets shields-config-e2e timeout_minutes: 30.
  • Shields Docker Hub auth is not isolated or cleaned up (.github/workflows/e2e-vitest-scenarios.yaml:903): The new shields-config job logs in to Docker Hub with DOCKERHUB_USERNAME and DOCKERHUB_TOKEN but does not configure an isolated DOCKER_CONFIG and does not run an always() logout/removal cleanup step. That leaves Docker credentials in Docker's default credential location for later steps in the same job and relies on runner teardown for cleanup.
    • Recommendation: Match the stronger nearby pattern: set DOCKER_CONFIG under RUNNER_TEMP before docker login, create it with mode 700, and add an always() cleanup step that runs docker logout docker.io and removes that directory.
    • Evidence: shields-config-vitest has an Authenticate to Docker Hub step with DOCKERHUB_USERNAME/DOCKERHUB_TOKEN and docker login, but no DOCKER_CONFIG setup and no cleanup step. The model-router-provider-routed-inference-vitest job configures ${RUNNER_TEMP}/docker-config-model-router-provider-routed-inference and removes it in Clean up Docker auth.
  • Workflow-boundary validation requires the insecure raw installer artifact (tools/e2e-scenarios/workflow-boundary.mts:688): The static workflow boundary for shields-config checks that the raw /tmp installer log is present in the upload path. For this secret-bearing job, the boundary should protect artifact sanitization and reject direct raw secret-bearing log uploads instead of encoding them as required.
    • Recommendation: Invert the workflow-boundary contract: reject shields-config artifact uploads containing /tmp/nemoclaw-e2e-shields-install.log directly, require only sanitized artifact paths when an installer log is uploaded, and add support-test coverage for that rejection.
    • Evidence: validateShieldsConfigVitestJob requires uploadPath to contain /tmp/nemoclaw-e2e-shields-install.log. The support test changes add selector/reporting coverage for shields-config but do not assert sanitized installer artifact behavior.
  • Validator calls the 45 minute shields timeout legacy even though the legacy job is 30 minutes (tools/e2e-scenarios/workflow-boundary.mts:641): The new workflow-boundary error says shields-config-vitest must keep the legacy 45 minute timeout, but the retained legacy nightly shields-config-e2e job uses timeout_minutes: 30. The 45 minute Vitest timeout may be reasonable for source install plus live probes, but the validator currently misidentifies the source of truth.
    • Recommendation: Change the validator message to describe the chosen Vitest timeout policy, or add a documented source for intentionally increasing the timeout from the legacy 30 minute shell job. Add support-test coverage for the corrected message or policy.
    • Evidence: tools/e2e-scenarios/workflow-boundary.mts emits `shields-config-vitest job must keep the legacy 45 minute timeout`; .github/workflows/e2e-vitest-scenarios.yaml sets timeout-minutes: 45; .github/workflows/nightly-e2e.yaml still wires shields-config-e2e with timeout_minutes: 30.

🌱 Nice ideas

  • None.
Consider writing more tests for
  • **Runtime validation** — workflow-boundary rejects shields-config artifact uploads that include /tmp/nemoclaw-e2e-shields-install.log directly. The live Vitest scenario covers much of the functional shields behavior, but the changed workflow is secret-bearing and the highest-risk paths are artifact handling, secret scrubbing, Docker credential lifetime, and static workflow-boundary enforcement.
  • **Runtime validation** — shields-config workflow uploads only redacted installer logs or omits installer logs when NVIDIA_API_KEY is present. The live Vitest scenario covers much of the functional shields behavior, but the changed workflow is secret-bearing and the highest-risk paths are artifact handling, secret scrubbing, Docker credential lifetime, and static workflow-boundary enforcement.
  • **Runtime validation** — uploaded shields-config artifacts contain no nvapi-, sk-, Bearer, GitHub token, Docker credential, or other supported secret-shaped values. The live Vitest scenario covers much of the functional shields behavior, but the changed workflow is secret-bearing and the highest-risk paths are artifact handling, secret scrubbing, Docker credential lifetime, and static workflow-boundary enforcement.
  • **Runtime validation** — shields-config Docker Hub auth uses isolated DOCKER_CONFIG under RUNNER_TEMP and an always() logout/removal cleanup step. The live Vitest scenario covers much of the functional shields behavior, but the changed workflow is secret-bearing and the highest-risk paths are artifact handling, secret scrubbing, Docker credential lifetime, and static workflow-boundary enforcement.
  • **Runtime validation** — workflow-boundary timeout error names the intentional Vitest shields timeout policy instead of claiming 45 minutes is legacy. The live Vitest scenario covers much of the functional shields behavior, but the changed workflow is secret-bearing and the highest-risk paths are artifact handling, secret scrubbing, Docker credential lifetime, and static workflow-boundary enforcement.
  • **Workflow-boundary validation requires the insecure raw installer artifact** — Invert the workflow-boundary contract: reject shields-config artifact uploads containing /tmp/nemoclaw-e2e-shields-install.log directly, require only sanitized artifact paths when an installer log is uploaded, and add support-test coverage for that rejection.
  • **Acceptance clause:** Refs Epic: Migrate legacy bash E2E into the Vitest E2E system #5098 — add test evidence or identify existing coverage. The PR body references Epic: Migrate legacy bash E2E into the Vitest E2E system #5098, but deterministic context did not provide linked issue body text or issue comments, so literal issue acceptance clauses could not be extracted or fully verified.
  • **Acceptance clause:** Workflow changes: add discrete dispatchable Vitest job `shields-config-vitest`; keep legacy shell workflow and script for Epic: Migrate legacy bash E2E into the Vitest E2E system #5098 Phase 11 cleanup. — add test evidence or identify existing coverage. .github/workflows/e2e-vitest-scenarios.yaml adds shields-config-vitest, selector allowlists, and report-to-pr dependency; support tests cover selector paths; test/e2e/test-shields-config.sh and nightly shields-config-e2e remain. However, the new workflow uploads a raw secret-bearing installer log, so the workflow change is not acceptable as-is.
Since last review details

Current findings:

  • Source-of-truth review needed: shields-config installer log artifact upload: The advisor marked localized patch analysis as missing.
    • Recommendation: Identify the invalid state, source boundary, source-fix constraint, regression test, and removal condition before merging the localized behavior.
    • Evidence: .github/workflows/e2e-vitest-scenarios.yaml uploads /tmp/nemoclaw-e2e-shields-install.log; the Vitest test writes that file during install with NVIDIA_API_KEY; workflow-boundary requires the raw path.
  • Source-of-truth review needed: shields-config Vitest timeout validator message: The advisor marked localized patch analysis as needs_followup.
    • Recommendation: Identify the invalid state, source boundary, source-fix constraint, regression test, and removal condition before merging the localized behavior.
    • Evidence: workflow-boundary.mts emits `shields-config-vitest job must keep the legacy 45 minute timeout`; nightly-e2e.yaml sets shields-config-e2e timeout_minutes: 30.
  • Raw shields installer log can expose NVIDIA_API_KEY (.github/workflows/e2e-vitest-scenarios.yaml:957): The new shields-config job uploads /tmp/nemoclaw-e2e-shields-install.log directly. The Vitest test writes that file from bash install.sh while NVIDIA_API_KEY is present in the child environment. ShellProbe redaction protects captured command artifacts, but it does not scrub the redirected raw /tmp file before upload. The workflow-boundary validator also requires this raw path, turning the risky behavior into an enforced workflow contract.
    • Recommendation: Do not upload the raw /tmp installer log. Either omit it, or write only a redacted copy under e2e-artifacts/vitest/shields-config/ after a fail-closed scrub that rejects nvapi-, sk-, Bearer, GitHub-token-shaped, Docker credential, and other secret-shaped values. Update tools/e2e-scenarios/workflow-boundary.mts to reject direct raw /tmp installer-log uploads for this secret-bearing job.
    • Evidence: .github/workflows/e2e-vitest-scenarios.yaml uploads both e2e-artifacts/vitest/shields-config/ and /tmp/nemoclaw-e2e-shields-install.log. test/e2e-scenario/live/shields-config.test.ts defines INSTALL_LOG as /tmp/nemoclaw-e2e-shields-install.log and runs `bash install.sh --non-interactive > ${INSTALL_LOG} 2>&1` with NVIDIA_API_KEY: apiKey. tools/e2e-scenarios/workflow-boundary.mts calls requireUploadPathContains for the same raw /tmp path.
  • Shields Docker Hub auth is not isolated or cleaned up (.github/workflows/e2e-vitest-scenarios.yaml:903): The new shields-config job logs in to Docker Hub with DOCKERHUB_USERNAME and DOCKERHUB_TOKEN but does not configure an isolated DOCKER_CONFIG and does not run an always() logout/removal cleanup step. That leaves Docker credentials in Docker's default credential location for later steps in the same job and relies on runner teardown for cleanup.
    • Recommendation: Match the stronger nearby pattern: set DOCKER_CONFIG under RUNNER_TEMP before docker login, create it with mode 700, and add an always() cleanup step that runs docker logout docker.io and removes that directory.
    • Evidence: shields-config-vitest has an Authenticate to Docker Hub step with DOCKERHUB_USERNAME/DOCKERHUB_TOKEN and docker login, but no DOCKER_CONFIG setup and no cleanup step. The model-router-provider-routed-inference-vitest job configures ${RUNNER_TEMP}/docker-config-model-router-provider-routed-inference and removes it in Clean up Docker auth.
  • Workflow-boundary validation requires the insecure raw installer artifact (tools/e2e-scenarios/workflow-boundary.mts:688): The static workflow boundary for shields-config checks that the raw /tmp installer log is present in the upload path. For this secret-bearing job, the boundary should protect artifact sanitization and reject direct raw secret-bearing log uploads instead of encoding them as required.
    • Recommendation: Invert the workflow-boundary contract: reject shields-config artifact uploads containing /tmp/nemoclaw-e2e-shields-install.log directly, require only sanitized artifact paths when an installer log is uploaded, and add support-test coverage for that rejection.
    • Evidence: validateShieldsConfigVitestJob requires uploadPath to contain /tmp/nemoclaw-e2e-shields-install.log. The support test changes add selector/reporting coverage for shields-config but do not assert sanitized installer artifact behavior.
  • Validator calls the 45 minute shields timeout legacy even though the legacy job is 30 minutes (tools/e2e-scenarios/workflow-boundary.mts:641): The new workflow-boundary error says shields-config-vitest must keep the legacy 45 minute timeout, but the retained legacy nightly shields-config-e2e job uses timeout_minutes: 30. The 45 minute Vitest timeout may be reasonable for source install plus live probes, but the validator currently misidentifies the source of truth.
    • Recommendation: Change the validator message to describe the chosen Vitest timeout policy, or add a documented source for intentionally increasing the timeout from the legacy 30 minute shell job. Add support-test coverage for the corrected message or policy.
    • Evidence: tools/e2e-scenarios/workflow-boundary.mts emits `shields-config-vitest job must keep the legacy 45 minute timeout`; .github/workflows/e2e-vitest-scenarios.yaml sets timeout-minutes: 45; .github/workflows/nightly-e2e.yaml still wires shields-config-e2e with timeout_minutes: 30.

Workflow run details

This is an automated advisory review. A human maintainer must make the final merge decision.

@wscurran wscurran added area: e2e End-to-end tests, nightly failures, or validation infrastructure chore Build, CI, dependency, or tooling maintenance labels Jun 12, 2026
@wscurran

Copy link
Copy Markdown
Contributor

@github-actions

Copy link
Copy Markdown
Contributor

Vitest E2E Scenario Results — ❌ Some jobs failed

Run: 27422829805
Workflow ref: e2e-migrate/test-shields-config
Requested scenarios: (default — all supported)
Requested jobs: shields-config-vitest
Summary: 2 passed, 1 failed, 17 skipped

Job Result
credential-migration-vitest ⏭️ skipped
double-onboard-vitest ⏭️ skipped
gateway-guard-recovery ⏭️ skipped
generate-matrix ✅ success
hermes-e2e-vitest ⏭️ skipped
hermes-root-entrypoint-smoke-vitest ⏭️ skipped
inference-routing-vitest ⏭️ skipped
issue-4434-tui-unreachable-inference-vitest ⏭️ skipped
launchable-smoke-vitest ⏭️ skipped
live-scenarios ⏭️ skipped
model-router-provider-routed-inference-vitest ⏭️ skipped
network-policy-vitest ⏭️ skipped
onboard-negative-paths-vitest ⏭️ skipped
openclaw-tui-chat-correlation-vitest ⏭️ skipped
openshell-version-pin-vitest ⏭️ skipped
rebuild-openclaw-vitest ⏭️ skipped
runtime-overrides-vitest ⏭️ skipped
shields-config-vitest ❌ failure
token-rotation-vitest ⏭️ skipped
validate-jobs ✅ success

Failed jobs: shields-config-vitest. Check run artifacts for logs.

@github-actions

Copy link
Copy Markdown
Contributor

Vitest E2E Scenario Results — ✅ All jobs passed

Run: 27423343134
Workflow ref: e2e-migrate/test-shields-config
Requested scenarios: (default — all supported)
Requested jobs: shields-config-vitest
Summary: 3 passed, 0 failed, 17 skipped

Job Result
credential-migration-vitest ⏭️ skipped
double-onboard-vitest ⏭️ skipped
gateway-guard-recovery ⏭️ skipped
generate-matrix ✅ success
hermes-e2e-vitest ⏭️ skipped
hermes-root-entrypoint-smoke-vitest ⏭️ skipped
inference-routing-vitest ⏭️ skipped
issue-4434-tui-unreachable-inference-vitest ⏭️ skipped
launchable-smoke-vitest ⏭️ skipped
live-scenarios ⏭️ skipped
model-router-provider-routed-inference-vitest ⏭️ skipped
network-policy-vitest ⏭️ skipped
onboard-negative-paths-vitest ⏭️ skipped
openclaw-tui-chat-correlation-vitest ⏭️ skipped
openshell-version-pin-vitest ⏭️ skipped
rebuild-openclaw-vitest ⏭️ skipped
runtime-overrides-vitest ⏭️ skipped
shields-config-vitest ✅ success
token-rotation-vitest ⏭️ skipped
validate-jobs ✅ success

…lds-config

# Conflicts:
#	.github/workflows/e2e-vitest-scenarios.yaml
#	tools/e2e-scenarios/workflow-boundary.mts

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (3)
tools/e2e-scenarios/workflow-boundary.mts (3)

1728-1745: ⚠️ Potential issue | 🟠 Major | ⚡ Quick win

generate-matrix validation missed the new skill-agent route.

The workflow shell now whitelists skill-agent-vitest and skill-agent, but this boundary check never requires either literal in the Generate Vitest scenario matrix script. Since the support test additions only exercise evaluateE2eVitestWorkflowDispatchSelectors() for skill-agent, removing the shell mapping from .github/workflows/e2e-vitest-scenarios.yaml would still leave this suite green.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@tools/e2e-scenarios/workflow-boundary.mts` around lines 1728 - 1745, The test
is missing assertions for the new skill-agent route: update the validation block
that calls requireRunContains(errors, generate, ...) in workflow-boundary.mts to
also require "skill-agent-vitest" and "skill-agent" (matching the other literal
checks like "inference-routing-vitest" and "inference-routing") so the Generate
Vitest scenario matrix validation enforces the new shell whitelist; locate the
group of requireRunContains calls that reference generate and add the two
missing literals there.

641-650: ⚠️ Potential issue | 🟠 Major | ⚡ Quick win

Validate the full shields-config env contract.

This validator only enforces NEMOCLAW_RUN_E2E_SCENARIOS, E2E_ARTIFACT_DIR, and OPENSHELL_GATEWAY. The live test and the legacy test/e2e/test-shields-config.sh contract also require NEMOCLAW_NON_INTERACTIVE=1, NEMOCLAW_ACCEPT_THIRD_PARTY_SOFTWARE=1, and NEMOCLAW_SANDBOX_NAME=e2e-shields; if any of those drift in the workflow, the boundary check still passes and the lane fails later at runtime.

Suggested guard additions
   if (jobEnv.OPENSHELL_GATEWAY !== "nemoclaw") {
     errors.push("shields-config-vitest job must force OPENSHELL_GATEWAY=nemoclaw");
   }
+  if (jobEnv.NEMOCLAW_NON_INTERACTIVE !== "1") {
+    errors.push("shields-config-vitest job must set NEMOCLAW_NON_INTERACTIVE=1");
+  }
+  if (jobEnv.NEMOCLAW_ACCEPT_THIRD_PARTY_SOFTWARE !== "1") {
+    errors.push("shields-config-vitest job must set NEMOCLAW_ACCEPT_THIRD_PARTY_SOFTWARE=1");
+  }
+  if (jobEnv.NEMOCLAW_SANDBOX_NAME !== "e2e-shields") {
+    errors.push("shields-config-vitest job must set NEMOCLAW_SANDBOX_NAME=e2e-shields");
+  }
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@tools/e2e-scenarios/workflow-boundary.mts` around lines 641 - 650, The
validator currently checks jobEnv for NEMOCLAW_RUN_E2E_SCENARIOS,
E2E_ARTIFACT_DIR, and OPENSHELL_GATEWAY but misses other required environment
contract variables; update the same check block referencing jobEnv to also
validate NEMOCLAW_NON_INTERACTIVE === "1", NEMOCLAW_ACCEPT_THIRD_PARTY_SOFTWARE
=== "1", and NEMOCLAW_SANDBOX_NAME === "e2e-shields", and push descriptive error
messages into errors (same style as the existing errors.push calls) so any drift
in those env vars fails fast.

651-681: ⚠️ Potential issue | 🟠 Major | ⚡ Quick win

Keep Docker Hub credentials scoped to the auth step.

Unlike network-policy-vitest and model-router-provider-routed-inference-vitest, this validator never rejects DOCKERHUB_USERNAME / DOCKERHUB_TOKEN at job scope or on non-auth steps. That means a future workflow change can expose registry credentials to branch-controlled test code in Run shields-config live test without tripping the boundary suite.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@tools/e2e-scenarios/workflow-boundary.mts` around lines 651 - 681, Add checks
to reject DOCKERHUB_USERNAME and DOCKERHUB_TOKEN at the job scope and on any
non-auth steps: call requireEnvDoesNotExposeSecret(errors,
"shields-config-vitest job", jobEnv, "DOCKERHUB_USERNAME") and similarly for
"DOCKERHUB_TOKEN" (mirroring the existing NVIDIA_API_KEY check), and in the
per-step loop call requireEnvDoesNotExposeSecret(errors, `shields-config-vitest
step '${step.name ?? step.uses ?? "<unnamed>"}'`, asRecord(step.env),
"DOCKERHUB_USERNAME") and "DOCKERHUB_TOKEN" for every step except the Docker Hub
auth step (identified by requireJobStep(..., "Authenticate to Docker Hub") /
dockerHubAuth) so only the Authenticate to Docker Hub step may receive these
secrets.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Outside diff comments:
In `@tools/e2e-scenarios/workflow-boundary.mts`:
- Around line 1728-1745: The test is missing assertions for the new skill-agent
route: update the validation block that calls requireRunContains(errors,
generate, ...) in workflow-boundary.mts to also require "skill-agent-vitest" and
"skill-agent" (matching the other literal checks like "inference-routing-vitest"
and "inference-routing") so the Generate Vitest scenario matrix validation
enforces the new shell whitelist; locate the group of requireRunContains calls
that reference generate and add the two missing literals there.
- Around line 641-650: The validator currently checks jobEnv for
NEMOCLAW_RUN_E2E_SCENARIOS, E2E_ARTIFACT_DIR, and OPENSHELL_GATEWAY but misses
other required environment contract variables; update the same check block
referencing jobEnv to also validate NEMOCLAW_NON_INTERACTIVE === "1",
NEMOCLAW_ACCEPT_THIRD_PARTY_SOFTWARE === "1", and NEMOCLAW_SANDBOX_NAME ===
"e2e-shields", and push descriptive error messages into errors (same style as
the existing errors.push calls) so any drift in those env vars fails fast.
- Around line 651-681: Add checks to reject DOCKERHUB_USERNAME and
DOCKERHUB_TOKEN at the job scope and on any non-auth steps: call
requireEnvDoesNotExposeSecret(errors, "shields-config-vitest job", jobEnv,
"DOCKERHUB_USERNAME") and similarly for "DOCKERHUB_TOKEN" (mirroring the
existing NVIDIA_API_KEY check), and in the per-step loop call
requireEnvDoesNotExposeSecret(errors, `shields-config-vitest step '${step.name
?? step.uses ?? "<unnamed>"}'`, asRecord(step.env), "DOCKERHUB_USERNAME") and
"DOCKERHUB_TOKEN" for every step except the Docker Hub auth step (identified by
requireJobStep(..., "Authenticate to Docker Hub") / dockerHubAuth) so only the
Authenticate to Docker Hub step may receive these secrets.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Enterprise

Run ID: 71c46994-0139-48d0-be33-ff03a4d77ccb

📥 Commits

Reviewing files that changed from the base of the PR and between 9ffd2d5 and 477ef40.

📒 Files selected for processing (3)
  • .github/workflows/e2e-vitest-scenarios.yaml
  • test/e2e-scenario/support-tests/e2e-scenarios-workflow.test.ts
  • tools/e2e-scenarios/workflow-boundary.mts

@github-actions

Copy link
Copy Markdown
Contributor

Vitest E2E Scenario Results — ✅ All jobs passed

Run: 27424342425
Workflow ref: e2e-migrate/test-shields-config
Requested scenarios: (default — all supported)
Requested jobs: shields-config-vitest
Summary: 3 passed, 0 failed, 18 skipped

Job Result
credential-migration-vitest ⏭️ skipped
double-onboard-vitest ⏭️ skipped
gateway-guard-recovery ⏭️ skipped
generate-matrix ✅ success
hermes-e2e-vitest ⏭️ skipped
hermes-root-entrypoint-smoke-vitest ⏭️ skipped
inference-routing-vitest ⏭️ skipped
issue-4434-tui-unreachable-inference-vitest ⏭️ skipped
launchable-smoke-vitest ⏭️ skipped
live-scenarios ⏭️ skipped
model-router-provider-routed-inference-vitest ⏭️ skipped
network-policy-vitest ⏭️ skipped
onboard-negative-paths-vitest ⏭️ skipped
openclaw-tui-chat-correlation-vitest ⏭️ skipped
openshell-version-pin-vitest ⏭️ skipped
rebuild-openclaw-vitest ⏭️ skipped
runtime-overrides-vitest ⏭️ skipped
shields-config-vitest ✅ success
skill-agent-vitest ⏭️ skipped
token-rotation-vitest ⏭️ skipped
validate-jobs ✅ success

@github-actions

Copy link
Copy Markdown
Contributor

Vitest E2E Scenario Results — ✅ All jobs passed

Run: 27424851030
Workflow ref: e2e-migrate/test-shields-config
Requested scenarios: (default — all supported)
Requested jobs: shields-config-vitest
Summary: 3 passed, 0 failed, 18 skipped

Job Result
credential-migration-vitest ⏭️ skipped
double-onboard-vitest ⏭️ skipped
gateway-guard-recovery ⏭️ skipped
generate-matrix ✅ success
hermes-e2e-vitest ⏭️ skipped
hermes-root-entrypoint-smoke-vitest ⏭️ skipped
inference-routing-vitest ⏭️ skipped
issue-4434-tui-unreachable-inference-vitest ⏭️ skipped
launchable-smoke-vitest ⏭️ skipped
live-scenarios ⏭️ skipped
model-router-provider-routed-inference-vitest ⏭️ skipped
network-policy-vitest ⏭️ skipped
onboard-negative-paths-vitest ⏭️ skipped
openclaw-tui-chat-correlation-vitest ⏭️ skipped
openshell-version-pin-vitest ⏭️ skipped
rebuild-openclaw-vitest ⏭️ skipped
runtime-overrides-vitest ⏭️ skipped
shields-config-vitest ✅ success
skill-agent-vitest ⏭️ skipped
token-rotation-vitest ⏭️ skipped
validate-jobs ✅ success

…lds-config

# Conflicts:
#	.github/workflows/e2e-vitest-scenarios.yaml
@github-actions

Copy link
Copy Markdown
Contributor

Vitest E2E Scenario Results — ✅ All jobs passed

Run: 27425417063
Workflow ref: e2e-migrate/test-shields-config
Requested scenarios: (default — all supported)
Requested jobs: shields-config-vitest
Summary: 3 passed, 0 failed, 19 skipped

Job Result
credential-migration-vitest ⏭️ skipped
double-onboard-vitest ⏭️ skipped
gateway-guard-recovery ⏭️ skipped
generate-matrix ✅ success
hermes-e2e-vitest ⏭️ skipped
hermes-root-entrypoint-smoke-vitest ⏭️ skipped
inference-routing-vitest ⏭️ skipped
issue-4434-tui-unreachable-inference-vitest ⏭️ skipped
launchable-smoke-vitest ⏭️ skipped
live-scenarios ⏭️ skipped
model-router-provider-routed-inference-vitest ⏭️ skipped
network-policy-vitest ⏭️ skipped
onboard-negative-paths-vitest ⏭️ skipped
openclaw-tui-chat-correlation-vitest ⏭️ skipped
openshell-version-pin-vitest ⏭️ skipped
rebuild-openclaw-vitest ⏭️ skipped
runtime-overrides-vitest ⏭️ skipped
sandbox-survival-vitest ⏭️ skipped
shields-config-vitest ✅ success
skill-agent-vitest ⏭️ skipped
token-rotation-vitest ⏭️ skipped
validate-jobs ✅ success

@github-actions

Copy link
Copy Markdown
Contributor

Vitest E2E Scenario Results — ✅ All jobs passed

Run: 27426331947
Workflow ref: e2e-migrate/test-shields-config
Requested scenarios: (default — all supported)
Requested jobs: shields-config-vitest
Summary: 3 passed, 0 failed, 19 skipped

Job Result
credential-migration-vitest ⏭️ skipped
double-onboard-vitest ⏭️ skipped
gateway-guard-recovery ⏭️ skipped
generate-matrix ✅ success
hermes-e2e-vitest ⏭️ skipped
hermes-root-entrypoint-smoke-vitest ⏭️ skipped
inference-routing-vitest ⏭️ skipped
issue-4434-tui-unreachable-inference-vitest ⏭️ skipped
launchable-smoke-vitest ⏭️ skipped
live-scenarios ⏭️ skipped
model-router-provider-routed-inference-vitest ⏭️ skipped
network-policy-vitest ⏭️ skipped
onboard-negative-paths-vitest ⏭️ skipped
openclaw-tui-chat-correlation-vitest ⏭️ skipped
openshell-version-pin-vitest ⏭️ skipped
rebuild-openclaw-vitest ⏭️ skipped
runtime-overrides-vitest ⏭️ skipped
sandbox-survival-vitest ⏭️ skipped
shields-config-vitest ✅ success
skill-agent-vitest ⏭️ skipped
token-rotation-vitest ⏭️ skipped
validate-jobs ✅ success

…lds-config

# Conflicts:
#	.github/workflows/e2e-vitest-scenarios.yaml
#	test/e2e-scenario/support-tests/e2e-scenarios-workflow.test.ts
@jyaunches jyaunches merged commit 426d354 into main Jun 12, 2026
64 of 65 checks passed
@jyaunches jyaunches deleted the e2e-migrate/test-shields-config branch June 12, 2026 16:03
@github-actions

Copy link
Copy Markdown
Contributor

Vitest E2E Scenario Results — ✅ All jobs passed

Run: 27427097739
Workflow ref: e2e-migrate/test-shields-config
Requested scenarios: (default — all supported)
Requested jobs: shields-config-vitest
Summary: 3 passed, 0 failed, 20 skipped

Job Result
credential-migration-vitest ⏭️ skipped
double-onboard-vitest ⏭️ skipped
gateway-guard-recovery ⏭️ skipped
generate-matrix ✅ success
hermes-e2e-vitest ⏭️ skipped
hermes-root-entrypoint-smoke-vitest ⏭️ skipped
inference-routing-vitest ⏭️ skipped
issue-4434-tui-unreachable-inference-vitest ⏭️ skipped
launchable-smoke-vitest ⏭️ skipped
live-scenarios ⏭️ skipped
model-router-provider-routed-inference-vitest ⏭️ skipped
network-policy-vitest ⏭️ skipped
onboard-negative-paths-vitest ⏭️ skipped
openclaw-tui-chat-correlation-vitest ⏭️ skipped
openshell-version-pin-vitest ⏭️ skipped
rebuild-openclaw-vitest ⏭️ skipped
runtime-overrides-vitest ⏭️ skipped
sandbox-rebuild-vitest ⏭️ skipped
sandbox-survival-vitest ⏭️ skipped
shields-config-vitest ✅ success
skill-agent-vitest ⏭️ skipped
token-rotation-vitest ⏭️ skipped
validate-jobs ✅ success

@cv cv added the v0.0.65 Release target label Jun 13, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area: e2e End-to-end tests, nightly failures, or validation infrastructure chore Build, CI, dependency, or tooling maintenance v0.0.65 Release target

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants