umbra-reviewer
An advisory PR reviewer that finds architecture + security issues, cross-verifies them against deterministic gates, and tells you whether a change is safe to merge — without ever merging on its own judgement.
Part of the Umbra platform.
What it does
On every pull request, it:
- Finds issues with a deterministic scanner over the diff — introduced secrets, dangerous CI permission / OIDC changes,
pull_request_target+curl|shfootguns, unpinned third-party actions, prompt-injection surfaces in instruction files (README/CLAUDE.md/…), dynamic-exec / disabled-TLS smells, and changes to protected paths. - Cross-verifies those findings against deterministic gates: the repo's required status check (looked up from the GitHub API), a clean secret scan, and no forbidden permission change.
- Recommends a verdict — 🟢
safe· 🟡needs_human· 🟣third_party(escalate to a code owner) · 🔴block— and posts one PR comment. - Optionally, enables auto-merge — opt-in, off by default, and only ever on a
safeverdict whose eligibility came from green deterministic gates (see the safety model).
The safety model (why it won't rubber-stamp your repo)
This mirrors Umbra's own principle: an agent must not approve its own authority.
- The reviewer is advisory. Its findings never grant mergeability.
- The authority to merge is the deterministic gate — a required status check + a clean secret scan + no forbidden permission change — plus a human.
- A model finding (if you wire one in) is recorded but can never be blocking and can never flip a gated-clean PR away from
safeon its own. - Auto-merge is opt-in and, even then, uses GitHub's native auto-merge (the PR merges only when branch-protection required checks pass). The bot never force-merges; the platform does, only if your rules allow.
- A blocking finding or a failed/absent required check →
block/needs_human. Sensitive surface (workflows, Dockerfiles, auth, secrets) →third_party, always escalated to a human. - A green verdict is not a guarantee — deterministic scanners have false negatives. It's defense-in-depth, not a proof.
Use it (GitHub Action)
# .github/workflows/review.yml
name: Umbra Reviewer
on: { pull_request: {} }
permissions:
contents: read
pull-requests: write # to post the review comment (+ enable auto-merge if opted in)
checks: read
jobs:
review:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with: { fetch-depth: 0 }
- uses: bkd-dotcom/umbra-reviewer@v1
with:
required-check: "Umbra Admission" # cross-verify your merge gate (optional)
protected-paths: "infra/**,src/auth/**"
# auto-merge: "true" # opt in; still needs green branch-protection checks
Use it (CLI)
pip install umbra-reviewer
git diff origin/main...HEAD | umbra-reviewer review --repo owner/name --pr 12 \
--required-check success --comment-out comment.md
# exit 1 on a BLOCK verdict, so it gates CI. Add --fail-on-needs-human for a stricter gate.
Pairs with the rest of Umbra
umbra-actionis the hard gate (the required check + signed receipt).umbra-revieweris the advisory layer on top; pointrequired-checkat the Umbra Admission check to cross-verify.umbra-coreis the governance kernel.
License
MIT © 2026 Binay Dalai.
Metadata
Release files for umbra-reviewer 0.1.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| umbra_reviewer-0.1.0.tar.gz | 25.7 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| umbra_reviewer-0.1.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 44.6 kB
Release files / umbra_reviewer-0.1.0.tar.gz
| Download URL | umbra_reviewer-0.1.0.tar.gz |
|---|---|
| Size | 25.7 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
8824d1b4381b805959c0045193b3c8120e4aba4235a8ec571052dec60cc0c776
|
|
BLAKE2b-256 checksum How to use checksums |
f54e01da4d3715e987064b70fab2853333dabcdfd768a6ddf435fd5185fda75a
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Jul 29, 2026.
Transparency logRelease files / umbra_reviewer-0.1.0-py3-none-any.whl
| Download URL | umbra_reviewer-0.1.0-py3-none-any.whl |
|---|---|
| Size | 18.9 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
fa30bb55d75f3832ab23ea9bf52736a24e67849ab671102abd77a5a74c1a73b3
|
|
BLAKE2b-256 checksum How to use checksums |
00dd4d83421c3fce37087e2fd8359a1e4667e0f9240b7ecbfc875272f74426d6
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Jul 29, 2026.
Transparency log