Deterministic, fail-closed AI code governance. Every commit is sworn.
Project description
Sworn
Deterministic, fail-closed AI code governance. Every commit is sworn.
Sworn is a Python CLI that installs Git pre-commit hooks in the repository's effective hooks path, runs a configurable gate pipeline on local commit checks and CI diff checks, and produces tamper-evident evidence logs.
Cross-tool enforcement for any AI coding tool that commits through git.
Governance Summary
Sworn gives teams a deterministic gate before commit that blocks risky changes and produces auditable evidence for compliance programs.
- It solves ambiguous AI-code governance by enforcing explicit, deterministic rules.
- It guarantees fail-closed behavior on signature, hashing, and CI enforcement failures.
- It provides compliance-support reporting (CMMC-focused in 0.4.0).
- It does not certify compliance, replace a C3PAO, or provide a PKI/identity trust service.
- Engineering value: predictable commit outcomes, stronger evidence retention, and simpler policy enforcement.
- Security value: tamper-evident logs, strict fail-closed semantics, and scoped threat assumptions.
- Compliance value: explicit control mapping and explicit “support-only” interpretation.
For full threat model and scope boundaries:
SECURITY.mdCOMPLIANCE_SCOPE.mdGOVERNANCE_OVERVIEW.mdRELEASE_PROCESS.mddocs/config.mddocs/DEPLOYMENT.md
Governance Architecture
Sworn is organized across four layers:
- Runtime Enforcement → pipeline, resolver, and kernels.
- Evidence Integrity → canonical JSON, hash-chain, and signatures.
- Compliance Interpretation → CMMC kernels and report mapping.
- Release Governance → version discipline and evidence retention.
See GOVERNANCE_OVERVIEW.md for the full model and cross-layer bindings.
Install
pip install sworncode
Quick Start
# Initialize in any git repo
cd your-repo
sworn init
# That's it. Local commits in this repo now run through Sworn.
# For team-wide fail-closed posture, require the CI gate in docs/DEPLOYMENT.md.
# Try committing a file in a sensitive path:
mkdir -p crypto
echo "secret = 'key'" > crypto/vault.py
git add crypto/vault.py
git commit -m "test"
# → SWORN BLOCKED — Security surface: crypto/vault.py
What It Does
Sworn runs a 5-stage gate pipeline during local commit checks and CI diff checks:
- Identity — Detects the actor and AI tool from environment
- Security — Blocks commits touching sensitive paths (configurable)
- Allowlist — Enforces file access control (opt-in)
- Kernels — Runs constraint kernels (built-in + custom)
- Evidence — Logs everything to
.sworn/evidence.jsonl
Every stage is deterministic. No AI in the governance loop. No network calls. No probabilistic analysis. A gate either passes or blocks.
For team-wide fail-closed posture, treat local hooks as developer fast-fail and make the CI gate a required status check. See docs/DEPLOYMENT.md.
Commands
sworn init # Initialize sworn in a git repo
sworn check # Run gate pipeline (called by pre-commit hook)
sworn report # Show evidence summary
sworn report --json # Machine-readable output
sworn report --cmmc # CMMC evidence-support report
sworn status # Show initialization and config state
sworn verify # Verify evidence chain integrity
python -m sworn # Run command through module entrypoint
sworn --version # Print version
Configuration
After sworn init, edit .sworn/config.toml:
[security]
# Regex patterns for sensitive paths (case-insensitive)
patterns = [
'(^|/)(crypto|auth|gates|licensing|keys)/',
'(^|/)secrets?/',
'\.env$',
]
[allowlist]
# Only these glob patterns allowed (empty = all allowed)
files = []
[kernels]
# Built-in kernels
security = true
allowlist = true
audit = true
# Custom kernels
custom_dir = ".sworn/kernels"
Custom Kernels
Write a Python file in .sworn/kernels/ with an evaluate() function:
from sworn.kernels.sdk import KernelInput, KernelResult
def evaluate(kernel_input: KernelInput) -> KernelResult:
# Your logic here
if some_condition:
return KernelResult(
decision="BLOCKED",
triggered_rules=["my_rule"],
evidence_summary=["Blocked because..."],
)
return KernelResult(decision="PASS")
Evidence
Every gate run produces a JSONL entry with SHA256 hash chain:
sworn report
# SWORN EVIDENCE REPORT
# ========================================
# Total commits gated: 47
# Passed: 43
# Blocked: 4
# Pass rate: 91.5%
# Chain integrity: VALID
sworn verify
# Chain: VALID
# Chain valid: 47 entries
Security Posture & Rule-2 Scope
Sworn’s evidence signing and verification layer is Security-Critical.
Rule-2 scoped behavior includes:
src/sworn/evidence/signing.pysrc/sworn/evidence/log.py- CLI commands in
src/sworn/cli.pythat verify evidence - CI diff-base resolution in CI mode
This behavior is fail-closed:
- If signing is enabled and signing fails, the pipeline blocks.
- If verification fails,
sworn verifyreportsBROKEN. - Missing signature in signed mode is a violation.
- If base resolution fails in CI compliance mode, the check exits fail-closed.
Deterministic Resolution Contract
Sworn resolution semantics are intentional and fixed:
- Structural gates execute first.
- Kernels execute after structural gates.
- If any kernel returns
BLOCKED, final result isBLOCKED. - Primary reason is deterministic by lexical sort of blocked kernel names.
- All blockers are preserved in
resolution_trace. - No precedence overrides exist.
This design favors clarity and auditability over configurability.
Kernel Contract (Mandatory for Contributors)
Sworn executes kernels even when structural gates already block.
All kernels MUST:
- Be pure (no file writes, network calls, or subprocesses)
- Be side-effect free
- Tolerate partial or failed gate states
- Not depend on a prior structural
PASS
Violation is a contract breach and a security defect.
Evidence Signing Model
Canonicalization
Sworn signs a deterministic canonical JSON form:
- UTF-8 encoding
json.dumps(obj, sort_keys=True, separators=(",", ":"), ensure_ascii=False)signature=""placeholder during canonicalization- No trailing newline
- Stable, deterministic field ordering
Canonicalization rules are versioned. Any change increments the internal signing/evidence schema and requires compatibility handling.
Integrity vs Trust
Repo-Local Integrity (Default)
This mode detects tampering after an entry is written, chain discontinuity, and key mismatch relative to repo-local keys.
It does not prove:
- Organizational authority or approval
- Identity beyond Git metadata
- Secure private-key custody
It proves repository-local tamper-evidence.
Org-Trust Mode (Recommended for compliance)
To elevate signing into attestation quality:
- Pin public keys via protected branches / CODEOWNERS / policy repo
- Restrict key updates with branch protections and owner controls
- Keep private keys outside the repo working tree (
KMS, Vault, keychain, or secret manager) - Run explicit rotation/retirement procedures
Sworn verifies signatures; it does not manage organizational assurance by itself.
Key Layout & Migration
Current layout:
.sworn/
keys/
active.key # private key
<key_id>.pub # committed public key
Legacy layout:
.sworn/signing.key
Behavior:
- If
.sworn/signing.keyexists and.sworn/keys/active.keydoes not, Sworn blocks when signing is enabled and emits actionable migration instructions. - Sworn does not silently continue.
- Sworn does not auto-migrate without explicit user action.
- Upgrades from legacy layout require explicit migration guidance before signing is used.
CI Enforcement (Fail-Closed)
Sworn CI mode uses github.event.pull_request.base.sha and fail-closes if resolution is not possible.
- If base SHA resolves, diff is computed deterministically against HEAD.
- If base SHA cannot be resolved in compliance mode, check fails with remediation guidance.
- Silent fallback is not permitted.
Workflow requirement:
actions/checkout@v4
with:
fetch-depth: 0
CMMC Evidence Scope
Sworn’s CMMC pack provides evidence-support mappings to selected NIST SP 800-171 controls and explicitly documented determination statements.
It does not certify compliance, replace a C3PAO, or guarantee assessment outcome.
Release Readiness Checklist
Before tagging any release:
- Clean reproducible install (
python -m pip install .[dev,signing]in a clean environment on Python 3.10-3.13) - Full pytest suite green
- Signing-enabled tamper detection validated
- CI base-resolution failure path validated
- Legacy key migration path validated
- Version bump consistent across package metadata and documentation
- Release evidence generated and reviewed before signed tag capture
- Working tree clean during final tag capture
Known Residual Risks
- Repo-local signing is not equivalent to organizational attestation.
- Kernel purity is contract-enforced; runtime sandboxing is out of scope today.
- CI enforcement depends on correct workflow configuration and checkout depth.
- Migration from legacy key layouts still requires explicit user action.
Requirements
- Python 3.10+
- Git
- Zero runtime dependencies (tomli included in stdlib from 3.11)
License
Apache 2.0 — Centennial Defense Systems
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 sworncode-0.4.0.tar.gz.
File metadata
- Download URL: sworncode-0.4.0.tar.gz
- Upload date:
- Size: 38.4 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.14.2
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
0172f9d4db2b06ab338f7a54e5c11434e77ac7123ad30439445d9dd489b24f78
|
|
| MD5 |
6c33e785f6c08b89f4466abe837a2c2b
|
|
| BLAKE2b-256 |
b6eb5d828d002a265dcc0821697103304ba16c9c6a75db9b8d98f89ba0fbe2da
|
File details
Details for the file sworncode-0.4.0-py3-none-any.whl.
File metadata
- Download URL: sworncode-0.4.0-py3-none-any.whl
- Upload date:
- Size: 39.4 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.14.2
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
0f5357f112b33cd585b516b309d9abc136e7a105f7e7dc43dd1ec572cba33fa7
|
|
| MD5 |
7b508c4b3ec677a49d759a9a8306391d
|
|
| BLAKE2b-256 |
27428ac14eca1e691e6a60145e7714adebd19d53c8a4f3482157f6d7cca8f4ea
|