@mitre/hdf-schema 3.7.2 → 3.8.0-next.42533588944.1

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.
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "$schema": "https://json-schema.org/draft/2020-12/schema",
3
- "$id": "https://mitre.github.io/hdf-libs/schemas/hdf-plan/v3.7.0",
3
+ "$id": "https://mitre.github.io/hdf-libs/schemas/hdf-plan/v3.8.0",
4
4
  "title": "HDF Plan",
5
5
  "description": "Defines an assessment plan — what baselines to run against which targets, with resolved inputs and scheduling. Maps to OSCAL Assessment Plan.",
6
6
  "type": "object",
@@ -13,7 +13,7 @@
13
13
  "externalReferences": {
14
14
  "type": "array",
15
15
  "items": {
16
- "$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.7.0#/$defs/External_Reference"
16
+ "$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.8.0#/$defs/External_Reference"
17
17
  },
18
18
  "description": "Optional references to external artifacts relevant to this assessment plan (CTI/STIX, advisories, methodology docs, or any URI-addressable artifact). Inert context; see External_Reference."
19
19
  },
@@ -27,7 +27,7 @@
27
27
  "description": "Human-readable plan name. Example: 'Portal Monthly Assessment'."
28
28
  },
29
29
  "type": {
30
- "$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/plan/v3.7.0#/$defs/Plan_Type",
30
+ "$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/plan/v3.8.0#/$defs/Plan_Type",
31
31
  "description": "The type of assessment plan."
32
32
  },
33
33
  "description": {
@@ -43,12 +43,12 @@
43
43
  "type": "array",
44
44
  "minItems": 1,
45
45
  "items": {
46
- "$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/plan/v3.7.0#/$defs/Assessment"
46
+ "$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/plan/v3.8.0#/$defs/Assessment"
47
47
  },
48
48
  "description": "The assessments to perform. Each assessment pairs a baseline with targets and resolved inputs."
49
49
  },
50
50
  "schedule": {
51
- "$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/plan/v3.7.0#/$defs/Schedule",
51
+ "$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/plan/v3.8.0#/$defs/Schedule",
52
52
  "description": "Optional scheduling configuration for recurring assessments."
53
53
  },
54
54
  "labels": {
@@ -59,7 +59,7 @@
59
59
  "description": "Optional key-value labels for grouping and querying plans."
60
60
  },
61
61
  "integrity": {
62
- "$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/extensions/v3.7.0#/$defs/Integrity",
62
+ "$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/extensions/v3.8.0#/$defs/Integrity",
63
63
  "description": "Cryptographic integrity information for verifying this plan document has not been tampered with."
64
64
  },
65
65
  "version": {
@@ -67,8 +67,12 @@
67
67
  "description": "Version of this plan document."
68
68
  },
69
69
  "generator": {
70
- "$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/extensions/v3.7.0#/$defs/Generator",
70
+ "$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/extensions/v3.8.0#/$defs/Generator",
71
71
  "description": "Information about the tool that generated this plan."
72
+ },
73
+ "extensions": {
74
+ "$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/extensions/v3.8.0#/$defs/Extensions",
75
+ "description": "Producer data outside the HDF model, and the pre-converted source artifact(s) this plan was converted from."
72
76
  }
73
77
  },
74
78
  "examples": [
@@ -101,16 +105,29 @@
101
105
  }
102
106
  ],
103
107
  "$defs": {
104
- "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.7.0": {
108
+ "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.8.0": {
105
109
  "$schema": "https://json-schema.org/draft/2020-12/schema",
106
- "$id": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.7.0",
110
+ "$id": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.8.0",
107
111
  "title": "HDF Common Primitives",
108
112
  "description": "Shared building blocks used by hdf-results and hdf-baseline schemas.",
109
113
  "$defs": {
114
+ "External_Reference_Encoding": {
115
+ "type": "string",
116
+ "enum": [
117
+ "utf-8",
118
+ "base64"
119
+ ],
120
+ "description": "How an embedded copy's bytes are read back: 'utf-8' for text, 'base64' for anything that is not valid UTF-8 text.",
121
+ "title": "External Reference Encoding",
122
+ "examples": [
123
+ "base64"
124
+ ],
125
+ "$comment": "Examples, in order: 1) a binary artifact, embedded base64-encoded."
126
+ },
110
127
  "External_Reference": {
111
128
  "type": "object",
112
129
  "title": "External Reference",
113
- "description": "A generalized reference to any external artifact by identity and/or location, modeled on the STIX 2.1 `external_references` common property.\n\nPurpose-agnostic: cite a CVE, an ATT&CK technique, a STIX bundle/object, a BOM, a runbook, or any vendor artifact — including kinds with no dedicated HDF reference category.\n\n`sourceName` names the system; `externalId` cites by id within that system; `href` locates it. `sourceName` + `externalId` is equivalently a URN (`urn:<sourceName>:<externalId>`, RFC 8141), so the by-identity and by-location forms stay interconvertible.\n\nA reference is inert context: it overrides nothing, so it carries only lightweight optional `addedBy`/`addedAt` attribution, never override machinery.",
130
+ "description": "A generalized reference to any external artifact by identity and/or location, modeled on the STIX 2.1 `external_references` common property.\n\nPurpose-agnostic: cite a CVE, an ATT&CK technique, a STIX bundle/object, a BOM, a runbook, or any vendor artifact — including kinds with no dedicated HDF reference category.\n\n`sourceName` names the system; `externalId` cites by id within that system; `href` locates it. `sourceName` + `externalId` is equivalently a URN (`urn:<sourceName>:<externalId>`, RFC 8141), so the by-identity and by-location forms stay interconvertible.\n\nAn entry may also carry the artifact itself rather than point at it: `document` for a JSON object, `content` + `encoding` for anything else. Embedding satisfies the at-least-one rule on its own, so an artifact with no meaningful public location needs no synthetic `href`.\n\nA reference is inert context: it overrides nothing, so it carries only lightweight optional `addedBy`/`addedAt` attribution, never override machinery.",
114
131
  "required": [
115
132
  "sourceName"
116
133
  ],
@@ -129,6 +146,42 @@
129
146
  "required": [
130
147
  "description"
131
148
  ]
149
+ },
150
+ {
151
+ "required": [
152
+ "content"
153
+ ]
154
+ },
155
+ {
156
+ "required": [
157
+ "document"
158
+ ]
159
+ }
160
+ ],
161
+ "allOf": [
162
+ {
163
+ "if": {
164
+ "required": [
165
+ "content"
166
+ ]
167
+ },
168
+ "then": {
169
+ "required": [
170
+ "encoding"
171
+ ]
172
+ }
173
+ },
174
+ {
175
+ "if": {
176
+ "required": [
177
+ "encoding"
178
+ ]
179
+ },
180
+ "then": {
181
+ "required": [
182
+ "content"
183
+ ]
184
+ }
132
185
  }
133
186
  ],
134
187
  "properties": {
@@ -144,7 +197,7 @@
144
197
  "href": {
145
198
  "type": "string",
146
199
  "format": "uri-reference",
147
- "description": "Location of the artifact. `uri-reference` (not `uri`) so a bare internal `#fragment`/`#uuid` reference is expressible alongside absolute URLs. `checksum`/`mediaType` apply only to a retrievable `href`."
200
+ "description": "Location of the artifact. `uri-reference` (not `uri`) so a bare internal `#fragment`/`#uuid` reference is expressible alongside absolute URLs. Set it only when the location is meaningful to a reader — never a producer's local filesystem path."
148
201
  },
149
202
  "description": {
150
203
  "type": "string",
@@ -156,11 +209,11 @@
156
209
  },
157
210
  "mediaType": {
158
211
  "type": "string",
159
- "description": "IANA media type of the referenced artifact when retrievable (RFC 6838), e.g., 'application/json'. Meaningful only with `href`."
212
+ "description": "IANA media type of the artifact (RFC 6838), e.g., 'application/json', 'application/xml', 'text/csv'. Applies both to an artifact retrievable at `href` and to one embedded here in `content` or `document`."
160
213
  },
161
214
  "checksum": {
162
215
  "$ref": "#/$defs/Checksum",
163
- "description": "Integrity hash of the referenced artifact. Reuses the HDF `Checksum` primitive (not STIX `hashes`). Meaningful only with a retrievable `href`."
216
+ "description": "Integrity hash of the artifact. Reuses the HDF `Checksum` primitive (not STIX `hashes`). Applies both to an artifact retrievable at `href` and to one embedded here in `content` or `document` — beside embedded bytes it is what makes the copy verifiable rather than merely present."
164
217
  },
165
218
  "addedBy": {
166
219
  "$ref": "#/$defs/Identity",
@@ -179,11 +232,19 @@
179
232
  "document": {
180
233
  "type": "object",
181
234
  "additionalProperties": true,
182
- "description": "Optional lossless embedded copy of the referenced artifact — the raw STIX object, EPSS record, advisory, or annotation payload — preserved verbatim.\n\nComposes with `href`/`externalId` (which point at the artifact) and `checksum` (which ties the copy to the source): a single entry can both point and embed.\n\nHDF stays payload-agnostic — the content is carried untouched, never normalized into HDF fields — so this does not duplicate the source ontology (e.g. STIX rides here unchanged)."
235
+ "description": "Optional lossless embedded copy of the referenced artifact as a JSON object — the raw STIX object, EPSS record, advisory, or annotation payload — preserved verbatim.\n\nJSON objects only. An artifact that is not a JSON object (XML, CSV, NDJSON, plain text, a JSON array, or bytes that are not text at all) embeds through `content` + `encoding` instead.\n\nComposes with `href`/`externalId` (which point at the artifact) and `checksum` (which ties the copy to the source): a single entry can both point and embed.\n\nHDF stays payload-agnostic — the content is carried untouched, never normalized into HDF fields — so this does not duplicate the source ontology (e.g. STIX rides here unchanged)."
236
+ },
237
+ "content": {
238
+ "type": "string",
239
+ "description": "Optional lossless embedded copy of the artifact's bytes as a string, for artifacts `document` cannot hold: XML, CSV, NDJSON, plain text, a JSON array, or bytes that are not valid UTF-8 text at all.\n\n`encoding` states how to read it back and is required alongside it. Set `mediaType` so a consumer knows what the bytes are, and `checksum` so the copy can be verified against the source.\n\nCarried verbatim — never reformatted, re-indented, or re-serialized."
240
+ },
241
+ "encoding": {
242
+ "$ref": "#/$defs/External_Reference_Encoding",
243
+ "description": "How to read `content` back into the artifact's bytes. 'utf-8' for text (XML, CSV, NDJSON, plain text, JavaScript-wrapped JSON); 'base64' for anything that is not valid UTF-8 text.\n\nRequired whenever `content` is present, and meaningless without it — an embedded copy whose encoding a consumer has to guess is not lossless."
183
244
  }
184
245
  },
185
246
  "unevaluatedProperties": false,
186
- "$comment": "Examples, in order: 1) By-identity: cite a CVE by its id in the 'cve' system without a URL — equivalently urn:cve:CVE-2021-44228; 2) By-identity AND by-locator together (anyOf, not oneOf) — an ATT&CK technique cited by id with its canonical URL; 3) By-locator to a retrievable STIX bundle, with integrity hash, media type, and attribution; 4) Enrichment envelope: a STIX threat-intel object embedded losslessly in `document` and classified via `kind`, cited by id and pointed at by href — the pointer and the embedded copy compose. The payload rides verbatim; HDF does not normalize STIX fields.",
247
+ "$comment": "Examples, in order: 1) By-identity: cite a CVE by its id in the 'cve' system without a URL — equivalently urn:cve:CVE-2021-44228; 2) By-identity AND by-locator together (anyOf, not oneOf) — an ATT&CK technique cited by id with its canonical URL; 3) By-locator to a retrievable STIX bundle, with integrity hash, media type, and attribution; 4) Enrichment envelope: a STIX threat-intel object embedded losslessly in `document` and classified via `kind`, cited by id and pointed at by href — the pointer and the embedded copy compose. The payload rides verbatim; HDF does not normalize STIX fields; 5) Embed-only, text: an XCCDF results file carried in `content` as utf-8 with its media type and checksum, and no `href` at all — the artifact was read from a local file whose path means nothing to a reader; 6) Embed-only, non-text: a Fortify FPR (a zip) carried in `content` as base64, the case `document` and utf-8 both fail.",
187
248
  "examples": [
188
249
  {
189
250
  "sourceName": "cve",
@@ -229,6 +290,28 @@
229
290
  }
230
291
  ]
231
292
  }
293
+ },
294
+ {
295
+ "sourceName": "openscap",
296
+ "rel": "raw-source",
297
+ "mediaType": "application/xml",
298
+ "encoding": "utf-8",
299
+ "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Benchmark xmlns=\"http://checklists.nist.gov/xccdf/1.2\" id=\"xccdf_org.ssgproject.content_benchmark_RHEL-9\">\n <TestResult id=\"xccdf_org.open-scap_testresult_default-profile\" start-time=\"2026-09-27T12:00:00+00:00\" end-time=\"2026-09-27T12:04:11+00:00\">\n <rule-result idref=\"xccdf_org.ssgproject.content_rule_sshd_disable_root_login\" severity=\"medium\">\n <result>fail</result>\n </rule-result>\n </TestResult>\n</Benchmark>",
300
+ "checksum": {
301
+ "algorithm": "sha256",
302
+ "value": "713b3ee32af5c14ac93e519b5025d760983607143dba3a0438f68667923beda1"
303
+ }
304
+ },
305
+ {
306
+ "sourceName": "fortify",
307
+ "rel": "raw-source",
308
+ "mediaType": "application/zip",
309
+ "encoding": "base64",
310
+ "content": "UEsDBBQAAAAIAEVnPF20b/JoHgAAABwAAAAKAAAAYXVkaXQuZnZkbLOxr8jNUShLLSrOzM+zVTLUM1Cyt7NxC3Px0bcDAFBLAQIUAxQAAAAIAEVnPF20b/JoHgAAABwAAAAKAAAAAAAAAAAAAACAAQAAAABhdWRpdC5mdmRsUEsFBgAAAAABAAEAOAAAAEYAAAAAAA==",
311
+ "checksum": {
312
+ "algorithm": "sha256",
313
+ "value": "c7e4cefceecb83511ae6174c7d22584061671dee6dc5f27243503b47532a66b1"
314
+ }
232
315
  }
233
316
  ]
234
317
  },
@@ -240,7 +323,7 @@
240
323
  "sha512",
241
324
  "blake3"
242
325
  ],
243
- "description": "Supported cryptographic hash algorithms for checksums and integrity verification. blake3 covers container-image and other artifact digests that use it.",
326
+ "description": "Cryptographic hash algorithms a checksum or integrity record may name. blake3 covers container-image and other artifact digests that use it. HDF tooling verifies every algorithm in this enum, so any of them may be recorded where the checksum needs to be verifiable. md5 and sha1 are excluded deliberately: a checksum or integrity record exists to detect tampering, and both are collision-broken, so a digest in either would look verifiable while proving nothing. A source tool digest in an excluded algorithm is not recorded as a checksum. Admitting weak hashes as an application-level accept/reject decision was considered and rejected; widening this enum is a schema decision, not an oversight.",
244
327
  "title": "Hash Algorithm"
245
328
  },
246
329
  "Requirement_Group": {
@@ -398,7 +481,33 @@
398
481
  }
399
482
  ],
400
483
  "description": "A reference to an external document.",
401
- "title": "Reference"
484
+ "title": "Reference",
485
+ "unevaluatedProperties": false,
486
+ "$comment": "Examples, in order: 1) By-locator: a plain URL, the commonest form by far in practice; 2) By-name: a human-meaningful citation with no locator, as InSpec's `ref 'title'` emits; 3) Both together, since this is an anyOf rather than a oneOf; 4) The ref-as-array form, whose items are deliberately open so a source format's own reference record can be carried verbatim — XCCDF's DPMS target identifiers reach HDF this way; 5) uri, accepted as a synonym of url for documents that spell it that way. The object itself is CLOSED: a member none of the three branches declares is rejected. The openness that matters here is one level down, on the items of the ref array, and it is declared there explicitly. This primitive predates External_Reference, which is the STIX-aligned type a new converter should reach for; refs survives because it is InSpec-inherited and HDF consumes InSpec output.",
487
+ "examples": [
488
+ {
489
+ "url": "https://nvd.nist.gov/vuln/detail/CVE-2021-44228"
490
+ },
491
+ {
492
+ "ref": "NIST SP 800-53 Rev 5, AC-6"
493
+ },
494
+ {
495
+ "ref": "CIS Benchmark for RHEL 9, 1.1.1",
496
+ "url": "https://www.cisecurity.org/benchmark/red_hat_linux"
497
+ },
498
+ {
499
+ "ref": [
500
+ {
501
+ "identifier": "2921",
502
+ "publisher": "DISA",
503
+ "type": "DPMS Target"
504
+ }
505
+ ]
506
+ },
507
+ {
508
+ "uri": "https://attack.mitre.org/techniques/T1059/"
509
+ }
510
+ ]
402
511
  },
403
512
  "Source_Location": {
404
513
  "type": "object",
@@ -916,6 +1025,10 @@
916
1025
  "type": "string",
917
1026
  "description": "The title - should be human readable."
918
1027
  },
1028
+ "description": {
1029
+ "type": "string",
1030
+ "description": "Prose description of the baseline, more detailed than summary. Carried verbatim, like every HDF prose field."
1031
+ },
919
1032
  "maintainer": {
920
1033
  "type": "string",
921
1034
  "description": "The maintainer(s)."
@@ -994,7 +1107,7 @@
994
1107
  },
995
1108
  "id": {
996
1109
  "type": "string",
997
- "description": "The requirement identifier. Example: 'SV-238196'."
1110
+ "description": "The requirement identifier, naming the requirement itself rather than one finding of it. Example: 'SV-238196'. Several entries in one baseline may legitimately carry the same id (one scanner reporting one CVE against several packages, or an overlay restating what it inherits), so an id is not an instance key: index requirements as id to list, never id to one, and an amendment addressing an id applies to every entry carrying it."
998
1111
  },
999
1112
  "title": {
1000
1113
  "type": "string",
@@ -1212,9 +1325,9 @@
1212
1325
  }
1213
1326
  }
1214
1327
  },
1215
- "https://mitre.github.io/hdf-libs/schemas/primitives/plan/v3.7.0": {
1328
+ "https://mitre.github.io/hdf-libs/schemas/primitives/plan/v3.8.0": {
1216
1329
  "$schema": "https://json-schema.org/draft/2020-12/schema",
1217
- "$id": "https://mitre.github.io/hdf-libs/schemas/primitives/plan/v3.7.0",
1330
+ "$id": "https://mitre.github.io/hdf-libs/schemas/primitives/plan/v3.8.0",
1218
1331
  "title": "HDF Plan Primitives",
1219
1332
  "description": "Types for defining assessment plans — what to scan, how to configure it, and when to run.",
1220
1333
  "$defs": {
@@ -1262,7 +1375,7 @@
1262
1375
  "description": "componentId of the system component this assessment targets. Use for direct component binding. Alternative to targetSelector."
1263
1376
  },
1264
1377
  "targetSelector": {
1265
- "$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/system/v3.7.0#/$defs/Target_Selector",
1378
+ "$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/system/v3.8.0#/$defs/Target_Selector",
1266
1379
  "description": "Label selector to match targets for this assessment. Overrides the system component's targetSelector if provided."
1267
1380
  },
1268
1381
  "inputs": {
@@ -1344,9 +1457,9 @@
1344
1457
  }
1345
1458
  }
1346
1459
  },
1347
- "https://mitre.github.io/hdf-libs/schemas/primitives/system/v3.7.0": {
1460
+ "https://mitre.github.io/hdf-libs/schemas/primitives/system/v3.8.0": {
1348
1461
  "$schema": "https://json-schema.org/draft/2020-12/schema",
1349
- "$id": "https://mitre.github.io/hdf-libs/schemas/primitives/system/v3.7.0",
1462
+ "$id": "https://mitre.github.io/hdf-libs/schemas/primitives/system/v3.8.0",
1350
1463
  "title": "HDF System Primitives",
1351
1464
  "description": "Types for describing system architecture, authorization boundaries, and components.",
1352
1465
  "$defs": {
@@ -1397,7 +1510,7 @@
1397
1510
  "description": "Rationale for why this override is needed."
1398
1511
  },
1399
1512
  "approvedBy": {
1400
- "$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.7.0#/$defs/Identity",
1513
+ "$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.8.0#/$defs/Identity",
1401
1514
  "description": "Identity of the person or system that approved this override."
1402
1515
  }
1403
1516
  },
@@ -1479,12 +1592,183 @@
1479
1592
  }
1480
1593
  }
1481
1594
  },
1482
- "https://mitre.github.io/hdf-libs/schemas/primitives/extensions/v3.7.0": {
1595
+ "https://mitre.github.io/hdf-libs/schemas/primitives/extensions/v3.8.0": {
1483
1596
  "$schema": "https://json-schema.org/draft/2020-12/schema",
1484
- "$id": "https://mitre.github.io/hdf-libs/schemas/primitives/extensions/v3.7.0",
1597
+ "$id": "https://mitre.github.io/hdf-libs/schemas/primitives/extensions/v3.8.0",
1485
1598
  "title": "HDF Extension Primitives",
1486
- "description": "Extension types for waivers, attestations, generators, and integrity.",
1599
+ "description": "Extension types for waivers, attestations, generators, integrity, and the document-level extensions carrier.",
1487
1600
  "$defs": {
1601
+ "Raw_Source_Artifact": {
1602
+ "allOf": [
1603
+ {
1604
+ "$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.8.0#/$defs/External_Reference"
1605
+ },
1606
+ {
1607
+ "not": {
1608
+ "required": [
1609
+ "document"
1610
+ ]
1611
+ }
1612
+ },
1613
+ {
1614
+ "if": {
1615
+ "required": [
1616
+ "content"
1617
+ ]
1618
+ },
1619
+ "then": {
1620
+ "required": [
1621
+ "encoding",
1622
+ "mediaType"
1623
+ ]
1624
+ }
1625
+ }
1626
+ ],
1627
+ "description": "One artifact exactly as a converter received it, before conversion.\n\nAn External_Reference used for a single purpose, so the same primitive both points and embeds: `sourceName` names the producing tool; `content` + `encoding` carry the bytes; `checksum` is of the exact bytes the converter read; `rel` is 'raw-source'; `href` appears only when the caller supplied a location that means something to a reader, never a producer's local filesystem path.\n\nBYTES, NOT A PARSED COPY. `document` is forbidden here, enforced by the schema rather than described: it holds a parsed JSON object, so embedding through it discards the original whitespace, key order, duplicate keys and trailing bytes — which makes the artifact unreconstructable and the checksum unverifiable against what is stored. A JSON input carries as a `content` string like every other input. This is deliberately stricter than HDF v2, whose `passthrough.raw` held a parsed structure in every converter but one, and which for XML inputs stored a reshaped object whose keys could collide.\n\n`mediaType` is REQUIRED on an entry that embeds — bytes whose type a consumer has to infer are not carriage. It is derived from the converter's declared input family (json → application/json, xml → application/xml, text → text/plain) and overridden by converters that know their bytes more precisely (CSV, NDJSON, JavaScript-wrapped JSON).\n\nAn entry that only points at a location may omit `mediaType`, `content` and `encoding`.",
1628
+ "$comment": "Examples, in order: 1) JSON input embedded as a utf-8 `content` string — the common case, and note it is NOT a parsed object; 2) XML input, which `document` never could have held; 3) CSV input, where `mediaType` overrides the 'text' input family's derived text/plain; 4) non-text input (a Fortify FPR zip) embedded as base64; 5) by-reference only: a scan retrievable at a meaningful URL, with no embedded copy and therefore no required mediaType, encoding or content.",
1629
+ "examples": [
1630
+ {
1631
+ "sourceName": "grype",
1632
+ "rel": "raw-source",
1633
+ "mediaType": "application/json",
1634
+ "encoding": "utf-8",
1635
+ "content": "{\"matches\":[{\"vulnerability\":{\"id\":\"CVE-2021-36159\",\"severity\":\"Critical\"}}]}",
1636
+ "checksum": {
1637
+ "algorithm": "sha256",
1638
+ "value": "4b33be77f104d6ee323ff2c945d1c3f9a151606b2d263ea7932716844c75920c"
1639
+ }
1640
+ },
1641
+ {
1642
+ "sourceName": "openscap",
1643
+ "rel": "raw-source",
1644
+ "mediaType": "application/xml",
1645
+ "encoding": "utf-8",
1646
+ "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Benchmark xmlns=\"http://checklists.nist.gov/xccdf/1.2\" id=\"xccdf_org.ssgproject.content_benchmark_RHEL-9\">\n <TestResult id=\"xccdf_org.open-scap_testresult_default-profile\" start-time=\"2026-09-27T12:00:00+00:00\" end-time=\"2026-09-27T12:04:11+00:00\">\n <rule-result idref=\"xccdf_org.ssgproject.content_rule_sshd_disable_root_login\" severity=\"medium\">\n <result>fail</result>\n </rule-result>\n </TestResult>\n</Benchmark>",
1647
+ "checksum": {
1648
+ "algorithm": "sha256",
1649
+ "value": "713b3ee32af5c14ac93e519b5025d760983607143dba3a0438f68667923beda1"
1650
+ }
1651
+ },
1652
+ {
1653
+ "sourceName": "prisma",
1654
+ "rel": "raw-source",
1655
+ "mediaType": "text/csv",
1656
+ "encoding": "utf-8",
1657
+ "content": "Hostname,Distro,CVE ID,Compliance ID,Type,Severity,Packages,Source Package,Package Version\nhost-01,Ubuntu 22.04,CVE-2021-36159,,image,critical,apk-tools,apk-tools,2.12.5-r1\n",
1658
+ "checksum": {
1659
+ "algorithm": "sha256",
1660
+ "value": "c5a8077ee069e18fd6687c6b1c4f72fdbc95b7af77d954b6fb5e522cd783aa83"
1661
+ }
1662
+ },
1663
+ {
1664
+ "sourceName": "fortify",
1665
+ "rel": "raw-source",
1666
+ "mediaType": "application/zip",
1667
+ "encoding": "base64",
1668
+ "content": "UEsDBBQAAAAIAEVnPF20b/JoHgAAABwAAAAKAAAAYXVkaXQuZnZkbLOxr8jNUShLLSrOzM+zVTLUM1Cyt7NxC3Px0bcDAFBLAQIUAxQAAAAIAEVnPF20b/JoHgAAABwAAAAKAAAAAAAAAAAAAACAAQAAAABhdWRpdC5mdmRsUEsFBgAAAAABAAEAOAAAAEYAAAAAAA==",
1669
+ "checksum": {
1670
+ "algorithm": "sha256",
1671
+ "value": "c7e4cefceecb83511ae6174c7d22584061671dee6dc5f27243503b47532a66b1"
1672
+ }
1673
+ },
1674
+ {
1675
+ "sourceName": "nessus",
1676
+ "rel": "raw-source",
1677
+ "href": "https://scans.example.gov/exports/2026-09-27-prod-web.nessus",
1678
+ "mediaType": "application/xml",
1679
+ "checksum": {
1680
+ "algorithm": "sha256",
1681
+ "value": "a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2"
1682
+ }
1683
+ }
1684
+ ]
1685
+ },
1686
+ "Extensions": {
1687
+ "type": "object",
1688
+ "additionalProperties": false,
1689
+ "properties": {
1690
+ "passthrough": {
1691
+ "type": "object",
1692
+ "additionalProperties": true,
1693
+ "description": "Catch-all for producer data that HDF does not model — the role heimdall2's `passthrough.auxiliary_data` played: fields a converter deliberately carried but had no home for.\n\nDeliberately permissive: unenumerated properties are accepted by design, with no shape imposed on them. HDF neither reads nor interprets what is here. It is the ONLY permissive surface in `extensions` — everything HDF does not define belongs here rather than beside it.\n\nThis is NOT where the pre-converted source artifact goes. v2 put it here only because nothing else had room; `rawSourceArtifacts` is its home now, and it gives the bytes a checksum, a media type and a reference contract that an untyped object cannot.\n\nFor data that belongs to one requirement rather than to the document, use that object's own fields — a document-level bag cannot say which requirement it describes.",
1694
+ "examples": [
1695
+ {
1696
+ "auxiliary_data": [
1697
+ {
1698
+ "name": "Scoutsuite",
1699
+ "data": {
1700
+ "last_run": {
1701
+ "ruleset_about": "This ruleset consists of numerous rules that are considered standard by NCC Group"
1702
+ }
1703
+ }
1704
+ }
1705
+ ]
1706
+ },
1707
+ {
1708
+ "audit": {
1709
+ "runId": "r-123"
1710
+ }
1711
+ }
1712
+ ],
1713
+ "$comment": "Examples, in order: 1) heimdall2's auxiliary_data shape, the data a v2 mapper carried with nowhere else to put it; 2) the legacy top-level `passthrough` an HDF document arrived with, relocated here verbatim by the SAF-supplement normalizer."
1714
+ },
1715
+ "rawSourceArtifacts": {
1716
+ "type": "array",
1717
+ "items": {
1718
+ "$ref": "#/$defs/Raw_Source_Artifact"
1719
+ },
1720
+ "description": "The input(s) this document was converted from, verbatim.\n\nAn array because a conversion can consume more than one artifact — the OSCAL profile path takes a profile and a catalog. Every other converter takes one input, and an array of one costs nothing.\n\nPopulating this is required of ingest converters by policy, enforced by the converter contract and test harness rather than by a schema `required`: a tool that emits HDF natively has no source artifact, and requiring the field would make valid native HDF invalid."
1721
+ }
1722
+ },
1723
+ "title": "Extensions",
1724
+ "description": "Carrier for data outside the HDF model: `passthrough` for producer data HDF does not model, `rawSourceArtifacts` for the pre-converted input(s).\n\nCLOSED: these two members are the whole of it. A key HDF does not define goes inside `passthrough` — that is what `passthrough` is for — so `extensions` never becomes a second, unnamed schema that consumers must reverse-engineer from the producers that happen to write it.\n\nClosed with `additionalProperties` rather than the house `unevaluatedProperties` because this definition composes nothing, and the shipped Go validator is a draft-07 engine that does not implement `unevaluatedProperties` — a closure only one of the two validators enforces is not a closure.\n\nDeclared on every HDF document type that carries a producer envelope (`generator` / `integrity`), and on `Evaluated_Baseline`, so one rule governs both sites.",
1725
+ "$comment": "Examples, in order: 1) the whole contract in one object — a converter's input embedded beside the producer data it could not map; 2) carriage alone, the shape a converter emits when it has nothing homeless to record.",
1726
+ "examples": [
1727
+ {
1728
+ "passthrough": {
1729
+ "auxiliary_data": [
1730
+ {
1731
+ "name": "Grype",
1732
+ "data": {
1733
+ "descriptor": {
1734
+ "name": "grype",
1735
+ "version": "0.74.0"
1736
+ }
1737
+ }
1738
+ }
1739
+ ]
1740
+ },
1741
+ "rawSourceArtifacts": [
1742
+ {
1743
+ "sourceName": "grype",
1744
+ "rel": "raw-source",
1745
+ "mediaType": "application/json",
1746
+ "encoding": "utf-8",
1747
+ "content": "{\"matches\":[{\"vulnerability\":{\"id\":\"CVE-2021-36159\",\"severity\":\"Critical\"}}]}",
1748
+ "checksum": {
1749
+ "algorithm": "sha256",
1750
+ "value": "4b33be77f104d6ee323ff2c945d1c3f9a151606b2d263ea7932716844c75920c"
1751
+ }
1752
+ }
1753
+ ]
1754
+ },
1755
+ {
1756
+ "rawSourceArtifacts": [
1757
+ {
1758
+ "sourceName": "fortify",
1759
+ "rel": "raw-source",
1760
+ "mediaType": "application/zip",
1761
+ "encoding": "base64",
1762
+ "content": "UEsDBBQAAAAIAEVnPF20b/JoHgAAABwAAAAKAAAAYXVkaXQuZnZkbLOxr8jNUShLLSrOzM+zVTLUM1Cyt7NxC3Px0bcDAFBLAQIUAxQAAAAIAEVnPF20b/JoHgAAABwAAAAKAAAAAAAAAAAAAACAAQAAAABhdWRpdC5mdmRsUEsFBgAAAAABAAEAOAAAAEYAAAAAAA==",
1763
+ "checksum": {
1764
+ "algorithm": "sha256",
1765
+ "value": "c7e4cefceecb83511ae6174c7d22584061671dee6dc5f27243503b47532a66b1"
1766
+ }
1767
+ }
1768
+ ]
1769
+ }
1770
+ ]
1771
+ },
1488
1772
  "Status_Override": {
1489
1773
  "type": "object",
1490
1774
  "unevaluatedProperties": false,
@@ -1495,44 +1779,99 @@
1495
1779
  "appliedAt",
1496
1780
  "expiresAt"
1497
1781
  ],
1498
- "anyOf": [
1782
+ "allOf": [
1499
1783
  {
1500
- "required": [
1501
- "status"
1502
- ]
1784
+ "if": {
1785
+ "properties": {
1786
+ "type": {
1787
+ "enum": [
1788
+ "operationalRequirement"
1789
+ ]
1790
+ }
1791
+ },
1792
+ "required": [
1793
+ "type"
1794
+ ]
1795
+ },
1796
+ "then": {
1797
+ "not": {
1798
+ "anyOf": [
1799
+ {
1800
+ "required": [
1801
+ "status"
1802
+ ]
1803
+ },
1804
+ {
1805
+ "required": [
1806
+ "impact"
1807
+ ]
1808
+ }
1809
+ ]
1810
+ }
1811
+ },
1812
+ "else": {
1813
+ "anyOf": [
1814
+ {
1815
+ "required": [
1816
+ "status"
1817
+ ]
1818
+ },
1819
+ {
1820
+ "required": [
1821
+ "impact"
1822
+ ]
1823
+ }
1824
+ ]
1825
+ }
1503
1826
  },
1504
1827
  {
1505
- "required": [
1506
- "impact"
1507
- ]
1828
+ "if": {
1829
+ "properties": {
1830
+ "type": {
1831
+ "enum": [
1832
+ "riskAdjustment"
1833
+ ]
1834
+ }
1835
+ },
1836
+ "required": [
1837
+ "type"
1838
+ ]
1839
+ },
1840
+ "then": {
1841
+ "not": {
1842
+ "required": [
1843
+ "status"
1844
+ ]
1845
+ }
1846
+ }
1508
1847
  }
1509
1848
  ],
1510
1849
  "properties": {
1511
1850
  "externalReferences": {
1512
1851
  "type": "array",
1513
1852
  "items": {
1514
- "$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.7.0#/$defs/External_Reference"
1853
+ "$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.8.0#/$defs/External_Reference"
1515
1854
  },
1516
1855
  "description": "Optional references to the external artifacts behind this override (e.g. the STIX bundle/object or CTI feed motivating an E:A riskAdjustment). Inert context distinct from `evidence`; see External_Reference. Symmetric with Standalone_Override.externalReferences for the inline (results-embedded) override carrier."
1517
1856
  },
1518
1857
  "type": {
1519
- "$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/amendments/v3.7.0#/$defs/Override_Type",
1858
+ "$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/amendments/v3.8.0#/$defs/Override_Type",
1520
1859
  "description": "The type of override applied to this requirement."
1521
1860
  },
1522
1861
  "status": {
1523
- "$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/result/v3.7.0#/$defs/Result_Status",
1524
- "description": "The new status this override sets for the requirement. Optional when only impact is being overridden."
1862
+ "$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/result/v3.8.0#/$defs/Result_Status",
1863
+ "description": "The new status this override sets for the requirement. Optional when only impact is being overridden; forbidden on an operationalRequirement, which adjudicates nothing, and on a riskAdjustment, which re-rates impact only."
1525
1864
  },
1526
1865
  "impact": {
1527
- "$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/amendments/v3.7.0#/$defs/Impact_Override",
1528
- "description": "Override to the requirement's impact score. At least one of status or impact must be set."
1866
+ "$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/amendments/v3.8.0#/$defs/Impact_Override",
1867
+ "description": "Override to the requirement's impact score. For every type except operationalRequirement, at least one of status or impact must be set; an operationalRequirement carries neither."
1529
1868
  },
1530
1869
  "reason": {
1531
1870
  "type": "string",
1532
1871
  "description": "Explanation for why this override was applied."
1533
1872
  },
1534
1873
  "appliedBy": {
1535
- "$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.7.0#/$defs/Identity",
1874
+ "$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.8.0#/$defs/Identity",
1536
1875
  "description": "Identity of who applied this override. For simple cases, use type 'simple' with just an identifier."
1537
1876
  },
1538
1877
  "appliedAt": {
@@ -1546,31 +1885,31 @@
1546
1885
  "description": "Timestamp when this override expires and must be reviewed/renewed. REQUIRED - no permanent overrides allowed. ISO 8601 format."
1547
1886
  },
1548
1887
  "signature": {
1549
- "$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.7.0#/$defs/Signature",
1888
+ "$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.8.0#/$defs/Signature",
1550
1889
  "description": "Optional digital signature for enhanced trust and non-repudiation. Supports hardware security tokens (PKCS#11/PKCS#12), Yubikeys, GPG keys, passkeys, and other signing methods."
1551
1890
  },
1552
1891
  "evidence": {
1553
1892
  "type": "array",
1554
1893
  "items": {
1555
- "$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.7.0#/$defs/Evidence"
1894
+ "$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.8.0#/$defs/Evidence"
1556
1895
  },
1557
1896
  "description": "Supporting evidence for this override, such as screenshots demonstrating manual verification for attestations."
1558
1897
  },
1559
1898
  "previousChecksum": {
1560
- "$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.7.0#/$defs/Checksum",
1899
+ "$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.8.0#/$defs/Checksum",
1561
1900
  "description": "SHA-256 checksum of the previous amendment in chronological order. Each amendment's checksum is recorded by the NEXT one, so editing an amendment in place is detectable — provided a later amendment is chained to it. It is NOT tamper-proof: the final amendment, the document envelope, deleted trailing amendments, and a chain that has been stripped or recomputed wholesale are all outside what it can detect. Use signature for non-repudiation. Omitted on the first amendment on a requirement."
1562
1901
  },
1563
1902
  "cvss": {
1564
- "$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/cvss/v3.7.0#/$defs/Cvss",
1903
+ "$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/cvss/v3.8.0#/$defs/Cvss",
1565
1904
  "$comment": "When present alongside impact.value on a riskAdjustment override, impact.value should be approximately cvss.computedScore / 10.0. Soft consistency rule — validators may warn but should not error. The cvss block makes Environmental/Threat enrichment auditable.",
1566
1905
  "description": "Structured CVSS scoring data backing this override. Captures the rubric (which Environmental/Threat metrics the consumer modified, the recomputed score) used to justify a riskAdjustment. For other override types this is optional context."
1567
1906
  },
1568
1907
  "justification": {
1569
- "$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/amendments/v3.7.0#/$defs/Justification",
1908
+ "$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/amendments/v3.8.0#/$defs/Justification",
1570
1909
  "description": "Structured controlled-vocabulary classification for why this override applies. Complements (does not replace) the free-text 'reason' field. Most useful on falsePositive and attestation overrides where the structured category enables filtering and lossless round-trip with VEX / OSCAL / FedRAMP DR. See the Justification primitive for the precedent vocabulary and rationale."
1571
1910
  }
1572
1911
  },
1573
- "$comment": "Example 3: Inline riskAdjustment carrying the STIX source that motivated it via externalReferences (the enrichment envelope, with the raw sighting embedded losslessly in document). This is the shape the enrich pass writes onto Evaluated_Requirement.overrides[] for the E:A recompute.",
1912
+ "$comment": "Example 3: Inline riskAdjustment carrying the STIX source that motivated it via externalReferences (the enrichment envelope, with the raw sighting embedded losslessly in document). This is the shape the enrich pass writes onto Evaluated_Requirement.overrides[] for the E:A recompute. Example 7: operationalRequirement as it sits on the requirement after apply: no status, no impact; the finding stays failed and disposition reports operationalRequirement.",
1574
1913
  "examples": [
1575
1914
  {
1576
1915
  "type": "waiver",
@@ -1670,9 +2009,19 @@
1670
2009
  }
1671
2010
  }
1672
2011
  ]
2012
+ },
2013
+ {
2014
+ "type": "operationalRequirement",
2015
+ "reason": "Air-gapped ingest requires USB transfer per operational procedure OP-2026-003. Ports are physically secured, transfers are logged and need two-person integrity.",
2016
+ "appliedBy": {
2017
+ "type": "email",
2018
+ "identifier": "system-owner@agency.gov"
2019
+ },
2020
+ "appliedAt": "2026-01-20T10:00:00Z",
2021
+ "expiresAt": "2099-12-31T00:00:00Z"
1673
2022
  }
1674
2023
  ],
1675
- "description": "An intentional change to a requirement's compliance status and/or impact score. At least one of status or impact must be set. Overrides change the effectiveStatus or impact of the requirement. All overrides must have an expiration date to enforce periodic review.",
2024
+ "description": "An intentional change to a requirement's compliance status and/or impact score, as it sits on the requirement once applied. The same type-conditional rule as Standalone_Override: when type is 'operationalRequirement', neither status nor impact may be set, because the override records an accepted deviation without adjudicating the finding; it still governs disposition, and effectiveStatus stays what the results decided. When type is 'riskAdjustment', status may not be set: it re-rates the risk through impact and never changes pass/fail. For every other type, at least one of status or impact must be set. All overrides must have an expiration date to enforce periodic review.",
1676
2025
  "title": "Status Override"
1677
2026
  },
1678
2027
  "POAM": {
@@ -1702,7 +2051,7 @@
1702
2051
  "description": "Detailed explanation of the plan, including what actions will be taken."
1703
2052
  },
1704
2053
  "appliedBy": {
1705
- "$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.7.0#/$defs/Identity",
2054
+ "$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.8.0#/$defs/Identity",
1706
2055
  "description": "Identity of who created this POA&M. For simple cases, use type 'simple' with just an identifier."
1707
2056
  },
1708
2057
  "appliedAt": {
@@ -1718,23 +2067,23 @@
1718
2067
  "milestones": {
1719
2068
  "type": "array",
1720
2069
  "items": {
1721
- "$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.7.0#/$defs/Milestone"
2070
+ "$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.8.0#/$defs/Milestone"
1722
2071
  },
1723
2072
  "description": "Optional array of milestones tracking progress toward completion."
1724
2073
  },
1725
2074
  "signature": {
1726
- "$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.7.0#/$defs/Signature",
2075
+ "$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.8.0#/$defs/Signature",
1727
2076
  "description": "Optional digital signature for enhanced trust and non-repudiation."
1728
2077
  },
1729
2078
  "evidence": {
1730
2079
  "type": "array",
1731
2080
  "items": {
1732
- "$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.7.0#/$defs/Evidence"
2081
+ "$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.8.0#/$defs/Evidence"
1733
2082
  },
1734
2083
  "description": "Supporting evidence for this POA&M, such as documentation of compensating controls or mitigation implementation."
1735
2084
  },
1736
2085
  "previousChecksum": {
1737
- "$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.7.0#/$defs/Checksum",
2086
+ "$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.8.0#/$defs/Checksum",
1738
2087
  "description": "SHA-256 checksum of the previous amendment in chronological order. Each amendment's checksum is recorded by the NEXT one, so editing an amendment in place is detectable — provided a later amendment is chained to it. It is NOT tamper-proof: the final amendment, the document envelope, deleted trailing amendments, and a chain that has been stripped or recomputed wholesale are all outside what it can detect. Use signature for non-repudiation. Omitted on the first amendment on a requirement."
1739
2088
  }
1740
2089
  },
@@ -1877,17 +2226,9 @@
1877
2226
  "Integrity": {
1878
2227
  "type": "object",
1879
2228
  "unevaluatedProperties": false,
1880
- "dependentRequired": {
1881
- "algorithm": [
1882
- "checksum"
1883
- ],
1884
- "checksum": [
1885
- "algorithm"
1886
- ]
1887
- },
1888
2229
  "properties": {
1889
2230
  "algorithm": {
1890
- "$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.7.0#/$defs/Hash_Algorithm",
2231
+ "$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.8.0#/$defs/Hash_Algorithm",
1891
2232
  "description": "The hash algorithm used for the checksum."
1892
2233
  },
1893
2234
  "checksum": {
@@ -1916,13 +2257,39 @@
1916
2257
  }
1917
2258
  ],
1918
2259
  "description": "Cryptographic integrity information for verifying the HDF file has not been tampered with. If algorithm is provided, checksum must also be provided, and vice versa.",
1919
- "title": "Integrity"
2260
+ "title": "Integrity",
2261
+ "allOf": [
2262
+ {
2263
+ "if": {
2264
+ "required": [
2265
+ "algorithm"
2266
+ ]
2267
+ },
2268
+ "then": {
2269
+ "required": [
2270
+ "checksum"
2271
+ ]
2272
+ }
2273
+ },
2274
+ {
2275
+ "if": {
2276
+ "required": [
2277
+ "checksum"
2278
+ ]
2279
+ },
2280
+ "then": {
2281
+ "required": [
2282
+ "algorithm"
2283
+ ]
2284
+ }
2285
+ }
2286
+ ]
1920
2287
  }
1921
2288
  }
1922
2289
  },
1923
- "https://mitre.github.io/hdf-libs/schemas/primitives/amendments/v3.7.0": {
2290
+ "https://mitre.github.io/hdf-libs/schemas/primitives/amendments/v3.8.0": {
1924
2291
  "$schema": "https://json-schema.org/draft/2020-12/schema",
1925
- "$id": "https://mitre.github.io/hdf-libs/schemas/primitives/amendments/v3.7.0",
2292
+ "$id": "https://mitre.github.io/hdf-libs/schemas/primitives/amendments/v3.8.0",
1926
2293
  "title": "HDF Amendment Primitives",
1927
2294
  "description": "Types for waivers, attestations, and POA&Ms that modify requirement compliance status.",
1928
2295
  "$defs": {
@@ -1937,7 +2304,7 @@
1937
2304
  "riskAdjustment",
1938
2305
  "operationalRequirement"
1939
2306
  ],
1940
- "description": "The type of amendment, aligned with FedRAMP deviation request categories.\n\n- 'waiver': risk accepted by Authorizing Official.\n- 'attestation': manually verified by assessor.\n- 'poam': remediation tracked (no status change).\n- 'inherited': control provided by another component or system.\n- 'falsePositive': scanner incorrectly identified a finding — for compliance scans (STIG, CIS), the check actually passes, so status is typically set to 'passed'; for vulnerability scans (CVE, SCA), the flagged vulnerability does not apply to this system, so status is typically set to 'notApplicable'. The disposition field on the requirement distinguishes false positives from genuinely not-applicable findings.\n- 'riskAdjustment': impact score adjusted based on environmental context (FedRAMP Risk Adjustment); does not change pass/fail status, only impact via the impact field.\n- 'operationalRequirement': deviation required by operational constraints (FedRAMP Operational Requirement); the finding cannot be remediated because the system requires the affected functionality. Remains an open risk.\n\nMigration note: 'exception' was removed in v3.1.0 — use 'waiver' with status 'notApplicable' instead.",
2307
+ "description": "The type of amendment, aligned with FedRAMP deviation request categories.\n\n- 'waiver': risk accepted by Authorizing Official.\n- 'attestation': manually verified by assessor.\n- 'poam': remediation tracked (no status change).\n- 'inherited': control provided by another component or system.\n- 'falsePositive': scanner incorrectly identified a finding — for compliance scans (STIG, CIS), the check actually passes, so status is typically set to 'passed'; for vulnerability scans (CVE, SCA), the flagged vulnerability does not apply to this system, so status is typically set to 'notApplicable'. The disposition field on the requirement distinguishes false positives from genuinely not-applicable findings.\n- 'riskAdjustment': impact score adjusted based on environmental context (FedRAMP Risk Adjustment); does not change pass/fail status, only impact via the impact field; a status on it is rejected by validation.\n- 'operationalRequirement': deviation required by operational constraints (FedRAMP Operational Requirement); the finding cannot be remediated because the system requires the affected functionality. Remains an open risk.\n\nMigration note: 'exception' was removed in v3.1.0 — use 'waiver' with status 'notApplicable' instead.",
1941
2308
  "title": "Override Type"
1942
2309
  },
1943
2310
  "Justification": {
@@ -1977,7 +2344,7 @@
1977
2344
  },
1978
2345
  "Standalone_Override": {
1979
2346
  "type": "object",
1980
- "description": "A standalone override to a requirement's compliance status or risk impact.\n\nValidation has two branches gated on 'type': when type is 'operationalRequirement', neither 'status' nor 'impact' may be set — the override records accepted risk without changing the finding (documentation-only). For all other types, at least one of 'status' or 'impact' must be set.\n\nThis rule aligns with:\n- OSCAL Assessment Results — finding.target.status and finding.associated-risk[].facet[] are separate axes (https://pages.nist.gov/OSCAL/learn/concepts/layer/assessment/assessment-results/)\n- FedRAMP deviation request types — Risk Adjustment changes impact only, Operational Requirement documents acceptance only, False Positive changes status (https://www.ignyteplatform.com/blog/fedramp/fedramp-deviation-requests-submit/)\n- NIST SP 800-37 RMF — risk response (accept/mitigate/transfer) is a separate step from control assessment status (https://csrc.nist.gov/pubs/sp/800/37/r2/final).",
2347
+ "description": "A standalone override to a requirement's compliance status or risk impact.\n\nValidation is gated on 'type': when type is 'operationalRequirement', neither 'status' nor 'impact' may be set — the override records accepted risk without changing the finding (documentation-only). When type is 'riskAdjustment', 'status' may not be set — it re-rates the risk through 'impact' and never changes the finding's pass/fail; an override that must change status is a waiver or falsePositive. For all other types, at least one of 'status' or 'impact' must be set.\n\nThis rule aligns with:\n- OSCAL Assessment Results — finding.target.status and finding.associated-risk[].facet[] are separate axes (https://pages.nist.gov/OSCAL/learn/concepts/layer/assessment/assessment-results/)\n- FedRAMP deviation request types — Risk Adjustment changes impact only, Operational Requirement documents acceptance only, False Positive changes status (https://www.ignyteplatform.com/blog/fedramp/fedramp-deviation-requests-submit/)\n- NIST SP 800-37 RMF — risk response (accept/mitigate/transfer) is a separate step from control assessment status (https://csrc.nist.gov/pubs/sp/800/37/r2/final).",
1981
2348
  "unevaluatedProperties": false,
1982
2349
  "required": [
1983
2350
  "type",
@@ -1987,53 +2354,78 @@
1987
2354
  "appliedAt",
1988
2355
  "expiresAt"
1989
2356
  ],
1990
- "if": {
1991
- "properties": {
1992
- "type": {
1993
- "enum": [
1994
- "operationalRequirement"
2357
+ "allOf": [
2358
+ {
2359
+ "if": {
2360
+ "properties": {
2361
+ "type": {
2362
+ "enum": [
2363
+ "operationalRequirement"
2364
+ ]
2365
+ }
2366
+ },
2367
+ "required": [
2368
+ "type"
2369
+ ]
2370
+ },
2371
+ "then": {
2372
+ "not": {
2373
+ "anyOf": [
2374
+ {
2375
+ "required": [
2376
+ "status"
2377
+ ]
2378
+ },
2379
+ {
2380
+ "required": [
2381
+ "impact"
2382
+ ]
2383
+ }
2384
+ ]
2385
+ }
2386
+ },
2387
+ "else": {
2388
+ "anyOf": [
2389
+ {
2390
+ "required": [
2391
+ "status"
2392
+ ]
2393
+ },
2394
+ {
2395
+ "required": [
2396
+ "impact"
2397
+ ]
2398
+ }
1995
2399
  ]
1996
2400
  }
1997
2401
  },
1998
- "required": [
1999
- "type"
2000
- ]
2001
- },
2002
- "then": {
2003
- "not": {
2004
- "anyOf": [
2005
- {
2006
- "required": [
2007
- "status"
2008
- ]
2402
+ {
2403
+ "if": {
2404
+ "properties": {
2405
+ "type": {
2406
+ "enum": [
2407
+ "riskAdjustment"
2408
+ ]
2409
+ }
2009
2410
  },
2010
- {
2011
- "required": [
2012
- "impact"
2013
- ]
2014
- }
2015
- ]
2016
- }
2017
- },
2018
- "else": {
2019
- "anyOf": [
2020
- {
2021
2411
  "required": [
2022
- "status"
2412
+ "type"
2023
2413
  ]
2024
2414
  },
2025
- {
2026
- "required": [
2027
- "impact"
2028
- ]
2415
+ "then": {
2416
+ "not": {
2417
+ "required": [
2418
+ "status"
2419
+ ]
2420
+ }
2029
2421
  }
2030
- ]
2031
- },
2422
+ }
2423
+ ],
2032
2424
  "properties": {
2033
2425
  "externalReferences": {
2034
2426
  "type": "array",
2035
2427
  "items": {
2036
- "$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.7.0#/$defs/External_Reference"
2428
+ "$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.8.0#/$defs/External_Reference"
2037
2429
  },
2038
2430
  "description": "Optional references to the external artifacts behind this override (e.g. the STIX bundle/object, advisory, or CTI feed that motivated it). Inert context distinct from `evidence`; see External_Reference."
2039
2431
  },
@@ -2044,15 +2436,15 @@
2044
2436
  "requirementId": {
2045
2437
  "type": "string",
2046
2438
  "minLength": 1,
2047
- "description": "The ID of the requirement being amended. Must match a requirement ID in the referenced baseline."
2439
+ "description": "The id of the requirement being amended. An id names the requirement, not one finding, so the override applies to every requirement entry carrying that id in the baseline(s) it targets."
2048
2440
  },
2049
2441
  "baselineRef": {
2050
2442
  "type": "string",
2051
2443
  "description": "Name of the baseline containing the requirement. Required when the system has multiple baselines with potentially overlapping requirement IDs."
2052
2444
  },
2053
2445
  "status": {
2054
- "$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/result/v3.7.0#/$defs/Result_Status",
2055
- "description": "The new status this amendment sets. Optional when only impact is being overridden."
2446
+ "$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/result/v3.8.0#/$defs/Result_Status",
2447
+ "description": "The new status this override sets for the requirement. Optional when only impact is being overridden; forbidden on an operationalRequirement, which adjudicates nothing, and on a riskAdjustment, which re-rates impact only."
2056
2448
  },
2057
2449
  "impact": {
2058
2450
  "$ref": "#/$defs/Impact_Override",
@@ -2063,7 +2455,7 @@
2063
2455
  "description": "Justification for this amendment."
2064
2456
  },
2065
2457
  "appliedBy": {
2066
- "$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.7.0#/$defs/Identity",
2458
+ "$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.8.0#/$defs/Identity",
2067
2459
  "description": "Identity of who applied this amendment."
2068
2460
  },
2069
2461
  "appliedAt": {
@@ -2079,20 +2471,20 @@
2079
2471
  "evidence": {
2080
2472
  "type": "array",
2081
2473
  "items": {
2082
- "$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.7.0#/$defs/Evidence"
2474
+ "$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.8.0#/$defs/Evidence"
2083
2475
  },
2084
2476
  "description": "Supporting evidence (screenshots, logs, URLs, documents)."
2085
2477
  },
2086
2478
  "signature": {
2087
- "$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.7.0#/$defs/Signature",
2479
+ "$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.8.0#/$defs/Signature",
2088
2480
  "description": "Digital signature for non-repudiation."
2089
2481
  },
2090
2482
  "previousChecksum": {
2091
- "$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.7.0#/$defs/Checksum",
2483
+ "$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.8.0#/$defs/Checksum",
2092
2484
  "description": "SHA-256 checksum of the prior amendment in chronological order. Each amendment's checksum is recorded by the NEXT one, so editing an amendment in place is detectable — provided a later amendment is chained to it. It is NOT tamper-proof: the final amendment, the document envelope, deleted trailing amendments, and a chain that has been stripped or recomputed wholesale are all outside what it can detect. Use signature for non-repudiation. Omitted on the first amendment."
2093
2485
  },
2094
2486
  "cvss": {
2095
- "$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/cvss/v3.7.0#/$defs/Cvss",
2487
+ "$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/cvss/v3.8.0#/$defs/Cvss",
2096
2488
  "$comment": "When present alongside impact.value on a riskAdjustment override, impact.value should be approximately cvss.computedScore / 10.0. Soft consistency rule — validators may warn but should not error. The cvss block makes Environmental/Threat enrichment auditable.",
2097
2489
  "description": "Structured CVSS scoring data backing this override. Captures the rubric (which Environmental/Threat metrics the consumer modified, the recomputed score) used to justify a riskAdjustment. For other override types this is optional context."
2098
2490
  },
@@ -2103,7 +2495,7 @@
2103
2495
  "milestones": {
2104
2496
  "type": "array",
2105
2497
  "items": {
2106
- "$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.7.0#/$defs/Milestone"
2498
+ "$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.8.0#/$defs/Milestone"
2107
2499
  },
2108
2500
  "description": "Remediation milestones (primarily for POA&M type amendments)."
2109
2501
  },
@@ -2120,7 +2512,7 @@
2120
2512
  "affectedPackages": {
2121
2513
  "type": "array",
2122
2514
  "items": {
2123
- "$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/affected-package/v3.7.0#/$defs/Affected_Package"
2515
+ "$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/affected-package/v3.8.0#/$defs/Affected_Package"
2124
2516
  },
2125
2517
  "description": "Software packages this amendment is scoped to, distinct from componentRef (which scopes to an HDF-internal Component by UUID).\n\nUse when the source amendment format references packages by purl/cpe/name+version — e.g., VEX `affects[]` / `products[]`, OSCAL POA&M `subjects[]`, FedRAMP component-aware amendments.\n\nSymmetric with Evaluated_Requirement.affectedPackages, which scopes findings to the same package vocabulary.\n\nWhen omitted, the amendment applies system-wide (or only to componentRef when that is set)."
2126
2518
  }
@@ -2253,9 +2645,9 @@
2253
2645
  }
2254
2646
  }
2255
2647
  },
2256
- "https://mitre.github.io/hdf-libs/schemas/primitives/result/v3.7.0": {
2648
+ "https://mitre.github.io/hdf-libs/schemas/primitives/result/v3.8.0": {
2257
2649
  "$schema": "https://json-schema.org/draft/2020-12/schema",
2258
- "$id": "https://mitre.github.io/hdf-libs/schemas/primitives/result/v3.7.0",
2650
+ "$id": "https://mitre.github.io/hdf-libs/schemas/primitives/result/v3.8.0",
2259
2651
  "title": "HDF Result Primitives",
2260
2652
  "description": "Types for representing assessment results and statuses.",
2261
2653
  "$defs": {
@@ -2320,6 +2712,10 @@
2320
2712
  "type": "string"
2321
2713
  },
2322
2714
  "description": "The stacktrace/backtrace of the exception if one occurred."
2715
+ },
2716
+ "rawSourceRecord": {
2717
+ "$ref": "#/$defs/Raw_Source_Record",
2718
+ "description": "The source tool's own record for this result, carrying every field the record had. Complete, not necessarily byte-exact: see Raw_Source_Record.content for the producer and consumer obligations, and extensions.rawSourceArtifacts[] when byte-exact carriage is required."
2323
2719
  }
2324
2720
  },
2325
2721
  "examples": [
@@ -2350,6 +2746,60 @@
2350
2746
  "description": "A test within a requirement and its results and findings such as how long it took to run.",
2351
2747
  "title": "Requirement Result"
2352
2748
  },
2749
+ "Raw_Source_Record": {
2750
+ "type": "object",
2751
+ "additionalProperties": false,
2752
+ "required": [
2753
+ "content",
2754
+ "encoding",
2755
+ "mediaType"
2756
+ ],
2757
+ "properties": {
2758
+ "content": {
2759
+ "type": "string",
2760
+ "description": "The source tool's own record for this result, carrying every field the record had.\n\nCOMPLETE, NOT NECESSARILY BYTE-EXACT. A producer SHOULD write the record's bytes unchanged where it can. A producer that cannot — notably one implemented in two languages whose JSON serializers disagree on key order, HTML escaping and number rendering, and which therefore MUST canonicalize to stay byte-identical with its twin — MAY write a canonically serialized form instead. Such a form preserves every field and value but not the original key order, insignificant whitespace, or duplicate keys. A consumer MUST therefore compare records by parsing them, not by comparing bytes, and MUST NOT checksum this field and expect the result to match a checksum of the input.\n\nFor carriage that IS byte-exact, use `extensions.rawSourceArtifacts[]`, which forbids a parsed `document` precisely so the bytes and their checksum survive; `pointer` ties this record to its position within that artifact."
2761
+ },
2762
+ "encoding": {
2763
+ "$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.8.0#/$defs/External_Reference_Encoding",
2764
+ "description": "How to read `content`: 'utf-8' for text, 'base64' for bytes that are not valid UTF-8 text."
2765
+ },
2766
+ "mediaType": {
2767
+ "type": "string",
2768
+ "description": "The record's IANA media type — the type of this record, which for a fragment of a larger artifact may be narrower than the artifact's own. Example: 'application/json' for one match object out of a JSON report."
2769
+ },
2770
+ "pointer": {
2771
+ "type": "string",
2772
+ "description": "Where this record sits inside the artifact it came from, as a JSON Pointer (RFC 6901) for JSON sources or an XPath for XML ones. Example: '/matches/3'.\n\nOptional, and the link that makes carriage verifiable rather than merely present: with it a consumer can confirm the record really is the subtree of `extensions.rawSourceArtifacts[]` it claims to be. Omit it when the source's shape gives a record no addressable location."
2773
+ }
2774
+ },
2775
+ "description": "The source tool's own record for this result — the one entry in the converter's input that produced it, complete though not necessarily byte-for-byte (see `content`).\n\nSCOPED TO THE RESULT DELIBERATELY. For a vulnerability scanner the native record is one (vulnerability, package) pair, which is exactly one result: a CVE reported against two packages yields two entries whose records differ only in the package they matched. Held on the requirement instead, those two records would collide, and merging entries that share an id would have to discard one — so the result is not merely an available home but the correct one.\n\nDistinct from `extensions.rawSourceArtifacts[]`, which carries whole input artifacts: this carries the one record inside one of them, and `pointer` ties the two together. A consumer that wants the whole input reads the artifact; one that wants provenance for a single finding reads this.\n\nDistinct from `code`, which means the code that ran to evaluate the requirement — an InSpec control's source, or a check reference. A serialized finding is not code, and putting one there overloaded a field whose meaning came from InSpec.\n\nCLOSED, and deliberately not a passthrough bag: three required members and an optional pointer are the whole of it. Producer data that HDF does not model belongs in `extensions.passthrough`, which is document-scoped and permissive by design; this field is neither.\n\nClosed with `additionalProperties` rather than the house `unevaluatedProperties` because this definition composes nothing, and the shipped Go validator is a draft-07 engine that does not implement `unevaluatedProperties` — a closure only one of the two validators enforces is not a closure.",
2776
+ "$comment": "Examples, in order: 1) one grype match — the shape that moves out of `code` — located in the carried artifact by pointer; 2) an XCCDF rule-result, where the record is XML although the document embedding it is JSON, so mediaType is per record and not per document; 3) a record whose bytes are not text, carried as base64; 4) the minimum: a record whose source shape gives it no addressable location, so pointer is omitted.",
2777
+ "examples": [
2778
+ {
2779
+ "content": "{\"vulnerability\":{\"id\":\"CVE-2022-48174\",\"severity\":\"Critical\"},\"artifact\":{\"name\":\"ssl_client\",\"version\":\"1.31.1-r9\",\"type\":\"apk\"}}",
2780
+ "encoding": "utf-8",
2781
+ "mediaType": "application/json",
2782
+ "pointer": "/matches/3"
2783
+ },
2784
+ {
2785
+ "content": "<rule-result idref=\"xccdf_org.ssgproject.content_rule_sshd_disable_root_login\" severity=\"medium\">\n <result>fail</result>\n</rule-result>",
2786
+ "encoding": "utf-8",
2787
+ "mediaType": "application/xml",
2788
+ "pointer": "/Benchmark/TestResult/rule-result[4]"
2789
+ },
2790
+ {
2791
+ "content": "UEsDBBQAAAAIAEVnPF20b/JoHgAAABwAAAAKAAAAYXVkaXQuZnZkbA==",
2792
+ "encoding": "base64",
2793
+ "mediaType": "application/octet-stream"
2794
+ },
2795
+ {
2796
+ "content": "host-01,Ubuntu 22.04,CVE-2021-36159,,image,critical,apk-tools,apk-tools,2.12.5-r1",
2797
+ "encoding": "utf-8",
2798
+ "mediaType": "text/csv"
2799
+ }
2800
+ ],
2801
+ "title": "Raw Source Record"
2802
+ },
2353
2803
  "Requirement_Description": {
2354
2804
  "type": "object",
2355
2805
  "unevaluatedProperties": false,
@@ -2386,9 +2836,9 @@
2386
2836
  }
2387
2837
  }
2388
2838
  },
2389
- "https://mitre.github.io/hdf-libs/schemas/primitives/cvss/v3.7.0": {
2839
+ "https://mitre.github.io/hdf-libs/schemas/primitives/cvss/v3.8.0": {
2390
2840
  "$schema": "https://json-schema.org/draft/2020-12/schema",
2391
- "$id": "https://mitre.github.io/hdf-libs/schemas/primitives/cvss/v3.7.0",
2841
+ "$id": "https://mitre.github.io/hdf-libs/schemas/primitives/cvss/v3.8.0",
2392
2842
  "title": "HDF CVSS Primitives",
2393
2843
  "description": "Types for representing CVSS (Common Vulnerability Scoring System) data attached to assessment findings. Supports CVSS v2.0, v3.0, v3.1, and v4.0 metric groups (Base, Threat, Environmental, Supplemental).",
2394
2844
  "$defs": {
@@ -2585,9 +3035,9 @@
2585
3035
  }
2586
3036
  }
2587
3037
  },
2588
- "https://mitre.github.io/hdf-libs/schemas/primitives/affected-package/v3.7.0": {
3038
+ "https://mitre.github.io/hdf-libs/schemas/primitives/affected-package/v3.8.0": {
2589
3039
  "$schema": "https://json-schema.org/draft/2020-12/schema",
2590
- "$id": "https://mitre.github.io/hdf-libs/schemas/primitives/affected-package/v3.7.0",
3040
+ "$id": "https://mitre.github.io/hdf-libs/schemas/primitives/affected-package/v3.8.0",
2591
3041
  "title": "HDF Affected Package Primitives",
2592
3042
  "description": "Types for representing the software package(s) affected by a vulnerability finding.",
2593
3043
  "$defs": {