Skip to main content

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


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

probity-0.1.0.tar.gz (74.8 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

probity-0.1.0-py3-none-any.whl (86.1 kB view details)

Uploaded Python 3

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

Hashes for probity-0.1.0.tar.gz
Algorithm Hash digest
SHA256 68562034729bfe4db6af29679872390e7b961a28df5b19ccdfea9a1ded6705ec
MD5 b798831e531951c402438cb1e96b0187
BLAKE2b-256 b7bc15e89f0026fc60cfb79d3c79ed2ef4f02ef56def498936c561bd0f4e80bb

See more details on using hashes here.

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

Hashes for probity-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 a6e905fd425d2581fdb621bedb05cd11fc3386d9618ffab1b80fe9e1ea6babb5
MD5 8f7aeb17333ab8f0e7e82c5edb0b001c
BLAKE2b-256 99a4d10690ed83aa46a51bf30abcc183b734d77f4dfe0a8f8d5509a29c876d9e

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page