Predict why a repository will fail on your machine before you run it.
Project description
repofail
Deterministic runtime compatibility analyzer
Predict why a repository will fail on your machine before you run it.
repofail answers one question: Will this repository actually run here?
It inspects both the repo and your machine — then reports deterministic incompatibilities before you install anything.
Why · Example · Works on · Install · Usage · Rules · CI · Contracts
Why This Exists
Most tools install dependencies.
Few tools tell you:
- Your Node version violates
engines.node. - Docker targets the wrong architecture.
- CUDA is hard-coded with no fallback.
- CI and local Python versions drifted.
repofail inspects both the repository and your machine — then reports deterministic incompatibilities before install or runtime.
Works on
repofail works on:
- Python projects
- Node projects
- Dockerized repos
- ML repositories
- Monorepos
Run it against any local clone.
Example output
repofail surfaces deterministic failures before install or runtime. No heuristics. No AI guesses. Evidence only.
Install
From PyPI (recommended)
pip install repofail
Or with pipx (isolated CLI install):
pipx install repofail
From source (development)
git clone https://github.com/jayvenn21/repofail.git
cd repofail
pip install -e .
Usage
# Scan
repofail # Scan current dir
repofail -p /path/to/repo # Scan specific repo
repofail -j # JSON output (machine-readable)
repofail -m # Markdown output
repofail -v # Verbose: rule IDs and low-confidence hints
repofail --ci # CI mode: exit 1 if HIGH rules fire
repofail --fail-on MEDIUM # CI: fail on MEDIUM or higher (default: HIGH)
repofail -r # Save failure report when rules fire (opt-in telemetry)
# Rules
repofail -e list # List all rules
repofail -e spec_drift # Explain a rule
# Contracts
repofail gen . # Generate env contract to stdout
repofail gen . -o contract.json
repofail check contract.json
# Fleet
repofail a /path # Audit: scan all repos in directory
repofail a /path -j # Audit with JSON output
repofail sim . -H host.json # Simulate: would this work on target host?
repofail s # Stats: local failure counts (from -r reports)
repofail s -j # Stats with JSON output
CI integration
- uses: actions/checkout@v4
- uses: actions/setup-python@v5
with:
python-version: "3.12"
- run: pip install repofail
- run: repofail --ci
Exits 1 if HIGH rules fire. Use --fail-on MEDIUM to be stricter.
Contracts
repofail gen . -o contract.json
repofail check contract.json
Versioned runtime expectations. Teams share contracts. CI checks drift.
Rules
| Tool | Reads Repo | Inspects Host | Predicts Failure | CI Enforceable |
|---|---|---|---|---|
| pip | ✅ | ❌ | ❌ | ❌ |
| Docker | ✅ | ❌ | ❌ | ❌ |
| repofail | ✅ | ✅ | ✅ | ✅ |
Deterministic rule coverage — repofail includes checks across:
- Spec violations — version ranges, engines.node, requires-python
- Architecture mismatches — Apple Silicon vs amd64 Docker
- Hardware constraints — CUDA requirements, GPU memory
- Toolchain gaps — missing compilers, Rust, node-gyp
- Runtime drift — CI vs Docker vs local inconsistencies
- Environment shape — multi-service RAM pressure, port collisions
See all rules: repofail -e list · Explain one: repofail -e <rule_id>
Rule reference
| Rule | Severity | When |
|---|---|---|
| Torch CUDA mismatch | HIGH | Hard-coded CUDA, host has no GPU |
| Python version violation | HIGH | Host outside requires-python range |
| Spec drift | HIGH | pyproject vs Docker vs CI — inconsistent Python |
| Node engine mismatch | HIGH | package.json engines.node vs host |
| Lock file missing | HIGH | package.json has deps, no lock file |
| Apple Silicon wheel mismatch | MEDIUM/HIGH | arm64 + x86-only packages or Docker amd64 |
| … | repofail -e list |
Scoring model
Compatibility Score = 100 − Σ(weight × confidence × determinism)
| Severity | Weight | Determinism |
|---|---|---|
| HIGH | 45 | 1.0 for spec violations |
| MEDIUM | 20 | 0.8–1.0 |
| LOW | 7 | 0.5–1.0 |
| INFO | 5 | structural only |
Determinism scale: 1.0 = guaranteed failure · 0.75 = high likelihood · 0.6 = probabilistic (spec drift) · 0.5 = structural risk
Score floors at 10%. When score ≤15% with HIGH rules: "— fatal deterministic violations present".
Architecture
repofail/
cli.py
engine.py
scanner/ # Repo + host inspection
rules/ # Deterministic rule implementations
fleet.py # Audit, simulate
Extensible via .repofail/rules.yaml.
Testing
pytest tests/ -v
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 repofail-0.1.2.tar.gz.
File metadata
- Download URL: repofail-0.1.2.tar.gz
- Upload date:
- Size: 7.4 MB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
af8aaaf558a27e7f6e4d91c64b685e07b7a04101e9895cb6dcad4e576921e135
|
|
| MD5 |
7f5bf3f981017cef8db412575e759b5a
|
|
| BLAKE2b-256 |
8b3ccbb807bc10699029166d944eaedcc0181bc7e1b4c8e93382d6574a6bb5af
|
Provenance
The following attestation bundles were made for repofail-0.1.2.tar.gz:
Publisher:
publish.yml on jayvenn21/repofail
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
repofail-0.1.2.tar.gz -
Subject digest:
af8aaaf558a27e7f6e4d91c64b685e07b7a04101e9895cb6dcad4e576921e135 - Sigstore transparency entry: 962152584
- Sigstore integration time:
-
Permalink:
jayvenn21/repofail@69f63b635e8ea80017dda75eb93ea7d479dc8f3c -
Branch / Tag:
refs/tags/v0.2.0 - Owner: https://github.com/jayvenn21
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@69f63b635e8ea80017dda75eb93ea7d479dc8f3c -
Trigger Event:
release
-
Statement type:
File details
Details for the file repofail-0.1.2-py3-none-any.whl.
File metadata
- Download URL: repofail-0.1.2-py3-none-any.whl
- Upload date:
- Size: 54.1 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
a371f20a65efbd2c3b472b70e367c9957d533e50dc2bb22d124791bdfae0e9c9
|
|
| MD5 |
0a8aa346d0bd3ccdd83dfdffec7a29b3
|
|
| BLAKE2b-256 |
970604ef7b65b7a41688c7a839e62071d15c3dc5e64a5d4b19608e0fa38b3e70
|
Provenance
The following attestation bundles were made for repofail-0.1.2-py3-none-any.whl:
Publisher:
publish.yml on jayvenn21/repofail
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
repofail-0.1.2-py3-none-any.whl -
Subject digest:
a371f20a65efbd2c3b472b70e367c9957d533e50dc2bb22d124791bdfae0e9c9 - Sigstore transparency entry: 962152596
- Sigstore integration time:
-
Permalink:
jayvenn21/repofail@69f63b635e8ea80017dda75eb93ea7d479dc8f3c -
Branch / Tag:
refs/tags/v0.2.0 - Owner: https://github.com/jayvenn21
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@69f63b635e8ea80017dda75eb93ea7d479dc8f3c -
Trigger Event:
release
-
Statement type: