@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.
package/dist/go/hdf.go CHANGED
@@ -115,241 +115,312 @@ func (r *HDFRequirementChangeEvent) Marshal() ([]byte, error) {
115
115
 
116
116
  // The top level value containing all assessment results.
117
117
  type HDFResults struct {
118
- // Information on the baselines that were evaluated, including findings.
119
- Baselines []EvaluatedBaseline `json:"baselines"`
120
- // The components that were assessed. Each component describes a system element (host,
121
- // container, cloud resource, application, etc.) with optional identity, SBOM, and external
122
- // references.
123
- Components []Component `json:"components,omitempty"`
124
- // Present ONLY on reconciled result sets: lineage recording the seed snapshot and event
125
- // watermark this document was reassembled from (ADR-0005). Documents produced directly by a
126
- // scan omit this field. When present, generator names the reconciling tool.
127
- Derivation *Derivation `json:"derivation,omitempty"`
128
- // Reserved for tool-specific data not defined in the HDF standard. Use this to preserve
129
- // original tool output, auxiliary data, or custom metadata.
130
- Extensions map[string]interface{} `json:"extensions,omitempty"`
131
- // Optional references to external artifacts (CTI/STIX, BOMs, advisories, runbooks, or any
132
- // URI-addressable artifact) relevant to this assessment as a whole. Inert context; see
133
- // External_Reference.
134
- ExternalReferences []ExternalReference `json:"externalReferences,omitempty"`
135
- // Information about the tool that generated this file.
136
- Generator *Generator `json:"generator,omitempty"`
137
- // Unique identifier for this assessment run.
138
- ID *string `json:"id,omitempty"`
139
- // Cryptographic integrity information for verifying this file.
140
- Integrity *Integrity `json:"integrity,omitempty"`
141
- // Reference to an hdf-plan document describing the assessment plan that produced these
142
- // results. May be a relative path, absolute URI, or fragment identifier.
143
- PlanRef *string `json:"planRef,omitempty"`
144
- // Hash of this results document as it stood immediately before the most recent amendment
145
- // application. Written by `hdf amend apply` when it applies at least one override; an apply
146
- // that matches nothing leaves the document untouched. The hash covers the results file's
147
- // RAW BYTES as read, not a canonical form, so reproducing it requires the byte-identical
148
- // original — reformatting or re-serializing the source changes the value. Only the most
149
- // recent pre-application state is recorded: applying amendments to an already-amended
150
- // document REPLACES this value, so it is a single link back one step, not a growing chain.
151
- // Distinct from the `previousChecksum` inside an override, which chains amendments to each
152
- // other and is computed over a canonical JSON form.
153
- PreAmendmentChecksum *Checksum `json:"preAmendmentChecksum,omitempty"`
154
- // Optional reference to automated remediation resources (Ansible playbooks, Terraform
155
- // scripts, etc.) for fixing failing requirements found in this assessment.
156
- Remediation *Remediation `json:"remediation,omitempty"`
157
- // Information about the test execution environment where the security tool was run.
158
- // Distinct from targets (what is being tested).
159
- Runner *Runner `json:"runner,omitempty"`
160
- // Statistics for the assessment run, including duration and result counts.
161
- Statistics *Statistics `json:"statistics,omitempty"`
162
- // Reference to an hdf-system document describing the system under assessment. May be a
163
- // relative path, absolute URI, or fragment identifier.
164
- SystemRef *string `json:"systemRef,omitempty"`
165
- // When this assessment was executed.
166
- Timestamp *time.Time `json:"timestamp,omitempty"`
167
- // The security tool that produced the assessment data in this file.
168
- Tool *Tool `json:"tool,omitempty"`
118
+ // Information on the baselines that were evaluated, including findings.
119
+ Baselines []EvaluatedBaseline `json:"baselines"`
120
+ // The components that were assessed. Each component describes a system element (host,
121
+ // container, cloud resource, application, etc.) with optional identity, SBOM, and external
122
+ // references.
123
+ Components []Component `json:"components,omitempty"`
124
+ // Present ONLY on reconciled result sets: lineage recording the seed snapshot and event
125
+ // watermark this document was reassembled from (ADR-0005). Documents produced directly by a
126
+ // scan omit this field. When present, generator names the reconciling tool.
127
+ Derivation *Derivation `json:"derivation,omitempty"`
128
+ // Producer data outside the HDF model, and the pre-converted source artifact(s) these
129
+ // results were converted from.
130
+ Extensions *Extensions `json:"extensions,omitempty"`
131
+ // Optional references to external artifacts (CTI/STIX, BOMs, advisories, runbooks, or any
132
+ // URI-addressable artifact) relevant to this assessment as a whole. Inert context; see
133
+ // External_Reference.
134
+ ExternalReferences []ExternalReference `json:"externalReferences,omitempty"`
135
+ // Information about the tool that generated this file.
136
+ Generator *Generator `json:"generator,omitempty"`
137
+ // Unique identifier for this assessment run.
138
+ ID *string `json:"id,omitempty"`
139
+ // Cryptographic integrity information for verifying this file.
140
+ Integrity *Integrity `json:"integrity,omitempty"`
141
+ // Reference to an hdf-plan document describing the assessment plan that produced these
142
+ // results. May be a relative path, absolute URI, or fragment identifier.
143
+ PlanRef *string `json:"planRef,omitempty"`
144
+ // Hash of this results document as it stood immediately before the most recent amendment
145
+ // application. Written by `hdf amend apply` when it applies at least one override; an apply
146
+ // that matches nothing leaves the document untouched. The hash covers the results file's
147
+ // RAW BYTES as read, not a canonical form, so reproducing it requires the byte-identical
148
+ // original — reformatting or re-serializing the source changes the value. Only the most
149
+ // recent pre-application state is recorded: applying amendments to an already-amended
150
+ // document REPLACES this value, so it is a single link back one step, not a growing chain.
151
+ // Distinct from the `previousChecksum` inside an override, which chains amendments to each
152
+ // other and is computed over a canonical JSON form.
153
+ PreAmendmentChecksum *Checksum `json:"preAmendmentChecksum,omitempty"`
154
+ // Optional reference to automated remediation resources (Ansible playbooks, Terraform
155
+ // scripts, etc.) for fixing failing requirements found in this assessment.
156
+ Remediation *Remediation `json:"remediation,omitempty"`
157
+ // Information about the test execution environment where the security tool was run.
158
+ // Distinct from targets (what is being tested).
159
+ Runner *Runner `json:"runner,omitempty"`
160
+ // Statistics for the assessment run, including duration and result counts.
161
+ Statistics *Statistics `json:"statistics,omitempty"`
162
+ // Reference to an hdf-system document describing the system under assessment. May be a
163
+ // relative path, absolute URI, or fragment identifier.
164
+ SystemRef *string `json:"systemRef,omitempty"`
165
+ // When this assessment was executed.
166
+ Timestamp *time.Time `json:"timestamp,omitempty"`
167
+ // The security tool that produced the assessment data in this file.
168
+ Tool *Tool `json:"tool,omitempty"`
169
169
  }
170
170
 
171
171
  // Information on a baseline that was evaluated, including any findings.
172
172
  type EvaluatedBaseline struct {
173
- // The set of dependencies this baseline depends on.
173
+ // The set of dependencies this baseline depends on.
174
174
  Depends []Dependency `json:"depends,omitempty"`
175
- // The description - should be more detailed than the summary.
176
- Description *string `json:"description,omitempty"`
177
- // Reserved for tool-specific baseline metadata not defined in the HDF standard.
178
- Extensions map[string]interface{} `json:"extensions,omitempty"`
179
- // A set of descriptions for the requirement groups.
175
+ // Producer data outside the HDF model that belongs to this baseline rather than to the
176
+ // document, and the pre-converted source artifact(s) this baseline was built from.
177
+ Extensions *Extensions `json:"extensions,omitempty"`
178
+ // A set of descriptions for the requirement groups.
180
179
  Groups []RequirementGroup `json:"groups,omitempty"`
181
- // Typed inputs used to parameterize this baseline at execution time. See the Input
182
- // primitive for the full schema.
180
+ // Typed inputs used to parameterize this baseline at execution time. See the Input
181
+ // primitive for the full schema.
183
182
  Inputs []Input `json:"inputs,omitempty"`
184
- // Cryptographic integrity information for verifying this baseline has not been tampered
185
- // with.
183
+ // Cryptographic integrity information for verifying this baseline has not been tampered
184
+ // with.
186
185
  Integrity *Integrity `json:"integrity,omitempty"`
187
- // SHA-256 checksum of the original baseline definition file (before execution). This is an
188
- // immutable reference to the baseline as defined, used to detect tampering with baseline
189
- // requirements or metadata.
186
+ // SHA-256 checksum of the original baseline definition file (before execution). This is an
187
+ // immutable reference to the baseline as defined, used to detect tampering with baseline
188
+ // requirements or metadata.
190
189
  OriginalChecksum *Checksum `json:"originalChecksum,omitempty"`
191
- // The name of the parent baseline if this is a dependency of another.
190
+ // The name of the parent baseline if this is a dependency of another.
192
191
  ParentBaseline *string `json:"parentBaseline,omitempty"`
193
- // The set of requirements including any findings. A baseline must have at least one
194
- // requirement.
192
+ // The set of requirements including any findings. A baseline must have at least one
193
+ // requirement.
195
194
  Requirements []EvaluatedRequirement `json:"requirements"`
196
- // SHA-256 checksum of the raw results before any amendments (statusOverrides or POAMs).
197
- // Used to detect tampering with test results. Compare with currentChecksum to verify
198
- // amendment integrity.
195
+ // SHA-256 checksum of the raw results before any amendments (statusOverrides or POAMs).
196
+ // Used to detect tampering with test results. Amendment integrity is checked against the
197
+ // document-level preAmendmentChecksum at the root, not this per-baseline value: hdf amend
198
+ // apply writes it as the hash of the raw document bytes immediately before the most recent
199
+ // amendment application, one step back only.
199
200
  ResultsChecksum *Checksum `json:"resultsChecksum,omitempty"`
200
- // An explanation of the baseline status. Example: why it was skipped, failed to load, or
201
- // any other status details.
201
+ // An explanation of the baseline status. Example: why it was skipped, failed to load, or
202
+ // any other status details.
202
203
  StatusMessage *string `json:"statusMessage,omitempty"`
203
- // The name - must be unique.
204
+ // The name - must be unique.
204
205
  Name string `json:"name"`
205
- // The copyright holder(s).
206
+ // The copyright holder(s).
206
207
  Copyright *string `json:"copyright,omitempty"`
207
- // The email address or other contact information of the copyright holder(s).
208
+ // The email address or other contact information of the copyright holder(s).
208
209
  CopyrightEmail *string `json:"copyrightEmail,omitempty"`
209
- // Optional references to external artifacts relevant to this baseline (CTI/STIX,
210
- // advisories, source catalogs, or any URI-addressable artifact). Travels with the baseline
211
- // definition. Inert context; see External_Reference.
210
+ // Prose description of the baseline, more detailed than summary. Carried verbatim, like
211
+ // every HDF prose field.
212
+ Description *string `json:"description,omitempty"`
213
+ // Optional references to external artifacts relevant to this baseline (CTI/STIX,
214
+ // advisories, source catalogs, or any URI-addressable artifact). Travels with the baseline
215
+ // definition. Inert context; see External_Reference.
212
216
  ExternalReferences []ExternalReference `json:"externalReferences,omitempty"`
213
- // Optional key-value labels for flexible grouping. Well-known keys: system, component,
214
- // environment, region, team. Values must be strings.
217
+ // Optional key-value labels for flexible grouping. Well-known keys: system, component,
218
+ // environment, region, team. Values must be strings.
215
219
  Labels map[string]string `json:"labels,omitempty"`
216
- // The copyright license. Example: 'Apache-2.0'.
220
+ // The copyright license. Example: 'Apache-2.0'.
217
221
  License *string `json:"license,omitempty"`
218
- // The maintainer(s).
222
+ // The maintainer(s).
219
223
  Maintainer *string `json:"maintainer,omitempty"`
220
- // The status. Example: 'loaded'.
224
+ // The status. Example: 'loaded'.
221
225
  Status *string `json:"status,omitempty"`
222
- // The summary. Example: the Security Technical Implementation Guide (STIG) header.
226
+ // The summary. Example: the Security Technical Implementation Guide (STIG) header.
223
227
  Summary *string `json:"summary,omitempty"`
224
- // The set of supported platform targets.
228
+ // The set of supported platform targets.
225
229
  Supports []SupportedPlatform `json:"supports,omitempty"`
226
- // The title - should be human readable.
230
+ // The title - should be human readable.
227
231
  Title *string `json:"title,omitempty"`
228
- // The version of the baseline.
232
+ // The version of the baseline.
229
233
  Version *string `json:"version,omitempty"`
230
234
  }
231
235
 
232
236
  // A dependency for a baseline. Can include relative paths or URLs for where to find the dependency.
233
237
  type Dependency struct {
234
- // The branch name for a git repo.
238
+ // The branch name for a git repo.
235
239
  Branch *string `json:"branch,omitempty"`
236
- // The 'user/profilename' attribute for an Automate server.
240
+ // The 'user/profilename' attribute for an Automate server.
237
241
  Compliance *string `json:"compliance,omitempty"`
238
- // The location of the git repo. Example:
239
- // 'https://github.com/my-org/ubuntu-22.04-stig-baseline.git'.
242
+ // The location of the git repo. Example:
243
+ // 'https://github.com/my-org/ubuntu-22.04-stig-baseline.git'.
240
244
  Git *string `json:"git,omitempty"`
241
- // The name or assigned alias.
245
+ // The name or assigned alias.
242
246
  Name *string `json:"name,omitempty"`
243
- // The relative path if the dependency is locally available.
247
+ // The relative path if the dependency is locally available.
244
248
  Path *string `json:"path,omitempty"`
245
- // The status. Should be: 'loaded', 'failed', or 'skipped'.
249
+ // The status. Should be: 'loaded', 'failed', or 'skipped'.
246
250
  Status *string `json:"status,omitempty"`
247
- // The reason for the status if it is 'failed' or 'skipped'.
251
+ // The reason for the status if it is 'failed' or 'skipped'.
248
252
  StatusMessage *string `json:"statusMessage,omitempty"`
249
- // The 'user/profilename' attribute for a Supermarket server.
253
+ // The 'user/profilename' attribute for a Supermarket server.
250
254
  Supermarket *string `json:"supermarket,omitempty"`
251
- // The address of the dependency.
255
+ // The address of the dependency.
252
256
  URL *string `json:"url,omitempty"`
253
257
  }
254
258
 
259
+ // Carrier for data outside the HDF model: `passthrough` for producer data HDF does not model,
260
+ // `rawSourceArtifacts` for the pre-converted input(s). CLOSED: these two members are the whole of
261
+ // it. A key HDF does not define goes inside `passthrough` — that is what `passthrough` is for — so
262
+ // `extensions` never becomes a second, unnamed schema that consumers must reverse-engineer from the
263
+ // producers that happen to write it. Closed with `additionalProperties` rather than the house
264
+ // `unevaluatedProperties` because this definition composes nothing, and the shipped Go validator is
265
+ // a draft-07 engine that does not implement `unevaluatedProperties` — a closure only one of the two
266
+ // validators enforces is not a closure. Declared on every HDF document type that carries a producer
267
+ // envelope (`generator` / `integrity`), and on `Evaluated_Baseline`, so one rule governs both
268
+ // sites.
269
+ type Extensions struct {
270
+ // Catch-all for producer data that HDF does not model — the role heimdall2's
271
+ // `passthrough.auxiliary_data` played: fields a converter deliberately carried but had no
272
+ // home for.
273
+ //
274
+ // Deliberately permissive: unenumerated properties are accepted by design, with no shape
275
+ // imposed on them. HDF neither reads nor interprets what is here. It is the ONLY permissive
276
+ // surface in `extensions` — everything HDF does not define belongs here rather than beside
277
+ // it.
278
+ //
279
+ // This is NOT where the pre-converted source artifact goes. v2 put it here only because
280
+ // nothing else had room; `rawSourceArtifacts` is its home now, and it gives the bytes a
281
+ // checksum, a media type and a reference contract that an untyped object cannot.
282
+ //
283
+ // For data that belongs to one requirement rather than to the document, use that object's
284
+ // own fields — a document-level bag cannot say which requirement it describes.
285
+ Passthrough map[string]interface{} `json:"passthrough,omitempty"`
286
+ // The input(s) this document was converted from, verbatim.
287
+ //
288
+ // An array because a conversion can consume more than one artifact — the OSCAL profile path
289
+ // takes a profile and a catalog. Every other converter takes one input, and an array of one
290
+ // costs nothing.
291
+ //
292
+ // Populating this is required of ingest converters by policy, enforced by the converter
293
+ // contract and test harness rather than by a schema `required`: a tool that emits HDF
294
+ // natively has no source artifact, and requiring the field would make valid native HDF
295
+ // invalid.
296
+ RawSourceArtifacts []ExternalReference `json:"rawSourceArtifacts,omitempty"`
297
+ }
298
+
255
299
  // A generalized reference to any external artifact by identity and/or location, modeled on the STIX
256
300
  // 2.1 `external_references` common property. Purpose-agnostic: cite a CVE, an ATT&CK technique, a
257
301
  // STIX bundle/object, a BOM, a runbook, or any vendor artifact — including kinds with no dedicated
258
302
  // HDF reference category. `sourceName` names the system; `externalId` cites by id within that
259
303
  // system; `href` locates it. `sourceName` + `externalId` is equivalently a URN
260
304
  // (`urn:<sourceName>:<externalId>`, RFC 8141), so the by-identity and by-location forms stay
261
- // interconvertible. A reference is inert context: it overrides nothing, so it carries only
262
- // lightweight optional `addedBy`/`addedAt` attribution, never override machinery.
305
+ // interconvertible. An entry may also carry the artifact itself rather than point at it: `document`
306
+ // for a JSON object, `content` + `encoding` for anything else. Embedding satisfies the at-least-one
307
+ // rule on its own, so an artifact with no meaningful public location needs no synthetic `href`. A
308
+ // reference is inert context: it overrides nothing, so it carries only lightweight optional
309
+ // `addedBy`/`addedAt` attribution, never override machinery.
263
310
  type ExternalReference struct {
264
- // When this reference was attached (RFC 3339 / trimmed-UTC per HDF timestamp convention).
265
- AddedAt *time.Time `json:"addedAt,omitempty"`
266
- // Who attached this reference. Lightweight, flat attribution — a reference overrides
267
- // nothing, so it has no chaining/superseding/disposition.
268
- AddedBy *Identity `json:"addedBy,omitempty"`
269
- // Integrity hash of the referenced artifact. Reuses the HDF `Checksum` primitive (not STIX
270
- // `hashes`). Meaningful only with a retrievable `href`.
271
- Checksum *Checksum `json:"checksum,omitempty"`
272
- // Human-readable description of what is referenced. Satisfies the at-least-one rule on its
273
- // own when neither id nor href is available.
274
- Description *string `json:"description,omitempty"`
275
- // Optional lossless embedded copy of the referenced artifact — the raw STIX object, EPSS
276
- // record, advisory, or annotation payload — preserved verbatim.
277
- //
278
- // Composes with `href`/`externalId` (which point at the artifact) and `checksum` (which
279
- // ties the copy to the source): a single entry can both point and embed.
280
- //
281
- // HDF stays payload-agnostic — the content is carried untouched, never normalized into HDF
282
- // fields — so this does not duplicate the source ontology (e.g. STIX rides here unchanged).
283
- Document map[string]interface{} `json:"document,omitempty"`
284
- // Identifier of the artifact within `sourceName` (e.g., 'CVE-2021-44228' for source 'cve',
285
- // 'T1059' for 'mitre-att&ck'). Cite by id without needing a URL. Together with `sourceName`
286
- // this is a URN.
287
- ExternalID *string `json:"externalId,omitempty"`
288
- // Location of the artifact. `uri-reference` (not `uri`) so a bare internal
289
- // `#fragment`/`#uuid` reference is expressible alongside absolute URLs.
290
- // `checksum`/`mediaType` apply only to a retrievable `href`.
291
- Href *string `json:"href,omitempty"`
292
- // Open token classifying the referenced/embedded payload, turning a bare reference into an
293
- // enrichment envelope.
294
- //
295
- // Deliberately open (like `sourceName`/`rel`), not a closed enum.
296
- //
297
- // Documented starter vocabulary: 'threat-intel' (STIX/CTI object), 'annotation' (human
298
- // triage note), 'exploitation' (EPSS/KEV signal carried as context), 'advisory'
299
- // (vendor/security advisory).
300
- //
301
- // Use the `x-` prefix for custom kinds.
302
- Kind *string `json:"kind,omitempty"`
303
- // IANA media type of the referenced artifact when retrievable (RFC 6838), e.g.,
304
- // 'application/json'. Meaningful only with `href`.
305
- MediaType *string `json:"mediaType,omitempty"`
306
- // Open relationship token describing how this reference relates to the referencing object.
307
- // Deliberately open (cf. OSCAL `rel` allow-other, RFC 8288 extension relations). Documented
308
- // starter vocabulary: 'reference' (generic), 'definition' (defines the concept), 'evidence'
309
- // (supporting evidence), 'investigate' (a live pivot to investigate), 'canonical' (the
310
- // authoritative source).
311
- Rel *string `json:"rel,omitempty"`
312
- // Name of the external system/source being referenced (e.g., 'cve', 'mitre-att&ck', 'stix',
313
- // 'taxii', or any vendor label). Open string — not a closed enum. Use the `x-` prefix
314
- // convention for custom/experimental sources, mirroring `bomType`.
315
- SourceName string `json:"sourceName"`
311
+ // When this reference was attached (RFC 3339 / trimmed-UTC per HDF timestamp convention).
312
+ AddedAt *time.Time `json:"addedAt,omitempty"`
313
+ // Who attached this reference. Lightweight, flat attribution — a reference overrides
314
+ // nothing, so it has no chaining/superseding/disposition.
315
+ AddedBy *Identity `json:"addedBy,omitempty"`
316
+ // Integrity hash of the artifact. Reuses the HDF `Checksum` primitive (not STIX `hashes`).
317
+ // Applies both to an artifact retrievable at `href` and to one embedded here in `content`
318
+ // or `document` — beside embedded bytes it is what makes the copy verifiable rather than
319
+ // merely present.
320
+ Checksum *Checksum `json:"checksum,omitempty"`
321
+ // Optional lossless embedded copy of the artifact's bytes as a string, for artifacts
322
+ // `document` cannot hold: XML, CSV, NDJSON, plain text, a JSON array, or bytes that are not
323
+ // valid UTF-8 text at all.
324
+ //
325
+ // `encoding` states how to read it back and is required alongside it. Set `mediaType` so a
326
+ // consumer knows what the bytes are, and `checksum` so the copy can be verified against the
327
+ // source.
328
+ //
329
+ // Carried verbatim — never reformatted, re-indented, or re-serialized.
330
+ Content *string `json:"content,omitempty"`
331
+ // Human-readable description of what is referenced. Satisfies the at-least-one rule on its
332
+ // own when neither id nor href is available.
333
+ Description *string `json:"description,omitempty"`
334
+ // Optional lossless embedded copy of the referenced artifact as a JSON object — the raw
335
+ // STIX object, EPSS record, advisory, or annotation payload — preserved verbatim.
336
+ //
337
+ // JSON objects only. An artifact that is not a JSON object (XML, CSV, NDJSON, plain text, a
338
+ // JSON array, or bytes that are not text at all) embeds through `content` + `encoding`
339
+ // instead.
340
+ //
341
+ // Composes with `href`/`externalId` (which point at the artifact) and `checksum` (which
342
+ // ties the copy to the source): a single entry can both point and embed.
343
+ //
344
+ // HDF stays payload-agnostic — the content is carried untouched, never normalized into HDF
345
+ // fields — so this does not duplicate the source ontology (e.g. STIX rides here unchanged).
346
+ Document map[string]interface{} `json:"document,omitempty"`
347
+ // How to read `content` back into the artifact's bytes. 'utf-8' for text (XML, CSV, NDJSON,
348
+ // plain text, JavaScript-wrapped JSON); 'base64' for anything that is not valid UTF-8
349
+ // text.
350
+ //
351
+ // Required whenever `content` is present, and meaningless without it — an embedded copy
352
+ // whose encoding a consumer has to guess is not lossless.
353
+ Encoding *ExternalReferenceEncoding `json:"encoding,omitempty"`
354
+ // Identifier of the artifact within `sourceName` (e.g., 'CVE-2021-44228' for source 'cve',
355
+ // 'T1059' for 'mitre-att&ck'). Cite by id without needing a URL. Together with `sourceName`
356
+ // this is a URN.
357
+ ExternalID *string `json:"externalId,omitempty"`
358
+ // Location of the artifact. `uri-reference` (not `uri`) so a bare internal
359
+ // `#fragment`/`#uuid` reference is expressible alongside absolute URLs. Set it only when
360
+ // the location is meaningful to a reader — never a producer's local filesystem path.
361
+ Href *string `json:"href,omitempty"`
362
+ // Open token classifying the referenced/embedded payload, turning a bare reference into an
363
+ // enrichment envelope.
364
+ //
365
+ // Deliberately open (like `sourceName`/`rel`), not a closed enum.
366
+ //
367
+ // Documented starter vocabulary: 'threat-intel' (STIX/CTI object), 'annotation' (human
368
+ // triage note), 'exploitation' (EPSS/KEV signal carried as context), 'advisory'
369
+ // (vendor/security advisory).
370
+ //
371
+ // Use the `x-` prefix for custom kinds.
372
+ Kind *string `json:"kind,omitempty"`
373
+ // IANA media type of the artifact (RFC 6838), e.g., 'application/json', 'application/xml',
374
+ // 'text/csv'. Applies both to an artifact retrievable at `href` and to one embedded here in
375
+ // `content` or `document`.
376
+ MediaType *string `json:"mediaType,omitempty"`
377
+ // Open relationship token describing how this reference relates to the referencing object.
378
+ // Deliberately open (cf. OSCAL `rel` allow-other, RFC 8288 extension relations). Documented
379
+ // starter vocabulary: 'reference' (generic), 'definition' (defines the concept), 'evidence'
380
+ // (supporting evidence), 'investigate' (a live pivot to investigate), 'canonical' (the
381
+ // authoritative source).
382
+ Rel *string `json:"rel,omitempty"`
383
+ // Name of the external system/source being referenced (e.g., 'cve', 'mitre-att&ck', 'stix',
384
+ // 'taxii', or any vendor label). Open string — not a closed enum. Use the `x-` prefix
385
+ // convention for custom/experimental sources, mirroring `bomType`.
386
+ SourceName string `json:"sourceName"`
316
387
  }
317
388
 
318
389
  // Represents an identity that performed an action, such as capturing evidence or applying an
319
390
  // override.
320
391
  type Identity struct {
321
- // Optional description of the identity or identity system, particularly useful when type is
322
- // 'other'.
392
+ // Optional description of the identity or identity system, particularly useful when type is
393
+ // 'other'.
323
394
  Description *string `json:"description,omitempty"`
324
- // The identifier value. Example: 'user@example.com', 'jdoe', 'automated-scanner-01'.
395
+ // The identifier value. Example: 'user@example.com', 'jdoe', 'automated-scanner-01'.
325
396
  Identifier string `json:"identifier"`
326
- // The type of identifier.
327
- //
328
- // Use 'email' for email addresses, 'username' for user accounts, 'system' for deterministic
329
- // non-interactive automation (CI jobs, cron, scanners), 'agent' for an AI/LLM agent acting
330
- // with autonomy — kept distinct from 'system' so auditors can apply AI-specific scrutiny
331
- // (e.g. 'an LLM proposed this' vs a deterministic job) and satisfy AI-source disclosure
332
- // under frameworks like the EU AI Act and NIST AI RMF, 'simple' for basic string
333
- // identifiers without additional classification, or 'other' for custom identity systems.
397
+ // The type of identifier.
398
+ //
399
+ // Use 'email' for email addresses, 'username' for user accounts, 'system' for deterministic
400
+ // non-interactive automation (CI jobs, cron, scanners), 'agent' for an AI/LLM agent acting
401
+ // with autonomy — kept distinct from 'system' so auditors can apply AI-specific scrutiny
402
+ // (e.g. 'an LLM proposed this' vs a deterministic job) and satisfy AI-source disclosure
403
+ // under frameworks like the EU AI Act and NIST AI RMF, 'simple' for basic string
404
+ // identifiers without additional classification, or 'other' for custom identity systems.
334
405
  Type IdentityType `json:"type"`
335
406
  }
336
407
 
337
408
  // Cryptographic checksum for baseline integrity verification.
338
409
  type Checksum struct {
339
- // The hash algorithm used for the checksum.
410
+ // The hash algorithm used for the checksum.
340
411
  Algorithm HashAlgorithm `json:"algorithm"`
341
- // The checksum value.
412
+ // The checksum value.
342
413
  Value string `json:"value"`
343
414
  }
344
415
 
345
416
  // Describes a group of requirements, such as those defined in a single file.
346
417
  type RequirementGroup struct {
347
- // The unique identifier for the group. Example: the relative path to the file specifying
348
- // the requirements.
418
+ // The unique identifier for the group. Example: the relative path to the file specifying
419
+ // the requirements.
349
420
  ID string `json:"id"`
350
- // The set of requirements as specified by their ids in this group. Example: 'SV-238196'.
421
+ // The set of requirements as specified by their ids in this group. Example: 'SV-238196'.
351
422
  Requirements []string `json:"requirements"`
352
- // The title of the group - should be human readable.
423
+ // The title of the group - should be human readable.
353
424
  Title *string `json:"title,omitempty"`
354
425
  }
355
426
 
@@ -357,178 +428,184 @@ type RequirementGroup struct {
357
428
  // expected configuration values with type information, comparison operators, and validation
358
429
  // constraints, enabling traceability from policy through to scan results.
359
430
  type Input struct {
360
- // Validation constraints for the input value.
431
+ // Validation constraints for the input value.
361
432
  Constraints *InputConstraints `json:"constraints,omitempty"`
362
- // Human-readable description of what this input controls.
433
+ // Human-readable description of what this input controls.
363
434
  Description *string `json:"description,omitempty"`
364
- // The input name. Must be unique within a baseline or results document. Example:
365
- // 'max_concurrent_sessions'.
435
+ // The input name. Must be unique within a baseline or results document. Example:
436
+ // 'max_concurrent_sessions'.
366
437
  Name string `json:"name"`
367
- // The comparison operator used when evaluating this input against observed values.
438
+ // The comparison operator used when evaluating this input against observed values.
368
439
  Operator *ComparisonOperator `json:"operator,omitempty"`
369
- // Whether this input must be provided. Defaults to false if omitted.
440
+ // Whether this input must be provided. Defaults to false if omitted.
370
441
  Required *bool `json:"required,omitempty"`
371
- // Whether this input contains sensitive data (passwords, keys). Sensitive values should be
372
- // redacted in output. Defaults to false if omitted.
442
+ // Whether this input contains sensitive data (passwords, keys). Sensitive values should be
443
+ // redacted in output. Defaults to false if omitted.
373
444
  Sensitive *bool `json:"sensitive,omitempty"`
374
- // The data type of this input.
445
+ // The data type of this input.
375
446
  Type *InputType `json:"type,omitempty"`
376
- // The input value. Type should match the declared type field. Accepts any JSON value.
447
+ // The input value. Type should match the declared type field. Accepts any JSON value.
377
448
  Value interface{} `json:"value,omitempty"`
378
449
  }
379
450
 
380
451
  // Validation constraints for an input value.
381
452
  type InputConstraints struct {
382
- // Enumeration of permitted values.
383
- AllowedValues []interface{} `json:"allowedValues,omitempty"`
384
- // Maximum allowed value (for Numeric inputs).
385
- Max *float64 `json:"max,omitempty"`
386
- // Minimum allowed value (for Numeric inputs).
387
- Min *float64 `json:"min,omitempty"`
388
- // Regular expression pattern the value must match (for String inputs).
389
- Pattern *string `json:"pattern,omitempty"`
453
+ // Enumeration of permitted values. Each entry may be any JSON value, the same freedom
454
+ // Input.value has: an Array or Hash input enumerates container values, so no element type
455
+ // is imposed.
456
+ AllowedValues []interface{} `json:"allowedValues,omitempty"`
457
+ // Maximum allowed value (for Numeric inputs).
458
+ Max *float64 `json:"max,omitempty"`
459
+ // Minimum allowed value (for Numeric inputs).
460
+ Min *float64 `json:"min,omitempty"`
461
+ // Regular expression pattern the value must match (for String inputs).
462
+ Pattern *string `json:"pattern,omitempty"`
390
463
  }
391
464
 
392
465
  // Cryptographic integrity information for verifying the HDF file has not been tampered with. If
393
466
  // algorithm is provided, checksum must also be provided, and vice versa.
394
467
  type Integrity struct {
395
- // The hash algorithm used for the checksum.
468
+ // The hash algorithm used for the checksum.
396
469
  Algorithm *HashAlgorithm `json:"algorithm,omitempty"`
397
- // The checksum value.
470
+ // The checksum value.
398
471
  Checksum *string `json:"checksum,omitempty"`
399
- // Optional cryptographic signature.
472
+ // Optional cryptographic signature.
400
473
  Signature *string `json:"signature,omitempty"`
401
- // Identifier of who signed this file.
474
+ // Identifier of who signed this file.
402
475
  SignedBy *string `json:"signedBy,omitempty"`
403
476
  }
404
477
 
405
478
  // A requirement that has been evaluated, including any findings.
406
479
  type EvaluatedRequirement struct {
407
- // Packages affected by this vulnerability finding. Vulnerability-finding-scoped — see
408
- // components[] on hdf-system for component-level package inventories. One entry per matched
409
- // package signature (scanners often report multiple CPE variations per CVE).
480
+ // Packages affected by this vulnerability finding. Vulnerability-finding-scoped — see
481
+ // components[] on hdf-system for component-level package inventories. One entry per matched
482
+ // package signature (scanners often report multiple CPE variations per CVE).
410
483
  AffectedPackages []AffectedPackage `json:"affectedPackages,omitempty"`
411
- // Structured CVSS scoring data for vulnerability findings. One entry per CVE — a finding
412
- // may match multiple CVEs (common in vulnerability scanners). Captures vendor-supplied Base
413
- // metrics plus optional consumer-owned Threat / Environmental / Supplemental groups for
414
- // risk adjustment. See cvss.schema.json.
484
+ // Structured CVSS scoring data for vulnerability findings. One entry per CVE — a finding
485
+ // may match multiple CVEs (common in vulnerability scanners). Captures vendor-supplied Base
486
+ // metrics plus optional consumer-owned Threat / Environmental / Supplemental groups for
487
+ // risk adjustment. See cvss.schema.json.
415
488
  Cvss []Cvss `json:"cvss,omitempty"`
416
- // Common Weakness Enumeration IDs associated with this finding. Use CWE-N format with no
417
- // leading zeros (matches the MITRE catalog convention). For NIST control mappings derived
418
- // from CWE, see tags.nist.
489
+ // Common Weakness Enumeration IDs associated with this finding. Use CWE-N format with no
490
+ // leading zeros (matches the MITRE catalog convention). For NIST control mappings derived
491
+ // from CWE, see tags.nist.
419
492
  Cwe []string `json:"cwe,omitempty"`
420
- // Array of labeled descriptions. At least one description with label 'default' must be
421
- // present. Convention: place default description first. Common labels: 'default', 'check',
422
- // 'fix', 'rationale'.
493
+ // Array of labeled descriptions. At least one description with label 'default' must be
494
+ // present. Convention: place default description first. Common labels: 'default', 'check',
495
+ // 'fix', 'rationale'.
423
496
  Descriptions []Description `json:"descriptions"`
424
- // The type of the most recent non-expired override or POAM governing this requirement.
425
- // Indicates why the requirement is in its current state (e.g., waiver, falsePositive,
426
- // riskAdjustment) or what remediation is being tracked (poam). Absent when no overrides or
427
- // POAMs apply.
497
+ // The type of the most recent non-expired override or POAM governing this requirement.
498
+ // Indicates why the requirement is in its current state (e.g., waiver, falsePositive,
499
+ // riskAdjustment) or what remediation is being tracked (poam). Absent when no overrides or
500
+ // POAMs apply.
428
501
  Disposition *OverrideType `json:"disposition,omitempty"`
429
- // Checksum of this requirement's resolved effective posture, for per-control change
430
- // detection in continuous monitoring.
431
- //
432
- // sha256 over the canonical JSON object with keys status, impact, disposition (in that
433
- // order), holding the resolved effective status, resolved effective impact, and governing
434
- // override type (null when nothing governs), with override expiry anchored to the document
435
- // timestamp.
436
- //
437
- // Flips exactly when the operative status, impact, or disposition changes; stable under all
438
- // other churn (result details, timestamps, tags).
439
- //
440
- // Optional; stamped by tooling (hdf convert, hdf amend apply).
502
+ // Checksum of this requirement's resolved effective posture, for per-control change
503
+ // detection in continuous monitoring.
504
+ //
505
+ // sha256 over the canonical JSON object with keys status, impact, disposition (in that
506
+ // order), holding the resolved effective status, resolved effective impact, and governing
507
+ // override type (null when nothing governs), with override expiry anchored to the document
508
+ // timestamp.
509
+ //
510
+ // Flips exactly when the operative status, impact, or disposition changes; stable under all
511
+ // other churn (result details, timestamps, tags).
512
+ //
513
+ // Optional; stamped by tooling (hdf convert, hdf amend apply).
441
514
  EffectiveChecksum *Checksum `json:"effectiveChecksum,omitempty"`
442
- // The current effective impact score (0.0–1.0) after applying the most recent non-expired
443
- // override with an impact field. Absent when no impact overrides apply; consumers should
444
- // use the requirement's impact field in that case.
515
+ // The current effective impact score (0.0–1.0) after applying the most recent non-expired
516
+ // override with an impact field. Absent when no impact overrides apply; consumers should
517
+ // use the requirement's impact field in that case.
445
518
  EffectiveImpact *float64 `json:"effectiveImpact,omitempty"`
446
- // The current effective compliance status of this requirement after applying the most
447
- // recent non-expired override with a status field, or computed from results (worst-wins) if
448
- // no status-bearing overrides exist.
519
+ // The current effective compliance status of this requirement after applying the most
520
+ // recent non-expired override with a status field, or computed from results (worst-wins) if
521
+ // no status-bearing overrides exist.
449
522
  EffectiveStatus *ResultStatus `json:"effectiveStatus,omitempty"`
450
- // FIRST.org EPSS (Exploit Prediction Scoring System) score for this CVE finding. Used
451
- // alongside CVSS for prioritization — captures the probability the vulnerability will be
452
- // exploited.
523
+ // FIRST.org EPSS (Exploit Prediction Scoring System) score for this CVE finding. Used
524
+ // alongside CVSS for prioritization — captures the probability the vulnerability will be
525
+ // exploited.
453
526
  Epss *Epss `json:"epss,omitempty"`
454
- // Supporting evidence for this requirement's findings, such as screenshots, code samples,
455
- // or log excerpts.
527
+ // Supporting evidence for this requirement's findings, such as screenshots, code samples,
528
+ // or log excerpts.
456
529
  Evidence []Evidence `json:"evidence,omitempty"`
457
- // CISA Known Exploited Vulnerabilities (KEV) catalog status. When inKev=true, dateAdded and
458
- // dueDate carry the federal patching deadline.
530
+ // CISA Known Exploited Vulnerabilities (KEV) catalog status. When inKev=true, dateAdded and
531
+ // dueDate carry the federal patching deadline.
459
532
  Kev *Kev `json:"kev,omitempty"`
460
- // Plan of Action and Milestones for tracking remediation, mitigation, or risk acceptance.
461
- // POAMs do NOT change effectiveStatus - they track the work being done to address a
462
- // failure. Separate from statusOverrides which DO change status.
533
+ // Plan of Action and Milestones for tracking remediation, mitigation, or risk acceptance.
534
+ // POAMs do NOT change effectiveStatus - they track the work being done to address a
535
+ // failure. Separate from statusOverrides which DO change status.
463
536
  Poams []PoamElement `json:"poams,omitempty"`
464
- // The set of all tests within the requirement and their results.
537
+ // The set of all tests within the requirement and their results.
465
538
  Results []RequirementResult `json:"results"`
466
- // Explicit severity rating. Typically derived from impact score but provided explicitly for
467
- // clarity.
539
+ // Explicit severity rating. Typically derived from impact score but provided explicitly for
540
+ // clarity.
468
541
  Severity *Severity `json:"severity,omitempty"`
469
- // The explicit location of the requirement within the source code.
542
+ // The explicit location of the requirement within the source code.
470
543
  SourceLocation *SourceLocation `json:"sourceLocation,omitempty"`
471
- // Chronological history of all overrides applied to this requirement. Overrides are
472
- // intentional changes to the compliance status and/or impact score (waivers, attestations,
473
- // false positives, risk adjustments). Array order is NOT significant: consumers resolve the
474
- // governing override by appliedAt (the most recently applied non-expired one), never by
475
- // position. Earlier revisions of this description asked for most-recent-first, but nothing
476
- // enforces it and producers commonly append, so position is frequently the opposite of
477
- // recency. Preserves full audit trail.
544
+ // Chronological history of all overrides applied to this requirement. Overrides are
545
+ // intentional changes to the compliance status and/or impact score (waivers, attestations,
546
+ // false positives, risk adjustments). Array order is NOT significant: consumers resolve the
547
+ // governing override by appliedAt (the most recently applied non-expired one), never by
548
+ // position. Earlier revisions of this description asked for most-recent-first, but nothing
549
+ // enforces it and producers commonly append, so position is frequently the opposite of
550
+ // recency. Preserves full audit trail.
478
551
  StatusOverrides []StatusOverride `json:"statusOverrides,omitempty"`
479
- // The requirement identifier. Example: 'SV-238196'.
552
+ // The requirement identifier, naming the requirement itself rather than one finding of it.
553
+ // Example: 'SV-238196'. Several entries in one baseline may legitimately carry the same id
554
+ // (one scanner reporting one CVE against several packages, or an overlay restating what it
555
+ // inherits), so an id is not an instance key: index requirements as id to list, never id to
556
+ // one, and an amendment addressing an id applies to every entry carrying it.
480
557
  ID string `json:"id"`
481
- // The impactfulness or severity (0.0 to 1.0).
558
+ // The impactfulness or severity (0.0 to 1.0).
482
559
  Impact float64 `json:"impact"`
483
- // A set of tags - usually metadata like CCI, STIG ID, severity.
560
+ // A set of tags - usually metadata like CCI, STIG ID, severity.
484
561
  Tags map[string]interface{} `json:"tags"`
485
- // Whether the requirement is mandatory within its baseline.
486
- //
487
- // Distinct from severity (risk weight) and status (lifecycle state).
488
- //
489
- // Maps cleanly onto: FedRAMP rev5 OSCAL 'CORE' prop, FedRAMP 20x inline 'Optional:'
490
- // markers, CMMC sublevel rows, and CIS Implementation Group memberships (IG1/IG2/IG3 may
491
- // carry richer semantics; layer those onto props[]/tags{}).
492
- //
493
- // Optional: when omitted, consumers should treat the requirement as 'required' by
494
- // convention.
562
+ // Whether the requirement is mandatory within its baseline.
563
+ //
564
+ // Distinct from severity (risk weight) and status (lifecycle state).
565
+ //
566
+ // Maps cleanly onto: FedRAMP rev5 OSCAL 'CORE' prop, FedRAMP 20x inline 'Optional:'
567
+ // markers, CMMC sublevel rows, and CIS Implementation Group memberships (IG1/IG2/IG3 may
568
+ // carry richer semantics; layer those onto props[]/tags{}).
569
+ //
570
+ // Optional: when omitted, consumers should treat the requirement as 'required' by
571
+ // convention.
495
572
  Applicability *Applicability `json:"applicability,omitempty"`
496
- // The raw source code of the requirement. Set to null for manual-only requirements or
497
- // requirements not yet implemented; use verificationMethod to disambiguate manual-by-design
498
- // from manual-pending-automation. Note that if this is an overlay, it does not include the
499
- // underlying source code.
573
+ // The raw source code of the requirement. Set to null for manual-only requirements or
574
+ // requirements not yet implemented; use verificationMethod to disambiguate manual-by-design
575
+ // from manual-pending-automation. Note that if this is an overlay, it does not include the
576
+ // underlying source code.
500
577
  Code *string `json:"code,omitempty"`
501
- // Classification of the control's nature, aligning with NIST SP 800-53 / SP 800-53A
502
- // categories.
503
- //
504
- // 'policy' = an authored governance statement; 'procedure' = a documented process;
505
- // 'technical' = an enforced technical configuration; 'management' = a
506
- // programmatic/management activity; 'operational' = a recurring operational activity (e.g.
507
- // AT, IR, MA families).
508
- //
509
- // Optional: when omitted, consumers may infer heuristically from family/id but should not
510
- // assume a default.
578
+ // Classification of the control's nature, aligning with NIST SP 800-53 / SP 800-53A
579
+ // categories.
580
+ //
581
+ // 'policy' = an authored governance statement; 'procedure' = a documented process;
582
+ // 'technical' = an enforced technical configuration; 'management' = a
583
+ // programmatic/management activity; 'operational' = a recurring operational activity (e.g.
584
+ // AT, IR, MA families).
585
+ //
586
+ // Optional: when omitted, consumers may infer heuristically from family/id but should not
587
+ // assume a default.
511
588
  ControlType *ControlType `json:"controlType,omitempty"`
512
- // Optional references to external artifacts relevant to this requirement (CTI/STIX
513
- // correlation, advisories, control/definition sources, or any URI-addressable artifact).
514
- // Applies to both baseline requirement definitions and evaluated requirements. Inert
515
- // context; see External_Reference.
589
+ // Optional references to external artifacts relevant to this requirement (CTI/STIX
590
+ // correlation, advisories, control/definition sources, or any URI-addressable artifact).
591
+ // Applies to both baseline requirement definitions and evaluated requirements. Inert
592
+ // context; see External_Reference.
516
593
  ExternalReferences []ExternalReference `json:"externalReferences,omitempty"`
517
- // The set of references to external documents.
594
+ // The set of references to external documents.
518
595
  Refs []Reference `json:"refs,omitempty"`
519
- // The title - is nullable.
596
+ // The title - is nullable.
520
597
  Title *string `json:"title,omitempty"`
521
- // How this requirement is intended to be verified.
522
- //
523
- // Disambiguates the two cases that null 'code' overloads: 'manual-by-design' (the
524
- // requirement is statement-form and not amenable to automation, e.g. FedRAMP 20x KSIs);
525
- // 'manual-pending-automation' (automation could exist but does not yet, e.g. a STIG rule
526
- // lacking a fix).
527
- //
528
- // 'automated' = a check exists and runs without operator action; 'hybrid' = part automated,
529
- // part manual.
530
- //
531
- // Optional: when omitted, consumers should not infer a default.
598
+ // How this requirement is intended to be verified.
599
+ //
600
+ // Disambiguates the two cases that null 'code' overloads: 'manual-by-design' (the
601
+ // requirement is statement-form and not amenable to automation, e.g. FedRAMP 20x KSIs);
602
+ // 'manual-pending-automation' (automation could exist but does not yet, e.g. a STIG rule
603
+ // lacking a fix).
604
+ //
605
+ // 'automated' = a check exists and runs without operator action; 'hybrid' = part automated,
606
+ // part manual.
607
+ //
608
+ // Optional: when omitted, consumers should not infer a default.
532
609
  VerificationMethod *VerificationMethodEnum `json:"verificationMethod,omitempty"`
533
610
  }
534
611
 
@@ -541,35 +618,35 @@ type EvaluatedRequirement struct {
541
618
  // name/version implicitly, so either may stand on its own; the name+version+ecosystem combination
542
619
  // is the explicit form for sources without formal identifiers.
543
620
  type AffectedPackage struct {
544
- // Optional CPE 2.3 URI identifying the affected product. Validated leniently: only the
545
- // 'cpe:2.3:' prefix and the part-type letter ('a' application, 'h' hardware, 'o' operating
546
- // system) are enforced here. Use `hdf-utilities.parseCpe` for full-grammar parsing.
547
- // Example: `cpe:2.3:a:openssl:openssl:1.1.1k:*:*:*:*:*:*:*`.
621
+ // Optional CPE 2.3 URI identifying the affected product. Validated leniently: only the
622
+ // 'cpe:2.3:' prefix and the part-type letter ('a' application, 'h' hardware, 'o' operating
623
+ // system) are enforced here. Use `hdf-utilities.parseCpe` for full-grammar parsing.
624
+ // Example: `cpe:2.3:a:openssl:openssl:1.1.1k:*:*:*:*:*:*:*`.
548
625
  Cpe *string `json:"cpe,omitempty"`
549
- // The packaging ecosystem the package belongs to. Use 'generic' for hardware, firmware, or
550
- // anything outside the listed language/OS package managers.
626
+ // The packaging ecosystem the package belongs to. Use 'generic' for hardware, firmware, or
627
+ // anything outside the listed language/OS package managers.
551
628
  Ecosystem *Ecosystem `json:"ecosystem,omitempty"`
552
- // Optional version string identifying the first release that contains the fix for the
553
- // vulnerability. Use the same version syntax as `version`. Example: '1.1.1l' fixes
554
- // 'openssl@1.1.1k'.
629
+ // Optional version string identifying the first release that contains the fix for the
630
+ // vulnerability. Use the same version syntax as `version`. Example: '1.1.1l' fixes
631
+ // 'openssl@1.1.1k'.
555
632
  FixedInVersion *string `json:"fixedInVersion,omitempty"`
556
- // The package name as published in its ecosystem. Examples: 'openssl' (rpm), 'lodash'
557
- // (npm), 'org.apache.logging.log4j:log4j-core' (maven, group:artifact).
633
+ // The package name as published in its ecosystem. Examples: 'openssl' (rpm), 'lodash'
634
+ // (npm), 'org.apache.logging.log4j:log4j-core' (maven, group:artifact).
558
635
  Name *string `json:"name,omitempty"`
559
- // Optional Package URL (PURL) identifying the affected package.
560
- //
561
- // Validated leniently: only the 'pkg:TYPE/' scheme prefix is enforced here, where TYPE
562
- // follows the PURL grammar (a letter followed by letters, digits, '.', '+', or '-') and is
563
- // matched case-insensitively to mirror `hdf-utilities.parsePurl`'s accept-and-warn
564
- // behavior.
565
- //
566
- // Use `parsePurl` for full PURL parsing.
567
- //
568
- // Example: 'pkg:rpm/redhat/openssl@1.1.1k-7.el8_4?arch=x86_64'.
636
+ // Optional Package URL (PURL) identifying the affected package.
637
+ //
638
+ // Validated leniently: only the 'pkg:TYPE/' scheme prefix is enforced here, where TYPE
639
+ // follows the PURL grammar (a letter followed by letters, digits, '.', '+', or '-') and is
640
+ // matched case-insensitively to mirror `hdf-utilities.parsePurl`'s accept-and-warn
641
+ // behavior.
642
+ //
643
+ // Use `parsePurl` for full PURL parsing.
644
+ //
645
+ // Example: 'pkg:rpm/redhat/openssl@1.1.1k-7.el8_4?arch=x86_64'.
569
646
  Purl *string `json:"purl,omitempty"`
570
- // The exact version of the package that the vulnerability scanner observed. Use the
571
- // ecosystem's native version string verbatim (e.g., '1.1.1k-7.el8_4' for rpm, '4.17.20' for
572
- // npm).
647
+ // The exact version of the package that the vulnerability scanner observed. Use the
648
+ // ecosystem's native version string verbatim (e.g., '1.1.1k-7.el8_4' for rpm, '4.17.20' for
649
+ // npm).
573
650
  Version *string `json:"version,omitempty"`
574
651
  }
575
652
 
@@ -580,59 +657,59 @@ type AffectedPackage struct {
580
657
  // per version, correct values per metric) is performed by the hdf-utilities `validateCvssVector`
581
658
  // helper rather than at the schema layer.
582
659
  type Cvss struct {
583
- // The Base score (0.0–10.0) computed from the base vector. Reflects the intrinsic,
584
- // vendor-published severity before consumer enrichment.
660
+ // The Base score (0.0–10.0) computed from the base vector. Reflects the intrinsic,
661
+ // vendor-published severity before consumer enrichment.
585
662
  BaseScore *float64 `json:"baseScore,omitempty"`
586
- // Qualitative severity band corresponding to baseScore. CVSS 2.0 does not natively use
587
- // 'none' or 'critical' bands; map accordingly when populating.
663
+ // Qualitative severity band corresponding to baseScore. CVSS 2.0 does not natively use
664
+ // 'none' or 'critical' bands; map accordingly when populating.
588
665
  BaseSeverity *CVSSSeverity `json:"baseSeverity,omitempty"`
589
- // Optional Base metric group vector string as emitted by the source (e.g.,
590
- // 'CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H').
591
- //
592
- // For CVSS 2.0 the version prefix is omitted.
593
- //
594
- // Some vendor tools emit a final baseScore without the vector — in that case this field is
595
- // absent and the score cannot be recomputed or decomposed.
596
- //
597
- // The pattern accepts any version-prefixed or prefix-less metric token sequence; semantic
598
- // validity of individual metrics is checked by hdf-utilities, not by the schema.
666
+ // Optional Base metric group vector string as emitted by the source (e.g.,
667
+ // 'CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H').
668
+ //
669
+ // For CVSS 2.0 the version prefix is omitted.
670
+ //
671
+ // Some vendor tools emit a final baseScore without the vector — in that case this field is
672
+ // absent and the score cannot be recomputed or decomposed.
673
+ //
674
+ // The pattern accepts any version-prefixed or prefix-less metric token sequence; semantic
675
+ // validity of individual metrics is checked by hdf-utilities, not by the schema.
599
676
  BaseVector *string `json:"baseVector,omitempty"`
600
- // Optional final score after combining Base + Threat + Environmental metrics. This is the
601
- // score consumers should treat as authoritative for risk decisions when present.
677
+ // Optional final score after combining Base + Threat + Environmental metrics. This is the
678
+ // score consumers should treat as authoritative for risk decisions when present.
602
679
  ComputedScore *float64 `json:"computedScore,omitempty"`
603
- // Qualitative severity band corresponding to computedScore. Same band convention as
604
- // baseSeverity.
680
+ // Qualitative severity band corresponding to computedScore. Same band convention as
681
+ // baseSeverity.
605
682
  ComputedSeverity *CVSSSeverity `json:"computedSeverity,omitempty"`
606
- // Optional score (0.0–10.0) recomputed after applying Environmental metrics.
683
+ // Optional score (0.0–10.0) recomputed after applying Environmental metrics.
607
684
  EnvironmentalScore *float64 `json:"environmentalScore,omitempty"`
608
- // Optional Environmental metric group vector segment (e.g., 'MAV:N/CR:H/IR:H/AR:H').
609
- // Consumer-supplied — reflects the deployment context (criticality, mitigations, network
610
- // exposure).
685
+ // Optional Environmental metric group vector segment (e.g., 'MAV:N/CR:H/IR:H/AR:H').
686
+ // Consumer-supplied — reflects the deployment context (criticality, mitigations, network
687
+ // exposure).
611
688
  EnvironmentalVector *string `json:"environmentalVector,omitempty"`
612
- // Optional identifier the CVSS data is associated with — most commonly a CVE ID (e.g.,
613
- // 'CVE-2024-12345'), but may also be a vendor advisory ID, GHSA, or similar.
689
+ // Optional identifier the CVSS data is associated with — most commonly a CVE ID (e.g.,
690
+ // 'CVE-2024-12345'), but may also be a vendor advisory ID, GHSA, or similar.
614
691
  Source *string `json:"source,omitempty"`
615
- // Optional Supplemental metric group vector segment (CVSS 4.0 only). Examples:
616
- // 'S:P/AU:N/V:C/RE:M/U:Amber'. Per CVSS 4.0 spec, supplemental metrics convey additional
617
- // context but have no impact on the computed score.
692
+ // Optional Supplemental metric group vector segment (CVSS 4.0 only). Examples:
693
+ // 'S:P/AU:N/V:C/RE:M/U:Amber'. Per CVSS 4.0 spec, supplemental metrics convey additional
694
+ // context but have no impact on the computed score.
618
695
  SupplementalVector *string `json:"supplementalVector,omitempty"`
619
- // Optional score (0.0–10.0) recomputed after applying Threat metrics. Always less than or
620
- // equal to baseScore in practice.
696
+ // Optional score (0.0–10.0) recomputed after applying Threat metrics. Always less than or
697
+ // equal to baseScore in practice.
621
698
  ThreatScore *float64 `json:"threatScore,omitempty"`
622
- // Optional Threat metric group vector segment (e.g., 'E:U/RL:O/RC:C' for CVSS 3.1, or 'E:A'
623
- // for CVSS 4.0). Consumer-supplied — captures real-world exploitation and remediation
624
- // context the vendor cannot know.
699
+ // Optional Threat metric group vector segment (e.g., 'E:U/RL:O/RC:C' for CVSS 3.1, or 'E:A'
700
+ // for CVSS 4.0). Consumer-supplied — captures real-world exploitation and remediation
701
+ // context the vendor cannot know.
625
702
  ThreatVector *string `json:"threatVector,omitempty"`
626
- // The CVSS specification version this entry conforms to. Vendor scanners typically emit 3.1
627
- // or 4.0; legacy data may use 2.0 or 3.0.
703
+ // The CVSS specification version this entry conforms to. Vendor scanners typically emit 3.1
704
+ // or 4.0; legacy data may use 2.0 or 3.0.
628
705
  Version Version `json:"version"`
629
706
  }
630
707
 
631
708
  type Description struct {
632
- // The description text content.
709
+ // The description text content.
633
710
  Data string `json:"data"`
634
- // Description category. The 'default' label is required for the primary description. Common
635
- // labels: 'default', 'check', 'fix', 'rationale'. Tools may use custom labels.
711
+ // Description category. The 'default' label is required for the primary description. Common
712
+ // labels: 'default', 'check', 'fix', 'rationale'. Tools may use custom labels.
636
713
  Label string `json:"label"`
637
714
  }
638
715
 
@@ -640,57 +717,57 @@ type Description struct {
640
717
  // fields are required when an Epss object is present; the date disambiguates which day's score this
641
718
  // is, since EPSS recomputes daily.
642
719
  type Epss struct {
643
- // ISO 8601 date (YYYY-MM-DD) on which FIRST.org published this EPSS score.
720
+ // ISO 8601 date (YYYY-MM-DD) on which FIRST.org published this EPSS score.
644
721
  Date string `json:"date"`
645
- // Rank of this score relative to all scored CVEs, expressed as a value between 0.0 and 1.0
646
- // inclusive. A percentile of 0.99 means this CVE is scored at or above 99% of all scored
647
- // CVEs.
722
+ // Rank of this score relative to all scored CVEs, expressed as a value between 0.0 and 1.0
723
+ // inclusive. A percentile of 0.99 means this CVE is scored at or above 99% of all scored
724
+ // CVEs.
648
725
  Percentile float64 `json:"percentile"`
649
- // Exploit probability as a value between 0.0 and 1.0 inclusive. Higher values indicate
650
- // greater predicted likelihood of exploitation in the next 30 days. Example: 0.97532 means
651
- // roughly a 97.5% predicted probability.
726
+ // Exploit probability as a value between 0.0 and 1.0 inclusive. Higher values indicate
727
+ // greater predicted likelihood of exploitation in the next 30 days. Example: 0.97532 means
728
+ // roughly a 97.5% predicted probability.
652
729
  Score float64 `json:"score"`
653
730
  }
654
731
 
655
732
  // Supporting evidence for a finding or override, such as screenshots, code samples, log excerpts,
656
733
  // or URLs.
657
734
  type Evidence struct {
658
- // Timestamp when this evidence was captured. ISO 8601 format.
735
+ // Timestamp when this evidence was captured. ISO 8601 format.
659
736
  CapturedAt *time.Time `json:"capturedAt,omitempty"`
660
- // Identity of who or what captured this evidence.
737
+ // Identity of who or what captured this evidence.
661
738
  CapturedBy *Identity `json:"capturedBy,omitempty"`
662
- // The evidence content. For screenshots/files: base64-encoded data or URL. For code/logs:
663
- // the raw text. For URLs: the URL string. Must not be empty. When encoding is 'base64',
664
- // data must be bare base64 matching ^[0-9A-Za-z+/]+={0,2}$ (OSCAL's Base64Datatype): no
665
- // data: URI prefix, URL, or line breaks.
739
+ // The evidence content. For screenshots/files: base64-encoded data or URL. For code/logs:
740
+ // the raw text. For URLs: the URL string. Must not be empty. When encoding is 'base64',
741
+ // data must be bare base64 matching ^[0-9A-Za-z+/]+={0,2}$ (OSCAL's Base64Datatype): no
742
+ // data: URI prefix, URL, or line breaks.
666
743
  Data string `json:"data"`
667
- // Human-readable description of what this evidence shows.
744
+ // Human-readable description of what this evidence shows.
668
745
  Description *string `json:"description,omitempty"`
669
- // Encoding used for the data. Example: 'base64', 'utf-8'. The value 'base64' (exactly,
670
- // lowercase) requires data to be bare base64.
746
+ // Encoding used for the data. Example: 'base64', 'utf-8'. The value 'base64' (exactly,
747
+ // lowercase) requires data to be bare base64.
671
748
  Encoding *string `json:"encoding,omitempty"`
672
- // MIME type of the evidence. Example: 'image/png', 'text/plain', 'application/json'.
749
+ // MIME type of the evidence. Example: 'image/png', 'text/plain', 'application/json'.
673
750
  MIMEType *string `json:"mimeType,omitempty"`
674
- // Size of the evidence data in bytes.
751
+ // Size of the evidence data in bytes.
675
752
  Size *float64 `json:"size,omitempty"`
676
- // The type of evidence being provided.
753
+ // The type of evidence being provided.
677
754
  Type EvidenceType `json:"type"`
678
755
  }
679
756
 
680
757
  // CISA Known Exploited Vulnerabilities (KEV) catalog status. When inKev=true, dateAdded and
681
758
  // dueDate carry the federal patching deadline.
682
759
  type Kev struct {
683
- // ISO 8601 calendar date (YYYY-MM-DD) the vulnerability was added to the CISA KEV catalog.
684
- // Required when inKev is true.
760
+ // ISO 8601 calendar date (YYYY-MM-DD) the vulnerability was added to the CISA KEV catalog.
761
+ // Required when inKev is true.
685
762
  DateAdded *string `json:"dateAdded,omitempty"`
686
- // ISO 8601 calendar date (YYYY-MM-DD) by which federal agencies must remediate per CISA BOD
687
- // 22-01. Normally later than dateAdded, but the schema does not enforce ordering because
688
- // CISA occasionally adjusts published dates. Required when inKev is true.
763
+ // ISO 8601 calendar date (YYYY-MM-DD) by which federal agencies must remediate per CISA BOD
764
+ // 22-01. Normally later than dateAdded, but the schema does not enforce ordering because
765
+ // CISA occasionally adjusts published dates. Required when inKev is true.
689
766
  DueDate *string `json:"dueDate,omitempty"`
690
- // Whether this vulnerability is currently in the CISA Known Exploited Vulnerabilities
691
- // catalog. When true, dateAdded and dueDate are required.
767
+ // Whether this vulnerability is currently in the CISA Known Exploited Vulnerabilities
768
+ // catalog. When true, dateAdded and dueDate are required.
692
769
  InKev bool `json:"inKev"`
693
- // CISA's notes describing the vulnerability, observed exploitation, or remediation guidance.
770
+ // CISA's notes describing the vulnerability, observed exploitation, or remediation guidance.
694
771
  Notes *string `json:"notes,omitempty"`
695
772
  }
696
773
 
@@ -698,54 +775,54 @@ type Kev struct {
698
775
  // POAMs do NOT change the effectiveStatus - the requirement remains in its current state
699
776
  // while the POA&M tracks remediation efforts.
700
777
  type PoamElement struct {
701
- // Timestamp when this POA&M was created. ISO 8601 format.
778
+ // Timestamp when this POA&M was created. ISO 8601 format.
702
779
  AppliedAt time.Time `json:"appliedAt"`
703
- // Identity of who created this POA&M. For simple cases, use type 'simple' with just an
704
- // identifier.
780
+ // Identity of who created this POA&M. For simple cases, use type 'simple' with just an
781
+ // identifier.
705
782
  AppliedBy Identity `json:"appliedBy"`
706
- // Supporting evidence for this POA&M, such as documentation of compensating controls or
707
- // mitigation implementation.
783
+ // Supporting evidence for this POA&M, such as documentation of compensating controls or
784
+ // mitigation implementation.
708
785
  Evidence []Evidence `json:"evidence,omitempty"`
709
- // Required deadline for this POA&M. A POA&M is a time-boxed acceptance of an open finding;
710
- // without a deadline it lets a failing requirement duck remediation indefinitely. Source a
711
- // real date (e.g. a remediation target or vendor-fix date) — never a wall-clock default.
712
- // ISO 8601 format.
786
+ // Required deadline for this POA&M. A POA&M is a time-boxed acceptance of an open finding;
787
+ // without a deadline it lets a failing requirement duck remediation indefinitely. Source a
788
+ // real date (e.g. a remediation target or vendor-fix date) — never a wall-clock default.
789
+ // ISO 8601 format.
713
790
  ExpiresAt time.Time `json:"expiresAt"`
714
- // Detailed explanation of the plan, including what actions will be taken.
791
+ // Detailed explanation of the plan, including what actions will be taken.
715
792
  Explanation string `json:"explanation"`
716
- // Optional array of milestones tracking progress toward completion.
793
+ // Optional array of milestones tracking progress toward completion.
717
794
  Milestones []Milestone `json:"milestones,omitempty"`
718
- // SHA-256 checksum of the previous amendment in chronological order. Each amendment's
719
- // checksum is recorded by the NEXT one, so editing an amendment in place is detectable —
720
- // provided a later amendment is chained to it. It is NOT tamper-proof: the final amendment,
721
- // the document envelope, deleted trailing amendments, and a chain that has been stripped or
722
- // recomputed wholesale are all outside what it can detect. Use signature for
723
- // non-repudiation. Omitted on the first amendment on a requirement.
795
+ // SHA-256 checksum of the previous amendment in chronological order. Each amendment's
796
+ // checksum is recorded by the NEXT one, so editing an amendment in place is detectable —
797
+ // provided a later amendment is chained to it. It is NOT tamper-proof: the final amendment,
798
+ // the document envelope, deleted trailing amendments, and a chain that has been stripped or
799
+ // recomputed wholesale are all outside what it can detect. Use signature for
800
+ // non-repudiation. Omitted on the first amendment on a requirement.
724
801
  PreviousChecksum *Checksum `json:"previousChecksum,omitempty"`
725
- // Optional digital signature for enhanced trust and non-repudiation.
802
+ // Optional digital signature for enhanced trust and non-repudiation.
726
803
  Signature *Signature `json:"signature,omitempty"`
727
- // The type of POA&M. 'remediation' fixes root cause. 'mitigation' reduces risk via
728
- // compensating controls. 'riskAcceptance' documents decision to accept risk.
729
- // 'vendorDependency' tracks a fix that depends on a vendor releasing a patch or update.
804
+ // The type of POA&M. 'remediation' fixes root cause. 'mitigation' reduces risk via
805
+ // compensating controls. 'riskAcceptance' documents decision to accept risk.
806
+ // 'vendorDependency' tracks a fix that depends on a vendor releasing a patch or update.
730
807
  Type POAMType `json:"type"`
731
808
  }
732
809
 
733
810
  // A milestone or task within a POA&M remediation plan.
734
811
  type Milestone struct {
735
- // Actual completion timestamp. ISO 8601 format.
812
+ // Actual completion timestamp. ISO 8601 format.
736
813
  CompletedAt *time.Time `json:"completedAt,omitempty"`
737
- // Identity of who completed this milestone.
814
+ // Identity of who completed this milestone.
738
815
  CompletedBy *Identity `json:"completedBy,omitempty"`
739
- // Description of this milestone or task.
816
+ // Description of this milestone or task.
740
817
  Description string `json:"description"`
741
- // Estimated completion date. ISO 8601 format.
818
+ // Estimated completion date. ISO 8601 format.
742
819
  EstimatedCompletion time.Time `json:"estimatedCompletion"`
743
- // Current status of this milestone.
820
+ // Current status of this milestone.
744
821
  Status MilestoneStatus `json:"status"`
745
- // Short single-line label for this milestone, suitable where a consumer needs a title (for
746
- // example an OSCAL POA&M remediation or task). No line breaks, and no leading or trailing
747
- // whitespace. The description remains the full text of the milestone; the title does not
748
- // replace it.
822
+ // Short single-line label for this milestone, suitable where a consumer needs a title (for
823
+ // example an OSCAL POA&M remediation or task). No line breaks, and no leading or trailing
824
+ // whitespace. The description remains the full text of the milestone; the title does not
825
+ // replace it.
749
826
  Title *string `json:"title,omitempty"`
750
827
  }
751
828
 
@@ -753,42 +830,42 @@ type Milestone struct {
753
830
  // tokens (PKCS#11/PKCS#12), Yubikeys, GPG keys, passkeys, and other cryptographic signing methods
754
831
  // via JWK, PEM, or Base58 key formats.
755
832
  type Signature struct {
756
- // Challenge value from the verifier, used in challenge-response authentication.
833
+ // Challenge value from the verifier, used in challenge-response authentication.
757
834
  Challenge *string `json:"challenge,omitempty"`
758
- // When the signature was created. ISO 8601 format.
835
+ // When the signature was created. ISO 8601 format.
759
836
  Created time.Time `json:"created"`
760
- // The identity that created this signature.
837
+ // The identity that created this signature.
761
838
  Creator Identity `json:"creator"`
762
- // Domain restriction for the signature, prevents cross-domain replay attacks.
839
+ // Domain restriction for the signature, prevents cross-domain replay attacks.
763
840
  Domain *string `json:"domain,omitempty"`
764
- // Random value to prevent replay attacks.
841
+ // Random value to prevent replay attacks.
765
842
  Nonce *string `json:"nonce,omitempty"`
766
- // The purpose of this signature. Example: 'attestation', 'authentication',
767
- // 'assertionMethod'.
843
+ // The purpose of this signature. Example: 'attestation', 'authentication',
844
+ // 'assertionMethod'.
768
845
  ProofPurpose string `json:"proofPurpose"`
769
- // The base64-encoded or base58-encoded signature value.
846
+ // The base64-encoded or base58-encoded signature value.
770
847
  SignatureValue string `json:"signatureValue"`
771
- // The signature suite type. Example: 'JsonWebSignature2020', 'RsaSignature2018',
772
- // 'Ed25519Signature2020'.
848
+ // The signature suite type. Example: 'JsonWebSignature2020', 'RsaSignature2018',
849
+ // 'Ed25519Signature2020'.
773
850
  Type string `json:"type"`
774
- // The verification method containing the public key for signature verification.
851
+ // The verification method containing the public key for signature verification.
775
852
  VerificationMethod VerificationMethod `json:"verificationMethod"`
776
853
  }
777
854
 
778
855
  // Verification method containing the public key needed to verify a digital signature. Supports
779
856
  // multiple key formats including JWK (for RSA, EC), PEM, and Base58.
780
857
  type VerificationMethod struct {
781
- // The entity that controls this verification method. Can be a DID, URI, or other identifier.
858
+ // The entity that controls this verification method. Can be a DID, URI, or other identifier.
782
859
  Controller string `json:"controller"`
783
- // Public key in Base58 format, commonly used with Ed25519 keys.
860
+ // Public key in Base58 format, commonly used with Ed25519 keys.
784
861
  PublicKeyBase58 *string `json:"publicKeyBase58,omitempty"`
785
- // Public key in JSON Web Key format.
862
+ // Public key in JSON Web Key format.
786
863
  PublicKeyJwk map[string]interface{} `json:"publicKeyJwk,omitempty"`
787
- // Public key in PEM format. Example: '-----BEGIN PUBLIC KEY-----...-----END PUBLIC
788
- // KEY-----'.
864
+ // Public key in PEM format. Example: '-----BEGIN PUBLIC KEY-----...-----END PUBLIC
865
+ // KEY-----'.
789
866
  PublicKeyPem *string `json:"publicKeyPem,omitempty"`
790
- // The type of verification method. Example: 'JsonWebKey2020', 'RsaVerificationKey2018',
791
- // 'Ed25519VerificationKey2020'.
867
+ // The type of verification method. Example: 'JsonWebKey2020', 'RsaVerificationKey2018',
868
+ // 'Ed25519VerificationKey2020'.
792
869
  Type string `json:"type"`
793
870
  }
794
871
 
@@ -801,292 +878,355 @@ type Reference struct {
801
878
 
802
879
  // A test within a requirement and its results and findings such as how long it took to run.
803
880
  type RequirementResult struct {
804
- // The stacktrace/backtrace of the exception if one occurred.
805
- Backtrace []string `json:"backtrace,omitempty"`
806
- // A description of this test. Example: 'limits.conf * is expected to include ["hard",
807
- // "maxlogins", "10"]'.
808
- CodeDesc string `json:"codeDesc"`
809
- // The type of exception if an exception was thrown.
810
- Exception *string `json:"exception,omitempty"`
811
- // An explanation of the test result. Typically provided for failed tests, errors, or to
812
- // explain why a test was not applicable or not reviewed.
813
- Message *string `json:"message,omitempty"`
814
- // The resource used in the test. Example: 'file', 'command', 'service'.
815
- Resource *string `json:"resource,omitempty"`
816
- // The unique identifier of the resource. Example: '/etc/passwd'.
817
- ResourceID *string `json:"resourceId,omitempty"`
818
- // The execution time in seconds for the test.
819
- RunTime *float64 `json:"runTime,omitempty"`
820
- // The time at which the test started.
821
- StartTime time.Time `json:"startTime"`
822
- // The status of this test within the requirement. Example: 'failed'.
823
- Status ResultStatus `json:"status"`
881
+ // The stacktrace/backtrace of the exception if one occurred.
882
+ Backtrace []string `json:"backtrace,omitempty"`
883
+ // A description of this test. Example: 'limits.conf * is expected to include ["hard",
884
+ // "maxlogins", "10"]'.
885
+ CodeDesc string `json:"codeDesc"`
886
+ // The type of exception if an exception was thrown.
887
+ Exception *string `json:"exception,omitempty"`
888
+ // An explanation of the test result. Typically provided for failed tests, errors, or to
889
+ // explain why a test was not applicable or not reviewed.
890
+ Message *string `json:"message,omitempty"`
891
+ // The source tool's own record for this result, carrying every field the record had.
892
+ // Complete, not necessarily byte-exact: see Raw_Source_Record.content for the producer and
893
+ // consumer obligations, and extensions.rawSourceArtifacts[] when byte-exact carriage is
894
+ // required.
895
+ RawSourceRecord *RawSourceRecord `json:"rawSourceRecord,omitempty"`
896
+ // The resource used in the test. Example: 'file', 'command', 'service'.
897
+ Resource *string `json:"resource,omitempty"`
898
+ // The unique identifier of the resource. Example: '/etc/passwd'.
899
+ ResourceID *string `json:"resourceId,omitempty"`
900
+ // The execution time in seconds for the test.
901
+ RunTime *float64 `json:"runTime,omitempty"`
902
+ // The time at which the test started.
903
+ StartTime time.Time `json:"startTime"`
904
+ // The status of this test within the requirement. Example: 'failed'.
905
+ Status ResultStatus `json:"status"`
906
+ }
907
+
908
+ // The source tool's own record for this result — the one entry in the converter's input that
909
+ // produced it, complete though not necessarily byte-for-byte (see `content`). SCOPED TO THE RESULT
910
+ // DELIBERATELY. For a vulnerability scanner the native record is one (vulnerability, package) pair,
911
+ // which is exactly one result: a CVE reported against two packages yields two entries whose records
912
+ // differ only in the package they matched. Held on the requirement instead, those two records would
913
+ // collide, and merging entries that share an id would have to discard one — so the result is not
914
+ // merely an available home but the correct one. Distinct from `extensions.rawSourceArtifacts[]`,
915
+ // which carries whole input artifacts: this carries the one record inside one of them, and
916
+ // `pointer` ties the two together. A consumer that wants the whole input reads the artifact; one
917
+ // that wants provenance for a single finding reads this. Distinct from `code`, which means the code
918
+ // that ran to evaluate the requirement — an InSpec control's source, or a check reference. A
919
+ // serialized finding is not code, and putting one there overloaded a field whose meaning came from
920
+ // InSpec. CLOSED, and deliberately not a passthrough bag: three required members and an optional
921
+ // pointer are the whole of it. Producer data that HDF does not model belongs in
922
+ // `extensions.passthrough`, which is document-scoped and permissive by design; this field is
923
+ // neither. Closed with `additionalProperties` rather than the house `unevaluatedProperties` because
924
+ // this definition composes nothing, and the shipped Go validator is a draft-07 engine that does not
925
+ // implement `unevaluatedProperties` — a closure only one of the two validators enforces is not a
926
+ // closure.
927
+ type RawSourceRecord struct {
928
+ // The source tool's own record for this result, carrying every field the record had.
929
+ //
930
+ // COMPLETE, NOT NECESSARILY BYTE-EXACT. A producer SHOULD write the record's bytes
931
+ // unchanged where it can. A producer that cannot — notably one implemented in two languages
932
+ // whose JSON serializers disagree on key order, HTML escaping and number rendering, and
933
+ // which therefore MUST canonicalize to stay byte-identical with its twin — MAY write a
934
+ // canonically serialized form instead. Such a form preserves every field and value but not
935
+ // the original key order, insignificant whitespace, or duplicate keys. A consumer MUST
936
+ // therefore compare records by parsing them, not by comparing bytes, and MUST NOT checksum
937
+ // this field and expect the result to match a checksum of the input.
938
+ //
939
+ // For carriage that IS byte-exact, use `extensions.rawSourceArtifacts[]`, which forbids a
940
+ // parsed `document` precisely so the bytes and their checksum survive; `pointer` ties this
941
+ // record to its position within that artifact.
942
+ Content string `json:"content"`
943
+ // How to read `content`: 'utf-8' for text, 'base64' for bytes that are not valid UTF-8 text.
944
+ Encoding ExternalReferenceEncoding `json:"encoding"`
945
+ // The record's IANA media type — the type of this record, which for a fragment of a larger
946
+ // artifact may be narrower than the artifact's own. Example: 'application/json' for one
947
+ // match object out of a JSON report.
948
+ MediaType string `json:"mediaType"`
949
+ // Where this record sits inside the artifact it came from, as a JSON Pointer (RFC 6901) for
950
+ // JSON sources or an XPath for XML ones. Example: '/matches/3'.
951
+ //
952
+ // Optional, and the link that makes carriage verifiable rather than merely present: with it
953
+ // a consumer can confirm the record really is the subtree of
954
+ // `extensions.rawSourceArtifacts[]` it claims to be. Omit it when the source's shape gives
955
+ // a record no addressable location.
956
+ Pointer *string `json:"pointer,omitempty"`
824
957
  }
825
958
 
826
959
  // The explicit location of a requirement within source code.
827
960
  type SourceLocation struct {
828
- // The line on which this requirement is located.
961
+ // The line on which this requirement is located.
829
962
  Line *float64 `json:"line,omitempty"`
830
- // Path to the file that this requirement originates from.
963
+ // Path to the file that this requirement originates from.
831
964
  Ref *string `json:"ref,omitempty"`
832
965
  }
833
966
 
834
- // An intentional change to a requirement's compliance status and/or impact score. At least one of
835
- // status or impact must be set. Overrides change the effectiveStatus or impact of the requirement.
836
- // All overrides must have an expiration date to enforce periodic review.
967
+ // An intentional change to a requirement's compliance status and/or impact score, as it sits on the
968
+ // requirement once applied. The same type-conditional rule as Standalone_Override: when type is
969
+ // 'operationalRequirement', neither status nor impact may be set, because the override records an
970
+ // accepted deviation without adjudicating the finding; it still governs disposition, and
971
+ // effectiveStatus stays what the results decided. When type is 'riskAdjustment', status may not be
972
+ // set: it re-rates the risk through impact and never changes pass/fail. For every other type, at
973
+ // least one of status or impact must be set. All overrides must have an expiration date to enforce
974
+ // periodic review.
837
975
  type StatusOverride struct {
838
- // Timestamp when this override was applied. ISO 8601 format.
976
+ // Timestamp when this override was applied. ISO 8601 format.
839
977
  AppliedAt time.Time `json:"appliedAt"`
840
- // Identity of who applied this override. For simple cases, use type 'simple' with just an
841
- // identifier.
978
+ // Identity of who applied this override. For simple cases, use type 'simple' with just an
979
+ // identifier.
842
980
  AppliedBy Identity `json:"appliedBy"`
843
- // Structured CVSS scoring data backing this override. Captures the rubric (which
844
- // Environmental/Threat metrics the consumer modified, the recomputed score) used to justify
845
- // a riskAdjustment. For other override types this is optional context.
981
+ // Structured CVSS scoring data backing this override. Captures the rubric (which
982
+ // Environmental/Threat metrics the consumer modified, the recomputed score) used to justify
983
+ // a riskAdjustment. For other override types this is optional context.
846
984
  Cvss *Cvss `json:"cvss,omitempty"`
847
- // Supporting evidence for this override, such as screenshots demonstrating manual
848
- // verification for attestations.
985
+ // Supporting evidence for this override, such as screenshots demonstrating manual
986
+ // verification for attestations.
849
987
  Evidence []Evidence `json:"evidence,omitempty"`
850
- // Timestamp when this override expires and must be reviewed/renewed. REQUIRED - no
851
- // permanent overrides allowed. ISO 8601 format.
988
+ // Timestamp when this override expires and must be reviewed/renewed. REQUIRED - no
989
+ // permanent overrides allowed. ISO 8601 format.
852
990
  ExpiresAt time.Time `json:"expiresAt"`
853
- // Optional references to the external artifacts behind this override (e.g. the STIX
854
- // bundle/object or CTI feed motivating an E:A riskAdjustment). Inert context distinct from
855
- // `evidence`; see External_Reference. Symmetric with Standalone_Override.externalReferences
856
- // for the inline (results-embedded) override carrier.
991
+ // Optional references to the external artifacts behind this override (e.g. the STIX
992
+ // bundle/object or CTI feed motivating an E:A riskAdjustment). Inert context distinct from
993
+ // `evidence`; see External_Reference. Symmetric with Standalone_Override.externalReferences
994
+ // for the inline (results-embedded) override carrier.
857
995
  ExternalReferences []ExternalReference `json:"externalReferences,omitempty"`
858
- // Override to the requirement's impact score. At least one of status or impact must be set.
996
+ // Override to the requirement's impact score. For every type except operationalRequirement,
997
+ // at least one of status or impact must be set; an operationalRequirement carries neither.
859
998
  Impact *ImpactOverride `json:"impact,omitempty"`
860
- // Structured controlled-vocabulary classification for why this override applies.
861
- // Complements (does not replace) the free-text 'reason' field. Most useful on falsePositive
862
- // and attestation overrides where the structured category enables filtering and lossless
863
- // round-trip with VEX / OSCAL / FedRAMP DR. See the Justification primitive for the
864
- // precedent vocabulary and rationale.
999
+ // Structured controlled-vocabulary classification for why this override applies.
1000
+ // Complements (does not replace) the free-text 'reason' field. Most useful on falsePositive
1001
+ // and attestation overrides where the structured category enables filtering and lossless
1002
+ // round-trip with VEX / OSCAL / FedRAMP DR. See the Justification primitive for the
1003
+ // precedent vocabulary and rationale.
865
1004
  Justification *Justification `json:"justification,omitempty"`
866
- // SHA-256 checksum of the previous amendment in chronological order. Each amendment's
867
- // checksum is recorded by the NEXT one, so editing an amendment in place is detectable —
868
- // provided a later amendment is chained to it. It is NOT tamper-proof: the final amendment,
869
- // the document envelope, deleted trailing amendments, and a chain that has been stripped or
870
- // recomputed wholesale are all outside what it can detect. Use signature for
871
- // non-repudiation. Omitted on the first amendment on a requirement.
1005
+ // SHA-256 checksum of the previous amendment in chronological order. Each amendment's
1006
+ // checksum is recorded by the NEXT one, so editing an amendment in place is detectable —
1007
+ // provided a later amendment is chained to it. It is NOT tamper-proof: the final amendment,
1008
+ // the document envelope, deleted trailing amendments, and a chain that has been stripped or
1009
+ // recomputed wholesale are all outside what it can detect. Use signature for
1010
+ // non-repudiation. Omitted on the first amendment on a requirement.
872
1011
  PreviousChecksum *Checksum `json:"previousChecksum,omitempty"`
873
- // Explanation for why this override was applied.
1012
+ // Explanation for why this override was applied.
874
1013
  Reason string `json:"reason"`
875
- // Optional digital signature for enhanced trust and non-repudiation. Supports hardware
876
- // security tokens (PKCS#11/PKCS#12), Yubikeys, GPG keys, passkeys, and other signing
877
- // methods.
1014
+ // Optional digital signature for enhanced trust and non-repudiation. Supports hardware
1015
+ // security tokens (PKCS#11/PKCS#12), Yubikeys, GPG keys, passkeys, and other signing
1016
+ // methods.
878
1017
  Signature *Signature `json:"signature,omitempty"`
879
- // The new status this override sets for the requirement. Optional when only impact is being
880
- // overridden.
1018
+ // The new status this override sets for the requirement. Optional when only impact is being
1019
+ // overridden; forbidden on an operationalRequirement, which adjudicates nothing, and on a
1020
+ // riskAdjustment, which re-rates impact only.
881
1021
  Status *ResultStatus `json:"status,omitempty"`
882
- // The type of override applied to this requirement.
1022
+ // The type of override applied to this requirement.
883
1023
  Type OverrideType `json:"type"`
884
1024
  }
885
1025
 
886
1026
  // An override to the requirement's impact score. The prior impact is the original result value or
887
1027
  // the preceding override in the chain.
888
1028
  type ImpactOverride struct {
889
- // The overridden impact score (0.0–1.0).
1029
+ // The overridden impact score (0.0–1.0).
890
1030
  Value float64 `json:"value"`
891
1031
  }
892
1032
 
893
1033
  // A supported platform target. Example: the platform name being 'ubuntu'.
894
1034
  type SupportedPlatform struct {
895
- // The location of the platform. Can be: 'os', 'aws', 'azure', or 'gcp'.
1035
+ // The location of the platform. Can be: 'os', 'aws', 'azure', or 'gcp'.
896
1036
  Platform *string `json:"platform,omitempty"`
897
- // The platform family. Example: 'redhat'.
1037
+ // The platform family. Example: 'redhat'.
898
1038
  PlatformFamily *string `json:"platformFamily,omitempty"`
899
- // The platform name - can include wildcards. Example: 'debian'.
1039
+ // The platform name - can include wildcards. Example: 'debian'.
900
1040
  PlatformName *string `json:"platformName,omitempty"`
901
- // The release of the platform. Example: '20.04' for 'ubuntu'.
1041
+ // The release of the platform. Example: '20.04' for 'ubuntu'.
902
1042
  Release *string `json:"release,omitempty"`
903
1043
  }
904
1044
 
905
1045
  // A system component. Uses discriminated union pattern with 'type' field as discriminator. Superset
906
1046
  // of Target with identity, external IDs, and SBOM support.
907
1047
  type Component struct {
908
- // Names of baselines that apply to this component.
1048
+ // Names of baselines that apply to this component.
909
1049
  BaselineRefs []string `json:"baselineRefs,omitempty"`
910
- // Component-scoped Bills of Materials (SBOM, ai-model, dataset, or any reserved bomType),
911
- // each carried by passthrough (ref/document) or normalized. Replaces the former
912
- // sbom/sbomRef/sbomFormat trio; a component may carry several BOMs (e.g. an SBOM plus an
913
- // ai-model BOM). See primitives/bom.schema.json.
1050
+ // Component-scoped Bills of Materials (SBOM, ai-model, dataset, or any reserved bomType),
1051
+ // each carried by passthrough (ref/document) or normalized. Replaces the former
1052
+ // sbom/sbomRef/sbomFormat trio; a component may carry several BOMs (e.g. an SBOM plus an
1053
+ // ai-model BOM). See primitives/bom.schema.json.
914
1054
  Boms []BillOfMaterials `json:"boms,omitempty"`
915
- // Stable UUID (RFC 4122) for this component. Required in hdf-system documents, optional in
916
- // hdf-results. Enables cross-document correlation, diffing, and data flow references.
1055
+ // Stable UUID (RFC 4122) for this component. Required in hdf-system documents, optional in
1056
+ // hdf-results. Enables cross-document correlation, diffing, and data flow references.
917
1057
  ComponentID *string `json:"componentId,omitempty"`
918
- // Description of this component's role or purpose.
1058
+ // Description of this component's role or purpose.
919
1059
  Description *string `json:"description,omitempty"`
920
- // Map of external identifier scheme to value. Well-known schemes: aws (instance ID), azure
921
- // (resource ID), cmdb (asset ID), emass (system ID), cve (CVE ID). Custom schemes are
922
- // allowed.
1060
+ // Map of external identifier scheme to value. Well-known schemes: aws (instance ID), azure
1061
+ // (resource ID), cmdb (asset ID), emass (system ID), cve (CVE ID). Custom schemes are
1062
+ // allowed.
923
1063
  ExternalIDS map[string]string `json:"externalIds,omitempty"`
924
- // System-specific overrides for baseline input values.
1064
+ // System-specific overrides for baseline input values.
925
1065
  InputOverrides []InputOverride `json:"inputOverrides,omitempty"`
926
- // Cryptographic integrity of this component's underlying artifact — model weights or
927
- // shards, dataset archive, container image, or package bytes.
928
- //
929
- // An array supports multi-file/sharded artifacts.
930
- //
931
- // This is the single, generic home for artifact/subject integrity across all component
932
- // types (it replaced the former per-type Container_Image digest and Artifact checksum
933
- // fields).
934
- //
935
- // Distinct from BOM-document integrity (Bom.hashes[]) and from the document tamper-evidence
936
- // Integrity type.
1066
+ // Cryptographic integrity of this component's underlying artifact — model weights or
1067
+ // shards, dataset archive, container image, or package bytes.
1068
+ //
1069
+ // An array supports multi-file/sharded artifacts.
1070
+ //
1071
+ // This is the single, generic home for artifact/subject integrity across all component
1072
+ // types (it replaced the former per-type Container_Image digest and Artifact checksum
1073
+ // fields).
1074
+ //
1075
+ // Distinct from BOM-document integrity (Bom.hashes[]) and from the document tamper-evidence
1076
+ // Integrity type.
937
1077
  Integrity []Checksum `json:"integrity,omitempty"`
938
- // Optional key-value labels for flexible grouping. Well-known keys: system, component,
939
- // environment, region, team. Values must be strings.
1078
+ // Optional key-value labels for flexible grouping. Well-known keys: system, component,
1079
+ // environment, region, team. Values must be strings.
940
1080
  Labels map[string]string `json:"labels,omitempty"`
941
- // Human-readable name for this component.
1081
+ // Human-readable name for this component.
942
1082
  Name string `json:"name"`
943
- // Team or individual responsible for this component. Enables per-component ownership when
944
- // different teams manage different parts of a system.
1083
+ // Team or individual responsible for this component. Enables per-component ownership when
1084
+ // different teams manage different parts of a system.
945
1085
  Owner *Identity `json:"owner,omitempty"`
946
- // Label selector to match targets belonging to this component during migration. Targets
947
- // with matching labels are automatically included.
1086
+ // Label selector to match targets belonging to this component during migration. Targets
1087
+ // with matching labels are automatically included.
948
1088
  TargetSelector map[string]string `json:"targetSelector,omitempty"`
949
- // Component type discriminator. Same values as Target types, plus aiModel and dataset (thin
950
- // AI subject components whose detail lives in an attached ai-model / dataset BOM).
1089
+ // Component type discriminator. Same values as Target types, plus aiModel and dataset (thin
1090
+ // AI subject components whose detail lives in an attached ai-model / dataset BOM).
951
1091
  Type TargetType `json:"type"`
952
- // Directory domain the host is a member of — Active Directory / NetBIOS / LDAP domain (ECS
953
- // host.domain semantics), NOT necessarily the DNS suffix of the FQDN. A standalone or
954
- // workgroup host has a hostname but no domain. Not derivable from the FQDN; populate only
955
- // from a source that carries directory membership.
1092
+ // Directory domain the host is a member of — Active Directory / NetBIOS / LDAP domain (ECS
1093
+ // host.domain semantics), NOT necessarily the DNS suffix of the FQDN. A standalone or
1094
+ // workgroup host has a hostname but no domain. Not derivable from the FQDN; populate only
1095
+ // from a source that carries directory membership.
956
1096
  Domain *string `json:"domain,omitempty"`
957
- // Fully qualified domain name (e.g. 'web01.prod.example.com'). Distinct from 'hostname'
958
- // (short) and 'domain' (directory domain). ECS recommends storing this lowercase; the
959
- // schema does not enforce case so source fidelity is preserved on round-trip.
1097
+ // Fully qualified domain name (e.g. 'web01.prod.example.com'). Distinct from 'hostname'
1098
+ // (short) and 'domain' (directory domain). ECS recommends storing this lowercase; the
1099
+ // schema does not enforce case so source fidelity is preserved on round-trip.
960
1100
  FQDN *string `json:"fqdn,omitempty"`
961
- // Short, OS-reported host name (the unqualified machine name, e.g. 'web01'). Kept distinct
962
- // from 'fqdn' because an FQDN is not reliably decomposable into hostname + domain
963
- // (standalone/workgroup hosts have no domain; a directory domain is not the FQDN's DNS
964
- // suffix). Aligns with ECS host.hostname and DISA STIG CKL HOST_NAME. Store the short name
965
- // the source reports; do not derive it from the FQDN.
1101
+ // Short, OS-reported host name (the unqualified machine name, e.g. 'web01'). Kept distinct
1102
+ // from 'fqdn' because an FQDN is not reliably decomposable into hostname + domain
1103
+ // (standalone/workgroup hosts have no domain; a directory domain is not the FQDN's DNS
1104
+ // suffix). Aligns with ECS host.hostname and DISA STIG CKL HOST_NAME. Store the short name
1105
+ // the source reports; do not derive it from the FQDN.
966
1106
  Hostname *string `json:"hostname,omitempty"`
967
- // IP address of the host.
1107
+ // IP address of the host.
968
1108
  IPAddress *string `json:"ipAddress,omitempty"`
969
- // MAC address in colon-separated hexadecimal format.
1109
+ // MAC address in colon-separated hexadecimal format.
970
1110
  MACAddress *string `json:"macAddress,omitempty"`
971
- // Operating system name.
1111
+ // Operating system name.
972
1112
  OSName *string `json:"osName,omitempty"`
973
- // Operating system version.
1113
+ // Operating system version.
974
1114
  OSVersion *string `json:"osVersion,omitempty"`
975
- // Container image ID.
1115
+ // Container image ID.
976
1116
  ImageID *string `json:"imageId,omitempty"`
977
- // Container registry. Example: 'docker.io'.
1117
+ // Container registry. Example: 'docker.io'.
978
1118
  Registry *string `json:"registry,omitempty"`
979
- // Repository name. Example: 'library/nginx'.
1119
+ // Repository name. Example: 'library/nginx'.
980
1120
  Repository *string `json:"repository,omitempty"`
981
- // Image tag. Example: '1.25'.
1121
+ // Image tag. Example: '1.25'.
982
1122
  Tag *string `json:"tag,omitempty"`
983
- // Running container ID.
1123
+ // Running container ID.
984
1124
  ContainerID *string `json:"containerId,omitempty"`
985
- // Image the container was started from.
1125
+ // Image the container was started from.
986
1126
  Image *string `json:"image,omitempty"`
987
- // Container runtime. Example: 'docker', 'containerd', 'cri-o'.
1127
+ // Container runtime. Example: 'docker', 'containerd', 'cri-o'.
988
1128
  Runtime *string `json:"runtime,omitempty"`
989
- // Cluster name.
1129
+ // Cluster name.
990
1130
  ClusterName *string `json:"clusterName,omitempty"`
991
- // Namespace within the cluster, if applicable.
1131
+ // Namespace within the cluster, if applicable.
992
1132
  Namespace *string `json:"namespace,omitempty"`
993
- // Platform type. Example: 'kubernetes', 'openshift', 'ecs', 'docker-swarm'.
1133
+ // Platform type. Example: 'kubernetes', 'openshift', 'ecs', 'docker-swarm'.
994
1134
  PlatformType *string `json:"platformType,omitempty"`
995
- // Platform version.
996
- //
997
- // Application version.
998
- //
999
- // Package version.
1000
- //
1001
- // Database version.
1002
- //
1003
- // Model version, revision, or checkpoint tag.
1004
- //
1005
- // Dataset version, release identifier, or — for highly dynamic datasets — a timestamped
1006
- // release marker.
1135
+ // Platform version.
1136
+ //
1137
+ // Application version.
1138
+ //
1139
+ // Package version.
1140
+ //
1141
+ // Database version.
1142
+ //
1143
+ // Model version, revision, or checkpoint tag.
1144
+ //
1145
+ // Dataset version, release identifier, or — for highly dynamic datasets — a timestamped
1146
+ // release marker.
1007
1147
  Version *string `json:"version,omitempty"`
1008
- // Cloud account identifier.
1148
+ // Cloud account identifier.
1009
1149
  AccountID *string `json:"accountId,omitempty"`
1010
- // Cloud provider.
1150
+ // Cloud provider.
1011
1151
  Provider *CloudProvider `json:"provider,omitempty"`
1012
- // Cloud region, if applicable.
1013
- //
1014
- // Cloud region where the resource resides.
1152
+ // Cloud region, if applicable.
1153
+ //
1154
+ // Cloud region where the resource resides.
1015
1155
  Region *string `json:"region,omitempty"`
1016
- // Amazon Resource Name (AWS only).
1156
+ // Amazon Resource Name (AWS only).
1017
1157
  Arn *string `json:"arn,omitempty"`
1018
- // Provider-specific resource identifier.
1158
+ // Provider-specific resource identifier.
1019
1159
  ResourceID *string `json:"resourceId,omitempty"`
1020
- // Type of cloud resource. Example: 'ec2:instance', 's3:bucket'.
1160
+ // Type of cloud resource. Example: 'ec2:instance', 's3:bucket'.
1021
1161
  ResourceType *string `json:"resourceType,omitempty"`
1022
- // Branch that was scanned.
1162
+ // Branch that was scanned.
1023
1163
  Branch *string `json:"branch,omitempty"`
1024
- // Commit SHA that was scanned.
1164
+ // Commit SHA that was scanned.
1025
1165
  Commit *string `json:"commit,omitempty"`
1026
- // Repository URL.
1027
- //
1028
- // Application URL (for DAST tools).
1166
+ // Repository URL.
1167
+ //
1168
+ // Application URL (for DAST tools).
1029
1169
  URL *string `json:"url,omitempty"`
1030
- // Environment. Example: 'production', 'staging', 'development'.
1170
+ // Environment. Example: 'production', 'staging', 'development'.
1031
1171
  Environment *string `json:"environment,omitempty"`
1032
- // Package manager. Example: 'npm', 'maven', 'pip', 'nuget'.
1172
+ // Package manager. Example: 'npm', 'maven', 'pip', 'nuget'.
1033
1173
  PackageManager *string `json:"packageManager,omitempty"`
1034
- // Package name.
1174
+ // Package name.
1035
1175
  PackageName *string `json:"packageName,omitempty"`
1036
- // Network CIDR block.
1176
+ // Network CIDR block.
1037
1177
  CIDR *string `json:"cidr,omitempty"`
1038
- // Network gateway address.
1178
+ // Network gateway address.
1039
1179
  Gateway *string `json:"gateway,omitempty"`
1040
- // Database engine. Example: 'postgresql', 'mysql', 'oracle', 'mssql'.
1180
+ // Database engine. Example: 'postgresql', 'mysql', 'oracle', 'mssql'.
1041
1181
  Engine *string `json:"engine,omitempty"`
1042
- // Database host.
1182
+ // Database host.
1043
1183
  Host *string `json:"host,omitempty"`
1044
- // Database port.
1184
+ // Database port.
1045
1185
  Port *int64 `json:"port,omitempty"`
1046
- // Provider/registry identifier for the model. Examples: a Hugging Face repo id
1047
- // ('meta-llama/Llama-2-7b-hf') or a model purl. Correlates the component to its ai-model
1048
- // BOM(s) and to lineage references from other models.
1186
+ // Provider/registry identifier for the model. Examples: a Hugging Face repo id
1187
+ // ('meta-llama/Llama-2-7b-hf') or a model purl. Correlates the component to its ai-model
1188
+ // BOM(s) and to lineage references from other models.
1049
1189
  ModelID *string `json:"modelId,omitempty"`
1050
- // Provider/registry identifier for the dataset. Examples: a Hugging Face dataset repo id
1051
- // ('HuggingFaceH4/ultrachat_200k'), a DOI, or a dataset purl. Correlates the component to
1052
- // its dataset BOM(s) and to datasetRefs from ai-model components.
1190
+ // Provider/registry identifier for the dataset. Examples: a Hugging Face dataset repo id
1191
+ // ('HuggingFaceH4/ultrachat_200k'), a DOI, or a dataset purl. Correlates the component to
1192
+ // its dataset BOM(s) and to datasetRefs from ai-model components.
1053
1193
  DatasetID *string `json:"datasetId,omitempty"`
1054
1194
  }
1055
1195
 
1056
1196
  type BillOfMaterials struct {
1057
- // The manifest kind. Determines which normalized type-extension (model/dataset/packages)
1058
- // may appear.
1197
+ // The manifest kind. Determines which normalized type-extension (model/dataset/packages)
1198
+ // may appear.
1059
1199
  BOMType string `json:"bomType"`
1060
- // Normalized dataset extension. Permitted only when bomType is dataset.
1200
+ // Normalized dataset extension. Permitted only when bomType is dataset.
1061
1201
  Dataset *DatasetBOMExtension `json:"dataset,omitempty"`
1062
- // Passthrough by embedding: the native manifest carried opaquely (e.g. a raw CycloneDX or
1063
- // SPDX object). HDF does not constrain its internal shape — full manifest validation is a
1064
- // tool-level concern.
1202
+ // Passthrough by embedding: the native manifest carried opaquely (e.g. a raw CycloneDX or
1203
+ // SPDX object). HDF does not constrain its internal shape — full manifest validation is a
1204
+ // tool-level concern.
1065
1205
  Document map[string]interface{} `json:"document,omitempty"`
1066
- // Source manifest format the BOM was produced from or references. Examples: cyclonedx,
1067
- // cyclonedx-ml, spdx, spdx-ai, huggingface, croissant. Free-form so new formats need no
1068
- // schema change; the converter that emits the BOM owns the value.
1206
+ // Source manifest format the BOM was produced from or references. Examples: cyclonedx,
1207
+ // cyclonedx-ml, spdx, spdx-ai, huggingface, croissant. Free-form so new formats need no
1208
+ // schema change; the converter that emits the BOM owns the value.
1069
1209
  Format string `json:"format"`
1070
- // Integrity of the carried BOM *document* itself (the referenced/embedded manifest file),
1071
- // NOT the integrity of the BOM's subject artifact. Subject/artifact integrity (model
1072
- // weights, dataset archive) is a component-level concern, not carried here. Subject
1073
- // identity is inherited from the host component/system; per-node identity lives in the
1074
- // type-extension.
1210
+ // Integrity of the carried BOM *document* itself (the referenced/embedded manifest file),
1211
+ // NOT the integrity of the BOM's subject artifact. Subject/artifact integrity (model
1212
+ // weights, dataset archive) is a component-level concern, not carried here. Subject
1213
+ // identity is inherited from the host component/system; per-node identity lives in the
1214
+ // type-extension.
1075
1215
  Hashes []Checksum `json:"hashes,omitempty"`
1076
- // Optional license of the BOM document as a whole (SPDX license expression). Nullable and
1077
- // often meaningless (CBOM algorithms, many HBOM parts have no license); per-node licenses
1078
- // live in the type-extension, not here.
1216
+ // Optional license of the BOM document as a whole (SPDX license expression). Nullable and
1217
+ // often meaningless (CBOM algorithms, many HBOM parts have no license); per-node licenses
1218
+ // live in the type-extension, not here.
1079
1219
  License *string `json:"license,omitempty"`
1080
- // Normalized ai-model extension. Permitted only when bomType is ai-model.
1220
+ // Normalized ai-model extension. Permitted only when bomType is ai-model.
1081
1221
  Model *AIModelBOMExtension `json:"model,omitempty"`
1082
- // Normalized sbom extension: the flattened software package inventory. Permitted only when
1083
- // bomType is sbom.
1222
+ // Normalized sbom extension: the flattened software package inventory. Permitted only when
1223
+ // bomType is sbom.
1084
1224
  Packages []SBOMPackage `json:"packages,omitempty"`
1085
- // Passthrough by reference: URI (relative path, absolute URI, or fragment) to the native
1086
- // manifest document. Present for externally-hosted BOMs.
1225
+ // Passthrough by reference: URI (relative path, absolute URI, or fragment) to the native
1226
+ // manifest document. Present for externally-hosted BOMs.
1087
1227
  Ref *string `json:"ref,omitempty"`
1088
- // Optional stable identifier for this BOM document (e.g. CycloneDX serialNumber, SPDX
1089
- // documentNamespace). Correlates the same BOM across evidence packages.
1228
+ // Optional stable identifier for this BOM document (e.g. CycloneDX serialNumber, SPDX
1229
+ // documentNamespace). Correlates the same BOM across evidence packages.
1090
1230
  UniqueID *string `json:"uniqueId,omitempty"`
1091
1231
  }
1092
1232
 
@@ -1095,35 +1235,35 @@ type BillOfMaterials struct {
1095
1235
  // AI_Model_Extension: carries the dataset's own lineage (baseDatasetRefs/derivation) just as the
1096
1236
  // model extension carries baseModelRef/adaptationType.
1097
1237
  type DatasetBOMExtension struct {
1098
- // References to the source dataset(s) this one was derived from — a dataset componentId, or
1099
- // a dataset BOM uniqueId/URI when no component exists. The lineage edge parallel to
1100
- // ai-model's baseModelRef; the base dataset may carry its own dataset BOM.
1238
+ // References to the source dataset(s) this one was derived from — a dataset componentId, or
1239
+ // a dataset BOM uniqueId/URI when no component exists. The lineage edge parallel to
1240
+ // ai-model's baseModelRef; the base dataset may carry its own dataset BOM.
1101
1241
  BaseDatasetRefs []string `json:"baseDatasetRefs,omitempty"`
1102
- // Sensitivity/classification of the data. Examples: public, internal, confidential, pii,
1103
- // phi.
1242
+ // Sensitivity/classification of the data. Examples: public, internal, confidential, pii,
1243
+ // phi.
1104
1244
  DataClassification *string `json:"dataClassification,omitempty"`
1105
- // Physical format of the dataset. Examples: parquet, csv, jsonl, tfrecord, webdataset.
1245
+ // Physical format of the dataset. Examples: parquet, csv, jsonl, tfrecord, webdataset.
1106
1246
  DatasetFormat *string `json:"datasetFormat,omitempty"`
1107
- // Relationship of this dataset to baseDatasetRefs, parallel to the model extension's
1108
- // adaptationType. Minimal + extensible: filtered (subset by rule), augmented
1109
- // (added/synthesized records), merged (union of sources), sampled (statistical draw).
1247
+ // Relationship of this dataset to baseDatasetRefs, parallel to the model extension's
1248
+ // adaptationType. Minimal + extensible: filtered (subset by rule), augmented
1249
+ // (added/synthesized records), merged (union of sources), sampled (statistical draw).
1110
1250
  Derivation *DatasetDerivationType `json:"derivation,omitempty"`
1111
- // Free-text statement of the dataset's intended use (CISA/G7 minimum element).
1251
+ // Free-text statement of the dataset's intended use (CISA/G7 minimum element).
1112
1252
  IntendedUse *string `json:"intendedUse,omitempty"`
1113
- // Content modality/kind of the data (CISA/G7 'Dataset content: modality'). Examples: text,
1114
- // image, tabular, timeseries, audio. DISTINCT from datasetFormat, which is the physical
1115
- // encoding (parquet/csv). Resolves SPDX 3.0 dataset_datasetType, which is content-kind, not
1116
- // physical format. String or array of strings.
1253
+ // Content modality/kind of the data (CISA/G7 'Dataset content: modality'). Examples: text,
1254
+ // image, tabular, timeseries, audio. DISTINCT from datasetFormat, which is the physical
1255
+ // encoding (parquet/csv). Resolves SPDX 3.0 dataset_datasetType, which is content-kind, not
1256
+ // physical format. String or array of strings.
1117
1257
  Modality *Modality `json:"modality,omitempty"`
1118
- // Free-text description of the dataset's origin and collection process (CISA/G7 'Dataset
1119
- // provenance'; SPDX 3.0 dataset_dataCollectionProcess).
1258
+ // Free-text description of the dataset's origin and collection process (CISA/G7 'Dataset
1259
+ // provenance'; SPDX 3.0 dataset_dataCollectionProcess).
1120
1260
  Provenance *string `json:"provenance,omitempty"`
1121
- // Number of records/examples in the dataset.
1261
+ // Number of records/examples in the dataset.
1122
1262
  RecordCount *int64 `json:"recordCount,omitempty"`
1123
- // Free-text summary of the dataset's statistical properties (CISA/G7 minimum element;
1124
- // open-ended by design). Intentionally free-text and will remain so permanently:
1125
- // recordCount is the one structured statistic, and restructuring this into an object later
1126
- // would break existing consumers, so it stays a string (additive-only).
1263
+ // Free-text summary of the dataset's statistical properties (CISA/G7 minimum element;
1264
+ // open-ended by design). Intentionally free-text and will remain so permanently:
1265
+ // recordCount is the one structured statistic, and restructuring this into an object later
1266
+ // would break existing consumers, so it stays a string (additive-only).
1127
1267
  StatisticalProperties *string `json:"statisticalProperties,omitempty"`
1128
1268
  }
1129
1269
 
@@ -1133,59 +1273,59 @@ type DatasetBOMExtension struct {
1133
1273
  // (partial-fidelity pattern). Subject name/version are inherited from the host aiModel component,
1134
1274
  // not repeated here.
1135
1275
  type AIModelBOMExtension struct {
1136
- // Lineage relationship to baseModelRef, adopting Hugging Face's base_model_relation
1137
- // vocabulary (the only typed lineage enum in the ecosystem).
1276
+ // Lineage relationship to baseModelRef, adopting Hugging Face's base_model_relation
1277
+ // vocabulary (the only typed lineage enum in the ecosystem).
1138
1278
  AdaptationType *ModelAdaptationType `json:"adaptationType,omitempty"`
1139
- // Reference to the base model this one was adapted from (e.g. a Hugging Face repo id or
1140
- // purl). Correlates the lineage edge; the base model itself may carry its own ai-model BOM.
1279
+ // Reference to the base model this one was adapted from (e.g. a Hugging Face repo id or
1280
+ // purl). Correlates the lineage edge; the base model itself may carry its own ai-model BOM.
1141
1281
  BaseModelRef *string `json:"baseModelRef,omitempty"`
1142
- // References to the training/evaluation datasets this model was produced from — preferably
1143
- // a dataset component's componentId (correlating to a first-class dataset subject rather
1144
- // than duplicating dataset detail, per ADR §10), or a dataset BOM uniqueId/URI when no
1145
- // component exists.
1282
+ // References to the training/evaluation datasets this model was produced from — preferably
1283
+ // a dataset component's componentId (correlating to a first-class dataset subject rather
1284
+ // than duplicating dataset detail, per ADR §10), or a dataset BOM uniqueId/URI when no
1285
+ // component exists.
1146
1286
  DatasetRefs []string `json:"datasetRefs,omitempty"`
1147
- // Training hyper-parameters as name/value pairs (epochs, learning-rate, batch-size). This
1148
- // is the set of training knobs, NOT the model's trainable parameterCount — the two are
1149
- // routinely conflated. CISA/G7 'Model properties: hyper-parameters'; SPDX 3.0
1150
- // ai_hyperparameter.
1287
+ // Training hyper-parameters as name/value pairs (epochs, learning-rate, batch-size). This
1288
+ // is the set of training knobs, NOT the model's trainable parameterCount — the two are
1289
+ // routinely conflated. CISA/G7 'Model properties: hyper-parameters'; SPDX 3.0
1290
+ // ai_hyperparameter.
1151
1291
  Hyperparameters []Hyperparameter `json:"hyperparameters,omitempty"`
1152
- // Model input/output properties (CISA/G7 minimum element): I/O data types, modality,
1153
- // context/sequence length, and tokenizer. Sourced from CycloneDX
1154
- // modelParameters.inputs[].format / outputs[].format. All sub-fields optional.
1292
+ // Model input/output properties (CISA/G7 minimum element): I/O data types, modality,
1293
+ // context/sequence length, and tokenizer. Sourced from CycloneDX
1294
+ // modelParameters.inputs[].format / outputs[].format. All sub-fields optional.
1155
1295
  InputOutput *InputOutput `json:"inputOutput,omitempty"`
1156
- // Free-text statement of intended use and out-of-scope uses (CISA/G7 minimum element).
1296
+ // Free-text statement of intended use and out-of-scope uses (CISA/G7 minimum element).
1157
1297
  IntendedUse *string `json:"intendedUse,omitempty"`
1158
- // Model's learning/training paradigm. Free-text because the value set varies across
1159
- // standards. Examples: supervised, self-supervised, semi-supervised, reinforcement.
1160
- // Cross-standard intersection: SPDX 3.0 ai_typeOfModel ∩ CycloneDX
1161
- // modelParameters.approach.type ∩ CISA/G7 learning type.
1298
+ // Model's learning/training paradigm. Free-text because the value set varies across
1299
+ // standards. Examples: supervised, self-supervised, semi-supervised, reinforcement.
1300
+ // Cross-standard intersection: SPDX 3.0 ai_typeOfModel ∩ CycloneDX
1301
+ // modelParameters.approach.type ∩ CISA/G7 learning type.
1162
1302
  LearningApproach *string `json:"learningApproach,omitempty"`
1163
- // Model architecture family. Examples: transformer, cnn, diffusion, mixture-of-experts.
1303
+ // Model architecture family. Examples: transformer, cnn, diffusion, mixture-of-experts.
1164
1304
  ModelArchitecture *string `json:"modelArchitecture,omitempty"`
1165
- // Total trainable parameter count. No native CycloneDX/SPDX field exists; first-class here
1166
- // because the EU AI Act keys GPAI obligations off model scale.
1305
+ // Total trainable parameter count. No native CycloneDX/SPDX field exists; first-class here
1306
+ // because the EU AI Act keys GPAI obligations off model scale.
1167
1307
  ParameterCount *int64 `json:"parameterCount,omitempty"`
1168
- // Reported evaluation metrics as name/value pairs. Values are free-text because metrics are
1169
- // heterogeneous (accuracy, f1, BLEU, latency). The item stays open (additionalProperties:
1170
- // true) to carry native CycloneDX slice/confidenceInterval detail opaquely. Cross-standard
1171
- // intersection: SPDX 3.0 ai_metric ∩ CycloneDX quantitativeAnalysis.performanceMetrics ∩
1172
- // CISA/G7 KPI cluster.
1308
+ // Reported evaluation metrics as name/value pairs. Values are free-text because metrics are
1309
+ // heterogeneous (accuracy, f1, BLEU, latency). The item stays open (additionalProperties:
1310
+ // true) to carry native CycloneDX slice/confidenceInterval detail opaquely. Cross-standard
1311
+ // intersection: SPDX 3.0 ai_metric ∩ CycloneDX quantitativeAnalysis.performanceMetrics ∩
1312
+ // CISA/G7 KPI cluster.
1173
1313
  PerformanceMetrics []PerformanceMetric `json:"performanceMetrics,omitempty"`
1174
- // On-disk weight serialization format. Security-critical yet under-modeled by BOM specs:
1175
- // pickle/pytorch permits arbitrary code execution on load; safetensors does not. Examples:
1176
- // safetensors, pytorch, gguf, onnx, tensorflow.
1314
+ // On-disk weight serialization format. Security-critical yet under-modeled by BOM specs:
1315
+ // pickle/pytorch permits arbitrary code execution on load; safetensors does not. Examples:
1316
+ // safetensors, pytorch, gguf, onnx, tensorflow.
1177
1317
  SerializationFormat *string `json:"serializationFormat,omitempty"`
1178
- // The ML task the model performs. Free-text. Examples: text-classification,
1179
- // sentiment-analysis, object-detection, translation. Sourced from CycloneDX
1180
- // modelParameters.task (SPDX 3.0 ai_domain is domain-level/adjacent, not the task); CISA/G7
1181
- // intended-application.
1318
+ // The ML task the model performs. Free-text. Examples: text-classification,
1319
+ // sentiment-analysis, object-detection, translation. Sourced from CycloneDX
1320
+ // modelParameters.task (SPDX 3.0 ai_domain is domain-level/adjacent, not the task); CISA/G7
1321
+ // intended-application.
1182
1322
  Task *string `json:"task,omitempty"`
1183
1323
  }
1184
1324
 
1185
1325
  type Hyperparameter struct {
1186
- // Hyper-parameter name. Examples: epochs, learning-rate, batch-size.
1326
+ // Hyper-parameter name. Examples: epochs, learning-rate, batch-size.
1187
1327
  Name *string `json:"name,omitempty"`
1188
- // Hyper-parameter value (free-text).
1328
+ // Hyper-parameter value (free-text).
1189
1329
  Value *string `json:"value,omitempty"`
1190
1330
  }
1191
1331
 
@@ -1193,51 +1333,51 @@ type Hyperparameter struct {
1193
1333
  // context/sequence length, and tokenizer. Sourced from CycloneDX
1194
1334
  // modelParameters.inputs[].format / outputs[].format. All sub-fields optional.
1195
1335
  type InputOutput struct {
1196
- // Maximum context/sequence length the model accepts, in tokens.
1336
+ // Maximum context/sequence length the model accepts, in tokens.
1197
1337
  ContextLength *int64 `json:"contextLength,omitempty"`
1198
- // Input/output data types. Examples: string, byte[], float32, image.
1338
+ // Input/output data types. Examples: string, byte[], float32, image.
1199
1339
  DataTypes []string `json:"dataTypes,omitempty"`
1200
- // Input/output modalities. String or array of strings. Examples: text, image, audio.
1201
- // Symmetric with Dataset_Extension.modality.
1340
+ // Input/output modalities. String or array of strings. Examples: text, image, audio.
1341
+ // Symmetric with Dataset_Extension.modality.
1202
1342
  Modality *Modality `json:"modality,omitempty"`
1203
- // Tokenizer used for the model's input encoding. Examples: BPE, SentencePiece, tiktoken.
1343
+ // Tokenizer used for the model's input encoding. Examples: BPE, SentencePiece, tiktoken.
1204
1344
  Tokenizer *string `json:"tokenizer,omitempty"`
1205
1345
  }
1206
1346
 
1207
1347
  type PerformanceMetric struct {
1208
- // Metric name. Examples: accuracy, f1, BLEU, latency.
1348
+ // Metric name. Examples: accuracy, f1, BLEU, latency.
1209
1349
  Name *string `json:"name,omitempty"`
1210
- // Reported metric value, free-text because metrics are heterogeneous (percentages, scores,
1211
- // milliseconds).
1350
+ // Reported metric value, free-text because metrics are heterogeneous (percentages, scores,
1351
+ // milliseconds).
1212
1352
  Value *string `json:"value,omitempty"`
1213
1353
  }
1214
1354
 
1215
1355
  // A single normalized software package entry within an sbom BOM. Minimal identity + version for
1216
1356
  // querying/diffing; the full native record remains available via passthrough (document/ref).
1217
1357
  type SBOMPackage struct {
1218
- // SPDX license identifiers/expressions for this package.
1358
+ // SPDX license identifiers/expressions for this package.
1219
1359
  Licenses []string `json:"licenses,omitempty"`
1220
- // Package name.
1360
+ // Package name.
1221
1361
  Name string `json:"name"`
1222
- // Package URL (purl) — the preferred cross-BOM identity key when present.
1362
+ // Package URL (purl) — the preferred cross-BOM identity key when present.
1223
1363
  Purl *string `json:"purl,omitempty"`
1224
- // Package version.
1364
+ // Package version.
1225
1365
  Version *string `json:"version,omitempty"`
1226
1366
  }
1227
1367
 
1228
1368
  // An override of a baseline input value for a specific component. Enables system-specific tailoring
1229
1369
  // of baseline parameters.
1230
1370
  type InputOverride struct {
1231
- // Identity of the person or system that approved this override.
1371
+ // Identity of the person or system that approved this override.
1232
1372
  ApprovedBy *Identity `json:"approvedBy,omitempty"`
1233
- // Name of the baseline this override applies to. If omitted, applies to all baselines that
1234
- // define this input.
1373
+ // Name of the baseline this override applies to. If omitted, applies to all baselines that
1374
+ // define this input.
1235
1375
  BaselineRef *string `json:"baselineRef,omitempty"`
1236
- // Name of the input being overridden. Must match an Input.name in the referenced baseline.
1376
+ // Name of the input being overridden. Must match an Input.name in the referenced baseline.
1237
1377
  InputName string `json:"inputName"`
1238
- // Rationale for why this override is needed.
1378
+ // Rationale for why this override is needed.
1239
1379
  Justification *string `json:"justification,omitempty"`
1240
- // The overridden value. Should match the type of the original input.
1380
+ // The overridden value. Should match the type of the original input.
1241
1381
  Value interface{} `json:"value"`
1242
1382
  }
1243
1383
 
@@ -1247,36 +1387,36 @@ type InputOverride struct {
1247
1387
  // qualified derivation: derived entity, used entity (seed), activity (event application),
1248
1388
  // generation time (asOf).
1249
1389
  type Derivation struct {
1250
- // The posture-as-of time of this reconciled view (RFC 3339, trimmed UTC) — the analog of
1251
- // PROV's generatedAtTime.
1390
+ // The posture-as-of time of this reconciled view (RFC 3339, trimmed UTC) — the analog of
1391
+ // PROV's generatedAtTime.
1252
1392
  AsOf time.Time `json:"asOf"`
1253
- // Number of change events applied to the seed to produce this document.
1393
+ // Number of change events applied to the seed to produce this document.
1254
1394
  EventsApplied int64 `json:"eventsApplied"`
1255
- // The authoritative snapshot this document was reassembled from, pinned by content.
1395
+ // The authoritative snapshot this document was reassembled from, pinned by content.
1256
1396
  Seed Seed `json:"seed"`
1257
- // URI of the event-stream producer context whose events were applied (matches the events'
1258
- // envelope source).
1397
+ // URI of the event-stream producer context whose events were applied (matches the events'
1398
+ // envelope source).
1259
1399
  Source string `json:"source"`
1260
- // The event watermark: the highest per-key sequence number applied. Downstream precedence
1261
- // rule: a full-scan document supersedes the reconciled view as of its scan time; between
1262
- // scans, the reconciled document with the highest throughSequence is the current posture.
1400
+ // The event watermark: the highest per-key sequence number applied. Downstream precedence
1401
+ // rule: a full-scan document supersedes the reconciled view as of its scan time; between
1402
+ // scans, the reconciled document with the highest throughSequence is the current posture.
1263
1403
  ThroughSequence int64 `json:"throughSequence"`
1264
1404
  }
1265
1405
 
1266
1406
  // The authoritative snapshot this document was reassembled from, pinned by content.
1267
1407
  type Seed struct {
1268
- // Checksum of the seed snapshot, REQUIRED: the derivation pins an immutable snapshot by
1269
- // content, not just location.
1408
+ // Checksum of the seed snapshot, REQUIRED: the derivation pins an immutable snapshot by
1409
+ // content, not just location.
1270
1410
  Checksum Checksum `json:"checksum"`
1271
- // URI to the seed snapshot document (relative path or absolute URL).
1411
+ // URI to the seed snapshot document (relative path or absolute URL).
1272
1412
  URI string `json:"uri"`
1273
1413
  }
1274
1414
 
1275
1415
  // Information about the tool that generated this HDF file.
1276
1416
  type Generator struct {
1277
- // The name of the software that produced this HDF file. Example: 'gosec-to-hdf'.
1417
+ // The name of the software that produced this HDF file. Example: 'gosec-to-hdf'.
1278
1418
  Name string `json:"name"`
1279
- // The version of the tool. Example: '5.22.3'.
1419
+ // The version of the tool. Example: '5.22.3'.
1280
1420
  Version string `json:"version"`
1281
1421
  }
1282
1422
 
@@ -1284,593 +1424,612 @@ type Generator struct {
1284
1424
  // external automation content like Ansible playbooks, Terraform scripts, or vendor-provided
1285
1425
  // remediation tools.
1286
1426
  type Remediation struct {
1287
- // Optional cryptographic checksum for verifying the integrity of remediation resources
1288
- // fetched from the URI. Recommended for security when referencing external automation
1289
- // scripts.
1427
+ // Optional cryptographic checksum for verifying the integrity of remediation resources
1428
+ // fetched from the URI. Recommended for security when referencing external automation
1429
+ // scripts.
1290
1430
  Checksum *Checksum `json:"checksum,omitempty"`
1291
- // URI pointing to automated remediation resources (Ansible playbooks, Terraform scripts,
1292
- // etc.). Examples: GitHub repository, DISA STIG Supplemental Automation Content,
1293
- // vendor-provided scripts.
1431
+ // URI pointing to automated remediation resources (Ansible playbooks, Terraform scripts,
1432
+ // etc.). Examples: GitHub repository, DISA STIG Supplemental Automation Content,
1433
+ // vendor-provided scripts.
1294
1434
  URI string `json:"uri"`
1295
1435
  }
1296
1436
 
1297
1437
  // Information about the test execution environment. This is distinct from the target being scanned
1298
1438
  // - the runner is where the security tool executes, while targets are what is being assessed.
1299
1439
  type Runner struct {
1300
- // The CPU architecture of the runner system. Example: 'x86_64', 'arm64', 'aarch64'.
1440
+ // The CPU architecture of the runner system. Example: 'x86_64', 'arm64', 'aarch64'.
1301
1441
  Architecture *string `json:"architecture,omitempty"`
1302
- // The container instance identifier. Example: 'a1b2c3d4e5f6', 'security-scan-job-xyz123'.
1303
- // Can be a Docker container ID, Kubernetes pod name, or other container runtime identifier.
1442
+ // The container instance identifier. Example: 'a1b2c3d4e5f6', 'security-scan-job-xyz123'.
1443
+ // Can be a Docker container ID, Kubernetes pod name, or other container runtime identifier.
1304
1444
  ContainerID *string `json:"containerId,omitempty"`
1305
- // The container image used for the test execution. Example: 'inspec/inspec:latest',
1306
- // 'ghcr.io/my-org/scanner:v2.1.0'. Useful for CI/CD pipelines where tests run in containers.
1445
+ // The container image used for the test execution. Example: 'inspec/inspec:latest',
1446
+ // 'ghcr.io/my-org/scanner:v2.1.0'. Useful for CI/CD pipelines where tests run in containers.
1307
1447
  ContainerImage *string `json:"containerImage,omitempty"`
1308
- // The directory domain the runner system belongs to (Active Directory / NetBIOS / LDAP),
1309
- // NOT the DNS suffix of the FQDN. Example: 'CORP'.
1448
+ // The directory domain the runner system belongs to (Active Directory / NetBIOS / LDAP),
1449
+ // NOT the DNS suffix of the FQDN. Example: 'CORP'.
1310
1450
  Domain *string `json:"domain,omitempty"`
1311
- // The fully qualified domain name of the runner system, when known. Distinct from the short
1312
- // 'hostname'; kept separate for the same reason as on host components (an FQDN is not
1313
- // reliably decomposable). Example: 'ci-runner-01.build.example.com'.
1451
+ // The fully qualified domain name of the runner system, when known. Distinct from the short
1452
+ // 'hostname'; kept separate for the same reason as on host components (an FQDN is not
1453
+ // reliably decomposable). Example: 'ci-runner-01.build.example.com'.
1314
1454
  FQDN *string `json:"fqdn,omitempty"`
1315
- // The short hostname of the runner system. Example: 'ci-runner-01', 'jenkins-agent-03',
1316
- // 'k8s-node-worker-03'.
1455
+ // The short hostname of the runner system. Example: 'ci-runner-01', 'jenkins-agent-03',
1456
+ // 'k8s-node-worker-03'.
1317
1457
  Hostname *string `json:"hostname,omitempty"`
1318
- // The name of the runner environment. Examples: 'ubuntu', 'macos', 'windows', 'docker',
1319
- // 'kubernetes-pod', 'manual'.
1458
+ // The name of the runner environment. Examples: 'ubuntu', 'macos', 'windows', 'docker',
1459
+ // 'kubernetes-pod', 'manual'.
1320
1460
  Name string `json:"name"`
1321
- // The identity of the person or system responsible for executing the test. This could be a
1322
- // human auditor manually completing a checklist, an automated CI/CD system, or a security
1323
- // tool. Optional field to support both automated and manual HDF generation.
1461
+ // The identity of the person or system responsible for executing the test. This could be a
1462
+ // human auditor manually completing a checklist, an automated CI/CD system, or a security
1463
+ // tool. Optional field to support both automated and manual HDF generation.
1324
1464
  Operator *Identity `json:"operator,omitempty"`
1325
- // The version/release of the operating system or runtime. Example: '20.04', '13.2', '11'.
1465
+ // The version/release of the operating system or runtime. Example: '20.04', '13.2', '11'.
1326
1466
  Release *string `json:"release,omitempty"`
1327
1467
  }
1328
1468
 
1329
1469
  // Statistics for the assessment run(s) such as duration and result counts.
1330
1470
  type Statistics struct {
1331
- // How long (in seconds) this assessment run took.
1471
+ // How long (in seconds) this assessment run took.
1332
1472
  Duration *float64 `json:"duration,omitempty"`
1333
- // Breakdowns of requirement statistics by result status.
1473
+ // Breakdowns of requirement statistics by result status.
1334
1474
  Requirements *StatisticHash `json:"requirements,omitempty"`
1335
1475
  }
1336
1476
 
1337
1477
  // Statistics for requirement results, grouped by status.
1338
1478
  type StatisticHash struct {
1339
- // Statistics for requirements that encountered an error during assessment.
1479
+ // Statistics for requirements that encountered an error during assessment.
1340
1480
  Error *StatisticBlock `json:"error,omitempty"`
1341
- // Statistics for requirements that failed.
1481
+ // Statistics for requirements that failed.
1342
1482
  Failed *StatisticBlock `json:"failed,omitempty"`
1343
- // Statistics for requirements that are not applicable to the target.
1483
+ // Statistics for requirements that are not applicable to the target.
1344
1484
  NotApplicable *StatisticBlock `json:"notApplicable,omitempty"`
1345
- // Statistics for requirements that were not reviewed (manual check required).
1485
+ // Statistics for requirements that were not reviewed (manual check required).
1346
1486
  NotReviewed *StatisticBlock `json:"notReviewed,omitempty"`
1347
- // Statistics for requirements that passed.
1487
+ // Statistics for requirements that passed.
1348
1488
  Passed *StatisticBlock `json:"passed,omitempty"`
1349
1489
  }
1350
1490
 
1351
1491
  // Statistics for a given item, such as the total count.
1352
1492
  type StatisticBlock struct {
1353
- // The total count. Example: the total number of requirements in a given category for a run.
1493
+ // The total count. Example: the total number of requirements in a given category for a run.
1354
1494
  Total int64 `json:"total"`
1355
1495
  }
1356
1496
 
1357
1497
  // The security tool that produced the assessment data represented in this HDF file. Aligns with
1358
1498
  // SARIF, OSCAL, and CycloneDX terminology.
1359
1499
  type Tool struct {
1360
- // The named format of the source data, when it follows a recognized format specification
1361
- // with its own identity: an interchange format emitted by many tools ('SARIF', 'XCCDF',
1362
- // 'OSCAL') or one of several named output formats a single tool produces ('FVDL',
1363
- // 'exec-json', 'FPF').
1364
- //
1365
- // Never a serialization structure — 'JSON', 'XML', and 'CSV' are encodings, not formats.
1366
- //
1367
- // Omit for a tool's native output: an absent format means the tool's own shape, and data
1368
- // arriving as a named format is converted by that format's converter, which sets this field
1369
- // alongside the producing tool's name.
1500
+ // The named format of the source data, when it follows a recognized format specification
1501
+ // with its own identity: an interchange format emitted by many tools ('SARIF', 'XCCDF',
1502
+ // 'OSCAL') or one of several named output formats a single tool produces ('FVDL',
1503
+ // 'exec-json', 'FPF').
1504
+ //
1505
+ // Never a serialization structure — 'JSON', 'XML', and 'CSV' are encodings, not formats.
1506
+ //
1507
+ // Omit for a tool's native output: an absent format means the tool's own shape, and data
1508
+ // arriving as a named format is converted by that format's converter, which sets this field
1509
+ // alongside the producing tool's name.
1370
1510
  Format *string `json:"format,omitempty"`
1371
- // The name of the security tool that produced the data. Examples: 'gosec', 'Semgrep',
1372
- // 'OpenSCAP', 'AWS Config', 'Nessus'. Omit if the tool cannot be identified.
1511
+ // The name of the security tool that produced the data. Examples: 'gosec', 'Semgrep',
1512
+ // 'OpenSCAP', 'AWS Config', 'Nessus'. Omit if the tool cannot be identified.
1373
1513
  Name *string `json:"name,omitempty"`
1374
- // Version of the source tool, if available in the tool's output. Example: '5.22.3'.
1514
+ // Version of the source tool, if available in the tool's output. Example: '5.22.3'.
1375
1515
  Version *string `json:"version,omitempty"`
1376
1516
  }
1377
1517
 
1378
1518
  // Information on the set of requirements that can be assessed, including baseline metadata and
1379
1519
  // requirement definitions.
1380
1520
  type HDFBaseline struct {
1381
- // The set of dependencies this baseline depends on.
1521
+ // The set of dependencies this baseline depends on.
1382
1522
  Depends []Dependency `json:"depends,omitempty"`
1383
- // The tool that generated this file.
1523
+ // Producer data outside the HDF model, and the pre-converted source artifact(s) this
1524
+ // baseline was converted from.
1525
+ Extensions *Extensions `json:"extensions,omitempty"`
1526
+ // The tool that generated this file.
1384
1527
  Generator *Generator `json:"generator,omitempty"`
1385
- // A set of descriptions for the requirement groups.
1528
+ // A set of descriptions for the requirement groups.
1386
1529
  Groups []RequirementGroup `json:"groups,omitempty"`
1387
- // The input(s) or attribute(s) to be used in the run.
1530
+ // The input(s) or attribute(s) to be used in the run.
1388
1531
  Inputs []Input `json:"inputs,omitempty"`
1389
- // Cryptographic integrity information for verifying this baseline has not been tampered
1390
- // with.
1532
+ // Cryptographic integrity information for verifying this baseline has not been tampered
1533
+ // with.
1391
1534
  Integrity *Integrity `json:"integrity,omitempty"`
1392
- // Optional reference to automated remediation resources (Ansible playbooks, Terraform
1393
- // scripts, etc.) for implementing the security controls defined in this baseline.
1535
+ // Optional reference to automated remediation resources (Ansible playbooks, Terraform
1536
+ // scripts, etc.) for implementing the security controls defined in this baseline.
1394
1537
  Remediation *Remediation `json:"remediation,omitempty"`
1395
- // The set of requirements - contains no findings as the assessment has not yet occurred.
1538
+ // The set of requirements - contains no findings as the assessment has not yet occurred.
1396
1539
  Requirements []BaselineRequirement `json:"requirements"`
1397
- // The name - must be unique.
1540
+ // The name - must be unique.
1398
1541
  Name string `json:"name"`
1399
- // The copyright holder(s).
1542
+ // The copyright holder(s).
1400
1543
  Copyright *string `json:"copyright,omitempty"`
1401
- // The email address or other contact information of the copyright holder(s).
1544
+ // The email address or other contact information of the copyright holder(s).
1402
1545
  CopyrightEmail *string `json:"copyrightEmail,omitempty"`
1403
- // Optional references to external artifacts relevant to this baseline (CTI/STIX,
1404
- // advisories, source catalogs, or any URI-addressable artifact). Travels with the baseline
1405
- // definition. Inert context; see External_Reference.
1546
+ // Prose description of the baseline, more detailed than summary. Carried verbatim, like
1547
+ // every HDF prose field.
1548
+ Description *string `json:"description,omitempty"`
1549
+ // Optional references to external artifacts relevant to this baseline (CTI/STIX,
1550
+ // advisories, source catalogs, or any URI-addressable artifact). Travels with the baseline
1551
+ // definition. Inert context; see External_Reference.
1406
1552
  ExternalReferences []ExternalReference `json:"externalReferences,omitempty"`
1407
- // Optional key-value labels for flexible grouping. Well-known keys: system, component,
1408
- // environment, region, team. Values must be strings.
1553
+ // Optional key-value labels for flexible grouping. Well-known keys: system, component,
1554
+ // environment, region, team. Values must be strings.
1409
1555
  Labels map[string]string `json:"labels,omitempty"`
1410
- // The copyright license. Example: 'Apache-2.0'.
1556
+ // The copyright license. Example: 'Apache-2.0'.
1411
1557
  License *string `json:"license,omitempty"`
1412
- // The maintainer(s).
1558
+ // The maintainer(s).
1413
1559
  Maintainer *string `json:"maintainer,omitempty"`
1414
- // The status. Example: 'loaded'.
1560
+ // The status. Example: 'loaded'.
1415
1561
  Status *string `json:"status,omitempty"`
1416
- // The summary. Example: the Security Technical Implementation Guide (STIG) header.
1562
+ // The summary. Example: the Security Technical Implementation Guide (STIG) header.
1417
1563
  Summary *string `json:"summary,omitempty"`
1418
- // The set of supported platform targets.
1564
+ // The set of supported platform targets.
1419
1565
  Supports []SupportedPlatform `json:"supports,omitempty"`
1420
- // The title - should be human readable.
1566
+ // The title - should be human readable.
1421
1567
  Title *string `json:"title,omitempty"`
1422
- // The version of the baseline.
1568
+ // The version of the baseline.
1423
1569
  Version *string `json:"version,omitempty"`
1424
1570
  }
1425
1571
 
1426
1572
  // A requirement definition without assessment results.
1427
1573
  type BaselineRequirement struct {
1428
- // Array of labeled descriptions. At least one description with label 'default' must be
1429
- // present. Convention: place default description first. Common labels: 'default', 'check',
1430
- // 'fix', 'rationale'.
1574
+ // Array of labeled descriptions. At least one description with label 'default' must be
1575
+ // present. Convention: place default description first. Common labels: 'default', 'check',
1576
+ // 'fix', 'rationale'.
1431
1577
  Descriptions []Description `json:"descriptions"`
1432
- // Explicit severity rating. Typically derived from impact score but provided explicitly for
1433
- // clarity.
1578
+ // Explicit severity rating. Typically derived from impact score but provided explicitly for
1579
+ // clarity.
1434
1580
  Severity *Severity `json:"severity,omitempty"`
1435
- // The requirement identifier. Example: 'SV-238196'.
1581
+ // The requirement identifier, naming the requirement itself rather than one finding of it.
1582
+ // Example: 'SV-238196'. Several entries in one baseline may legitimately carry the same id
1583
+ // (one scanner reporting one CVE against several packages, or an overlay restating what it
1584
+ // inherits), so an id is not an instance key: index requirements as id to list, never id to
1585
+ // one, and an amendment addressing an id applies to every entry carrying it.
1436
1586
  ID string `json:"id"`
1437
- // The impactfulness or severity (0.0 to 1.0).
1587
+ // The impactfulness or severity (0.0 to 1.0).
1438
1588
  Impact float64 `json:"impact"`
1439
- // A set of tags - usually metadata like CCI, STIG ID, severity.
1589
+ // A set of tags - usually metadata like CCI, STIG ID, severity.
1440
1590
  Tags map[string]interface{} `json:"tags"`
1441
- // Whether the requirement is mandatory within its baseline.
1442
- //
1443
- // Distinct from severity (risk weight) and status (lifecycle state).
1444
- //
1445
- // Maps cleanly onto: FedRAMP rev5 OSCAL 'CORE' prop, FedRAMP 20x inline 'Optional:'
1446
- // markers, CMMC sublevel rows, and CIS Implementation Group memberships (IG1/IG2/IG3 may
1447
- // carry richer semantics; layer those onto props[]/tags{}).
1448
- //
1449
- // Optional: when omitted, consumers should treat the requirement as 'required' by
1450
- // convention.
1591
+ // Whether the requirement is mandatory within its baseline.
1592
+ //
1593
+ // Distinct from severity (risk weight) and status (lifecycle state).
1594
+ //
1595
+ // Maps cleanly onto: FedRAMP rev5 OSCAL 'CORE' prop, FedRAMP 20x inline 'Optional:'
1596
+ // markers, CMMC sublevel rows, and CIS Implementation Group memberships (IG1/IG2/IG3 may
1597
+ // carry richer semantics; layer those onto props[]/tags{}).
1598
+ //
1599
+ // Optional: when omitted, consumers should treat the requirement as 'required' by
1600
+ // convention.
1451
1601
  Applicability *Applicability `json:"applicability,omitempty"`
1452
- // The raw source code of the requirement. Set to null for manual-only requirements or
1453
- // requirements not yet implemented; use verificationMethod to disambiguate manual-by-design
1454
- // from manual-pending-automation. Note that if this is an overlay, it does not include the
1455
- // underlying source code.
1602
+ // The raw source code of the requirement. Set to null for manual-only requirements or
1603
+ // requirements not yet implemented; use verificationMethod to disambiguate manual-by-design
1604
+ // from manual-pending-automation. Note that if this is an overlay, it does not include the
1605
+ // underlying source code.
1456
1606
  Code *string `json:"code,omitempty"`
1457
- // Classification of the control's nature, aligning with NIST SP 800-53 / SP 800-53A
1458
- // categories.
1459
- //
1460
- // 'policy' = an authored governance statement; 'procedure' = a documented process;
1461
- // 'technical' = an enforced technical configuration; 'management' = a
1462
- // programmatic/management activity; 'operational' = a recurring operational activity (e.g.
1463
- // AT, IR, MA families).
1464
- //
1465
- // Optional: when omitted, consumers may infer heuristically from family/id but should not
1466
- // assume a default.
1607
+ // Classification of the control's nature, aligning with NIST SP 800-53 / SP 800-53A
1608
+ // categories.
1609
+ //
1610
+ // 'policy' = an authored governance statement; 'procedure' = a documented process;
1611
+ // 'technical' = an enforced technical configuration; 'management' = a
1612
+ // programmatic/management activity; 'operational' = a recurring operational activity (e.g.
1613
+ // AT, IR, MA families).
1614
+ //
1615
+ // Optional: when omitted, consumers may infer heuristically from family/id but should not
1616
+ // assume a default.
1467
1617
  ControlType *ControlType `json:"controlType,omitempty"`
1468
- // Optional references to external artifacts relevant to this requirement (CTI/STIX
1469
- // correlation, advisories, control/definition sources, or any URI-addressable artifact).
1470
- // Applies to both baseline requirement definitions and evaluated requirements. Inert
1471
- // context; see External_Reference.
1618
+ // Optional references to external artifacts relevant to this requirement (CTI/STIX
1619
+ // correlation, advisories, control/definition sources, or any URI-addressable artifact).
1620
+ // Applies to both baseline requirement definitions and evaluated requirements. Inert
1621
+ // context; see External_Reference.
1472
1622
  ExternalReferences []ExternalReference `json:"externalReferences,omitempty"`
1473
- // The set of references to external documents.
1623
+ // The set of references to external documents.
1474
1624
  Refs []Reference `json:"refs,omitempty"`
1475
- // The explicit location of the requirement within the source code.
1625
+ // The explicit location of the requirement within the source code.
1476
1626
  SourceLocation *SourceLocation `json:"sourceLocation,omitempty"`
1477
- // The title - is nullable.
1627
+ // The title - is nullable.
1478
1628
  Title *string `json:"title,omitempty"`
1479
- // How this requirement is intended to be verified.
1480
- //
1481
- // Disambiguates the two cases that null 'code' overloads: 'manual-by-design' (the
1482
- // requirement is statement-form and not amenable to automation, e.g. FedRAMP 20x KSIs);
1483
- // 'manual-pending-automation' (automation could exist but does not yet, e.g. a STIG rule
1484
- // lacking a fix).
1485
- //
1486
- // 'automated' = a check exists and runs without operator action; 'hybrid' = part automated,
1487
- // part manual.
1488
- //
1489
- // Optional: when omitted, consumers should not infer a default.
1629
+ // How this requirement is intended to be verified.
1630
+ //
1631
+ // Disambiguates the two cases that null 'code' overloads: 'manual-by-design' (the
1632
+ // requirement is statement-form and not amenable to automation, e.g. FedRAMP 20x KSIs);
1633
+ // 'manual-pending-automation' (automation could exist but does not yet, e.g. a STIG rule
1634
+ // lacking a fix).
1635
+ //
1636
+ // 'automated' = a check exists and runs without operator action; 'hybrid' = part automated,
1637
+ // part manual.
1638
+ //
1639
+ // Optional: when omitted, consumers should not infer a default.
1490
1640
  VerificationMethod *VerificationMethodEnum `json:"verificationMethod,omitempty"`
1491
1641
  }
1492
1642
 
1493
1643
  // Structured comparison between two or more HDF security assessment documents. Supports temporal,
1494
1644
  // baseline, fleet, and multi-source comparison modes.
1495
1645
  type HDFComparison struct {
1496
- // Map of annotation IDs to annotation objects, providing context or action items for
1497
- // requirement diffs.
1498
- Annotations map[string]Annotation `json:"annotations,omitempty"`
1499
- // Comparison of baselines between sources.
1500
- BaselineDiffs []BaselineDiff `json:"baselineDiffs,omitempty"`
1501
- // The mode of comparison being performed.
1502
- ComparisonMode ComparisonMode `json:"comparisonMode"`
1503
- // Comparison of components between two system documents. Used in systemDrift mode. A
1504
- // component's BOM changes surface as a field change on its boms[] here.
1505
- ComponentDiffs []ComponentDiff `json:"componentDiffs,omitempty"`
1506
- // External/metadata changes separate from status changes (Terraform pattern).
1507
- Drift []RequirementDiff `json:"drift,omitempty"`
1508
- // Reserved for tool-specific data not defined in the HDF standard.
1509
- Extensions map[string]interface{} `json:"extensions,omitempty"`
1510
- // Optional references to external artifacts relevant to this comparison (CTI/STIX,
1511
- // advisories, or any URI-addressable artifact). Inert context; see External_Reference.
1512
- ExternalReferences []ExternalReference `json:"externalReferences,omitempty"`
1513
- // Schema version for this comparison format.
1514
- FormatVersion FormatVersion `json:"formatVersion"`
1515
- // Information about the tool that generated this comparison.
1516
- Generator *Generator `json:"generator,omitempty"`
1517
- // Cryptographic integrity information for verifying this comparison document.
1518
- Integrity *Integrity `json:"integrity,omitempty"`
1519
- // Configuration for how requirements were matched across sources.
1520
- Matching *MatchingConfig `json:"matching,omitempty"`
1521
- // RESERVED — not emitted by the current systemDrift comparison. systemDrift now reports a
1522
- // component's BOM changes as a field change on its boms[] (see componentDiffs), and
1523
- // standalone SBOM package diffing is a separate `hdf diff <sbom> <sbom>` output shape. This
1524
- // field is retained for a future normalized package-level diff; consumers must not expect
1525
- // it from today's systemDrift output.
1526
- PackageDiffs []PackageDiff `json:"packageDiffs,omitempty"`
1527
- // Detailed comparison of individual requirements between sources.
1528
- RequirementDiffs []RequirementDiff `json:"requirementDiffs"`
1529
- // The source documents being compared. At least two sources are required.
1530
- Sources []Source `json:"sources"`
1531
- // Summary statistics for the overall comparison.
1532
- Summary ComparisonSummary `json:"summary"`
1533
- // URI identifying the system being compared in systemDrift mode.
1534
- SystemRef *string `json:"systemRef,omitempty"`
1535
- // When this comparison was performed.
1536
- Timestamp *time.Time `json:"timestamp,omitempty"`
1646
+ // Map of annotation IDs to annotation objects, providing context or action items for
1647
+ // requirement diffs.
1648
+ Annotations map[string]Annotation `json:"annotations,omitempty"`
1649
+ // Comparison of baselines between sources.
1650
+ BaselineDiffs []BaselineDiff `json:"baselineDiffs,omitempty"`
1651
+ // The mode of comparison being performed.
1652
+ ComparisonMode ComparisonMode `json:"comparisonMode"`
1653
+ // Comparison of components between two system documents. Used in systemDrift mode. A
1654
+ // component's BOM changes surface as a field change on its boms[] here.
1655
+ ComponentDiffs []ComponentDiff `json:"componentDiffs,omitempty"`
1656
+ // External/metadata changes separate from status changes (Terraform pattern).
1657
+ Drift []RequirementDiff `json:"drift,omitempty"`
1658
+ // Producer data outside the HDF model, and the pre-converted source artifact(s) this
1659
+ // comparison was derived from.
1660
+ Extensions *Extensions `json:"extensions,omitempty"`
1661
+ // Optional references to external artifacts relevant to this comparison (CTI/STIX,
1662
+ // advisories, or any URI-addressable artifact). Inert context; see External_Reference.
1663
+ ExternalReferences []ExternalReference `json:"externalReferences,omitempty"`
1664
+ // Schema version for this comparison format.
1665
+ FormatVersion FormatVersion `json:"formatVersion"`
1666
+ // Information about the tool that generated this comparison.
1667
+ Generator *Generator `json:"generator,omitempty"`
1668
+ // Cryptographic integrity information for verifying this comparison document.
1669
+ Integrity *Integrity `json:"integrity,omitempty"`
1670
+ // Configuration for how requirements were matched across sources.
1671
+ Matching *MatchingConfig `json:"matching,omitempty"`
1672
+ // RESERVED — not emitted by the current systemDrift comparison. systemDrift now reports a
1673
+ // component's BOM changes as a field change on its boms[] (see componentDiffs), and
1674
+ // standalone SBOM package diffing is a separate `hdf diff <sbom> <sbom>` output shape. This
1675
+ // field is retained for a future normalized package-level diff; consumers must not expect
1676
+ // it from today's systemDrift output.
1677
+ PackageDiffs []PackageDiff `json:"packageDiffs,omitempty"`
1678
+ // Detailed comparison of individual requirements between sources.
1679
+ RequirementDiffs []RequirementDiff `json:"requirementDiffs"`
1680
+ // The source documents being compared. At least two sources are required.
1681
+ Sources []Source `json:"sources"`
1682
+ // Summary statistics for the overall comparison.
1683
+ Summary ComparisonSummary `json:"summary"`
1684
+ // URI identifying the system being compared in systemDrift mode.
1685
+ SystemRef *string `json:"systemRef,omitempty"`
1686
+ // When this comparison was performed.
1687
+ Timestamp *time.Time `json:"timestamp,omitempty"`
1537
1688
  }
1538
1689
 
1539
1690
  // An annotation attached to a comparison, providing context or action items.
1540
1691
  type Annotation struct {
1541
- // The category of this annotation.
1692
+ // The category of this annotation.
1542
1693
  Category *AnnotationCategory `json:"category,omitempty"`
1543
- // Detailed description of the annotation.
1694
+ // Detailed description of the annotation.
1544
1695
  Description *string `json:"description,omitempty"`
1545
- // Human-readable label for this annotation.
1696
+ // Human-readable label for this annotation.
1546
1697
  Label string `json:"label"`
1547
- // Whether this annotation requires human confirmation before acting on it.
1698
+ // Whether this annotation requires human confirmation before acting on it.
1548
1699
  NeedsConfirmation *bool `json:"needsConfirmation,omitempty"`
1549
1700
  }
1550
1701
 
1551
1702
  // Comparison of a baseline between sources.
1552
1703
  type BaselineDiff struct {
1553
- // The source of any ID mapping used to correlate requirements across baseline versions.
1704
+ // The source of any ID mapping used to correlate requirements across baseline versions.
1554
1705
  MappingSource *string `json:"mappingSource,omitempty"`
1555
- // Name of the baseline being compared.
1706
+ // Name of the baseline being compared.
1556
1707
  Name string `json:"name"`
1557
- // Version of the baseline in the new source.
1708
+ // Version of the baseline in the new source.
1558
1709
  NewVersion *string `json:"newVersion,omitempty"`
1559
- // Version of the baseline in the old source.
1710
+ // Version of the baseline in the old source.
1560
1711
  OldVersion *string `json:"oldVersion,omitempty"`
1561
- // The state of this baseline in the comparison.
1712
+ // The state of this baseline in the comparison.
1562
1713
  State BaselineDiffState `json:"state"`
1563
1714
  }
1564
1715
 
1565
1716
  // Comparison of a single component between two system document versions.
1566
1717
  type ComponentDiff struct {
1567
- // Component snapshot from the new system document. Null when state is 'absent'.
1718
+ // Component snapshot from the new system document. Null when state is 'absent'.
1568
1719
  After interface{} `json:"after,omitempty"`
1569
- // Component snapshot from the old system document. Null when state is 'new'.
1720
+ // Component snapshot from the old system document. Null when state is 'new'.
1570
1721
  Before interface{} `json:"before,omitempty"`
1571
- // Detailed field-level changes between the before and after component snapshots.
1722
+ // Detailed field-level changes between the before and after component snapshots.
1572
1723
  FieldChanges []FieldChange `json:"fieldChanges,omitempty"`
1573
- // Component name used for matching across system versions.
1724
+ // Component name used for matching across system versions.
1574
1725
  Name string `json:"name"`
1575
- // The state of this component in the comparison.
1726
+ // The state of this component in the comparison.
1576
1727
  State BaselineDiffState `json:"state"`
1577
1728
  }
1578
1729
 
1579
1730
  // A single field-level change between two versions of a requirement.
1580
1731
  type FieldChange struct {
1581
- // The new value of the field (for 'add' and 'replace' operations).
1732
+ // The new value of the field (for 'add' and 'replace' operations).
1582
1733
  NewValue interface{} `json:"newValue,omitempty"`
1583
- // The previous value of the field (for 'remove' and 'replace' operations).
1734
+ // The previous value of the field (for 'remove' and 'replace' operations).
1584
1735
  OldValue interface{} `json:"oldValue,omitempty"`
1585
- // The type of change operation.
1736
+ // The type of change operation.
1586
1737
  Op Op `json:"op"`
1587
- // JSON Pointer path to the changed field.
1738
+ // JSON Pointer path to the changed field.
1588
1739
  Path string `json:"path"`
1589
1740
  }
1590
1741
 
1591
1742
  // A comparison of a single requirement between sources, including state, changes, and full
1592
1743
  // before/after snapshots.
1593
1744
  type RequirementDiff struct {
1594
- // The requirement as it appeared in the new source. Null when state is 'absent'.
1745
+ // The requirement as it appeared in the new source. Null when state is 'absent'.
1595
1746
  After interface{} `json:"after"`
1596
- // Sensitive data from the new source that should not be included in the main after snapshot.
1747
+ // Sensitive data from the new source that should not be included in the main after snapshot.
1597
1748
  AfterSensitive map[string]interface{} `json:"afterSensitive,omitempty"`
1598
- // IDs of annotations attached to this requirement diff.
1749
+ // IDs of annotations attached to this requirement diff.
1599
1750
  AnnotationIDS []string `json:"annotationIds,omitempty"`
1600
- // The requirement as it appeared in the old/reference source. Null when state is 'new'.
1751
+ // Name of the baseline the requirement belongs to, so a consumer can group diffs the way
1752
+ // hdf diff --group-by baseline does. '(multiple)' when the id appears in more than one
1753
+ // baseline of the same document.
1754
+ Baseline *string `json:"baseline,omitempty"`
1755
+ // The requirement as it appeared in the old/reference source. Null when state is 'new'.
1601
1756
  Before interface{} `json:"before"`
1602
- // Sensitive data from the old source that should not be included in the main before
1603
- // snapshot.
1757
+ // Sensitive data from the old source that should not be included in the main before
1758
+ // snapshot.
1604
1759
  BeforeSensitive map[string]interface{} `json:"beforeSensitive,omitempty"`
1605
- // The reasons for the state change.
1760
+ // The reasons for the state change.
1606
1761
  ChangeReasons []ChangeReason `json:"changeReasons"`
1607
- // Conflicts between multiple scanner results for this requirement.
1762
+ // Conflicts between multiple scanner results for this requirement.
1608
1763
  Conflicts []ScannerConflict `json:"conflicts,omitempty"`
1609
- // Detailed field-level changes between the before and after versions.
1764
+ // Detailed field-level changes between the before and after versions.
1610
1765
  FieldChanges []FieldChange `json:"fieldChanges"`
1611
- // The canonical requirement identifier used for this diff.
1766
+ // The canonical requirement identifier used for this diff.
1612
1767
  ID string `json:"id"`
1613
- // Confidence score for the match (0-1).
1768
+ // Confidence score for the match (0-1).
1614
1769
  MatchConfidence *float64 `json:"matchConfidence,omitempty"`
1615
- // Whether the match was manually confirmed by a human.
1770
+ // Whether the match was manually confirmed by a human.
1616
1771
  MatchManual *bool `json:"matchManual,omitempty"`
1617
- // The strategy that was used to match this requirement across sources.
1772
+ // The strategy that was used to match this requirement across sources.
1618
1773
  MatchStrategy *MatchStrategy `json:"matchStrategy,omitempty"`
1619
- // The effective status of the requirement in the new source.
1774
+ // The effective status of the requirement in the new source.
1620
1775
  NewEffectiveStatus *string `json:"newEffectiveStatus,omitempty"`
1621
- // The requirement ID in the new source, if different from the canonical id.
1776
+ // The requirement ID in the new source, if different from the canonical id.
1622
1777
  NewID *string `json:"newId,omitempty"`
1623
- // The impact score of the requirement in the new source (0-1).
1778
+ // The impact score of the requirement in the new source (0-1).
1624
1779
  NewImpact *float64 `json:"newImpact,omitempty"`
1625
- // The effective status of the requirement in the old source.
1780
+ // The effective status of the requirement in the old source.
1626
1781
  OldEffectiveStatus *string `json:"oldEffectiveStatus,omitempty"`
1627
- // The requirement ID in the old source, if different from the canonical id.
1782
+ // The requirement ID in the old source, if different from the canonical id.
1628
1783
  OldID *string `json:"oldId,omitempty"`
1629
- // The impact score of the requirement in the old source (0-1).
1784
+ // The impact score of the requirement in the old source (0-1).
1630
1785
  OldImpact *float64 `json:"oldImpact,omitempty"`
1631
- // Index into the sources array for multi-source comparisons.
1786
+ // Index into the sources array for multi-source comparisons.
1632
1787
  SourceIndex *int64 `json:"sourceIndex,omitempty"`
1633
- // The state of this requirement in the comparison.
1788
+ // The state of this requirement in the comparison.
1634
1789
  State RequirementState `json:"state"`
1635
- // The requirement title for human readability.
1790
+ // The requirement title for human readability.
1636
1791
  Title *string `json:"title,omitempty"`
1637
1792
  }
1638
1793
 
1639
1794
  // A conflict between scanner results for the same requirement.
1640
1795
  type ScannerConflict struct {
1641
- // The field where the conflict occurs.
1796
+ // The field where the conflict occurs.
1642
1797
  Field string `json:"field"`
1643
- // How the conflict was resolved.
1798
+ // How the conflict was resolved.
1644
1799
  Resolution *ConflictResolution `json:"resolution,omitempty"`
1645
- // Index of the source whose value was chosen as the resolution.
1800
+ // Index of the source whose value was chosen as the resolution.
1646
1801
  ResolvedIndex *int64 `json:"resolvedIndex,omitempty"`
1647
- // The conflicting values from each source.
1802
+ // The conflicting values from each source.
1648
1803
  Values []Value `json:"values"`
1649
1804
  }
1650
1805
 
1651
1806
  type Value struct {
1652
- // Zero-based index into the sources array.
1807
+ // Zero-based index into the sources array.
1653
1808
  SourceIndex int64 `json:"sourceIndex"`
1654
- // Human-readable label for the source.
1809
+ // Human-readable label for the source.
1655
1810
  SourceLabel string `json:"sourceLabel"`
1656
- // The value reported by this source for the conflicting field.
1811
+ // The value reported by this source for the conflicting field.
1657
1812
  Value interface{} `json:"value"`
1658
1813
  }
1659
1814
 
1660
1815
  // Configuration for how requirements are matched across sources.
1661
1816
  type MatchingConfig struct {
1662
- // Ordered list of fallback strategies tried when the primary strategy fails to find a match.
1817
+ // Ordered list of fallback strategies tried when the primary strategy fails to find a match.
1663
1818
  FallbackStrategies []MatchStrategy `json:"fallbackStrategies,omitempty"`
1664
- // Fields used to compute a fingerprint for fuzzy matching.
1819
+ // Fields used to compute a fingerprint for fuzzy matching.
1665
1820
  FingerprintFields []string `json:"fingerprintFields,omitempty"`
1666
- // URI pointing to an external mapping table used for ID translation.
1821
+ // URI pointing to an external mapping table used for ID translation.
1667
1822
  MappingTableURI *string `json:"mappingTableUri,omitempty"`
1668
- // Minimum confidence score (0-1) required to accept a match.
1823
+ // Minimum confidence score (0-1) required to accept a match.
1669
1824
  MinimumConfidence *float64 `json:"minimumConfidence,omitempty"`
1670
- // The primary strategy used to match requirements across sources.
1825
+ // The primary strategy used to match requirements across sources.
1671
1826
  PrimaryStrategy MatchStrategy `json:"primaryStrategy"`
1672
1827
  }
1673
1828
 
1674
1829
  // Comparison of a single BOM node between two BOM versions, matched by purl (software) or
1675
1830
  // identifier (models, datasets, hardware, crypto).
1676
1831
  type PackageDiff struct {
1677
- // Generic identity key for matching a BOM node across versions when no purl applies — e.g.
1678
- // a Hugging Face model ref, dataset uniqueId, crypto algorithm OID, or hardware part
1679
- // number. At least one of purl or identifier is required.
1832
+ // Generic identity key for matching a BOM node across versions when no purl applies — e.g.
1833
+ // a Hugging Face model ref, dataset uniqueId, crypto algorithm OID, or hardware part
1834
+ // number. At least one of purl or identifier is required.
1680
1835
  Identifier *string `json:"identifier,omitempty"`
1681
- // License identifiers for this package.
1836
+ // License identifiers for this package.
1682
1837
  Licenses []string `json:"licenses,omitempty"`
1683
- // Human-readable node name.
1838
+ // Human-readable node name.
1684
1839
  Name *string `json:"name,omitempty"`
1685
- // Package version in the new SBOM.
1840
+ // Package version in the new SBOM.
1686
1841
  NewVersion *string `json:"newVersion,omitempty"`
1687
- // Package version in the old SBOM.
1842
+ // Package version in the old SBOM.
1688
1843
  OldVersion *string `json:"oldVersion,omitempty"`
1689
- // Package URL (purl) — the preferred identity key for matching software packages across
1690
- // BOMs. Optional: BOM nodes without a purl (AI models, datasets, hardware parts, crypto
1691
- // algorithms) key on identifier instead.
1844
+ // Package URL (purl) — the preferred identity key for matching software packages across
1845
+ // BOMs. Optional: BOM nodes without a purl (AI models, datasets, hardware parts, crypto
1846
+ // algorithms) key on identifier instead.
1692
1847
  Purl *string `json:"purl,omitempty"`
1693
- // The state of this package: added (new in new SBOM), removed (absent from new SBOM),
1694
- // updated (version changed), unchanged.
1848
+ // The state of this package: added (new in new SBOM), removed (absent from new SBOM),
1849
+ // updated (version changed), unchanged.
1695
1850
  State PackageDiffState `json:"state"`
1696
1851
  }
1697
1852
 
1698
1853
  // A source document participating in the comparison.
1699
1854
  type Source struct {
1700
- // When the source assessment was performed. ISO 8601 format.
1855
+ // When the source assessment was performed. ISO 8601 format.
1701
1856
  AssessmentTimestamp *time.Time `json:"assessmentTimestamp,omitempty"`
1702
- // Reference to the baseline used in this source assessment.
1857
+ // Reference to the baseline used in this source assessment.
1703
1858
  BaselineRef *BaselineRef `json:"baselineRef,omitempty"`
1704
- // Cryptographic checksum of the source document for integrity verification.
1859
+ // Cryptographic checksum of the source document for integrity verification.
1705
1860
  Checksum *Checksum `json:"checksum,omitempty"`
1706
- // The components assessed in this source.
1861
+ // The components assessed in this source.
1707
1862
  Components []Component `json:"components,omitempty"`
1708
- // Human-readable label for this source. Example: 'Before remediation scan'.
1863
+ // Human-readable label for this source. Example: 'Before remediation scan'.
1709
1864
  Label string `json:"label"`
1710
- // The original format of the source document before conversion to HDF.
1865
+ // The original format of the source document before conversion to HDF.
1711
1866
  OriginalFormat *OriginalFormat `json:"originalFormat,omitempty"`
1712
- // The role of this source in the comparison.
1867
+ // The role of this source in the comparison.
1713
1868
  Role SourceRole `json:"role"`
1714
- // The security tool that produced the assessment data in this source.
1869
+ // The security tool that produced the assessment data in this source.
1715
1870
  Tool *Tool `json:"tool,omitempty"`
1716
- // URI pointing to the source document.
1871
+ // URI pointing to the source document.
1717
1872
  URI *string `json:"uri,omitempty"`
1718
1873
  }
1719
1874
 
1720
1875
  // Reference to the baseline used in this source assessment.
1721
1876
  type BaselineRef struct {
1722
- // Name of the baseline used in this source.
1877
+ // Name of the baseline used in this source.
1723
1878
  Name string `json:"name"`
1724
- // Version of the baseline used in this source.
1879
+ // Version of the baseline used in this source.
1725
1880
  Version *string `json:"version,omitempty"`
1726
1881
  }
1727
1882
 
1728
1883
  // Summary statistics for the overall comparison.
1729
1884
  type ComparisonSummary struct {
1730
- // Number of requirements present only in the old source.
1731
- Absent *int64 `json:"absent,omitempty"`
1732
- // Average confidence score across all requirement matches (0-1).
1733
- AverageMatchConfidence *float64 `json:"averageMatchConfidence,omitempty"`
1734
- // State counts broken down by severity level.
1735
- BySeverity *SeverityBreakdown `json:"bySeverity,omitempty"`
1736
- // Change in compliance percentage (new - old).
1737
- ComplianceDelta *float64 `json:"complianceDelta,omitempty"`
1738
- // Number of requirements that changed from failing to passing.
1739
- Fixed *int64 `json:"fixed,omitempty"`
1740
- // Number of requirements successfully matched between sources.
1741
- MatchedCount int64 `json:"matchedCount"`
1742
- // Number of requirements that were reorganized without content change.
1743
- Moved *int64 `json:"moved,omitempty"`
1744
- // Number of requirements present only in the new source.
1745
- New *int64 `json:"new,omitempty"`
1746
- // Compliance percentage of the new source (0-100).
1747
- NewCompliancePercent *float64 `json:"newCompliancePercent,omitempty"`
1748
- // Compliance percentage of the old source (0-100).
1749
- OldCompliancePercent *float64 `json:"oldCompliancePercent,omitempty"`
1750
- // Summary statistics for each individual source in a multi-source comparison.
1751
- PerSource []PerSourceSummary `json:"perSource,omitempty"`
1752
- // Number of requirements that changed from passing to failing.
1753
- Regressed *int64 `json:"regressed,omitempty"`
1754
- // Total number of unique requirements across all sources.
1755
- Total int64 `json:"total"`
1756
- // Number of requirements with the same effective status.
1757
- Unchanged *int64 `json:"unchanged,omitempty"`
1758
- // Number of requirements in the new source with no match in the old source.
1759
- UnmatchedNewCount int64 `json:"unmatchedNewCount"`
1760
- // Number of requirements in the old source with no match in the new source.
1761
- UnmatchedOldCount int64 `json:"unmatchedOldCount"`
1762
- // Number of requirements with a generic status change.
1763
- Updated *int64 `json:"updated,omitempty"`
1885
+ // Number of requirements present only in the old source.
1886
+ Absent *int64 `json:"absent,omitempty"`
1887
+ // Average confidence score across all requirement matches (0-1).
1888
+ AverageMatchConfidence *float64 `json:"averageMatchConfidence,omitempty"`
1889
+ // State counts broken down by severity level.
1890
+ BySeverity *SeverityBreakdown `json:"bySeverity,omitempty"`
1891
+ // Change in compliance percentage (new - old).
1892
+ ComplianceDelta *float64 `json:"complianceDelta,omitempty"`
1893
+ // Number of requirements that changed from failing to passing.
1894
+ Fixed *int64 `json:"fixed,omitempty"`
1895
+ // Number of requirements successfully matched between sources.
1896
+ MatchedCount int64 `json:"matchedCount"`
1897
+ // Number of requirements that were reorganized without content change.
1898
+ Moved *int64 `json:"moved,omitempty"`
1899
+ // Number of requirements present only in the new source.
1900
+ New *int64 `json:"new,omitempty"`
1901
+ // Compliance percentage of the new source (0-100).
1902
+ NewCompliancePercent *float64 `json:"newCompliancePercent,omitempty"`
1903
+ // Compliance percentage of the old source (0-100).
1904
+ OldCompliancePercent *float64 `json:"oldCompliancePercent,omitempty"`
1905
+ // Summary statistics for each individual source in a multi-source comparison.
1906
+ PerSource []PerSourceSummary `json:"perSource,omitempty"`
1907
+ // Number of requirements that changed from passing to failing.
1908
+ Regressed *int64 `json:"regressed,omitempty"`
1909
+ // Total number of distinct requirement ids across all sources; an id carried by several
1910
+ // entries counts once.
1911
+ Total int64 `json:"total"`
1912
+ // Number of requirements with the same effective status.
1913
+ Unchanged *int64 `json:"unchanged,omitempty"`
1914
+ // Number of requirements in the new source with no match in the old source.
1915
+ UnmatchedNewCount int64 `json:"unmatchedNewCount"`
1916
+ // Number of requirements in the old source with no match in the new source.
1917
+ UnmatchedOldCount int64 `json:"unmatchedOldCount"`
1918
+ // Number of requirements with a generic status change.
1919
+ Updated *int64 `json:"updated,omitempty"`
1764
1920
  }
1765
1921
 
1766
1922
  // Breakdown of state counts by severity level.
1767
1923
  type SeverityBreakdown struct {
1768
- // State counts for critical severity requirements.
1924
+ // State counts for critical severity requirements.
1769
1925
  Critical *StateCounts `json:"critical,omitempty"`
1770
- // State counts for high severity requirements.
1926
+ // State counts for high severity requirements.
1771
1927
  High *StateCounts `json:"high,omitempty"`
1772
- // State counts for low severity requirements.
1928
+ // State counts for low severity requirements.
1773
1929
  Low *StateCounts `json:"low,omitempty"`
1774
- // State counts for medium severity requirements.
1930
+ // State counts for medium severity requirements.
1775
1931
  Medium *StateCounts `json:"medium,omitempty"`
1776
1932
  }
1777
1933
 
1778
1934
  // Counts of requirements in each state.
1779
1935
  type StateCounts struct {
1780
- // Number of requirements present only in the old source.
1936
+ // Number of requirements present only in the old source.
1781
1937
  Absent *int64 `json:"absent,omitempty"`
1782
- // Number of requirements that changed from failing to passing.
1938
+ // Number of requirements that changed from failing to passing.
1783
1939
  Fixed *int64 `json:"fixed,omitempty"`
1784
- // Number of requirements that were reorganized without content change.
1940
+ // Number of requirements that were reorganized without content change.
1785
1941
  Moved *int64 `json:"moved,omitempty"`
1786
- // Number of requirements present only in the new source.
1942
+ // Number of requirements present only in the new source.
1787
1943
  New *int64 `json:"new,omitempty"`
1788
- // Number of requirements that changed from passing to failing.
1944
+ // Number of requirements that changed from passing to failing.
1789
1945
  Regressed *int64 `json:"regressed,omitempty"`
1790
- // Number of requirements with the same effective status.
1946
+ // Number of requirements with the same effective status.
1791
1947
  Unchanged *int64 `json:"unchanged,omitempty"`
1792
- // Number of requirements with a generic status change.
1948
+ // Number of requirements with a generic status change.
1793
1949
  Updated *int64 `json:"updated,omitempty"`
1794
1950
  }
1795
1951
 
1796
1952
  // Summary statistics for a single source in a multi-source comparison.
1797
1953
  type PerSourceSummary struct {
1798
- // Number of requirements present only in the old source.
1954
+ // Number of requirements present only in the old source.
1799
1955
  Absent *int64 `json:"absent,omitempty"`
1800
- // Number of requirements that changed from failing to passing.
1956
+ // Number of requirements that changed from failing to passing.
1801
1957
  Fixed *int64 `json:"fixed,omitempty"`
1802
- // Human-readable label for this source.
1958
+ // Human-readable label for this source.
1803
1959
  Label string `json:"label"`
1804
- // Number of requirements that were reorganized without content change.
1960
+ // Number of requirements that were reorganized without content change.
1805
1961
  Moved *int64 `json:"moved,omitempty"`
1806
- // Number of requirements present only in the new source.
1962
+ // Number of requirements present only in the new source.
1807
1963
  New *int64 `json:"new,omitempty"`
1808
- // Number of requirements that changed from passing to failing.
1964
+ // Number of requirements that changed from passing to failing.
1809
1965
  Regressed *int64 `json:"regressed,omitempty"`
1810
- // Zero-based index into the sources array identifying which source this summary is for.
1966
+ // Zero-based index into the sources array identifying which source this summary is for.
1811
1967
  SourceIndex int64 `json:"sourceIndex"`
1812
- // Number of requirements with the same effective status.
1968
+ // Number of requirements with the same effective status.
1813
1969
  Unchanged *int64 `json:"unchanged,omitempty"`
1814
- // Number of requirements with a generic status change.
1970
+ // Number of requirements with a generic status change.
1815
1971
  Updated *int64 `json:"updated,omitempty"`
1816
1972
  }
1817
1973
 
1818
1974
  // Describes a system's authorization boundary, components, and interconnections. Maps to OSCAL SSP
1819
1975
  // system-characteristics and FedRAMP system inventory.
1820
1976
  type HDFSystem struct {
1821
- // Date the current authorization status was granted. ISO 8601 format.
1977
+ // Date the current authorization status was granted. ISO 8601 format.
1822
1978
  AuthorizationDate *time.Time `json:"authorizationDate,omitempty"`
1823
- // Current Authorization to Operate (ATO) status.
1979
+ // Current Authorization to Operate (ATO) status.
1824
1980
  AuthorizationStatus *AuthorizationStatus `json:"authorizationStatus,omitempty"`
1825
- // System-scoped Bills of Materials whose subject is the authorization boundary rather than
1826
- // a single component (e.g. a SaaSBOM of services, a KBOM of cluster inventory, an OBOM).
1827
- // Component-scoped BOMs (SBOM, ai-model) attach on the component instead. See
1828
- // primitives/bom.schema.json.
1981
+ // System-scoped Bills of Materials whose subject is the authorization boundary rather than
1982
+ // a single component (e.g. a SaaSBOM of services, a KBOM of cluster inventory, an OBOM).
1983
+ // Component-scoped BOMs (SBOM, ai-model) attach on the component instead. See
1984
+ // primitives/bom.schema.json.
1829
1985
  Boms []BillOfMaterials `json:"boms,omitempty"`
1830
- // Description of the system's authorization boundary. Example: network CIDR blocks, cloud
1831
- // VPC IDs, physical locations.
1986
+ // Description of the system's authorization boundary. Example: network CIDR blocks, cloud
1987
+ // VPC IDs, physical locations.
1832
1988
  BoundaryDescription *string `json:"boundaryDescription,omitempty"`
1833
- // FIPS 199 security categorization (impact level).
1989
+ // FIPS 199 security categorization (impact level).
1834
1990
  CategorizationLevel *CategorizationLevel `json:"categorizationLevel,omitempty"`
1835
- // System components within the authorization boundary. Uses the full polymorphic Component
1836
- // type with stable identity (componentId), external references, and generalized BOM
1837
- // attachment (boms[]).
1991
+ // System components within the authorization boundary. Uses the full polymorphic Component
1992
+ // type with stable identity (componentId), external references, and generalized BOM
1993
+ // attachment (boms[]).
1838
1994
  Components []Component `json:"components"`
1839
- // Declares which controls are common, hybrid, or system-specific, and which component
1840
- // provides them. Maps to NIST SP 800-53 control designations and OSCAL
1841
- // leveraged-authorizations.
1995
+ // Declares which controls are common, hybrid, or system-specific, and which component
1996
+ // provides them. Maps to NIST SP 800-53 control designations and OSCAL
1997
+ // leveraged-authorizations.
1842
1998
  ControlDesignations []ControlDesignation `json:"controlDesignations,omitempty"`
1843
- // Inter-component data flows describing how components communicate. Supports local,
1844
- // cross-system, and external flows. Replaces the interconnections[] field.
1999
+ // Inter-component data flows describing how components communicate. Supports local,
2000
+ // cross-system, and external flows. Replaces the interconnections[] field.
1845
2001
  DataFlows []DataFlow `json:"dataFlows,omitempty"`
1846
- // Description of the system's purpose and mission.
2002
+ // Description of the system's purpose and mission.
1847
2003
  Description *string `json:"description,omitempty"`
1848
- // Optional references to external artifacts describing this system's threat environment or
1849
- // context (CTI/STIX, BOMs, advisories, or any URI-addressable artifact). Inert context; see
1850
- // External_Reference.
2004
+ // Producer data outside the HDF model, and the pre-converted source artifact(s) this system
2005
+ // document was converted from.
2006
+ Extensions *Extensions `json:"extensions,omitempty"`
2007
+ // Optional references to external artifacts describing this system's threat environment or
2008
+ // context (CTI/STIX, BOMs, advisories, or any URI-addressable artifact). Inert context; see
2009
+ // External_Reference.
1851
2010
  ExternalReferences []ExternalReference `json:"externalReferences,omitempty"`
1852
- // Information about the tool that generated this system document.
2011
+ // Information about the tool that generated this system document.
1853
2012
  Generator *Generator `json:"generator,omitempty"`
1854
- // System identifier from an authoritative source. Example: eMASS system ID, FedRAMP package
1855
- // ID.
2013
+ // System identifier from an authoritative source. Example: eMASS system ID, FedRAMP package
2014
+ // ID.
1856
2015
  Identifier *string `json:"identifier,omitempty"`
1857
- // URI identifying the scheme of the system identifier. Example: 'https://emass.mil',
1858
- // 'https://fedramp.gov'.
2016
+ // URI identifying the scheme of the system identifier. Example: 'https://emass.mil',
2017
+ // 'https://fedramp.gov'.
1859
2018
  IdentifierScheme *string `json:"identifierScheme,omitempty"`
1860
- // Cryptographic integrity information for verifying this system document has not been
1861
- // tampered with.
2019
+ // Cryptographic integrity information for verifying this system document has not been
2020
+ // tampered with.
1862
2021
  Integrity *Integrity `json:"integrity,omitempty"`
1863
- // Optional key-value labels for grouping and querying systems.
2022
+ // Optional key-value labels for grouping and querying systems.
1864
2023
  Labels map[string]string `json:"labels,omitempty"`
1865
- // Human-readable system name. Example: 'Enterprise Portal Production'.
2024
+ // Human-readable system name. Example: 'Enterprise Portal Production'.
1866
2025
  Name string `json:"name"`
1867
- // Team or individual responsible for this system's authorization and compliance. Maps to
1868
- // OSCAL responsible-party with role 'system-owner'.
2026
+ // Team or individual responsible for this system's authorization and compliance. Maps to
2027
+ // OSCAL responsible-party with role 'system-owner'.
1869
2028
  Owner *Identity `json:"owner,omitempty"`
1870
- // Stable UUID (RFC 4122) for this system. Enables cross-document correlation independent of
1871
- // file location. Optional in casual use, expected in production documents.
2029
+ // Stable UUID (RFC 4122) for this system. Enables cross-document correlation independent of
2030
+ // file location. Optional in casual use, expected in production documents.
1872
2031
  SystemID *string `json:"systemId,omitempty"`
1873
- // Version of this system document.
2032
+ // Version of this system document.
1874
2033
  Version *string `json:"version,omitempty"`
1875
2034
  }
1876
2035
 
@@ -1879,24 +2038,24 @@ type HDFSystem struct {
1879
2038
  // Maps to NIST SP 800-53 Appendix C control designations and OSCAL SSP by-component
1880
2039
  // provided/inherited semantics.
1881
2040
  type ControlDesignation struct {
1882
- // The control identifier (e.g., 'SC-7', 'AC-2 (1)'). Must match a NIST tag in a baseline
1883
- // requirement's tags.
2041
+ // The control identifier (e.g., 'SC-7', 'AC-2 (1)'). Must match a NIST tag in a baseline
2042
+ // requirement's tags.
1884
2043
  ControlID string `json:"controlId"`
1885
- // Justification for this designation — who provides the control, why it's inherited, and
1886
- // any relevant authorization references.
2044
+ // Justification for this designation — who provides the control, why it's inherited, and
2045
+ // any relevant authorization references.
1887
2046
  Description string `json:"description"`
1888
- // NIST SP 800-53 control designation. 'common': fully provided by another component or
1889
- // system. 'system-specific': implemented by the inheriting component(s) only. 'hybrid':
1890
- // shared responsibility between provider and inheritor.
2047
+ // NIST SP 800-53 control designation. 'common': fully provided by another component or
2048
+ // system. 'system-specific': implemented by the inheriting component(s) only. 'hybrid':
2049
+ // shared responsibility between provider and inheritor.
1891
2050
  Designation Designation `json:"designation"`
1892
- // componentIds that inherit this control. If omitted, all components in the system inherit
1893
- // it.
2051
+ // componentIds that inherit this control. If omitted, all components in the system inherit
2052
+ // it.
1894
2053
  InheritedBy []string `json:"inheritedBy,omitempty"`
1895
- // componentId of a local component that provides this control. Omit when the provider is an
1896
- // external system.
2054
+ // componentId of a local component that provides this control. Omit when the provider is an
2055
+ // external system.
1897
2056
  ProvidedBy *string `json:"providedBy,omitempty"`
1898
- // Reference to another hdf-system document whose component provides this control. Use when
1899
- // the provider is in a different system. Omit when the provider is local.
2057
+ // Reference to another hdf-system document whose component provides this control. Use when
2058
+ // the provider is in a different system. Omit when the provider is local.
1900
2059
  SystemRef *string `json:"systemRef,omitempty"`
1901
2060
  }
1902
2061
 
@@ -1904,143 +2063,152 @@ type ControlDesignation struct {
1904
2063
  // endpoint can be local, cross-system, or external. Use 'direction' to indicate whether data flows
1905
2064
  // one-way or both ways.
1906
2065
  type DataFlow struct {
1907
- // Authentication mechanism used for this connection. Examples: 'mTLS', 'OAuth2', 'API key',
1908
- // 'SAML', 'Kerberos'.
2066
+ // Authentication mechanism used for this connection. Examples: 'mTLS', 'OAuth2', 'API key',
2067
+ // 'SAML', 'Kerberos'.
1909
2068
  Authentication *string `json:"authentication,omitempty"`
1910
- // Human-readable description of this data flow's purpose and the data exchanged.
2069
+ // Human-readable description of this data flow's purpose and the data exchanged.
1911
2070
  Description *string `json:"description,omitempty"`
1912
- // Data flow direction. 'unidirectional' means data flows from→to only. 'bidirectional'
1913
- // means data flows in both directions (e.g., request/response).
2071
+ // Data flow direction. 'unidirectional' means data flows from→to only. 'bidirectional'
2072
+ // means data flows in both directions (e.g., request/response).
1914
2073
  Direction *Direction `json:"direction,omitempty"`
1915
- // UUID of the local component that is one end of this data flow. Always references a
1916
- // component in the current system document.
2074
+ // UUID of the local component that is one end of this data flow. Always references a
2075
+ // component in the current system document.
1917
2076
  From string `json:"from"`
1918
- // Network port number.
2077
+ // Network port number.
1919
2078
  Port *int64 `json:"port,omitempty"`
1920
- // Communication protocol. Examples: 'http', 'https', 'grpc', 'ssh', 'jdbc', 'k8s-api',
1921
- // 'socket', 'sftp'.
2079
+ // Communication protocol. Examples: 'http', 'https', 'grpc', 'ssh', 'jdbc', 'k8s-api',
2080
+ // 'socket', 'sftp'.
1922
2081
  Protocol *string `json:"protocol,omitempty"`
1923
- // The other end of this data flow. Can be a local component (UUID), a cross-system
1924
- // component reference, or an external endpoint.
2082
+ // The other end of this data flow. Can be a local component (UUID), a cross-system
2083
+ // component reference, or an external endpoint.
1925
2084
  To interface{} `json:"to"`
1926
2085
  }
1927
2086
 
1928
2087
  // Defines an assessment plan — what baselines to run against which targets, with resolved inputs
1929
2088
  // and scheduling. Maps to OSCAL Assessment Plan.
1930
2089
  type HDFPlan struct {
1931
- // The assessments to perform. Each assessment pairs a baseline with targets and resolved
1932
- // inputs.
2090
+ // The assessments to perform. Each assessment pairs a baseline with targets and resolved
2091
+ // inputs.
1933
2092
  Assessments []Assessment `json:"assessments"`
1934
- // Description of the plan's purpose and scope.
2093
+ // Description of the plan's purpose and scope.
1935
2094
  Description *string `json:"description,omitempty"`
1936
- // Optional references to external artifacts relevant to this assessment plan (CTI/STIX,
1937
- // advisories, methodology docs, or any URI-addressable artifact). Inert context; see
1938
- // External_Reference.
2095
+ // Producer data outside the HDF model, and the pre-converted source artifact(s) this plan
2096
+ // was converted from.
2097
+ Extensions *Extensions `json:"extensions,omitempty"`
2098
+ // Optional references to external artifacts relevant to this assessment plan (CTI/STIX,
2099
+ // advisories, methodology docs, or any URI-addressable artifact). Inert context; see
2100
+ // External_Reference.
1939
2101
  ExternalReferences []ExternalReference `json:"externalReferences,omitempty"`
1940
- // Information about the tool that generated this plan.
2102
+ // Information about the tool that generated this plan.
1941
2103
  Generator *Generator `json:"generator,omitempty"`
1942
- // Cryptographic integrity information for verifying this plan document has not been
1943
- // tampered with.
2104
+ // Cryptographic integrity information for verifying this plan document has not been
2105
+ // tampered with.
1944
2106
  Integrity *Integrity `json:"integrity,omitempty"`
1945
- // Optional key-value labels for grouping and querying plans.
2107
+ // Optional key-value labels for grouping and querying plans.
1946
2108
  Labels map[string]string `json:"labels,omitempty"`
1947
- // Human-readable plan name. Example: 'Portal Monthly Assessment'.
2109
+ // Human-readable plan name. Example: 'Portal Monthly Assessment'.
1948
2110
  Name string `json:"name"`
1949
- // Unique identifier for this plan. Optional in casual use, expected in production
1950
- // documents. Auto-generated if omitted during creation.
2111
+ // Unique identifier for this plan. Optional in casual use, expected in production
2112
+ // documents. Auto-generated if omitted during creation.
1951
2113
  PlanID *string `json:"planId,omitempty"`
1952
- // Optional scheduling configuration for recurring assessments.
2114
+ // Optional scheduling configuration for recurring assessments.
1953
2115
  Schedule *Schedule `json:"schedule,omitempty"`
1954
- // URI to the hdf-system document this plan targets. Example: 'portal-prod.hdf-system.json'.
2116
+ // URI to the hdf-system document this plan targets. Example: 'portal-prod.hdf-system.json'.
1955
2117
  SystemRef *string `json:"systemRef,omitempty"`
1956
- // The type of assessment plan.
2118
+ // The type of assessment plan.
1957
2119
  Type *PlanType `json:"type,omitempty"`
1958
- // Version of this plan document.
2120
+ // Version of this plan document.
1959
2121
  Version *string `json:"version,omitempty"`
1960
2122
  }
1961
2123
 
1962
2124
  // A single assessment within a plan — defines which baseline to run against which targets with what
1963
2125
  // configuration.
1964
2126
  type Assessment struct {
1965
- // Reference to the baseline to evaluate. May be a baseline name (e.g. 'RHEL9-STIG'), a
1966
- // relative path to an HDF Baseline document (e.g. 'rhel9-stig.hdf-baseline.json'), or an
1967
- // absolute URI.
2127
+ // Reference to the baseline to evaluate. May be a baseline name (e.g. 'RHEL9-STIG'), a
2128
+ // relative path to an HDF Baseline document (e.g. 'rhel9-stig.hdf-baseline.json'), or an
2129
+ // absolute URI.
1968
2130
  BaselineRef string `json:"baselineRef"`
1969
- // componentId of the system component this assessment targets. Use for direct component
1970
- // binding. Alternative to targetSelector.
2131
+ // componentId of the system component this assessment targets. Use for direct component
2132
+ // binding. Alternative to targetSelector.
1971
2133
  ComponentRef *string `json:"componentRef,omitempty"`
1972
- // Description of this assessment's purpose.
2134
+ // Description of this assessment's purpose.
1973
2135
  Description *string `json:"description,omitempty"`
1974
- // Resolved input values for this assessment. Keys are input names, values are the final
1975
- // resolved values (after baseline defaults + system overrides).
2136
+ // Resolved input values for this assessment. Keys are input names, values are the final
2137
+ // resolved values (after baseline defaults + system overrides).
1976
2138
  Inputs map[string]interface{} `json:"inputs,omitempty"`
1977
- // Runner/scanner configuration for this assessment.
2139
+ // Runner/scanner configuration for this assessment.
1978
2140
  Runner *RunnerConfig `json:"runner,omitempty"`
1979
- // Label selector to match targets for this assessment. Overrides the system component's
1980
- // targetSelector if provided.
2141
+ // Label selector to match targets for this assessment. Overrides the system component's
2142
+ // targetSelector if provided.
1981
2143
  TargetSelector map[string]string `json:"targetSelector,omitempty"`
1982
2144
  }
1983
2145
 
1984
2146
  // Configuration for the assessment runner/scanner.
1985
2147
  type RunnerConfig struct {
1986
- // Name of the assessment runner. Example: 'cinc-auditor', 'inspec', 'openscap'.
2148
+ // Name of the assessment runner. Example: 'cinc-auditor', 'inspec', 'openscap'.
1987
2149
  Name *string `json:"name,omitempty"`
1988
- // Version of the runner.
2150
+ // Version of the runner.
1989
2151
  Version *string `json:"version,omitempty"`
1990
2152
  }
1991
2153
 
1992
2154
  // Scheduling configuration for recurring assessments.
1993
2155
  type Schedule struct {
1994
- // Cron expression for recurring assessments. Example: '0 2 1 * *' (2 AM on the 1st of each
1995
- // month).
2156
+ // Cron expression for recurring assessments. Example: '0 2 1 * *' (2 AM on the 1st of each
2157
+ // month).
1996
2158
  Cron *string `json:"cron,omitempty"`
1997
- // Date after which assessments should no longer run. ISO 8601 format.
2159
+ // Date after which assessments should no longer run. ISO 8601 format.
1998
2160
  EndDate *time.Time `json:"endDate,omitempty"`
1999
- // Email addresses or notification endpoints to alert when assessments complete.
2161
+ // Email addresses or notification endpoints to alert when assessments complete.
2000
2162
  NotifyOnCompletion []string `json:"notifyOnCompletion,omitempty"`
2001
- // Email addresses or notification endpoints to alert when regressions are detected.
2163
+ // Email addresses or notification endpoints to alert when regressions are detected.
2002
2164
  NotifyOnRegression []string `json:"notifyOnRegression,omitempty"`
2003
- // Earliest date to begin assessments. ISO 8601 format.
2165
+ // Earliest date to begin assessments. ISO 8601 format.
2004
2166
  StartDate *time.Time `json:"startDate,omitempty"`
2005
2167
  }
2006
2168
 
2007
2169
  // Waivers, attestations, and POA&Ms that modify requirement compliance status or impact. Amendments
2008
2170
  // are standalone documents that can be applied to results via merge operations.
2009
2171
  type HDFAmendments struct {
2010
- // Unique identifier for this amendments document. Useful for cross-referencing when
2011
- // multiple amendment documents target the same results.
2172
+ // Unique identifier for this amendments document. Useful for cross-referencing when
2173
+ // multiple amendment documents target the same results.
2012
2174
  AmendmentID *string `json:"amendmentId,omitempty"`
2013
- // Default identity of who created this amendments document. Individual overrides may
2014
- // specify their own appliedBy.
2175
+ // Default identity of who created this amendments document. Individual overrides may
2176
+ // specify their own appliedBy.
2015
2177
  AppliedBy *Identity `json:"appliedBy,omitempty"`
2016
- // Identity of the authorizing official who approved these amendments.
2178
+ // Identity of the authorizing official who approved these amendments.
2017
2179
  ApprovedBy *Identity `json:"approvedBy,omitempty"`
2018
- // Description of the amendments' purpose and scope.
2180
+ // Description of the amendments' purpose and scope.
2019
2181
  Description *string `json:"description,omitempty"`
2020
- // Information about the tool that generated this document.
2182
+ // Producer data outside the HDF model, and the pre-converted source artifact(s) these
2183
+ // amendments were converted from — the VEX family and oscal-poam-to-hdf all emit this
2184
+ // document type.
2185
+ Extensions *Extensions `json:"extensions,omitempty"`
2186
+ // Information about the tool that generated this document.
2021
2187
  Generator *Generator `json:"generator,omitempty"`
2022
- // Cryptographic integrity information for verifying this amendments document has not been
2023
- // tampered with.
2188
+ // Cryptographic integrity information for verifying this amendments document has not been
2189
+ // tampered with.
2024
2190
  Integrity *Integrity `json:"integrity,omitempty"`
2025
- // Optional key-value labels for grouping and querying amendments.
2191
+ // Optional key-value labels for grouping and querying amendments.
2026
2192
  Labels map[string]string `json:"labels,omitempty"`
2027
- // Human-readable name for this amendments document. Example: 'Portal Q1 2026 Waivers'.
2193
+ // Human-readable name for this amendments document. Example: 'Portal Q1 2026 Waivers'.
2028
2194
  Name string `json:"name"`
2029
- // The set of amendments (waivers, attestations, POA&Ms, and other overrides).
2195
+ // The set of amendments (waivers, attestations, POA&Ms, and other overrides).
2030
2196
  Overrides []StandaloneOverride `json:"overrides"`
2031
- // Document-level digital signature covering all amendments.
2197
+ // Document-level digital signature covering all amendments.
2032
2198
  Signature *Signature `json:"signature,omitempty"`
2033
- // URI to the hdf-system document these amendments apply to.
2199
+ // URI to the hdf-system document these amendments apply to.
2034
2200
  SystemRef *string `json:"systemRef,omitempty"`
2035
- // Version of this amendments document.
2201
+ // Version of this amendments document.
2036
2202
  Version *string `json:"version,omitempty"`
2037
2203
  }
2038
2204
 
2039
- // A standalone override to a requirement's compliance status or risk impact. Validation has two
2040
- // branches gated on 'type': when type is 'operationalRequirement', neither 'status' nor 'impact'
2041
- // may be set — the override records accepted risk without changing the finding
2042
- // (documentation-only). For all other types, at least one of 'status' or 'impact' must be set. This
2043
- // rule aligns with: - OSCAL Assessment Results — finding.target.status and
2205
+ // A standalone override to a requirement's compliance status or risk impact. Validation is gated on
2206
+ // 'type': when type is 'operationalRequirement', neither 'status' nor 'impact' may be set — the
2207
+ // override records accepted risk without changing the finding (documentation-only). When type is
2208
+ // 'riskAdjustment', 'status' may not be set — it re-rates the risk through 'impact' and never
2209
+ // changes the finding's pass/fail; an override that must change status is a waiver or
2210
+ // falsePositive. For all other types, at least one of 'status' or 'impact' must be set. This rule
2211
+ // aligns with: - OSCAL Assessment Results — finding.target.status and
2044
2212
  // finding.associated-risk[].facet[] are separate axes
2045
2213
  // (https://pages.nist.gov/OSCAL/learn/concepts/layer/assessment/assessment-results/) - FedRAMP
2046
2214
  // deviation request types — Risk Adjustment changes impact only, Operational Requirement documents
@@ -2049,161 +2217,177 @@ type HDFAmendments struct {
2049
2217
  // RMF — risk response (accept/mitigate/transfer) is a separate step from control assessment status
2050
2218
  // (https://csrc.nist.gov/pubs/sp/800/37/r2/final).
2051
2219
  type StandaloneOverride struct {
2052
- // Software packages this amendment is scoped to, distinct from componentRef (which scopes
2053
- // to an HDF-internal Component by UUID).
2054
- //
2055
- // Use when the source amendment format references packages by purl/cpe/name+version — e.g.,
2056
- // VEX `affects[]` / `products[]`, OSCAL POA&M `subjects[]`, FedRAMP component-aware
2057
- // amendments.
2058
- //
2059
- // Symmetric with Evaluated_Requirement.affectedPackages, which scopes findings to the same
2060
- // package vocabulary.
2061
- //
2062
- // When omitted, the amendment applies system-wide (or only to componentRef when that is
2063
- // set).
2220
+ // Software packages this amendment is scoped to, distinct from componentRef (which scopes
2221
+ // to an HDF-internal Component by UUID).
2222
+ //
2223
+ // Use when the source amendment format references packages by purl/cpe/name+version — e.g.,
2224
+ // VEX `affects[]` / `products[]`, OSCAL POA&M `subjects[]`, FedRAMP component-aware
2225
+ // amendments.
2226
+ //
2227
+ // Symmetric with Evaluated_Requirement.affectedPackages, which scopes findings to the same
2228
+ // package vocabulary.
2229
+ //
2230
+ // When omitted, the amendment applies system-wide (or only to componentRef when that is
2231
+ // set).
2064
2232
  AffectedPackages []AffectedPackage `json:"affectedPackages,omitempty"`
2065
- // When this amendment was applied. ISO 8601 format.
2233
+ // When this amendment was applied. ISO 8601 format.
2066
2234
  AppliedAt time.Time `json:"appliedAt"`
2067
- // Identity of who applied this amendment.
2235
+ // Identity of who applied this amendment.
2068
2236
  AppliedBy Identity `json:"appliedBy"`
2069
- // Name of the baseline containing the requirement. Required when the system has multiple
2070
- // baselines with potentially overlapping requirement IDs.
2237
+ // Name of the baseline containing the requirement. Required when the system has multiple
2238
+ // baselines with potentially overlapping requirement IDs.
2071
2239
  BaselineRef *string `json:"baselineRef,omitempty"`
2072
- // componentId of the component this amendment is scoped to. When set, the amendment only
2073
- // applies to the specified component. When omitted, the amendment applies system-wide.
2240
+ // componentId of the component this amendment is scoped to. When set, the amendment only
2241
+ // applies to the specified component. When omitted, the amendment applies system-wide.
2074
2242
  ComponentRef *string `json:"componentRef,omitempty"`
2075
- // Structured CVSS scoring data backing this override. Captures the rubric (which
2076
- // Environmental/Threat metrics the consumer modified, the recomputed score) used to justify
2077
- // a riskAdjustment. For other override types this is optional context.
2243
+ // Structured CVSS scoring data backing this override. Captures the rubric (which
2244
+ // Environmental/Threat metrics the consumer modified, the recomputed score) used to justify
2245
+ // a riskAdjustment. For other override types this is optional context.
2078
2246
  Cvss *Cvss `json:"cvss,omitempty"`
2079
- // Supporting evidence (screenshots, logs, URLs, documents).
2247
+ // Supporting evidence (screenshots, logs, URLs, documents).
2080
2248
  Evidence []Evidence `json:"evidence,omitempty"`
2081
- // When this amendment expires and must be reviewed. No permanent amendments. ISO 8601
2082
- // format.
2249
+ // When this amendment expires and must be reviewed. No permanent amendments. ISO 8601
2250
+ // format.
2083
2251
  ExpiresAt time.Time `json:"expiresAt"`
2084
- // Optional references to the external artifacts behind this override (e.g. the STIX
2085
- // bundle/object, advisory, or CTI feed that motivated it). Inert context distinct from
2086
- // `evidence`; see External_Reference.
2252
+ // Optional references to the external artifacts behind this override (e.g. the STIX
2253
+ // bundle/object, advisory, or CTI feed that motivated it). Inert context distinct from
2254
+ // `evidence`; see External_Reference.
2087
2255
  ExternalReferences []ExternalReference `json:"externalReferences,omitempty"`
2088
- // Override to the requirement's impact score. At least one of status or impact must be set.
2256
+ // Override to the requirement's impact score. At least one of status or impact must be set.
2089
2257
  Impact *ImpactOverride `json:"impact,omitempty"`
2090
- // componentId of the local component that provides this control. Set when the provider is
2091
- // in the same system. Omit for external or cross-system providers; the reason field
2092
- // explains the source. Primarily used with type 'inherited'.
2258
+ // componentId of the local component that provides this control. Set when the provider is
2259
+ // in the same system. Omit for external or cross-system providers; the reason field
2260
+ // explains the source. Primarily used with type 'inherited'.
2093
2261
  InheritedFrom *string `json:"inheritedFrom,omitempty"`
2094
- // Structured controlled-vocabulary classification for why this override applies.
2095
- // Complements (does not replace) the free-text 'reason' field. Most useful on falsePositive
2096
- // and attestation overrides where the structured category enables filtering and lossless
2097
- // round-trip with VEX / OSCAL / FedRAMP DR. See the Justification primitive for the
2098
- // precedent vocabulary and rationale.
2262
+ // Structured controlled-vocabulary classification for why this override applies.
2263
+ // Complements (does not replace) the free-text 'reason' field. Most useful on falsePositive
2264
+ // and attestation overrides where the structured category enables filtering and lossless
2265
+ // round-trip with VEX / OSCAL / FedRAMP DR. See the Justification primitive for the
2266
+ // precedent vocabulary and rationale.
2099
2267
  Justification *Justification `json:"justification,omitempty"`
2100
- // Remediation milestones (primarily for POA&M type amendments).
2268
+ // Remediation milestones (primarily for POA&M type amendments).
2101
2269
  Milestones []Milestone `json:"milestones,omitempty"`
2102
- // SHA-256 checksum of the prior amendment in chronological order. Each amendment's checksum
2103
- // is recorded by the NEXT one, so editing an amendment in place is detectable — provided a
2104
- // later amendment is chained to it. It is NOT tamper-proof: the final amendment, the
2105
- // document envelope, deleted trailing amendments, and a chain that has been stripped or
2106
- // recomputed wholesale are all outside what it can detect. Use signature for
2107
- // non-repudiation. Omitted on the first amendment.
2270
+ // SHA-256 checksum of the prior amendment in chronological order. Each amendment's checksum
2271
+ // is recorded by the NEXT one, so editing an amendment in place is detectable — provided a
2272
+ // later amendment is chained to it. It is NOT tamper-proof: the final amendment, the
2273
+ // document envelope, deleted trailing amendments, and a chain that has been stripped or
2274
+ // recomputed wholesale are all outside what it can detect. Use signature for
2275
+ // non-repudiation. Omitted on the first amendment.
2108
2276
  PreviousChecksum *Checksum `json:"previousChecksum,omitempty"`
2109
- // Justification for this amendment.
2277
+ // Justification for this amendment.
2110
2278
  Reason string `json:"reason"`
2111
- // The ID of the requirement being amended. Must match a requirement ID in the referenced
2112
- // baseline.
2279
+ // The id of the requirement being amended. An id names the requirement, not one finding, so
2280
+ // the override applies to every requirement entry carrying that id in the baseline(s) it
2281
+ // targets.
2113
2282
  RequirementID string `json:"requirementId"`
2114
- // Digital signature for non-repudiation.
2283
+ // Digital signature for non-repudiation.
2115
2284
  Signature *Signature `json:"signature,omitempty"`
2116
- // The new status this amendment sets. Optional when only impact is being overridden.
2285
+ // The new status this override sets for the requirement. Optional when only impact is being
2286
+ // overridden; forbidden on an operationalRequirement, which adjudicates nothing, and on a
2287
+ // riskAdjustment, which re-rates impact only.
2117
2288
  Status *ResultStatus `json:"status,omitempty"`
2118
- // The type of amendment.
2289
+ // The type of amendment.
2119
2290
  Type OverrideType `json:"type"`
2120
2291
  }
2121
2292
 
2122
2293
  // Bundles references to all HDF documents for audit, authorization, and compliance review. Each
2123
2294
  // content entry references a document by type, URI, and checksum for integrity verification.
2124
2295
  type HDFEvidencePackage struct {
2125
- // Summary of assessment completeness and compliance status.
2296
+ // Summary of assessment completeness and compliance status.
2126
2297
  CompletenessCheck *CompletenessCheck `json:"completenessCheck,omitempty"`
2127
- // References to HDF documents included in this evidence package.
2298
+ // References to HDF documents included in this evidence package.
2128
2299
  Contents []ContentReference `json:"contents"`
2129
- // Description of the evidence package's purpose and scope.
2300
+ // Description of the evidence package's purpose and scope.
2130
2301
  Description *string `json:"description,omitempty"`
2131
- // References to external native-format evidence (log/telemetry corpora and other artifacts)
2132
- // carried by URI + integrity hash + format discriminator, without recreating the data
2133
- // inside HDF. Logs in ECS/OCSF/etc. are legitimate accreditation evidence; HDF indexes them
2134
- // here rather than transcoding them.
2302
+ // Producer data outside the HDF model, and the pre-converted source artifact(s) this
2303
+ // package was assembled from.
2304
+ Extensions *Extensions `json:"extensions,omitempty"`
2305
+ // References to external native-format evidence (log/telemetry corpora and other artifacts)
2306
+ // carried by URI + integrity hash + format discriminator, without recreating the data
2307
+ // inside HDF. Logs in ECS/OCSF/etc. are legitimate accreditation evidence; HDF indexes them
2308
+ // here rather than transcoding them.
2135
2309
  ExternalEvidence []ExternalEvidenceReference `json:"externalEvidence,omitempty"`
2136
- // Optional references to external artifacts relevant to this evidence package (CTI/STIX,
2137
- // BOMs, advisories, or any URI-addressable artifact) beyond the document references it
2138
- // already carries. Inert context; see External_Reference.
2310
+ // Optional references to external artifacts relevant to this evidence package (CTI/STIX,
2311
+ // BOMs, advisories, or any URI-addressable artifact) beyond the document references it
2312
+ // already carries. Inert context; see External_Reference.
2139
2313
  ExternalReferences []ExternalReference `json:"externalReferences,omitempty"`
2140
- // Information about the tool that generated this document.
2314
+ // Information about the tool that generated this document.
2141
2315
  Generator *Generator `json:"generator,omitempty"`
2142
- // Cryptographic integrity information for verifying this evidence package has not been
2143
- // tampered with.
2316
+ // Cryptographic integrity information for verifying this evidence package has not been
2317
+ // tampered with.
2144
2318
  Integrity *Integrity `json:"integrity,omitempty"`
2145
- // Optional key-value labels for grouping and querying evidence packages.
2319
+ // Optional key-value labels for grouping and querying evidence packages.
2146
2320
  Labels map[string]string `json:"labels,omitempty"`
2147
- // Human-readable name for this evidence package. Example: 'Enterprise Portal ATO Evidence -
2148
- // Q1 2026'.
2321
+ // Human-readable name for this evidence package. Example: 'Enterprise Portal ATO Evidence -
2322
+ // Q1 2026'.
2149
2323
  Name string `json:"name"`
2150
- // Unique identifier for this evidence package. Optional in casual use, expected in
2151
- // production ATO submissions. Auto-generated if omitted during creation.
2324
+ // Unique identifier for this evidence package. Optional in casual use, expected in
2325
+ // production ATO submissions. Auto-generated if omitted during creation.
2152
2326
  PackageID *string `json:"packageId,omitempty"`
2153
- // URI to the hdf-plan document that drove this assessment. Used for completeness
2154
- // verification — every baseline in the plan should have a corresponding results document in
2155
- // this package.
2327
+ // URI to the hdf-plan document that drove this assessment. Used for completeness
2328
+ // verification — every baseline in the plan should have a corresponding results document in
2329
+ // this package.
2156
2330
  PlanRef *string `json:"planRef,omitempty"`
2157
- // When this evidence package was prepared. ISO 8601 format.
2331
+ // When this evidence package was prepared. ISO 8601 format.
2158
2332
  PreparedAt *time.Time `json:"preparedAt,omitempty"`
2159
- // Identity of who prepared this evidence package.
2333
+ // Identity of who prepared this evidence package.
2160
2334
  PreparedBy *Identity `json:"preparedBy,omitempty"`
2161
- // Digital signature covering the entire evidence package.
2335
+ // Digital signature covering the entire evidence package.
2162
2336
  Signature *Signature `json:"signature,omitempty"`
2163
- // URI to the hdf-system document this evidence package covers.
2337
+ // URI to the hdf-system document this evidence package covers.
2164
2338
  SystemRef *string `json:"systemRef,omitempty"`
2165
- // Version of this evidence package.
2339
+ // Version of this evidence package.
2166
2340
  Version *string `json:"version,omitempty"`
2167
2341
  }
2168
2342
 
2169
2343
  // Informational summary of assessment completeness. Not authoritative — tools should compute these
2170
2344
  // from the referenced documents.
2171
2345
  type CompletenessCheck struct {
2172
- // Whether all baselines referenced by system components have assessment results.
2346
+ // Whether all baselines referenced by system components have assessment results.
2173
2347
  AllBaselinesAssessed *bool `json:"allBaselinesAssessed,omitempty"`
2174
- // Whether all system components have at least one matching target in the results.
2348
+ // Whether all system components have at least one matching target in the results.
2175
2349
  AllComponentsCovered *bool `json:"allComponentsCovered,omitempty"`
2176
- // Overall compliance percentage across all assessments.
2350
+ // Overall compliance percentage across all assessments.
2177
2351
  CompliancePercent *float64 `json:"compliancePercent,omitempty"`
2178
- // Number of waivers/amendments that have expired.
2352
+ // Number of waivers/amendments that have expired.
2179
2353
  ExpiredWaivers *int64 `json:"expiredWaivers,omitempty"`
2180
- // SBOM coverage across system components.
2354
+ // SBOM coverage across system components.
2181
2355
  SbomCoverage *SBOMCoverage `json:"sbomCoverage,omitempty"`
2182
- // Number of POA&M items that are still open (not completed).
2356
+ // Number of POA&M items that are still open (not completed).
2183
2357
  UnresolvedPoams *int64 `json:"unresolvedPoams,omitempty"`
2184
2358
  }
2185
2359
 
2186
2360
  // SBOM coverage statistics for the system.
2187
2361
  type SBOMCoverage struct {
2188
- // Number of system components that have an associated SBOM.
2362
+ // Number of system components that have an associated SBOM.
2189
2363
  ComponentsWithSbom *int64 `json:"componentsWithSbom,omitempty"`
2190
- // Total number of components in the system.
2364
+ // Total number of components in the system.
2191
2365
  TotalComponents *int64 `json:"totalComponents,omitempty"`
2192
2366
  }
2193
2367
 
2194
2368
  // A reference to an HDF document or BOM/manifest included in the evidence package.
2195
2369
  type ContentReference struct {
2196
- // Cryptographic checksum for verifying the referenced document's integrity.
2197
- Checksum *Checksum `json:"checksum,omitempty"`
2198
- // componentId of the component this content entry relates to. Use to link SBOMs, results,
2199
- // or other documents to a specific system component.
2200
- ComponentRef *string `json:"componentRef,omitempty"`
2201
- // Optional description of this content entry.
2202
- Description *string `json:"description,omitempty"`
2203
- // The type of HDF document being referenced.
2204
- Type ContentType `json:"type"`
2205
- // URI to the document. Can be a relative path or absolute URL.
2206
- URI string `json:"uri"`
2370
+ // Cryptographic checksum for verifying the referenced document's integrity.
2371
+ Checksum *Checksum `json:"checksum,omitempty"`
2372
+ // componentId of the component this content entry relates to. Use to link SBOMs, results,
2373
+ // or other documents to a specific system component.
2374
+ ComponentRef *string `json:"componentRef,omitempty"`
2375
+ // Optional description of this content entry.
2376
+ Description *string `json:"description,omitempty"`
2377
+ // The type of HDF document being referenced.
2378
+ Type ContentType `json:"type"`
2379
+ // A uri-reference whose DECODED form is a path relative to the package document's own
2380
+ // directory — that is what the reference MEANS, independently of any one consumer.
2381
+ // Percent-escapes are part of the encoding, not the name: `my%20scans/q4.json` and `my
2382
+ // scans/q4.json` name the same file, and the escaped spelling is the one this field's
2383
+ // format admits. A consumer decodes before it resolves, never after, because decoding can
2384
+ // produce a parent traversal that containment must then see. It is never fetched: there is
2385
+ // no network retrieval anywhere in evidence handling. `uri-reference` admits shapes other
2386
+ // than a relative path and they stay schema-valid; how a consumer resolves one, and what it
2387
+ // does when it cannot, is that consumer's own contract. An artifact deliberately held
2388
+ // elsewhere belongs in externalEvidence[], which references it by URI and checksum without
2389
+ // retrieving it.
2390
+ URI string `json:"uri"`
2207
2391
  }
2208
2392
 
2209
2393
  // A reference to external native-format evidence (log/telemetry corpus or other artifact) carried
@@ -2211,43 +2395,43 @@ type ContentReference struct {
2211
2395
  // (corpora can be huge) or transcoded (that would be lossy) — it stays canonical in its native
2212
2396
  // format and HDF acts as the structured index.
2213
2397
  type ExternalEvidenceReference struct {
2214
- // Cryptographic checksum of the referenced artifact for integrity verification.
2398
+ // Cryptographic checksum of the referenced artifact for integrity verification.
2215
2399
  Checksum *Checksum `json:"checksum,omitempty"`
2216
- // Optional human-readable description of this evidence entry.
2400
+ // Optional human-readable description of this evidence entry.
2217
2401
  Description *string `json:"description,omitempty"`
2218
- // The native format discriminator of the referenced artifact.
2402
+ // The native format discriminator of the referenced artifact.
2219
2403
  Format string `json:"format"`
2220
- // Optional producer-declared version of the format (e.g. ECS '9.4.0', OCSF '1.8.0').
2221
- // Free-text and untrusted — HDF does not validate it against a registry.
2404
+ // Optional producer-declared version of the format (e.g. ECS '9.4.0', OCSF '1.8.0').
2405
+ // Free-text and untrusted — HDF does not validate it against a registry.
2222
2406
  FormatVersion *string `json:"formatVersion,omitempty"`
2223
- // Optional IANA media type describing the on-disk serialization, orthogonal to 'format'
2224
- // (the semantic standard). Examples: application/x-ndjson, application/json,
2225
- // application/vnd.apache.parquet, text/csv.
2407
+ // Optional IANA media type describing the on-disk serialization, orthogonal to 'format'
2408
+ // (the semantic standard). Examples: application/x-ndjson, application/json,
2409
+ // application/vnd.apache.parquet, text/csv.
2226
2410
  MediaType *string `json:"mediaType,omitempty"`
2227
- // Optional descriptive metadata about the referenced corpus. Does not affect integrity.
2411
+ // Optional descriptive metadata about the referenced corpus. Does not affect integrity.
2228
2412
  Metadata *ExternalEvidenceMetadata `json:"metadata,omitempty"`
2229
- // URI to the external native-format evidence artifact (log/telemetry corpus, etc.). Can be
2230
- // a relative path or absolute URL. The data stays canonical in its native format — HDF
2231
- // references it, never parses or transcodes it.
2413
+ // URI to the external native-format evidence artifact (log/telemetry corpus, etc.). Can be
2414
+ // a relative path or absolute URL. The data stays canonical in its native format — HDF
2415
+ // references it, never parses or transcodes it.
2232
2416
  URI string `json:"uri"`
2233
2417
  }
2234
2418
 
2235
2419
  // Descriptive metadata about a referenced external evidence corpus. Does not affect integrity.
2236
2420
  type ExternalEvidenceMetadata struct {
2237
- // The tool/pipeline that collected or produced the corpus. Example: 'aws-security-lake',
2238
- // 'elastic-agent'.
2421
+ // The tool/pipeline that collected or produced the corpus. Example: 'aws-security-lake',
2422
+ // 'elastic-agent'.
2239
2423
  Collector *string `json:"collector,omitempty"`
2240
- // Approximate number of records/events in the referenced corpus.
2424
+ // Approximate number of records/events in the referenced corpus.
2241
2425
  RecordCount *int64 `json:"recordCount,omitempty"`
2242
- // The time window the referenced evidence covers.
2426
+ // The time window the referenced evidence covers.
2243
2427
  TimeRange *ExternalEvidenceTimeRange `json:"timeRange,omitempty"`
2244
2428
  }
2245
2429
 
2246
2430
  // The time window a referenced external evidence corpus covers.
2247
2431
  type ExternalEvidenceTimeRange struct {
2248
- // End of the time window the corpus covers (ISO 8601).
2432
+ // End of the time window the corpus covers (ISO 8601).
2249
2433
  End *time.Time `json:"end,omitempty"`
2250
- // Start of the time window the corpus covers (ISO 8601).
2434
+ // Start of the time window the corpus covers (ISO 8601).
2251
2435
  Start *time.Time `json:"start,omitempty"`
2252
2436
  }
2253
2437
 
@@ -2259,61 +2443,61 @@ type ExternalEvidenceTimeRange struct {
2259
2443
  // before projection, and the full after requirement (the evidence a responder opens the event for).
2260
2444
  // Design: ADR-0005.
2261
2445
  type HDFRequirementChangeEvent struct {
2262
- // The full requirement as evaluated after the change — required and non-null for every
2263
- // state except absent (null there: the requirement left the assessment scope). Full content
2264
- // is load-bearing twice over: reassembly parity (applyChangeEvents cannot reproduce changed
2265
- // result content from a projection) and triage (the failing results[] ARE the 'why' a
2266
- // responder opens the event for).
2446
+ // The full requirement as evaluated after the change — required and non-null for every
2447
+ // state except absent (null there: the requirement left the assessment scope). Full content
2448
+ // is load-bearing twice over: reassembly parity (applyChangeEvents cannot reproduce changed
2449
+ // result content from a projection) and triage (the failing results[] ARE the 'why' a
2450
+ // responder opens the event for).
2267
2451
  After interface{} `json:"after"`
2268
- // Thin projection of the prior effective posture, for at-a-glance alerting without a
2269
- // state-store lookup. Null exactly when state is new (no prior posture exists). The full
2270
- // prior state is recoverable from the consumer's materialized state; the envelope's
2271
- // priorChecksum covers the integrity of that recovery.
2452
+ // Thin projection of the prior effective posture, for at-a-glance alerting without a
2453
+ // state-store lookup. Null exactly when state is new (no prior posture exists). The full
2454
+ // prior state is recoverable from the consumer's materialized state; the envelope's
2455
+ // priorChecksum covers the integrity of that recovery.
2272
2456
  Before interface{} `json:"before"`
2273
- // Why the state changed. An overrideExpired flip is a different triage than resultChanged:
2274
- // the control did not get worse, a waiver lapsed.
2457
+ // Why the state changed. An overrideExpired flip is a different triage than resultChanged:
2458
+ // the control did not get worse, a waiver lapsed.
2275
2459
  ChangeReasons []EventChangeReason `json:"changeReasons,omitempty"`
2276
- // Canonical requirement identifier — the same identity as Requirement_Diff.id and the
2277
- // requirement's id in hdf-results. Together with the envelope's (systemRef, componentId)
2278
- // this forms the durable entity key. A requirement renumbering is emitted as absent + new
2279
- // under the two keys, never an in-place key change; batch comparison reconciles renames via
2280
- // its oldId/newId matching.
2460
+ // Canonical requirement identifier — the same identity as Requirement_Diff.id and the
2461
+ // requirement's id in hdf-results. Together with the envelope's (systemRef, componentId)
2462
+ // this forms the durable entity key. A requirement renumbering is emitted as absent + new
2463
+ // under the two keys, never an in-place key change; batch comparison reconciles renames via
2464
+ // its oldId/newId matching.
2281
2465
  RequirementID string `json:"requirementId"`
2282
- // The producer-computable subset of Requirement_State: new | absent | updated | fixed |
2283
- // regressed. fixed and regressed carry the direction SARIF's baselineState lacks; project
2284
- // down to SARIF's closed 4 values for external interop.
2466
+ // The producer-computable subset of Requirement_State: new | absent | updated | fixed |
2467
+ // regressed. fixed and regressed carry the direction SARIF's baselineState lacks; project
2468
+ // down to SARIF's closed 4 values for external interop.
2285
2469
  State EventRequirementState `json:"state"`
2286
- // componentId of the system component this event concerns.
2470
+ // componentId of the system component this event concerns.
2287
2471
  ComponentID string `json:"componentId"`
2288
- // Identity of this event occurrence, unique per source. (source, eventId) is the
2289
- // deduplication key: consumers may treat events with identical source and eventId as
2290
- // duplicates. UUIDv7 (time-ordered) is recommended but not required.
2472
+ // Identity of this event occurrence, unique per source. (source, eventId) is the
2473
+ // deduplication key: consumers may treat events with identical source and eventId as
2474
+ // duplicates. UUIDv7 (time-ordered) is recommended but not required.
2291
2475
  EventID string `json:"eventId"`
2292
- // The effectiveChecksum of the entity state this event supersedes, forming a per-key hash
2293
- // chain: a mismatch or gap against stored state is detectable, letting a consumer mark the
2294
- // key unverified instead of serving stale posture.
2295
- //
2296
- // Null at chain start (no prior state, e.g. a new entity or the first event after a seed).
2297
- //
2298
- // The chain provides tamper/gap evidence given a trusted head; completeness is anchored
2299
- // out-of-band by periodic re-centering rescans.
2476
+ // The effectiveChecksum of the entity state this event supersedes, forming a per-key hash
2477
+ // chain: a mismatch or gap against stored state is detectable, letting a consumer mark the
2478
+ // key unverified instead of serving stale posture.
2479
+ //
2480
+ // Null at chain start (no prior state, e.g. a new entity or the first event after a seed).
2481
+ //
2482
+ // The chain provides tamper/gap evidence given a trusted head; completeness is anchored
2483
+ // out-of-band by periodic re-centering rescans.
2300
2484
  PriorChecksum interface{} `json:"priorChecksum"`
2301
- // The versioned schema $id this event validates against, so events self-describe on
2302
- // heterogeneous streams. Recommended on every wire event.
2485
+ // The versioned schema $id this event validates against, so events self-describe on
2486
+ // heterogeneous streams. Recommended on every wire event.
2303
2487
  SchemaRef *string `json:"schemaRef,omitempty"`
2304
- // Monotonically increasing sequence number per entity key. The ONLY ordering authority for
2305
- // folding: consumers keep the greatest sequence per key regardless of arrival order or
2306
- // timestamp. Deliberately per-entity-key (event-sourcing aggregate-version practice) rather
2307
- // than per-source.
2488
+ // Monotonically increasing sequence number per entity key. The ONLY ordering authority for
2489
+ // folding: consumers keep the greatest sequence per key regardless of arrival order or
2490
+ // timestamp. Deliberately per-entity-key (event-sourcing aggregate-version practice) rather
2491
+ // than per-source.
2308
2492
  Sequence int64 `json:"sequence"`
2309
- // URI identifying the producer context that emitted this event (for example, a scanner
2310
- // instance and profile). eventId uniqueness and sequence numbering are scoped per source.
2493
+ // URI identifying the producer context that emitted this event (for example, a scanner
2494
+ // instance and profile). eventId uniqueness and sequence numbering are scoped per source.
2311
2495
  Source string `json:"source"`
2312
- // URI to the hdf-system document (authorization boundary) this event applies to. Resolves
2313
- // to the latest version of the evolving system document.
2496
+ // URI to the hdf-system document (authorization boundary) this event applies to. Resolves
2497
+ // to the latest version of the evolving system document.
2314
2498
  SystemRef string `json:"systemRef"`
2315
- // Occurrence time of the observed change (RFC 3339, trimmed UTC). Display and audit
2316
- // metadata only — NEVER an ordering key; ordering is sequence's job.
2499
+ // Occurrence time of the observed change (RFC 3339, trimmed UTC). Display and audit
2500
+ // metadata only — NEVER an ordering key; ordering is sequence's job.
2317
2501
  Timestamp time.Time `json:"timestamp"`
2318
2502
  }
2319
2503
 
@@ -2336,8 +2520,14 @@ const (
2336
2520
  Username IdentityType = "username"
2337
2521
  )
2338
2522
 
2339
- // Supported cryptographic hash algorithms for checksums and integrity verification. blake3 covers
2340
- // container-image and other artifact digests that use it.
2523
+ // Cryptographic hash algorithms a checksum or integrity record may name. blake3 covers
2524
+ // container-image and other artifact digests that use it. HDF tooling verifies every algorithm in
2525
+ // this enum, so any of them may be recorded where the checksum needs to be verifiable. md5 and sha1
2526
+ // are excluded deliberately: a checksum or integrity record exists to detect tampering, and both
2527
+ // are collision-broken, so a digest in either would look verifiable while proving nothing. A source
2528
+ // tool digest in an excluded algorithm is not recorded as a checksum. Admitting weak hashes as an
2529
+ // application-level accept/reject decision was considered and rejected; widening this enum is a
2530
+ // schema decision, not an oversight.
2341
2531
  type HashAlgorithm string
2342
2532
 
2343
2533
  const (
@@ -2347,6 +2537,15 @@ const (
2347
2537
  Sha512 HashAlgorithm = "sha512"
2348
2538
  )
2349
2539
 
2540
+ // How an embedded copy's bytes are read back: 'utf-8' for text, 'base64' for anything that is not
2541
+ // valid UTF-8 text.
2542
+ type ExternalReferenceEncoding string
2543
+
2544
+ const (
2545
+ Base64 ExternalReferenceEncoding = "base64"
2546
+ UTF8 ExternalReferenceEncoding = "utf-8"
2547
+ )
2548
+
2350
2549
  // Comparison operator for evaluating the input value against observed values. Numeric:
2351
2550
  // eq/ne/lt/le/gt/ge. String: eq/ne/contains/matches. Collection: in/notIn.
2352
2551
  type ComparisonOperator string
@@ -2464,10 +2663,11 @@ const (
2464
2663
  // to 'notApplicable'. The disposition field on the requirement distinguishes false positives from
2465
2664
  // genuinely not-applicable findings. - 'riskAdjustment': impact score adjusted based on
2466
2665
  // environmental context (FedRAMP Risk Adjustment); does not change pass/fail status, only impact
2467
- // via the impact field. - 'operationalRequirement': deviation required by operational constraints
2468
- // (FedRAMP Operational Requirement); the finding cannot be remediated because the system requires
2469
- // the affected functionality. Remains an open risk. Migration note: 'exception' was removed in
2470
- // v3.1.0 — use 'waiver' with status 'notApplicable' instead.
2666
+ // via the impact field; a status on it is rejected by validation. - 'operationalRequirement':
2667
+ // deviation required by operational constraints (FedRAMP Operational Requirement); the finding
2668
+ // cannot be remediated because the system requires the affected functionality. Remains an open
2669
+ // risk. Migration note: 'exception' was removed in v3.1.0 — use 'waiver' with status
2670
+ // 'notApplicable' instead.
2471
2671
  type OverrideType string
2472
2672
 
2473
2673
  const (
@@ -2647,9 +2847,8 @@ const (
2647
2847
  ScannerNote AnnotationCategory = "scannerNote"
2648
2848
  )
2649
2849
 
2650
- // The state of this baseline in the comparison.
2651
- //
2652
- // The state of this component in the comparison.
2850
+ // How a baseline or component fared across the compared documents: new (only in the newer), absent
2851
+ // (only in the older), unchanged, or updated (present in both with a changed version).
2653
2852
  type BaselineDiffState string
2654
2853
 
2655
2854
  const (
@@ -2905,13 +3104,8 @@ func (x *Ref) MarshalJSON() ([]byte, error) {
2905
3104
  return marshalUnion(nil, nil, nil, x.String, x.AnythingMapArray != nil, x.AnythingMapArray, false, nil, false, nil, false, nil, false)
2906
3105
  }
2907
3106
 
2908
- // Content modality/kind of the data (CISA/G7 'Dataset content: modality'). Examples: text,
2909
- // image, tabular, timeseries, audio. DISTINCT from datasetFormat, which is the physical
2910
- // encoding (parquet/csv). Resolves SPDX 3.0 dataset_datasetType, which is content-kind, not
2911
- // physical format. String or array of strings.
2912
- //
2913
- // Input/output modalities. String or array of strings. Examples: text, image, audio.
2914
- // Symmetric with Dataset_Extension.modality.
3107
+ // A content modality such as text, image, audio, tabular or timeseries: one string, or a list when
3108
+ // the content spans several.
2915
3109
  type Modality struct {
2916
3110
  String *string
2917
3111
  StringArray []string