GitHub Action that scores pull requests by structural risk
Project description
pr-risk-scorer
A GitHub Action that scores pull requests by structural risk across five dimensions and posts the result as a PR comment.
Quick Start
Add this step to any workflow that runs on pull_request events:
- name: Score PR Risk
uses: FasterApiWeb/pr-risk-scorer@v2
with:
github-token: ${{ secrets.GITHUB_TOKEN }}
Inputs
| Input | Required | Default | Description |
|---|---|---|---|
github-token |
Yes | — | Token used to post the PR comment (secrets.GITHUB_TOKEN works) |
config-path |
No | .github/pr-risk-scorer.yml |
Path to pr-risk-scorer.yml config file |
Secrets (
SLACK_WEBHOOK_URL,JIRA_API_TOKEN,JIRA_EMAIL,LINEAR_API_TOKEN,ANTHROPIC_API_KEY) are passed asenv:vars on the step, not asinputs:. See the full workflow example below.
Outputs
| Output | Description |
|---|---|
risk-score |
Numeric score 0–100 |
risk-label |
LOW, MEDIUM, or HIGH |
Score Breakdown
The total score is a weighted average of five analyzers (0 = no risk, 100 = maximum risk):
| Dimension | Weight | Method |
|---|---|---|
| Diff Size | 20% | Lines added + deleted, scaled to 1 000 max |
| Complexity | 30% | Average cyclomatic complexity of changed .py files via radon |
| Coverage Gap | 20% | 1 − line_rate from coverage.xml (inverse of test coverage) |
| Dead Code | 15% | Count of unused symbols via vulture, capped at 20 items |
| Migrations | 15% | Presence of DB migration files (0 → 0, 1 → 60, 2 → 80, 3+ → 100) |
Risk Tiers
| Emoji | Level | Score Range |
|---|---|---|
| 🟢 | LOW | < 40 |
| 🟡 | MEDIUM | 40 – 70 |
| 🔴 | HIGH | > 70 |
Example PR Comment
Screenshot placeholder — paste a screenshot of a real PR comment here after first run.
## PR Risk Score: 🟡 MEDIUM (54.5 / 100)
> Threshold: 70 | Status: ✅ PASS
| Analyzer | Score | Risk |
|------------------|------:|-------------|
| Diff Size (20%) | 42.0 | 🟡 MEDIUM |
| Complexity (30%) | 60.0 | 🟡 MEDIUM |
| Coverage Gap (20%)| 55.0| 🟡 MEDIUM |
| Dead Code (15%) | 20.0 | 🟢 LOW |
| Migrations (15%) | 0.0 | 🟢 LOW |
Full Example Workflow
Full workflow with all integrations wired:
name: PR Quality Gate
on:
pull_request:
types: [opened, synchronize, reopened]
permissions:
contents: read
pull-requests: write
jobs:
risk-score:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 2 # required for git diff HEAD~1
- name: Generate coverage report
run: |
pip install pytest pytest-cov
pytest --cov=src --cov-report=xml
- name: Score PR Risk
uses: FasterApiWeb/pr-risk-scorer@v2
with:
github-token: ${{ secrets.GITHUB_TOKEN }}
config-path: .github/pr-risk-scorer.yml
env:
SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_URL }}
JIRA_API_TOKEN: ${{ secrets.JIRA_API_TOKEN }}
JIRA_EMAIL: ${{ secrets.JIRA_EMAIL }}
LINEAR_API_TOKEN: ${{ secrets.LINEAR_API_TOKEN }}
ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}
Minimal config (Slack only)
.github/pr-risk-scorer.yml:
slack:
enabled: true
# SLACK_WEBHOOK_URL is read from the environment
notify_on: [high, medium] # omit to notify on all scores
Score Bands
| Score | Label | Meaning |
|---|---|---|
| 0 – 39 | 🟢 LOW | Routine change, low review overhead |
| 40 – 70 | 🟡 MEDIUM | Notable change, standard review recommended |
| 71 – 100 | 🔴 HIGH | Large or complex change, careful review required |
Local Development
# Install hatch
pip install hatch
# Run tests
hatch run test
# Type check
hatch run typecheck
# Lint for dead code
hatch run lint
Contributing
See CONTRIBUTING.md.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file pr_risk_scorer-0.2.1.tar.gz.
File metadata
- Download URL: pr_risk_scorer-0.2.1.tar.gz
- Upload date:
- Size: 83.0 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
e2bbf8d323a381e83a54b0bb560879179074c4e8b585e04e16b3896b701834cb
|
|
| MD5 |
9d3b67dada8f10fb94e26332a0c33c61
|
|
| BLAKE2b-256 |
8e5637916de81c745c9e33d9deef0119c4ad82b9730c2be0116ffa1e3b7f683f
|
Provenance
The following attestation bundles were made for pr_risk_scorer-0.2.1.tar.gz:
Publisher:
publish.yml on FasterApiWeb/pr-risk-scorer
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
pr_risk_scorer-0.2.1.tar.gz -
Subject digest:
e2bbf8d323a381e83a54b0bb560879179074c4e8b585e04e16b3896b701834cb - Sigstore transparency entry: 1378176126
- Sigstore integration time:
-
Permalink:
FasterApiWeb/pr-risk-scorer@855c5fbaee6594c3d0d804bc3c2210ce31bdb475 -
Branch / Tag:
refs/tags/v0.2.1 - Owner: https://github.com/FasterApiWeb
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@855c5fbaee6594c3d0d804bc3c2210ce31bdb475 -
Trigger Event:
push
-
Statement type:
File details
Details for the file pr_risk_scorer-0.2.1-py3-none-any.whl.
File metadata
- Download URL: pr_risk_scorer-0.2.1-py3-none-any.whl
- Upload date:
- Size: 38.4 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
959d8678695267058fa9742aba9c64bdfacf73d5aa3d214f2ea5722684fb6354
|
|
| MD5 |
e5f8f5a4dbb8e90f29d0391cfccd7d82
|
|
| BLAKE2b-256 |
bd8662a733c1f97e3dba6e5f46f72b9a580df431117e7d07d498f12d301a1648
|
Provenance
The following attestation bundles were made for pr_risk_scorer-0.2.1-py3-none-any.whl:
Publisher:
publish.yml on FasterApiWeb/pr-risk-scorer
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
pr_risk_scorer-0.2.1-py3-none-any.whl -
Subject digest:
959d8678695267058fa9742aba9c64bdfacf73d5aa3d214f2ea5722684fb6354 - Sigstore transparency entry: 1378176215
- Sigstore integration time:
-
Permalink:
FasterApiWeb/pr-risk-scorer@855c5fbaee6594c3d0d804bc3c2210ce31bdb475 -
Branch / Tag:
refs/tags/v0.2.1 - Owner: https://github.com/FasterApiWeb
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@855c5fbaee6594c3d0d804bc3c2210ce31bdb475 -
Trigger Event:
push
-
Statement type: