Security

Last updated September 25, 2026 · Reviewed against the code of the shipped release (5.2.1)

ProveBreak is a GitHub Action that you add to your own repository. When a watched workflow fails, it writes a proof card to that run’s GitHub Job Summary. For failed pushes to your default branch, it re-runs the failing tests at older commits to prove which commit broke them. It runs only on the GitHub Actions runners you already use. There is no ProveBreak server, account or dashboard.

“Sentinel” is ProveBreak’s internal code name. You’ll see it in file, folder and workflow names (for example .github/actions/sentinel/). It is the same software.

Permissions

The workflow starts from permissions: {} (nothing) and grants only what each job needs:

JobToken permissionsSecretsRuns your code?
install-check (only when the workflow file itself is pushed)actions: read, contents: readNoneNo
cardactions: read, contents: read, pull-requests: readNone (job token only)No — API reads and git plumbing only
bisect (only for failed pushes to the default branch)contents: readNone. Checkout doesn’t keep credentials, and secret-looking variable names are refused.Yes — your failing tests at older commits
rendercontents: read (plus pull-requests: write only if you turn on PR comments, which are off by default)A Slack webhook, only if you add oneNo

Where it runs

What leaves your environment

Checked against every network call in the Action’s source:

DestinationWhenWhat
Your GitHub API (github.com, or your GitHub Enterprise Server)AlwaysReads runs, jobs, logs, commits, comparisons and CODEOWNERS. The only write is the opt-in PR comment.
ProveBreak (us)NeverThere is no ProveBreak endpoint in the code and no telemetry. The Action also turns off Yarn’s own telemetry during test re-runs.
Slack (hooks.slack.com only; other hosts and redirects refused)Only if you add a Slack webhookHeadline, culprit short commit hash, failing test names, a summary of up to 400 characters, a suggested git revert command, and links.
pypi.org / registry.npmjs.org (read-only lookups)Only if you turn on an experimental “outside cause” check (off by default)Public package names and versions from your lockfile changes, to check release dates.
Your own LLM provider (HTTPS only, redirects refused)Only if you turn on the experimental fix suggestion and supply your own API key and a culprit was provenAt most 24,000 characters: the culprit diff (credential-like files removed), the failing test’s source, short code snippets and a redacted error excerpt. Each run records what was sent. The key lives only in a job that runs no repository code. Suggested patches are displayed, never applied.
Package registries and toolchain downloadsDuring test re-runsWhatever your own install step already fetches (for example npm ci, pip install, Go modules), plus standard actions/setup-* toolchains. No repository data is sent.

Bottom line: by default, nothing leaves GitHub. Slack and the fix suggestion send data only when you opt in and supply the destination and key yourself.

Releases and integrity

Data retention

How to audit it

  1. Read the source. It is small, standard-library Python in your repository under .github/actions/sentinel/, with a security-model comment at the top of action.yml.
  2. Search for network calls: grep -rn "urllib\|http" .github/actions/sentinel/src. You’ll find only the GitHub API client, the Slack sender, the opt-in registry lookups and the opt-in LLM call.
  3. Check permissions in .github/workflows/sentinel.yml (it starts at permissions: {}).
  4. Watch a run: every job logs its mode and a hash of the Action’s source. Card and bisect results are downloadable JSON artifacts.
  5. Remove it by deleting .github/actions/sentinel/ and .github/workflows/sentinel.yml.

Known limits

Reporting a vulnerability

Email hello@provebreak.com with “Security report” in the subject. Please don’t include secrets or customer data in the first message.