Arbiter
Agent attribution for code quality.
Install arbiter-score, run arbiter score, and quickly see which AI agent or human produced your highest-risk code.
pip install "arbiter-score[analyzers]"
arbiter score .
Example output:
┌──────────────────────┬──────────┬────────┐
│ Agent │ Quality │ Grade │
├──────────────────────┼──────────┼────────┤
│ claude │ 72.3% │ C │
│ gpt-4o │ 88.1% │ B │
│ copilot │ 91.4% │ A │
│ human (you) │ 94.2% │ A │
└──────────────────────┴──────────┴────────┘
Every team using AI coding tools has a "who wrote this mess?" moment. Arbiter makes that visible -- per file, per commit, and per author -- then grades the code quality signal.
pip install "arbiter-score[analyzers]" # one-time install
arbiter score . # grade everything
arbiter diff . --base main # only changed files in this branch
arbiter agents # author leaderboard
arbiter trend --days 30 # quality over time
arbiter worst --limit 20 # highest-risk files
arbiter audit-fleet ./repos # score every repo in a directory
arbiter serve # start web dashboard
Why Arbiter exists
AI-written code often optimizes for speed over maintainability. The result can include unused imports, high complexity, duplicated logic, and risky patterns. Standard linters catch some symptoms; Arbiter also attributes risk back to the contributor model/actor so you can review the right places first.
In practice, teams tune gates per agent tier (for example: stricter thresholds for autonomous agents, looser for exploratory branches) and keep human review focused on high-risk commits.
What makes Arbiter different
| Feature | Traditional tools | Arbiter |
|---|---|---|
| Agent attribution | None | First-class: tracks contribution source (AI and humans) |
| Per-commit scoring | Repository-wide only | Scores changed files by commit and author |
| Diff analysis | Optional / limited | Scores only what changed in PR/branch workflows |
| Review workflows | Static report | Supports agent-specific gate thresholds |
| Dashboard output | SaaS + build steps | Local, single-file HTML dashboard endpoint |
| Core runtime | Multi-tool runtime | Lightweight core (LibCST only); optional analyzer dependencies |
Scoring model
| Analyzer | Weight | Finds |
|---|---|---|
| Lint (ruff) | 35% | Style violations, import errors, bugbear patterns |
| Security (bandit) | 30% | Hardcoded secrets, shell injection, risky command patterns |
| Complexity (radon) | 35% | Cyclomatic complexity by function (A-F) |
| Dead code (vulture) | penalty | Unused functions, imports, variables |
| Duplication (AST hash) | penalty | Near-duplicate function bodies |
Arbiter computes a normalized score from analyzer penalties and total lines of code.
Common format:
100 - (penalty / LOC) * normalization
Grades: A (90+), B (80+), C (70+), D (60+), F (<60).
Install
From PyPI (recommended)
pip install arbiter-score # core (LibCST runtime)
pip install "arbiter-score[analyzers]" # + ruff, radon, vulture, bandit
Note: The PyPI package is arbiter-score (not arbiter, which is different). The CLI command is arbiter.
From source
git clone https://github.com/hummbl-dev/arbiter.git && cd arbiter
pip install -e ".[analyzers]"
Tests
pip install -e ".[test]"
python -m pytest tests/ -v
Requirements
- Python 3.11+
- git
Quality gates
Arbiter enforces quality checks in CI.
arbiter score . --fail-under 90 --json
arbiter diff . --base main --fail-under 80
Common gotchas
- Use
arbiter-scorepackage name to avoid installing the wrong package. - Run from repository root for consistent path reporting and results.
- Optional analyzers improve signal quality, but many core checks run without the analyzer extras installed.
License
Apache 2.0 — see LICENSE.
Built by HUMMBL.
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 arbiter_score-1.1.0.tar.gz.
File metadata
- Download URL: arbiter_score-1.1.0.tar.gz
- Upload date:
- Size: 220.6 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/6.1.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
6ae1d7f380e6c6ee75bc51106c35745c6ae9c5494b5c0754d313bb0fa45687ad
|
|
| MD5 |
2420fd704747f12ab6753e62f80f1e42
|
|
| BLAKE2b-256 |
6fcc28084198e37169c18d4004eec73a27a431b6502e3adc5545f73b21cf9590
|
Provenance
The following attestation bundles were made for arbiter_score-1.1.0.tar.gz:
Publisher:
publish.yml on hummbl-dev/arbiter
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
arbiter_score-1.1.0.tar.gz -
Subject digest:
6ae1d7f380e6c6ee75bc51106c35745c6ae9c5494b5c0754d313bb0fa45687ad - Sigstore transparency entry: 2215201462
- Sigstore integration time:
-
Permalink:
hummbl-dev/arbiter@5e5c5943c6036cab3db86444406e209856b46dca -
Branch / Tag:
refs/tags/v1.1.0 - Owner: https://github.com/hummbl-dev
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
self-hosted -
Publication workflow:
publish.yml@5e5c5943c6036cab3db86444406e209856b46dca -
Trigger Event:
release
-
Statement type:
File details
Details for the file arbiter_score-1.1.0-py3-none-any.whl.
File metadata
- Download URL: arbiter_score-1.1.0-py3-none-any.whl
- Upload date:
- Size: 163.9 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/6.1.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
bd7acef1f32b70297febe8255da61ec66a5f1786d0e8911e946e33ebb902fad9
|
|
| MD5 |
8afb41aa98b7b04de70cb48dbef2e4be
|
|
| BLAKE2b-256 |
685da30a39bc35580fbc32da465e8156b9feaa1f20efd5033c9976bd709b7891
|
Provenance
The following attestation bundles were made for arbiter_score-1.1.0-py3-none-any.whl:
Publisher:
publish.yml on hummbl-dev/arbiter
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
arbiter_score-1.1.0-py3-none-any.whl -
Subject digest:
bd7acef1f32b70297febe8255da61ec66a5f1786d0e8911e946e33ebb902fad9 - Sigstore transparency entry: 2215201501
- Sigstore integration time:
-
Permalink:
hummbl-dev/arbiter@5e5c5943c6036cab3db86444406e209856b46dca -
Branch / Tag:
refs/tags/v1.1.0 - Owner: https://github.com/hummbl-dev
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
self-hosted -
Publication workflow:
publish.yml@5e5c5943c6036cab3db86444406e209856b46dca -
Trigger Event:
release
-
Statement type: