v0.10.5
Highlights
Theme: v0.10.5 — output-format expansion (OCSF Detection
Finding + CycloneDX VEX emit) + workspace refactor (evidentia-eval
package extraction) + collector idempotency hardening for the v1.0
API freeze + positioning rewrite (no metaphors; EU AI Act delay) +
commercial-validation foundation (design-partner program draft).
Patch bump (v0.10.4 → v0.10.5).
Release summary: Six cycle commits authored 2026-05-25 between
v0.10.4 (tagged 2026-05-24) and this 2026-05-26 tag, all on the
same main branch. 3,443 tests pass / 14 skipped / 3,457
collected across 278 source files (was 268 v0.10.4); mypy strict
0/0; ruff clean. Workspace now ships 8 PyPI packages (was 7;
evidentia-eval added in Phase 9). The 2026-05-24 v0.10.5 plan
targeted Phases 1-5 (OSPS Baseline catalog + OSCAL conversion +
OSPS-CONFORMANCE.md + SECURITY.md refresh + EOL.md +
verification-recipe) as the "OSS first-mover artifacts" theme; a
2026-05-25 full-sweep research pass redirected scope to Phases 7-12
(output-format expansion + workspace refactor + idempotency + EU AI
Act delay + design-partner program). Phases 1-5 deferred to v0.10.6
without scope loss — see docs/v0.10.5-plan.md
§0/§0.A for the full plan-vs-actual reconciliation.
Cross-links: docs/positioning-and-value.md
§10 (no-metaphor rewrite) + §8.1 (EU AI Act Annex III deferred to
2027-12-02 per Digital Omnibus political agreement of 2026-05-07);
docs/v1.0-transition.md §"Acceptance
gates for v1.0" (Gold honest-gap now tied to SOC 2 Type I
segregation-of-duties); docs/design-partner-program.md
v0 draft; docs/ocsf-mapping.md §7.B
(Detection Finding emit); docs/collector-idempotency-audit.md
NORMATIVE per-collector audit.
Added
evidentia gap analyze --format ocsf-detection(Phase 7): gap
analysis output emits as an OCSF Detection Finding (class_uid2004)
JSON array. The OCSF ecosystem's actual production traffic is on
Detection Finding 2004 — Prowler and AWS Security Hub emit 2004
natively, and major SIEMs (Splunk / Elastic / Microsoft Sentinel /
Datadog) wired their ingest pipelines to it. Compliance Finding 2003
(the v0.10.4 default--format ocsfemit) is the semantically
correct class for control pass/fail evidence and remains the default
for OCSF-aware GRC tooling;--format ocsf-detectionis the
SIEM-target alternative. Detection Finding has no nativecompliance
object, so framework + control_id rides infinding_info.types[]as
a stable<framework>/<control_id>identifier (mirroring the SARIF
rule_idshape); full gap JSON preserved under
unmapped["evidentia"]["gap"]for round-trip fidelity. New
evidentia_core.gap_analyzer.ocsf_detection.gap_report_to_ocsf_detection_array
library helper.evidentia gap analyze --format cyclonedx-vex(Phase 8): gap
analysis output emits as a CycloneDX 1.6 VEX document. Federal
supply-chain mandates (EO 14028, SEC 2026 supply-chain enforcement)
are driving CycloneDX VEX adoption; CycloneDX is already used in
Evidentia's release-time SBOM emit, so VEX is an additive surface
over the existing supply-chain artifact stack. EachControlGap
becomes one CycloneDXvulnerabilityentry;analysis.stateis
derived from the gap'simplementation_status+GapStatus
(implemented→resolved;missing+OPEN→exploitable;
missing+IN_PROGRESS→in_triage;missing+REMEDIATED→
resolved;missing+ACCEPTED→not_affectedwith
code_not_reachablejustification;partial/planned→
in_triage;not_applicable→not_affectedwithcode_not_present
justification). Composable with the release-time SBOM via standard
CycloneDX merge tooling. New
evidentia_core.gap_analyzer.vex.gap_report_to_cyclonedx_vexlibrary
helper.OutputFormatLiteral extension: extended additively per
docs/api-stability.md§3 to include"ocsf-detection"+
"cyclonedx-vex". Existing emits (json/csv/markdown/
oscal-ar/sarif/ocsf) unchanged. No breaking changes.- New workspace package
evidentia-eval(8th package): the DFAH
determinism + faithfulness harness moves out ofevidentia-ai/eval/
to its own pip-installable package with its own optional extra
(evidentia-eval[faithfulness-semantic]for the sentence-
transformers + numpy path). Public API:DFAHarness,EvalResult,
EvalSample,DeterminismResult,ReplayResult,
FaithfulnessResult,PromptFaithfulnessResult,
faithfulness_score,faithfulness_score_semantic,
extract_claims,determinism_score,replay_equivalent,
normalize_for_determinism,hash_output,sign_eval_result,
verify_eval_result. Same symbols, same signatures as the prior
evidentia_ai.evallocation — only the import path changes. tests/unit/test_ai/test_lazy_imports.py: pins the lazy-import
posture ofevidentia_ai. Asserts via subprocess that
import evidentia_ai,import evidentia_ai.risk_statements, and
related production-runtime entry-points do NOT pull torch /
transformers / sentence-transformers / evidentia-eval into
sys.modules. Closes the Kimi engineering audit concern about
air-gap installs transitively loading ML deps.- Deterministic
SecurityFinding.idderivation (v0.10.5 Phase 10 —
collector idempotency hardening for the v1.0 API freeze). New
evidentia_core.models.common.deterministic_finding_id(source_system, source_finding_id)helper computes a UUID v5 from natural keys
under the pinnedNAMESPACE_EVIDENTIA_FINDINGnamespace. A new
@model_validator(mode="before")onSecurityFindingruns the
derivation when no explicitid=is supplied AND both
source_system+source_finding_idare present at construction.
Effect: twocollect()calls against an unchanged source produce
findings with byte-identicalidvalues across runs — closes the
audit-flagged idempotency gap before v1.0. Additive-only;
docs/api-stability.mdfrozen-surface contract preserved (explicit
id=always wins, OCSF round-trip viaunmapped["evidentia"]
unchanged, pre-v0.10.5 OSCAL AR documents continue to load). docs/collector-idempotency-audit.md— NORMATIVE per-collector
audit covering the 13-collector + 1-ingest-module surface as of
v0.10.5. Per-collector PASS/GAP verdicts on cursor model, natural
key shape, and finding-identity contract. Refutes the principal-
engineer architecture audit's "second-granularity cursor" diagnosis
(no collector uses timestamp cursors) and "INSERT ... ON CONFLICT
store" diagnosis (no DB-backed findings store exists; OSCAL AR is
the canonical sink). Documents the actual gap: randomuuid4()on
SecurityFinding.iddespite stablesource_finding_idnatural
keys. Cross-referenced fromdocs/api-stability.md§"Frozen
surfaces" +docs/threat-model.md§"Stuck-cursor guards" +
docs/v0.10.5-plan.mdPhase 10.tests/unit/test_collectors/test_idempotency.py— CI regression
test: runs each mockable collector (AWS Config, AWS Security Hub,
GitHub repo settings, GitHub Dependabot alerts, Okta, Vanta, Drata,
OCSF file ingest) twice against deterministic fixtures and asserts
zero net newSecurityFinding.idvalues on the second run. Plus an
OSCAL JSON round-trip sanity assertion that the validator's
"explicit id wins" branch survives serialize → deserialize.tests/unit/test_models/test_finding_idempotency.py— model-
layer unit tests covering thedeterministic_finding_idhelper
(UUID v5 verification, NAMESPACE pinning, NUL-separator collision
resistance, empty-input rejection) and theSecurityFinding
validator (explicit-id wins, falls back to random when natural
keys missing, OCSF round-trip preservation).
Changed
evidentia-aiextraeval-faithfulnessnow proxies to
evidentia-eval[faithfulness-semantic]. Existing
pip install evidentia-ai[eval-faithfulness]invocations continue
to pull the samesentence-transformers >= 3.0+numpy >= 1.26
stack — the heavy deps just live on the eval package now. Tracking
removal in v0.12.0 when the wider deprecation shim is dropped.- Architecture doc + api-stability doc: workspace package count
updated from 7 to 8;evidentia-evaladded to the §5 public
library entry-points and the §Revision history.
Deprecated
evidentia_ai.eval.*import paths are now deprecation shims
that re-export fromevidentia_eval.*and emit a
DeprecationWarningat import time. Removal scheduled for
v0.12.0 (2-minor-version migration window). Migration: replace
from evidentia_ai.eval import Xwithfrom evidentia_eval import X
(or for submodule imports,from evidentia_ai.eval.harness import Y
withfrom evidentia_eval.harness import Y). Same symbols, same
signatures — the rename is mechanical.
Internal
- Lazy-import contract: production runtime entry-points
(evidentia_ai,evidentia_ai.risk_statements,
evidentia_ai.explain) verified not to pull the eval stack on
bare import. Air-gap installs ofevidentia-aino longer
transitively loadsentence-transformers/numpy/instructor
(instructor was already lazy; sentence-transformers + numpy
remained gated behind a now-moved optional extra). bump_version.pyworkspace allowlist: the F-V100-M1 close-out
introduced in v0.10.1 reads[tool.uv.sources]dynamically;
addingevidentia-eval = { workspace = true }to the workspace
root pyproject.toml automatically includes it in the bump path
(no script edit needed).
Test coverage
tests/unit/test_gap_analyzer/test_ocsf_detection_emit.py(NEW):
10 tests covering the adversarial-probe taxonomy from the v0.10.4
capability-matrix shape (Vectors 1 / 2 / 4 / 7) — minimal positive
(each gap becomes one Detection Finding), severity mapping,
GapStatus → OCSF StatusID mapping, empty inventory, unmapped block
round-trip fidelity, end-to-end viaexport_reportdispatch.tests/unit/test_gap_analyzer/test_vex_emit.py(NEW): 21 tests
covering the same adversarial-probe shape for CycloneDX VEX — VEX
envelope, severity mapping, recommendation flow, every state-mapping
rule in the Phase 8 state-derivation table, justification handling
(only emitted onnot_affected), empty inventory, end-to-end via
export_reportdispatch, deterministicserialNumber, schema
sanity check.tests/unit/test_gap_analyzer/test_end_to_end.py::test_export_all_formats
extended: parameterized end-to-end smoke test now covers the new
ocsf-detection+cyclonedx-vexformats alongside the existing
json / csv / markdown / oscal-ar / sarif coverage.
Documentation
docs/ocsf-mapping.md: new §7.B documents the v0.10.5 Detection
Finding emit —ControlGap→ Detection Finding field map, the
types[]strategy for framework + control_id, rationale for the
two-emit shape (GRC-target Compliance Finding 2003 vs SIEM-target
Detection Finding 2004), API examples.docs/api-stability.md: revision-history row added for v0.10.5
Phases 7+8 (OutputFormatliteral extension + two new library
entry points, all additive-only). §5 library entry points section
extended with the newgap_report_to_*helpers.docs/integration-survey.md: row 15 (Splunk / Datadog) updated
to reflect the v0.10.5 Detection Finding path (production-traffic-
compatible with Splunk / Elastic / Sentinel / Datadog ingest); new
row 16 added for CycloneDX VEX emit; "Beyond the original sequence"
section gains two new SHIPPED entries.
Verify the wheels (PEP 740 publish attestations)
Every wheel uploaded to PyPI from this release carries a
Sigstore-signed PEP 740 publish attestation. Verify locally:
pip install pypi-attestations
pypi-attestations verify pypi \
--repository https://github.com/polycentric-labs/evidentia \
"pypi:evidentia==0.10.5"Verification confirms the wheel was built + published from
polycentric-labs/evidentia/release.yml@refs/tags/v0.10.5
under GitHub Actions OIDC — i.e., a malicious mirror cannot
serve a tampered wheel without the verification failing.
See docs/sigstore-quickstart.md
for the full verification narrative + supply-chain framing.
CHANGELOG
Full changelog (every release): CHANGELOG.md
Container image
ghcr.io/polycentric-labs/evidentia:v0.10.5ghcr.io/polycentric-labs/evidentia:latest- Digest:
sha256:f315c1fc20ed93227d79b6576da9e3bb74e3901e76cab5f0af65cfd8b98bb1de
Verify (cosign keyless OIDC):
cosign verify ghcr.io/polycentric-labs/evidentia:v0.10.5 \
--certificate-identity-regexp 'https://github\.com/Polycentric-Labs/evidentia/\.github/workflows/release\.yml@refs/tags/v.*' \
--certificate-oidc-issuer 'https://token.actions.githubusercontent.com'Verify (SLSA build provenance):
gh attestation verify oci://ghcr.io/polycentric-labs/evidentia:v0.10.5 \
-R Polycentric-Labs/evidentiaSee docs/sigstore-quickstart.md
for the full verification narrative.