All notable changes to Opencomplai are documented here.
The format follows Keep a Changelog, and this project follows Semantic Versioning.
docs generate --pushandpush --kind {scan-status,dossier-envelope}: a dossier-envelope producer for the dashboard's ingest pipeline, sharing the scan-status pair's commit resolution, redirect-blocking opener, and env contract (OPENCOMPLAI_PUSH_DOSSIER=1opts in the CI connectors). Pushing the same envelope twice replays by content hash.- CLI documentation now matches what the commands actually do: the README
covers
pushanddocs generate --pushwith a real self-serve quick start,enrollis hidden until a bootstrap-token UI exists,withdraw --local-onlyskips the always-401 remote call explicitly, and the CI integration guide is pinned byte-for-byte todocs/ci/*.ymlby test. - Shared EU AI Act checker golden vectors — 24 cases covering prohibited practices, Annex I/III high-risk, each Art. 6(3) derogation, profiling override, out-of-scope, and every entity type — asserted against both the OSS engine and the vendored dashboard checker.
- ruff is pinned to 0.15.12 for both uv and pre-commit, which had drifted to different versions; the pin came with a one-time autofix and format pass (#52).
- README badges are now live instead of committed SVGs (#51).
- cryptography and pillow are floored at 50.0.0 and 12.3.0, closing the padding-oracle and image-parsing advisories pip-audit flagged (#53).
- The Python dependency audit also runs weekly, so newly published advisories are caught between pushes.
- Dependabot now watches the uv lockfile, npm workspaces, and GitHub Actions.
- CodeQL analysis runs on Python and TypeScript.
- The transformers advisories are deferred behind the optimum-onnx cap that holds it at 4.57.x; tracked in #54.
- The Node CI workflow never actually started:
pnpm/action-setupwas missing from the Actions allowlist (#50).
- Per-tenant ledger sequencing and a hash chain that commits to the payload's
prefix (migrations
0008,0009), closing gaps in cross-tenant isolation and chain-tamper detection (community contribution, #49, issues #46/#47). opencomplai-gha-connector/opencomplai-gitlab-connectorconsole scripts are now actually registered, so the CI integration commands the docs reference work afterpip installinstead of failing with "command not found".- Vercel gateway adapter type-checking and end-to-end adapter tests (mount-prefix rewrite + handler).
- The AI classifier no longer crashes on non-finite (
NaN/Infinity)annex_iii_areaor timeout values, which previously escaped validation and silently wiped every AI finding for the scan. - The SaaS backend's subject-gating now matches the local backend's
narrower
art6_3_profiling-clearing behavior instead of clearing it on every nullannex_iii_area. - The CLI no longer routes the zero-setup codebert-onnx backend through the
optional ONNX-export path, which prompted for a ~440 MB download (or
silently disabled
--ai-intentin CI). NATURAL_PERSON_CUESno longer subject-gates migration/asylum use cases out of Annex III 7(b) due to an untokenizable compound cue (asylum_seeker→asylum,refugee).- Evidence vault:
get_tenant_session's restricted role no longer leaks onto the pooled connection after COMMIT. - The Vercel adapter now strips the mount prefix correctly so adapter requests reach real routes.
packages/cli/src/opencomplai_cli/data/checker-local.htmlis committed so a fresh clone can actually install:packages/cli/pyproject.tomlforce-includes it in the wheel, but it was previously untracked.
Thanks to @HasanAlHalabi for the #49 contribution (issues #45–#48).
- Persistent control-instance register:
ControlInstancemodel, control catalog, and deterministic identity (control_id = sha256(tenant_id | system_id | obligation_id), idempotent across runs). Instances derive from agapsrun and persist to the evidence vault (migration0007, tenant-scoped RLS). Newopencomplai controlscommand group (list,assign,attach-evidence,status) gives a CI-consumable summary of what's satisfied, missing, stale, or waived. - Evidence provenance and freshness metadata on evidence objects; read-time
freshness detection and change-triggered reassessment
(
opencomplai_risk_engine.control_reassessment) — no new scheduler, no cron service. - Annex IV provider-attestation fields on
SystemManifest.docs generatenow loads the most recent scan/eval artifacts from disk and wires them into dossier generation instead of leaving those sections dead, and stops fabricating Section 3 content the provider never supplied — absence stays an explicit placeholder, never a guess. - First-class Art. 17 (QMS) gap probe and a content-aware Art. 9 (risk register) probe.
- HITL halt/resume state machine wired into
checkanddocs generate: new top-levelapprove/resumecommands and exit code4(HALTED_PENDING_REVIEW). compliance-artifact.jsongains an optional top-levelcontrolsblock (summary counts + per-control rows) — additive, existing consumers are unaffected.- Annex IV coverage ledger and controls-lifecycle docs
(
docs/src/concepts/annex-iv-coverage.md,docs/src/concepts/controls.md). CONTRIBUTORS.md, and aMaintainerssection inREADME.mdandCONTRIBUTING.md.
- The CLI no longer aborts with
UnicodeEncodeErroron a Windows console left on a legacy code page (cp437/cp1252, the default OEM code page); output degrades to ASCII instead of crashing mid-render (community contribution,packages/cli/src/opencomplai_cli/_encoding.py). - Installation and quick-start docs no longer hardcode a stale PyPI version
or claim the CLI has no
--versionflag;opencomplai scan --quickexamples no longer show a trailing positional path argument the CLI doesn't accept (community contributions).
- README: corrected the SDK package name (
opencomplai, notopencomplai-sdk), softened the "Closed Beta Pilot" framing now that the quick-scan and EU AI Act Checker paths are free with zero setup, and swapped the broken CI (Node) badge — it linked to a workflow this repo doesn't run — for a PyPI version badge.
0.3.0 — 2026-08-13
- Fail-closed scanner defaults: refuse symlinks, numeric file/byte caps, report
text sanitize helpers, and
scan_errorsgating when--fail-onis set. - Versioned CLI JSON
ScanOutputEnvelopefor scan/gaps/report (not a signedScanStatusArtifact). - Artifact probes for Arts. 9, 13, 14, 16, 24, 43 plus honesty/confidence labels
on gap rows; MCP/agent detector (
DET_AGENTS_MCP_V1). - Four compile-checked Python remediation templates (transparency, logging,
oversight, disclosure helpers) via
opencomplai recommend. - Working Inspect-AI eval bridge MVP: curated
strong_reject/bbq/bigbench_calibrationpin,--log-dir, never gatescheck. - Local
opencomplai serve(optional[serve]extra) — loopback dashboard. - Meta-package extras re-export:
reports,inspect-bridge,serve. - Docs: serve, Inspect-AI eval bridge, hostile-scan defaults, SOC2/ISO control mapping, ADR local-serve-vs-saas.
- Interactive HTML reports embed the JSON envelope and support status/text filters.
- Breaking: Inspect-AI eval bridge hard-cut rename —
--suite inspect-ai, pip extrainspect-bridge, moduleopencomplai_core.bridges.inspect_eval, evaluator IDsEVAL_INSPECT_*(evidence hashes change). Previous suite/extra identifiers removed with no aliases. - Breaking (signatures): every Ed25519 signature is now domain-separated —
the signed bytes are
opencomplai.sig.v1\0<purpose>\0<payload>. One keypair signs scan-status artifacts, Annex IV dossier bundles and compliance badges, and nothing in the signed bytes said which was which: a signature fromopencomplai check --signverified unmodified as a compliance-badge signature for the same object.sign_bundle_bytes/verify_bundle_bytesnow take a requireddomain. Signatures produced before this change do not verify, deliberately and with no compatibility flag — nothing in the system re-verifies a stored signature, so an accept-both window would only have kept the confusion alive. Re-sign anything you need to verify again. - Breaking (badges): issuing a badge now requires a signature whenever
OSS_BADGE_PUBLIC_KEY_PATHis set. Previously an unsigned request skipped verification entirely even with the key configured. With no key configured, unsigned issuance is unchanged — that is OSS unsigned mode.
EvidenceObject.encryption_profileand theevidence_objectsencryption_profilecolumn (evidence-vault migration0006). It advertised"AES-256-GCM", including in the generated OpenAPI, while no CAS backend has ever encrypted anything; nothing wrote it and nothing read it. Evidence objects are stored as plaintext — integrity comes from content-hash re-verification on read, confidentiality from volume- or bucket-level encryption at the deployment layer.
0.1.2 — 2026-07-11 — First PyPI release
opencomplai,opencomplai-cli,opencomplai-core, andopencomplai-aiare now published to PyPI.pip install opencomplairesolves the full stack; no source checkout required. Packages are built and published in dependency order from theopencomplai-enterpriserelease workflow (PyPI's Trusted Publisher is registered against that repo); this repository's own CI (ci-python.yml) covers lint/test only.
- The stable API contract introduced in
0.1.0(exit codes0–4, thecompliance-artifact.json/ScanStatusArtifactschema) is unchanged by the PyPI release — publishing changes distribution only, not behavior.
0.1.0 — 2026-06-28 — Initial public release
- Risk classification engine for the EU AI Act with a deterministic, rule-based core:
UnacceptableRiskRule,AnnexIIIClassifierRule,ProfilingDetectionRule, andSubstantialModificationRule. opencomplaiCLI:init,check,checker,verify-output,docs generate,sync metadata,risk classify,validate-manifest, anddashboardcommands.- Interactive EU AI Act checker — a browser-based wizard for scope, high-risk
classification, GPAI, and obligations, available on the docs site and offline via
opencomplai checker --local. - Gateway API routes:
/v1/sync/metadata,/v1/docs/generate,/v1/verify/claims,/v1/evidence/events,/v1/risk/classify, and/v1/manifests/validate. - Evidence vault: append-only, Merkle-linked ledger with a
LedgerEventchain and a/v1/evidence/verify-chainendpoint. - Docker Compose stack: gateway-api, risk-engine, evidence-vault, doc-generator, egress-proxy, Prometheus, Grafana, PostgreSQL, and Redis.
- Egress proxy:
EGRESS_ALLOWED_DESTINATIONSallowlist enforcement; fail-closed by default (air-gap ready). - Release signing: Ed25519 keypair generation in
~/.opencomplai/;--signflag foropencomplai check. - Python SDK:
ScanStatusArtifact,SystemManifest,RiskResult,AssessmentInput, andModelMetadataexported fromopencomplai. - Developer documentation site (
docs.opencomplai.com) covering the CLI, SDK, deployment, concepts, architecture, contributing, and troubleshooting. - Supply-chain tooling: SBOM generation (
scripts/verify-sbom.sh).
opencomplai checkwritescompliance-artifact.json(aScanStatusArtifact), which is the canonical CI gate output.- Exit codes are contractual:
0= PASS,1= CONTROL_FAIL,2= VALIDATION_FAIL,3= POLICY_BLOCK,4= TRAP_DETECTED.
opencomplai, opencomplai-cli, opencomplai-core, and opencomplai-ai are published
on PyPI:
pip install opencomplaiInstalling from a source checkout remains supported for contributors:
git clone https://github.com/Opencomplai/opencomplai
cd opencomplai
pip install -e packages/core -e packages/cli -e packages/sdk-pythonSee Contributing — Release Process for the release/publish workflow.