ci(e2e): preserve cutover operations - #6012
Conversation
Signed-off-by: Carlos Villela <cvillela@nvidia.com>
|
Note Reviews pausedIt 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 Use the following commands to manage reviews:
Use the checkboxes below for quick actions:
No actionable comments were generated in the recent review. 🎉 ℹ️ Recent review info⚙️ Run configurationConfiguration used: Path: .coderabbit.yaml Review profile: CHILL Plan: Enterprise Run ID: 📒 Files selected for processing (2)
🚧 Files skipped from review as they are similar to previous changes (2)
📝 WalkthroughWalkthroughAdds trace sanitization, scorecard generation, scheduled failure routing, explicit-only job inventory outputs, and workflow boundary validation for the E2E operations flow. ChangesE2E scorecard and workflow operations
Estimated code review effort🎯 5 (Critical) | ⏱️ ~120 minutes Possibly related issues
Suggested labels
Suggested reviewers
🚥 Pre-merge checks | ✅ 4 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (4 passed)
✨ Finishing Touches📝 Generate docstrings
🧪 Generate unit tests (beta)
Comment |
Code Coverage OverviewLanguages: TypeScript TypeScript / code-coverage/pluginThe overall coverage in the Show a code coverage summary of the most covered files.
TypeScript / code-coverage/cliThe overall coverage in the Show a code coverage summary of the most covered files.
Updated |
E2E Advisor RecommendationRequired E2E: Dispatch hint: Full advisor summaryE2E Recommendation AdvisorBase: Required E2E
Optional E2E
New E2E recommendations
Dispatch hint
|
PR Review Advisor (Nemotron Ultra) — Changes requestedMerge posture: Do not merge yet Action checklist
Findings index
🚨 Required before mergeAddress these before merging unless a maintainer explicitly overrides the advisor with rationale.
|
PR Review Advisor — Changes requestedMerge posture: Do not merge yet Action checklist
Findings index
Review findings by urgency: 0 required fixes, 1 item to resolve/justify, 0 in-scope improvements
|
Signed-off-by: Carlos Villela <cvillela@nvidia.com>
|
@coderabbitai review |
Signed-off-by: Carlos Villela <cvillela@nvidia.com>
|
@coderabbitai review |
✅ Action performedReview finished.
|
There was a problem hiding this comment.
Actionable comments posted: 7
🤖 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 @.github/workflows/e2e.yaml:
- Around line 6394-6402: The selective dispatch check in the workflow script is
using filtered selector arrays, so invalid but non-empty JOBS/TARGETS input can
be misclassified as a full manual run. Update the logic around parseSelectors,
requestedJobs/requestedTargets, and isSelectiveDispatch so selectiveness is
determined from the raw environment inputs before filtering, while the parsed
selectors are only used for aggregation/routing. Keep the workflow behavior
aligned with the rule that selective dispatch stays silent unless post_to_slack
is true.
- Line 3352: Move NEMOCLAW_TRACE_DIR out of the job-level env block in the e2e
workflow because runner.temp is not resolved there; instead set it after the
runner is available by writing to GITHUB_ENV in a step, or switch the
cloud-onboard step logic to read RUNNER_TEMP directly. Update the workflow
section that defines NEMOCLAW_TRACE_DIR so the cloud-onboard steps can start
without early expansion failure.
- Around line 6386-6392: The github-script step is requiring scorecard helper
files as if they were plain CommonJS modules, but analyze-trace-timing,
summarize-jobs, and build-slack-blocks still contain TypeScript-only syntax.
Update those scorecard helpers to be loadable at runtime by either converting
them to plain JavaScript or introducing a TS-aware load path/compile step, and
make sure the workflow’s require calls in the github-script block resolve
through the chosen approach.
In `@scripts/scorecard/analyze-trace-timing.ts`:
- Around line 87-93: The formatTraceDelta helper currently treats a zero priorMs
like a normal baseline, which can render non-zero deltas as +0.0%. Update
formatTraceDelta to handle priorMs === 0 as its own case, using the current
delta direction and duration but omitting the percentage or showing n/a. Keep
the existing unchanged path for tiny deltas, and make the change inside
formatTraceDelta so the scorecard output is accurate.
In `@test/helpers/e2e-workflow-contract.ts`:
- Around line 57-69: The removeJobNeed helper is searching and replacing the
dependency across ownerJob and all following jobs instead of only within
ownerJob’s block. Update removeJobNeed in e2e-workflow-contract to isolate the
ownerJob section before checking/removing the dependency, so includes/replace
only act inside that job’s needs list and don’t mutate later jobs. Keep the
existing function name and error behavior, but scope the needle match to
ownerJob’s block so the test fixture reflects the claimed negative case.
In `@tools/e2e/operations-workflow-boundary.mts`:
- Around line 220-227: The permission check in validateAdvisorRetirement is
relying on regexes against raw YAML text, which can miss equivalent permission
encodings. Update the advisor validation to parse the workflow structure in
validateAdvisorRetirement and inspect the permissions object/fields directly,
then use that parsed data to enforce that actions is not write and that workflow
dispatch is not enabled. Keep the existing symbols validateAdvisorRetirement and
advisorPath as the entry point for the fix.
- Around line 129-131: The scorecard permissions check only verifies the actions
and contents values, so it can still pass if extra permission scopes are added
later. Update the validation in the scorecard permission block to mirror the
exact-key enforcement used for notify-on-failure, using the job.permissions
object to confirm the only allowed keys are actions and contents and that both
are read. Keep the existing error path in operations-workflow-boundary.mts so
this secret-bearing job remains least-privileged.
🪄 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: 80fea691-ae95-4ba9-a9fb-e2481c36de52
📒 Files selected for processing (14)
.github/workflows/e2e.yamlscripts/e2e/sanitize-trace-timing.pyscripts/scorecard/analyze-trace-timing.tsscripts/scorecard/build-slack-blocks.tsscripts/scorecard/summarize-jobs.tstest/e2e/README.mdtest/e2e/fixtures/availability-env.tstest/e2e/support/e2e-operations-workflow-boundary.test.tstest/e2e/support/e2e-scorecard.test.tstest/e2e/support/e2e-workflow.test.tstest/e2e/support/gpu-e2e-helpers.test.tstest/helpers/e2e-workflow-contract.tstools/e2e/operations-workflow-boundary.mtstools/e2e/workflow-boundary.mts
Signed-off-by: Carlos Villela <cvillela@nvidia.com>
|
Resolved the fresh exact-head advisor findings in Source boundaries and behavior coverage
Additional review gaps closed
Verification on the pushed head:
No user-facing product behavior changed, so no docs-page update is needed. The E2E README already documents the surviving operational behavior. |
|
@coderabbitai review |
✅ Action performedReview finished.
|
There was a problem hiding this comment.
🧹 Nitpick comments (1)
test/e2e/support/jetson-workflow-boundary.test.ts (1)
25-27: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick winAvoid locking this test to CSV order.
This assertion couples the test to the current workflow declaration order instead of the explicit-only behavior. Parse the
explicit_only_jobs_csvline and assert membership instead. As per path instructions, “Prefer observable outcomes through the public boundary over source-text, private-shape, or mock-call assertions.”Proposed change
- expect(formatFreeStandingJobsInventoryForShell(inventory)).toContain( - "explicit_only_jobs_csv=sandbox-rlimits-connect,jetson-nvmap-gpu", - ); + const explicitOnlyLine = formatFreeStandingJobsInventoryForShell(inventory) + .split("\n") + .find((line) => line.startsWith("explicit_only_jobs_csv=")); + expect(explicitOnlyLine).toBeDefined(); + expect(explicitOnlyLine!.replace("explicit_only_jobs_csv=", "").split(",")).toEqual( + expect.arrayContaining(["sandbox-rlimits-connect", "jetson-nvmap-gpu"]), + );🤖 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/support/jetson-workflow-boundary.test.ts` around lines 25 - 27, The test is asserting the exact CSV ordering in formatFreeStandingJobsInventoryForShell, which makes it depend on workflow declaration order instead of the explicit-only behavior. Update the assertion in jetson-workflow-boundary.test.ts to parse the explicit_only_jobs_csv output and verify that the expected job names are present as members, rather than matching the full comma-separated string. Use the observable boundary from formatFreeStandingJobsInventoryForShell and keep the check focused on membership for the explicit_only_jobs_csv field.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/support/jetson-workflow-boundary.test.ts`:
- Around line 25-27: The test is asserting the exact CSV ordering in
formatFreeStandingJobsInventoryForShell, which makes it depend on workflow
declaration order instead of the explicit-only behavior. Update the assertion in
jetson-workflow-boundary.test.ts to parse the explicit_only_jobs_csv output and
verify that the expected job names are present as members, rather than matching
the full comma-separated string. Use the observable boundary from
formatFreeStandingJobsInventoryForShell and keep the check focused on membership
for the explicit_only_jobs_csv field.
ℹ️ Review info
⚙️ Run configuration
Configuration used: Path: .coderabbit.yaml
Review profile: CHILL
Plan: Enterprise
Run ID: 62c3a8b2-d664-4518-a817-b2adb787dedf
📒 Files selected for processing (10)
.github/workflows/e2e.yamlscripts/scorecard/analyze-trace-timing.tsscripts/scorecard/summarize-jobs.tstest/e2e/support/e2e-operations-workflow-boundary.test.tstest/e2e/support/e2e-scorecard.test.tstest/e2e/support/jetson-workflow-boundary.test.tstest/e2e/support/rlimit-connect-workflow-boundary.test.tstools/e2e/operations-workflow-boundary.mtstools/e2e/workflow-boundary.mtstools/e2e/workflow-inventory.mts
🚧 Files skipped from review as they are similar to previous changes (2)
- tools/e2e/operations-workflow-boundary.mts
- scripts/scorecard/analyze-trace-timing.ts
Signed-off-by: Carlos Villela <cvillela@nvidia.com>
|
Closed the Slack secret boundary in
For the remaining TypeScript loader warning: the workflow is pinned to Verification: focused operations/scorecard tests, CLI typecheck, |
|
@coderabbitai review |
✅ Action performedReview finished.
|
|
Caution Failed to replace (edit) comment. This is likely due to insufficient permissions or the comment being deleted. Error details |
There was a problem hiding this comment.
♻️ Duplicate comments (1)
.github/workflows/e2e.yaml (1)
6521-6541: 🎯 Functional Correctness | 🟠 Major | ⚡ Quick winClassify selective dispatch from raw inputs before choosing the Slack route.
slackBlocks.getSlackChannel(scorecardData)depends onisSelectiveDispatch, but that flag is still computed from filtered selector arrays. A dispatch with non-empty rejectedjobs/targetscan be treated as a manual full run and route away from the preview/silent path. This matches the prior selector-classification review, but it still affects the newly precomputed Slack payload. As per path instructions, “selective dispatch” must stay silent unless onmainwithpost_to_slack=true.Proposed fix
const safeSelector = /^[A-Za-z0-9_-]+$/; const parseSelectors = (value) => value.split(',').map((name) => name.trim()).filter((name) => safeSelector.test(name)); - const requestedJobs = parseSelectors(process.env.JOBS || ''); - const requestedTargets = parseSelectors(process.env.TARGETS || ''); + const rawRequestedJobs = process.env.JOBS || ''; + const rawRequestedTargets = process.env.TARGETS || ''; + const requestedJobs = parseSelectors(rawRequestedJobs); + const requestedTargets = parseSelectors(rawRequestedTargets); const isDispatch = context.eventName === 'workflow_dispatch'; const isSelectiveDispatch = - isDispatch && (requestedJobs.length > 0 || requestedTargets.length > 0); + isDispatch && (rawRequestedJobs.trim() !== '' || rawRequestedTargets.trim() !== '');🤖 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 @.github/workflows/e2e.yaml around lines 6521 - 6541, Classify selective dispatch from the raw workflow inputs before building the Slack payload so `slackBlocks.getSlackChannel(scorecardData)` sees the correct route. Update the `scorecardData` preparation around `isSelectiveDispatch` to derive that flag from the original dispatch inputs, not from filtered selector arrays, and keep the selective path silent unless the run is on `main` with `post_to_slack=true`. Use the `scorecardData` object and `slackBlocks.getSlackChannel` call as the main touchpoints.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.
Duplicate comments:
In @.github/workflows/e2e.yaml:
- Around line 6521-6541: Classify selective dispatch from the raw workflow
inputs before building the Slack payload so
`slackBlocks.getSlackChannel(scorecardData)` sees the correct route. Update the
`scorecardData` preparation around `isSelectiveDispatch` to derive that flag
from the original dispatch inputs, not from filtered selector arrays, and keep
the selective path silent unless the run is on `main` with `post_to_slack=true`.
Use the `scorecardData` object and `slackBlocks.getSlackChannel` call as the
main touchpoints.
ℹ️ Review info
⚙️ Run configuration
Configuration used: Path: .coderabbit.yaml
Review profile: CHILL
Plan: Enterprise
Run ID: fb6f720b-e26d-4055-b483-f881af3790bb
📒 Files selected for processing (4)
.github/workflows/e2e.yamltest/e2e/README.mdtest/e2e/support/e2e-operations-workflow-boundary.test.tstools/e2e/operations-workflow-boundary.mts
✅ Files skipped from review due to trivial changes (1)
- test/e2e/README.md
🚧 Files skipped from review as they are similar to previous changes (2)
- tools/e2e/operations-workflow-boundary.mts
- test/e2e/support/e2e-operations-workflow-boundary.test.ts
Signed-off-by: Carlos Villela <cvillela@nvidia.com>
|
Addressed the current automated-review findings in
Validation:
The helper regression lives in its own focused test file so the existing 1,500-line test-size ratchet remains unchanged. |
Signed-off-by: Carlos Villela <cvillela@nvidia.com>
|
One additional valid item from the earlier consolidated review was not represented by a remaining open thread. Fixed in
Focused E2E-support tests, YAML validation, the operations boundary, CLI type-checking, test-size budget, and normal commit/push hooks passed. |
|
@coderabbitai review |
✅ Action performedReview finished.
|
There was a problem hiding this comment.
Actionable comments posted: 1
🤖 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 `@tools/e2e/operations-workflow-boundary.mts`:
- Around line 288-293: The retirement gate in the workflow permissions check
only looks at permissions.actions, so it misses the GitHub Actions scalar
shortcut write-all. Update the logic in the YAML.parse-based permissions
handling for OperationsWorkflow to normalize scalar permissions values before
evaluating them, and treat write-all the same as write access for both the
top-level advisor.permissions and each job.permissions entry. Make the check in
the permissionBlocks flow recognize both object and scalar forms consistently so
workflows using write-all cannot bypass the gate.
🪄 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: 0edf8e68-76f1-46eb-ab8e-d31c6e74aee8
📒 Files selected for processing (8)
.github/workflows/e2e.yamlscripts/scorecard/analyze-trace-timing.tsscripts/scorecard/summarize-jobs.tstest/e2e/support/e2e-operations-workflow-boundary.test.tstest/e2e/support/e2e-scorecard.test.tstest/e2e/support/e2e-workflow-contract.test.tstest/helpers/e2e-workflow-contract.tstools/e2e/operations-workflow-boundary.mts
🚧 Files skipped from review as they are similar to previous changes (6)
- test/helpers/e2e-workflow-contract.ts
- test/e2e/support/e2e-operations-workflow-boundary.test.ts
- test/e2e/support/e2e-scorecard.test.ts
- scripts/scorecard/summarize-jobs.ts
- .github/workflows/e2e.yaml
- scripts/scorecard/analyze-trace-timing.ts
Signed-off-by: Carlos Villela <cvillela@nvidia.com>
|
Addressed the exact-head CodeRabbit finding in Regression coverage exercises workflow-level |
|
@coderabbitai review |
✅ Action performedReview finished.
|
Vitest E2E Target Results — ✅ All requested jobs passedRun: 28402270047
|
Exact-head runtime proof and advisor dispositionRun 28402270047 executed the actual branch
That resolves GPT’s sole “resolve or justify” item: the three TypeScript scorecard helpers loaded and executed successfully through the exact production Nemotron findings were reviewed individually:
No advisor item remains actionable. Ordinary PR CI, both advisors, CodeRabbit, and the exact workflow runtime are green. The remaining gate is independent human review of the operations end state. |
<!-- markdownlint-disable MD041 --> ## Summary Retires the remaining legacy shell-driven E2E lanes for #5098 Phase 11 and makes the surviving E2E surface a single target/live Vitest workflow. This terminal cleanup deletes the old runner paths, consolidates fixtures and workflow controls, and preserves the operational, docs-validation, and two-agent security-posture coverage landed while the migration was in flight. ## Related Issues - Parent migration: #5098 - Cutover acceptance and post-merge burn-in: #5919 ## Changes - Replace `.github/workflows/e2e-vitest-scenarios.yaml` with `.github/workflows/e2e.yaml`; remove the legacy nightly/script workflows and shared script action. - Move E2E fixtures, live tests, registry, manifests, support tests, and migration docs under `test/e2e/` with target/live naming. - Delete converted `test/e2e/test-*.sh` entrypoints and the retired shell-runner test/support code while retaining implementation shell fixtures used by Vitest. - Rename target advisor files/schema under `tools/e2e-advisor/`, remove auto-dispatch, and align PR Review Advisor terminology. - Preserve #6012 controls: inventory-derived selection, fail-closed selectors, complete aggregation, PR reporting, scheduled failure issues, timing sanitization, and scorecards. - Preserve #6013 behavior: multiline sandbox scripts plus default-enabled `docs-validation` and two-agent `security-posture` jobs in the final workflow/path/project model. - Keep parity decisions and execution evidence in #5919; exact-head full, explicit-only, malformed-selector, and selective-dispatch runs are linked there. ## Type of Change - [ ] Code change (feature, bug fix, or refactor) - [x] Code change with doc updates - [ ] Doc only (prose changes, no code sample modifications) - [ ] Doc only (includes code sample changes) ## Quality Gates <!-- Check all that apply. For any "covered by existing tests", "not applicable", or waiver entry, add a brief justification on the same line or in the Changes section. --> - [x] Tests added or updated for changed behavior - [ ] Existing tests cover changed behavior — justification: - [ ] Tests not applicable — justification: - [x] Docs updated for user-facing behavior changes - [ ] Docs not applicable — justification: - [x] 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: exact-head CodeQL/GHAS and #5919 domain approvals are pending - [ ] Non-success, skipped, or missing CI check accepted by maintainer — check name, approval link, and follow-up issue: CodeRabbit could not perform a line review because the 409-file cutover exceeds its 300-file service limit; exact-head GPT-5.5 and Nemotron findings are dispositioned in PR comments, while human #5919 domain review remains pending ## Verification <!-- Check each item you ran and confirmed. Leave unchecked items you skipped. Doc-only changes do not require npm test unless you ran it. --> - [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 - [x] Full `npm test` passes (broad runtime changes only) - [ ] 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) — passed with 0 errors and 2 existing Fern warnings - [x] 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) --- <!-- DCO sign-off is required in this PR description, and every commit must appear as Verified in GitHub. Run: git config user.name && git config user.email --> Signed-off-by: Carlos Villela <cvillela@nvidia.com> --------- Signed-off-by: Carlos Villela <cvillela@nvidia.com>
<!-- markdownlint-disable MD041 --> ## Summary Retires the remaining legacy shell-driven E2E lanes for NVIDIA#5098 Phase 11 and makes the surviving E2E surface a single target/live Vitest workflow. This terminal cleanup deletes the old runner paths, consolidates fixtures and workflow controls, and preserves the operational, docs-validation, and two-agent security-posture coverage landed while the migration was in flight. ## Related Issues - Parent migration: NVIDIA#5098 - Cutover acceptance and post-merge burn-in: NVIDIA#5919 ## Changes - Replace `.github/workflows/e2e-vitest-scenarios.yaml` with `.github/workflows/e2e.yaml`; remove the legacy nightly/script workflows and shared script action. - Move E2E fixtures, live tests, registry, manifests, support tests, and migration docs under `test/e2e/` with target/live naming. - Delete converted `test/e2e/test-*.sh` entrypoints and the retired shell-runner test/support code while retaining implementation shell fixtures used by Vitest. - Rename target advisor files/schema under `tools/e2e-advisor/`, remove auto-dispatch, and align PR Review Advisor terminology. - Preserve NVIDIA#6012 controls: inventory-derived selection, fail-closed selectors, complete aggregation, PR reporting, scheduled failure issues, timing sanitization, and scorecards. - Preserve NVIDIA#6013 behavior: multiline sandbox scripts plus default-enabled `docs-validation` and two-agent `security-posture` jobs in the final workflow/path/project model. - Keep parity decisions and execution evidence in NVIDIA#5919; exact-head full, explicit-only, malformed-selector, and selective-dispatch runs are linked there. ## Type of Change - [ ] Code change (feature, bug fix, or refactor) - [x] Code change with doc updates - [ ] Doc only (prose changes, no code sample modifications) - [ ] Doc only (includes code sample changes) ## Quality Gates <!-- Check all that apply. For any "covered by existing tests", "not applicable", or waiver entry, add a brief justification on the same line or in the Changes section. --> - [x] Tests added or updated for changed behavior - [ ] Existing tests cover changed behavior — justification: - [ ] Tests not applicable — justification: - [x] Docs updated for user-facing behavior changes - [ ] Docs not applicable — justification: - [x] 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: exact-head CodeQL/GHAS and NVIDIA#5919 domain approvals are pending - [ ] Non-success, skipped, or missing CI check accepted by maintainer — check name, approval link, and follow-up issue: CodeRabbit could not perform a line review because the 409-file cutover exceeds its 300-file service limit; exact-head GPT-5.5 and Nemotron findings are dispositioned in PR comments, while human NVIDIA#5919 domain review remains pending ## Verification <!-- Check each item you ran and confirmed. Leave unchecked items you skipped. Doc-only changes do not require npm test unless you ran it. --> - [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 - [x] Full `npm test` passes (broad runtime changes only) - [ ] 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) — passed with 0 errors and 2 existing Fern warnings - [x] 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) --- <!-- DCO sign-off is required in this PR description, and every commit must appear as Verified in GitHub. Run: git config user.name && git config user.email --> Signed-off-by: Carlos Villela <cvillela@nvidia.com> --------- Signed-off-by: Carlos Villela <cvillela@nvidia.com>
Summary
Preserves the operational controls that would otherwise disappear when #5756 retires the legacy nightly E2E workflow. This is intentionally stacked on #5756 so review does not activate a second schedule on
main; merge it into the cutover branch before #5756 lands.Related Issue
Contributes to #5919.
Changes
Nightly E2E failedissue thread.needsfallback.notify-on-failure,report-to-pr, andscorecardto the same complete execution-job set.Type of Change
Quality Gates
Verification
Verifiedin GitHubnpx prek run --from-ref main --to-ref HEADpassesnpm testpasses (broad runtime changes only)npm run docsbuilds without warnings (doc changes only)Verification details:
make checknpm test— 830 files passed, 9,591 tests passed, 26 skippedSigned-off-by: Carlos Villela cvillela@nvidia.com
Summary by CodeRabbit