cernus-core 0.1.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
cernus_core/README.md ADDED
@@ -0,0 +1,27 @@
1
+ # cernus-core
2
+
3
+ The open core of [Cernus](https://github.com/Inceptium-ai/cernus-framework):
4
+ runtime security, continuous compliance, and ATO evidence for deployed
5
+ applications.
6
+
7
+ `cernus-core` has no server, no database, and no network calls of its own. It gives you:
8
+
9
+ - **Contracts** (`contracts/*.schema.json`) — versioned JSON Schemas for
10
+ `Finding`, `Asset`, `System`, `Deployment`, `PolicySet`, `Decision`,
11
+ `ControlResult`, `EvidenceRecord`, and the `IngestBatch` envelope. Any tool
12
+ can produce or consume Cernus objects; the schemas ship inside the wheel.
13
+ - **Model** (`cernus_core.model`) — dataclasses for those objects, with stable
14
+ fingerprints for deduplication.
15
+ - **Plugin SDK** (`cernus_core.plugins`) — `Connector` (turn a tool's output
16
+ into an `IngestBatch`), `Scanner` (invoke a tool you already have),
17
+ `Exporter` (write OSCAL/SARIF). Plugins register via entry points; built-ins
18
+ win on name collision; a broken plugin is reported, never fatal.
19
+ - **Policy engine** (`cernus_core.policy`) — deterministic, priority-ordered,
20
+ first-match triage rules with a recorded reason per decision, and an explicit
21
+ *unmatched* outcome that becomes the human-review queue.
22
+
23
+ Most people want the CLI: `pip install cernus-cli`.
24
+
25
+ ## License
26
+
27
+ Apache-2.0.
@@ -0,0 +1,36 @@
1
+ """Cernus core — canonical model, contracts, plugin SDK, policy engine."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from .contracts import contracts_dir, validate
6
+ from .model import (
7
+ Asset,
8
+ Decision,
9
+ Deployment,
10
+ EvidenceRecord,
11
+ Finding,
12
+ IngestBatch,
13
+ Sbom,
14
+ Severity,
15
+ System,
16
+ )
17
+ from .serialize import batch_from_dict, read_batch, write_batch
18
+
19
+ __all__ = [
20
+ "Asset",
21
+ "Decision",
22
+ "Deployment",
23
+ "EvidenceRecord",
24
+ "Finding",
25
+ "IngestBatch",
26
+ "Sbom",
27
+ "Severity",
28
+ "System",
29
+ "batch_from_dict",
30
+ "contracts_dir",
31
+ "read_batch",
32
+ "validate",
33
+ "write_batch",
34
+ ]
35
+
36
+ __version__ = "0.1.0"
@@ -0,0 +1,139 @@
1
+ {
2
+ "catalog": "nist-800-53r5",
3
+ "title": "NIST SP 800-53 Rev. 5 — Cernus runtime crosswalk (Moderate subset)",
4
+ "description": "Controls Cernus can evaluate from runtime facts: scan freshness, open findings and SLA state, SBOM inventory, gate evidence, exceptions. Each control lists the facts it reads and the rule used. Extend by adding entries; the evaluator is generic over `rule`.",
5
+ "version": "0.1.0",
6
+ "controls": [
7
+ {
8
+ "id": "RA-5",
9
+ "title": "Vulnerability Monitoring and Scanning",
10
+ "family": "RA",
11
+ "rule": "scan_fresh",
12
+ "facts": ["freshness.stale", "last_scan_at"],
13
+ "evidence_kinds": ["scan", "rescan", "sbom"],
14
+ "statement": "Monitor and scan for vulnerabilities in the system and hosted applications at the organization-defined frequency (FedRAMP: monthly), and when new vulnerabilities are identified."
15
+ },
16
+ {
17
+ "id": "RA-5(2)",
18
+ "title": "Update Vulnerabilities to be Scanned",
19
+ "family": "RA",
20
+ "rule": "rescan_present",
21
+ "facts": ["evidence.rescan"],
22
+ "evidence_kinds": ["rescan"],
23
+ "statement": "Update the system vulnerabilities to be scanned prior to a new scan and when new vulnerabilities are identified and reported."
24
+ },
25
+ {
26
+ "id": "SI-2",
27
+ "title": "Flaw Remediation",
28
+ "family": "SI",
29
+ "rule": "sla_met",
30
+ "facts": ["sla.overdue_total", "findings.open"],
31
+ "evidence_kinds": ["rescan", "change"],
32
+ "statement": "Identify, report, and correct system flaws; install security-relevant updates within the organization-defined time period (FedRAMP: 30/90/180 days by severity)."
33
+ },
34
+ {
35
+ "id": "SI-2(2)",
36
+ "title": "Automated Flaw Remediation Status",
37
+ "family": "SI",
38
+ "rule": "rescan_present",
39
+ "facts": ["evidence.rescan"],
40
+ "evidence_kinds": ["rescan"],
41
+ "statement": "Determine if system components have applicable security-relevant updates installed using automated mechanisms."
42
+ },
43
+ {
44
+ "id": "CM-8",
45
+ "title": "System Component Inventory",
46
+ "family": "CM",
47
+ "rule": "inventory_with_sbom",
48
+ "facts": ["assets", "sboms"],
49
+ "evidence_kinds": ["sbom", "deploy"],
50
+ "statement": "Develop and document an inventory of system components that accurately reflects the system and is at the level of granularity deemed necessary for tracking and reporting."
51
+ },
52
+ {
53
+ "id": "CM-3",
54
+ "title": "Configuration Change Control",
55
+ "family": "CM",
56
+ "rule": "change_controlled",
57
+ "facts": ["latest_deployment.change_id", "latest_deployment.gate_status"],
58
+ "evidence_kinds": ["gate_run", "deploy"],
59
+ "statement": "Determine and document the types of changes that are configuration-controlled; review and approve changes with explicit consideration for security impact."
60
+ },
61
+ {
62
+ "id": "CM-6",
63
+ "title": "Configuration Settings",
64
+ "family": "CM",
65
+ "rule": "no_open_category",
66
+ "params": {"category": "misconfiguration"},
67
+ "facts": ["findings.open_by_category.misconfiguration"],
68
+ "evidence_kinds": ["scan"],
69
+ "statement": "Establish, document, and implement configuration settings using organization-defined security configuration checklists; identify and correct deviations."
70
+ },
71
+ {
72
+ "id": "IA-5(7)",
73
+ "title": "No Embedded Unencrypted Static Authenticators",
74
+ "family": "IA",
75
+ "rule": "no_open_category",
76
+ "params": {"category": "secret"},
77
+ "facts": ["findings.open_by_category.secret"],
78
+ "evidence_kinds": ["scan", "gate_run"],
79
+ "statement": "Ensure that unencrypted static authenticators are not embedded in applications or other forms of static storage."
80
+ },
81
+ {
82
+ "id": "SA-11",
83
+ "title": "Developer Testing and Evaluation",
84
+ "family": "SA",
85
+ "rule": "gates_passed",
86
+ "params": {"gates": ["unit-tests"]},
87
+ "facts": ["latest_deployment.evidence.gate_results"],
88
+ "evidence_kinds": ["gate_run"],
89
+ "statement": "Require the developer of the system to create and implement a security assessment plan and perform testing and evaluation at the organization-defined depth and coverage."
90
+ },
91
+ {
92
+ "id": "SA-11(1)",
93
+ "title": "Static Code Analysis",
94
+ "family": "SA",
95
+ "rule": "gates_passed",
96
+ "params": {"gates": ["sast"]},
97
+ "facts": ["latest_deployment.evidence.gate_results"],
98
+ "evidence_kinds": ["gate_run"],
99
+ "statement": "Require the developer to employ static code analysis tools to identify common flaws and document the results of the analysis."
100
+ },
101
+ {
102
+ "id": "SA-11(2)",
103
+ "title": "Threat Modeling and Vulnerability Analyses",
104
+ "family": "SA",
105
+ "rule": "gates_passed",
106
+ "params": {"gates": ["dependency-scan"]},
107
+ "facts": ["latest_deployment.evidence.gate_results"],
108
+ "evidence_kinds": ["gate_run"],
109
+ "statement": "Require the developer to perform vulnerability analyses during development and the subsequent testing and evaluation of the system."
110
+ },
111
+ {
112
+ "id": "SR-4",
113
+ "title": "Provenance",
114
+ "family": "SR",
115
+ "rule": "inventory_with_sbom",
116
+ "facts": ["assets", "sboms"],
117
+ "evidence_kinds": ["sbom", "deploy"],
118
+ "statement": "Document, monitor, and maintain valid provenance of systems, system components, and associated data."
119
+ },
120
+ {
121
+ "id": "CA-7",
122
+ "title": "Continuous Monitoring",
123
+ "family": "CA",
124
+ "rule": "scan_fresh",
125
+ "facts": ["freshness.stale"],
126
+ "evidence_kinds": ["scan", "rescan", "control_evaluation"],
127
+ "statement": "Develop a system-level continuous monitoring strategy and implement continuous monitoring including ongoing control assessments and security status reporting."
128
+ },
129
+ {
130
+ "id": "CA-5",
131
+ "title": "Plan of Action and Milestones",
132
+ "family": "CA",
133
+ "rule": "poam_current",
134
+ "facts": ["sla.overdue_total", "exceptions"],
135
+ "evidence_kinds": ["exception", "control_evaluation"],
136
+ "statement": "Develop a plan of action and milestones to document planned remediation actions and update it based on findings from assessments and continuous monitoring."
137
+ }
138
+ ]
139
+ }
@@ -0,0 +1,36 @@
1
+ """Control catalogs / crosswalks shipped with the wheel (``catalogs/*.json``).
2
+
3
+ A crosswalk maps controls to the runtime facts Cernus can observe and names a
4
+ ``rule`` the evaluator applies. The data is open; the continuous evaluation
5
+ service is commercial.
6
+ """
7
+
8
+ from __future__ import annotations
9
+
10
+ import json
11
+ import os
12
+ from functools import cache
13
+ from pathlib import Path
14
+ from typing import Any
15
+
16
+
17
+ def catalogs_dir() -> Path:
18
+ env = os.environ.get("CERNUS_CATALOGS_DIR")
19
+ if env:
20
+ return Path(env)
21
+ here = Path(__file__).resolve()
22
+ packaged = here.parent / "catalogs"
23
+ if packaged.is_dir():
24
+ return packaged
25
+ return here.parents[2] / "catalogs"
26
+
27
+
28
+ @cache
29
+ def load_crosswalk(name: str = "nist-800-53r5") -> dict[str, Any]:
30
+ path = catalogs_dir() / f"{name}-crosswalk.json"
31
+ with path.open() as fh:
32
+ return json.load(fh)
33
+
34
+
35
+ def controls(name: str = "nist-800-53r5") -> list[dict[str, Any]]:
36
+ return list(load_crosswalk(name)["controls"])
@@ -0,0 +1,39 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://cernus.ai/schemas/asset.schema.json",
4
+ "title": "Cernus Asset",
5
+ "description": "Something that exists in a deployed environment and can carry findings.",
6
+ "type": "object",
7
+ "required": ["apiVersion", "kind", "id", "asset_kind", "name"],
8
+ "additionalProperties": false,
9
+ "properties": {
10
+ "apiVersion": { "const": "cernus.ai/v0" },
11
+ "kind": { "const": "Asset" },
12
+ "id": { "$ref": "common.schema.json#/$defs/id" },
13
+ "asset_kind": { "enum": ["container_image", "container", "service", "host", "database", "cloud_resource", "repository", "kubernetes_workload", "network", "identity", "other"] },
14
+ "name": { "type": "string" },
15
+ "identifiers": {
16
+ "type": "object",
17
+ "description": "Tool-neutral identity facets used for reconciliation.",
18
+ "additionalProperties": { "type": "string" },
19
+ "properties": {
20
+ "digest": { "type": "string" },
21
+ "image_ref": { "type": "string" },
22
+ "purl": { "type": "string" },
23
+ "arn": { "type": "string" },
24
+ "hostname": { "type": "string" },
25
+ "ip": { "type": "string" },
26
+ "url": { "type": "string" }
27
+ }
28
+ },
29
+ "system_id": { "type": ["string", "null"] },
30
+ "deployment_id": { "type": ["string", "null"] },
31
+ "environment": { "$ref": "common.schema.json#/$defs/environment" },
32
+ "internet_facing": { "type": ["boolean", "null"] },
33
+ "data_classification": { "$ref": "common.schema.json#/$defs/dataClassification" },
34
+ "owner": { "type": ["string", "null"] },
35
+ "parent_id": { "type": ["string", "null"], "description": "Topology edge: the asset this one runs inside / behind" },
36
+ "tags": { "type": "array", "items": { "type": "string" } },
37
+ "source": { "$ref": "common.schema.json#/$defs/source" }
38
+ }
39
+ }
@@ -0,0 +1,22 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://cernus.ai/schemas/common.schema.json",
4
+ "title": "Cernus shared definitions",
5
+ "$defs": {
6
+ "id": { "type": "string", "minLength": 1 },
7
+ "timestamp": { "type": "string", "format": "date-time" },
8
+ "severity": { "enum": ["critical", "high", "medium", "low", "info"] },
9
+ "environment": { "enum": ["production", "staging", "development", "test", "ephemeral", "unknown"] },
10
+ "dataClassification": { "enum": ["public", "internal", "confidential", "pii", "phi", "cui", "unknown"] },
11
+ "source": {
12
+ "type": "object",
13
+ "required": ["tool"],
14
+ "additionalProperties": false,
15
+ "properties": {
16
+ "tool": { "type": "string", "description": "Producing tool, e.g. trivy, genesis-gates, nessus" },
17
+ "version": { "type": ["string", "null"] },
18
+ "connector": { "type": ["string", "null"], "description": "Cernus connector that normalized it" }
19
+ }
20
+ }
21
+ }
22
+ }
@@ -0,0 +1,23 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://cernus.ai/schemas/control-result.schema.json",
4
+ "title": "Cernus Control Result",
5
+ "description": "The evaluated state of one control for one system at a point in time. OSCAL-aligned: exports as an assessment-results observation/finding.",
6
+ "type": "object",
7
+ "required": ["apiVersion", "kind", "id", "system_id", "catalog", "control_id", "status", "evaluated_at"],
8
+ "additionalProperties": false,
9
+ "properties": {
10
+ "apiVersion": { "const": "cernus.ai/v0" },
11
+ "kind": { "const": "ControlResult" },
12
+ "id": { "$ref": "common.schema.json#/$defs/id" },
13
+ "system_id": { "$ref": "common.schema.json#/$defs/id" },
14
+ "catalog": { "type": "string", "description": "e.g. nist-800-53r5" },
15
+ "control_id": { "type": "string", "description": "e.g. RA-5, SI-2(2)" },
16
+ "status": { "enum": ["satisfied", "partial", "unsatisfied", "not_applicable", "unknown"] },
17
+ "rationale": { "type": ["string", "null"] },
18
+ "evidence_ids": { "type": "array", "items": { "type": "string" } },
19
+ "evaluated_at": { "$ref": "common.schema.json#/$defs/timestamp" },
20
+ "freshness_ttl_hours": { "type": ["integer", "null"], "minimum": 1 },
21
+ "evaluator": { "type": "string", "description": "rule id, validator plugin, or human" }
22
+ }
23
+ }
@@ -0,0 +1,26 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://cernus.ai/schemas/decision.schema.json",
4
+ "title": "Cernus Decision",
5
+ "description": "One triage outcome for one finding, with provenance. Every classification — by rule, by model, or by a person — is one of these.",
6
+ "type": "object",
7
+ "required": ["apiVersion", "kind", "id", "finding_id", "actor", "action", "created_at"],
8
+ "additionalProperties": false,
9
+ "properties": {
10
+ "apiVersion": { "const": "cernus.ai/v0" },
11
+ "kind": { "const": "Decision" },
12
+ "id": { "$ref": "common.schema.json#/$defs/id" },
13
+ "finding_id": { "$ref": "common.schema.json#/$defs/id" },
14
+ "actor": { "enum": ["rule", "model", "human"] },
15
+ "policy_set_id": { "type": ["string", "null"] },
16
+ "policy_set_version": { "type": ["integer", "null"] },
17
+ "rule_id": { "type": ["string", "null"] },
18
+ "model": { "type": ["string", "null"] },
19
+ "actor_name": { "type": ["string", "null"], "description": "Username for human decisions" },
20
+ "action": { "enum": ["classify", "assign", "set_autonomy", "suppress", "accept", "escalate", "unmatched"] },
21
+ "params": { "type": "object", "additionalProperties": true },
22
+ "reason": { "type": ["string", "null"] },
23
+ "confidence": { "type": ["number", "null"], "minimum": 0, "maximum": 1 },
24
+ "created_at": { "$ref": "common.schema.json#/$defs/timestamp" }
25
+ }
26
+ }
@@ -0,0 +1,37 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://cernus.ai/schemas/deployment.schema.json",
4
+ "title": "Cernus Deployment",
5
+ "description": "One act of putting a system into an environment. Carries the build-time evidence so Day-2 findings can be compared against what was proven at deploy time.",
6
+ "type": "object",
7
+ "required": ["apiVersion", "kind", "id", "system_id", "environment", "deployed_at"],
8
+ "additionalProperties": false,
9
+ "properties": {
10
+ "apiVersion": { "const": "cernus.ai/v0" },
11
+ "kind": { "const": "Deployment" },
12
+ "id": { "$ref": "common.schema.json#/$defs/id" },
13
+ "system_id": { "$ref": "common.schema.json#/$defs/id" },
14
+ "environment": { "$ref": "common.schema.json#/$defs/environment" },
15
+ "deployed_at": { "$ref": "common.schema.json#/$defs/timestamp" },
16
+ "deployed_by": { "type": ["string", "null"] },
17
+ "change_id": { "type": ["string", "null"], "description": "Genesis change id / PR / ticket" },
18
+ "artifact_refs": {
19
+ "type": "array",
20
+ "items": {
21
+ "type": "object",
22
+ "required": ["name"],
23
+ "additionalProperties": false,
24
+ "properties": {
25
+ "name": { "type": "string" },
26
+ "image_ref": { "type": ["string", "null"] },
27
+ "digest": { "type": ["string", "null"] }
28
+ }
29
+ }
30
+ },
31
+ "sbom_ids": { "type": "array", "items": { "type": "string" } },
32
+ "manifest": { "type": ["object", "null"], "description": "Embedded genesis-gates DeliveryManifest, if any" },
33
+ "evidence": { "type": ["object", "null"], "description": "Embedded genesis-gates EvidencePackage, if any" },
34
+ "preview_url": { "type": ["string", "null"] },
35
+ "source": { "$ref": "common.schema.json#/$defs/source" }
36
+ }
37
+ }
@@ -0,0 +1,23 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://cernus.ai/schemas/evidence-record.schema.json",
4
+ "title": "Cernus Evidence Record",
5
+ "description": "Immutable, hashed record of something that happened: a scan, a gate run, a decision, a change, a verification. The ledger primitive behind verified closure and ATO evidence.",
6
+ "type": "object",
7
+ "required": ["apiVersion", "kind", "id", "record_kind", "subject_kind", "subject_id", "hash", "produced_by", "created_at"],
8
+ "additionalProperties": false,
9
+ "properties": {
10
+ "apiVersion": { "const": "cernus.ai/v0" },
11
+ "kind": { "const": "EvidenceRecord" },
12
+ "id": { "$ref": "common.schema.json#/$defs/id" },
13
+ "record_kind": { "enum": ["scan", "gate_run", "sbom", "decision", "change", "deploy", "rescan", "approval", "exception", "control_evaluation", "other"] },
14
+ "subject_kind": { "enum": ["finding", "deployment", "system", "asset", "control", "policy_set"] },
15
+ "subject_id": { "$ref": "common.schema.json#/$defs/id" },
16
+ "summary": { "type": ["string", "null"] },
17
+ "payload": { "type": ["object", "null"] },
18
+ "payload_ref": { "type": ["string", "null"], "description": "URI to a stored blob when payload is large" },
19
+ "hash": { "type": "string", "description": "sha256 of canonical JSON of payload (or of the blob)" },
20
+ "produced_by": { "type": "string", "description": "tool, plugin, rule id, or user" },
21
+ "created_at": { "$ref": "common.schema.json#/$defs/timestamp" }
22
+ }
23
+ }
@@ -0,0 +1,236 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://cernus.ai/schemas/finding.schema.json",
4
+ "title": "Cernus Finding",
5
+ "description": "One normalized security finding. Superset of the genesis-gates evidence finding (gate/title/severity/detail/location/remediation) so a Genesis EvidencePackage maps losslessly.",
6
+ "type": "object",
7
+ "required": [
8
+ "apiVersion",
9
+ "kind",
10
+ "id",
11
+ "fingerprint",
12
+ "title",
13
+ "severity",
14
+ "source",
15
+ "status",
16
+ "first_seen",
17
+ "last_seen"
18
+ ],
19
+ "additionalProperties": false,
20
+ "properties": {
21
+ "apiVersion": {
22
+ "const": "cernus.ai/v0"
23
+ },
24
+ "kind": {
25
+ "const": "Finding"
26
+ },
27
+ "id": {
28
+ "$ref": "common.schema.json#/$defs/id"
29
+ },
30
+ "fingerprint": {
31
+ "type": "string",
32
+ "description": "Stable dedup key: sha256 over (source.tool, vuln id or rule id, component purl or location, asset id). Same issue seen again keeps the same fingerprint."
33
+ },
34
+ "source": {
35
+ "$ref": "common.schema.json#/$defs/source"
36
+ },
37
+ "source_ref": {
38
+ "type": [
39
+ "string",
40
+ "null"
41
+ ],
42
+ "description": "Tool-native identifier (plugin id, rule id, check id)"
43
+ },
44
+ "gate": {
45
+ "type": [
46
+ "string",
47
+ "null"
48
+ ],
49
+ "description": "genesis-gates gate name when the finding came from Genesis"
50
+ },
51
+ "category": {
52
+ "enum": [
53
+ "vulnerability",
54
+ "misconfiguration",
55
+ "secret",
56
+ "sast",
57
+ "license",
58
+ "compliance",
59
+ "other"
60
+ ]
61
+ },
62
+ "title": {
63
+ "type": "string"
64
+ },
65
+ "severity": {
66
+ "$ref": "common.schema.json#/$defs/severity"
67
+ },
68
+ "detail": {
69
+ "type": [
70
+ "string",
71
+ "null"
72
+ ]
73
+ },
74
+ "location": {
75
+ "type": [
76
+ "string",
77
+ "null"
78
+ ]
79
+ },
80
+ "remediation": {
81
+ "type": [
82
+ "string",
83
+ "null"
84
+ ]
85
+ },
86
+ "vuln": {
87
+ "type": [
88
+ "object",
89
+ "null"
90
+ ],
91
+ "additionalProperties": false,
92
+ "properties": {
93
+ "id": {
94
+ "type": "string",
95
+ "description": "CVE-\u2026, GHSA-\u2026, or tool id"
96
+ },
97
+ "cwe": {
98
+ "type": "array",
99
+ "items": {
100
+ "type": "string"
101
+ }
102
+ },
103
+ "cvss": {
104
+ "type": [
105
+ "number",
106
+ "null"
107
+ ],
108
+ "minimum": 0,
109
+ "maximum": 10
110
+ },
111
+ "cvss_vector": {
112
+ "type": [
113
+ "string",
114
+ "null"
115
+ ]
116
+ },
117
+ "epss": {
118
+ "type": [
119
+ "number",
120
+ "null"
121
+ ],
122
+ "minimum": 0,
123
+ "maximum": 1
124
+ },
125
+ "kev": {
126
+ "type": [
127
+ "boolean",
128
+ "null"
129
+ ]
130
+ },
131
+ "published": {
132
+ "type": [
133
+ "string",
134
+ "null"
135
+ ]
136
+ },
137
+ "references": {
138
+ "type": "array",
139
+ "items": {
140
+ "type": "string"
141
+ }
142
+ }
143
+ }
144
+ },
145
+ "component": {
146
+ "type": [
147
+ "object",
148
+ "null"
149
+ ],
150
+ "additionalProperties": false,
151
+ "properties": {
152
+ "purl": {
153
+ "type": [
154
+ "string",
155
+ "null"
156
+ ]
157
+ },
158
+ "name": {
159
+ "type": "string"
160
+ },
161
+ "version": {
162
+ "type": [
163
+ "string",
164
+ "null"
165
+ ]
166
+ },
167
+ "fixed_version": {
168
+ "type": [
169
+ "string",
170
+ "null"
171
+ ]
172
+ },
173
+ "type": {
174
+ "type": [
175
+ "string",
176
+ "null"
177
+ ],
178
+ "description": "os package, library, binary\u2026"
179
+ }
180
+ }
181
+ },
182
+ "asset_id": {
183
+ "type": [
184
+ "string",
185
+ "null"
186
+ ]
187
+ },
188
+ "deployment_id": {
189
+ "type": [
190
+ "string",
191
+ "null"
192
+ ]
193
+ },
194
+ "system_id": {
195
+ "type": [
196
+ "string",
197
+ "null"
198
+ ]
199
+ },
200
+ "status": {
201
+ "enum": [
202
+ "open",
203
+ "fixed",
204
+ "accepted",
205
+ "false_positive",
206
+ "suppressed"
207
+ ]
208
+ },
209
+ "first_seen": {
210
+ "$ref": "common.schema.json#/$defs/timestamp"
211
+ },
212
+ "last_seen": {
213
+ "$ref": "common.schema.json#/$defs/timestamp"
214
+ },
215
+ "tags": {
216
+ "type": "array",
217
+ "items": {
218
+ "type": "string"
219
+ }
220
+ },
221
+ "raw": {
222
+ "type": [
223
+ "object",
224
+ "null"
225
+ ],
226
+ "description": "Tool-native record. Stored, never exported."
227
+ },
228
+ "scan_scope": {
229
+ "type": [
230
+ "string",
231
+ "null"
232
+ ],
233
+ "description": "What the producing scan covered (e.g. container_image, cyclonedx, filesystem, repository). Verified closure only compares findings with the same asset, tool, and scope."
234
+ }
235
+ }
236
+ }