
PrufGate
io.github.GuardianVigil-LabsPublished by GitHub account GuardianVigil-Labsv1.1.0Updated Oct 29, 2026
Read-only tools that check whether code, and the tests that claim it works, are real.
Overview
PrufGate exposes ten read-only MCP tools that check whether code, and the tests claiming it works, are genuine rather than fabricated or weakened.
- What you can do
- Run deterministic checks over a repository or a changed diff for fabricated success paths, stubs and canned data
- Audit test integrity: missing or unfailable assertions, mocked units under test, deleted or weakened tests
- Flag diff-level shortcuts such as added skips, suppressions, fake exits and lowered coverage or CI settings
- Check contracts: undeclared imports, undocumented environment variables, frontend calls to missing API routes
- Detect BOLA/IDOR-style route handlers that load records by client-supplied ID without ownership checks
- Explain findings and rule IDs offline, with optional AI adjudication of low-confidence findings
- When to use it
- Useful when reviewing AI-generated or hurried pull requests and you want an assistant to surface code that compiles and looks finished but does not do the job. It complements linters and SAST tools rather than replacing them.
- Requirements
- Runs locally over stdio as a Python package (prufgate, launched with uvx or pipx); needs Python 3.9 or newer and Git. No authentication, environment variables or headers are declared. The MCP server is not available from the single-file zipapp.
Installation
In SourceWeft
- Open PrufGate in the dashboard and add it to a workspace.
- Enable the server for the chats that should use its tools.
Desktop only via STDIO. STDIO servers start a local process, so they need the SourceWeft desktop host.
Other MCP clients
Follow the launch instructions in the repository.
README
PrufGate
Checks whether code, and the tests that claim it works, are real.
[License: Apache 2.0] [PyPI version] [Python 3.9+] [OpenSSF Scorecard] [OpenSSF Best Practices]
Linters check that code compiles. PrufGate looks for code that compiles, passes review at a glance and still does not do the job. This is the kind of code an AI coding agent (or a hurried human) writes to make a task look finished:
- a
catchblock that returns a hard-coded success object; - a click handler that does nothing;
- a test that asserts
true, or mocks the very function it tests; - a
.skip,@ts-ignoreor lowered coverage threshold slipped into a diff; - an import of a package that is not declared anywhere;
- an API route that loads a record by ID without checking who owns it.
PrufGate is deterministic: plain Python, no network calls and no LLM unless you ask for one. It runs in seconds on a pull request, and writes SARIF for code scanning and Markdown for humans. It is meant to sit next to your linters and SAST tools, not replace them.
The six engines
Details, rule IDs, supported languages and known limits for each engine: docs/ENGINES.md.
PrufGate uses pattern and structure heuristics, not a full parser for every language. It will miss things and it will sometimes flag correct code. Every finding names its rule, and inline prufgate-ignore: rule -- reason comments, exemptions and baselines let you record why.
Quick start
PrufGate needs Python 3.9 or newer and Git.
Or download one file, prufgate.pyz, from the latest release (releases after 1.0.0). It is a zipapp with PyYAML (pure Python) inside, so it needs nothing but Python 3.9 or newer:
The hooks that prufgate init --hooks writes call prufgate on PATH, so for them install the file as a command: install -m 755 prufgate.pyz ~/.local/bin/prufgate. The zipapp runs every command a pip install has except mcp (use pipx install prufgate for the MCP server). Like a pip install, it does not include the shell batteries (./prufgate.sh fast / full with ast-grep, gitleaks and zizmor); prufgate.pyz fast and full run the Python engines only. For the full battery use the container image or a checkout. There are no native per-OS binaries: they would need a build on three operating systems for every release, and the zipapp covers the same need. python3 scripts/build_pyz.py builds the same file from a checkout; it downloads the hash-locked PyYAML sdist from PyPI and refuses one that does not match requirements.txt.
Or run the signed container image, which adds the full gate with ast-grep, gitleaks and zizmor:
Or add the GitHub Action to a pull-request workflow, pinned to the commit SHA of the v1.3.0 tag (full example):
Every release is signed and carries build provenance and an SBOM: Verify a release.
Or add it to your pre-commit configuration, .pre-commit-config.yaml (details):
Then, in your project:
Exit codes are the same everywhere: 0 clean, 1 blocking findings (P0/P1), 2 PrufGate could not run (bad config, bad base ref, unreadable file, engine crash). A crash never reads as a pass.
Ways to run it
The full command and option reference is in docs/GETTING_STARTED.md, and every configuration key is in docs/CONFIGURATION.md.
Configuration in one look
PrufGate works without configuration. To tune it, add .prufgate/config.yaml:
In a pull request (any run with a base ref) PrufGate reads this file as it is on the base branch, so configuration changes take effect after merge: a change cannot exempt its own findings.
AI adjudication
PrufGate is deterministic by default and sends nothing anywhere. Two opt-in modes use an AI provider you choose (a claude CLI, OPENAI_API_KEY, ANTHROPIC_API_KEY or OLLAMA_HOST; --ai-provider names another):
prufgate review --aiasks the model to review the whole diff.ai_adjudicate: truein the configuration (read at the base ref in a pull request, byprufgate checkand theprufgate.shgate;--ai-adjudicatealone does nothing without it) asks one yes/no question per low-confidence finding (mediumtoo if configured): is this real? The prompt holds the rule, the finding message and a few redacted lines around it, never whole files.
An adjudication verdict can only hide noise. A finding judged not real stops blocking and moves to an "AI-dismissed" list with the model's reason: a section of prufgate check output and of the Markdown report, and a SARIF suppressions entry of kind external (AI-dismissed: <reason>). High-confidence findings are never sent; nothing is ever added or raised. A provider error, a timeout, a reply that is not exactly {"real": true|false, "reason": "..."}, a run over its budget, or code that addresses the judge (a comment naming the AI, LLM, judge, reviewer or PrufGate) keeps the finding as it would be without AI. Verdicts are cached outside the repository. Settings: docs/CONFIGURATION.md.
Documentation
- Getting started: install, commands, reports, exit codes
- Configuration reference: every key, suppressions, environment variables
- The engines: rules, languages and limits
- CI and agent integration: GitHub Action, other CI, agent hooks, MCP, REST API
- Custom rules: your own ast-grep rules and hooks
- Architecture
- Benchmark: measured precision and recall on a labelled corpus, and how to add a case
- Changelog
Contributing and security
Contributions are welcome: see CONTRIBUTING.md and the maintainer guide AGENTS.md. Please report vulnerabilities privately, as described in SECURITY.md.
PrufGate is published by GuardianVigil under the Apache License 2.0. The name and logo are trademarks: see TRADEMARKS.md.
Source: README.md at commit 91faf70
Tools
0Version history
1- v1.1.0LatestOct 29, 2026
Score
50% of the applicable checks met
How complete this listing is, computed from the registry entry, the endpoint and public sources. Not a rating of the server and not a statement that it is safe or working today: reachability is a dated check, and no installs or reviews go into the score.
- Reached in the last 30 days25 pts
Keep the endpoint answering the MCP handshake; SourceWeft probes it every 30 days.
- Auth declared10 pts
Declare the credential headers in the registry entry, or keep the endpoint answering the probe so its auth can be classified.
- Tools listed15 pts
Answer tools/list without a credential, or ship a package that starts in a sandbox without one.
- DescriptionRequired15 pts
- Logo10 pts
- Documentation15 pts
- License10 pts