Repository navigation
fix(OMN-15127): nightly-promote scheduled runs default to REAL path, fail-loud on block - #4846
Conversation
…fail-loud on block github.event.inputs is empty on schedule triggers, so DRY_RUN unconditionally resolved to true on every scheduled run (21+ green runs, zero promotion PRs ever). DRY_RUN now honors an explicit workflow_dispatch input only; scheduled runs default to the real promotion path via a repo-variable override (NIGHTLY_PROMOTE_FORCE_DRY_RUN) for an explicit escape hatch. REPOS_INPUT default no longer omniweb-only; covers the Tier-2 fleet from the OMN-15067 census, excluding Tier-1 (omnibase_core/omniclaude/onex_change_control) per OMN-15067 scope item 4 since the cross-repo verification step is still a not_run_in_mvp stub. The real-path blocked-gate branch now exits 1 instead of 0 so a run that cannot promote goes red instead of reporting a silent no-op success.
|
Warning Review limit reachedYou’ve reached a temporary PR review limit under our Fair Usage Limits Policy. Next review available in: 4 minutes Enable usage-based reviews in Billing to review now. Otherwise, wait until the next included review is available. How can I continue?After more reviews become available, a review can be triggered using the To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based reviews. How do review limits work?CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan review availability. For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, additional reviews become available more gradually as earlier reviews age out of the rolling window. Please refer docs for additional details. Review details⚙️ Run configurationConfiguration used: defaults Review profile: CHILL Plan: Pro Run ID: 📒 Files selected for processing (5)
✨ Finishing Touches🧪 Generate unit tests (beta)
Comment |
7375221 to
9fc1bd4
Compare
OMN-15127: nightly-promote.yml is a structural no-op — fix DRY_RUN + repo-scope + fail-loud
Child of epic OMN-15067 (dev→main promotion systemically broken fleet-wide). Fixes scope item 1 named in OMN-15067.
Root cause (quoted lines, before this PR)
github.event.inputsis empty onscheduletriggers (it only exists onworkflow_dispatch). So on every scheduled run,github.event.inputs.dry_runevaluates to empty string, the||fires, andDRY_RUNresolves to the literal'true'— unconditionally, by construction, regardless of any repo variable, branch protection, or operator intent. Separately,REPOS_INPUTdefaulted toomniwebonly, so even a real (non-dry-run, workflow_dispatch-triggered) run would only ever promote one repo of the 12-repo fleet.Live evidence gathered this pass
gh run list --workflow=nightly-promote.yml --limit 25(2026-07-01 → 2026-07-25): 25 scheduled runs, 23success, 1cancelled(07-07), 1failure(07-25, most recent) — i.e. the "21+ green" claim in OMN-15067/OMN-15127 is confirmed and, if anything, undercounted.gh search prs "Evidence-Ticket: OMN-11732"across the OmniNode-ai org returns exactly 2 PRs, both the original workflow-authoring PRs from 2026-05-23 (feat(OMN-11732): add nightly promotion workflow #1405, feat(OMN-11732): nightly promotion workflow MVP #1435 on onex_change_control itself) — zero promotion PRs matching the workflow's own generated title pattern (promotion($repo): promote dev to main for ...) or trailer exist anywhere. 61+ days of scheduled "success" runs, zero output.Fix
workflow_dispatchinput (github.event_name == 'workflow_dispatch' && (github.event.inputs.dry_run || 'true')). All other trigger types (i.e.schedule) fall through tovars.NIGHTLY_PROMOTE_FORCE_DRY_RUN || 'false'— scheduled runs now default to the real promotion path. An operator retains an explicit, auditable kill switch (the repo variable) without needing another workflow-file edit.omnimarket,omnibase_infra,omnidash,omninode_infra,omniintelligence,omnimemory,omniweb,omnibase_spi,omnibase_compat) instead ofomniweb-only — satisfying AC Add Claude Code GitHub Workflow #2. Tier-1 repos (omnibase_core,omniclaude,onex_change_control) are excluded from the default per OMN-15067 scope item 4: the "Capture cross-repo verification placeholder" step in this same workflow is still a hardcodednot_run_in_mvpstub, not a real cross-repo check, so Tier-1 fleet-wide-CI-provider repos stay on manual promotion until that lands (tracked separately under OMN-15067 scope item 2). Override viaworkflow_dispatchreposinput or theNIGHTLY_PROMOTE_REPOSrepo variable.echo "Promotion gates are blocked..."; exit 0whenpromotable != true— a genuinely green run that silently created nothing. That branch now emits::error::andexit 1, so a real run that cannot promote goes red, not green-no-op. This is the entire point of the defect class this ticket is closing: a control that reports success while doing nothing.Acceptance criteria mapping (OMN-15127)
0 6 * * *run after merge is the proof. If Tier-2 repos are already at dev==main parity that night, the run must show a legitimateno changes to promoteresult on the real path (not a blocked-gate no-op) — the fail-loud change in point 3 above guarantees a blocked gate cannot masquerade as that outcome.Verification performed
python3 -c "import yaml; yaml.safe_load(...)"— YAML parses.actionlint .github/workflows/nightly-promote.yml— clean (no findings).uv run pre-commit run --files .github/workflows/nightly-promote.yml(on .200) — all applicable hooks Passed..200(stickybeatz-studio) per repo convention.Follow-up (not this PR)
0 6 * * *) is the live proof this ticket's AC Add Claude Code GitHub Workflow #3 requires — a real promotion PR opened, or an honest failed/red run citing the blocking gate. Report that run id + outcome back to OMN-15127 once it fires.not_run_in_mvpcross-repo stub with a real check) remains open and is what continues to gate Tier-1 repos out of the automated default here.Evidence-Ticket: OMN-15127