A CLI tool for AI governance through verifiable promises.
Project description
praevisio
A CLI tool for AI governance through verifiable promises.
This repository follows Readme-Driven Development and an outside-in approach. The white paper is the source of truth for behavior and outcomes we intend to deliver; we implement from the boundary inward until the tool matches the spec.
- White paper: docs/white-paper.md (rendered by Sphinx)
- Built docs entry point: docs/index.md
Install (PyPI)
pip install praevisio
Create a config:
praevisio install --config-path .praevisio.yaml
Run an evaluation:
praevisio evaluate-commit . --config .praevisio.yaml --json
Run the CI gate:
praevisio ci-gate --config .praevisio.yaml --severity high --fail-on-violation
CI quickstart
Example GitHub Actions workflow:
name: Praevisio Governance Gate
on:
pull_request:
branches: [main]
jobs:
governance-gate:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v5
with:
python-version: "3.11"
- uses: actions/setup-node@v4
with:
node-version: "20"
- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install praevisio
npm install -g promptfoo
- name: Generate config if missing
run: |
praevisio install --config-path .praevisio.yaml
- name: Run governance gate
run: |
praevisio ci-gate \
--severity high \
--fail-on-violation \
--output logs/ci-gate-report.json \
--config .praevisio.yaml
- name: Upload artifacts
uses: actions/upload-artifact@v4
if: always()
with:
name: praevisio-run
path: |
logs/ci-gate-report.json
.praevisio/runs/**
.praevisio.yaml template
evaluation:
promise_id: llm-input-logging
threshold: 0.95
severity: high
thresholds:
high: 0.95
medium: 0.90
pytest_targets:
- tests/test_logging.py
semgrep_rules_path: governance/evidence/semgrep_rules.yaml
semgrep_callsite_rule_id: llm-call-site
semgrep_violation_rule_id: llm-call-must-log
run_dir: .praevisio/runs
hooks: []
Quickstart (uv)
-
Install uv (see https://docs.astral.sh/uv/)
-
Create a virtual environment and install dependencies
- uv venv
- uv sync --all-groups # installs docs dependencies too
- Build the docs
- uv run sphinx-build -b html docs docs/_build/html
- Open docs/_build/html/index.html in your browser
Alternative (pip/venv)
- Create and activate a virtual environment
- macOS/Linux
- python3 -m venv .venv
- source .venv/bin/activate
- Windows (PowerShell)
- py -3 -m venv .venv
- .venv\Scripts\Activate.ps1
- Install dependencies
- pip install -e .
- Build the docs
- make -C docs html
- Open docs/_build/html/index.html in your browser
Build and publish (uv)
- Build artifacts (sdist/wheel):
- uv build
- Publish to PyPI (requires a token):
- uv publish --token $PYPI_API_TOKEN
Architecture overview
Layers
- Domain (src/praevisio/domain): Core concepts and rules
- Entities: EvaluationResult, StaticAnalysisResult, CommitContext
- Value Objects: HookType, ExitCode, FilePattern
- Ports: StaticAnalyzer, TestRunner, ConfigLoader, PromiseLoader
- Application (src/praevisio/application): Use cases/orchestration
- EvaluationService: evidence collection + ABDUCTIO evaluation
- PraevisioEngine: orchestration and gating
- InstallationService: write a default .praevisio.yaml
- services.py: compatibility re-exports for older imports
- Infrastructure (src/praevisio/infrastructure): Adapters to ports
- SemgrepStaticAnalyzer, SubprocessPytestRunner, YamlConfigLoader, YamlPromiseLoader
- EvidenceStore for audit artifacts
- Presentation (src/praevisio/presentation): CLI
- Typer-based CLI (praevisio). Commands map to application services
Configuration as a domain concept
-
Canonical file: .praevisio.yaml
-
Example:
evaluation: promise_id: llm-input-logging threshold: 0.95 pytest_targets: - tests/test_logging.py semgrep_rules_path: governance/evidence/semgrep_rules.yaml semgrep_callsite_rule_id: llm-call-site semgrep_violation_rule_id: llm-call-must-log hooks: []
Error handling
- Configuration errors are surfaced by the CLI with non-zero exit codes.
- Evaluation errors surface in the JSON output under
details.promise_erroror tool-specific error fields.
Dependency injection
- Application services accept ports via constructor injection for easy testing and swapping infrastructure adapters.
BDD with Behave
- Install dev dependencies (includes behave):
- uv sync --group dev # or uv sync --all-groups
- Run the feature tests:
- uv run behave -f progress
Example feature implemented
- Run pre-commit hooks: Skip hooks when no files match pattern
- Given a repository with staged Python files (only .py)
- And a hook configured for "*.js"
- When I run pre-commit hooks
- Then the hook should be skipped
Architecture notes:
- The project uses a layered architecture:
- domain: core business objects and abstractions (no infra/presentation deps)
- application: orchestrates use cases via domain and ports
- infrastructure: adapter implementations (e.g., repositories)
- presentation: CLI/HTTP adapters (to be added)
- Application services return domain objects or simple data structures, keeping them reusable across interfaces.
CLI entry point
- praevisio (Typer-based):
- praevisio install --config .praevisio.yaml
- praevisio evaluate-commit . --config .praevisio.yaml --json
- praevisio ci-gate --config .praevisio.yaml --severity high --fail-on-violation
- praevisio replay-audit --latest
- python -m praevisio
Development approach
- Readme-Driven Development: We capture intent and interfaces up front in this README and the white paper. We will keep both current as we iterate.
- Outside-in: We will define user-visible CLI behavior first, then drive implementation via tests and thin slices until the internals satisfy the external contracts.
- Documentation-first: Sphinx is set up from day one; every significant change should be reflected in the docs.
Documentation system
- Sphinx with MyST Markdown allows us to keep the white paper in Markdown while using Sphinx features.
- Theme: sphinx_rtd_theme
- Extensions enabled for future self-documentation work:
- autodoc and napoleon (for API docs from docstrings)
- viewcode (source links)
- todo (TODO directives can be toggled in output)
- autosectionlabel (stable xrefs)
- intersphinx (cross-project linking)
Structure:
- docs/index.md: Site landing page and ToC
- docs/white-paper.md: Includes the white_paper.md via Sphinx include
- white_paper.md: Your authored white paper at the repo root
Build commands:
- make -C docs html
- Or directly: sphinx-build -b html docs docs/_build/html
Next steps (planned)
- Multi-promise evaluation and per-promise gating
- Collector plugins beyond pytest/semgrep
- Calibrated evidence weighting and tuning guides
Contributing
- Keep changes small and focused on an outcome.
- Update docs alongside code changes. If an interface changes, update examples in the README and white paper sections that reference it.
- Prefer tests that exercise the CLI surface area.
License
- TBD by the repository owner. No license is included yet.
Project details
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 praevisio-0.1.3.tar.gz.
File metadata
- Download URL: praevisio-0.1.3.tar.gz
- Upload date:
- Size: 19.2 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
6c9ebb8ea1fadd499145cabca46287aeedd07da683e61c3e7e3ee96c5de17809
|
|
| MD5 |
a9c0c5e0843ce14d97a93ef5522187fc
|
|
| BLAKE2b-256 |
2d6a0c7cb2badcf532670a1ce714e1ebc9c4f4325ed5db2fb03dad937614c2e9
|
Provenance
The following attestation bundles were made for praevisio-0.1.3.tar.gz:
Publisher:
publish.yml on Promise-Foundation/praevisio
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
praevisio-0.1.3.tar.gz -
Subject digest:
6c9ebb8ea1fadd499145cabca46287aeedd07da683e61c3e7e3ee96c5de17809 - Sigstore transparency entry: 774234830
- Sigstore integration time:
-
Permalink:
Promise-Foundation/praevisio@424c378f7c4eab97c22f0b72c9855b75e1a6fa0d -
Branch / Tag:
refs/tags/v0.1.3 - Owner: https://github.com/Promise-Foundation
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@424c378f7c4eab97c22f0b72c9855b75e1a6fa0d -
Trigger Event:
push
-
Statement type:
File details
Details for the file praevisio-0.1.3-py3-none-any.whl.
File metadata
- Download URL: praevisio-0.1.3-py3-none-any.whl
- Upload date:
- Size: 5.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 |
cce42655a7b7f442a8a50dd9ee8ba7f5004d4035d6cb1c0114ba33f0ec809cc3
|
|
| MD5 |
b763c9ae71cfe2d79770379ec534d801
|
|
| BLAKE2b-256 |
73a9421ca21d321336e9aeb9440c3c24ed67046001ea47a576d422da02ec7f2b
|
Provenance
The following attestation bundles were made for praevisio-0.1.3-py3-none-any.whl:
Publisher:
publish.yml on Promise-Foundation/praevisio
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
praevisio-0.1.3-py3-none-any.whl -
Subject digest:
cce42655a7b7f442a8a50dd9ee8ba7f5004d4035d6cb1c0114ba33f0ec809cc3 - Sigstore transparency entry: 774234832
- Sigstore integration time:
-
Permalink:
Promise-Foundation/praevisio@424c378f7c4eab97c22f0b72c9855b75e1a6fa0d -
Branch / Tag:
refs/tags/v0.1.3 - Owner: https://github.com/Promise-Foundation
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@424c378f7c4eab97c22f0b72c9855b75e1a6fa0d -
Trigger Event:
push
-
Statement type: