Skip to content

Release CI gate: evaluate last full-CI commit, not changelog/docs HEAD#4070

Merged
justin808 merged 1 commit into
mainfrom
jg-conductor/release-skip-ci-changelog
Jun 18, 2026
Merged

Release CI gate: evaluate last full-CI commit, not changelog/docs HEAD#4070
justin808 merged 1 commit into
mainfrom
jg-conductor/release-skip-ci-changelog

Conversation

@justin808

@justin808 justin808 commented Jun 17, 2026

Copy link
Copy Markdown
Member

Problem

When you run update-changelog right before a release, origin/main HEAD becomes a changelog-only commit. The rake release CI gate evaluated HEAD verbatim and blocked until every check on it finished — but on a changelog/docs commit CI path-skips the runtime suite and only queues detect-changes, CodeQL Analyze, and the markdown checks. So the release waited on checks that say nothing about whether the code is releasable.

You can't just hop to HEAD~1 either: the prior commit may itself be docs-only, where full CI also didn't run.

⏳ CI is still in progress on origin/main (commit a13cd9f4).
  ⏳ queued: detect-changes ...
  ⏳ queued: Analyze (javascript-typescript) ...
  ⏳ queued: markdown-link-check ...

Fix

The gate now walks back from HEAD over commits that script/ci-changes-detector classifies as non-runtime-only (changelog, docs, source-comment changes — exactly the commits on which CI skips the runtime suite) and evaluates the first commit that actually ran the full suite. That commit's CI is already complete, so the release proceeds immediately.

  • Reuses the canonical detector via its non_runtime_only output (written to a temp $GITHUB_OUTPUT), rather than re-deriving paths-ignore rules in Ruby.
  • Bounded by MAIN_CI_NONRUNTIME_WALK_LIMIT (25) and fail-safe: any commit not provably non-runtime-only (missing detector, git/detector failure, unparseable output) stops the walk, degrading to the original "evaluate HEAD" behavior.
  • Escape hatch: RELEASE_CI_EVALUATE_HEAD=true forces strict HEAD evaluation.
  • The pass/fail logic per evaluated commit is unchanged (stable = every check; prerelease = required checks only) — only which commit is selected changed.

Example log when HEAD is changelog-only:

ℹ️ origin/main HEAD a13cd9f4 is non-runtime-only (changelog/docs/comments); CI path-skips the full suite on such commits.
   Skipped 1 non-runtime commit(s): a13cd9f4
   Evaluating main CI on 3b677e91 — the most recent commit that ran the full suite.
   (Set RELEASE_CI_EVALUATE_HEAD=true to force strict HEAD evaluation.)

Tests

react_on_rails/spec/react_on_rails/release_rake_helpers_spec.rb — new coverage for main_ci_evaluation_sha (no-walk / single-hop / multi-hop / env bypass / detector-unavailable fail-safe / root-commit boundary / walk-limit cap), commit_non_runtime_only? (true/false/failure paths + the exact detector invocation), and git_parent_sha. Full file: 130 examples, 0 failures; RuboCop clean.

No CHANGELOG entry: this is release tooling (rakelib/), not a user-visible gem change.

🤖 Generated with Claude Code


Note

Medium Risk
Changes which commit gates publishing and depends on ci-changes-detector during release; fail-safe defaults limit risk, but a misclassified commit could skip or over-walk history.

Overview
Fixes false release blocks when origin/main HEAD is changelog/docs/comment-only and CI only runs lightweight checks there.

fetch_main_ci_checks no longer always uses origin/main verbatim. It calls main_ci_evaluation_sha, which walks parents (cap MAIN_CI_NONRUNTIME_WALK_LIMIT = 25) while commit_non_runtime_only? invokes script/ci-changes-detector with the same non_runtime_only output CI uses. The gate then queries GitHub check-runs for the first commit that isn't provably non-runtime-only. Pass/fail rules are unchanged—only which SHA is evaluated.

Fail-safe: missing detector, errors, or ambiguous output stop the walk and evaluate the current commit (same as old HEAD behavior). RELEASE_CI_EVALUATE_HEAD=true forces strict HEAD evaluation. Rake docs describe the policy and env var.

Specs cover walk-back, detector invocation, parent resolution, and stub main_ci_evaluation_sha in existing fetch_main_ci_checks examples.

Reviewed by Cursor Bugbot for commit b708ec4. Bugbot is set up for automated code reviews on this repo. Configure here.

Summary by CodeRabbit

  • Chores
    • Enhanced release CI gate with the new RELEASE_CI_EVALUATE_HEAD environment variable option for controlling how commits are evaluated. Improved logic to better handle runtime-bearing commits during release checks. Expanded test coverage for commit evaluation behaviors to ensure reliable release processes.

The `rake release` CI gate evaluated origin/main HEAD verbatim and blocked
until every check on that commit finished. Running `update-changelog` right
before a release makes HEAD a changelog-only commit, on which CI path-skips
the runtime suite but still queues detect-changes, CodeQL Analyze, and the
markdown checks — so the release waited on checks that say nothing about
whether the code is releasable.

The gate now walks back from HEAD over commits that
`script/ci-changes-detector` classifies as non-runtime-only (changelog, docs,
source-comment changes — exactly the commits where CI skips the suite) and
evaluates the first commit that actually ran the full suite. That commit's CI
is already complete, so the release proceeds without waiting. The walk reuses
the detector's own `non_runtime_only` output (via $GITHUB_OUTPUT) rather than
re-deriving paths-ignore rules, is bounded by MAIN_CI_NONRUNTIME_WALK_LIMIT,
and fail-safes to evaluating HEAD whenever a commit isn't provably
non-runtime-only (missing detector, git/detector failure, unparseable output).

Set RELEASE_CI_EVALUATE_HEAD=true to force strict HEAD evaluation. The
pass/fail logic per evaluated commit (stable = all checks, prerelease =
required checks) is unchanged — only commit selection changed.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@coderabbitai

coderabbitai Bot commented Jun 17, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: c9af6209-a056-4e67-a7b5-ef5d9ba55f30

📥 Commits

Reviewing files that changed from the base of the PR and between 02d9bcb and b708ec4.

📒 Files selected for processing (2)
  • rakelib/release.rake
  • react_on_rails/spec/react_on_rails/release_rake_helpers_spec.rb

Walkthrough

The release CI gate in rakelib/release.rake gains a bounded git-parent walkback: instead of always querying origin/main HEAD for CI checks, it now walks backwards through parent commits to find the most recent runtime-bearing commit, using script/ci-changes-detector for classification. A RELEASE_CI_EVALUATE_HEAD escape hatch bypasses the walkback. Five new helper methods and 189 lines of spec coverage are added.

Changes

Release CI gate SHA selection

Layer / File(s) Summary
Escape hatch constant and flag
rakelib/release.rake
Adds MAIN_CI_NONRUNTIME_WALK_LIMIT constant and ci_evaluate_head_only? method gated on RELEASE_CI_EVALUATE_HEAD.
Commit classification and parent resolution
rakelib/release.rake
Adds commit_non_runtime_only? (executes script/ci-changes-detector, parses non_runtime_only from a temp GITHUB_OUTPUT file) and git_parent_sha (resolves first-parent SHA, returns nil at root).
Walkback loop and logging
rakelib/release.rake
Adds main_ci_evaluation_sha (walks git parents up to the limit, skipping non-runtime-only commits) and log_main_ci_walkback (prints skipped SHAs and the evaluated SHA).
fetch_main_ci_checks wired to evaluated SHA
rakelib/release.rake
Changes fetch_main_ci_checks to use the result of main_ci_evaluation_sha rather than the raw origin/main HEAD SHA for the gh api check-runs query.
Help text for new semantics
rakelib/release.rake
Updates rake release description and env-var list to reflect runtime-bearing commit evaluation and RELEASE_CI_EVALUATE_HEAD=true.
Specs for walkback, detector, and parent resolution
react_on_rails/spec/react_on_rails/release_rake_helpers_spec.rb
Stubs main_ci_evaluation_sha in existing fetch_main_ci_checks tests; adds spec groups covering all branches of main_ci_evaluation_sha, commit_non_runtime_only?, and git_parent_sha.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~25 minutes

Possibly related PRs

  • shakacode/react_on_rails#3407: Modifies the same fetch_main_ci_checks path in rakelib/release.rake that this PR changes to introduce SHA selection.
  • shakacode/react_on_rails#3763: Also modifies fetch_main_ci_checks in rakelib/release.rake, changing how check runs and required checks are fetched and matched.

Suggested labels

enhancement, full-ci

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title accurately describes the main change: the release CI gate will now evaluate the last commit that ran the full CI suite, not the HEAD commit which may only have changelog/docs changes.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
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.

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

✨ 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 jg-conductor/release-skip-ci-changelog

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

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

@justin808

Copy link
Copy Markdown
Member Author

+ci-run-hosted

@github-actions github-actions Bot added the ready-for-hosted-ci Run optimized hosted GitHub CI for this PR label Jun 17, 2026
@github-actions

Copy link
Copy Markdown
Contributor

Hosted CI Requested

Triggered 9 workflow(s) for b708ec4e7215.
Mode: optimized hosted CI (path-selected by script/ci-changes-detector).
Added ready-for-hosted-ci, so future commits will keep running optimized hosted CI until +ci-stop-hosted is used.

View progress in the Actions tab.

@greptile-apps

greptile-apps Bot commented Jun 17, 2026

Copy link
Copy Markdown

Greptile Summary

This PR fixes a release CI gate that blocked on changelog/docs-only commits where the full test suite was skipped by path rules. Rather than evaluating origin/main HEAD verbatim, the gate now walks back over consecutive non_runtime_only commits to find the most recent one that actually ran the full suite.

  • main_ci_evaluation_sha is introduced to walk up to MAIN_CI_NONRUNTIME_WALK_LIMIT (25) commits back, delegating path classification to the existing script/ci-changes-detector via a temp $GITHUB_OUTPUT file, with multiple fail-safe exit conditions.
  • The RELEASE_CI_EVALUATE_HEAD=true escape hatch restores the original strict HEAD evaluation, and 130 new RSpec examples cover the no-walk, single-hop, multi-hop, env-bypass, detector-unavailable, root-commit, and walk-limit paths.

Confidence Score: 4/5

Safe to merge. The walk-back logic has solid fail-safes and degrades cleanly to HEAD evaluation in every error path.

The new helpers are well-bounded (25-commit limit, escape hatch, root-commit guard, detector-unavailable guard) and backed by thorough spec coverage. Two minor log/error-reporting gaps: the walk-limit termination path emits a message that incorrectly claims full-suite confirmation, and unexpected exceptions in the detector invocation are swallowed without any diagnostic output.

rakelib/release.rake — specifically the log message in log_main_ci_walkback and the bare rescue in commit_non_runtime_only?

Important Files Changed

Filename Overview
rakelib/release.rake Adds three new helpers (main_ci_evaluation_sha, commit_non_runtime_only?, git_parent_sha) and wires them into fetch_main_ci_checks; logic is sound with good fail-safes, but the walkback log message can be inaccurate when the walk terminates at the limit boundary, and silent exception suppression in commit_non_runtime_only? may hide surprising failures.
react_on_rails/spec/react_on_rails/release_rake_helpers_spec.rb Adds thorough coverage for main_ci_evaluation_sha, commit_non_runtime_only?, and git_parent_sha including boundary, failure, and escape-hatch paths; the main_ci_evaluation_sha stub in the existing fetch_main_ci_checks describe block correctly isolates the two concerns.

Flowchart

%%{init: {'theme': 'neutral'}}%%
flowchart TD
    A[fetch_main_ci_checks called] --> B[git fetch origin main]
    B --> C[git rev-parse origin/main]
    C --> D{RELEASE_CI_EVALUATE_HEAD=true?}
    D -- yes --> H[evaluate head_sha]
    D -- no --> E[main_ci_evaluation_sha]
    E --> F{commit_non_runtime_only? current}
    F -- false or error --> H
    F -- true --> G[git_parent_sha current]
    G -- nil --> H
    G -- parent --> I[skipped << current, current = parent]
    I --> J{walk count >= 25?}
    J -- no --> F
    J -- yes --> K[evaluate current, walk limit reached]
    H --> L[query GitHub Checks API]
    K --> L
Loading
%%{init: {'theme': 'base', 'themeVariables': {"darkMode": true, "background": "#0d1117", "primaryColor": "#21262d", "primaryTextColor": "#e6edf3", "primaryBorderColor": "#8b949e", "lineColor": "#8b949e", "textColor": "#e6edf3", "edgeLabelBackground": "#161b22", "actorBkg": "#21262d", "actorBorder": "#8b949e", "actorTextColor": "#e6edf3", "actorLineColor": "#8b949e", "signalColor": "#8b949e", "signalTextColor": "#e6edf3", "noteBkgColor": "#373320", "noteBorderColor": "#d4a72c", "noteTextColor": "#f0e6c0", "labelBoxBkgColor": "#21262d", "labelBoxBorderColor": "#8b949e", "labelTextColor": "#e6edf3", "loopTextColor": "#e6edf3", "activationBkgColor": "#30363d", "activationBorderColor": "#8b949e"}}}%%
flowchart TD
    A[fetch_main_ci_checks called] --> B[git fetch origin main]
    B --> C[git rev-parse origin/main]
    C --> D{RELEASE_CI_EVALUATE_HEAD=true?}
    D -- yes --> H[evaluate head_sha]
    D -- no --> E[main_ci_evaluation_sha]
    E --> F{commit_non_runtime_only? current}
    F -- false or error --> H
    F -- true --> G[git_parent_sha current]
    G -- nil --> H
    G -- parent --> I[skipped << current, current = parent]
    I --> J{walk count >= 25?}
    J -- no --> F
    J -- yes --> K[evaluate current, walk limit reached]
    H --> L[query GitHub Checks API]
    K --> L
Loading

Reviews (1): Last reviewed commit: "Release CI gate: evaluate last full-CI c..." | Re-trigger Greptile

Comment thread rakelib/release.rake
puts "ℹ️ origin/main HEAD #{head_sha[0, 8]} is non-runtime-only " \
"(changelog/docs/comments); CI path-skips the full suite on such commits."
puts " Skipped #{skipped.length} non-runtime commit(s): #{skipped.map { |s| s[0, 8] }.join(', ')}"
puts " Evaluating main CI on #{evaluated_sha[0, 8]} — the most recent commit that ran the full suite."

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P2 The log message claims the evaluated SHA is "the most recent commit that ran the full suite," but this is only guaranteed when the walk stopped because commit_non_runtime_only? returned false. When the loop terminates due to MAIN_CI_NONRUNTIME_WALK_LIMIT, the final current was never passed to commit_non_runtime_only? — it could itself be a non-runtime-only commit. The message would then misrepresent what CI ran on that commit.

Suggested change
puts " Evaluating main CI on #{evaluated_sha[0, 8]} — the most recent commit that ran the full suite."
walk_limit_reached = skipped.length >= MAIN_CI_NONRUNTIME_WALK_LIMIT
suffix = walk_limit_reached ? " (walk limit reached; full-suite status unconfirmed)." : " — the most recent commit that ran the full suite."
puts " Evaluating main CI on #{evaluated_sha[0, 8]}#{suffix}"

Comment thread rakelib/release.rake
Comment on lines +713 to +715
rescue StandardError
false
end

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P2 The bare rescue StandardError at the end of commit_non_runtime_only? silently discards every unexpected failure (temp-dir creation errors, unexpected IO errors, etc.) and returns false. While the fail-safe direction is correct, a suppressed exception can make real operational problems (e.g. a permissions issue on the detector script, a broken git install) invisible during a release. Logging the exception message preserves the safe fallback while providing a diagnostic signal.

Suggested change
rescue StandardError
false
end
rescue StandardError => e
warn "⚠️ commit_non_runtime_only? raised #{e.class}: #{e.message}; treating commit as runtime-bearing."
false
end

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: b708ec4e72

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread rakelib/release.rake
Comment on lines +703 to +705
_stdout, status = Open3.capture2e(
{ "GITHUB_OUTPUT" => output_file }, detector, "#{sha}^", sha, chdir: monorepo_root
)

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P2 Badge Match CI's push diff before skipping HEAD

When origin/main is updated by a push containing multiple commits, the workflows classify changes from github.event.before to the pushed HEAD (for example .github/workflows/gem-tests.yml:74-75 and .github/workflows/lint-js-and-ruby.yml:67-68), not from HEAD^ to HEAD. If that push contains a runtime commit followed by a changelog/docs-only commit, full CI actually runs on HEAD, but this per-commit detector invocation labels only the last commit as non_runtime_only and walks back to the parent. The release gate can then ignore the real HEAD check run (or block on a parent that never had a main-push run), so the selected commit no longer matches the commit whose CI GitHub just evaluated.

Useful? React with 👍 / 👎.

@claude

claude Bot commented Jun 17, 2026

Copy link
Copy Markdown
Contributor

Code Review — Release CI gate: evaluate last full-CI commit, not changelog/docs HEAD

Overview

This is a clean, well-motivated fix for a real release workflow friction: after update-changelog lands on main, the pre-release CI gate was waiting on lightweight checks (markdown linting, detect-changes, CodeQL) that tell you nothing about gem health. The gate now walks back over provably non-runtime-only commits and evaluates the first one that actually ran the full suite.

The design choices are sound:

  • Fail-safe default — any ambiguity (missing detector, git failure, unparseable output) stops the walk and evaluates the current commit, so the old behaviour is the degradation path, not a regression
  • Bounded walkMAIN_CI_NONRUNTIME_WALK_LIMIT = 25 prevents unbounded git work
  • Reuses canonical detector — no duplicated paths-ignore logic; the release gate and CI agree on what "non-runtime-only" means
  • Escape hatchRELEASE_CI_EVALUATE_HEAD=true for operators who want strict HEAD evaluation

Test coverage is thorough: no-walk, single-hop, multi-hop, env bypass, detector-unavailable fail-safe, root-commit boundary, and walk-limit cap are all exercised.


Issues

1. Log message overclaims (minor but misleading)

log_main_ci_walkback prints:

"Evaluating main CI on <sha> — the most recent commit that ran the full suite."

The evaluated commit is actually the first one that isn't provably non-runtime-only — which is the correct and safe stopping condition, but not the same as "ran the full suite." If the commit sits at the walk-limit boundary, or its CI was skipped for an unrelated reason, the message is inaccurate. Suggest softening to something like "the most recent commit whose CI was not path-skipped" or "the most recent commit that likely ran the full suite."

2. Shallow clone degrades at the wrong boundary (niche, but worth noting)

In commit_non_runtime_only?, the detector is invoked with "#{sha}^" as BASE_REF. In a shallow clone where sha^ isn't fetched, git_diff_base_resolve will exit non-zero (the script has set -euo pipefail) and the method returns false — so the walk stops immediately at HEAD, preserving the old gate behaviour.

That's the safe direction, but it means a shallow clone won't benefit from the walk-back at all. This is probably acceptable for release workflows (which typically fetch full history), but worth a comment near the "#{sha}^" call so a future reader doesn't spend time debugging what looks like a detector failure.

3. Missing test for the rescue StandardError path

commit_non_runtime_only? has a top-level rescue StandardError; false that handles exceptions from within the Dir.mktmpdir block (e.g., Open3 raising Errno::ENOENT if the system is very constrained). This path has no direct test. A simple allow(Open3).to receive(:capture2e).and_raise(RuntimeError) inside with_detector would close the gap and document the intended behaviour.

4. /o flag on regex literal (cosmetic)

In the walk-limit spec:

.to output(/Skipped #{MAIN_CI_NONRUNTIME_WALK_LIMIT} non-runtime/o).to_stdout

The /o modifier ("freeze interpolation after first evaluation") is a no-op in modern Ruby for regex literals with constant interpolation — the constant is already evaluated at parse time. It doesn't hurt anything, but it's misleading to readers unfamiliar with the flag.


Summary

The approach is solid and the fail-safe design is the right call for a release gate. The four points above are all minor; the log message wording and the missing rescue test are the most actionable. Happy to approve once those are considered.

Comment thread rakelib/release.rake
puts "ℹ️ origin/main HEAD #{head_sha[0, 8]} is non-runtime-only " \
"(changelog/docs/comments); CI path-skips the full suite on such commits."
puts " Skipped #{skipped.length} non-runtime commit(s): #{skipped.map { |s| s[0, 8] }.join(', ')}"
puts " Evaluating main CI on #{evaluated_sha[0, 8]} — the most recent commit that ran the full suite."

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.

The phrase "the most recent commit that ran the full suite" overclaims what we actually know. main_ci_evaluation_sha returns the first commit that isn't provably non-runtime-only — which is the correct, safe stopping point — but that commit's CI could still have been skipped for an unrelated reason, or we might be at the walk-limit boundary without having verified it.

Suggest softening the wording:

Suggested change
puts " Evaluating main CI on #{evaluated_sha[0, 8]} — the most recent commit that ran the full suite."
puts " Evaluating main CI on #{evaluated_sha[0, 8]} — the most recent commit not classified as changelog/docs-only."

Comment thread rakelib/release.rake
# instead of re-deriving paths-ignore rules here. `<sha>^ <sha>` diffs just
# that commit; a non-HEAD current ref means no uncommitted folding.
_stdout, status = Open3.capture2e(
{ "GITHUB_OUTPUT" => output_file }, detector, "#{sha}^", sha, chdir: monorepo_root

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.

In a shallow clone, sha^ may not be fetched, causing git_diff_base_resolve to exit non-zero (the detector uses set -euo pipefail). This returns false — the safe direction — but it silently prevents any walk-back. Worth a brief comment so the failure mode is obvious to a future reader:

Suggested change
{ "GITHUB_OUTPUT" => output_file }, detector, "#{sha}^", sha, chdir: monorepo_root
# NOTE: `sha^` requires the parent commit to be present in the local clone.
# In a shallow clone where the parent isn't fetched, the detector exits non-zero
# and this method returns false (fail-safe: treat as runtime-bearing, stop walk).
_stdout, status = Open3.capture2e(
{ "GITHUB_OUTPUT" => output_file }, detector, "#{sha}^", sha, chdir: monorepo_root
)


result = nil
expect { result = main_ci_evaluation_sha(monorepo_root:, head_sha: "c") }
.to output(/Skipped #{MAIN_CI_NONRUNTIME_WALK_LIMIT} non-runtime/o).to_stdout

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.

The /o flag ("interpolate once") is a no-op in modern Ruby when the interpolated value is a constant — the regex is already compiled once at parse time. This is harmless but can confuse readers who expect it to mean something.

Suggested change
.to output(/Skipped #{MAIN_CI_NONRUNTIME_WALK_LIMIT} non-runtime/o).to_stdout
.to output(/Skipped #{MAIN_CI_NONRUNTIME_WALK_LIMIT} non-runtime/).to_stdout

@justin808 justin808 merged commit 9b94c38 into main Jun 18, 2026
83 checks passed
@justin808 justin808 deleted the jg-conductor/release-skip-ci-changelog branch June 18, 2026 03:28
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

ready-for-hosted-ci Run optimized hosted GitHub CI for this PR

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant