Continuous, auditable NIS2 compliance evidence. Open-core.
Project description
Probity
Continuous, auditable NIS2 compliance evidence. Open-core.
Probity turns regulatory compliance from a once-a-year static document into continuous machine-checked evidence. It connects to the systems you already run (identity, cloud, backups, dependencies), evaluates them against concrete NIS2 technical controls, and produces audit-ready findings — every day, not once.
Probity (English): proven integrity — honesty and correctness demonstrated by evidence, not merely claimed. That is exactly what this tool produces for your compliance posture: integrity you can prove on demand.
Why
EU regulation (NIS2, DORA, AI Act, CRA) now obliges thousands of mid-sized organisations to prove cybersecurity risk management. Today they prove it with consultants and spreadsheets: expensive, manual, and stale the day after the audit. Probity closes that gap with compliance-as-code.
How it works
Connector ──► Fact ──► Control ──► Finding (+ Evidence) ──► Report
(reads a (typed (evaluates (pass / fail / partial (score +
real system) observation) NIS2 rule) + offending items) audit pack)
The architecture is plugin-based: each connector and each control is an independent unit, so coverage grows control by control.
Quickstart
python -m venv .venv && source .venv/bin/activate
pip install -e ".[dev]"
probity scan --source tests/fixtures/idp_sample.json
Commands
# One-off scan; --format text|json|html|pdf, --out FILE for pdf/files
probity scan --source idp.json --cloud cloud.json --tls tls.json --format html --out report.html
# Record every scan to an append-only JSONL history and print the score trend
probity scan --source idp.json --history history.jsonl
# Map the same evidence to other regulations (NIS2 is always on the control)
probity scan --source idp.json --framework all # nis2 | dora | ai_act | all
# Run on a schedule and alert on regressions (stdout / file / webhook)
probity watch --source idp.json --history history.jsonl --interval 3600 \
--alert-file alerts.jsonl --alert-webhook https://hooks.example/probity
# Serve the read-only compliance dashboard built from the history
probity serve --history history.jsonl --port 8080
Connectors accept either mock fixtures or real tool exports — same controls,
no live credentials needed: osv-scanner (--osv), CycloneDX (--cyclonedx),
testssl.sh (--testssl), sslyze (--sslyze), Veeam (--veeam), restic
(--restic). The first live connector, Microsoft Entra ID (--entra),
talks to the Graph API directly (OAuth2 client-credentials, stdlib urllib,
still zero deps) to feed C19/C20:
export PROBITY_ENTRA_TENANT_ID=... PROBITY_ENTRA_CLIENT_ID=... PROBITY_ENTRA_CLIENT_SECRET=...
probity scan --entra --format json
The first SOFT controls (C01/C05/C11/C15) reason over governance artifacts —
policies, procedures, supplier risk assessments — via --governance gov.json.
They are honest about automation's limit: a missing or overdue artifact is a hard
FAIL, but a present, current one is PARTIAL flagged requires_human_validation
(never an auto-PASS) so an auditor still judges the content.
Zero runtime dependencies
The core ships with dependencies = []. Scheduling uses stdlib threading,
persistence is an append-only JSONL history (no database), the dashboard is
stdlib http.server with hand-built inline SVG, and alert webhooks use
urllib. Nothing to audit but Python itself.
Status
Pre-alpha. All 20 controls are implemented end-to-end: the full HARD set
(C02–C04, C06–C10, C12–C14, C16–C20) and the SOFT set (C01, C05, C11, C15) with
the human-validation flag. The HARD monitoring/asset-plane controls fail closed
on stale or missing telemetry via a shared freshness helper. Also JSON/HTML/PDF
reporting, history + trend, scheduled watch, a serve dashboard, regression
alerts, a live Entra ID connector, and DORA / EU AI Act cross-framework mapping.
See docs/ROADMAP.md and docs/CONTROLS.md.
Licensing
Core is licensed under AGPL-3.0-or-later (see LICENSE). A commercial
licence (for closed/SaaS use without AGPL obligations) and enterprise connectors
and support are offered separately — the open-core model.
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 probity-0.1.0.tar.gz.
File metadata
- Download URL: probity-0.1.0.tar.gz
- Upload date:
- Size: 74.8 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
68562034729bfe4db6af29679872390e7b961a28df5b19ccdfea9a1ded6705ec
|
|
| MD5 |
b798831e531951c402438cb1e96b0187
|
|
| BLAKE2b-256 |
b7bc15e89f0026fc60cfb79d3c79ed2ef4f02ef56def498936c561bd0f4e80bb
|
File details
Details for the file probity-0.1.0-py3-none-any.whl.
File metadata
- Download URL: probity-0.1.0-py3-none-any.whl
- Upload date:
- Size: 86.1 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
a6e905fd425d2581fdb621bedb05cd11fc3386d9618ffab1b80fe9e1ea6babb5
|
|
| MD5 |
8f7aeb17333ab8f0e7e82c5edb0b001c
|
|
| BLAKE2b-256 |
99a4d10690ed83aa46a51bf30abcc183b734d77f4dfe0a8f8d5509a29c876d9e
|