Rung — AI Agent Governance Audit
Know how much authority to give coding agents before they touch your repository.
Rung evaluates 11 repository-evidence checks informed by NIST AI RMF, agents.md, SLSA, and published engineering practices. It uses a six-state evidence maturity model (absent, claimed, detected, enforced, verified, unobservable), then reports a repository governance-evidence score, quality gate, maximum recommended agent authority, and actionable next steps.
Quick start
# Clone
git clone https://github.com/edoworks/rung.git
cd rung
# Run against your repo
python3 -m rung --root /path/to/your/repo
# JSON output for CI
python3 -m rung --root /path/to/your/repo --json
# Dependency-free standalone artifact
python3 rung-cli.py --root /path/to/your/repo --json
The original rung --root ... invocation remains the normal audit interface.
Reproducible receipts
Run Rung from an independently installed, version-pinned distribution. Do not install or execute code from the repository being audited. Both output paths must be outside their audited checkout and must not already exist.
# Create canonical RungVerificationReceipt/v1 evidence.
rung verify --root /path/to/clean-checkout --receipt /safe/outside/receipt.json
# Re-run from a separate clean checkout and write a distinct observation.
rung replay --root /path/to/independent-clean-checkout \
--receipt /safe/outside/receipt.json \
--observation /safe/outside/observation.json
verify requires an exact clean Git HEAD, including no untracked files, a
supported GitHub origin, and no tracked symlinks or submodules. Every regular
tracked file is compared with its HEAD blob even when index flags hide changes;
the audit reads only verified Git objects materialized into a private directory.
HTTPS, SCP-style SSH, and ssh:// GitHub origins normalize to the lowercase
identity github.com/owner/repository. The receipt binds that identity, the
commit and tree object IDs, UTC Git committer timestamp, AuditResult schema and
digest, gate, authority, Rung version, engine identity, stable structured
arguments, and limitations.
Receipt and observation files are strict, canonical UTF-8 JSON. Unknown or
duplicate members, noncanonical hashes, invalid fields, and inputs over 1 MiB
are rejected. Each document has a SHA-256 digest computed over canonical JSON
excluding its own digest member. Replay never changes the receipt. It returns
0 for a match, 2 for structurally valid evidence that does not match, and
1 for malformed input or a runtime failure. A valid mismatch still produces
an immutable replay observation with deterministic mismatch categories;
malformed input produces no trusted observation.
The engine_artifact_sha256 bytes are defined precisely as the standalone
generator's bundled-source stream: for every rung/**/*.py in sorted path
order, UTF-8 encode its normalized module name, NUL, LF-normalized UTF-8 source,
and NUL. The generated rung-cli.py recomputes this digest from the actual
read-only source map its loader executes; modular installs compute the same
value from installed package sources.
What it checks
| # | Check | Weight | Blocking? | Source |
|---|---|---|---|---|
| 1 | Agent policy file (AGENTS.md) | 15 | Yes | agents.md, GitHub Copilot docs |
| 2 | Build & test commands declared | 15 | Yes | openai/codex AGENTS.md |
| 3 | Verification gate before commit | 10 | Yes | NIST AI RMF, Anthropic multi-agent |
| 4 | Source-of-truth registry | 10 | No | NIST AI RMF, IBM ADLC |
| 5 | Evidence & traceability | 10 | No | IBM ADLC, SLSA v1.2 |
| 6 | Session ledger / status | 5 | No | Anthropic, IBM ADLC |
| 7 | File-size discipline (non-scoring) | 0 | No | openai/codex AGENTS.md |
| 8 | Agent attribution (Generated-by) | 5 | No | apache/airflow AGENTS.md |
| 9 | Security "Never" rules | 10 | Yes | NIST AI RMF, apache/airflow |
| 10 | Independent review requirement | 5 | No | Anthropic, NIST AI RMF |
| 11 | Cyclic verification loop | 5 | No | Anthropic multi-agent |
Total: 100 points (file-size discipline is non-scoring). Quality gate
passes only if all blocking checks reach at least detected state.
Evidence states
Every check returns one of six evidence states instead of boolean pass/fail:
| State | Meaning |
|---|---|
absent |
Not found at all |
claimed |
Documented but not confirmed by evidence |
detected |
Found in public repository contents |
enforced |
Confirmed as enforced (requires owner permissions) |
verified |
Independently verified (requires owner permissions) |
unobservable |
Cannot be determined from public evidence alone |
Authority recommendations
Based on evidence states, Rung recommends a maximum agent authority:
| Level | Meaning |
|---|---|
unsafe |
Do not use autonomous agents |
local_only |
Local changes only, no push/merge |
pr_only_provisional |
Pull requests only, not autonomous merge |
owner_evidence_required |
Cannot verify enforcement from public evidence |
Scoring
| Grade | Score | Label |
|---|---|---|
| A | ≥ 90 | Governance-Optimized |
| B | 80–89 | Managed |
| C | 70–79 | Defined |
| D | 60–69 | Repeatable |
| E | < 60 | Initial / Absent |
Install
From source
git clone https://github.com/edoworks/rung.git
cd rung
python3 -m rung --root .
Package registry
The release workflow is configured to publish tagged releases to PyPI through GitHub Actions OIDC Trusted Publishing. For a version observed on PyPI, install the exact version rather than an unbounded dependency:
python3 -m pip install "rung-audit==0.3.1"
If that version is not yet visible on PyPI, install from a pinned source revision or use the standalone artifact. A Git tag or workflow run alone is not proof that registry publication succeeded.
Standalone artifact
rung-cli.py is generated from the canonical modular package and runs with
Python 3.10+ without installation or third-party dependencies. Contributors
must regenerate and verify it after changing rung/:
python3 scripts/build_single_file.py
python3 scripts/build_single_file.py --check
The generator embeds a digest of all package sources and emits deterministic
bytes. Do not edit rung-cli.py directly.
Release validation
Contributors can build and validate the complete release artifact set locally:
python3 scripts/validate_release.py --dist dist
Agent skill
Install the reproducible-verification workflow with the skills CLI:
npx skills add edoworks/rung --skill rung-reproducible-verification
The skill requires an independently installed, pinned Rung engine, a receipt from one clean checkout, and replay from another. Canonical JSON, not generated model prose, is the authoritative evidence.
Use in CI
Rung's GitHub Action is planned but not yet published to Marketplace. After a tagged release, pin the action to a release tag or commit SHA and use its read-only interface:
- uses: edoworks/rung@v0.3.1
with:
minimum-score: 70
require-gate: true
Receipt creation and replay require descriptor-relative filesystem semantics and therefore fail closed on native Windows. Repository audits remain supported on Windows; use Linux, macOS, or WSL for receipt mode.
For source-based CI before publication:
# .github/workflows/governance-audit.yml
name: Governance Audit
on: [pull_request]
jobs:
audit:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Setup Python
uses: actions/setup-python@v5
with:
python-version: '3.11'
- name: Run Rung governance audit
run: |
pip install .
python3 -m rung --root . --json > audit.json
SCORE=$(python3 -c "import json; print(json.load(open('audit.json'))['score'])")
echo "Governance score: $SCORE/100"
if [ "$SCORE" -lt 70 ]; then echo "::error::Governance score below threshold (70)"; exit 1; fi
Cited sources
Rung is informed by standards and industry practices. Not every check is directly derived from a standard.
- agents.md — Linux Foundation / AAIF cross-vendor agent policy spec
- GitHub Copilot repository custom instructions
- NIST AI Risk Management Framework 1.0
- Anthropic — How we built our multi-agent research system
- openai/codex AGENTS.md — 500/800 LoC thresholds
- apache/airflow AGENTS.md — Generated-by attribution, Never-rules
- IBM — Agent Development Lifecycle
- SLSA v1.2 — Supply-chain Levels for Software Artifacts
- ISO/IEC 42001:2023 — AI management system standard
- OpenSSF Scorecard — Check-specific risk explanation model
Limitations
A public, accountless scan cannot inspect some important enforcement
settings. GitHub's branch-protection API requires Administration read
permission, even for reads on public repositories. Rung therefore labels
these controls as unobservable rather than passing or failing them.
Rung's production audit is a deterministic, non-LLM scanner and does not install or execute target-repository code. It remains an automated public-only evidence assessment: unobservable controls and resulting authority limits are preserved in receipts and replay observations. Unsigned reproducibility evidence is not attestation, certification, enforcement proof, correctness proof, compliance, or legal advice.
Sponsor
If Rung helps your team, consider supporting Edoworks OSS.
License
MIT
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 rung_audit-0.3.1.tar.gz.
File metadata
- Download URL: rung_audit-0.3.1.tar.gz
- Upload date:
- Size: 43.3 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
0745ee44867cac684e3fbbc2e20d9b0b8fea456a88046be20988cdc4da6fd9bb
|
|
| MD5 |
a07a5c239adf433effb7916ee6364347
|
|
| BLAKE2b-256 |
2667bd915f491abfcab265400ece5afeb773d750747a8584f9caf5d4ef1371fe
|
Provenance
The following attestation bundles were made for rung_audit-0.3.1.tar.gz:
Publisher:
release.yml on edoworks/rung
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
rung_audit-0.3.1.tar.gz -
Subject digest:
0745ee44867cac684e3fbbc2e20d9b0b8fea456a88046be20988cdc4da6fd9bb - Sigstore transparency entry: 2593175665
- Sigstore integration time:
-
Permalink:
edoworks/rung@a91e92625b49b2d356bc9798e9ae5c68301779c5 -
Branch / Tag:
refs/tags/v0.3.1 - Owner: https://github.com/edoworks
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@a91e92625b49b2d356bc9798e9ae5c68301779c5 -
Trigger Event:
push
-
Statement type:
File details
Details for the file rung_audit-0.3.1-py3-none-any.whl.
File metadata
- Download URL: rung_audit-0.3.1-py3-none-any.whl
- Upload date:
- Size: 40.5 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
34b9275c1f5718cbbf1fa3563aad61a16ac890efdf68689368e708b7237cf25e
|
|
| MD5 |
b3716d537a3395fb125acd733afb768f
|
|
| BLAKE2b-256 |
9daf2872673c9d5f34a62783cd10781f6797e5123ced2932d09b5c327dd316d0
|
Provenance
The following attestation bundles were made for rung_audit-0.3.1-py3-none-any.whl:
Publisher:
release.yml on edoworks/rung
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
rung_audit-0.3.1-py3-none-any.whl -
Subject digest:
34b9275c1f5718cbbf1fa3563aad61a16ac890efdf68689368e708b7237cf25e - Sigstore transparency entry: 2593175767
- Sigstore integration time:
-
Permalink:
edoworks/rung@a91e92625b49b2d356bc9798e9ae5c68301779c5 -
Branch / Tag:
refs/tags/v0.3.1 - Owner: https://github.com/edoworks
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@a91e92625b49b2d356bc9798e9ae5c68301779c5 -
Trigger Event:
push
-
Statement type: