Skip to content

ci(release): automate post-merge daily editions - #8479

Closed
cjagwani wants to merge 7 commits into
ci/e2e-all-workflow-mainfrom
codex/post-merge-release-train
Closed

ci(release): automate post-merge daily editions#8479
cjagwani wants to merge 7 commits into
ci/e2e-all-workflow-mainfrom
codex/post-merge-release-train

Conversation

@cjagwani

@cjagwani cjagwani commented Aug 6, 2026

Copy link
Copy Markdown
Collaborator

Summary

Automates the frozen daily release edition around the all-workflows-on-main E2E model in #8477. Every merge receives an immutable run selecting every workflow E2E, a separate exact-before...after Advisor review retained as an artifact, and the 4 AM tag is cut from the 4 PM candidate regardless of advisory E2E state.

Depends on #8477. This PR is intentionally stacked on ci/e2e-all-workflow-main so Carlos's E2E workflow remains the single source of truth.

Changes

  • Freeze the latest server-recorded pre-cutoff main SHA in a provenance-bound edition plan after the 4 PM close.
  • Dispatch PR Review Advisor asynchronously for every exact main push range without allowing later pushes to cancel earlier reviews.
  • Cut and promote the signed frozen tag after 4 AM without reading, waiting on, or waiving E2E state.
  • Update maintainer skills to consume every selected E2E, bounded retry artifacts, and exact-SHA Advisor findings through the 8 AM handoff; this PR does not add an E2E schedule or restore a PR gate.
  • Preserve the deterministic merge floor with a hermetic built-artifact smoke test.

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:
  • Tests not applicable — justification:
  • Docs updated for user-facing behavior changes
  • Docs not applicable — justification: maintainer-only workflows, scripts, and agent runbooks change; no public CLI or supported user workflow changes.
  • 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: PR Review Advisor run 31114147912 reviewed the exact release delta now at 00a606270; both advisor models succeeded and Terra recommends merge_as_is with high confidence and no findings. The latest merge commit changes ancestry only, not the PR tree.
  • Non-success, skipped, or missing CI check accepted by maintainer — check name, approval link, and follow-up issue:

Documentation Writer Review

  • Documentation writer subagent reviewed the completed changes
  • Result: no-docs-needed
  • Evidence: Carlos's contributor-facing E2E changes are covered by test/e2e/README.md and test/e2e/docs/README.md; the release-train delta is maintainer-only and changes no public product contract.
  • Agent: Codex Desktop

DGX Station Hardware Evidence

  • Tested on DGX Station
  • Tested commit: Not applicable
  • Station profile/scenario: Not applicable
  • Result: Not applicable
  • Supporting evidence: Not applicable

Verification

  • PR description includes a Signed-off-by: line and every commit appears as Verified in GitHub
  • Normal pre-commit, commit-msg, and pre-push hooks passed, or npm run validate:pr passed after refreshing origin/main when hooks were skipped or unavailable
  • Targeted behavior tests pass for the current change set, or tests are marked not applicable above — Carlos-owned E2E support tests passed 203/203 serially; after his two follow-ups, affected release/policy tests passed 73/73, E2E workflow tests passed 45/45, and npm run test:smoke passed 2/2.
  • Applicable broad gate passed — npm test for broad runtime/test-harness changes; npm run check for repo-wide validation/coverage changes — command/result: not run; targeted coverage and normal hooks cover the changed workflow and release surfaces.
  • 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: Charan Jagwani cjagwani@nvidia.com

Signed-off-by: Charan Jagwani <cjagwani@nvidia.com>
@cjagwani cjagwani self-assigned this Aug 6, 2026
@copy-pr-bot

copy-pr-bot Bot commented Aug 6, 2026

Copy link
Copy Markdown

Auto-sync is disabled for draft pull requests in this repository. Workflows must be run manually.

Contributors can view more details about this message here.

@coderabbitai

coderabbitai Bot commented Aug 6, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

Important

Review skipped

Auto reviews are disabled on base/target branches other than the default branch.

Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Enterprise

Run ID: 089025ca-1db9-40a3-a26c-1160a48eae4c

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
📝 Walkthrough

Walkthrough

The release process now freezes a 4 PM Pacific candidate, cuts a signed tag at 4 AM, and hands off release state at 8 AM. E2E runs provide advisory diagnostics. Release plans use schema version 2 and frozen candidate metadata. CI adds deterministic smoke coverage and exact-SHA post-merge review dispatch.

Changes

Daily release policy

Layer / File(s) Summary
Timed release policy and handoff
.agents/skills/...
Maintainer skills and policy references define the timed freeze, overnight diagnostics, scheduled tag cut, morning handoff, changelog rules, label handling, and public announcement boundaries.

Release planning and automation

Layer / File(s) Summary
Frozen candidate planning and validation
scripts/release-plan.mts, scripts/release-cut-tag.sh, scripts/release-notes-data.mts, scripts/release-wait-latest.sh
Release plans and cut scripts use schema version 2, candidate SHAs, scheduled provenance, ancestry and changelog checks, signing validation, and no-change results.
Scheduled cut, promotion, and handoff
.github/workflows/release-edition-*.yaml, .github/workflows/release-latest-tag.yaml
Workflows close editions, consume trusted plan artifacts, create or skip tags, promote releases, verify results, and upload handoff artifacts.

CI and validation

Layer / File(s) Summary
Deterministic CI and post-merge diagnostics
.github/actions/ci-build-typecheck/action.yaml, .github/workflows/post-merge-agent-review.yaml, package.json, test/package-contract/*
CI runs deterministic package smoke tests. Main pushes dispatch exact-SHA advisor reviews.
Workflow and release contract coverage
test/release-edition-workflow.test.ts, test/release-latest-tag*.test.ts, test/maintainer-*.test.ts
Tests cover workflow permissions, artifact provenance, candidate freezing, scheduled authorization, advisory E2E behavior, signing, tag promotion, no-change editions, and changelog validation.

Estimated code review effort: 5 (Critical) | ~120 minutes

Possibly related PRs

  • NVIDIA/NemoClaw#8234: Adds a managed-image E2E lane affected by the revised advisory E2E and release process.
  • NVIDIA/NemoClaw#8445: Revises overlapping E2E workflows and maintainer guidance toward advisory post-merge diagnostics.
  • NVIDIA/NemoClaw#8477: Revises related release-E2E selection and release-evidence requirements.

Suggested labels: area: ci, release-target, feature

Suggested reviewers: cv

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
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.
Title check ✅ Passed The title clearly summarizes the primary change: automating the post-merge daily release edition process.
✨ 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/post-merge-release-train

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

@cjagwani
cjagwani marked this pull request as ready for review August 6, 2026 13:53
@github-code-quality

github-code-quality Bot commented Aug 6, 2026

Copy link
Copy Markdown
Contributor

Code Coverage Overview

Languages: TypeScript

TypeScript / code-coverage/plugin

The overall coverage in commit 00a6062 in the codex/post-merge-rel... branch remains at 96%, unchanged from commit 0d33997 in the ci/e2e-all-workflow-... branch.


Updated August 06, 2026 15:32 UTC

@github-actions

github-actions Bot commented Aug 6, 2026

Copy link
Copy Markdown
Contributor

Comment thread test/package-contract/deterministic-smoke.test.ts Fixed
Comment thread test/package-contract/deterministic-smoke.test.ts Fixed
Signed-off-by: Charan Jagwani <cjagwani@nvidia.com>
@github-actions

github-actions Bot commented Aug 6, 2026

Copy link
Copy Markdown
Contributor

PR Review Advisor — No blocking findings reported

Advisor assessment: No blocking advisor findings reported
Next action: No advisor follow-up needed.
Findings: 0 blockers · 0 warnings · 0 suggestions

Model lanes

  • GPT-5.6 Terra (primary): Completed · high confidence · 0 blockers · 0 warnings · 0 suggestions
  • Nemotron 3 Ultra (second opinion): Completed · high confidence · 0 blockers · 0 warnings · 0 suggestions
  • Model comparison: normalized findings match; normalized terminology decisions differ; normalized E2E selections match; severity counts match.
8 terminology differences from the second opinion

Advisory only. These are normalized differences from the primary terminology receipt.

  • release doula at .agents/skills/nemoclaw-maintainer-cut-release-tag/SKILL.md:26: primary classified it as replace; the second opinion classified it as define.
  • advisory at .agents/skills/nemoclaw-maintainer-cut-release-tag/SKILL.md:32: selected only by the second-opinion lane as established.
  • cutoff at .github/workflows/release-edition-close.yaml:83: selected only by the second-opinion lane as established.
  • handoff at .github/workflows/release-edition-cut.yaml:251: selected only by the second-opinion lane as established.
  • plan hash at .agents/skills/nemoclaw-maintainer-cut-release-tag/SKILL.md:110: selected only by the second-opinion lane as established.
  • frozen candidate at .agents/skills/nemoclaw-maintainer-cut-release-tag/SKILL.md:24: selected only by the second-opinion lane as define.
  • release-tag environment at .github/workflows/release-edition-cut.yaml:193: selected only by the second-opinion lane as define.
  • edition at .agents/skills/nemoclaw-maintainer-cut-release-tag/SKILL.md:3: selected only by the second-opinion lane as define.

Second-opinion terminology and E2E selections are advisory. Live E2E does not run automatically for pull requests.

3 semantic terminology decisions

Terminology decisions are advisory. They affect the assessment only when a separate finding identifies concrete semantic impact.

  • define — edition at .agents/skills/nemoclaw-maintainer-cut-release-tag/SKILL.md:22: Keep `edition` and retain the Daily Contract definition at first use in maintainer release guidance.
  • replace — release doula at .agents/skills/nemoclaw-maintainer-cut-release-tag/SKILL.md:26: Replace `release doula` with `maintainer` unless the repository defines a distinct role and its authority.
  • justified — main-push at .agents/skills/nemoclaw-maintainer-e2e/SKILL.md:180: Keep `main-push` where the trigger distinction controls evidence selection or retries.

E2E guidance

Advisory only. A maintainer can dispatch the default E2E suite against this exact revision.

Recommended E2E: cloud-inference, cloud-onboard, managed-image-multiarch-startup, security-posture

Workflow run details

This automated review informs maintainers. Warnings and suggestions do not require a response. A maintainer decides whether to merge.

@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: 3

🧹 Nitpick comments (2)
.github/workflows/release-edition-close.yaml (1)

6-11: 🩺 Stability & Availability | 🔵 Trivial

Consider a manual recovery path for a failed freeze.

The workflow runs only on the schedule. If the 4:17 PM run fails or GitHub skips the cron, no release-edition-plan-YYYY-MM-DD artifact exists, and the 4 AM cut in .github/workflows/release-edition-cut.yaml cannot find a successful close artifact. A re-run of the failed scheduled run keeps the schedule event, so it still works, but a delayed re-run recomputes the cutoff from the new wall-clock time.

Two operational options keep the freeze recoverable. First, add alerting on a failed Release / Edition Close run so a maintainer reacts before 4 AM. Second, if a manual path is added later, keep it separate from the scheduled authorization boundary that scripts/release-cut-tag.sh enforces, because that script requires GITHUB_EVENT_NAME == schedule for scheduled cuts.

🤖 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/release-edition-close.yaml around lines 6 - 11, Make the
scheduled edition-close workflow recoverable by adding failure alerting for the
“Release / Edition Close” run, allowing a maintainer to react before the 4 AM
cut. Keep any future manual recovery path separate from the scheduled
authorization boundary enforced by scripts/release-cut-tag.sh, which requires
GITHUB_EVENT_NAME to remain schedule.
.agents/skills/nemoclaw-maintainer-e2e/SKILL.md (1)

161-164: 🎯 Functional Correctness | 🔵 Trivial | ⚡ Quick win

Make the inventory check fail closed on an empty run set.

jq -e 'all(...)' returns true for an empty array. If no main-push run matches the window, the snippet succeeds and the agent proceeds with no evidence, although line 164 states that more than one run is expected. Add a length assertion.

♻️ Proposed guard
 jq -e 'all(.[]; (.headSha // "") | test("^[0-9a-f]{40}$"))' <<<"$MATCHES" >/dev/null
+test "$(jq 'length' <<<"$MATCHES")" -ge 1
🤖 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 @.agents/skills/nemoclaw-maintainer-e2e/SKILL.md around lines 161 - 164,
Update the inventory validation around the jq all(...) check to require a
non-empty run set before validating every headSha. Make the command fail when
MATCHES is empty, while preserving the existing 40-character SHA validation and
downstream pending/exclusion behavior.
🤖 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 @.agents/skills/nemoclaw-maintainer-e2e/SKILL.md:
- Around line 149-162: Rename the plan-derived variable in the release-plan
snippet from CANDIDATE_SHA to FROZEN_CANDIDATE_SHA so it remains distinct from
the later origin/main assignment and matches the comparison at line 203. Update
the ancestry requirement near the validation step to reference
FROZEN_CANDIDATE_SHA as well.

In `@test/maintainer-skills-policy.test.ts`:
- Around line 269-270: Remove the duplicated assertion in the policy test and
restore the distinct cutoff-aware release-planning assertion intended by the
change. Keep one assertion for the existing contributor-update command and make
the second assertion target the exact cutoff-aware planning text expected in
policy.

In `@test/release-latest-tag.test.ts`:
- Around line 558-563: The existing lateCommit timestamp is before the edition
cutoff, so update it to 2026-08-06T16:30:00-07:00 and extend the
release-latest-tag tests around commitReleaseAt to cover a
--candidate-recorded-at value after the cutoff, asserting the error contains
“Candidate source time ... is after edition cutoff”.

---

Nitpick comments:
In @.agents/skills/nemoclaw-maintainer-e2e/SKILL.md:
- Around line 161-164: Update the inventory validation around the jq all(...)
check to require a non-empty run set before validating every headSha. Make the
command fail when MATCHES is empty, while preserving the existing 40-character
SHA validation and downstream pending/exclusion behavior.

In @.github/workflows/release-edition-close.yaml:
- Around line 6-11: Make the scheduled edition-close workflow recoverable by
adding failure alerting for the “Release / Edition Close” run, allowing a
maintainer to react before the 4 AM cut. Keep any future manual recovery path
separate from the scheduled authorization boundary enforced by
scripts/release-cut-tag.sh, which requires GITHUB_EVENT_NAME to remain schedule.
🪄 Autofix

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: 418c1370-610e-4fbb-8a75-7b9af96ad0af

📥 Commits

Reviewing files that changed from the base of the PR and between e323de1 and be16aba.

📒 Files selected for processing (30)
  • .agents/skills/nemoclaw-maintainer-cut-release-tag/SKILL.md
  • .agents/skills/nemoclaw-maintainer-cut-release-tag/scripts/release-e2e-evidence.mts
  • .agents/skills/nemoclaw-maintainer-day/PR-REVIEW-PRIORITIES.md
  • .agents/skills/nemoclaw-maintainer-e2e/SKILL.md
  • .agents/skills/nemoclaw-maintainer-evening/SKILL.md
  • .agents/skills/nemoclaw-maintainer-morning/SKILL.md
  • .agents/skills/nemoclaw-maintainer-policies/references/daily-flow.md
  • .agents/skills/nemoclaw-maintainer-policies/references/release-train.md
  • .agents/skills/nemoclaw-maintainer-release-notes/SKILL.md
  • .agents/skills/nemoclaw-skills-guide/SKILL.md
  • .github/actions/ci-build-typecheck/action.yaml
  • .github/workflows/post-merge-agent-review.yaml
  • .github/workflows/pr-review-advisor.yaml
  • .github/workflows/release-edition-close.yaml
  • .github/workflows/release-edition-cut.yaml
  • .github/workflows/release-latest-tag.yaml
  • ci/source-shape-test-budget.json
  • package.json
  • scripts/release-cut-tag.sh
  • scripts/release-notes-data.mts
  • scripts/release-plan.mts
  • scripts/release-wait-latest.sh
  • test/deterministic-smoke-workflow.test.ts
  • test/maintainer-e2e-skill.test.ts
  • test/maintainer-skills-policy.test.ts
  • test/package-contract/deterministic-smoke.test.ts
  • test/release-e2e-evidence.test.ts
  • test/release-edition-workflow.test.ts
  • test/release-latest-tag-workflow.test.ts
  • test/release-latest-tag.test.ts
💤 Files with no reviewable changes (2)
  • test/release-e2e-evidence.test.ts
  • .agents/skills/nemoclaw-maintainer-cut-release-tag/scripts/release-e2e-evidence.mts

Comment thread .agents/skills/nemoclaw-maintainer-e2e/SKILL.md
Comment thread test/maintainer-skills-policy.test.ts Outdated
Comment thread test/release-latest-tag.test.ts Outdated
@cjagwani

cjagwani commented Aug 6, 2026

Copy link
Copy Markdown
Collaborator Author

Addressed the current CodeRabbit findings in bdf8e813e: corrected frozen-candidate naming, made empty E2E inventories fail closed, removed the duplicate policy assertion, and added post-cutoff rejection coverage. The affected suites pass 45/45. The edition-close alerting idea is useful follow-up operational work, but is not required for this release-flow change; failed scheduled runs remain rerunnable.

@cjagwani

cjagwani commented Aug 6, 2026

Copy link
Copy Markdown
Collaborator Author

Optional CI follow-up: PR exact all-agent managed runtime activation failed outside this PR's diff because Docker replacement inspection changed AttachStderr, AttachStdout, and PortBindings. A failed-job-only rerun then exposed a separate attempt-scoped artifact issue (exact all-agent activation requires three contracts). All required checks are green; no release-flow code was changed for either unrelated failure. These belong in managed-runtime/workflow triage rather than this PR.

@cjagwani
cjagwani changed the base branch from main to ci/e2e-all-workflow-main August 6, 2026 14:59
@cjagwani

cjagwani commented Aug 6, 2026

Copy link
Copy Markdown
Collaborator Author

Superseded by #8483. The replacement keeps #8477 as the sole owner of all-E2E-on-main behavior and limits this follow-up to the nonblocking 4 PM tag plus removal of the pre-tag E2E release gate. It intentionally drops the merge freeze, 4 AM cut, frozen candidate, Advisor artifact workflow, and smoke/signing changes from this PR.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants