Skip to content

ci: vendor governance-enforce — this repo was never in the A_BLOCK ruleset - #62

Open
yakimoto wants to merge 3 commits into
mainfrom
ci/vendor-governance-enforce
Open

ci: vendor governance-enforce — this repo was never in the A_BLOCK ruleset#62
yakimoto wants to merge 3 commits into
mainfrom
ci/vendor-governance-enforce

Conversation

@yakimoto

@yakimoto yakimoto commented Aug 5, 2026

Copy link
Copy Markdown
Contributor

Adds the governance-enforce A_BLOCK gate (secrets / hardcoded-paths, diff-scoped) to this repo. Part of claude-workstation#1624 E4 T4.9a, following the wave-av/cli#20 pilot.

Why this repo had no secrets scan

The org ruleset governance-a-block-enforce (17901847) requires an enforce check across the fleet. Its scope is an explicit include list of 112 hand-maintained repository names — and every one of them matches wave-*.

The 16 public repos absent from that list are exactly the 16 not named wave-*: .github, adk, api-spec, cli, companion-module-wave, create-wave-app, crest-console, dispatch-edge, examples, mcp-server, obs-wave-plugin, sdk, sdk-python, sdks, vmix-wave-integration, workflow-sdk.

Read the intersection: the repos that publish our npm packages are precisely the repos running with no A_BLOCK secrets scan. Nobody excluded them. A naming convention silently became a security boundary, and it drew the line in the worst possible place.

Why the workflow lands before the ruleset entry

Adding a repo to a required_status_checks ruleset before it emits that check is a permanent deadlock — a required check that never reports can never go green, and every PR on the repo becomes unmergeable. So the order is: vendor the workflow, observe it green, then extend the list. Doing it the intuitive way round would have bricked all sixteen.

This PR is also its own liveness drill. The workflow triggers on pull_request, so it runs on the PR that adds it. If enforce reports green here, the vendored shape works in this repo. If it does not, nothing was required and nothing is blocked — which is the point of this ordering.

Proven before fan-out, not assumed

@wave-av/governance is an internal-visibility package owned by claude-workstation, so whether a public repo's GITHUB_TOKEN can read it was the one real assumption. Rather than fan out on the inference, it was piloted on a single repo first:

wave-av/cli#20 — workflow run 31011943790, conclusion success.

That is the receipt this PR rides on. The shape is copied verbatim from wave-av/wave-moq-edge (public, 12/12 green), which matters because auto-approve.yml fails silently on every public repo — it calls a reusable workflow in the private wave-foundation, and a public repo cannot do that (parse-time failure, zero jobs, no annotation). This workflow calls nothing cross-repo, so that trap does not apply.

Security properties, unchanged from the source:

  • actions SHA-pinned (actions/checkout@df4cb1c, actions/setup-node@48b55a0)
  • persist-credentials: false on checkout
  • least privilege: contents: read + packages: read
  • isolated install into RUNNER_TEMP, --no-save, so nothing touches this repo's dependency tree
  • the .npmrc is written with a literal ${NODE_AUTH_TOKEN} (single-quoted printf) which npm expands at run time — no secret value is ever written to disk or a log
  • both ${{ }} inputs (base.sha, event.before) are routed through env: and read as "$VAR", never interpolated into the script body

Diff-scoped by design: it blocks new violations without failing on legacy debt.

Refs wave-av/claude-workstation#1624.


Open in Devin Review

Note

Low Risk
CI-only addition with read-only repo permissions and an isolated npm install; no application or release artifact changes.

Overview
Adds governance-enforce.yml, bringing this npm-publishing repo under the same A_BLOCK gate (secrets-in-git, Doppler expectations, hardcoded paths) that org rulesets already require on wave-* repos. Scans are diff-scoped so new violations fail CI without blocking on legacy debt.

The job installs @wave-av/governance@0.4.6 into RUNNER_TEMP (not the repo tree), runs enforce.mjs --changed, and emits the enforce status check intended for governance-a-block-enforce once this workflow is green here first.

Hardening baked into the vendored copy: registry token only on the install step, --ignore-scripts, exact package pin, push concurrency that does not cancel overlapping push runs (so commits are not skipped), and fail-closed base resolution (empty tree full scan when no diff base exists, instead of a silent zero-file pass).

Reviewed by Cursor Bugbot for commit 73a72cf. Configure here.

Review in cubic

Note

Add governance enforcement workflow to scan diffs on PRs and pushes to main

Adds governance-enforce.yml, which runs @wave-av/governance@0.4.6 on pull requests, merge groups, and pushes to main/master. The enforcer scans only changed files using a computed diff base; if no valid base is found, it falls back to the empty tree and scans the full repository. Push and merge group runs are not cancelable to ensure no committed ranges are skipped.

Macroscope summarized 2c40f4a.

@yakimoto yakimoto added the rr:skip-cubic RF.P1 reviewer routing (#1039) label Aug 5, 2026
@coderabbitai

coderabbitai Bot commented Aug 5, 2026

Copy link
Copy Markdown

Warning

Review limit reached

You’ve reached a temporary PR review limit under our Fair Usage Limits Policy.

Your recent review volume is higher than typical usage, so adaptive limits are currently applied.

Next review available in: 44 minutes

Your organization has reached its usage spending cap. Adjust your spending cap in the billing tab.

How can I continue?

After more reviews become available, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

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 configuration

Configuration used: Organization UI

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: 98d160fb-82eb-4714-85a8-58b65f9e4235

📥 Commits

Reviewing files that changed from the base of the PR and between f905017 and 2c40f4a.

📒 Files selected for processing (1)
  • .github/workflows/governance-enforce.yml

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

@cursor

cursor Bot commented Aug 5, 2026

Copy link
Copy Markdown

Bugbot couldn't run - usage limit reached

Bugbot is counted against Cursor usage for this user or team, and this run hit a usage or spend limit.

A user or team admin can review and increase usage limits in the Cursor dashboard.

(requestId: serverGenReqId_6fda7d5e-4720-463f-b48e-8be42606bb1f)

macroscopeapp[bot]
macroscopeapp Bot previously approved these changes Aug 5, 2026
@macroscopeapp

macroscopeapp Bot commented Aug 5, 2026

Copy link
Copy Markdown

Approvability

Verdict: Needs human review

Unable to check for correctness in 2c40f4a. An unresolved critical review comment identifies a gap in the force-push fallback logic where multi-commit pushes may only scan the final commit, allowing the security gate to pass without examining all changes. This contradicts the stated fail-closed invariant and warrants review before merge.

You can customize Macroscope's approvability policy. Learn more.

@qodo-code-review

Copy link
Copy Markdown

PR Summary by Qodo

CI: vendor governance-enforce A_BLOCK diff gate for secrets/hardcoded paths

✨ Enhancement ⚙️ Configuration changes 🕐 20-40 Minutes

Grey Divider

AI Description

• Add a diff-scoped A_BLOCK enforcement workflow for secrets and hardcoded paths.
• Install and run @wave-av/governance from GitHub Packages with least-privilege permissions.
• Ensure the repo emits the required "enforce" check before ruleset enrollment to avoid deadlock.
Diagram

graph TD
  A["PR / push event"] --> B["Workflow: governance-enforce"] --> C["Job: enforce"] --> D["Checkout (full history)"] --> E["Setup Node 22"] --> F["Install @wave-av/governance"] --> G["Run enforce.mjs on changed diff"]
  F --> H["GitHub Packages (npm)"]
Loading
High-Level Assessment

The following are alternative approaches to this PR:

1. Publish a reusable workflow/action in a public shared repo
  • ➕ Avoids copying workflow logic into every repo
  • ➕ Centralizes updates (pin bumps, policy tweaks) to one place
  • ➕ Reduces drift across repos during fleet rollout
  • ➖ Requires making the reusable workflow/action publicly accessible (or otherwise readable by public repos)
  • ➖ Still needs careful rollout sequencing to avoid ruleset deadlocks
2. Rely on GitHub Advanced Security secret scanning + push protection
  • ➕ Native platform support; minimal custom scripting
  • ➕ Standard alerting UX and enterprise governance
  • ➖ May not cover org-specific rules like hardcoded-paths or Doppler conventions
  • ➖ Availability depends on licensing/enablement and may not be diff-scoped the same way
3. Build-time policy enforcement inside the repo toolchain (pre-commit / CI scripts)
  • ➕ Can run locally and in CI; consistent developer feedback loop
  • ➕ No dependency on private package registry access
  • ➖ Harder to standardize and enforce across a fleet than org-driven governance
  • ➖ More maintenance burden per repo unless centrally packaged anyway

Recommendation: Proceed with the vendored workflow for this repo: it matches the stated rollout constraint (emit the required check before adding to the ruleset) and avoids the public→private reusable-workflow trap. Longer-term, consider packaging this as a public reusable workflow/action to eliminate duplication while keeping the same SHA-pinning and least-privilege posture.

Files changed (1) +59 / -0

Other (1) +59 / -0
governance-enforce.ymlAdd governance-enforce workflow to run A_BLOCK checks on PR/push diffs +59/-0

Add governance-enforce workflow to run A_BLOCK checks on PR/push diffs

• Introduces a new GitHub Actions workflow that runs on pull requests and pushes to main/master. It installs @wave-av/governance from GitHub Packages in an isolated temp directory and runs the diff-scoped enforcer against the PR base SHA or push before SHA (with safe fallbacks) to produce the required "enforce" status check.

.github/workflows/governance-enforce.yml

@devin-ai-integration devin-ai-integration 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.

Devin Review found 1 potential issue.

Open in Devin Review

Comment on lines +44 to +48
- name: fetch governance enforcer (isolated install)
run: |
mkdir -p "$RUNNER_TEMP/gov" && cd "$RUNNER_TEMP/gov"
printf '@wave-av:registry=https://npm.pkg.github.com\n//npm.pkg.github.com/:_authToken=${NODE_AUTH_TOKEN}\n' > .npmrc
npm install @wave-av/governance@^0.4.4 --no-save --no-audit --no-fund

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🔍 Fork PRs may not be able to install the private @wave-av/governance package

The isolated install authenticates to npm.pkg.github.com with secrets.GITHUB_TOKEN and packages: read. For pull requests from forks, the workflow token is read-only and scoped to the fork's repository context; if @wave-av/governance is a private/internal GitHub Packages artifact, npm install will 401/403 and this job will fail for every external contributor PR. Worth confirming before adding the check to the governance-a-block-enforce ruleset, since a permanently red required check on fork PRs blocks outside contributions to this public repo.

Open in Devin Review

Was this helpful? React with 👍 or 👎 to provide feedback.

@qodo-code-review

qodo-code-review Bot commented Aug 5, 2026

Copy link
Copy Markdown

Code Review by Qodo

🐞 Bugs (0) 📘 Rule violations (0) 📜 Skill insights (0)

Grey Divider


Remediation recommended

1. Floating gate dependency ✓ Resolved 🐞 Bug ⛨ Security
Description
The workflow installs @wave-av/governance using a caret range (^0.4.4), so the executable code
implementing the required A_BLOCK gate can change between runs without any PR in this repo, making
enforcement behavior non-deterministic. This can introduce unexpected new CI failures or enforcement
changes outside the repo’s normal review/update process.
Code

.github/workflows/governance-enforce.yml[R46-49]

+          mkdir -p "$RUNNER_TEMP/gov" && cd "$RUNNER_TEMP/gov"
+          printf '@wave-av:registry=https://npm.pkg.github.com\n//npm.pkg.github.com/:_authToken=${NODE_AUTH_TOKEN}\n' > .npmrc
+          npm install @wave-av/governance@^0.4.4 --no-save --no-audit --no-fund
+      - name: A_BLOCK enforce (secrets + hardcoded paths on the diff)
Relevance

●●● Strong

Team has accepted workflow determinism hardening (SHA pinning); pinning npm package version
similarly improves determinism.

PR-#21

ⓘ Recommendations generated based on similar findings in past PRs

Evidence
governance-enforce installs and executes the enforcer from GitHub Packages using a caret range,
allowing the executed gate implementation to change over time. The repo’s existing
public-repo-guard workflow explicitly calls out determinism and avoiding out-of-band reprogramming
as a security property, which this runtime-floating install undermines.

.github/workflows/governance-enforce.yml[44-59]
.github/workflows/public-repo-guard.yml[9-14]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

## Issue description
The workflow installs the governance enforcer with a semver range (`@wave-av/governance@^0.4.4`). This means the enforcement implementation can change without a PR in this repo, making a required security check non-deterministic.

## Issue Context
This repo already documents a preference for deterministic, reviewable security gates (vendored scanner logic and pinned tooling) to avoid out-of-band reprogramming.

## Fix Focus Areas
- .github/workflows/governance-enforce.yml[44-49]

## Suggested fix
- Change `npm install @wave-av/governance@^0.4.4` to an exact version (e.g. `@wave-av/governance@0.4.4`).
- If you still want auto-updates, implement an explicit, reviewed bump mechanism (e.g., scheduled PRs) rather than allowing the required check to float at runtime.

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools



Informational

2. Token scoped too broadly ✓ Resolved 🐞 Bug ⛨ Security
Description
NODE_AUTH_TOKEN is set at the job level, so the GitHub Packages token is inherited by all
subsequent steps, not just the npm install step that needs it. This unnecessarily increases the
credential exposure surface for the enforcement process and any future added steps.
Code

.github/workflows/governance-enforce.yml[R33-36]

+    runs-on: ubuntu-latest
+    env:
+      NODE_AUTH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+    steps:
Relevance

●●● Strong

Workflow hardening changes are typically accepted; scoping credentials per-step aligns with
least-privilege direction.

PR-#21

ⓘ Recommendations generated based on similar findings in past PRs

Evidence
The token is currently configured in jobs.enforce.env, making it available to every step, while
its actual use is limited to the install step that writes .npmrc and runs npm install.

.github/workflows/governance-enforce.yml[33-48]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

## Issue description
`NODE_AUTH_TOKEN` is exported at the job level, so all steps inherit it even though only the npm install step needs packages auth.

## Issue Context
The workflow writes an `.npmrc` configured to use `${NODE_AUTH_TOKEN}` for GitHub Packages authentication.

## Fix Focus Areas
- .github/workflows/governance-enforce.yml[33-48]

## Suggested fix
- Move `NODE_AUTH_TOKEN: ${{ secrets.GITHUB_TOKEN }}` from `jobs.enforce.env` to the `fetch governance enforcer` step’s `env`.
- Optionally remove the temporary `.npmrc` after install (defense-in-depth).

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools


Grey Divider

Context used
✅ Compliance rules (platform): 7 rules
Review mode: ⚖️ Balanced: This adds a security-sensitive CI governance gate with package installation, token permissions, diff-base selection, and workflow behavior; despite one localized hunk, it warrants a complete careful review.

To customize comments, go to the Qodo configuration screen, or learn more in the docs.

Qodo Logo

qodo-code-review[bot]

This comment was marked as resolved.

@qodo-code-review

Copy link
Copy Markdown

Qodo Fixer

No findings are within the configured fix scope. To change which findings are fixed, adjust the setting on your Qodo configuration page.

cubic-dev-ai[bot]

This comment was marked as resolved.

…othing

Five defects, none of them cosmetic. Refs wave-av/claude-workstation#1747.

1. FAIL-OPEN DIFF BASE. `BASE=$(git rev-parse HEAD~1 2>/dev/null || git rev-parse HEAD)`
   — on a root commit `git rev-parse HEAD~1` prints its unresolved argument to stdout AND
   fails, so the `||` branch appends and BASE becomes a two-line string. `git diff` then
   exits 128, and the pinned enforcer turned that into zero files and a green check. Now:
   a reachability-checked base (a force-push can leave `github.event.before` pointing at a
   commit this checkout does not have), and with no resolvable base at all it diffs against
   the EMPTY TREE so the whole repo is scanned rather than nothing.

2. THE PINNED ENFORCER ITSELF FAILED OPEN. `^0.4.4` resolved to 0.4.4, whose file lister is
   `catch { return []; }` — any git error became zero files and rendered as
   `OK[enforce]: 0 changed file(s) scanned — 0 A_BLOCK violations`. A git error and a clean
   diff were byte-identical in the output. The fix had sat unreleased on claude-workstation
   main since 2026-07-29 because no `governance-v*` tag was ever pushed. Released now as
   0.4.6 and pinned exactly here.

3. TOKEN IN SCOPE FOR THE WRONG STEPS. `NODE_AUTH_TOKEN` was job-level, so it was also in
   the environment of the step that executes the downloaded package. Now step-scoped, and
   the .npmrc holding it is removed on exit.

4. INSTALL SCRIPTS RAN WITH THAT TOKEN. `npm install` runs preinstall/postinstall by
   default. Added `--ignore-scripts`.

5. CANCELLED PUSH RUNS WERE SCANNED BY NOBODY. `cancel-in-progress: true` applied to push
   runs, and each push run only diffs its own before..HEAD range — so a cancelled run's
   commits were never examined by anything. Now PR-only.

Also: `timeout-minutes: 10` and `set -euo pipefail`.

Receipt, against a scratch repo whose root commit carries a no-hardcoded-paths violation,
simulating a branch-creation push (`before` = all zeros):
  old logic -> malformed base -> caught error -> [] -> OK, 0 files scanned, PASS
  new logic -> "no diff base resolved ... scanning the whole tree" -> BLOCK, exit 1

Credit where it is due: several of these were found by the review bots on the sibling
vendoring PRs and are folded in here — the step-scoped token, the .npmrc cleanup, the exact
pin, `--ignore-scripts`, the force-push reachability check, `timeout-minutes`, and the
concurrency hole (5), which was crest-console#7's catch and which I had missed entirely.
@cursor

cursor Bot commented Aug 6, 2026

Copy link
Copy Markdown

Bugbot couldn't run - usage limit reached

Bugbot is counted against Cursor usage for this user or team, and this run hit a usage or spend limit.

A user or team admin can review and increase usage limits in the Cursor dashboard.

(requestId: serverGenReqId_410fccd4-7fbf-42ec-ad5e-306aaa1f3ce9)

@devin-ai-integration devin-ai-integration 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.

Devin Review found 2 new potential issues.

Open in Devin Review

Comment on lines +88 to +93
if [ -z "$BASE" ]; then
BASE="$(git hash-object -t tree /dev/null)"
echo "::notice::no diff base resolved (root commit or unreachable before-sha) — scanning the whole tree against the empty tree"
fi
echo "diffing against $BASE"
exec node "$ENFORCE" --changed "$BASE"

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🔍 Empty-tree fallback assumes the enforcer accepts a tree object as its diff base

When no base commit resolves, BASE is set to the empty-tree hash (git hash-object -t tree /dev/null) and passed as --changed "$BASE". This only works if @wave-av/governance@0.4.6's file lister performs a two-dot/tree-vs-worktree diff (git diff --name-only <base>). If it instead uses a three-dot range (git diff --name-only <base>...HEAD) or validates the argument with rev-parse <base>^{commit} (as this workflow itself does at .github/workflows/governance-enforce.yml:79), the tree hash will make git error out and the fail-closed path would abort rather than scan the tree. Worth confirming against the package's bin/enforce.mjs implementation before relying on this branch.

Open in Devin Review

Was this helpful? React with 👍 or 👎 to provide feedback.

Comment thread .github/workflows/governance-enforce.yml Outdated
Comment on lines +80 to +88
BASE="$(git rev-parse --verify --quiet 'HEAD~1' || true)"
fi
# FIX 5 — fail CLOSED. This previously fell back to `BASE=HEAD`, and `--changed HEAD`
# diffs HEAD against itself: an empty diff, zero files scanned, job green. With no
# resolvable base, diff against the EMPTY TREE so every tracked file reads as added and
# the whole repo is scanned. (`--all` also exists in 0.4.6 and would do most of this, but
# it is documented as NOT covering the diff-scoped over-grant detectors. Routing through
# the diff path with an empty base keeps every detector in play.)
if [ -z "$BASE" ]; then

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🔴 Critical workflows/governance-enforce.yml:80

When github.event.before is unreachable (e.g. a force-push), the fallback at line 80 resolves BASE to HEAD~1. On a multi-commit push this diffs only the final commit against its parent, so violations introduced by earlier commits in the same push are never scanned — the gate can pass while leaving most of the push unexamined. The fallback should stay fail-closed: fall through to the empty-tree case unless a trustworthy range base is available.

            BASE="$(git rev-parse --verify --quiet 'HEAD~1' || true)"
-          fi
-          # FIX 5 — fail CLOSED. This previously fell back to `BASE=HEAD`, and `--changed HEAD`
-          # diffs HEAD against itself: an empty diff, zero files scanned, job green. With no
-          # resolvable base, diff against the EMPTY TREE so every tracked file reads as added and
-          # the whole repo is scanned. (`--all` also exists in 0.4.6 and would do most of this, but
-          # it is documented as NOT covering the diff-scoped over-grant detectors. Routing through
-          # the diff path with an empty base keeps every detector in play.)
-          if [ -z "$BASE" ]; then
🚀 Reply "fix it for me" or copy this AI Prompt for your agent:
In file @.github/workflows/governance-enforce.yml around lines 80-88:

When `github.event.before` is unreachable (e.g. a force-push), the fallback at line 80 resolves `BASE` to `HEAD~1`. On a multi-commit push this diffs only the final commit against its parent, so violations introduced by earlier commits in the same push are never scanned — the gate can pass while leaving most of the push unexamined. The fallback should stay fail-closed: fall through to the empty-tree case unless a trustworthy range base is available.

Evidence trail:
.github/workflows/governance-enforce.yml:42-45, 67-93 (commit 73a72cfd); `git blame REVIEWED_COMMIT -L 74,91 -- .github/workflows/governance-enforce.yml`

…l a false pass

Correction to the previous commit on this branch. Refs wave-av/claude-workstation#1747.

That commit replaced the fail-open `BASE=HEAD` with a fallback to `HEAD~1`. `HEAD~1` is
also wrong: it scans exactly ONE commit, so a five-commit push whose base is indeterminate
(branch creation, force-push, unreachable `github.event.before`) examines the last commit
and reports a confident pass on the other four. A narrowed scan reported as a full pass is
the same defect in a quieter costume.

Receipt — scratch repo, five-commit push, violation planted in commit 1:
  HEAD~1 base      -> OK[enforce]: 1 changed file(s) scanned  -> PASS   (never saw it)
  empty-tree base  -> 5 changed file(s) scanned -> BLOCK[enforce]: no-hardcoded-paths, exit 1

Now: with no resolvable base of any kind, diff against git's empty-tree object so every
tracked file reads as added and the whole repo is scanned. Loud, never partial, never empty.

Credit: wave-av/wave-rig's copy on main already had this right, with the reasoning in a
comment ("HEAD~1 would skip earlier commits in a multi-commit push and let a violation
through"). The fan-out copied the broken shape from elsewhere and I did not check the one
repo that had already solved it.

Also from wave-rig: `merge_group` is now a declared trigger and `github.event.merge_group.
base_sha` joins the base chain. None of these repos runs a merge queue today, so the trigger
is inert — but a required check that never reports on an event the repo actually uses is a
permanent deadlock, and this closes that in advance rather than after someone hits it.

@devin-ai-integration devin-ai-integration 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.

Devin Review found 1 new potential issue.

Open in Devin Review

Comment on lines +46 to +52
- uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
with:
fetch-depth: 0
persist-credentials: false
- uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0
with:
node-version: "22"

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🔍 Action pin versions differ from the rest of the repo's workflows

Other workflows here pin actions/checkout at v4.3.1 (34e114876b...). This new file pins a different SHA labeled v6.0.3, and actions/setup-node labeled v6.4.0. The SHAs cannot be verified from the repo; if a label/SHA mismatch exists the pin comment becomes misleading. Consider aligning pins across workflows or documenting why this one differs.

Open in Devin Review

Was this helpful? React with 👍 or 👎 to provide feedback.

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

Labels

rr:skip-cubic RF.P1 reviewer routing (#1039)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant