Skip to content

fix(e2e): correct full release gate lanes - #5917

Merged
cv merged 7 commits into
mainfrom
codex/full-release-gate-cleanup
Jun 28, 2026
Merged

fix(e2e): correct full release gate lanes#5917
cv merged 7 commits into
mainfrom
codex/full-release-gate-cleanup

Conversation

@cv

@cv cv commented Jun 28, 2026

Copy link
Copy Markdown
Collaborator

Summary

Correct the deterministic failures exposed by the full nightly/Vitest release gate. The fixes cover credential and project selection, hosted Ultra tool compatibility, a stable Slack policy probe, and OpenShell's single-line command boundary.

Changes

  • pass NVIDIA_API_KEY to the Model Router workflow and stage it under the router's NVIDIA_INFERENCE_API_KEY credential boundary
  • mirror the public-key fix in the retained regression Bash lane and add behavioral support coverage for key selection and staging
  • run test/gateway-drift-preflight.test.ts through the integration Vitest project
  • extend the workflow boundary validator so both command and credential contracts fail closed on future drift
  • disable OpenClaw native Tool Search for hosted Nemotron 3 Ultra so it uses structured tool calls instead of invalid generated JavaScript
  • probe the Slack preset through the non-redirecting slack.com/api/api.test endpoint in both Bash and Vitest lanes, using prompt-synchronized expect and an applied-policy assertion
  • pass the Hermes API-key shape check as direct single-line argv accepted by current OpenShell, with support coverage

Type of Change

  • Code change (feature, bug fix, or refactor)
  • Code change with doc updates
  • Doc only (prose changes, no code sample modifications)
  • Doc only (includes code sample changes)

Quality Gates

  • Tests added or updated for changed behavior
  • Existing tests cover changed behavior — justification: the existing gateway-drift integration test and workflow-boundary suite exercise the corrected project and workflow contract
  • Tests not applicable — justification:
  • Docs updated for user-facing behavior changes
  • Docs not applicable — justification: release-gate workflow and test-harness behavior only
  • Sensitive paths changed (security, policy, credentials, preflight, onboarding, inference, runner, sandbox, or messaging)
  • Sensitive-path review completed or maintainer-approved waiver recorded — reviewer/approval link/justification: the public key remains step-scoped, the live helper stages only the credential aliases consumed by Model Router, and boundary tests reject hosted-key regression. The expect trust boundary is explicitly accepted: it is an existing reviewed host tool in the retained Bash lane; the Vitest lane installs it only from Ubuntu apt in trusted workflow YAML, feeds it only a regex-constrained numeric menu index plus literal Y, and enforces that shape with support and workflow-boundary tests.
  • Non-success, skipped, or missing CI check accepted by maintainer — check name, approval link, and follow-up issue:

Verification

  • PR description includes the DCO sign-off declaration and every commit appears as Verified in GitHub
  • Git hooks passed during commit and push, or npx prek run --from-ref main --to-ref HEAD passes
  • Targeted tests pass for changed behavior
  • Full npm test passes (broad runtime changes only)
  • Quality Gates section completed with required justifications or waivers
  • No secrets, API keys, or credentials committed
  • npm run docs builds without warnings (doc changes only)
  • Doc pages follow the style guide (doc changes only)
  • New doc pages include SPDX header and frontmatter (new pages only)

Signed-off-by: Carlos Villela cvillela@nvidia.com

Summary by CodeRabbit

  • New Features
    • Added a Nemotron 3 Ultra managed inference route with native tool search disabled.
  • Bug Fixes
    • Updated routed-inference E2E credential wiring and secret redaction to use NVIDIA_API_KEY (nvapi-*) instead of NVIDIA_INFERENCE_API_KEY.
    • Updated network-policy Slack connectivity checks to target https://slack.com/api/api.test.
  • Tests
    • Expanded router/gateway-drift preflight Vitest coverage (correct env staging and integration project selection).
    • Added/strengthened Hermes and network-policy interactive preset parsing/expect sequencing tests.
    • Added a regression assertion for workflow env handling.
  • Chores
    • Improved CI workflow validation and ensured host dependency installation sequencing; adjusted a test file size budget.

Signed-off-by: Carlos Villela <cvillela@nvidia.com>
@cv cv self-assigned this Jun 28, 2026
@coderabbitai

coderabbitai Bot commented Jun 28, 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

Updates model-router provider-routed inference to use NVIDIA_API_KEY in workflow and test wiring, adds shared helper logic and coverage, changes gateway-drift-preflight Vitest project selection, updates Hermes command probing, retargets Slack network-policy checks, and adds Nemotron managed-inference configuration and validation.

Changes

E2E workflow and scenario updates

Layer / File(s) Summary
Model-router helpers and support tests
test/e2e-scenario/live/model-router-provider-routed-inference-helpers.ts, test/e2e-scenario/support-tests/model-router-provider-routed-inference.test.ts
Exports the public-key env name, secret accessor interface, key validation, and provider-routed env construction; the support test covers the key lookup and env shaping behavior.
Model-router live test and shell onboarding
test/e2e-scenario/live/model-router-provider-routed-inference.test.ts, test/e2e/test-model-router-provider-routed-inference.sh
The live provider-routed inference test switches to the shared helpers for key selection and env construction, and the shell scenario now redacts and validates NVIDIA_API_KEY before staging onboarding env values from it.
Model-router workflow wiring and boundary checks
.github/workflows/regression-e2e.yaml, .github/workflows/e2e-vitest-scenarios.yaml, test/regression-e2e-workflow.test.ts, tools/e2e-scenarios/workflow-boundary.mts
The workflow jobs now pass NVIDIA_API_KEY into the model-router E2E and Vitest runs, the regression contract asserts that step wiring, and workflow-boundary validation checks the same secret name in the model-router Vitest job.
Network-policy interactive flow
test/e2e-scenario/live/network-policy-interactive.ts, test/e2e-scenario/support-tests/network-policy-interactive.test.ts, test/e2e-scenario/live/network-policy.test.ts, test/e2e/test-network-policy.sh, test/e2e-script-workflow.test.ts, .github/workflows/e2e-vitest-scenarios.yaml, tools/e2e-scenarios/workflow-boundary.mts
The network-policy scenario now drives policy-add through a shared expect script and preset lookup helper, and the live test uses that split flow while retargeting Slack probes to the API test endpoint. The workflow and workflow-script tests also validate the inline host-dependency install step for network-policy-vitest.
Hermes probe and gateway drift validation
test/e2e-scenario/live/hermes-inference-switch-helpers.ts, test/e2e-scenario/support-tests/hermes-inference-switch-command-shape.test.ts, .github/workflows/e2e-vitest-scenarios.yaml, tools/e2e-scenarios/workflow-boundary.mts
The Hermes inference-switch probe now runs a grep-based command against the config file, and the gateway-drift-preflight Vitest job now uses the integration project and the gateway-drift test file in workflow validation and workflow YAML.
Nemotron managed-inference config
nemoclaw-blueprint/model-specific-setup/openclaw/nemotron-3-ultra-managed-inference.json, test/generate-openclaw-config.test.ts, ci/test-file-size-budget.json
The new Nemotron route configuration disables OpenClaw tool search for the managed-inference route, the config-generation test checks two Nemotron model IDs, and the file-size budget is updated for the test file.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~20 minutes

Possibly related PRs

  • NVIDIA/NemoClaw#5600: Directly changes the same e2e Vitest environment/secret wiring around NVIDIA_INFERENCE_API_KEY vs NVIDIA_API_KEY in workflow-boundary validation and the model-router provider-routed inference job.
  • NVIDIA/NemoClaw#5688: Modifies E2E/GitHub Actions workflow wiring so that jobs/tests use NVIDIA_API_KEY and adjust downstream env vars like NVIDIA_INFERENCE_API_KEY.
  • NVIDIA/NemoClaw#5890: Overlaps on tools/e2e-scenarios/workflow-boundary.mts secret/flag wiring, gating hosted-compatible inference based on whether steps reference NVIDIA_INFERENCE_API_KEY.

Suggested labels

area: ci, area: e2e, bug-fix, area: inference, provider: nvidia

Suggested reviewers

  • jyaunches
  • cjagwani
🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 5.56% 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 is concise and accurately points to the main change: fixing the full release-gate E2E/Vitest lanes.
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.
✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch codex/full-release-gate-cleanup

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

@github-code-quality

github-code-quality Bot commented Jun 28, 2026

Copy link
Copy Markdown
Contributor

Code Coverage Overview

Languages: TypeScript

TypeScript / code-coverage/plugin

The overall coverage in the codex/full-release-g... branch is 96%. Coverage data for the main branch is not yet available.

Show a code coverage summary of the most covered files.
File main codex/full-release-g... 27766b9 +/-
nemoclaw/src/se...cret-scanner.ts 100%
nemoclaw/src/commands/slash.ts 100%
nemoclaw/src/li...bprocess-env.ts 100%
nemoclaw/src/bl...eprint/state.ts 98%
nemoclaw/src/onboard/config.ts 98%
nemoclaw/src/bl...int/snapshot.ts 97%
nemoclaw/src/bl...print/runner.ts 95%
nemoclaw/src/co...ration-state.ts 94%
nemoclaw/src/bl...ate-networks.ts 94%
nemoclaw/src/index.ts 94%

TypeScript / code-coverage/cli

The overall coverage in the codex/full-release-g... branch is 68%. Coverage data for the main branch is not yet available.

Show a code coverage summary of the most covered files.
File main codex/full-release-g... 27766b9 +/-
src/lib/actions...all/run-plan.ts 80%
src/lib/state/o...oard-session.ts 79%
src/lib/actions...dbox/rebuild.ts 74%
src/lib/state/sandbox.ts 72%
src/lib/shields/index.ts 70%
src/lib/onboard/preflight.ts 69%
src/lib/actions...licy-channel.ts 59%
src/lib/onboard...er-gpu-patch.ts 59%
src/lib/policy/index.ts 52%
src/lib/onboard.ts 20%

Updated June 28, 2026 02:11 UTC
Code Coverage is in Public Preview. Learn more and provide us with your feedback.

@github-actions

github-actions Bot commented Jun 28, 2026

Copy link
Copy Markdown
Contributor

E2E Advisor Recommendation

Required E2E: network-policy-vitest, network-policy-e2e, model-router-provider-routed-inference-vitest, model-router-provider-routed-inference-e2e, openclaw-tui-chat-correlation-vitest, gateway-drift-preflight-vitest
Optional E2E: hermes-inference-switch-vitest, cloud-onboard-vitest, kimi-inference-compat-vitest

Workflow run

Full advisor summary

E2E Recommendation Advisor

Base: origin/main
Head: HEAD
Confidence: high

Required E2E

  • network-policy-vitest (high): Required because the PR changes the live network-policy Vitest scenario and its workflow host dependency setup. This job validates real OpenShell sandbox policy mutation, deny/allow enforcement, and the new interactive expect-based policy-add path.
  • network-policy-e2e (high): Required because the retained legacy network-policy shell E2E script is modified. It should run to prove the shell lane still covers live policy-add and sandbox egress behavior after the Slack endpoint change.
  • model-router-provider-routed-inference-vitest (medium): Required because credential selection and runtime staging changed from NVIDIA_INFERENCE_API_KEY to NVIDIA_API_KEY for the provider-routed Model Router path. This job validates real routed onboarding, host model-router health, and sandbox inference.local completions.
  • model-router-provider-routed-inference-e2e (medium): Required because the regression workflow and legacy shell E2E for provider-routed inference are modified. This verifies the selected regression lane receives NVIDIA_API_KEY and still proves inference.local returns a routed completion.
  • openclaw-tui-chat-correlation-vitest (high): Required because the new Nemotron 3 Ultra managed-inference manifest affects generated OpenClaw config for a hosted inference.local OpenClaw sandbox. This existing job is the closest live lane already pinned to nvidia/nvidia/nemotron-3-ultra and validates real OpenClaw chat over that route.
  • gateway-drift-preflight-vitest (low): Required because the E2E workflow invocation for this sandbox safety preflight changed from the cli Vitest project to the integration project. Run it to ensure the selected CI job still executes the stale-gateway fail-closed guard.

Optional E2E

  • hermes-inference-switch-vitest (high): Optional because only the Hermes inference-switch live test helper changed, not product runtime. Useful to confirm the new direct grep API-key shape probe works inside the real Hermes sandbox.
  • cloud-onboard-vitest (high): Optional broader confidence for hosted OpenClaw onboarding and generated config after adding a model-specific setup manifest, although it does not specifically target Nemotron 3 Ultra.
  • kimi-inference-compat-vitest (medium): Optional adjacent coverage for the model-specific setup framework and OpenClaw tool-search disabling behavior on a different managed-inference model path.

New E2E recommendations

  • OpenClaw Nemotron 3 Ultra managed-inference tool use (high): The PR adds a manifest specifically to avoid tool_search_code failures for Nemotron 3 Ultra, but the existing closest live job validates chat correlation rather than a real structured tool-call trajectory or absence of tool_search_code failures.
    • Suggested test: Add a live OpenClaw Nemotron 3 Ultra managed-inference scenario that onboards with nvidia/nvidia/nemotron-3-ultra via inference.local and asserts a tool-using assistant turn succeeds without tool_search_code failure logs.

@github-actions

github-actions Bot commented Jun 28, 2026

Copy link
Copy Markdown
Contributor

Vitest E2E Scenario Recommendation

Required Vitest E2E scenarios: model-router-provider-routed-inference-vitest, network-policy-vitest, hermes-inference-switch-vitest, agent-turn-latency-vitest
Optional Vitest E2E scenarios: openclaw-tui-chat-correlation-vitest

Dispatch required Vitest E2E scenarios:

  • gh workflow run e2e-vitest-scenarios.yaml --ref <pr-head-ref> --field jobs=model-router-provider-routed-inference-vitest
  • gh workflow run e2e-vitest-scenarios.yaml --ref <pr-head-ref> --field jobs=network-policy-vitest
  • gh workflow run e2e-vitest-scenarios.yaml --ref <pr-head-ref> --field jobs=hermes-inference-switch-vitest
  • gh workflow run e2e-vitest-scenarios.yaml --ref <pr-head-ref> --field jobs=agent-turn-latency-vitest

Workflow run

Full Vitest E2E advisor summary

Vitest E2E Scenario Advisor

Base: origin/main
Head: HEAD
Confidence: high

Required Vitest E2E scenarios

  • model-router-provider-routed-inference-vitest: Focused free-standing Vitest job wired for changed live test test/e2e-scenario/live/model-router-provider-routed-inference.test.ts.
    • Dispatch: gh workflow run e2e-vitest-scenarios.yaml --ref <pr-head-ref> --field jobs=model-router-provider-routed-inference-vitest
  • network-policy-vitest: Focused free-standing Vitest job wired for changed live test test/e2e-scenario/live/network-policy.test.ts.
    • Dispatch: gh workflow run e2e-vitest-scenarios.yaml --ref <pr-head-ref> --field jobs=network-policy-vitest
  • hermes-inference-switch-vitest: The PR changes the live Hermes inference switch helper used by the wired free-standing Vitest job, replacing the in-sandbox API-key shape probe with a direct grep argv. Run the job that consumes that helper.
    • Dispatch: gh workflow run e2e-vitest-scenarios.yaml --ref <pr-head-ref> --field jobs=hermes-inference-switch-vitest
  • agent-turn-latency-vitest: The PR adds a Nemotron 3 Ultra OpenClaw model-specific setup manifest affecting managed inference.local configuration. This wired live job uses that hosted Ultra model through OpenClaw and validates a real agent turn on the managed route.
    • Dispatch: gh workflow run e2e-vitest-scenarios.yaml --ref <pr-head-ref> --field jobs=agent-turn-latency-vitest

Optional Vitest E2E scenarios

  • openclaw-tui-chat-correlation-vitest: Optional adjacent coverage for the same hosted Nemotron 3 Ultra OpenClaw configuration on the TUI/chat-correlation path, separate from the primary agent-turn-latency manifest validation.
    • Dispatch: gh workflow run e2e-vitest-scenarios.yaml --ref <pr-head-ref> --field jobs=openclaw-tui-chat-correlation-vitest

Relevant changed files

  • .github/workflows/e2e-vitest-scenarios.yaml
  • nemoclaw-blueprint/model-specific-setup/openclaw/nemotron-3-ultra-managed-inference.json
  • test/e2e-scenario/live/hermes-inference-switch-helpers.ts
  • test/e2e-scenario/live/model-router-provider-routed-inference-helpers.ts
  • test/e2e-scenario/live/model-router-provider-routed-inference.test.ts
  • test/e2e-scenario/live/network-policy-interactive.ts
  • test/e2e-scenario/live/network-policy.test.ts
  • test/e2e-scenario/support-tests/hermes-inference-switch-command-shape.test.ts
  • test/e2e-scenario/support-tests/model-router-provider-routed-inference.test.ts
  • test/e2e-scenario/support-tests/network-policy-interactive.test.ts
  • test/e2e-script-workflow.test.ts
  • tools/e2e-scenarios/workflow-boundary.mts

@github-actions

github-actions Bot commented Jun 28, 2026

Copy link
Copy Markdown
Contributor

PR Review Advisor (Nemotron Ultra) — Changes requested

Merge posture: Do not merge yet
Primary next action: Fix PRA-3: NVIDIA_API_KEY secret must exist in GitHub repository settings; then add or justify PRA-T1.
Open items: 2 required · 8 warnings · 4 suggestions · 7 test follow-ups
Since last review: 5 prior items resolved · 4 still apply · 2 new items found

Action checklist

  • PRA-3 Fix: NVIDIA_API_KEY secret must exist in GitHub repository settings in tools/e2e-scenarios/workflow-boundary.mts:5180
  • PRA-4 Fix: New expect-based trust boundary for network-policy interactive tests requires explicit acceptance in test/e2e-scenario/live/network-policy-interactive.ts:1
  • PRA-1 Resolve or justify: Source-of-truth review needed: nemoclaw-blueprint/model-specific-setup/openclaw/nemotron-3-ultra-managed-inference.json
  • PRA-2 Resolve or justify: Source-of-truth review needed: test/e2e-scenario/live/model-router-provider-routed-inference-helpers.ts:25
  • PRA-5 Resolve or justify: API_KEY_SHAPE_PATTERN uses POSIX [[::space::]] character class assuming GNU grep in test/e2e-scenario/live/hermes-inference-switch-helpers.ts:329
  • PRA-6 Resolve or justify: Merge conflict risk with PR feat(mcp): add OpenShell-managed MCP servers #5876 (feat(mcp): add OpenShell-managed MCP servers) in .github/workflows/e2e-vitest-scenarios.yaml:1
  • PRA-7 Resolve or justify: Nemotron 3 Ultra blueprint is a workaround for external model behavior without upstream TODO link in nemoclaw-blueprint/model-specific-setup/openclaw/nemotron-3-ultra-managed-inference.json:1
  • PRA-10 Resolve or justify: New expect host dependency expands trusted code boundary in .github/workflows/e2e-vitest-scenarios.yaml:1875
  • PRA-13 Resolve or justify: Credential aliasing: public nvapi-* key staged as NVIDIA_INFERENCE_API_KEY for routed provider in test/e2e-scenario/live/model-router-provider-routed-inference-helpers.ts:25
  • PRA-14 Resolve or justify: Test contract updated for new credential flow but Model Router key format compatibility unverified in test/e2e-scenario/live/model-router-provider-routed-inference.test.ts:55
  • PRA-T1 Add or justify test follow-up: Runtime validation
  • PRA-T2 Add or justify test follow-up: Runtime validation
  • PRA-T3 Add or justify test follow-up: Runtime validation
  • PRA-T4 Add or justify test follow-up: Runtime validation
  • PRA-T5 Add or justify test follow-up: Runtime validation
  • PRA-T6 Add or justify test follow-up: nemoclaw-blueprint/model-specific-setup/openclaw/nemotron-3-ultra-managed-inference.json
  • PRA-T7 Add or justify test follow-up: test/e2e-scenario/live/model-router-provider-routed-inference-helpers.ts:25
  • PRA-8 In-scope improvement: Slack probe endpoint changed to slack.com/api/api.test with explanatory comment in test/e2e-scenario/live/network-policy.test.ts:505
  • PRA-9 In-scope improvement: Expect script exit codes documented in file header in test/e2e-scenario/live/network-policy-interactive.ts:14
  • PRA-11 In-scope improvement: Test comment updated to reference both Nemotron Super and Ultra models in test/generate-openclaw-config.test.ts:1320
  • PRA-12 In-scope improvement: Error message references NVIDIA_API_KEY constant correctly in test/e2e-scenario/live/model-router-provider-routed-inference-helpers.ts:15

Findings index

ID Severity Category Location Required action
PRA-1 Resolve/justify architecture Identify the invalid state, source boundary, source-fix constraint, regression test, and removal condition before merging the localized behavior.
PRA-2 Resolve/justify architecture Identify the invalid state, source boundary, source-fix constraint, regression test, and removal condition before merging the localized behavior.
PRA-3 Required correctness tools/e2e-scenarios/workflow-boundary.mts:5180 Confirm NVIDIA_API_KEY secret is configured in GitHub repository Settings > Secrets > Actions with an nvapi-* value. If only NVIDIA_INFERENCE_API_KEY exists, add NVIDIA_API_KEY with the same value.
PRA-4 Required security test/e2e-scenario/live/network-policy-interactive.ts:1 Document acceptance of this trust boundary in PR description. The findPolicyPresetNumber regex correctly captures (\d+) from numbered list output. Support test validates extraction logic. Comment in network-policy-interactive.ts documents the trust boundary (already present).
PRA-5 Resolve/justify correctness test/e2e-scenario/live/hermes-inference-switch-helpers.ts:329 Comment in hermes-inference-switch-helpers.ts notes the pattern assumes POSIX ERE grep (GNU grep on ubuntu-latest). No code change needed for current scope. Consider using [[:space:]] or \s if cross-platform grep compatibility becomes required.
PRA-6 Resolve/justify workflow .github/workflows/e2e-vitest-scenarios.yaml:1 Coordinate with PR #5876 author. Consider rebasing or resolving conflicts before merge. Monitor for overlapping changes to workflow-boundary.mts validation logic.
PRA-7 Resolve/justify architecture nemoclaw-blueprint/model-specific-setup/openclaw/nemotron-3-ultra-managed-inference.json:1 Add TODO comment in blueprint description with upstream issue link if NVIDIA/model provider has tracking for the tool_search_code emission bug. Or add a comment with expected removal condition.
PRA-8 Improvement correctness test/e2e-scenario/live/network-policy.test.ts:505 Change is correct and documented. Monitor test stability. No further action needed.
PRA-9 Improvement correctness test/e2e-scenario/live/network-policy-interactive.ts:14 Documentation is adequate. No further action needed.
PRA-10 Resolve/justify security .github/workflows/e2e-vitest-scenarios.yaml:1875 Document that expect is a reviewed host-tool consumer for network-policy interactive tests. Boundary enforcement is correct. No code change needed.
PRA-11 Improvement correctness test/generate-openclaw-config.test.ts:1320 Change is correct and complete. No further action needed.
PRA-12 Improvement correctness test/e2e-scenario/live/model-router-provider-routed-inference-helpers.ts:15 No change needed - validation is correct and constant used consistently. Error message is clear for operators.
PRA-13 Resolve/justify security test/e2e-scenario/live/model-router-provider-routed-inference-helpers.ts:25 Verify Model Router accepts nvapi-* keys for the routed provider. Add integration test or document the expected key format compatibility in the blueprint or helper.
PRA-14 Resolve/justify correctness test/e2e-scenario/live/model-router-provider-routed-inference.test.ts:55 Ensure live test passes with the new credential flow. No code change needed if test passes.

🚨 Required before merge

Address these before merging unless a maintainer explicitly overrides the advisor with rationale.

PRA-3 Required — NVIDIA_API_KEY secret must exist in GitHub repository settings

  • Location: tools/e2e-scenarios/workflow-boundary.mts:5180
  • Category: correctness
  • Problem: Workflow boundary validator enforces NVIDIA_API_KEY at step env for model-router-provider-routed-inference-vitest and sandbox-rlimits-connect-vitest jobs. If this secret is not configured in GitHub repository Settings > Secrets > Actions with an nvapi-* value, these CI jobs will fail at validation time.
  • Impact: CI jobs will fail at workflow validation, blocking provider-routed inference and sandbox rlimit connect E2E validations. The validator catches this at workflow validation time, not runtime.
  • Required action: Confirm NVIDIA_API_KEY secret is configured in GitHub repository Settings > Secrets > Actions with an nvapi-* value. If only NVIDIA_INFERENCE_API_KEY exists, add NVIDIA_API_KEY with the same value.
  • Expected follow-up: Fix before merge or get explicit maintainer override.
  • Verification: Check GitHub repo Settings > Secrets > Actions for NVIDIA_API_KEY. Search workflow-boundary.mts for 'sandbox-rlimits-connect-vitest step must receive NVIDIA_API_KEY from secrets' and 'model-router-provider-routed-inference-vitest Vitest step must receive NVIDIA_API_KEY from secrets'.
  • Missing regression test: Workflow boundary validator catches missing secret at validation time. No automated test for secret presence in GitHub repository settings.
  • Done when: The required change is committed and verification passes: Check GitHub repo Settings > Secrets > Actions for NVIDIA_API_KEY. Search workflow-boundary.mts for 'sandbox-rlimits-connect-vitest step must receive NVIDIA_API_KEY from secrets' and 'model-router-provider-routed-inference-vitest Vitest step must receive NVIDIA_API_KEY from secrets'.
  • Evidence: validateModelRouterProviderRoutedInferenceVitestJob and validateSandboxRlimitsConnectVitestJob both check for NVIDIA_API_KEY: ${{ secrets.NVIDIA_API_KEY }} in step env

PRA-4 Required — New expect-based trust boundary for network-policy interactive tests requires explicit acceptance

  • Location: test/e2e-scenario/live/network-policy-interactive.ts:1
  • Category: security
  • Problem: New expect script drives policy-add prompts using $env() expanded by expect. Preset number extracted via regex from CLI output and passed as NEMOCLAW_E2E_PRESET_NUM. This introduces a new trust boundary: expect script with sudo-adjacent host dependency (expect package installed via apt in trusted workflow YAML). No user input flows into the script (preset number from regex match, literal 'Y' for confirmation), but this boundary must be explicitly accepted before merge.
  • Impact: Low - environment variables controlled by test. However, this is a new trust boundary that expands the trusted code surface to include the expect package and script. The workflow boundary validator enforces inline installation in trusted YAML.
  • Required action: Document acceptance of this trust boundary in PR description. The findPolicyPresetNumber regex correctly captures (\d+) from numbered list output. Support test validates extraction logic. Comment in network-policy-interactive.ts documents the trust boundary (already present).
  • Expected follow-up: Fix before merge or get explicit maintainer override.
  • Verification: Check network-policy-interactive.test.ts support test validates preset number extraction. Regex: ^\s*\((\d+)\)\s+(?:\[●○\]\s+)?${escapedPreset}(?:\s|$). Expect script uses hardcoded 'Y\r' for confirmation, $env() for controlled env vars. Workflow boundary validator enforces inline expect installation.
  • Missing regression test: Support test covers preset number extraction; full interactive flow requires live infrastructure. Comment in network-policy-interactive.ts documents trust boundary acceptance.
  • Done when: The required change is committed and verification passes: Check network-policy-interactive.test.ts support test validates preset number extraction. Regex: ^\s*\((\d+)\)\s+(?:\[●○\]\s+)?${escapedPreset}(?:\s|$). Expect script uses hardcoded 'Y\r' for confirmation, $env() for controlled env vars. Workflow boundary validator enforces inline expect installation.
  • Evidence: findPolicyPresetNumber escapes regex metacharacters and captures only (\d+). Expect script uses hardcoded 'Y\r' for confirmation, $env() for controlled env vars. Workflow boundary validator enforces inline expect installation.
Review findings by urgency: 2 required fixes, 8 items to resolve/justify, 4 in-scope improvements

⚠️ Resolve or justify before merge

Investigate these in the current review; either fix them, explain why they are not applicable, or document the accepted risk.

PRA-1 Resolve/justify — Source-of-truth review needed: nemoclaw-blueprint/model-specific-setup/openclaw/nemotron-3-ultra-managed-inference.json

  • Location: not file-specific
  • Category: architecture
  • Problem: The advisor marked localized patch analysis as needs_followup.
  • Impact: A localized workaround can preserve or hide an invalid state when the source boundary is unclear.
  • Recommended action: Identify the invalid state, source boundary, source-fix constraint, regression test, and removal condition before merging the localized behavior.
  • Expected follow-up: Resolve in this PR or explain why the risk is acceptable.
  • Verification: Inspect the localized patch and source-of-truth review fields for a concrete invalid state, source boundary, source-fix constraint, regression test, and removal condition.
  • Missing regression test: Test validates toolSearch disabled for matching routes; no test for upstream model fix
  • Done when: The risk is fixed or explicitly justified in the PR. Verification: Inspect the localized patch and source-of-truth review fields for a concrete invalid state, source boundary, source-fix constraint, regression test, and removal condition.
  • Evidence: Blueprint description lacks upstream issue link or removal condition

PRA-2 Resolve/justify — Source-of-truth review needed: test/e2e-scenario/live/model-router-provider-routed-inference-helpers.ts:25

  • Location: not file-specific
  • Category: architecture
  • Problem: The advisor marked localized patch analysis as needs_followup.
  • Impact: A localized workaround can preserve or hide an invalid state when the source boundary is unclear.
  • Recommended action: Identify the invalid state, source boundary, source-fix constraint, regression test, and removal condition before merging the localized behavior.
  • Expected follow-up: Resolve in this PR or explain why the risk is acceptable.
  • Verification: Inspect the localized patch and source-of-truth review fields for a concrete invalid state, source boundary, source-fix constraint, regression test, and removal condition.
  • Missing regression test: Live test validates end-to-end flow works with aliasing
  • Done when: The risk is fixed or explicitly justified in the PR. Verification: Inspect the localized patch and source-of-truth review fields for a concrete invalid state, source boundary, source-fix constraint, regression test, and removal condition.
  • Evidence: buildProviderRoutedEnv sets NVIDIA_INFERENCE_API_KEY: apiKey where apiKey is nvapi-* from NVIDIA_API_KEY

PRA-5 Resolve/justify — API_KEY_SHAPE_PATTERN uses POSIX [[::space::]] character class assuming GNU grep

  • Location: test/e2e-scenario/live/hermes-inference-switch-helpers.ts:329
  • Category: correctness
  • Problem: The grep extended regex pattern uses [[::space::]] POSIX character class. Current CI runs on ubuntu-latest (GNU grep) where this works, but BSD grep (macOS, FreeBSD) may have different behavior. Comment added noting this assumption.
  • Impact: Low risk in current CI environment. Could cause false negatives/positives if tests ever run on non-GNU grep platforms.
  • Recommended action: Comment in hermes-inference-switch-helpers.ts notes the pattern assumes POSIX ERE grep (GNU grep on ubuntu-latest). No code change needed for current scope. Consider using [[:space:]] or \s if cross-platform grep compatibility becomes required.
  • Expected follow-up: Resolve in this PR or explain why the risk is acceptable.
  • Verification: Test runs on ubuntu-latest in CI; pattern validated by hermes-inference-switch-command-shape.test.ts support test.
  • Missing regression test: Support test covers current pattern; cross-platform grep compatibility not tested.
  • Done when: The risk is fixed or explicitly justified in the PR. Verification: Test runs on ubuntu-latest in CI; pattern validated by hermes-inference-switch-command-shape.test.ts support test.
  • Evidence: API_KEY_SHAPE_PATTERN = '^[[::space:]]*api_key:[[::space:]]*("sk-[^"[[::space:]]+"|\'sk-[^\'[[::space:]]+\'|sk-[^"\'[[::space:]]+)[[::space:]]*$' with comment: 'This live lane runs on ubuntu-latest and intentionally uses GNU grep\'s POSIX ERE character classes'

PRA-6 Resolve/justify — Merge conflict risk with PR #5876 (feat(mcp): add OpenShell-managed MCP servers)

  • Location: .github/workflows/e2e-vitest-scenarios.yaml:1
  • Category: workflow
  • Problem: PR feat(mcp): add OpenShell-managed MCP servers #5876 modifies 8 of the same files including workflow YAML, test files, and workflow-boundary.mts. High merge conflict risk.
  • Impact: Merge conflicts likely when both PRs are merged. Could require rebase or manual conflict resolution.
  • Recommended action: Coordinate with PR feat(mcp): add OpenShell-managed MCP servers #5876 author. Consider rebasing or resolving conflicts before merge. Monitor for overlapping changes to workflow-boundary.mts validation logic.
  • Expected follow-up: Resolve in this PR or explain why the risk is acceptable.
  • Verification: Check openPrOverlaps.sameFiles list from drift context. Both PRs modify .github/workflows/e2e-vitest-scenarios.yaml, .github/workflows/regression-e2e.yaml, ci/test-file-size-budget.json, test/e2e-scenario/live/network-policy.test.ts, test/e2e-script-workflow.test.ts, test/e2e/test-network-policy.sh, test/generate-openclaw-config.test.ts, tools/e2e-scenarios/workflow-boundary.mts.
  • Missing regression test: N/A - workflow coordination issue.
  • Done when: The risk is fixed or explicitly justified in the PR. Verification: Check openPrOverlaps.sameFiles list from drift context. Both PRs modify .github/workflows/e2e-vitest-scenarios.yaml, .github/workflows/regression-e2e.yaml, ci/test-file-size-budget.json, test/e2e-scenario/live/network-policy.test.ts, test/e2e-script-workflow.test.ts, test/e2e/test-network-policy.sh, test/generate-openclaw-config.test.ts, tools/e2e-scenarios/workflow-boundary.mts.
  • Evidence: openPrOverlaps shows PR feat(mcp): add OpenShell-managed MCP servers #5876 has sameFiles overlapping with this PR across 8 files

PRA-7 Resolve/justify — Nemotron 3 Ultra blueprint is a workaround for external model behavior without upstream TODO link

  • Location: nemoclaw-blueprint/model-specific-setup/openclaw/nemotron-3-ultra-managed-inference.json:1
  • Category: architecture
  • Problem: New blueprint disables native OpenClaw tool search for Nemotron 3 Ultra as a workaround for the model emitting invalid JavaScript for tool_search_code. Description explains the symptom but lacks upstream issue link tracking the model provider bug fix.
  • Impact: Workaround may persist longer than necessary without upstream tracking. Source-of-truth review: what invalid state is handled (model emits invalid JS), where created (upstream model behavior), why source cannot be fixed in this PR (external model), what regression test proves source cannot regress (none - model behavior), when workaround can be removed (when model fixed upstream).
  • Recommended action: Add TODO comment in blueprint description with upstream issue link if NVIDIA/model provider has tracking for the tool_search_code emission bug. Or add a comment with expected removal condition.
  • Expected follow-up: Resolve in this PR or explain why the risk is acceptable.
  • Verification: Check blueprint description for upstream issue reference. Current description: 'The model can emit invalid JavaScript for the tool_search_code surface and return "[tools] tool_search_code failed" instead of completing real tool calls; routing it back to the structured tool-calling surface preserves tool use.'
  • Missing regression test: No automated test for upstream model fix. Test only validates toolSearch is disabled for matching routes.
  • Done when: The risk is fixed or explicitly justified in the PR. Verification: Check blueprint description for upstream issue reference. Current description: 'The model can emit invalid JavaScript for the tool_search_code surface and return "[tools] tool_search_code failed" instead of completing real tool calls; routing it back to the structured tool-calling surface preserves tool use.'.
  • Evidence: Blueprint description lacks upstream issue link or removal condition

PRA-10 Resolve/justify — New expect host dependency expands trusted code boundary

  • Location: .github/workflows/e2e-vitest-scenarios.yaml:1875
  • Category: security
  • Problem: New expect host dependency installed via apt in workflow YAML expands trusted code boundary. Workflow boundary validator enforces this setup stays inline in trusted YAML (not via repo-local action with sudo). Comment documents: 'Expect is a reviewed host-tool consumer for the interactive policy-add test. Keep this privileged setup inline in trusted workflow YAML.'
  • Impact: Controlled expansion of trusted boundary. Only expect package installed, script receives only controlled env vars. Validator prevents loading repo-local actions with sudo.
  • Recommended action: Document that expect is a reviewed host-tool consumer for network-policy interactive tests. Boundary enforcement is correct. No code change needed.
  • Expected follow-up: Resolve in this PR or explain why the risk is acceptable.
  • Verification: Check workflow-boundary.mts validateNetworkPolicyVitestJob enforces install step has no 'uses' (inline), contains 'sudo apt-get install -y --no-install-recommends expect', and retry logic fragments.
  • Missing regression test: Workflow boundary validator tests enforce inline installation pattern.
  • Done when: The risk is fixed or explicitly justified in the PR. Verification: Check workflow-boundary.mts validateNetworkPolicyVitestJob enforces install step has no 'uses' (inline), contains 'sudo apt-get install -y --no-install-recommends expect', and retry logic fragments.
  • Evidence: Workflow YAML comment and workflow-boundary.mts validator enforce inline installation with retry logic

PRA-13 Resolve/justify — Credential aliasing: public nvapi-* key staged as NVIDIA_INFERENCE_API_KEY for routed provider

  • Location: test/e2e-scenario/live/model-router-provider-routed-inference-helpers.ts:25
  • Category: security
  • Problem: buildProviderRoutedEnv aliases the public NVIDIA_API_KEY (nvapi-*) as NVIDIA_INFERENCE_API_KEY for the child environment. The routed blueprint still declares the historical NVIDIA_INFERENCE_API_KEY runtime credential name. This credential aliasing is documented in the helper but creates a semantic mismatch: the public nvapi-* key is being used where historically an sk-* hosted inference key was expected. The comment explains this but the routing depends on the Model Router accepting the public key format.
  • Impact: If Model Router validates key format strictly, the nvapi-* key might be rejected where sk-* was expected. However, the comment indicates this is intentional for integrate.api.nvidia.com routing.
  • Recommended action: Verify Model Router accepts nvapi-* keys for the routed provider. Add integration test or document the expected key format compatibility in the blueprint or helper.
  • Expected follow-up: Resolve in this PR or explain why the risk is acceptable.
  • Verification: Check Model Router provider configuration accepts nvapi-* keys. Live test model-router-provider-routed-inference.test.ts validates end-to-end flow.
  • Missing regression test: Live test validates end-to-end; no unit test for key format compatibility.
  • Done when: The risk is fixed or explicitly justified in the PR. Verification: Check Model Router provider configuration accepts nvapi-* keys. Live test model-router-provider-routed-inference.test.ts validates end-to-end flow.
  • Evidence: buildProviderRoutedEnv sets NVIDIA_INFERENCE_API_KEY: apiKey where apiKey is nvapi-* from NVIDIA_API_KEY

PRA-14 Resolve/justify — Test contract updated for new credential flow but Model Router key format compatibility unverified

  • Location: test/e2e-scenario/live/model-router-provider-routed-inference.test.ts:55
  • Category: correctness
  • Problem: Test scenario.json contract updated: 'NVIDIA_API_KEY is present and nvapi-prefixed, then staged for the router's NVIDIA_INFERENCE_API_KEY credential'. This accurately reflects the new credential flow but should be verified against actual Model Router behavior.
  • Impact: Contract documentation matches implementation. Live test validates the flow works.
  • Recommended action: Ensure live test passes with the new credential flow. No code change needed if test passes.
  • Expected follow-up: Resolve in this PR or explain why the risk is acceptable.
  • Verification: Run model-router-provider-routed-inference-vitest job and verify onboard completes and routed PONG returned.
  • Missing regression test: Live test is the regression test for this flow.
  • Done when: The risk is fixed or explicitly justified in the PR. Verification: Run model-router-provider-routed-inference-vitest job and verify onboard completes and routed PONG returned.
  • Evidence: scenario.json contract at line 55 describes new credential staging

💡 In-scope improvements

These are lower-risk, not throwaway. Prefer fixing them in this PR when they are local to changed code; defer only with rationale or a linked follow-up.

PRA-8 Improvement — Slack probe endpoint changed to slack.com/api/api.test with explanatory comment

  • Location: test/e2e-scenario/live/network-policy.test.ts:505
  • Category: correctness
  • Problem: Slack probe endpoint changed from https://slack.com/ to https://slack.com/api/api.test to avoid redirect issues. Explanatory comment added: 'Use Slack's non-redirecting API probe on the preset's actual API host; the marketing root can leave the slack.com allowlist during redirects.'
  • Impact: Improves test reliability by using a stable API endpoint that stays within the slack.com allowlist. No regression risk.
  • Suggested action: Change is correct and documented. Monitor test stability. No further action needed.
  • Expected follow-up: Prefer a current-PR fix when local to changed code; defer only with rationale or linked follow-up.
  • Verification: Verify slackBefore/slackAfter fetchStatus calls use the new endpoint. Support test not needed - live infrastructure validates.
  • Missing regression test: Live test validates endpoint behavior; no hermetic regression test for endpoint choice.
  • Done when: The local improvement is applied, or the PR notes why it should be deferred.
  • Evidence: Comment at line 493-495 explains endpoint choice; both Vitest and Bash lanes updated

PRA-9 Improvement — Expect script exit codes documented in file header

  • Location: test/e2e-scenario/live/network-policy-interactive.ts:14
  • Category: correctness
  • Problem: Expect script exit codes now documented in file header comment: 2=preset timeout, 3=preset EOF, 4=confirmation timeout, 5=confirmation EOF, 6=post-confirmation timeout. Support test validates script structure.
  • Impact: Improves debuggability of interactive test failures. No functional change.
  • Suggested action: Documentation is adequate. No further action needed.
  • Expected follow-up: Prefer a current-PR fix when local to changed code; defer only with rationale or linked follow-up.
  • Verification: Check network-policy-interactive.ts header comment and network-policy-interactive.test.ts validates script contains expected prompts and responses.
  • Missing regression test: Support test covers script structure; live test exercises exit codes.
  • Done when: The local improvement is applied, or the PR notes why it should be deferred.
  • Evidence: Header comment lines 3-6 document all 5 exit codes with meanings

PRA-11 Improvement — Test comment updated to reference both Nemotron Super and Ultra models

  • Location: test/generate-openclaw-config.test.ts:1320
  • Category: correctness
  • Problem: Test comment updated to reference both Nemotron Super and Ultra models: 'Nemotron can generate invalid JS for OpenClaw's native tool_search_code. The Super and Ultra managed-inference manifests disable it so both models use the structured tool-calling surface they handle.' Test loops over both models.
  • Impact: Test coverage now explicitly covers both models. Comment accurately reflects implementation.
  • Suggested action: Change is correct and complete. No further action needed.
  • Expected follow-up: Prefer a current-PR fix when local to changed code; defer only with rationale or linked follow-up.
  • Verification: Verify test loops over ['nvidia/nemotron-3-super-120b-a12b', 'nvidia/nvidia/nemotron-3-ultra'] and expects toolSearch=false for both.
  • Missing regression test: Test covers both models; blueprint for Ultra added in this PR.
  • Done when: The local improvement is applied, or the PR notes why it should be deferred.
  • Evidence: Test at line 1323 loops over both model IDs; blueprint file exists for Ultra

PRA-12 Improvement — Error message references NVIDIA_API_KEY constant correctly

  • Location: test/e2e-scenario/live/model-router-provider-routed-inference-helpers.ts:15
  • Category: correctness
  • Problem: Error message 'NVIDIA_API_KEY must be a public NVIDIA Endpoints nvapi-* key' correctly references the constant MODEL_ROUTER_PUBLIC_KEY_ENV which equals 'NVIDIA_API_KEY'. Helper uses constant consistently. Error message is clear for operators.
  • Impact: No inconsistency - constant and error message align. No change needed.
  • Suggested action: No change needed - validation is correct and constant used consistently. Error message is clear for operators.
  • Expected follow-up: Prefer a current-PR fix when local to changed code; defer only with rationale or linked follow-up.
  • Verification: Check MODEL_ROUTER_PUBLIC_KEY_ENV = 'NVIDIA_API_KEY' and requireModelRouterPublicKey uses it. Support test validates required secret name and nvapi-* prefix validation.
  • Missing regression test: Support test covers secret name and validation logic.
  • Done when: The local improvement is applied, or the PR notes why it should be deferred.
  • Evidence: MODEL_ROUTER_PUBLIC_KEY_ENV constant used in requireModelRouterPublicKey; support test validates
Test follow-ups to resolve or justify

If these cover changed behavior, prefer adding them in this PR; otherwise state why existing coverage is enough or link the follow-up.

  • PRA-T1 Runtime validation — NVIDIA_API_KEY secret presence in GitHub repo settings. Infrastructure paths need behavioral runtime validation: workflow YAML changes, credential wiring, expect host dependency installation, Nemotron blueprint workaround, Model Router key format compatibility.
  • PRA-T2 Runtime validation — expect package installation on ubuntu-latest runners. Infrastructure paths need behavioral runtime validation: workflow YAML changes, credential wiring, expect host dependency installation, Nemotron blueprint workaround, Model Router key format compatibility.
  • PRA-T3 Runtime validation — Nemotron 3 Ultra blueprint disables toolSearch for matching routes. Infrastructure paths need behavioral runtime validation: workflow YAML changes, credential wiring, expect host dependency installation, Nemotron blueprint workaround, Model Router key format compatibility.
  • PRA-T4 Runtime validation — Model Router flow with NVIDIA_API_KEY (nvapi-*) credential. Infrastructure paths need behavioral runtime validation: workflow YAML changes, credential wiring, expect host dependency installation, Nemotron blueprint workaround, Model Router key format compatibility.
  • PRA-T5 Runtime validation — Network-policy interactive expect script end-to-end. Infrastructure paths need behavioral runtime validation: workflow YAML changes, credential wiring, expect host dependency installation, Nemotron blueprint workaround, Model Router key format compatibility.
  • PRA-T6 nemoclaw-blueprint/model-specific-setup/openclaw/nemotron-3-ultra-managed-inference.json — Test validates toolSearch disabled for matching routes; no test for upstream model fix. Blueprint description lacks upstream issue link or removal condition
  • PRA-T7 test/e2e-scenario/live/model-router-provider-routed-inference-helpers.ts:25 — Live test validates end-to-end flow works with aliasing. buildProviderRoutedEnv sets NVIDIA_INFERENCE_API_KEY: apiKey where apiKey is nvapi-* from NVIDIA_API_KEY
Since last review details

Current findings, using the urgency labels above:

PRA-1 Resolve/justify — Source-of-truth review needed: nemoclaw-blueprint/model-specific-setup/openclaw/nemotron-3-ultra-managed-inference.json

  • Location: not file-specific
  • Category: architecture
  • Problem: The advisor marked localized patch analysis as needs_followup.
  • Impact: A localized workaround can preserve or hide an invalid state when the source boundary is unclear.
  • Recommended action: Identify the invalid state, source boundary, source-fix constraint, regression test, and removal condition before merging the localized behavior.
  • Expected follow-up: Resolve in this PR or explain why the risk is acceptable.
  • Verification: Inspect the localized patch and source-of-truth review fields for a concrete invalid state, source boundary, source-fix constraint, regression test, and removal condition.
  • Missing regression test: Test validates toolSearch disabled for matching routes; no test for upstream model fix
  • Done when: The risk is fixed or explicitly justified in the PR. Verification: Inspect the localized patch and source-of-truth review fields for a concrete invalid state, source boundary, source-fix constraint, regression test, and removal condition.
  • Evidence: Blueprint description lacks upstream issue link or removal condition

PRA-2 Resolve/justify — Source-of-truth review needed: test/e2e-scenario/live/model-router-provider-routed-inference-helpers.ts:25

  • Location: not file-specific
  • Category: architecture
  • Problem: The advisor marked localized patch analysis as needs_followup.
  • Impact: A localized workaround can preserve or hide an invalid state when the source boundary is unclear.
  • Recommended action: Identify the invalid state, source boundary, source-fix constraint, regression test, and removal condition before merging the localized behavior.
  • Expected follow-up: Resolve in this PR or explain why the risk is acceptable.
  • Verification: Inspect the localized patch and source-of-truth review fields for a concrete invalid state, source boundary, source-fix constraint, regression test, and removal condition.
  • Missing regression test: Live test validates end-to-end flow works with aliasing
  • Done when: The risk is fixed or explicitly justified in the PR. Verification: Inspect the localized patch and source-of-truth review fields for a concrete invalid state, source boundary, source-fix constraint, regression test, and removal condition.
  • Evidence: buildProviderRoutedEnv sets NVIDIA_INFERENCE_API_KEY: apiKey where apiKey is nvapi-* from NVIDIA_API_KEY

PRA-3 Required — NVIDIA_API_KEY secret must exist in GitHub repository settings

  • Location: tools/e2e-scenarios/workflow-boundary.mts:5180
  • Category: correctness
  • Problem: Workflow boundary validator enforces NVIDIA_API_KEY at step env for model-router-provider-routed-inference-vitest and sandbox-rlimits-connect-vitest jobs. If this secret is not configured in GitHub repository Settings > Secrets > Actions with an nvapi-* value, these CI jobs will fail at validation time.
  • Impact: CI jobs will fail at workflow validation, blocking provider-routed inference and sandbox rlimit connect E2E validations. The validator catches this at workflow validation time, not runtime.
  • Required action: Confirm NVIDIA_API_KEY secret is configured in GitHub repository Settings > Secrets > Actions with an nvapi-* value. If only NVIDIA_INFERENCE_API_KEY exists, add NVIDIA_API_KEY with the same value.
  • Expected follow-up: Fix before merge or get explicit maintainer override.
  • Verification: Check GitHub repo Settings > Secrets > Actions for NVIDIA_API_KEY. Search workflow-boundary.mts for 'sandbox-rlimits-connect-vitest step must receive NVIDIA_API_KEY from secrets' and 'model-router-provider-routed-inference-vitest Vitest step must receive NVIDIA_API_KEY from secrets'.
  • Missing regression test: Workflow boundary validator catches missing secret at validation time. No automated test for secret presence in GitHub repository settings.
  • Done when: The required change is committed and verification passes: Check GitHub repo Settings > Secrets > Actions for NVIDIA_API_KEY. Search workflow-boundary.mts for 'sandbox-rlimits-connect-vitest step must receive NVIDIA_API_KEY from secrets' and 'model-router-provider-routed-inference-vitest Vitest step must receive NVIDIA_API_KEY from secrets'.
  • Evidence: validateModelRouterProviderRoutedInferenceVitestJob and validateSandboxRlimitsConnectVitestJob both check for NVIDIA_API_KEY: ${{ secrets.NVIDIA_API_KEY }} in step env

PRA-4 Required — New expect-based trust boundary for network-policy interactive tests requires explicit acceptance

  • Location: test/e2e-scenario/live/network-policy-interactive.ts:1
  • Category: security
  • Problem: New expect script drives policy-add prompts using $env() expanded by expect. Preset number extracted via regex from CLI output and passed as NEMOCLAW_E2E_PRESET_NUM. This introduces a new trust boundary: expect script with sudo-adjacent host dependency (expect package installed via apt in trusted workflow YAML). No user input flows into the script (preset number from regex match, literal 'Y' for confirmation), but this boundary must be explicitly accepted before merge.
  • Impact: Low - environment variables controlled by test. However, this is a new trust boundary that expands the trusted code surface to include the expect package and script. The workflow boundary validator enforces inline installation in trusted YAML.
  • Required action: Document acceptance of this trust boundary in PR description. The findPolicyPresetNumber regex correctly captures (\d+) from numbered list output. Support test validates extraction logic. Comment in network-policy-interactive.ts documents the trust boundary (already present).
  • Expected follow-up: Fix before merge or get explicit maintainer override.
  • Verification: Check network-policy-interactive.test.ts support test validates preset number extraction. Regex: ^\s*\((\d+)\)\s+(?:\[●○\]\s+)?${escapedPreset}(?:\s|$). Expect script uses hardcoded 'Y\r' for confirmation, $env() for controlled env vars. Workflow boundary validator enforces inline expect installation.
  • Missing regression test: Support test covers preset number extraction; full interactive flow requires live infrastructure. Comment in network-policy-interactive.ts documents trust boundary acceptance.
  • Done when: The required change is committed and verification passes: Check network-policy-interactive.test.ts support test validates preset number extraction. Regex: ^\s*\((\d+)\)\s+(?:\[●○\]\s+)?${escapedPreset}(?:\s|$). Expect script uses hardcoded 'Y\r' for confirmation, $env() for controlled env vars. Workflow boundary validator enforces inline expect installation.
  • Evidence: findPolicyPresetNumber escapes regex metacharacters and captures only (\d+). Expect script uses hardcoded 'Y\r' for confirmation, $env() for controlled env vars. Workflow boundary validator enforces inline expect installation.

PRA-5 Resolve/justify — API_KEY_SHAPE_PATTERN uses POSIX [[::space::]] character class assuming GNU grep

  • Location: test/e2e-scenario/live/hermes-inference-switch-helpers.ts:329
  • Category: correctness
  • Problem: The grep extended regex pattern uses [[::space::]] POSIX character class. Current CI runs on ubuntu-latest (GNU grep) where this works, but BSD grep (macOS, FreeBSD) may have different behavior. Comment added noting this assumption.
  • Impact: Low risk in current CI environment. Could cause false negatives/positives if tests ever run on non-GNU grep platforms.
  • Recommended action: Comment in hermes-inference-switch-helpers.ts notes the pattern assumes POSIX ERE grep (GNU grep on ubuntu-latest). No code change needed for current scope. Consider using [[:space:]] or \s if cross-platform grep compatibility becomes required.
  • Expected follow-up: Resolve in this PR or explain why the risk is acceptable.
  • Verification: Test runs on ubuntu-latest in CI; pattern validated by hermes-inference-switch-command-shape.test.ts support test.
  • Missing regression test: Support test covers current pattern; cross-platform grep compatibility not tested.
  • Done when: The risk is fixed or explicitly justified in the PR. Verification: Test runs on ubuntu-latest in CI; pattern validated by hermes-inference-switch-command-shape.test.ts support test.
  • Evidence: API_KEY_SHAPE_PATTERN = '^[[::space:]]*api_key:[[::space:]]*("sk-[^"[[::space:]]+"|\'sk-[^\'[[::space:]]+\'|sk-[^"\'[[::space:]]+)[[::space:]]*$' with comment: 'This live lane runs on ubuntu-latest and intentionally uses GNU grep\'s POSIX ERE character classes'

PRA-6 Resolve/justify — Merge conflict risk with PR #5876 (feat(mcp): add OpenShell-managed MCP servers)

  • Location: .github/workflows/e2e-vitest-scenarios.yaml:1
  • Category: workflow
  • Problem: PR feat(mcp): add OpenShell-managed MCP servers #5876 modifies 8 of the same files including workflow YAML, test files, and workflow-boundary.mts. High merge conflict risk.
  • Impact: Merge conflicts likely when both PRs are merged. Could require rebase or manual conflict resolution.
  • Recommended action: Coordinate with PR feat(mcp): add OpenShell-managed MCP servers #5876 author. Consider rebasing or resolving conflicts before merge. Monitor for overlapping changes to workflow-boundary.mts validation logic.
  • Expected follow-up: Resolve in this PR or explain why the risk is acceptable.
  • Verification: Check openPrOverlaps.sameFiles list from drift context. Both PRs modify .github/workflows/e2e-vitest-scenarios.yaml, .github/workflows/regression-e2e.yaml, ci/test-file-size-budget.json, test/e2e-scenario/live/network-policy.test.ts, test/e2e-script-workflow.test.ts, test/e2e/test-network-policy.sh, test/generate-openclaw-config.test.ts, tools/e2e-scenarios/workflow-boundary.mts.
  • Missing regression test: N/A - workflow coordination issue.
  • Done when: The risk is fixed or explicitly justified in the PR. Verification: Check openPrOverlaps.sameFiles list from drift context. Both PRs modify .github/workflows/e2e-vitest-scenarios.yaml, .github/workflows/regression-e2e.yaml, ci/test-file-size-budget.json, test/e2e-scenario/live/network-policy.test.ts, test/e2e-script-workflow.test.ts, test/e2e/test-network-policy.sh, test/generate-openclaw-config.test.ts, tools/e2e-scenarios/workflow-boundary.mts.
  • Evidence: openPrOverlaps shows PR feat(mcp): add OpenShell-managed MCP servers #5876 has sameFiles overlapping with this PR across 8 files

PRA-7 Resolve/justify — Nemotron 3 Ultra blueprint is a workaround for external model behavior without upstream TODO link

  • Location: nemoclaw-blueprint/model-specific-setup/openclaw/nemotron-3-ultra-managed-inference.json:1
  • Category: architecture
  • Problem: New blueprint disables native OpenClaw tool search for Nemotron 3 Ultra as a workaround for the model emitting invalid JavaScript for tool_search_code. Description explains the symptom but lacks upstream issue link tracking the model provider bug fix.
  • Impact: Workaround may persist longer than necessary without upstream tracking. Source-of-truth review: what invalid state is handled (model emits invalid JS), where created (upstream model behavior), why source cannot be fixed in this PR (external model), what regression test proves source cannot regress (none - model behavior), when workaround can be removed (when model fixed upstream).
  • Recommended action: Add TODO comment in blueprint description with upstream issue link if NVIDIA/model provider has tracking for the tool_search_code emission bug. Or add a comment with expected removal condition.
  • Expected follow-up: Resolve in this PR or explain why the risk is acceptable.
  • Verification: Check blueprint description for upstream issue reference. Current description: 'The model can emit invalid JavaScript for the tool_search_code surface and return "[tools] tool_search_code failed" instead of completing real tool calls; routing it back to the structured tool-calling surface preserves tool use.'
  • Missing regression test: No automated test for upstream model fix. Test only validates toolSearch is disabled for matching routes.
  • Done when: The risk is fixed or explicitly justified in the PR. Verification: Check blueprint description for upstream issue reference. Current description: 'The model can emit invalid JavaScript for the tool_search_code surface and return "[tools] tool_search_code failed" instead of completing real tool calls; routing it back to the structured tool-calling surface preserves tool use.'.
  • Evidence: Blueprint description lacks upstream issue link or removal condition

PRA-8 Improvement — Slack probe endpoint changed to slack.com/api/api.test with explanatory comment

  • Location: test/e2e-scenario/live/network-policy.test.ts:505
  • Category: correctness
  • Problem: Slack probe endpoint changed from https://slack.com/ to https://slack.com/api/api.test to avoid redirect issues. Explanatory comment added: 'Use Slack's non-redirecting API probe on the preset's actual API host; the marketing root can leave the slack.com allowlist during redirects.'
  • Impact: Improves test reliability by using a stable API endpoint that stays within the slack.com allowlist. No regression risk.
  • Suggested action: Change is correct and documented. Monitor test stability. No further action needed.
  • Expected follow-up: Prefer a current-PR fix when local to changed code; defer only with rationale or linked follow-up.
  • Verification: Verify slackBefore/slackAfter fetchStatus calls use the new endpoint. Support test not needed - live infrastructure validates.
  • Missing regression test: Live test validates endpoint behavior; no hermetic regression test for endpoint choice.
  • Done when: The local improvement is applied, or the PR notes why it should be deferred.
  • Evidence: Comment at line 493-495 explains endpoint choice; both Vitest and Bash lanes updated

PRA-9 Improvement — Expect script exit codes documented in file header

  • Location: test/e2e-scenario/live/network-policy-interactive.ts:14
  • Category: correctness
  • Problem: Expect script exit codes now documented in file header comment: 2=preset timeout, 3=preset EOF, 4=confirmation timeout, 5=confirmation EOF, 6=post-confirmation timeout. Support test validates script structure.
  • Impact: Improves debuggability of interactive test failures. No functional change.
  • Suggested action: Documentation is adequate. No further action needed.
  • Expected follow-up: Prefer a current-PR fix when local to changed code; defer only with rationale or linked follow-up.
  • Verification: Check network-policy-interactive.ts header comment and network-policy-interactive.test.ts validates script contains expected prompts and responses.
  • Missing regression test: Support test covers script structure; live test exercises exit codes.
  • Done when: The local improvement is applied, or the PR notes why it should be deferred.
  • Evidence: Header comment lines 3-6 document all 5 exit codes with meanings

PRA-10 Resolve/justify — New expect host dependency expands trusted code boundary

  • Location: .github/workflows/e2e-vitest-scenarios.yaml:1875
  • Category: security
  • Problem: New expect host dependency installed via apt in workflow YAML expands trusted code boundary. Workflow boundary validator enforces this setup stays inline in trusted YAML (not via repo-local action with sudo). Comment documents: 'Expect is a reviewed host-tool consumer for the interactive policy-add test. Keep this privileged setup inline in trusted workflow YAML.'
  • Impact: Controlled expansion of trusted boundary. Only expect package installed, script receives only controlled env vars. Validator prevents loading repo-local actions with sudo.
  • Recommended action: Document that expect is a reviewed host-tool consumer for network-policy interactive tests. Boundary enforcement is correct. No code change needed.
  • Expected follow-up: Resolve in this PR or explain why the risk is acceptable.
  • Verification: Check workflow-boundary.mts validateNetworkPolicyVitestJob enforces install step has no 'uses' (inline), contains 'sudo apt-get install -y --no-install-recommends expect', and retry logic fragments.
  • Missing regression test: Workflow boundary validator tests enforce inline installation pattern.
  • Done when: The risk is fixed or explicitly justified in the PR. Verification: Check workflow-boundary.mts validateNetworkPolicyVitestJob enforces install step has no 'uses' (inline), contains 'sudo apt-get install -y --no-install-recommends expect', and retry logic fragments.
  • Evidence: Workflow YAML comment and workflow-boundary.mts validator enforce inline installation with retry logic

PRA-11 Improvement — Test comment updated to reference both Nemotron Super and Ultra models

  • Location: test/generate-openclaw-config.test.ts:1320
  • Category: correctness
  • Problem: Test comment updated to reference both Nemotron Super and Ultra models: 'Nemotron can generate invalid JS for OpenClaw's native tool_search_code. The Super and Ultra managed-inference manifests disable it so both models use the structured tool-calling surface they handle.' Test loops over both models.
  • Impact: Test coverage now explicitly covers both models. Comment accurately reflects implementation.
  • Suggested action: Change is correct and complete. No further action needed.
  • Expected follow-up: Prefer a current-PR fix when local to changed code; defer only with rationale or linked follow-up.
  • Verification: Verify test loops over ['nvidia/nemotron-3-super-120b-a12b', 'nvidia/nvidia/nemotron-3-ultra'] and expects toolSearch=false for both.
  • Missing regression test: Test covers both models; blueprint for Ultra added in this PR.
  • Done when: The local improvement is applied, or the PR notes why it should be deferred.
  • Evidence: Test at line 1323 loops over both model IDs; blueprint file exists for Ultra

PRA-12 Improvement — Error message references NVIDIA_API_KEY constant correctly

  • Location: test/e2e-scenario/live/model-router-provider-routed-inference-helpers.ts:15
  • Category: correctness
  • Problem: Error message 'NVIDIA_API_KEY must be a public NVIDIA Endpoints nvapi-* key' correctly references the constant MODEL_ROUTER_PUBLIC_KEY_ENV which equals 'NVIDIA_API_KEY'. Helper uses constant consistently. Error message is clear for operators.
  • Impact: No inconsistency - constant and error message align. No change needed.
  • Suggested action: No change needed - validation is correct and constant used consistently. Error message is clear for operators.
  • Expected follow-up: Prefer a current-PR fix when local to changed code; defer only with rationale or linked follow-up.
  • Verification: Check MODEL_ROUTER_PUBLIC_KEY_ENV = 'NVIDIA_API_KEY' and requireModelRouterPublicKey uses it. Support test validates required secret name and nvapi-* prefix validation.
  • Missing regression test: Support test covers secret name and validation logic.
  • Done when: The local improvement is applied, or the PR notes why it should be deferred.
  • Evidence: MODEL_ROUTER_PUBLIC_KEY_ENV constant used in requireModelRouterPublicKey; support test validates

PRA-13 Resolve/justify — Credential aliasing: public nvapi-* key staged as NVIDIA_INFERENCE_API_KEY for routed provider

  • Location: test/e2e-scenario/live/model-router-provider-routed-inference-helpers.ts:25
  • Category: security
  • Problem: buildProviderRoutedEnv aliases the public NVIDIA_API_KEY (nvapi-*) as NVIDIA_INFERENCE_API_KEY for the child environment. The routed blueprint still declares the historical NVIDIA_INFERENCE_API_KEY runtime credential name. This credential aliasing is documented in the helper but creates a semantic mismatch: the public nvapi-* key is being used where historically an sk-* hosted inference key was expected. The comment explains this but the routing depends on the Model Router accepting the public key format.
  • Impact: If Model Router validates key format strictly, the nvapi-* key might be rejected where sk-* was expected. However, the comment indicates this is intentional for integrate.api.nvidia.com routing.
  • Recommended action: Verify Model Router accepts nvapi-* keys for the routed provider. Add integration test or document the expected key format compatibility in the blueprint or helper.
  • Expected follow-up: Resolve in this PR or explain why the risk is acceptable.
  • Verification: Check Model Router provider configuration accepts nvapi-* keys. Live test model-router-provider-routed-inference.test.ts validates end-to-end flow.
  • Missing regression test: Live test validates end-to-end; no unit test for key format compatibility.
  • Done when: The risk is fixed or explicitly justified in the PR. Verification: Check Model Router provider configuration accepts nvapi-* keys. Live test model-router-provider-routed-inference.test.ts validates end-to-end flow.
  • Evidence: buildProviderRoutedEnv sets NVIDIA_INFERENCE_API_KEY: apiKey where apiKey is nvapi-* from NVIDIA_API_KEY

PRA-14 Resolve/justify — Test contract updated for new credential flow but Model Router key format compatibility unverified

  • Location: test/e2e-scenario/live/model-router-provider-routed-inference.test.ts:55
  • Category: correctness
  • Problem: Test scenario.json contract updated: 'NVIDIA_API_KEY is present and nvapi-prefixed, then staged for the router's NVIDIA_INFERENCE_API_KEY credential'. This accurately reflects the new credential flow but should be verified against actual Model Router behavior.
  • Impact: Contract documentation matches implementation. Live test validates the flow works.
  • Recommended action: Ensure live test passes with the new credential flow. No code change needed if test passes.
  • Expected follow-up: Resolve in this PR or explain why the risk is acceptable.
  • Verification: Run model-router-provider-routed-inference-vitest job and verify onboard completes and routed PONG returned.
  • Missing regression test: Live test is the regression test for this flow.
  • Done when: The risk is fixed or explicitly justified in the PR. Verification: Run model-router-provider-routed-inference-vitest job and verify onboard completes and routed PONG returned.
  • Evidence: scenario.json contract at line 55 describes new credential staging

Workflow run details

This is an automated, non-binding review; it still expects maintainers and agents to respond to each required or warning item. Treat suggestions as current-PR improvements when they touch changed code; defer only with maintainer rationale or a linked follow-up. A human maintainer must make the final merge decision.

@github-actions

github-actions Bot commented Jun 28, 2026

Copy link
Copy Markdown
Contributor

PR Review Advisor — Changes requested

Merge posture: Do not merge yet
Primary next action: Resolve or justify PRA-1: Source-of-truth review needed: Slack network-policy probe endpoint and success predicate.
Open items: 0 required · 2 warnings · 0 suggestions · 7 test follow-ups
Since last review: 0 prior items resolved · 5 still apply · 1 new item found

Action checklist

  • PRA-1 Resolve or justify: Source-of-truth review needed: Slack network-policy probe endpoint and success predicate
  • PRA-2 Resolve or justify: Retained Bash Slack policy test still treats HTTP 403 as success in test/e2e/test-network-policy.sh:507
  • PRA-T1 Add or justify test follow-up: Runtime validation
  • PRA-T2 Add or justify test follow-up: Runtime validation
  • PRA-T3 Add or justify test follow-up: Runtime validation
  • PRA-T4 Add or justify test follow-up: Runtime validation
  • PRA-T5 Add or justify test follow-up: Runtime validation
  • PRA-T6 Add or justify test follow-up: Acceptance clause
  • PRA-T7 Add or justify test follow-up: Slack network-policy probe endpoint and success predicate

Findings index

ID Severity Category Location Required action
PRA-1 Resolve/justify architecture Identify the invalid state, source boundary, source-fix constraint, regression test, and removal condition before merging the localized behavior.
PRA-2 Resolve/justify correctness test/e2e/test-network-policy.sh:507 Change the retained Bash post-apply success predicate to require `STATUS_200` (or another explicit Slack API response that proves the request reached Slack rather than the policy proxy) and keep 403/error responses as failures.
Review findings by urgency: 0 required fixes, 2 items to resolve/justify, 0 in-scope improvements

⚠️ Resolve or justify before merge

Investigate these in the current review; either fix them, explain why they are not applicable, or document the accepted risk.

PRA-1 Resolve/justify — Source-of-truth review needed: Slack network-policy probe endpoint and success predicate

  • Location: not file-specific
  • Category: architecture
  • Problem: The advisor marked localized patch analysis as needs_followup.
  • Impact: A localized workaround can preserve or hide an invalid state when the source boundary is unclear.
  • Recommended action: Identify the invalid state, source boundary, source-fix constraint, regression test, and removal condition before merging the localized behavior.
  • Expected follow-up: Resolve in this PR or explain why the risk is acceptable.
  • Verification: Inspect the localized patch and source-of-truth review fields for a concrete invalid state, source boundary, source-fix constraint, regression test, and removal condition.
  • Missing regression test: Changed Vitest coverage asserts deny-before, Expect-driven apply, `policy-list` applied, and `STATUS_200` after; a retained Bash static contract test should also reject post-apply 403.
  • Done when: The risk is fixed or explicitly justified in the PR. Verification: Inspect the localized patch and source-of-truth review fields for a concrete invalid state, source boundary, source-fix constraint, regression test, and removal condition.
  • Evidence: `test/e2e-scenario/live/network-policy.test.ts` requires `STATUS_200`; `test/e2e/test-network-policy.sh:507` still accepts `STATUS_[2-4][0-9][0-9]`.

PRA-2 Resolve/justify — Retained Bash Slack policy test still treats HTTP 403 as success

  • Location: test/e2e/test-network-policy.sh:507
  • Category: correctness
  • Problem: The PR changes TC-NET-03 to probe Slack through `https://slack.com/api/api.test\`, but the retained Bash lane still passes any `STATUS_[2-4][0-9][0-9]` after `policy-add`. A `STATUS_403` is also the sandbox policy-deny signal used before the preset is applied, so this lane can report success even when the Slack preset did not actually allow egress. The Vitest lane correctly requires `STATUS_200`, so the retained Bash lane should match that stricter contract.
  • Impact: A release/regression guard can mask a network-policy regression where Slack remains blocked after interactive `policy-add`, reducing confidence in the retained shell lane while shell retirement is still deferred.
  • Recommended action: Change the retained Bash post-apply success predicate to require `STATUS_200` (or another explicit Slack API response that proves the request reached Slack rather than the policy proxy) and keep 403/error responses as failures.
  • Expected follow-up: Resolve in this PR or explain why the risk is acceptable.
  • Verification: Read `test/e2e/test-network-policy.sh` around TC-NET-03 and confirm the post-apply `if` no longer matches `STATUS_4xx`; compare with `test/e2e-scenario/live/network-policy.test.ts:592`, which already requires `/STATUS_200/`.
  • Missing regression test: Add or update a static workflow/script contract test that fails if TC-NET-03's retained Bash post-apply predicate accepts `STATUS_403` after Slack policy-add.
  • Done when: The risk is fixed or explicitly justified in the PR. Verification: Read `test/e2e/test-network-policy.sh` around TC-NET-03 and confirm the post-apply `if` no longer matches `STATUS_4xx`; compare with `test/e2e-scenario/live/network-policy.test.ts:592`, which already requires `/STATUS_200/`.
  • Evidence: `test/e2e/test-network-policy.sh:507` uses `grep -qE "STATUS_[2-4][0-9][0-9]"` for post-apply success, while the changed Vitest lane asserts `expect(slackAfter).toMatch(/STATUS_200/)`.

💡 In-scope improvements

These are lower-risk, not throwaway. Prefer fixing them in this PR when they are local to changed code; defer only with rationale or a linked follow-up.

  • None.
Test follow-ups to resolve or justify

If these cover changed behavior, prefer adding them in this PR; otherwise state why existing coverage is enough or link the follow-up.

  • PRA-T1 Runtime validation — Run the Model Router provider-routed lane with a real `nvapi-*` `NVIDIA_API_KEY` and confirm onboard succeeds, `http://127.0.0.1:4000/health\` reports `healthy_count > 0`, and sandbox `https://inference.local/v1/chat/completions\` returns model `nvidia-routed` with PONG content.. Static and contract coverage is strong, but the changed behavior crosses live GitHub secret wiring, Docker/OpenShell onboarding, Model Router health, sandbox `inference.local` routing, network-policy enforcement, Slack egress behavior, and hosted model/OpenClaw tool behavior.
  • PRA-T2 Runtime validation — Run network-policy TC-NET-03 against `https://slack.com/api/api.test\` and confirm it is blocked before applying the Slack preset, the Expect-driven `policy-add` flow succeeds, `policy-list` marks `slack` applied, and the endpoint returns `STATUS_200` after policy mutation.. Static and contract coverage is strong, but the changed behavior crosses live GitHub secret wiring, Docker/OpenShell onboarding, Model Router health, sandbox `inference.local` routing, network-policy enforcement, Slack egress behavior, and hosted model/OpenClaw tool behavior.
  • PRA-T3 Runtime validation — Run the gateway-drift preflight workflow command and confirm `test/gateway-drift-preflight.test.ts` executes under the `integration` Vitest project.. Static and contract coverage is strong, but the changed behavior crosses live GitHub secret wiring, Docker/OpenShell onboarding, Model Router health, sandbox `inference.local` routing, network-policy enforcement, Slack egress behavior, and hosted model/OpenClaw tool behavior.
  • PRA-T4 Runtime validation — Add or identify a mutation-style workflow-boundary test that changes the Model Router Vitest step back to `NVIDIA_INFERENCE_API_KEY` and expects validator errors for forbidden `NVIDIA_INFERENCE_API_KEY` and missing `NVIDIA_API_KEY`.. Static and contract coverage is strong, but the changed behavior crosses live GitHub secret wiring, Docker/OpenShell onboarding, Model Router health, sandbox `inference.local` routing, network-policy enforcement, Slack egress behavior, and hosted model/OpenClaw tool behavior.
  • PRA-T5 Runtime validation — Add or identify a mutation-style workflow-boundary test that changes the gateway-drift command back to `npx vitest run --project cli` and expects the validator to require `--project integration`.. Static and contract coverage is strong, but the changed behavior crosses live GitHub secret wiring, Docker/OpenShell onboarding, Model Router health, sandbox `inference.local` routing, network-policy enforcement, Slack egress behavior, and hosted model/OpenClaw tool behavior.
  • PRA-T6 Acceptance clause — No linked issue acceptance clauses were available in the deterministic review context. — add test evidence or identify existing coverage. The validation context reported `linkedIssues: []`; review evidence was mapped against the changed workflow, credential, blueprint, network-policy, and E2E-test contracts instead of linked issue text.
  • PRA-T7 Slack network-policy probe endpoint and success predicate — Changed Vitest coverage asserts deny-before, Expect-driven apply, `policy-list` applied, and `STATUS_200` after; a retained Bash static contract test should also reject post-apply 403.. `test/e2e-scenario/live/network-policy.test.ts` requires `STATUS_200`; `test/e2e/test-network-policy.sh:507` still accepts `STATUS_[2-4][0-9][0-9]`.
Since last review details

Current findings, using the urgency labels above:

PRA-1 Resolve/justify — Source-of-truth review needed: Slack network-policy probe endpoint and success predicate

  • Location: not file-specific
  • Category: architecture
  • Problem: The advisor marked localized patch analysis as needs_followup.
  • Impact: A localized workaround can preserve or hide an invalid state when the source boundary is unclear.
  • Recommended action: Identify the invalid state, source boundary, source-fix constraint, regression test, and removal condition before merging the localized behavior.
  • Expected follow-up: Resolve in this PR or explain why the risk is acceptable.
  • Verification: Inspect the localized patch and source-of-truth review fields for a concrete invalid state, source boundary, source-fix constraint, regression test, and removal condition.
  • Missing regression test: Changed Vitest coverage asserts deny-before, Expect-driven apply, `policy-list` applied, and `STATUS_200` after; a retained Bash static contract test should also reject post-apply 403.
  • Done when: The risk is fixed or explicitly justified in the PR. Verification: Inspect the localized patch and source-of-truth review fields for a concrete invalid state, source boundary, source-fix constraint, regression test, and removal condition.
  • Evidence: `test/e2e-scenario/live/network-policy.test.ts` requires `STATUS_200`; `test/e2e/test-network-policy.sh:507` still accepts `STATUS_[2-4][0-9][0-9]`.

PRA-2 Resolve/justify — Retained Bash Slack policy test still treats HTTP 403 as success

  • Location: test/e2e/test-network-policy.sh:507
  • Category: correctness
  • Problem: The PR changes TC-NET-03 to probe Slack through `https://slack.com/api/api.test\`, but the retained Bash lane still passes any `STATUS_[2-4][0-9][0-9]` after `policy-add`. A `STATUS_403` is also the sandbox policy-deny signal used before the preset is applied, so this lane can report success even when the Slack preset did not actually allow egress. The Vitest lane correctly requires `STATUS_200`, so the retained Bash lane should match that stricter contract.
  • Impact: A release/regression guard can mask a network-policy regression where Slack remains blocked after interactive `policy-add`, reducing confidence in the retained shell lane while shell retirement is still deferred.
  • Recommended action: Change the retained Bash post-apply success predicate to require `STATUS_200` (or another explicit Slack API response that proves the request reached Slack rather than the policy proxy) and keep 403/error responses as failures.
  • Expected follow-up: Resolve in this PR or explain why the risk is acceptable.
  • Verification: Read `test/e2e/test-network-policy.sh` around TC-NET-03 and confirm the post-apply `if` no longer matches `STATUS_4xx`; compare with `test/e2e-scenario/live/network-policy.test.ts:592`, which already requires `/STATUS_200/`.
  • Missing regression test: Add or update a static workflow/script contract test that fails if TC-NET-03's retained Bash post-apply predicate accepts `STATUS_403` after Slack policy-add.
  • Done when: The risk is fixed or explicitly justified in the PR. Verification: Read `test/e2e/test-network-policy.sh` around TC-NET-03 and confirm the post-apply `if` no longer matches `STATUS_4xx`; compare with `test/e2e-scenario/live/network-policy.test.ts:592`, which already requires `/STATUS_200/`.
  • Evidence: `test/e2e/test-network-policy.sh:507` uses `grep -qE "STATUS_[2-4][0-9][0-9]"` for post-apply success, while the changed Vitest lane asserts `expect(slackAfter).toMatch(/STATUS_200/)`.

Workflow run details

This is an automated, non-binding review; it still expects maintainers and agents to respond to each required or warning item. Treat suggestions as current-PR improvements when they touch changed code; defer only with maintainer rationale or a linked follow-up. A human maintainer must make the final merge decision.

Signed-off-by: Carlos Villela <cvillela@nvidia.com>

@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.

🧹 Nitpick comments (1)
test/e2e-scenario/support-tests/model-router-provider-routed-inference.test.ts (1)

28-34: 🔒 Security & Privacy | 🔵 Trivial | ⚡ Quick win

Lock in the negative credential-boundary case.

This only proves the aliases are added. Because baseEnv is {}, it would still pass if the helper also forwarded the raw NVIDIA_API_KEY into the child env, which is the drift this PR is trying to prevent.

Suggested test tightening
   it("stages the public key under the credential names consumed by the router", () => {
-    expect(buildProviderRoutedEnv("nvapi-public-test-key", "e2e-router", {})).toMatchObject({
+    const env = buildProviderRoutedEnv("nvapi-public-test-key", "e2e-router", {
+      NVIDIA_API_KEY: "nvapi-public-test-key",
+    });
+    expect(env).toMatchObject({
       NVIDIA_INFERENCE_API_KEY: "nvapi-public-test-key",
       NEMOCLAW_PROVIDER_KEY: "nvapi-public-test-key",
       NEMOCLAW_PROVIDER: "routed",
       NEMOCLAW_SANDBOX_NAME: "e2e-router",
     });
+    expect(env).not.toHaveProperty("NVIDIA_API_KEY");
   });

As per path instructions, tests here should “Prefer observable outcomes through the public boundary...”, and the PR objective explicitly calls out staging under NVIDIA_INFERENCE_API_KEY.

🤖 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/support-tests/model-router-provider-routed-inference.test.ts`
around lines 28 - 34, The test for buildProviderRoutedEnv only checks the
expected aliases, so it can still pass even if the raw NVIDIA_API_KEY leaks into
the routed env. Tighten the negative credential-boundary coverage in
model-router-provider-routed-inference.test.ts by asserting that the result does
not include NVIDIA_API_KEY when staging the public key through
buildProviderRoutedEnv, while still verifying the existing aliases and sandbox
fields.

Source: Path instructions

🤖 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.

Nitpick comments:
In
`@test/e2e-scenario/support-tests/model-router-provider-routed-inference.test.ts`:
- Around line 28-34: The test for buildProviderRoutedEnv only checks the
expected aliases, so it can still pass even if the raw NVIDIA_API_KEY leaks into
the routed env. Tighten the negative credential-boundary coverage in
model-router-provider-routed-inference.test.ts by asserting that the result does
not include NVIDIA_API_KEY when staging the public key through
buildProviderRoutedEnv, while still verifying the existing aliases and sandbox
fields.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Enterprise

Run ID: 00323f86-91ba-4902-8b46-265d6a9263f5

📥 Commits

Reviewing files that changed from the base of the PR and between 30261d5 and 20a3e3f.

📒 Files selected for processing (8)
  • .github/workflows/e2e-vitest-scenarios.yaml
  • .github/workflows/regression-e2e.yaml
  • test/e2e-scenario/live/model-router-provider-routed-inference-helpers.ts
  • test/e2e-scenario/live/model-router-provider-routed-inference.test.ts
  • test/e2e-scenario/support-tests/model-router-provider-routed-inference.test.ts
  • test/e2e/test-model-router-provider-routed-inference.sh
  • test/regression-e2e-workflow.test.ts
  • 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.

Actionable comments posted: 1

🧹 Nitpick comments (1)
test/e2e-scenario/support-tests/hermes-inference-switch-command-shape.test.ts (1)

12-16: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Exercise the probe behavior, not the exact argv.

This locks the test to one grep spelling, while a semantically equivalent command would fail and a broken pattern can still pass. Please add fixture cases that prove match/non-match behavior for representative config lines instead of snapshotting the exact array. As per path instructions, “Prefer observable outcomes through the public boundary over source-text, private-shape, or mock-call assertions.”

🤖 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/support-tests/hermes-inference-switch-command-shape.test.ts`
around lines 12 - 16, The test currently asserts the exact argv returned by
apiKeyShapeCommand, which over-constrains the implementation instead of
verifying the probe behavior. Update
hermes-inference-switch-command-shape.test.ts to exercise observable
match/non-match outcomes using fixture config lines for representative cases,
and keep the assertions focused on whether the API-key probe succeeds or fails
rather than the specific grep arguments. Use apiKeyShapeCommand and the probe
behavior as the entry points, and remove the direct snapshot-style array
expectation.

Source: Path instructions

🤖 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/hermes-inference-switch-helpers.ts`:
- Around line 350-353: The apiKeyShapeCommand probe uses API_KEY_SHAPE_PATTERN
in hermes-inference-switch-helpers.ts, and the regex is too loose because it
matches only the prefix of the YAML scalar. Tighten API_KEY_SHAPE_PATTERN so it
anchors the entire api_key value through the end of the scalar, preventing
trailing junk or unterminated quotes from passing the grep check. Update the
pattern used by apiKeyShapeCommand to require a full-line match for the intended
YAML value shape.

---

Nitpick comments:
In
`@test/e2e-scenario/support-tests/hermes-inference-switch-command-shape.test.ts`:
- Around line 12-16: The test currently asserts the exact argv returned by
apiKeyShapeCommand, which over-constrains the implementation instead of
verifying the probe behavior. Update
hermes-inference-switch-command-shape.test.ts to exercise observable
match/non-match outcomes using fixture config lines for representative cases,
and keep the assertions focused on whether the API-key probe succeeds or fails
rather than the specific grep arguments. Use apiKeyShapeCommand and the probe
behavior as the entry points, and remove the direct snapshot-style array
expectation.
🪄 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: dce55dae-ed3a-4ce1-bc40-856911d09372

📥 Commits

Reviewing files that changed from the base of the PR and between 20a3e3f and 3c52297.

📒 Files selected for processing (7)
  • ci/test-file-size-budget.json
  • nemoclaw-blueprint/model-specific-setup/openclaw/nemotron-3-ultra-managed-inference.json
  • test/e2e-scenario/live/hermes-inference-switch-helpers.ts
  • test/e2e-scenario/live/network-policy.test.ts
  • test/e2e-scenario/support-tests/hermes-inference-switch-command-shape.test.ts
  • test/e2e/test-network-policy.sh
  • test/generate-openclaw-config.test.ts
✅ Files skipped from review due to trivial changes (3)
  • nemoclaw-blueprint/model-specific-setup/openclaw/nemotron-3-ultra-managed-inference.json
  • ci/test-file-size-budget.json
  • test/e2e/test-network-policy.sh

Comment thread test/e2e-scenario/live/hermes-inference-switch-helpers.ts Outdated
Signed-off-by: Carlos Villela <cvillela@nvidia.com>
@github-actions

Copy link
Copy Markdown
Contributor

Vitest E2E Scenario Results — ❌ Some jobs failed

Run: 28307218499
Workflow ref: codex/full-release-gate-cleanup
Requested scenarios: (default — all supported)
Requested jobs: gateway-drift-preflight-vitest,model-router-provider-routed-inference-vitest,spark-install-vitest,network-policy-vitest,hermes-inference-switch-vitest,state-backup-restore-vitest
Summary: 5 passed, 1 failed, 0 cancelled, 0 skipped

Job Result
gateway-drift-preflight-vitest ✅ success
hermes-inference-switch-vitest ✅ success
model-router-provider-routed-inference-vitest ✅ success
network-policy-vitest ❌ failure
spark-install-vitest ✅ success
state-backup-restore-vitest ✅ success

Failed jobs: network-policy-vitest. Check run artifacts for logs.

@github-actions

Copy link
Copy Markdown
Contributor

Selective E2E Results — ✅ All requested jobs passed

Run: 28307219283
Target ref: codex/full-release-gate-cleanup
Requested jobs: common-egress-agent-e2e,state-backup-restore-e2e
Summary: 2 passed, 0 failed, 0 cancelled, 0 skipped

Job Result
common-egress-agent-e2e ✅ success
state-backup-restore-e2e ✅ success

@cv

cv commented Jun 28, 2026

Copy link
Copy Markdown
Collaborator Author

Advisor follow-up for head 6236b5da0338dea13b8845bca0b67dd08db2c4b8:

The isolated network-policy validation is still running; I will record its final result before merge.

@cv

cv commented Jun 28, 2026

Copy link
Copy Markdown
Collaborator Author

Credential-name clarification for the release-gate record:

  • NVIDIA_API_KEY is the repository's public NVIDIA API Catalog credential. It is nvapi-* and targets https://integrate.api.nvidia.com/v1.
  • NVIDIA_INFERENCE_API_KEY is this project's hosted-inference credential. It is sk-* and targets https://inference-api.nvidia.com/v1.

The Model Router lane now sources only ${{ secrets.NVIDIA_API_KEY }} at the workflow boundary and validates the nvapi-* shape. Inside that lane only, the helper also maps that public value to the router blueprint's historical runtime credential name NVIDIA_INFERENCE_API_KEY (the routed profile declares that credential_env) plus NEMOCLAW_PROVIDER_KEY. That scoped runtime alias does not change which GitHub secret is used. Hosted-compatible lanes continue to source ${{ secrets.NVIDIA_INFERENCE_API_KEY }} and use inference-api.nvidia.com.

@github-actions

Copy link
Copy Markdown
Contributor

Vitest E2E Scenario Results — ❌ Some jobs failed

Run: 28307373397
Workflow ref: codex/full-release-gate-cleanup
Requested scenarios: (default — all supported)
Requested jobs: network-policy-vitest
Summary: 0 passed, 1 failed, 0 cancelled, 0 skipped

Job Result
network-policy-vitest ❌ failure

Failed jobs: network-policy-vitest. Check run artifacts for logs.

Signed-off-by: Carlos Villela <cvillela@nvidia.com>
@cv

cv commented Jun 28, 2026

Copy link
Copy Markdown
Collaborator Author

Network-policy follow-up: isolated run https://github.com/NVIDIA/NemoClaw/actions/runs/28307373397 reached the real Slack assertion and proved the endpoint change alone was insufficient. Artifacts showed policy-add exited 0 but policy-list still reported ○ slack: the migrated two-line stdin pipe did not synchronize the picker and confirmation readline prompts.

Head 4121f2af9d2bc7ae0942a953547766af989941f6 restores the retained Bash lane's prompt-synchronized expect behavior, installs expect inline in trusted workflow YAML, asserts ● slack before probing egress, and adds support/workflow contract coverage. Local hooks and targeted tests pass; the isolated live rerun is https://github.com/NVIDIA/NemoClaw/actions/runs/28307920824.

Signed-off-by: Carlos Villela <cvillela@nvidia.com>
@github-actions

Copy link
Copy Markdown
Contributor

Vitest E2E Scenario Results — ✅ All requested jobs passed

Run: 28307920824
Workflow ref: codex/full-release-gate-cleanup
Requested scenarios: (default — all supported)
Requested jobs: network-policy-vitest
Summary: 1 passed, 0 failed, 0 cancelled, 0 skipped

Job Result
network-policy-vitest ✅ success

Signed-off-by: Carlos Villela <cvillela@nvidia.com>
@cv

cv commented Jun 28, 2026

Copy link
Copy Markdown
Collaborator Author

Final advisor follow-up:

  • PRA-1: resolved as previously documented; the Actions secrets inventory includes NVIDIA_API_KEY, and the public-key Model Router live lane passed.
  • PRA-5: resolved. Preset extraction is anchored to a numbered list row, captures only \d+, requires an exact preset token, and has positive/negative support coverage. The controlled numeric value and literal Y are sent only after their respective prompts.
  • PRA-6: slack.com/api/api.test was chosen because it is a stable, non-redirecting endpoint on the preset's actual slack.com API host; the marketing root introduced redirect-chain ambiguity.
  • PRA-7: the helper now documents the exact secret split: public nvapi-* NVIDIA_API_KEY for integrate.api.nvidia.com, versus hosted sk-* NVIDIA_INFERENCE_API_KEY for inference-api.nvidia.com, plus the routed blueprint's lane-local legacy alias.
  • PRA-8: Super is covered by the existing nemotron-3-super-120b-managed-inference.json; Ultra is covered by the new parallel manifest.
  • PRA-9 and PRA-10: no action requested by the advisor.

Runtime PRA-T3 is now green: https://github.com/NVIDIA/NemoClaw/actions/runs/28307920824. The prompt-synchronized flow applied ● slack and the post-policy api.test probe passed. The later commits only moved a guardrail-rejected conditional into the non-test helper and added the credential naming comment; hooks and the ratcheted conditional guard pass.

@cv

cv commented Jun 28, 2026

Copy link
Copy Markdown
Collaborator Author

@coderabbitai review

@coderabbitai

coderabbitai Bot commented Jun 28, 2026

Copy link
Copy Markdown
Contributor
✅ Action performed

Review finished.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

Signed-off-by: Carlos Villela <cvillela@nvidia.com>
@github-actions

Copy link
Copy Markdown
Contributor

Selective E2E Results — ✅ All requested jobs passed

Run: 28308152912
Target ref: codex/full-release-gate-cleanup
Requested jobs: network-policy-e2e
Summary: 1 passed, 0 failed, 0 cancelled, 0 skipped

Job Result
network-policy-e2e ✅ success

@cv

cv commented Jun 28, 2026

Copy link
Copy Markdown
Collaborator Author

Final live/security evidence for head 27766b926f1b0019e9478beb740dd81b8c6a76b4:

The final merged-main full gates will cover the intervening #5916 onboarding refactor before release.

@cv

cv commented Jun 28, 2026

Copy link
Copy Markdown
Collaborator Author

Maintainer acceptance/override record for the final Nemotron review on 27766b926f1b0019e9478beb740dd81b8c6a76b4:

  • Required PRA-3 is fulfilled, not waived: authenticated Actions metadata confirms NVIDIA_API_KEY exists, the release-gate owner confirmed it is the public nvapi-* credential, and run 28307218499 proved that shape and route end to end.
  • Required PRA-4 is explicitly accepted. The bounded expect trust surface is documented in source and the PR Quality Gates, enforced inline in trusted workflow YAML, restricted to a parsed numeric index plus literal Y, covered by support/boundary tests, and proven by run 28307920824.
  • PRA-1/PRA-7 source-of-truth: invalid state is external Nemotron model output on OpenClaw's code-based tool-search surface; the external model is outside this PR; [Ubuntu 24.04][Agent&Skills] tool_search_code generates invalid JS and logs repeated errors during successful agent runs #4780 tracks the local rationale; config regression tests and the common-egress live run cover the mitigation; remove the manifest when the model reliably completes that surface or structured tool calling becomes the default.
  • PRA-2/PRA-13/PRA-14 source-of-truth: the router blueprint's historical credential env is NVIDIA_INFERENCE_API_KEY, while CI's public secret is NVIDIA_API_KEY; the alias is child-process-scoped, shape-validated, documented, support-tested, and live-proven by run 28307218499. Remove it when the routed blueprint adopts the public secret name.
  • PRA-5/PRA-10 are resolved in code comments and workflow enforcement.
  • PRA-6: fix(e2e): correct full release gate lanes #5917 is GitHub-MERGEABLE on current main with no overlapping landed commit; still-open feat(mcp): add OpenShell-managed MCP servers #5876 must resolve against the release-gate fix if it lands later.
  • No external provider tracking URL is known for PRA-7, and project policy prohibits adding unofficial external-project links.

These findings are accepted for merge once required CI is green.

@cv
cv enabled auto-merge (squash) June 28, 2026 02:14
@cv
cv disabled auto-merge June 28, 2026 02:35
@cv
cv merged commit b4063f6 into main Jun 28, 2026
44 of 45 checks passed
@cv
cv deleted the codex/full-release-gate-cleanup branch June 28, 2026 02:36
Hadar301 pushed a commit to Hadar301/NemoClaw-OpenShift that referenced this pull request Jul 12, 2026
<!-- markdownlint-disable MD041 -->
## Summary

Correct the deterministic failures exposed by the full nightly/Vitest
release gate. The fixes cover credential and project selection, hosted
Ultra tool compatibility, a stable Slack policy probe, and OpenShell's
single-line command boundary.

## Changes

- pass `NVIDIA_API_KEY` to the Model Router workflow and stage it under
the router's `NVIDIA_INFERENCE_API_KEY` credential boundary
- mirror the public-key fix in the retained regression Bash lane and add
behavioral support coverage for key selection and staging
- run `test/gateway-drift-preflight.test.ts` through the `integration`
Vitest project
- extend the workflow boundary validator so both command and credential
contracts fail closed on future drift
- disable OpenClaw native Tool Search for hosted Nemotron 3 Ultra so it
uses structured tool calls instead of invalid generated JavaScript
- probe the Slack preset through the non-redirecting
`slack.com/api/api.test` endpoint in both Bash and Vitest lanes, using
prompt-synchronized `expect` and an applied-policy assertion
- pass the Hermes API-key shape check as direct single-line argv
accepted by current OpenShell, with support coverage

## Type of Change

- [x] Code change (feature, bug fix, or refactor)
- [ ] Code change with doc updates
- [ ] Doc only (prose changes, no code sample modifications)
- [ ] Doc only (includes code sample changes)

## Quality Gates

- [x] Tests added or updated for changed behavior
- [x] Existing tests cover changed behavior — justification: the
existing gateway-drift integration test and workflow-boundary suite
exercise the corrected project and workflow contract
- [ ] Tests not applicable — justification:
- [ ] Docs updated for user-facing behavior changes
- [x] Docs not applicable — justification: release-gate workflow and
test-harness behavior only
- [x] Sensitive paths changed (security, policy, credentials, preflight,
onboarding, inference, runner, sandbox, or messaging)
- [x] Sensitive-path review completed or maintainer-approved waiver
recorded — reviewer/approval link/justification: the public key remains
step-scoped, the live helper stages only the credential aliases consumed
by Model Router, and boundary tests reject hosted-key regression. The
`expect` trust boundary is explicitly accepted: it is an existing
reviewed host tool in the retained Bash lane; the Vitest lane installs
it only from Ubuntu apt in trusted workflow YAML, feeds it only a
regex-constrained numeric menu index plus literal `Y`, and enforces that
shape with support and workflow-boundary tests.
- [ ] Non-success, skipped, or missing CI check accepted by maintainer —
check name, approval link, and follow-up issue:

## Verification

- [x] PR description includes the DCO sign-off declaration and every
commit appears as `Verified` in GitHub
- [x] Git hooks passed during commit and push, or `npx prek run
--from-ref main --to-ref HEAD` passes
- [x] Targeted tests pass for changed behavior
- [ ] Full `npm test` passes (broad runtime changes only)
- [x] Quality Gates section completed with required justifications or
waivers
- [x] No secrets, API keys, or credentials committed
- [ ] `npm run docs` builds without warnings (doc changes only)
- [ ] Doc pages follow the [style
guide](https://github.com/NVIDIA/NemoClaw/blob/main/docs/CONTRIBUTING.md)
(doc changes only)
- [ ] New doc pages include SPDX header and frontmatter (new pages only)

---
Signed-off-by: Carlos Villela <cvillela@nvidia.com>


<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit

* **New Features**
* Added a Nemotron 3 Ultra managed inference route with native tool
search disabled.
* **Bug Fixes**
* Updated routed-inference E2E credential wiring and secret redaction to
use `NVIDIA_API_KEY` (`nvapi-*`) instead of `NVIDIA_INFERENCE_API_KEY`.
* Updated network-policy Slack connectivity checks to target
`https://slack.com/api/api.test`.
* **Tests**
* Expanded router/gateway-drift preflight Vitest coverage (correct env
staging and integration project selection).
* Added/strengthened Hermes and network-policy interactive preset
parsing/expect sequencing tests.
  * Added a regression assertion for workflow env handling.
* **Chores**
* Improved CI workflow validation and ensured host dependency
installation sequencing; adjusted a test file size budget.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->

---------

Signed-off-by: Carlos Villela <cvillela@nvidia.com>
@wscurran wscurran added area: ci CI workflows, checks, release automation, or GitHub Actions area: e2e End-to-end tests, nightly failures, or validation infrastructure bug-fix PR fixes a bug or regression integration: openclaw OpenClaw integration behavior labels Aug 1, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area: ci CI workflows, checks, release automation, or GitHub Actions area: e2e End-to-end tests, nightly failures, or validation infrastructure bug-fix PR fixes a bug or regression integration: openclaw OpenClaw integration behavior

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants