Skip to content

ci(pullfrog): pin the action and make the reviewer review-only - #306

Merged
fabiodalez-dev merged 3 commits into
mainfrom
chore/pullfrog-review-only
Oct 1, 2026
Merged

fabiodalez-dev merged 3 commits into
mainfrom
chore/pullfrog-review-only

Conversation

@fabiodalez-dev

@fabiodalez-dev fabiodalez-dev commented Oct 1, 2026 •

Copy link
Copy Markdown
Owner

The Pullfrog console generated this workflow when I enabled the repository. It works, but it leaves three things at defaults that are wrong for this project, so this tightens them before the reviewer starts running.

push: disabled. This is the one that matters. The input defaults to enabled, which lets the agent push branches and open pull requests of its own. Every commit and pull request in my repositories is authored by me, so the agent gets no write path at all: it reads the diff and comments. The input is declared in the action's own action.yml and is not mentioned in the getting-started guide, which is why the generated file leaves it permissive.

Pinned to a commit SHA instead of @v0. That tag moves — it has already advanced through ninety v0.1.x releases — and this is the only action here that runs an agent with access to the repository, so a mutable ref is the last place I want one. Pullfrog's own versioning page supports pinning and says nothing is lost: the action fetches its steps from npm either way, so the agent keeps tracking patch releases without this file changing. Bump the SHA to update.

shell: restricted, which scrubs *_TOKEN / *_KEY / *_SECRET / *_PASSWORD / *_CREDENTIAL out of the environment the agent's shell sees. It is already the default for a public repository; I set it explicitly so that making this repository private some day cannot widen it silently, since private repos default to enabled.

I left the provider env: block exactly as generated. I checked what an unset secret does: it resolves to an empty string, and the action's sanitizeSecret() leaves the variable untouched in that case rather than treating it as a key, so the block is inert until a key is actually added and it cannot shadow keys held in Pullfrog's own store or in the Router.

Nothing else changes. There are no run: steps, so there is no shell interpolation surface, and no workflow expression reads untrusted event data.

One caveat worth recording: the file carries Pullfrog's own DO NOT EDIT EXCEPT WHERE INDICATED header, so if the console regenerates it these three changes are lost. The durable place for the push tier is the console's own repository setting; this file is the belt to that braces.

Summary by CodeRabbit

  • Manutenzione
    • Aggiornato il flusso automatizzato di revisione: ora opera in modalità di sola lettura e non invia modifiche al repository.
    • Le credenziali Git non vengono conservate al termine del checkout e l’ambiente di esecuzione è più ristretto. Sono inoltre state fissate le versioni degli strumenti utilizzati, per rendere le esecuzioni più coerenti.

@coderabbitai

coderabbitai Bot commented Oct 1, 2026 •

Copy link
Copy Markdown

Review in Change Stack →

Navigate logical layers of code changes, visualize relationships, and explore their blast radius.

Warning

Review limit reached

You've used all free OSS reviews for now. Wait for the free limit to reset to keep reviewing this public repository.

Next included review available in 31 minutes.

Check out review usage here.

View limit details

Limit details: You’ve used all 2 included reviews currently available.

Learn how review limits work.

Review configuration:

⚙️ Run configuration

Configuration used: Repository: fabiodalez-dev/FAZ-Cookie-Manager/.coderabbit.yaml

Review profile: CHILL

Plan: Advanced

Run ID: fe800258-840f-4e07-9103-32807a3f14cc

📥 Commits

Reviewing files that changed from the base of the PR and between 1fe93cb and d60ce44.

📒 Files selected for processing (1)
  • .github/workflows/pullfrog.yml

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Repository: fabiodalez-dev/FAZ-Cookie-Manager/.coderabbit.yaml

Review profile: CHILL

Plan: Advanced

Run ID: 9d75ddcd-9145-4708-932d-db688df08583

📥 Commits

Reviewing files that changed from the base of the PR and between 1532818 and 1fe93cb.

📒 Files selected for processing (1)
  • .github/workflows/pullfrog.yml

Included review availability: This review used your included allowance. Your plan provides up to 2 included reviews per hour; 1 remain after this review.


Walkthrough

Il workflow fissa a SHA le revisioni di actions/checkout e Pullfrog. Disabilita la persistenza delle credenziali Git nel checkout e aggiunge le opzioni push: disabled e shell: restricted a Pullfrog.

Changes

Workflow Pullfrog

Layer / File(s) Summary
Revisioni e opzioni di Pullfrog
.github/workflows/pullfrog.yml
Il workflow fissa a SHA le revisioni di actions/checkout e Pullfrog. Disabilita la persistenza delle credenziali Git e configura Pullfrog con push: disabled e shell: restricted.

Priority: ⬇️ Low

Estimated code review effort: 2 (Simple) | ~8 minutes

Change: Bug fix

Merge Risk: ⚪ Minimal · up to 1fe93

The workflow’s read-only and credential-isolation settings match the pinned actions’ contracts, with no established PR-introduced issue blocking merge.

Architecture Summary

Architecture risk: 🔵 Low · up to 1fe93

The changed surface does not map to a changed system, dependency edge, entrypoint, or external dependency.

Changed systems: None identified.

Architecture concerns
No architecture-level concerns identified.

Review details

Before / after behavior

  • observed — Modified behavior in .github/workflows/pullfrog.yml: actions/checkout passa dal riferimento v6 a un commit SHA e imposta persist-credentials: false, anziché affidarsi al comportamento predefinito di persistenza delle credenziali.
  • observed — Modified behavior in .github/workflows/pullfrog.yml: L’azione Pullfrog passa dal riferimento mobile @v0 a un commit SHA specifico.
  • observed — Modified behavior in .github/workflows/pullfrog.yml: La configurazione di Pullfrog aggiunge push: disabled e shell: restricted, impostazioni che non erano presenti prima.
🚥 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 Il titolo descrive in modo chiaro le modifiche principali: fissare l’action a una revisione specifica e configurare Pullfrog in modalità di sola revisione.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check. Docstring coverage is scoped to functions touched by this diff. Analyzed 0 functions across 0…
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.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Commit to this branch
  • Create a new PR
  • Autopilot · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

Autopilot is currently an internal CodeRabbit preview.


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.

@pullfrog pullfrog 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.

Important

Two must-address items before this can merge: the file trips the repo's own diff-hygiene gate, and the branch currently conflicts with main because main already contains the generated version of this same path. Details below.

Reviewed changes

The Pullfrog reviewer workflow was reviewed end to end: the action refs, the review-only inputs, the job permissions, and the CI interaction.

  • Commit-SHA pinning — pullfrog/pullfrog and actions/checkout are pinned to full 40-char SHAs. The action SHA resolves to npm pullfrog@0.1.90; actions/checkout@34e11487… # v4 matches the sibling workflows.
  • Review-only inputs — push: disabled and shell: restricted are both declared in the action's action.yml at the pinned SHA. shell: restricted scrubs *_TOKEN/*_KEY/*_SECRET/*_PASSWORD/*_CREDENTIAL, which also covers ACTIONS_ID_TOKEN_REQUEST_TOKEN.
  • Permissions — workflow-level contents: read; the job adds id-token: write (the action authenticates to Pullfrog over OIDC) plus contents: read. No run: steps and no untrusted event data, so there is no shell interpolation surface.

⚠️ The branch conflicts with main, which already contains a pullfrog.yml

main HEAD (1532818, "Add pullfrog.yml workflow") already adds .github/workflows/pullfrog.yml — the same path this PR adds, forked from 4f44d467. GitHub reports mergeable: false / mergeable_state: dirty, so no merge commit can be built and pull_request-triggered workflows (Quality, Plugin Check, CodeQL) are not running on this PR at all — only the external apps (CodeRabbit, Semgrep, Pullfrog) appear. Resolve the conflict by rebasing onto current main and keeping this hardened version, so the repo's own gates actually run before merge.

Technical details
# Branch conflicts with main on an add/add of the same path

## Affected sites
- `.github/workflows/pullfrog.yml` — added by this PR; already present on `main` at `1532818` (in the unpinned, generated form).
- Merge base: `4f44d4677ec165525c1ad252c94a93723b7c355d`; `main` tip: `1532818`.

## Required outcome
- Rebase/merge `main` into the branch, resolving the add/add conflict in favor of this PR's hardened file.
- Confirm the PR becomes mergeable so `Quality`, `Plugin Check`, and `CodeQL` run on it.

## Open question for the human
- Since the generated (unpinned) workflow is already live on `main`, is this PR intended to replace it, or should the two coexist?

Important

Pullfrog covered this run's model usage. DeepSeek Flash is fast and cheap — expect lighter work than a frontier model. This model allowance is temporary and separate from your Pullfrog plan. Connect a model-provider subscription or API key →

Pullfrog  | Fix all ➔ | Fix 👍s ➔ | View workflow run | Using DeepSeek Flash (model usage covered by Pullfrog) | 𝕏

Comment thread .github/workflows/pullfrog.yml Outdated
Comment thread .github/workflows/pullfrog.yml Outdated
Three changes to the workflow the Pullfrog console generated, each for a
reason that applies to this repository specifically.

`push: disabled`. The input defaults to `enabled`, which lets the agent push
branches and open pull requests of its own. Every commit and pull request here
is authored by its maintainer, so the agent gets no write path at all: it reads
the diff and comments. The input is declared in the action's own action.yml and
is not mentioned in the getting-started guide, so the generated file leaves it
at the permissive default.

Pinned to a commit SHA instead of `@v0`. That tag moves — it has already
advanced through ninety v0.1.x releases — and this is the one action here that
runs an agent with repository access, so a mutable ref is the last place to
accept one. Pullfrog's versioning page supports pinning and notes nothing is
lost: the action fetches its steps from npm either way, so the agent still
tracks patch releases without this file changing.

`shell: restricted`, which scrubs *_TOKEN / *_KEY / *_SECRET / *_PASSWORD /
*_CREDENTIAL from the environment the agent's shell sees. Already the default
for a public repository; stated explicitly so that making this repository
private some day cannot silently widen it, since private repos default to
`enabled`.

The provider `env:` block is left exactly as generated. Unset secrets resolve
to empty strings, and the action's sanitizeSecret() leaves the variable
untouched in that case rather than treating it as a key, so the block is inert
until a key is actually added and it cannot shadow keys held in Pullfrog's own
store or the Router.

Nothing else is touched: no `run:` steps, so no shell interpolation surface,
and no workflow expression reads untrusted event data.
@fabiodalez-dev
fabiodalez-dev force-pushed the chore/pullfrog-review-only branch from 218afc7 to d20c1e0 Compare October 1, 2026 14:44
@fabiodalez-dev fabiodalez-dev changed the title ci: add the Pullfrog review workflow, pinned and review-only ci(pullfrog): pin the action and make the reviewer review-only Oct 1, 2026

@pullfrog pullfrog 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.

✅ No new issues found.

Reviewed changes

Re-reviewed the delta since the prior pullfrog review (218afc7): the branch was rebased onto current main, resolving both must-address items from that review. The workflow file's content is otherwise unchanged.

  • Rebased onto current main (1532818) — the branch now sits directly on the commit that already carried the generated pullfrog.yml, so the previous add/add conflict is gone. GitHub reports the PR mergeable: true and the pull_request gates (Quality, Plugin Check, CodeQL) run against it.
  • Diff-hygiene failure resolved — the trailing-whitespace lines that previously tripped git diff --check HEAD^ are now inherited from main and are no longer part of this PR's diff; a local git diff --check HEAD^ on the branch is clean.
  • Pinned refs and review-only inputs unchanged — push: disabled, shell: restricted, and the full-SHA pins for pullfrog/pullfrog and actions/checkout are identical to the previously reviewed and verified version.

Important

Pullfrog covered this run's model usage. DeepSeek Flash is fast and cheap — expect lighter work than a frontier model. This model allowance is temporary and separate from your Pullfrog plan. Connect a model-provider subscription or API key →

Pullfrog  | View workflow run | Using DeepSeek Flash (model usage covered by Pullfrog) | 𝕏

actions/checkout defaults to persist-credentials: true, which writes the job's
GITHUB_TOKEN into .git/config. That leaves a working push credential inside the
very checkout the agent then operates on, so it contradicts the `push: disabled`
set alongside it: the input closes the action's own push path and the token
reopens it from underneath.

Caught by Pinakes' CI policy check — "pullfrog.yml has an actions/checkout step
that persists GitHub credentials" — which refuses any checkout that persists
credentials. It was right, and the same omission was in all of these
repositories, so the fix goes everywhere rather than only where a check happened
to be watching.

Nothing needs the credential: the agent reaches GitHub through the App's
installation token, not the local git remote, and these repositories are public,
so an unauthenticated fetch works.

@pullfrog pullfrog 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.

✅ No new issues found.

Reviewed changes

Re-reviewed the delta since the prior pullfrog review (d20c1e0): one new commit that hardens the checkout step.

  • Checkout no longer persists credentials — persist-credentials: false was added to the actions/checkout step, with a comment explaining that the default (true) leaves the job's GITHUB_TOKEN in .git/config, which reopens a push path that push: disabled is meant to close.

The added input is valid for actions/checkout@v4 and matches the sibling workflows' convention. Nothing in this workflow needs the credential: push: disabled means the agent never pushes, and the agent reaches GitHub through the App's installation token rather than the local remote. The commit is whitespace-clean (git diff --check) and the PR reports mergeable: true. All prior Pullfrog threads are already resolved.


Important

Pullfrog covered this run's model usage. DeepSeek Flash is fast and cheap — expect lighter work than a frontier model. This model allowance is temporary and separate from your Pullfrog plan. Connect a model-provider subscription or API key →

Pullfrog  | View workflow run | Using DeepSeek Flash (model usage covered by Pullfrog) | 𝕏

The reviewer workflow was the only file in .github failing the Workflow, YAML
and shell security gate. Four separate problems, all real:

- zizmor (pedantic) wants every write permission documented, and it reads a
  trailing comment on the permission line, not a block above it. id-token:
  write now says on its own line what it is for: an OIDC identity for
  Pullfrog token service, which grants nothing on the repository.
- The job had no name, so it showed up anonymously in the checks list.
- The workflow had no concurrency group. It was left out on purpose, because
  every run is dispatched against the default branch and one shared group
  would make two reviews cancel each other. The group is keyed on the
  dispatched run name instead, so a fresh review of the same pull request
  supersedes a stale one while different pull requests never collide, and it
  falls back to the unique run id when no name is passed.
- Two lines carried trailing whitespace, inherited from the generated
  template, which yamllint rejects. The gate had never reached yamllint
  because zizmor failed first.

Also pins actions/checkout by commit SHA where it was still a floating v6 tag.

Verified locally with the same three tools the gate runs, over the whole
.github tree: zizmor --persona pedantic, actionlint and yamllint all exit 0.

@pullfrog pullfrog 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.

✅ No new issues found.

Reviewed changes

Re-reviewed the delta since the prior pullfrog review (1fe93cb): one commit, d60ce44, that brings the reviewer workflow into compliance with the repo's workflow/YAML lint gates.

  • Concurrency group added — a stale run is now cancelled when a fresh one is dispatched for the same PR, via group: ${{ github.workflow }}-${{ inputs.name || github.run_id }} with cancel-in-progress: true. Because every run is dispatched against the default branch, keying on github.ref (the sibling workflows' pattern) would collide across PRs, so it keys on the dispatched run name instead, falling back to the unique run id when no name is passed.
  • Job named — name: Pullfrog agent, so the check is no longer anonymous in the checks list.
  • Write permission documented — id-token: write carries its own trailing comment (zizmor pedantic reads the permission line, not the block above it), alongside a contents: read rationale.
  • Inherited template whitespace removed — two blank lines in the env: block that yamllint rejected are now clean.

The inputs context in concurrency is valid for workflow_dispatch per GitHub's context-availability table, and the commit is whitespace-clean.


Important

Pullfrog covered this run's model usage. DeepSeek Flash is fast and cheap — expect lighter work than a frontier model. This model allowance is temporary and separate from your Pullfrog plan. Connect a model-provider subscription or API key →

Pullfrog  | View workflow run | Using deepseek-v4.1-flash (model usage covered by Pullfrog) | 𝕏

@fabiodalez-dev
fabiodalez-dev merged commit 0ca98e5 into main Oct 1, 2026
10 checks passed
@fabiodalez-dev
fabiodalez-dev deleted the chore/pullfrog-review-only branch October 1, 2026 15:59
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.

1 participant