Deterministic, polyglot code quality scoring with governance integration
Project description
Arbiter
Agent-aware code quality scoring for multi-agent codebases.
In 2026, code is written by fleets of AI agents. Arbiter knows who wrote each line -- human or AI -- and scores quality accordingly.
Learn more at hummbl.io.
Repository health, validation, and stewardship expectations are tracked in docs/REPO_HEALTH.md.
Quick Start -- 5 Minutes
pip install "arbiter-score[analyzers]"
arbiter score .
Example output:
Arbiter Scorecard: my-repo (main)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Overall: 87.3 → Grade: B
By Analyzer:
Lint 91.2 (ruff — 3 style issues)
Security 95.0 (bandit — clean)
Complexity 78.5 (radon — 2 functions > complexity 10)
Dead Code 92.0 (vulture — 1 unused import)
By Agent (last 30 days):
claude-code 89.1 (42 commits, 1,240 LOC)
codex 85.3 (18 commits, 890 LOC)
human 92.7 (5 commits, 120 LOC)
Top Issues:
• src/api/routes.py:47 complexity C (15) — agent: codex
• src/utils.py:12 unused import os — agent: claude-code
• src/models.py:89 line too long — agent: codex
Run `arbiter serve` to view the full dashboard.
Install
The Python distribution is arbiter-score; the installed CLI command is arbiter.
Do not install the separate PyPI project named arbiter for this tool.
pip install arbiter-score # core (stdlib only)
pip install "arbiter-score[analyzers]" # + ruff, radon, vulture, bandit
# Or from source
git clone https://github.com/hummbl-dev/arbiter.git && cd arbiter
pip install -e ".[analyzers]"
Usage
# Quick score -- no persistence, instant feedback
arbiter score /path/to/repo
# Full analysis with per-commit agent attribution
arbiter analyze /path/to/repo
# Agent leaderboard -- who writes the best code?
arbiter agents
# Start the dashboard (single HTML file, no build step)
arbiter serve --port 8080
What It Scores
Arbiter wraps tools you already trust and combines them into a deterministic composite score:
| Analyzer | Tool | Weight | What It Finds |
|---|---|---|---|
| Lint | ruff | 35% | Style violations, import errors, bugbear patterns |
| Security | bandit | 30% | Hardcoded secrets, shell injection, dangerous patterns |
| Complexity | radon | 35% | Cyclomatic complexity (grade A-F per function) |
| Dead Code | vulture | penalty | Unused functions, imports, variables |
| Duplication | AST hash | penalty | Near-duplicate function bodies |
| Semgrep | semgrep | opt-in | Custom rule enforcement (enable via config) |
Scoring: 100 - (penalty / LOC) * normalization. Grades: A (90+) | B (80+) | C (70+) | D (60+) | F (<60).
What Makes Arbiter Different
| Feature | Traditional Tools | Arbiter |
|---|---|---|
| Agent attribution | None | First-class: tracks Claude, Codex, Gemini, Copilot, humans |
| Per-commit scoring | Repo-wide only | Scores each commit's changed files individually |
| Diff analysis | N/A | Score only what changed in a PR/branch |
| Agent-specific gates | N/A | Different quality thresholds per agent trust tier |
| Dashboard | SaaS login | Single HTML file with per-agent timelines and fleet view |
| Dependencies | Heavy | Analysis tools only; core is stdlib Python |
CLI Reference
arbiter analyze <repo> # Full analysis + per-commit scoring + persist
arbiter score <repo> [--json] [--exclude] # Quick score (no persist)
arbiter diff <repo> [--base main] [--json] # Score changed files vs base branch
arbiter agents # Agent leaderboard
arbiter trend [--days 30] # Quality trend
arbiter worst [--limit 20] # Worst files
arbiter commits [--agent claude] # Recent commits with scores
arbiter audit-fleet <directory> # Audit all repos in a directory
arbiter triage # Auto-classify repos: green/yellow/red/archive
arbiter fix <repo> [--dry-run] # Auto-fix ruff findings + before/after score
arbiter serve [--port 8080] # API + dashboard
Tests
pip install ".[test]"
PYTHONPATH=src python -m pytest tests/ -v
Quality Gate
Arbiter grades itself on every push and PR. The CI runs arbiter score . and fails if the score drops below 90 (A grade).
# Run the same check locally
arbiter score . --fail-under 90
# Score only your changed files against main
arbiter diff . --base main --fail-under 80
Requirements
- Python 3.11+
- git (for historian)
- Optional: ruff, radon, vulture, bandit (install via
[analyzers]extra)
HUMMBL Ecosystem
Part of the HUMMBL cognitive AI architecture:
- hummbl-governance -- Governance primitives that Arbiter scores against
- base120 -- 120 mental models for structured reasoning
- hummbl-agent -- Governed control plane for AI agent systems
- hummbl-bibliography -- Bibliography for the HUMMBL cognitive framework
- mcp-server -- MCP server for AI agent integration
Learn more at hummbl.io.
License
Apache 2.0 -- see LICENSE.
Built by HUMMBL LLC from production experience coordinating Claude, Codex, Gemini, and human engineers on a 14,000+ test codebase.
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 arbiter_score-1.0.0.tar.gz.
File metadata
- Download URL: arbiter_score-1.0.0.tar.gz
- Upload date:
- Size: 197.4 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.14.5
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
39dc2730d12c8374905223567c0a80a59a8c1e6a746b5aa79c59a279e5a81c69
|
|
| MD5 |
041bb6605af6c13a85d464473b4b2a44
|
|
| BLAKE2b-256 |
3221f3f92d200e864ac3e5a6e64733eafc3d75624118fdc0dcb740f00c237045
|
File details
Details for the file arbiter_score-1.0.0-py3-none-any.whl.
File metadata
- Download URL: arbiter_score-1.0.0-py3-none-any.whl
- Upload date:
- Size: 144.2 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.14.5
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
c65df09603e128ea87d1fe17e4d024e5cff6b895b7e0c9419093ad85dbb62a39
|
|
| MD5 |
2ef499ec13e222d5ec9c09d1a0a20af5
|
|
| BLAKE2b-256 |
c56adc00e4765e04024d67553a38d0727172cff0583e2bd4d79776a6effdffc1
|