-
Notifications
You must be signed in to change notification settings - Fork 1
API Stability
Auto-generated mirror. This page mirrors
docs/api-stability.md, the canonical source of truth. Do not edit this file directly; editdocs/api-stability.mdand re-runscripts/wiki/sync_mirrors.py.
Status: NORMATIVE as of v0.9.7 (2026-05-19). Promoted from DRAFT during the v0.9.7 P2.1 v1.0-prep cycle per the
docs/v1.0-transition.mdCandidate B framing. Promoted ahead of v1.0 so the v0.9.x → v1.0.0 transition does not require any additional API-contract changes — the contract is set and tested over the remaining v0.9.x line.Scope: defines which surfaces carry semantic-versioning guarantees, and which surfaces remain free to change without a major-version bump. Operators MAY rely on the frozen surfaces; integrators MAY build against them with confidence that Evidentia will not break them without a deprecation cycle.
Pre-v1.0 vs post-v1.0 semantics: this NORMATIVE document is already binding — Evidentia will not knowingly break a frozen surface listed below in any v0.9.x release. The v1.0.0 release itself does not add new constraints; it ratifies the contract already in force.
Canonical location:
docs/api-stability.mdCross-references: v1.0-transition.md, enterprise-grade.md, release-checklist.md, deprecation-calendar.md
Evidentia follows Semantic Versioning 2.0.0 with the following interpretation:
| Bump | Meaning | Example |
|---|---|---|
| Major (X.0.0) | Breaking change to a frozen surface | Remove a Pydantic field, rename a CLI flag |
| Minor (1.X.0) | New functionality, additive-only changes to frozen surfaces | New EventAction, new CLI command, new optional model field |
| Patch (1.0.X) | Bug fixes, security patches, doc updates, catalog content refreshes | CVE fix, threshold default adjustment, typo |
Pre-v1.0 (v0.9.7 onward — this document NORMATIVE): the contract listed in this document is binding. Breaking changes to frozen surfaces require a deprecation cycle per the policy in § "Deprecation policy" below. The v1.0.0 release ratifies (does not expand) the contract already in force.
Earlier pre-v1.0 (v0.9.0 – v0.9.6): minor bumps may have contained breaking changes to any surface. The v0.9.x line was the "stabilization window" where the public contract was identified and documented in DRAFT form.
These surfaces carry full semver guarantees at v1.0+. Breaking changes require a major-version bump with a deprecation cycle.
Package: evidentia_core.models.*
All exported model classes have stable field names and types. Adding optional fields (with defaults) is a minor-bump change. Renaming, removing, or changing the type of an existing field is a major-bump trigger.
Frozen models (48+ classes across 18 modules; v0.10.0-confirmed):
| Module | Key models |
|---|---|
common.py |
FrameworkMetadata, ControlMapping, EvidentiaModel
|
control.py |
Control, ControlFamily, ControlImplementation, ControlInventory, ControlStatus
|
evidence.py |
EvidenceArtifact, EvidenceBundle, EvidenceType, EvidenceSufficiency. v0.9.5+ adds EvidenceArtifact.version / lineage_id / predecessor_id Optional fields + new_version() factory helper; these are now frozen. |
finding.py (v0.10.0+) |
SecurityFinding, Finding (v0.10.1 alias — both names refer to the same class), FindingStatus, ComplianceStatus. Frozen following the v0.10.0 OCSF-alignment evolution — field changes are additive-only. v0.10.0 added the compliance_status + remediation Optional fields. v0.10.1 introduces Finding as the canonical name alongside SecurityFinding; the SecurityFinding alias is retained for ≥1 minor cycle per the deprecation policy. Target removal of the SecurityFinding alias: v1.0.0 (the earliest major bump). See deprecation-calendar.md. v0.10.5 Phase 10 adds the deterministic-id derivation contract: when a SecurityFinding is constructed with both source_system and source_finding_id present and no explicit id=, the id field derives as uuid5(NAMESPACE_EVIDENTIA_FINDING, f"{source_system}\x00{source_finding_id}"). The NAMESPACE_EVIDENTIA_FINDING UUID is pinned forever (c81bcb44-9b41-5b18-9f10-72b3b9b4d3d6). Two collect() calls against an unchanged source produce findings with byte-identical id values. Per-collector verdicts in collector-idempotency-audit.md. |
gap.py |
GapFinding, GapSeverity, GapAnalysisReport, ControlGap, Milestone, POAMState. v0.9.5 adds Milestone.owner / Milestone.reviewer Optional fields; these are now frozen. |
vendor.py |
VendorProfile, VendorRiskTier
|
vendor_finding.py |
VendorFinding |
vendor_manifest.py |
VendorManifest |
assessment.py |
Assessment, AssessmentStatus
|
claim.py |
TraceClaim, ReasoningTrace
|
oscal_profile.py |
OSCALProfile |
catalog.py |
CatalogEntry, CatalogControl, ControlCatalog, FrameworkMapping, CrosswalkDefinition. v0.10.6 added the CrosswalkDefinition.provenance / verification / verification_note Optional fields (additive-only — backward-compatible, the eight pre-v0.10.6 crosswalks load unchanged). |
tprm.py |
TPRMAssessment, TPRMFinding
|
governance.py |
AISystem, AIRiskClassification, GovernanceRecord
|
ai_governance/classification.py (v0.9.3+) |
AISystemDescriptor, AISystemClassification, EUAIActTier, NISTAIRMFFunction, AnnexIIIDomain
|
ai_governance/registry.py (v0.9.3+; v0.9.6 federal expansion) |
AISystemRegistryEntry, DeploymentStatus, ATOReference (v0.9.6) |
ai_governance/fips199.py (v0.9.6+) |
FIPS199Categorization, FIPS199Impact
|
ai_governance/omb_m_24_10.py (v0.9.6+) |
OMBImpactCategory |
ai_governance/scr.py (v0.9.6+) |
SCRForm, SCRCategory
|
rbac/policy.py (v0.9.5+) |
Role, RBACPolicy. check_permission(identity, action, policy) + load_policy_from_file(path) callables also frozen. |
retention/metadata.py (v0.7.11+) |
RetentionMetadata, RetentionClassification, RetentionLifecycleStage
|
Serialization guarantee: JSON-serialized output of any frozen model at version N must be deserializable by version N+1 within the same major. Field ordering in JSON output is not guaranteed.
Package: evidentia_core.audit.events
The EventAction enum is an append-only contract. Existing
values are never removed or renamed post-v1.0. New values may
be added in any minor release.
Current namespaces (80+ values as of v0.9.8). Example values below
are real members of evidentia_core.audit.events.EventAction — the
enum module is the authoritative source:
| Prefix | Domain | Example values |
|---|---|---|
COLLECT_* |
Evidence collection |
COLLECT_STARTED, COLLECT_COMPLETED, COLLECT_FAILED
|
AUTH_* |
Authentication |
AUTH_CREDENTIAL_RESOLVED, AUTH_CREDENTIAL_FAILED
|
CONFIG_* |
Configuration |
CONFIG_LOADED, CONFIG_RESOLVED, CONFIG_INVALID
|
SIGN_* |
Cryptographic signing |
SIGN_GPG_SIGNED, SIGN_SIGSTORE_SIGNED, SIGN_FAILED
|
VERIFY_* |
Verification |
VERIFY_DIGEST_PASSED, VERIFY_SIGNATURE_PASSED, VERIFY_COMPLETED
|
MANIFEST_* |
Manifest operations |
MANIFEST_GENERATED, MANIFEST_EMPTY_SET_ATTESTED, MANIFEST_INCOMPLETE
|
AI_* |
AI/LLM operations |
AI_RISK_GENERATED, AI_EVAL_FAITHFULNESS_CHECKED
|
AI_SYSTEM_* (v0.9.3+) |
AI system inventory |
AI_SYSTEM_CLASSIFIED, AI_SYSTEM_REGISTERED, AI_SYSTEM_UPDATED, AI_SYSTEM_RETIRED, AI_SYSTEM_DELETED, AI_SYSTEM_FIPS_CATEGORIZED (v0.9.6), AI_SYSTEM_OMB_CLASSIFIED (v0.9.6), AI_SYSTEM_SCR_EMITTED (v0.9.6) |
AI_MCP_* |
MCP server operations |
AI_MCP_TOOL_AUTHORIZED, AI_MCP_TOOL_DENIED
|
POAM_* |
POA&M lifecycle |
POAM_CREATED, POAM_MILESTONE_REACHED, POAM_VERIFIED
|
CONMON_* |
Continuous monitoring |
CONMON_DAEMON_STARTED, CONMON_ALERT_DISPATCHED, CONMON_CYCLE_DUE, CONMON_CYCLE_OVERDUE, CONMON_CYCLE_MARKED_COMPLETED
|
EVIDENCE_* (v0.9.6+) |
Evidence WORM lineage |
EVIDENCE_VERSION_PERSISTED, EVIDENCE_WORM_VIOLATION_BLOCKED, EVIDENCE_LINEAGE_QUERIED
|
RBAC_* (v0.9.8+) |
Multi-tenant RBAC | RBAC_TENANT_BOUNDARY_CROSSED |
RETENTION_* |
Data retention |
RETENTION_RECORD_PUT, RETENTION_RECORD_EXTENDED, RETENTION_LEGAL_HOLD_APPLIED, RETENTION_LEGAL_HOLD_RELEASED, RETENTION_LIFECYCLE_TRANSITIONED, RETENTION_RECORD_PURGED, RETENTION_GDPR_PURGE
|
Operators building alerting / SIEM integrations on top of the audit log can depend on these values being stable.
Package: evidentia (the CLI entry point)
Top-level command groups (18+ as of v0.9.7):
evidentia gap evidentia catalog evidentia risk
evidentia explain evidentia integrations evidentia collect
evidentia oscal evidentia tprm evidentia model-risk
evidentia governance evidentia retention evidentia poam
evidentia conmon evidentia ai-gov evidentia eval
evidentia mcp evidentia serve evidentia evidence (v0.9.6)
Global flags (frozen across all commands):
-
--verbose/-v— DEBUG-level logging -
--quiet/-q— ERROR-level only -
--config <path>— explicitevidentia.yamloverride -
--offline— air-gap guard (v0.4.0) -
--json-logs— ECS 8.11 JSON output (v0.7.0) -
--rbac-identity <id>— per-invocation RBAC identity override (v0.9.6)
Stability contract:
- Command names are frozen (rename = major bump)
- Flag names (
--flag-name) are frozen within each command - Flag semantics (what a flag does) are frozen
- Flag default values may change in minor releases (documented in CHANGELOG)
- Adding new flags is non-breaking (minor bump)
- Adding new commands or subcommands is non-breaking (minor bump)
Deprecation for CLI: a deprecated flag emits a
DeprecationWarning for at least 1 minor-release cycle before
removal. The warning includes the replacement flag name.
Package: evidentia_core.plugins.*
Five ABC/Protocol contracts that third-party code may implement:
| Contract | Location | Stability |
|---|---|---|
AuthProvider |
plugins.auth._base |
Method signatures frozen |
StorageBackend[T] |
plugins.storage._base |
Generic ABC; method signatures frozen |
MarketplaceProvider |
plugins.marketplace._base |
Method signatures frozen |
BaseSaaSCollector |
plugins.collectors._base |
Method signatures frozen; _auth_header() hook stable |
ContinuousEvidenceSource |
plugins.continuous |
Protocol; poll() + health_check() + attributes frozen |
What "method signatures frozen" means:
- Parameter names, types, and ordering are stable
- Return types are stable
- Adding optional parameters (with defaults) is non-breaking
- Adding new abstract methods to an ABC is a major-bump trigger (breaks existing implementations)
Supporting dataclasses used in plugin signatures are also
frozen: AuthResult, CatalogManifest, EvidenceRecord.
Public importable paths that operators and integrators use:
# Core analysis + data models
from evidentia_core.gap_analyzer import GapAnalyzer
from evidentia_core.models import ControlGap, GapFinding, ...
from evidentia_core.audit.events import EventAction
from evidentia_core.catalogs.registry import FrameworkRegistry
from evidentia_core.conmon import derive_status, BUNDLED_CADENCES
from evidentia_core.poam import POAMState, Milestone
from evidentia_core.poam_store import save_poam, load_poam_by_id
from evidentia_core.plugins import AuthProvider, StorageBackend, ...
# v0.9.5+ RBAC + collaboration primitives
from evidentia_core.rbac import (
Role, RBACPolicy, check_permission, load_policy_from_file,
)
# v0.9.6+ evidence WORM store + cloud mirror
from evidentia_core.evidence_store import (
save_evidence, list_lineage, load_evidence_version,
list_lineages, get_evidence_store_dir,
EvidenceWORMViolation, InvalidEvidenceIdError,
EVIDENCE_STORE_ENV_VAR,
)
from evidentia_core.evidence_store_worm import (
mirror_to_worm, fetch_from_worm,
)
# v0.9.6+ AI-gov federal expansion
from evidentia_core.ai_governance import (
FIPS199Categorization, FIPS199Impact,
OMBImpactCategory, triggers_minimum_practices,
ATOReference, AISystemRegistryEntry, DeploymentStatus,
)
from evidentia_core.ai_governance.scr import (
SCRForm, SCRCategory, emit_scr_form, classify_change,
)
# v0.9.6+ OSCAL schema version constant
from evidentia_core.oscal import OSCAL_SCHEMA_VERSION
# v0.10.0+ OCSF Compliance Finding interchange (needs the [ocsf] extra)
from evidentia_core.ocsf import (
finding_to_ocsf, finding_from_ocsf, OCSFMappingError,
)
# v0.10.4+ Gap-report OCSF Compliance Finding array emit (needs [ocsf] extra)
from evidentia_core.gap_analyzer.ocsf import gap_report_to_ocsf_array
# v0.10.5+ Gap-report OCSF Detection Finding array emit (needs [ocsf] extra)
from evidentia_core.gap_analyzer.ocsf_detection import (
gap_report_to_ocsf_detection_array,
)
# v0.10.5+ Gap-report CycloneDX 1.6 VEX emit (no extra required)
from evidentia_core.gap_analyzer.vex import gap_report_to_cyclonedx_vex
# AI features (production runtime)
from evidentia_ai.risk_statements import RiskStatementGenerator
# v0.10.5+ DFAH determinism + faithfulness harness (dev-time;
# extracted from evidentia_ai.eval to a dedicated workspace
# package so air-gap installs of the production runtime no
# longer pull the dev-time eval stack). The
# evidentia_ai.eval.* path remains as a deprecation shim
# through v0.11.x; removal scheduled for v0.12.0.
from evidentia_eval import DFAHarness, faithfulness_score
# Collectors + integrations
from evidentia_collectors.vendor_risk import (
BitSightCollector, SecurityScorecardCollector,
RiskReconCollector, UpGuardCollector,
)
from evidentia_integrations.alerting import SmtpChannel, WebhookChannel
# API + MCP entry points
from evidentia_api.app import create_app
from evidentia_api.rbac_dependency import require_role
from evidentia_mcp.server import build_server # v0.8.0+ nameStability contract: these import paths are frozen. Moving a class to a different module internally is allowed as long as the original import path continues to work (via re-export).
Package: evidentia_api.routes.*
All REST endpoints follow the pattern /api/<resource> and are
versioned implicitly (no /v1/ prefix until a breaking REST
change necessitates it).
Frozen URI prefixes (16 routers):
| Prefix | Router module | Purpose |
|---|---|---|
/api/health |
health.py |
Liveness + readiness |
/api/config |
config.py |
Configuration state |
/api/doctor |
doctor.py |
Environment diagnostics |
/api/explain |
explain.py |
Control explanations |
/api/llm-status |
llm_status.py |
LLM provider health |
/api/frameworks |
frameworks.py |
Framework catalog |
/api/init-wizard |
init_wizard.py |
First-run wizard |
/api/risks |
risks.py |
Risk statements |
/api/gaps |
gaps.py |
Gap analysis |
/api/integrations |
integrations.py |
Integration status |
/api/tprm |
tprm.py |
Third-party risk |
/api/model-risk |
model_risk.py |
AI model risk |
/api/collectors |
collectors.py |
Collector status |
/api/metrics |
metrics.py |
Prometheus metrics |
/api/poam |
poam.py |
POA&M management |
/api/conmon |
conmon.py |
Continuous monitoring |
/api/ai-gov |
ai_gov.py |
AI governance |
Stability contract:
- URI paths are frozen (rename = major bump)
- Response JSON field names are frozen (additions only)
- HTTP methods per endpoint are frozen
- Query parameter names are frozen
- Adding new endpoints is non-breaking (minor bump)
- Adding new optional query parameters is non-breaking
These surfaces may change in any release (minor or patch) without constituting a breaking change. Operators should not depend on their stability.
Any function, class, or module prefixed with underscore (_) is
private. This includes:
evidentia_core._internal.*- Any
_helper,_utils,_compatmodules - Private methods on public classes (
def _compute_score(...))
Everything under tests/ is non-frozen:
- Test data files (
tests/data/dfah-calibration/corpus*.jsonl) - Fixture factories (
tests/conftest.py) - Test helper modules (
tests/helpers/)
The compliance catalogs shipped with Evidentia evolve as authoritative sources publish updates (NIST revisions, ISO amendments, EU regulation enforcement dates). Catalog content changes are patch-level — they don't constitute API breaks.
Explicit version-pinning — via a planned catalog pin <framework> <version>
command — is on the roadmap (not yet available).
Default values for scoring thresholds (faithfulness, risk determinism, health scoring) may be tuned between releases based on empirical calibration results. These changes are documented in CHANGELOG but are non-breaking because operators can always override via CLI flags:
--faithfulness-threshold--faithfulness-threshold-mode {framework-aware,fixed}--fail-on-determinism-rate-below--health-score-weights
Everything under scripts/ is operational tooling, not public
API. Scripts may be added, removed, or refactored freely.
The container's internal layout (file paths, installed packages, base image) is non-frozen. Only the CLI interface exposed by the container is stable (same guarantees as CLI flags above).
While MCP tool names are frozen (they're part of the tool contract with AI clients), tool descriptions and parameter descriptions may be refined for clarity without constituting a breaking change.
When a frozen surface must change:
-
Announce: add a
DeprecationWarning(Python) or deprecation notice (REST response header) in minor release N. Document in CHANGELOG under "Deprecated". -
Maintain: the deprecated surface continues to work unchanged for at least 1 full minor-release cycle (release N through N+1).
-
Remove: earliest removal is in release N+2. Document in CHANGELOG under "Removed". This constitutes a major- version bump.
Example timeline:
v1.2.0 — deprecate --old-flag (warning emitted; --new-flag added)
v1.3.0 — --old-flag still works (warning still emitted)
v2.0.0 — --old-flag removed; major bump
For REST endpoints, deprecation is signaled via:
-
Deprecation: trueresponse header (RFC 8594) -
Sunset: <date>header when removal date is known
The release pipeline validates API stability via:
- Type checking (mypy strict): catches signature changes that would break callers
- Test suite (2747+ tests): exercises public interfaces against expected behavior
-
Import smoke test:
scripts/check_imports.py(reserved for v1.0) will validate that all documented entry points resolve -
Schema regression: Pydantic model
.model_json_schema()output compared between releases (reserved for v1.0)
This document covers the library, CLI, REST, and plugin surfaces of Evidentia. It does NOT cover:
-
The web UI (
packages/evidentia-ui/): frontend component APIs are not part of the public contract - GitHub Actions workflows: CI/CD implementation details
- Development tooling: ruff config, mypy config, test infrastructure
- Documentation format: doc structure may reorganize freely
Package: evidentia_mcp.server
MCP tool names are frozen — they are part of the contract with AI clients (Claude Desktop, Claude Code, custom MCP clients). Renaming a tool is a major-bump trigger; adding new tools is non-breaking.
Frozen tool surface (as of v0.9.7):
| Tool | Since | Purpose |
|---|---|---|
list_frameworks |
v0.8.0 | Enumerate bundled catalogs |
get_control |
v0.8.0 | Single-control lookup |
gap_analyze |
v0.8.0 | Run gap analysis |
gap_diff |
v0.8.0 | Compare two gap reports |
conmon_list_cadences |
v0.9.6 | List CONMON cadences |
conmon_next_due |
v0.9.6 | Compute next-due date |
conmon_check_state |
v0.9.6 | Read state file → attention buckets |
conmon_health |
v0.9.6 | Health report wrapper |
gap_analyze_sarif |
v0.10.2 | Gap analysis + SARIF 2.1.0 output (CI-gate use) |
collect_ocsf |
v0.10.2 | OCSF ingestion (file mode only — URL ingest deliberately omitted to harden out the F-V101-L1 SSRF surface) |
tprm_vendor_list |
v0.10.2 | List vendors from the local TPRM store (read-only) |
poam_list |
v0.10.2 | List POA&Ms from the local store (read-only) |
verify_signed_artifact |
v0.10.4 | Verify an Evidentia signed-artifact bundle (*.ar); wraps verify_ar_file with validate_within(--allow-root) path-gating and the standard SignedToolOutput envelope. Returns the OSCAL-bound verification report. |
Tool parameter names are frozen. Tool descriptions may be refined for clarity without constituting a breaking change.
CIMD scope-grant semantics (v0.8.5+) are NOT frozen: operators
adding new tools through CIMD registry updates (via
evidentia mcp cimd-migrate in v0.9.7+) is a deployment-time
concern, not an API contract.
Operators rely on certain env vars to configure Evidentia at runtime. The names + semantics of these vars are frozen with the same guarantees as CLI flags. Removal requires a deprecation cycle.
| Env var | Since | Purpose |
|---|---|---|
EVIDENTIA_POAM_STORE_DIR |
v0.9.0 | POA&M JSON store directory |
EVIDENTIA_AI_REGISTRY_DIR |
v0.9.3 | AI-gov registry directory |
EVIDENTIA_TRUST_PROXY_HEADERS |
v0.9.5 |
X-Forwarded-For ingest gate |
EVIDENTIA_RBAC_POLICY_FILE |
v0.9.5 (FastAPI), v0.9.6 (CLI) | RBAC policy YAML path |
EVIDENTIA_RBAC_IDENTITY |
v0.9.6 | CLI RBAC identity |
EVIDENTIA_EVIDENCE_STORE_DIR |
v0.9.6 | Evidence store root directory |
EVIDENTIA_EVIDENCE_AUTO_MIRROR_WORM |
v0.9.7 | Gate auto-mirror to cloud WORM |
EVIDENTIA_EVIDENCE_WORM_BACKEND_FACTORY |
v0.9.7 | Dotted-path factory for auto-mirror backend |
| Version | Date | Change |
|---|---|---|
| DRAFT | 2026-05-16 | Initial authoring during v0.9.3 P5 |
| DRAFT | 2026-05-18 | v0.9.4 – v0.9.5 surfaces inventoried (no doc edits yet) |
| NORMATIVE | 2026-05-19 | Promoted from DRAFT during v0.9.7 P2.1. v0.9.4 – v0.9.6 surfaces backfilled: evidence WORM store, AI-gov federal fields, FIPS 199 + OMB + SCR models, CONMON MCP tools, OSCAL_SCHEMA_VERSION constant, RBAC primitives, evidence_store env vars. MCP tool contract section + env-var public-contract section added. Pre-v1.0 binding semantics in force. |
| NORMATIVE | 2026-05-22 | v0.10.0: models/finding.py joins the frozen-models table (SecurityFinding, FindingStatus, ComplianceStatus) following its additive OCSF-alignment evolution. New evidentia_core.ocsf library entry point (finding_to_ocsf / finding_from_ocsf / OCSFMappingError) added to §5. SARIF is a new evidentia gap output format — non-breaking per §3. See ocsf-mapping.md. |
| NORMATIVE | 2026-05-23 | v0.10.1: finding_from_ocsf gains an additive trust_unmapped: bool = True keyword-only parameter (closes F-V100-L1 from the v0.10.0 review). Non-breaking under §1 — additive optional parameter with default. See ocsf-mapping.md §5.1. |
| NORMATIVE | 2026-05-23 | v0.10.2: 4 new MCP tools added (gap_analyze_sarif, collect_ocsf, tprm_vendor_list, poam_list) per the MCP-as-backend theme. Append-only per the §MCP tool contract — non-breaking for existing AI clients; the 8 prior tools stay frozen. |
| NORMATIVE | 2026-05-24 | v0.10.4: (a) OutputFormat Literal extended with "ocsf" (additive-optional per §3) — evidentia gap analyze --format ocsf emits OCSF Compliance Findings (class_uid 2003), the symmetric counterpart to v0.10.0 SARIF emit + v0.10.1 OCSF ingest; (b) 13th MCP tool verify_signed_artifact added (append-only per §MCP tool contract); (c) evidentia_core.gap_analyzer.ocsf.gap_report_to_ocsf_array new public helper. No removals, no renames, no breaking changes. Reviewed under /pre-release-review skill v5.1 (first ship under v5.1). |
| NORMATIVE | 2026-05-25 | v0.10.5 Phases 7+8: OutputFormat Literal further extended with "ocsf-detection" + "cyclonedx-vex" (additive-optional per §3). evidentia gap analyze --format ocsf-detection emits OCSF Detection Findings (class_uid 2004) — SIEM-target counterpart to v0.10.4 Compliance Finding emit (Splunk / Elastic / Sentinel / Datadog ingest 2004 natively). evidentia gap analyze --format cyclonedx-vex emits CycloneDX 1.6 VEX — the supply-chain VEX surface complementing the release-time CycloneDX SBOM emit. Two new library entry points: evidentia_core.gap_analyzer.ocsf_detection.gap_report_to_ocsf_detection_array + evidentia_core.gap_analyzer.vex.gap_report_to_cyclonedx_vex. No removals, no renames, no breaking changes. |
| NORMATIVE | 2026-05-25 | v0.10.5 Phase 9: DFAH harness extracted from evidentia_ai.eval.* to a dedicated evidentia-eval workspace package (8th package). Public API moves from evidentia_ai.eval to evidentia_eval (same symbols, same signatures). The evidentia_ai.eval.* path is preserved as a deprecation shim through v0.11.x with a DeprecationWarning at import time; removal scheduled for v0.12.0 (a documented breaking change with a 2-minor-version migration window per §1). The evidentia-ai[eval-faithfulness] extra now proxies to evidentia-eval[faithfulness-semantic] — same packages, new home. Rationale: air-gap installs of the production risk-statement runtime no longer transitively pull the dev-time eval stack. |
| NORMATIVE | 2026-05-25 | v0.10.5 Phase 10: Collector idempotency hardening. New evidentia_core.models.common.deterministic_finding_id(source_system, source_finding_id) helper computes a UUID v5 from natural keys under the pinned NAMESPACE_EVIDENTIA_FINDING namespace. A new @model_validator(mode="before") on SecurityFinding runs the derivation when no explicit id= is supplied AND both source_system + source_finding_id are present at construction. Effect: two collect() calls against an unchanged source produce findings with byte-identical id values across runs. Additive-only; explicit id= always wins, OCSF round-trip via unmapped["evidentia"] unchanged, pre-v0.10.5 OSCAL AR documents continue to load. See docs/collector-idempotency-audit.md. |
| NORMATIVE | 2026-05-26 | v0.10.6 Phase 1 (commit C1): catalogs. Three new bundled YAML catalogs (osps-baseline-m1.yaml, osps-baseline-m2.yaml, osps-baseline-m3.yaml) bundling the OpenSSF OSPS Baseline at upstream commit ac6bbec (Apache-2.0, Tier-A verbatim). Catalog entries are OSPS assessment-requirements (per-maturity-level applicability filter): M1=25, M2=42, M3=63 (counts verified against upstream tarball; the v0.10.6 plan §Phase 1 expected 21/38/58 — upstream actual is used). Companion OSCAL Catalog 1.2.1 serialization shipped at osps-baseline.oscal.json (8 groups / 41 top-level OSPS controls, mirroring upstream top-level granularity per OSCAL Catalog convention; validated against Trestle 4.0.3 pydantic models). Additive-only per frozen-surface contract — existing 89 catalogs unchanged. scripts/catalogs/regenerate_manifest.py extended with *.oscal.json / *.oscal.yaml skip-filter so OSCAL sidecar artifacts don't register as manifest entries. Manifest count: 89 → 92 frameworks. |
| NORMATIVE | 2026-05-27 | v0.10.6 Phase 5 (commit C5): CrosswalkDefinition extended with 3 optional fields — provenance: str | None, verification: Literal["self-attested-via-upstream", "hand-checked"] | None, verification_note: str | None. Additive-only per frozen-surface contract; the existing 8 in-tree crosswalks load unchanged (new fields default to None). 5 new OSPS-Baseline crosswalks land alongside in catalogs/data/mappings/: osps-baseline_to_nist-ssdf-800-218.json, osps-baseline_to_nist-csf-2.0.json, osps-baseline_to_eu-cra.json, osps-baseline_to_pci-dss-4.0.json, osps-baseline_to_nist-800-161.json. Mappings auto-extracted from the OpenSSF OSPS Baseline guidelines[] array at upstream commit ac6bbec; carry provenance="upstream-osps-guidelines" + verification="self-attested-via-upstream". Consumers requiring independent verification should plan a hand-check pass. See docs/v0.10.6-plan.md §Phase 5 + §12.1 for the brainstorm-vs-codebase pre-correction rationale. |
| NORMATIVE | 2026-05-27 | v0.10.6 Phase 6 (commit C6): new evidentia_collectors.github.osps module with 16 populate_osps_*(client, owner, repo) -> SecurityFinding helpers covering OSPS-AC/BR/DO/GV/LE/QA/VM family controls via GitHub REST API. Each helper sets compliance_status (PASS/FAIL/WARNING/NOT_APPLICABLE/UNKNOWN) + an osps-baseline ControlMapping plus optional NIST SP 800-53 Rev 5 cross-walk mappings; source_finding_id follows the deterministic osps-<id>:<owner>/<repo>[:<scope>] pattern that feeds the v0.10.5 P10 idempotent-id derivation. Coverage registry exposed as evidentia_collectors.github.osps.OSPS_COVERAGE: dict[str, str]. Additive-only per frozen-surface contract — existing GitHubCollector + DependabotCollector entry points unchanged. GitHubClient extended additively with 4 small probe methods: list_releases, are_vulnerability_alerts_enabled, is_code_scanning_enabled, list_security_advisories. OSPS-VM-05.03 helper is intentionally complementary to the existing DependabotCollector (posture-finding vs per-CVE evidence chain); both emit findings, neither subsumes the other. The 16 OSPS ids covered: OSPS-AC-03.01/03.02, OSPS-BR-06.01, OSPS-DO-02.01, OSPS-GV-03.01, OSPS-LE-02.01/03.01, OSPS-QA-01.01/01.02/02.01/03.01, OSPS-VM-02.01/03.01/04.01/05.03/06.02. |
-
- AI Governance
- Air Gapped Install
- Ci Integration
- CONMON Deployment
- Emit Cyclonedx VEX
- Emit OCSF Detection
- Emit SARIF
- Explain Controls
- Generate And Quantify Risk
- Governance Metrics And Workflows
- Ingest OCSF
- Manage Model Risk
- Manage POAM
- Manage Third Party Risk
- MCP Client Setup
- OSPS Self Assessment
- Run Gap Analysis
- Serve The Web Ui
- Sign And Verify Evidence