@mitre/hdf-schema 3.3.2 → 3.4.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
@@ -138,9 +138,6 @@ type HDFResults struct {
138
138
  }
139
139
 
140
140
  // Information on a baseline that was evaluated, including any findings.
141
- //
142
- // Shared metadata fields for baselines. Used in both standalone baseline documents and
143
- // evaluated baseline results.
144
141
  type EvaluatedBaseline struct {
145
142
  // The set of dependencies this baseline depends on.
146
143
  Depends []Dependency `json:"depends,omitempty"`
@@ -197,8 +194,7 @@ type EvaluatedBaseline struct {
197
194
  Version *string `json:"version,omitempty"`
198
195
  }
199
196
 
200
- // A dependency for a baseline. Can include relative paths or URLs for where to find the
201
- // dependency.
197
+ // A dependency for a baseline. Can include relative paths or URLs for where to find the dependency.
202
198
  type Dependency struct {
203
199
  // The branch name for a git repo.
204
200
  Branch *string `json:"branch,omitempty"`
@@ -232,9 +228,9 @@ type RequirementGroup struct {
232
228
  Title *string `json:"title,omitempty"`
233
229
  }
234
230
 
235
- // A typed input parameter that bridges governance requirements and scanner automation.
236
- // Inputs carry expected configuration values with type information, comparison operators,
237
- // and validation constraints, enabling traceability from policy through to scan results.
231
+ // A typed input parameter that bridges governance requirements and scanner automation. Inputs carry
232
+ // expected configuration values with type information, comparison operators, and validation
233
+ // constraints, enabling traceability from policy through to scan results.
238
234
  type Input struct {
239
235
  // Validation constraints for the input value.
240
236
  Constraints *InputConstraints `json:"constraints,omitempty"`
@@ -256,8 +252,6 @@ type Input struct {
256
252
  Value interface{} `json:"value,omitempty"`
257
253
  }
258
254
 
259
- // Validation constraints for the input value.
260
- //
261
255
  // Validation constraints for an input value.
262
256
  type InputConstraints struct {
263
257
  // Enumeration of permitted values.
@@ -270,27 +264,8 @@ type InputConstraints struct {
270
264
  Pattern *string `json:"pattern,omitempty"`
271
265
  }
272
266
 
273
- // Cryptographic integrity information for verifying this baseline has not been tampered
274
- // with.
275
- //
276
- // Cryptographic integrity information for verifying the HDF file has not been tampered
277
- // with. If algorithm is provided, checksum must also be provided, and vice versa.
278
- //
279
- // Cryptographic integrity information for verifying this file.
280
- //
281
- // Cryptographic integrity information for verifying this comparison document.
282
- //
283
- // Cryptographic integrity information for verifying this system document has not been
284
- // tampered with.
285
- //
286
- // Cryptographic integrity information for verifying this plan document has not been
287
- // tampered with.
288
- //
289
- // Cryptographic integrity information for verifying this amendments document has not been
290
- // tampered with.
291
- //
292
- // Cryptographic integrity information for verifying this evidence package has not been
293
- // tampered with.
267
+ // Cryptographic integrity information for verifying the HDF file has not been tampered with. If
268
+ // algorithm is provided, checksum must also be provided, and vice versa.
294
269
  type Integrity struct {
295
270
  // The hash algorithm used for the checksum.
296
271
  Algorithm *HashAlgorithm `json:"algorithm,omitempty"`
@@ -302,30 +277,7 @@ type Integrity struct {
302
277
  SignedBy *string `json:"signedBy,omitempty"`
303
278
  }
304
279
 
305
- // SHA-256 checksum of the original baseline definition file (before execution). This is an
306
- // immutable reference to the baseline as defined, used to detect tampering with baseline
307
- // requirements or metadata.
308
- //
309
280
  // Cryptographic checksum for baseline integrity verification.
310
- //
311
- // SHA-256 checksum of the previous amendment in chronological order. Creates a
312
- // tamper-evident chain of amendments (similar to blockchain). Null for the first amendment
313
- // on a requirement.
314
- //
315
- // SHA-256 checksum of the raw results before any amendments (statusOverrides or POAMs).
316
- // Used to detect tampering with test results. Compare with currentChecksum to verify
317
- // amendment integrity.
318
- //
319
- // Optional cryptographic checksum for verifying the integrity of remediation resources
320
- // fetched from the URI. Recommended for security when referencing external automation
321
- // scripts.
322
- //
323
- // Cryptographic checksum of the source document for integrity verification.
324
- //
325
- // Checksum of the prior amendment in the chain. Creates a tamper-evident linked list. Null
326
- // for the first amendment.
327
- //
328
- // Cryptographic checksum for verifying the referenced document's integrity.
329
281
  type Checksum struct {
330
282
  // The hash algorithm used for the checksum.
331
283
  Algorithm HashAlgorithm `json:"algorithm"`
@@ -334,9 +286,6 @@ type Checksum struct {
334
286
  }
335
287
 
336
288
  // A requirement that has been evaluated, including any findings.
337
- //
338
- // Core requirement fields shared between baseline requirements and evaluated requirements.
339
- // Contains the fundamental requirement definition without assessment results.
340
289
  type EvaluatedRequirement struct {
341
290
  // Packages affected by this vulnerability finding. Vulnerability-finding-scoped — see
342
291
  // components[] on hdf-system for component-level package inventories. One entry per matched
@@ -433,14 +382,13 @@ type EvaluatedRequirement struct {
433
382
  }
434
383
 
435
384
  // Represents a package referenced by a vulnerability finding or by an amendment's scope. On
436
- // Evaluated_Requirement.affectedPackages it says 'this CVE affects these package versions'.
437
- // On Standalone_Override.affectedPackages it says 'this amendment is scoped to these
438
- // packages' (used by VEX, OSCAL POA&M, FedRAMP component-aware amendments). NOT a
439
- // system-level component identifier — see `components[]` on hdf-system for those. Validity
440
- // requires at least one of: (name + version + ecosystem), purl alone, or cpe alone. purl
441
- // and cpe are self-describing identifiers that encode name/version implicitly, so either
442
- // may stand on its own; the name+version+ecosystem combination is the explicit form for
443
- // sources without formal identifiers.
385
+ // Evaluated_Requirement.affectedPackages it says 'this CVE affects these package versions'. On
386
+ // Standalone_Override.affectedPackages it says 'this amendment is scoped to these packages' (used
387
+ // by VEX, OSCAL POA&M, FedRAMP component-aware amendments). NOT a system-level component identifier
388
+ // — see `components[]` on hdf-system for those. Validity requires at least one of: (name + version
389
+ // + ecosystem), purl alone, or cpe alone. purl and cpe are self-describing identifiers that encode
390
+ // name/version implicitly, so either may stand on its own; the name+version+ecosystem combination
391
+ // is the explicit form for sources without formal identifiers.
444
392
  type AffectedPackage struct {
445
393
  // Optional CPE 2.3 URI identifying the affected product. Validated leniently: only the
446
394
  // 'cpe:2.3:' prefix and the part-type letter ('a' application, 'h' hardware, 'o' operating
@@ -469,16 +417,12 @@ type AffectedPackage struct {
469
417
  Version *string `json:"version,omitempty"`
470
418
  }
471
419
 
472
- // Structured CVSS scoring data backing this override. Captures the rubric (which
473
- // Environmental/Threat metrics the consumer modified, the recomputed score) used to justify
474
- // a riskAdjustment. For other override types this is optional context.
475
- //
476
- // A CVSS (Common Vulnerability Scoring System) score record for a vulnerability finding.
477
- // Captures the vendor-supplied Base metric group and optional consumer-supplied Threat,
478
- // Environmental, and Supplemental metric groups. Supports all four CVSS major versions
479
- // (2.0, 3.0, 3.1, 4.0). Vector strings are validated against a permissive umbrella grammar;
480
- // semantic validation (correct metrics per version, correct values per metric) is performed
481
- // by the hdf-utilities `validateCvssVector` helper rather than at the schema layer.
420
+ // A CVSS (Common Vulnerability Scoring System) score record for a vulnerability finding. Captures
421
+ // the vendor-supplied Base metric group and optional consumer-supplied Threat, Environmental, and
422
+ // Supplemental metric groups. Supports all four CVSS major versions (2.0, 3.0, 3.1, 4.0). Vector
423
+ // strings are validated against a permissive umbrella grammar; semantic validation (correct metrics
424
+ // per version, correct values per metric) is performed by the hdf-utilities `validateCvssVector`
425
+ // helper rather than at the schema layer.
482
426
  type Cvss struct {
483
427
  // The Base score (0.0–10.0) computed from the base vector. Reflects the intrinsic,
484
428
  // vendor-published severity before consumer enrichment.
@@ -532,13 +476,9 @@ type Description struct {
532
476
  Label string `json:"label"`
533
477
  }
534
478
 
535
- // FIRST.org EPSS (Exploit Prediction Scoring System) score for this CVE finding. Used
536
- // alongside CVSS for prioritization — captures the probability the vulnerability will be
537
- // exploited.
538
- //
539
- // FIRST.org Exploit Prediction Scoring System (EPSS) data for a single vulnerability. All
540
- // three fields are required when an Epss object is present; the date disambiguates which
541
- // day's score this is, since EPSS recomputes daily.
479
+ // FIRST.org Exploit Prediction Scoring System (EPSS) data for a single vulnerability. All three
480
+ // fields are required when an Epss object is present; the date disambiguates which day's score this
481
+ // is, since EPSS recomputes daily.
542
482
  type Epss struct {
543
483
  // ISO 8601 date (YYYY-MM-DD) on which FIRST.org published this EPSS score.
544
484
  Date string `json:"date"`
@@ -552,8 +492,8 @@ type Epss struct {
552
492
  Score float64 `json:"score"`
553
493
  }
554
494
 
555
- // Supporting evidence for a finding or override, such as screenshots, code samples, log
556
- // excerpts, or URLs.
495
+ // Supporting evidence for a finding or override, such as screenshots, code samples, log excerpts,
496
+ // or URLs.
557
497
  type Evidence struct {
558
498
  // Timestamp when this evidence was captured. ISO 8601 format.
559
499
  CapturedAt *time.Time `json:"capturedAt,omitempty"`
@@ -574,41 +514,8 @@ type Evidence struct {
574
514
  Type EvidenceType `json:"type"`
575
515
  }
576
516
 
577
- // Identity of who or what captured this evidence.
578
- //
579
- // Represents an identity that performed an action, such as capturing evidence or applying
580
- // an override.
581
- //
582
- // Identity of who created this POA&M. For simple cases, use type 'simple' with just an
583
- // identifier.
584
- //
585
- // Identity of who completed this milestone.
586
- //
587
- // The identity that created this signature.
588
- //
589
- // Identity of who applied this override. For simple cases, use type 'simple' with just an
590
- // identifier.
591
- //
592
- // Identity of the person or system that approved this override.
593
- //
594
- // Team or individual responsible for this component. Enables per-component ownership when
595
- // different teams manage different parts of a system.
596
- //
597
- // The identity of the person or system responsible for executing the test. This could be a
598
- // human auditor manually completing a checklist, an automated CI/CD system, or a security
599
- // tool. Optional field to support both automated and manual HDF generation.
600
- //
601
- // Team or individual responsible for this system's authorization and compliance. Maps to
602
- // OSCAL responsible-party with role 'system-owner'.
603
- //
604
- // Default identity of who created this amendments document. Individual overrides may
605
- // specify their own appliedBy.
606
- //
607
- // Identity of the authorizing official who approved these amendments.
608
- //
609
- // Identity of who applied this amendment.
610
- //
611
- // Identity of who prepared this evidence package.
517
+ // Represents an identity that performed an action, such as capturing evidence or applying an
518
+ // override.
612
519
  type Identity struct {
613
520
  // Optional description of the identity or identity system, particularly useful when type is
614
521
  // 'other'.
@@ -616,8 +523,12 @@ type Identity struct {
616
523
  // The identifier value. Example: 'user@example.com', 'jdoe', 'automated-scanner-01'.
617
524
  Identifier string `json:"identifier"`
618
525
  // The type of identifier. Use 'email' for email addresses, 'username' for user accounts,
619
- // 'system' for automated systems, 'simple' for basic string identifiers without additional
620
- // classification, or 'other' for custom identity systems.
526
+ // 'system' for deterministic non-interactive automation (CI jobs, cron, scanners), 'agent'
527
+ // for an AI/LLM agent acting with autonomy — kept distinct from 'system' so auditors can
528
+ // apply AI-specific scrutiny (e.g. 'an LLM proposed this' vs a deterministic job) and
529
+ // satisfy AI-source disclosure under frameworks like the EU AI Act and NIST AI RMF,
530
+ // 'simple' for basic string identifiers without additional classification, or 'other' for
531
+ // custom identity systems.
621
532
  Type IdentityType `json:"type"`
622
533
  }
623
534
 
@@ -682,21 +593,9 @@ type Milestone struct {
682
593
  Status MilestoneStatus `json:"status"`
683
594
  }
684
595
 
685
- // Optional digital signature for enhanced trust and non-repudiation.
686
- //
687
- // A digital signature following W3C Data Integrity Proofs pattern. Supports hardware
688
- // security tokens (PKCS#11/PKCS#12), Yubikeys, GPG keys, passkeys, and other cryptographic
689
- // signing methods via JWK, PEM, or Base58 key formats.
690
- //
691
- // Optional digital signature for enhanced trust and non-repudiation. Supports hardware
692
- // security tokens (PKCS#11/PKCS#12), Yubikeys, GPG keys, passkeys, and other signing
693
- // methods.
694
- //
695
- // Digital signature for non-repudiation.
696
- //
697
- // Document-level digital signature covering all amendments.
698
- //
699
- // Digital signature covering the entire evidence package.
596
+ // A digital signature following W3C Data Integrity Proofs pattern. Supports hardware security
597
+ // tokens (PKCS#11/PKCS#12), Yubikeys, GPG keys, passkeys, and other cryptographic signing methods
598
+ // via JWK, PEM, or Base58 key formats.
700
599
  type Signature struct {
701
600
  // Challenge value from the verifier, used in challenge-response authentication.
702
601
  Challenge *string `json:"challenge,omitempty"`
@@ -720,10 +619,8 @@ type Signature struct {
720
619
  VerificationMethod VerificationMethod `json:"verificationMethod"`
721
620
  }
722
621
 
723
- // The verification method containing the public key for signature verification.
724
- //
725
- // Verification method containing the public key needed to verify a digital signature.
726
- // Supports multiple key formats including JWK (for RSA, EC), PEM, and Base58.
622
+ // Verification method containing the public key needed to verify a digital signature. Supports
623
+ // multiple key formats including JWK (for RSA, EC), PEM, and Base58.
727
624
  type VerificationMethod struct {
728
625
  // The entity that controls this verification method. Can be a DID, URI, or other identifier.
729
626
  Controller string `json:"controller"`
@@ -740,12 +637,6 @@ type VerificationMethod struct {
740
637
  }
741
638
 
742
639
  // A reference to an external document.
743
- //
744
- // A reference using the 'ref' field.
745
- //
746
- // A URL pointing at the reference.
747
- //
748
- // A URI pointing at the reference.
749
640
  type Reference struct {
750
641
  Ref *Ref `json:"ref,omitempty"`
751
642
  URL *string `json:"url,omitempty"`
@@ -776,8 +667,6 @@ type RequirementResult struct {
776
667
  Status ResultStatus `json:"status"`
777
668
  }
778
669
 
779
- // The explicit location of the requirement within the source code.
780
- //
781
670
  // The explicit location of a requirement within source code.
782
671
  type SourceLocation struct {
783
672
  // The line on which this requirement is located.
@@ -786,9 +675,9 @@ type SourceLocation struct {
786
675
  Ref *string `json:"ref,omitempty"`
787
676
  }
788
677
 
789
- // An intentional change to a requirement's compliance status and/or impact score. At least
790
- // one of status or impact must be set. Overrides change the effectiveStatus or impact of
791
- // the requirement. All overrides must have an expiration date to enforce periodic review.
678
+ // An intentional change to a requirement's compliance status and/or impact score. At least one of
679
+ // status or impact must be set. Overrides change the effectiveStatus or impact of the requirement.
680
+ // All overrides must have an expiration date to enforce periodic review.
792
681
  type StatusOverride struct {
793
682
  // Timestamp when this override was applied. ISO 8601 format.
794
683
  AppliedAt time.Time `json:"appliedAt"`
@@ -830,11 +719,8 @@ type StatusOverride struct {
830
719
  Type OverrideType `json:"type"`
831
720
  }
832
721
 
833
- // Override to the requirement's impact score. At least one of status or impact must be
834
- // set.
835
- //
836
- // An override to the requirement's impact score. The prior impact is the original result
837
- // value or the preceding override in the chain.
722
+ // An override to the requirement's impact score. The prior impact is the original result value or
723
+ // the preceding override in the chain.
838
724
  type ImpactOverride struct {
839
725
  // The overridden impact score (0.0–1.0).
840
726
  Value float64 `json:"value"`
@@ -852,36 +738,16 @@ type SupportedPlatform struct {
852
738
  Release *string `json:"release,omitempty"`
853
739
  }
854
740
 
855
- // A system component. Uses discriminated union pattern with 'type' field as discriminator.
856
- // Superset of Target with identity, external IDs, and SBOM support.
857
- //
858
- // A physical or virtual server, workstation, or network device.
859
- //
860
- // Base properties shared by all component types. Extends the Target concept with stable
861
- // identity, external references, and SBOM embedding.
862
- //
863
- // A static container image (not running).
864
- //
865
- // A running container instance.
866
- //
867
- // A container orchestration platform (Kubernetes, OpenShift, ECS, etc.).
868
- //
869
- // A cloud provider account (AWS account, Azure subscription, GCP project).
870
- //
871
- // A specific cloud resource (EC2 instance, S3 bucket, Azure VM, etc.).
872
- //
873
- // A code repository (for SAST tools).
874
- //
875
- // A running application or API (for DAST tools).
876
- //
877
- // A software artifact or dependency (for SCA tools).
878
- //
879
- // A network segment or network device.
880
- //
881
- // A database instance.
741
+ // A system component. Uses discriminated union pattern with 'type' field as discriminator. Superset
742
+ // of Target with identity, external IDs, and SBOM support.
882
743
  type Component struct {
883
744
  // Names of baselines that apply to this component.
884
745
  BaselineRefs []string `json:"baselineRefs,omitempty"`
746
+ // Component-scoped Bills of Materials (SBOM, ai-model, dataset, or any reserved bomType),
747
+ // each carried by passthrough (ref/document) or normalized. Replaces the former
748
+ // sbom/sbomRef/sbomFormat trio; a component may carry several BOMs (e.g. an SBOM plus an
749
+ // ai-model BOM). See primitives/bom.schema.json.
750
+ Boms []BillOfMaterials `json:"boms,omitempty"`
885
751
  // Stable UUID (RFC 4122) for this component. Required in hdf-system documents, optional in
886
752
  // hdf-results. Enables cross-document correlation, diffing, and data flow references.
887
753
  ComponentID *string `json:"componentId,omitempty"`
@@ -893,6 +759,13 @@ type Component struct {
893
759
  ExternalIDS map[string]string `json:"externalIds,omitempty"`
894
760
  // System-specific overrides for baseline input values.
895
761
  InputOverrides []InputOverride `json:"inputOverrides,omitempty"`
762
+ // Cryptographic integrity of this component's underlying artifact — model weights or
763
+ // shards, dataset archive, container image, or package bytes. An array supports
764
+ // multi-file/sharded artifacts. This is the single, generic home for artifact/subject
765
+ // integrity across all component types (it replaced the former per-type Container_Image
766
+ // digest and Artifact checksum fields). Distinct from BOM-document integrity (Bom.hashes[])
767
+ // and from the document tamper-evidence Integrity type.
768
+ Integrity []Checksum `json:"integrity,omitempty"`
896
769
  // Optional key-value labels for flexible grouping. Well-known keys: system, component,
897
770
  // environment, region, team. Values must be strings.
898
771
  Labels map[string]string `json:"labels,omitempty"`
@@ -901,21 +774,27 @@ type Component struct {
901
774
  // Team or individual responsible for this component. Enables per-component ownership when
902
775
  // different teams manage different parts of a system.
903
776
  Owner *Identity `json:"owner,omitempty"`
904
- // Embedded CycloneDX or SPDX SBOM document representing this component's software
905
- // inventory. The sbomFormat field determines which format constraints apply.
906
- Sbom interface{} `json:"sbom,omitempty"`
907
- // Format of the SBOM (embedded or referenced). Required when sbom or sbomRef is present.
908
- SbomFormat *SBOMFormat `json:"sbomFormat,omitempty"`
909
- // URI reference to an external CycloneDX or SPDX SBOM document for this component. May be a
910
- // relative path, absolute URI, or fragment identifier.
911
- SbomRef *string `json:"sbomRef,omitempty"`
912
777
  // Label selector to match targets belonging to this component during migration. Targets
913
778
  // with matching labels are automatically included.
914
779
  TargetSelector map[string]string `json:"targetSelector,omitempty"`
915
- // Component type discriminator. Same values as Target types.
780
+ // Component type discriminator. Same values as Target types, plus aiModel and dataset (thin
781
+ // AI subject components whose detail lives in an attached ai-model / dataset BOM).
916
782
  Type TargetType `json:"type"`
917
- // Fully qualified domain name.
783
+ // Directory domain the host is a member of — Active Directory / NetBIOS / LDAP domain (ECS
784
+ // host.domain semantics), NOT necessarily the DNS suffix of the FQDN. A standalone or
785
+ // workgroup host has a hostname but no domain. Not derivable from the FQDN; populate only
786
+ // from a source that carries directory membership.
787
+ Domain *string `json:"domain,omitempty"`
788
+ // Fully qualified domain name (e.g. 'web01.prod.example.com'). Distinct from 'hostname'
789
+ // (short) and 'domain' (directory domain). ECS recommends storing this lowercase; the
790
+ // schema does not enforce case so source fidelity is preserved on round-trip.
918
791
  FQDN *string `json:"fqdn,omitempty"`
792
+ // Short, OS-reported host name (the unqualified machine name, e.g. 'web01'). Kept distinct
793
+ // from 'fqdn' because an FQDN is not reliably decomposable into hostname + domain
794
+ // (standalone/workgroup hosts have no domain; a directory domain is not the FQDN's DNS
795
+ // suffix). Aligns with ECS host.hostname and DISA STIG CKL HOST_NAME. Store the short name
796
+ // the source reports; do not derive it from the FQDN.
797
+ Hostname *string `json:"hostname,omitempty"`
919
798
  // IP address of the host.
920
799
  IPAddress *string `json:"ipAddress,omitempty"`
921
800
  // MAC address in colon-separated hexadecimal format.
@@ -924,8 +803,6 @@ type Component struct {
924
803
  OSName *string `json:"osName,omitempty"`
925
804
  // Operating system version.
926
805
  OSVersion *string `json:"osVersion,omitempty"`
927
- // Image digest for immutable reference.
928
- Digest *string `json:"digest,omitempty"`
929
806
  // Container image ID.
930
807
  ImageID *string `json:"imageId,omitempty"`
931
808
  // Container registry. Example: 'docker.io'.
@@ -953,6 +830,11 @@ type Component struct {
953
830
  // Package version.
954
831
  //
955
832
  // Database version.
833
+ //
834
+ // Model version, revision, or checkpoint tag.
835
+ //
836
+ // Dataset version, release identifier, or — for highly dynamic datasets — a timestamped
837
+ // release marker.
956
838
  Version *string `json:"version,omitempty"`
957
839
  // Cloud account identifier.
958
840
  AccountID *string `json:"accountId,omitempty"`
@@ -978,8 +860,6 @@ type Component struct {
978
860
  URL *string `json:"url,omitempty"`
979
861
  // Environment. Example: 'production', 'staging', 'development'.
980
862
  Environment *string `json:"environment,omitempty"`
981
- // Package checksum for verification.
982
- Checksum *string `json:"checksum,omitempty"`
983
863
  // Package manager. Example: 'npm', 'maven', 'pip', 'nuget'.
984
864
  PackageManager *string `json:"packageManager,omitempty"`
985
865
  // Package name.
@@ -994,10 +874,190 @@ type Component struct {
994
874
  Host *string `json:"host,omitempty"`
995
875
  // Database port.
996
876
  Port *int64 `json:"port,omitempty"`
997
- }
998
-
999
- // An override of a baseline input value for a specific component. Enables system-specific
1000
- // tailoring of baseline parameters.
877
+ // Provider/registry identifier for the model. Examples: a Hugging Face repo id
878
+ // ('meta-llama/Llama-2-7b-hf') or a model purl. Correlates the component to its ai-model
879
+ // BOM(s) and to lineage references from other models.
880
+ ModelID *string `json:"modelId,omitempty"`
881
+ // Provider/registry identifier for the dataset. Examples: a Hugging Face dataset repo id
882
+ // ('HuggingFaceH4/ultrachat_200k'), a DOI, or a dataset purl. Correlates the component to
883
+ // its dataset BOM(s) and to datasetRefs from ai-model components.
884
+ DatasetID *string `json:"datasetId,omitempty"`
885
+ }
886
+
887
+ type BillOfMaterials struct {
888
+ // The manifest kind. Determines which normalized type-extension (model/dataset/packages)
889
+ // may appear.
890
+ BOMType string `json:"bomType"`
891
+ // Normalized dataset extension. Permitted only when bomType is dataset.
892
+ Dataset *DatasetBOMExtension `json:"dataset,omitempty"`
893
+ // Passthrough by embedding: the native manifest carried opaquely (e.g. a raw CycloneDX or
894
+ // SPDX object). HDF does not constrain its internal shape — full manifest validation is a
895
+ // tool-level concern.
896
+ Document map[string]interface{} `json:"document,omitempty"`
897
+ // Source manifest format the BOM was produced from or references. Examples: cyclonedx,
898
+ // cyclonedx-ml, spdx, spdx-ai, huggingface, croissant. Free-form so new formats need no
899
+ // schema change; the converter that emits the BOM owns the value.
900
+ Format string `json:"format"`
901
+ // Integrity of the carried BOM *document* itself (the referenced/embedded manifest file),
902
+ // NOT the integrity of the BOM's subject artifact. Subject/artifact integrity (model
903
+ // weights, dataset archive) is a component-level concern, not carried here. Subject
904
+ // identity is inherited from the host component/system; per-node identity lives in the
905
+ // type-extension.
906
+ Hashes []Checksum `json:"hashes,omitempty"`
907
+ // Optional license of the BOM document as a whole (SPDX license expression). Nullable and
908
+ // often meaningless (CBOM algorithms, many HBOM parts have no license); per-node licenses
909
+ // live in the type-extension, not here.
910
+ License *string `json:"license,omitempty"`
911
+ // Normalized ai-model extension. Permitted only when bomType is ai-model.
912
+ Model *AIModelBOMExtension `json:"model,omitempty"`
913
+ // Normalized sbom extension: the flattened software package inventory. Permitted only when
914
+ // bomType is sbom.
915
+ Packages []SBOMPackage `json:"packages,omitempty"`
916
+ // Passthrough by reference: URI (relative path, absolute URI, or fragment) to the native
917
+ // manifest document. Present for externally-hosted BOMs.
918
+ Ref *string `json:"ref,omitempty"`
919
+ // Optional stable identifier for this BOM document (e.g. CycloneDX serialNumber, SPDX
920
+ // documentNamespace). Correlates the same BOM across evidence packages.
921
+ UniqueID *string `json:"uniqueId,omitempty"`
922
+ }
923
+
924
+ // Normalized dataset fields (SPDX 3.0 Dataset profile / MLCommons Croissant aligned). All optional;
925
+ // open for partial-fidelity passthrough of unmapped native fields. Symmetric with
926
+ // AI_Model_Extension: carries the dataset's own lineage (baseDatasetRefs/derivation) just as the
927
+ // model extension carries baseModelRef/adaptationType.
928
+ type DatasetBOMExtension struct {
929
+ // References to the source dataset(s) this one was derived from — a dataset componentId, or
930
+ // a dataset BOM uniqueId/URI when no component exists. The lineage edge parallel to
931
+ // ai-model's baseModelRef; the base dataset may carry its own dataset BOM.
932
+ BaseDatasetRefs []string `json:"baseDatasetRefs,omitempty"`
933
+ // Sensitivity/classification of the data. Examples: public, internal, confidential, pii,
934
+ // phi.
935
+ DataClassification *string `json:"dataClassification,omitempty"`
936
+ // Physical format of the dataset. Examples: parquet, csv, jsonl, tfrecord, webdataset.
937
+ DatasetFormat *string `json:"datasetFormat,omitempty"`
938
+ // Relationship of this dataset to baseDatasetRefs, parallel to the model extension's
939
+ // adaptationType. Minimal + extensible: filtered (subset by rule), augmented
940
+ // (added/synthesized records), merged (union of sources), sampled (statistical draw).
941
+ Derivation *DatasetDerivationType `json:"derivation,omitempty"`
942
+ // Free-text statement of the dataset's intended use (CISA/G7 minimum element).
943
+ IntendedUse *string `json:"intendedUse,omitempty"`
944
+ // Content modality/kind of the data (CISA/G7 'Dataset content: modality'). Examples: text,
945
+ // image, tabular, timeseries, audio. DISTINCT from datasetFormat, which is the physical
946
+ // encoding (parquet/csv). Resolves SPDX 3.0 dataset_datasetType, which is content-kind, not
947
+ // physical format. String or array of strings.
948
+ Modality *Modality `json:"modality,omitempty"`
949
+ // Free-text description of the dataset's origin and collection process (CISA/G7 'Dataset
950
+ // provenance'; SPDX 3.0 dataset_dataCollectionProcess).
951
+ Provenance *string `json:"provenance,omitempty"`
952
+ // Number of records/examples in the dataset.
953
+ RecordCount *int64 `json:"recordCount,omitempty"`
954
+ // Free-text summary of the dataset's statistical properties (CISA/G7 minimum element;
955
+ // open-ended by design). Intentionally free-text and will remain so permanently:
956
+ // recordCount is the one structured statistic, and restructuring this into an object later
957
+ // would break existing consumers, so it stays a string (additive-only).
958
+ StatisticalProperties *string `json:"statisticalProperties,omitempty"`
959
+ }
960
+
961
+ // Normalized AI-model fields, aligned to the CISA/G7 'SBOM for AI' minimum elements. All fields
962
+ // optional (standards-correct; only the EU AI Act makes a subset binding for high-risk/GPAI). Left
963
+ // open (additionalProperties: true) so a converter can carry unmapped native fields opaquely
964
+ // (partial-fidelity pattern). Subject name/version are inherited from the host aiModel component,
965
+ // not repeated here.
966
+ type AIModelBOMExtension struct {
967
+ // Lineage relationship to baseModelRef, adopting Hugging Face's base_model_relation
968
+ // vocabulary (the only typed lineage enum in the ecosystem).
969
+ AdaptationType *ModelAdaptationType `json:"adaptationType,omitempty"`
970
+ // Reference to the base model this one was adapted from (e.g. a Hugging Face repo id or
971
+ // purl). Correlates the lineage edge; the base model itself may carry its own ai-model BOM.
972
+ BaseModelRef *string `json:"baseModelRef,omitempty"`
973
+ // References to the training/evaluation datasets this model was produced from — preferably
974
+ // a dataset component's componentId (correlating to a first-class dataset subject rather
975
+ // than duplicating dataset detail, per ADR §10), or a dataset BOM uniqueId/URI when no
976
+ // component exists.
977
+ DatasetRefs []string `json:"datasetRefs,omitempty"`
978
+ // Training hyper-parameters as name/value pairs (epochs, learning-rate, batch-size). This
979
+ // is the set of training knobs, NOT the model's trainable parameterCount — the two are
980
+ // routinely conflated. CISA/G7 'Model properties: hyper-parameters'; SPDX 3.0
981
+ // ai_hyperparameter.
982
+ Hyperparameters []Hyperparameter `json:"hyperparameters,omitempty"`
983
+ // Model input/output properties (CISA/G7 minimum element): I/O data types, modality,
984
+ // context/sequence length, and tokenizer. Sourced from CycloneDX
985
+ // modelParameters.inputs[].format / outputs[].format. All sub-fields optional.
986
+ InputOutput *InputOutput `json:"inputOutput,omitempty"`
987
+ // Free-text statement of intended use and out-of-scope uses (CISA/G7 minimum element).
988
+ IntendedUse *string `json:"intendedUse,omitempty"`
989
+ // Model's learning/training paradigm. Free-text because the value set varies across
990
+ // standards. Examples: supervised, self-supervised, semi-supervised, reinforcement.
991
+ // Cross-standard intersection: SPDX 3.0 ai_typeOfModel ∩ CycloneDX
992
+ // modelParameters.approach.type ∩ CISA/G7 learning type.
993
+ LearningApproach *string `json:"learningApproach,omitempty"`
994
+ // Model architecture family. Examples: transformer, cnn, diffusion, mixture-of-experts.
995
+ ModelArchitecture *string `json:"modelArchitecture,omitempty"`
996
+ // Total trainable parameter count. No native CycloneDX/SPDX field exists; first-class here
997
+ // because the EU AI Act keys GPAI obligations off model scale.
998
+ ParameterCount *int64 `json:"parameterCount,omitempty"`
999
+ // Reported evaluation metrics as name/value pairs. Values are free-text because metrics are
1000
+ // heterogeneous (accuracy, f1, BLEU, latency). The item stays open (additionalProperties:
1001
+ // true) to carry native CycloneDX slice/confidenceInterval detail opaquely. Cross-standard
1002
+ // intersection: SPDX 3.0 ai_metric ∩ CycloneDX quantitativeAnalysis.performanceMetrics ∩
1003
+ // CISA/G7 KPI cluster.
1004
+ PerformanceMetrics []PerformanceMetric `json:"performanceMetrics,omitempty"`
1005
+ // On-disk weight serialization format. Security-critical yet under-modeled by BOM specs:
1006
+ // pickle/pytorch permits arbitrary code execution on load; safetensors does not. Examples:
1007
+ // safetensors, pytorch, gguf, onnx, tensorflow.
1008
+ SerializationFormat *string `json:"serializationFormat,omitempty"`
1009
+ // The ML task the model performs. Free-text. Examples: text-classification,
1010
+ // sentiment-analysis, object-detection, translation. Sourced from CycloneDX
1011
+ // modelParameters.task (SPDX 3.0 ai_domain is domain-level/adjacent, not the task); CISA/G7
1012
+ // intended-application.
1013
+ Task *string `json:"task,omitempty"`
1014
+ }
1015
+
1016
+ type Hyperparameter struct {
1017
+ // Hyper-parameter name. Examples: epochs, learning-rate, batch-size.
1018
+ Name *string `json:"name,omitempty"`
1019
+ // Hyper-parameter value (free-text).
1020
+ Value *string `json:"value,omitempty"`
1021
+ }
1022
+
1023
+ // Model input/output properties (CISA/G7 minimum element): I/O data types, modality,
1024
+ // context/sequence length, and tokenizer. Sourced from CycloneDX
1025
+ // modelParameters.inputs[].format / outputs[].format. All sub-fields optional.
1026
+ type InputOutput struct {
1027
+ // Maximum context/sequence length the model accepts, in tokens.
1028
+ ContextLength *int64 `json:"contextLength,omitempty"`
1029
+ // Input/output data types. Examples: string, byte[], float32, image.
1030
+ DataTypes []string `json:"dataTypes,omitempty"`
1031
+ // Input/output modalities. String or array of strings. Examples: text, image, audio.
1032
+ // Symmetric with Dataset_Extension.modality.
1033
+ Modality *Modality `json:"modality,omitempty"`
1034
+ // Tokenizer used for the model's input encoding. Examples: BPE, SentencePiece, tiktoken.
1035
+ Tokenizer *string `json:"tokenizer,omitempty"`
1036
+ }
1037
+
1038
+ type PerformanceMetric struct {
1039
+ // Metric name. Examples: accuracy, f1, BLEU, latency.
1040
+ Name *string `json:"name,omitempty"`
1041
+ // Reported metric value, free-text because metrics are heterogeneous (percentages, scores,
1042
+ // milliseconds).
1043
+ Value *string `json:"value,omitempty"`
1044
+ }
1045
+
1046
+ // A single normalized software package entry within an sbom BOM. Minimal identity + version for
1047
+ // querying/diffing; the full native record remains available via passthrough (document/ref).
1048
+ type SBOMPackage struct {
1049
+ // SPDX license identifiers/expressions for this package.
1050
+ Licenses []string `json:"licenses,omitempty"`
1051
+ // Package name.
1052
+ Name string `json:"name"`
1053
+ // Package URL (purl) — the preferred cross-BOM identity key when present.
1054
+ Purl *string `json:"purl,omitempty"`
1055
+ // Package version.
1056
+ Version *string `json:"version,omitempty"`
1057
+ }
1058
+
1059
+ // An override of a baseline input value for a specific component. Enables system-specific tailoring
1060
+ // of baseline parameters.
1001
1061
  type InputOverride struct {
1002
1062
  // Identity of the person or system that approved this override.
1003
1063
  ApprovedBy *Identity `json:"approvedBy,omitempty"`
@@ -1012,19 +1072,7 @@ type InputOverride struct {
1012
1072
  Value interface{} `json:"value"`
1013
1073
  }
1014
1074
 
1015
- // Information about the tool that generated this file.
1016
- //
1017
1075
  // Information about the tool that generated this HDF file.
1018
- //
1019
- // The tool that generated this file.
1020
- //
1021
- // Information about the tool that generated this comparison.
1022
- //
1023
- // Information about the tool that generated this system document.
1024
- //
1025
- // Information about the tool that generated this plan.
1026
- //
1027
- // Information about the tool that generated this document.
1028
1076
  type Generator struct {
1029
1077
  // The name of the software that produced this HDF file. Example: 'gosec-to-hdf'.
1030
1078
  Name string `json:"name"`
@@ -1032,15 +1080,9 @@ type Generator struct {
1032
1080
  Version string `json:"version"`
1033
1081
  }
1034
1082
 
1035
- // Optional reference to automated remediation resources (Ansible playbooks, Terraform
1036
- // scripts, etc.) for fixing failing requirements found in this assessment.
1037
- //
1038
- // Reference to automated remediation resources for implementing security controls. Points
1039
- // to external automation content like Ansible playbooks, Terraform scripts, or
1040
- // vendor-provided remediation tools.
1041
- //
1042
- // Optional reference to automated remediation resources (Ansible playbooks, Terraform
1043
- // scripts, etc.) for implementing the security controls defined in this baseline.
1083
+ // Reference to automated remediation resources for implementing security controls. Points to
1084
+ // external automation content like Ansible playbooks, Terraform scripts, or vendor-provided
1085
+ // remediation tools.
1044
1086
  type Remediation struct {
1045
1087
  // Optional cryptographic checksum for verifying the integrity of remediation resources
1046
1088
  // fetched from the URI. Recommended for security when referencing external automation
@@ -1052,12 +1094,8 @@ type Remediation struct {
1052
1094
  URI string `json:"uri"`
1053
1095
  }
1054
1096
 
1055
- // Information about the test execution environment where the security tool was run.
1056
- // Distinct from targets (what is being tested).
1057
- //
1058
- // Information about the test execution environment. This is distinct from the target being
1059
- // scanned - the runner is where the security tool executes, while targets are what is being
1060
- // assessed.
1097
+ // Information about the test execution environment. This is distinct from the target being scanned
1098
+ // - the runner is where the security tool executes, while targets are what is being assessed.
1061
1099
  type Runner struct {
1062
1100
  // The CPU architecture of the runner system. Example: 'x86_64', 'arm64', 'aarch64'.
1063
1101
  Architecture *string `json:"architecture,omitempty"`
@@ -1067,7 +1105,14 @@ type Runner struct {
1067
1105
  // The container image used for the test execution. Example: 'inspec/inspec:latest',
1068
1106
  // 'ghcr.io/my-org/scanner:v2.1.0'. Useful for CI/CD pipelines where tests run in containers.
1069
1107
  ContainerImage *string `json:"containerImage,omitempty"`
1070
- // The hostname of the runner system. Example: 'ci-runner-01', 'jenkins-agent-03',
1108
+ // The directory domain the runner system belongs to (Active Directory / NetBIOS / LDAP),
1109
+ // NOT the DNS suffix of the FQDN. Example: 'CORP'.
1110
+ Domain *string `json:"domain,omitempty"`
1111
+ // The fully qualified domain name of the runner system, when known. Distinct from the short
1112
+ // 'hostname'; kept separate for the same reason as on host components (an FQDN is not
1113
+ // reliably decomposable). Example: 'ci-runner-01.build.example.com'.
1114
+ FQDN *string `json:"fqdn,omitempty"`
1115
+ // The short hostname of the runner system. Example: 'ci-runner-01', 'jenkins-agent-03',
1071
1116
  // 'k8s-node-worker-03'.
1072
1117
  Hostname *string `json:"hostname,omitempty"`
1073
1118
  // The name of the runner environment. Examples: 'ubuntu', 'macos', 'windows', 'docker',
@@ -1081,8 +1126,6 @@ type Runner struct {
1081
1126
  Release *string `json:"release,omitempty"`
1082
1127
  }
1083
1128
 
1084
- // Statistics for the assessment run, including duration and result counts.
1085
- //
1086
1129
  // Statistics for the assessment run(s) such as duration and result counts.
1087
1130
  type Statistics struct {
1088
1131
  // How long (in seconds) this assessment run took.
@@ -1091,8 +1134,6 @@ type Statistics struct {
1091
1134
  Requirements *StatisticHash `json:"requirements,omitempty"`
1092
1135
  }
1093
1136
 
1094
- // Breakdowns of requirement statistics by result status.
1095
- //
1096
1137
  // Statistics for requirement results, grouped by status.
1097
1138
  type StatisticHash struct {
1098
1139
  // Statistics for requirements that encountered an error during assessment.
@@ -1107,28 +1148,14 @@ type StatisticHash struct {
1107
1148
  Passed *StatisticBlock `json:"passed,omitempty"`
1108
1149
  }
1109
1150
 
1110
- // Statistics for requirements that encountered an error during assessment.
1111
- //
1112
1151
  // Statistics for a given item, such as the total count.
1113
- //
1114
- // Statistics for requirements that failed.
1115
- //
1116
- // Statistics for requirements that are not applicable to the target.
1117
- //
1118
- // Statistics for requirements that were not reviewed (manual check required).
1119
- //
1120
- // Statistics for requirements that passed.
1121
1152
  type StatisticBlock struct {
1122
1153
  // The total count. Example: the total number of requirements in a given category for a run.
1123
1154
  Total int64 `json:"total"`
1124
1155
  }
1125
1156
 
1126
- // The security tool that produced the assessment data in this file.
1127
- //
1128
- // The security tool that produced the assessment data represented in this HDF file. Aligns
1129
- // with SARIF, OSCAL, and CycloneDX terminology.
1130
- //
1131
- // The security tool that produced the assessment data in this source.
1157
+ // The security tool that produced the assessment data represented in this HDF file. Aligns with
1158
+ // SARIF, OSCAL, and CycloneDX terminology.
1132
1159
  type Tool struct {
1133
1160
  // The file format, if it is a recognized named format shared by multiple tools. Examples:
1134
1161
  // 'SARIF', 'XCCDF'. Omit for tool-specific formats where the tool name already implies the
@@ -1141,11 +1168,8 @@ type Tool struct {
1141
1168
  Version *string `json:"version,omitempty"`
1142
1169
  }
1143
1170
 
1144
- // Information on the set of requirements that can be assessed, including baseline metadata
1145
- // and requirement definitions.
1146
- //
1147
- // Shared metadata fields for baselines. Used in both standalone baseline documents and
1148
- // evaluated baseline results.
1171
+ // Information on the set of requirements that can be assessed, including baseline metadata and
1172
+ // requirement definitions.
1149
1173
  type HDFBaseline struct {
1150
1174
  // The set of dependencies this baseline depends on.
1151
1175
  Depends []Dependency `json:"depends,omitempty"`
@@ -1189,9 +1213,6 @@ type HDFBaseline struct {
1189
1213
  }
1190
1214
 
1191
1215
  // A requirement definition without assessment results.
1192
- //
1193
- // Core requirement fields shared between baseline requirements and evaluated requirements.
1194
- // Contains the fundamental requirement definition without assessment results.
1195
1216
  type BaselineRequirement struct {
1196
1217
  // Array of labeled descriptions. At least one description with label 'default' must be
1197
1218
  // present. Convention: place default description first. Common labels: 'default', 'check',
@@ -1240,42 +1261,47 @@ type BaselineRequirement struct {
1240
1261
  VerificationMethod *VerificationMethodEnum `json:"verificationMethod,omitempty"`
1241
1262
  }
1242
1263
 
1243
- // Structured comparison between two or more HDF security assessment documents. Supports
1244
- // temporal, baseline, fleet, and multi-source comparison modes.
1264
+ // Structured comparison between two or more HDF security assessment documents. Supports temporal,
1265
+ // baseline, fleet, and multi-source comparison modes.
1245
1266
  type HDFComparison struct {
1246
- // Map of annotation IDs to annotation objects, providing context or action items for
1247
- // requirement diffs.
1248
- Annotations map[string]Annotation `json:"annotations,omitempty"`
1249
- // Comparison of baselines between sources.
1250
- BaselineDiffs []BaselineDiff `json:"baselineDiffs,omitempty"`
1251
- // The mode of comparison being performed.
1252
- ComparisonMode ComparisonMode `json:"comparisonMode"`
1253
- // Comparison of components between two system documents. Used in systemDrift mode.
1254
- ComponentDiffs []ComponentDiff `json:"componentDiffs,omitempty"`
1255
- // External/metadata changes separate from status changes (Terraform pattern).
1256
- Drift []RequirementDiff `json:"drift,omitempty"`
1257
- // Reserved for tool-specific data not defined in the HDF standard.
1258
- Extensions map[string]interface{} `json:"extensions,omitempty"`
1259
- // Schema version for this comparison format.
1260
- FormatVersion FormatVersion `json:"formatVersion"`
1261
- // Information about the tool that generated this comparison.
1262
- Generator *Generator `json:"generator,omitempty"`
1263
- // Cryptographic integrity information for verifying this comparison document.
1264
- Integrity *Integrity `json:"integrity,omitempty"`
1265
- // Configuration for how requirements were matched across sources.
1266
- Matching *MatchingConfig `json:"matching,omitempty"`
1267
- // Comparison of packages between two SBOMs. Used in systemDrift mode for SBOM comparison.
1268
- PackageDiffs []PackageDiff `json:"packageDiffs,omitempty"`
1269
- // Detailed comparison of individual requirements between sources.
1270
- RequirementDiffs []RequirementDiff `json:"requirementDiffs"`
1271
- // The source documents being compared. At least two sources are required.
1272
- Sources []Source `json:"sources"`
1273
- // Summary statistics for the overall comparison.
1274
- Summary ComparisonSummary `json:"summary"`
1275
- // URI identifying the system being compared in systemDrift mode.
1276
- SystemRef *string `json:"systemRef,omitempty"`
1277
- // When this comparison was performed.
1278
- Timestamp *time.Time `json:"timestamp,omitempty"`
1267
+ // Map of annotation IDs to annotation objects, providing context or action items for
1268
+ // requirement diffs.
1269
+ Annotations map[string]Annotation `json:"annotations,omitempty"`
1270
+ // Comparison of baselines between sources.
1271
+ BaselineDiffs []BaselineDiff `json:"baselineDiffs,omitempty"`
1272
+ // The mode of comparison being performed.
1273
+ ComparisonMode ComparisonMode `json:"comparisonMode"`
1274
+ // Comparison of components between two system documents. Used in systemDrift mode. A
1275
+ // component's BOM changes surface as a field change on its boms[] here.
1276
+ ComponentDiffs []ComponentDiff `json:"componentDiffs,omitempty"`
1277
+ // External/metadata changes separate from status changes (Terraform pattern).
1278
+ Drift []RequirementDiff `json:"drift,omitempty"`
1279
+ // Reserved for tool-specific data not defined in the HDF standard.
1280
+ Extensions map[string]interface{} `json:"extensions,omitempty"`
1281
+ // Schema version for this comparison format.
1282
+ FormatVersion FormatVersion `json:"formatVersion"`
1283
+ // Information about the tool that generated this comparison.
1284
+ Generator *Generator `json:"generator,omitempty"`
1285
+ // Cryptographic integrity information for verifying this comparison document.
1286
+ Integrity *Integrity `json:"integrity,omitempty"`
1287
+ // Configuration for how requirements were matched across sources.
1288
+ Matching *MatchingConfig `json:"matching,omitempty"`
1289
+ // RESERVED — not emitted by the current systemDrift comparison. systemDrift now reports a
1290
+ // component's BOM changes as a field change on its boms[] (see componentDiffs), and
1291
+ // standalone SBOM package diffing is a separate `hdf diff <sbom> <sbom>` output shape. This
1292
+ // field is retained for a future normalized package-level diff; consumers must not expect
1293
+ // it from today's systemDrift output.
1294
+ PackageDiffs []PackageDiff `json:"packageDiffs,omitempty"`
1295
+ // Detailed comparison of individual requirements between sources.
1296
+ RequirementDiffs []RequirementDiff `json:"requirementDiffs"`
1297
+ // The source documents being compared. At least two sources are required.
1298
+ Sources []Source `json:"sources"`
1299
+ // Summary statistics for the overall comparison.
1300
+ Summary ComparisonSummary `json:"summary"`
1301
+ // URI identifying the system being compared in systemDrift mode.
1302
+ SystemRef *string `json:"systemRef,omitempty"`
1303
+ // When this comparison was performed.
1304
+ Timestamp *time.Time `json:"timestamp,omitempty"`
1279
1305
  }
1280
1306
 
1281
1307
  // An annotation attached to a comparison, providing context or action items.
@@ -1399,8 +1425,6 @@ type Value struct {
1399
1425
  Value interface{} `json:"value"`
1400
1426
  }
1401
1427
 
1402
- // Configuration for how requirements were matched across sources.
1403
- //
1404
1428
  // Configuration for how requirements are matched across sources.
1405
1429
  type MatchingConfig struct {
1406
1430
  // Ordered list of fallback strategies tried when the primary strategy fails to find a match.
@@ -1415,21 +1439,28 @@ type MatchingConfig struct {
1415
1439
  PrimaryStrategy MatchStrategy `json:"primaryStrategy"`
1416
1440
  }
1417
1441
 
1418
- // Comparison of a single package between two SBOM versions, matched by purl.
1442
+ // Comparison of a single BOM node between two BOM versions, matched by purl (software) or
1443
+ // identifier (models, datasets, hardware, crypto).
1419
1444
  type PackageDiff struct {
1420
- // License identifiers for this package.
1421
- Licenses []string `json:"licenses,omitempty"`
1422
- // Human-readable package name.
1423
- Name *string `json:"name,omitempty"`
1424
- // Package version in the new SBOM.
1425
- NewVersion *string `json:"newVersion,omitempty"`
1426
- // Package version in the old SBOM.
1427
- OldVersion *string `json:"oldVersion,omitempty"`
1428
- // Package URL (purl) used as the identity key for matching across SBOMs.
1429
- Purl string `json:"purl"`
1430
- // The state of this package: added (new in new SBOM), removed (absent from new SBOM),
1431
- // updated (version changed), unchanged.
1432
- State PackageDiffState `json:"state"`
1445
+ // Generic identity key for matching a BOM node across versions when no purl applies — e.g.
1446
+ // a Hugging Face model ref, dataset uniqueId, crypto algorithm OID, or hardware part
1447
+ // number. At least one of purl or identifier is required.
1448
+ Identifier *string `json:"identifier,omitempty"`
1449
+ // License identifiers for this package.
1450
+ Licenses []string `json:"licenses,omitempty"`
1451
+ // Human-readable node name.
1452
+ Name *string `json:"name,omitempty"`
1453
+ // Package version in the new SBOM.
1454
+ NewVersion *string `json:"newVersion,omitempty"`
1455
+ // Package version in the old SBOM.
1456
+ OldVersion *string `json:"oldVersion,omitempty"`
1457
+ // Package URL (purl) — the preferred identity key for matching software packages across
1458
+ // BOMs. Optional: BOM nodes without a purl (AI models, datasets, hardware parts, crypto
1459
+ // algorithms) key on identifier instead.
1460
+ Purl *string `json:"purl,omitempty"`
1461
+ // The state of this package: added (new in new SBOM), removed (absent from new SBOM),
1462
+ // updated (version changed), unchanged.
1463
+ State PackageDiffState `json:"state"`
1433
1464
  }
1434
1465
 
1435
1466
  // A source document participating in the comparison.
@@ -1500,8 +1531,6 @@ type ComparisonSummary struct {
1500
1531
  Updated *int64 `json:"updated,omitempty"`
1501
1532
  }
1502
1533
 
1503
- // State counts broken down by severity level.
1504
- //
1505
1534
  // Breakdown of state counts by severity level.
1506
1535
  type SeverityBreakdown struct {
1507
1536
  // State counts for critical severity requirements.
@@ -1514,15 +1543,7 @@ type SeverityBreakdown struct {
1514
1543
  Medium *StateCounts `json:"medium,omitempty"`
1515
1544
  }
1516
1545
 
1517
- // State counts for critical severity requirements.
1518
- //
1519
1546
  // Counts of requirements in each state.
1520
- //
1521
- // State counts for high severity requirements.
1522
- //
1523
- // State counts for low severity requirements.
1524
- //
1525
- // State counts for medium severity requirements.
1526
1547
  type StateCounts struct {
1527
1548
  // Number of requirements present only in the old source.
1528
1549
  Absent *int64 `json:"absent,omitempty"`
@@ -1562,20 +1583,26 @@ type PerSourceSummary struct {
1562
1583
  Updated *int64 `json:"updated,omitempty"`
1563
1584
  }
1564
1585
 
1565
- // Describes a system's authorization boundary, components, and interconnections. Maps to
1566
- // OSCAL SSP system-characteristics and FedRAMP system inventory.
1586
+ // Describes a system's authorization boundary, components, and interconnections. Maps to OSCAL SSP
1587
+ // system-characteristics and FedRAMP system inventory.
1567
1588
  type HDFSystem struct {
1568
1589
  // Date the current authorization status was granted. ISO 8601 format.
1569
1590
  AuthorizationDate *time.Time `json:"authorizationDate,omitempty"`
1570
1591
  // Current Authorization to Operate (ATO) status.
1571
1592
  AuthorizationStatus *AuthorizationStatus `json:"authorizationStatus,omitempty"`
1593
+ // System-scoped Bills of Materials whose subject is the authorization boundary rather than
1594
+ // a single component (e.g. a SaaSBOM of services, a KBOM of cluster inventory, an OBOM).
1595
+ // Component-scoped BOMs (SBOM, ai-model) attach on the component instead. See
1596
+ // primitives/bom.schema.json.
1597
+ Boms []BillOfMaterials `json:"boms,omitempty"`
1572
1598
  // Description of the system's authorization boundary. Example: network CIDR blocks, cloud
1573
1599
  // VPC IDs, physical locations.
1574
1600
  BoundaryDescription *string `json:"boundaryDescription,omitempty"`
1575
1601
  // FIPS 199 security categorization (impact level).
1576
1602
  CategorizationLevel *CategorizationLevel `json:"categorizationLevel,omitempty"`
1577
1603
  // System components within the authorization boundary. Uses the full polymorphic Component
1578
- // type with stable identity (componentId), external references, and SBOM support.
1604
+ // type with stable identity (componentId), external references, and generalized BOM
1605
+ // attachment (boms[]).
1579
1606
  Components []Component `json:"components"`
1580
1607
  // Declares which controls are common, hybrid, or system-specific, and which component
1581
1608
  // provides them. Maps to NIST SP 800-53 control designations and OSCAL
@@ -1611,10 +1638,10 @@ type HDFSystem struct {
1611
1638
  Version *string `json:"version,omitempty"`
1612
1639
  }
1613
1640
 
1614
- // Declares a control's designation within a system — whether it is common (provided by
1615
- // another component or system), system-specific (implemented locally), or hybrid (shared
1616
- // responsibility). Maps to NIST SP 800-53 Appendix C control designations and OSCAL SSP
1617
- // by-component provided/inherited semantics.
1641
+ // Declares a control's designation within a system — whether it is common (provided by another
1642
+ // component or system), system-specific (implemented locally), or hybrid (shared responsibility).
1643
+ // Maps to NIST SP 800-53 Appendix C control designations and OSCAL SSP by-component
1644
+ // provided/inherited semantics.
1618
1645
  type ControlDesignation struct {
1619
1646
  // The control identifier (e.g., 'SC-7', 'AC-2 (1)'). Must match a NIST tag in a baseline
1620
1647
  // requirement's tags.
@@ -1637,9 +1664,9 @@ type ControlDesignation struct {
1637
1664
  SystemRef *string `json:"systemRef,omitempty"`
1638
1665
  }
1639
1666
 
1640
- // A data flow between two endpoints. The 'from' endpoint is always a local component; the
1641
- // 'to' endpoint can be local, cross-system, or external. Use 'direction' to indicate
1642
- // whether data flows one-way or both ways.
1667
+ // A data flow between two endpoints. The 'from' endpoint is always a local component; the 'to'
1668
+ // endpoint can be local, cross-system, or external. Use 'direction' to indicate whether data flows
1669
+ // one-way or both ways.
1643
1670
  type DataFlow struct {
1644
1671
  // Authentication mechanism used for this connection. Examples: 'mTLS', 'OAuth2', 'API key',
1645
1672
  // 'SAML', 'Kerberos'.
@@ -1662,8 +1689,8 @@ type DataFlow struct {
1662
1689
  To interface{} `json:"to"`
1663
1690
  }
1664
1691
 
1665
- // Defines an assessment plan — what baselines to run against which targets, with resolved
1666
- // inputs and scheduling. Maps to OSCAL Assessment Plan.
1692
+ // Defines an assessment plan — what baselines to run against which targets, with resolved inputs
1693
+ // and scheduling. Maps to OSCAL Assessment Plan.
1667
1694
  type HDFPlan struct {
1668
1695
  // The assessments to perform. Each assessment pairs a baseline with targets and resolved
1669
1696
  // inputs.
@@ -1692,8 +1719,8 @@ type HDFPlan struct {
1692
1719
  Version *string `json:"version,omitempty"`
1693
1720
  }
1694
1721
 
1695
- // A single assessment within a plan — defines which baseline to run against which targets
1696
- // with what configuration.
1722
+ // A single assessment within a plan — defines which baseline to run against which targets with what
1723
+ // configuration.
1697
1724
  type Assessment struct {
1698
1725
  // Reference to the baseline to evaluate. May be a baseline name (e.g. 'RHEL9-STIG'), a
1699
1726
  // relative path to an HDF Baseline document (e.g. 'rhel9-stig.hdf-baseline.json'), or an
@@ -1714,8 +1741,6 @@ type Assessment struct {
1714
1741
  TargetSelector map[string]string `json:"targetSelector,omitempty"`
1715
1742
  }
1716
1743
 
1717
- // Runner/scanner configuration for this assessment.
1718
- //
1719
1744
  // Configuration for the assessment runner/scanner.
1720
1745
  type RunnerConfig struct {
1721
1746
  // Name of the assessment runner. Example: 'cinc-auditor', 'inspec', 'openscap'.
@@ -1724,8 +1749,6 @@ type RunnerConfig struct {
1724
1749
  Version *string `json:"version,omitempty"`
1725
1750
  }
1726
1751
 
1727
- // Optional scheduling configuration for recurring assessments.
1728
- //
1729
1752
  // Scheduling configuration for recurring assessments.
1730
1753
  type Schedule struct {
1731
1754
  // Cron expression for recurring assessments. Example: '0 2 1 * *' (2 AM on the 1st of each
@@ -1741,8 +1764,8 @@ type Schedule struct {
1741
1764
  StartDate *time.Time `json:"startDate,omitempty"`
1742
1765
  }
1743
1766
 
1744
- // Waivers, attestations, and POA&Ms that modify requirement compliance status or impact.
1745
- // Amendments are standalone documents that can be applied to results via merge operations.
1767
+ // Waivers, attestations, and POA&Ms that modify requirement compliance status or impact. Amendments
1768
+ // are standalone documents that can be applied to results via merge operations.
1746
1769
  type HDFAmendments struct {
1747
1770
  // Unique identifier for this amendments document. Useful for cross-referencing when
1748
1771
  // multiple amendment documents target the same results.
@@ -1773,18 +1796,18 @@ type HDFAmendments struct {
1773
1796
  Version *string `json:"version,omitempty"`
1774
1797
  }
1775
1798
 
1776
- // A standalone override to a requirement's compliance status or risk impact. Validation has
1777
- // two branches gated on 'type': when type is 'operationalRequirement', neither 'status' nor
1778
- // 'impact' may be set — the override records accepted risk without changing the finding
1779
- // (documentation-only). For all other types, at least one of 'status' or 'impact' must be
1780
- // set. This rule aligns with: (1) OSCAL Assessment Results — finding.target.status and
1799
+ // A standalone override to a requirement's compliance status or risk impact. Validation has two
1800
+ // branches gated on 'type': when type is 'operationalRequirement', neither 'status' nor 'impact'
1801
+ // may be set — the override records accepted risk without changing the finding
1802
+ // (documentation-only). For all other types, at least one of 'status' or 'impact' must be set. This
1803
+ // rule aligns with: (1) OSCAL Assessment Results — finding.target.status and
1781
1804
  // finding.associated-risk[].facet[] are separate axes
1782
- // (https://pages.nist.gov/OSCAL/learn/concepts/layer/assessment/assessment-results/); (2)
1783
- // FedRAMP deviation request types — Risk Adjustment changes impact only, Operational
1784
- // Requirement documents acceptance only, False Positive changes status
1785
- // (https://www.ignyteplatform.com/blog/fedramp/fedramp-deviation-requests-submit/); (3)
1786
- // NIST SP 800-37 RMF — risk response (accept/mitigate/transfer) is a separate step from
1787
- // control assessment status (https://csrc.nist.gov/pubs/sp/800/37/r2/final).
1805
+ // (https://pages.nist.gov/OSCAL/learn/concepts/layer/assessment/assessment-results/); (2) FedRAMP
1806
+ // deviation request types — Risk Adjustment changes impact only, Operational Requirement documents
1807
+ // acceptance only, False Positive changes status
1808
+ // (https://www.ignyteplatform.com/blog/fedramp/fedramp-deviation-requests-submit/); (3) NIST SP
1809
+ // 800-37 RMF — risk response (accept/mitigate/transfer) is a separate step from control assessment
1810
+ // status (https://csrc.nist.gov/pubs/sp/800/37/r2/final).
1788
1811
  type StandaloneOverride struct {
1789
1812
  // Software packages this amendment is scoped to, distinct from componentRef (which scopes
1790
1813
  // to an HDF-internal Component by UUID). Use when the source amendment format references
@@ -1843,49 +1866,51 @@ type StandaloneOverride struct {
1843
1866
  Type OverrideType `json:"type"`
1844
1867
  }
1845
1868
 
1846
- // Bundles references to all HDF documents for audit, authorization, and compliance review.
1847
- // Each content entry references a document by type, URI, and checksum for integrity
1848
- // verification.
1869
+ // Bundles references to all HDF documents for audit, authorization, and compliance review. Each
1870
+ // content entry references a document by type, URI, and checksum for integrity verification.
1849
1871
  type HDFEvidencePackage struct {
1850
- // Summary of assessment completeness and compliance status.
1851
- CompletenessCheck *CompletenessCheck `json:"completenessCheck,omitempty"`
1852
- // References to HDF documents included in this evidence package.
1853
- Contents []ContentReference `json:"contents"`
1854
- // Description of the evidence package's purpose and scope.
1855
- Description *string `json:"description,omitempty"`
1856
- // Information about the tool that generated this document.
1857
- Generator *Generator `json:"generator,omitempty"`
1858
- // Cryptographic integrity information for verifying this evidence package has not been
1859
- // tampered with.
1860
- Integrity *Integrity `json:"integrity,omitempty"`
1861
- // Optional key-value labels for grouping and querying evidence packages.
1862
- Labels map[string]string `json:"labels,omitempty"`
1863
- // Human-readable name for this evidence package. Example: 'Enterprise Portal ATO Evidence -
1864
- // Q1 2026'.
1865
- Name string `json:"name"`
1866
- // Unique identifier for this evidence package. Optional in casual use, expected in
1867
- // production ATO submissions. Auto-generated if omitted during creation.
1868
- PackageID *string `json:"packageId,omitempty"`
1869
- // URI to the hdf-plan document that drove this assessment. Used for completeness
1870
- // verification — every baseline in the plan should have a corresponding results document in
1871
- // this package.
1872
- PlanRef *string `json:"planRef,omitempty"`
1873
- // When this evidence package was prepared. ISO 8601 format.
1874
- PreparedAt *time.Time `json:"preparedAt,omitempty"`
1875
- // Identity of who prepared this evidence package.
1876
- PreparedBy *Identity `json:"preparedBy,omitempty"`
1877
- // Digital signature covering the entire evidence package.
1878
- Signature *Signature `json:"signature,omitempty"`
1879
- // URI to the hdf-system document this evidence package covers.
1880
- SystemRef *string `json:"systemRef,omitempty"`
1881
- // Version of this evidence package.
1882
- Version *string `json:"version,omitempty"`
1883
- }
1884
-
1885
- // Summary of assessment completeness and compliance status.
1886
- //
1887
- // Informational summary of assessment completeness. Not authoritative — tools should
1888
- // compute these from the referenced documents.
1872
+ // Summary of assessment completeness and compliance status.
1873
+ CompletenessCheck *CompletenessCheck `json:"completenessCheck,omitempty"`
1874
+ // References to HDF documents included in this evidence package.
1875
+ Contents []ContentReference `json:"contents"`
1876
+ // Description of the evidence package's purpose and scope.
1877
+ Description *string `json:"description,omitempty"`
1878
+ // References to external native-format evidence (log/telemetry corpora and other artifacts)
1879
+ // carried by URI + integrity hash + format discriminator, without recreating the data
1880
+ // inside HDF. Logs in ECS/OCSF/etc. are legitimate accreditation evidence; HDF indexes them
1881
+ // here rather than transcoding them.
1882
+ ExternalEvidence []ExternalEvidenceReference `json:"externalEvidence,omitempty"`
1883
+ // Information about the tool that generated this document.
1884
+ Generator *Generator `json:"generator,omitempty"`
1885
+ // Cryptographic integrity information for verifying this evidence package has not been
1886
+ // tampered with.
1887
+ Integrity *Integrity `json:"integrity,omitempty"`
1888
+ // Optional key-value labels for grouping and querying evidence packages.
1889
+ Labels map[string]string `json:"labels,omitempty"`
1890
+ // Human-readable name for this evidence package. Example: 'Enterprise Portal ATO Evidence -
1891
+ // Q1 2026'.
1892
+ Name string `json:"name"`
1893
+ // Unique identifier for this evidence package. Optional in casual use, expected in
1894
+ // production ATO submissions. Auto-generated if omitted during creation.
1895
+ PackageID *string `json:"packageId,omitempty"`
1896
+ // URI to the hdf-plan document that drove this assessment. Used for completeness
1897
+ // verification — every baseline in the plan should have a corresponding results document in
1898
+ // this package.
1899
+ PlanRef *string `json:"planRef,omitempty"`
1900
+ // When this evidence package was prepared. ISO 8601 format.
1901
+ PreparedAt *time.Time `json:"preparedAt,omitempty"`
1902
+ // Identity of who prepared this evidence package.
1903
+ PreparedBy *Identity `json:"preparedBy,omitempty"`
1904
+ // Digital signature covering the entire evidence package.
1905
+ Signature *Signature `json:"signature,omitempty"`
1906
+ // URI to the hdf-system document this evidence package covers.
1907
+ SystemRef *string `json:"systemRef,omitempty"`
1908
+ // Version of this evidence package.
1909
+ Version *string `json:"version,omitempty"`
1910
+ }
1911
+
1912
+ // Informational summary of assessment completeness. Not authoritative — tools should compute these
1913
+ // from the referenced documents.
1889
1914
  type CompletenessCheck struct {
1890
1915
  // Whether all baselines referenced by system components have assessment results.
1891
1916
  AllBaselinesAssessed *bool `json:"allBaselinesAssessed,omitempty"`
@@ -1901,8 +1926,6 @@ type CompletenessCheck struct {
1901
1926
  UnresolvedPoams *int64 `json:"unresolvedPoams,omitempty"`
1902
1927
  }
1903
1928
 
1904
- // SBOM coverage across system components.
1905
- //
1906
1929
  // SBOM coverage statistics for the system.
1907
1930
  type SBOMCoverage struct {
1908
1931
  // Number of system components that have an associated SBOM.
@@ -1911,7 +1934,7 @@ type SBOMCoverage struct {
1911
1934
  TotalComponents *int64 `json:"totalComponents,omitempty"`
1912
1935
  }
1913
1936
 
1914
- // A reference to an HDF document or SBOM included in the evidence package.
1937
+ // A reference to an HDF document or BOM/manifest included in the evidence package.
1915
1938
  type ContentReference struct {
1916
1939
  // Cryptographic checksum for verifying the referenced document's integrity.
1917
1940
  Checksum *Checksum `json:"checksum,omitempty"`
@@ -1926,8 +1949,51 @@ type ContentReference struct {
1926
1949
  URI string `json:"uri"`
1927
1950
  }
1928
1951
 
1929
- // The comparison operator used when evaluating this input against observed values.
1930
- //
1952
+ // A reference to external native-format evidence (log/telemetry corpus or other artifact) carried
1953
+ // by URI + integrity hash + format discriminator. Reference-only: the artifact is never embedded
1954
+ // (corpora can be huge) or transcoded (that would be lossy) — it stays canonical in its native
1955
+ // format and HDF acts as the structured index.
1956
+ type ExternalEvidenceReference struct {
1957
+ // Cryptographic checksum of the referenced artifact for integrity verification.
1958
+ Checksum *Checksum `json:"checksum,omitempty"`
1959
+ // Optional human-readable description of this evidence entry.
1960
+ Description *string `json:"description,omitempty"`
1961
+ // The native format discriminator of the referenced artifact.
1962
+ Format string `json:"format"`
1963
+ // Optional producer-declared version of the format (e.g. ECS '9.4.0', OCSF '1.8.0').
1964
+ // Free-text and untrusted — HDF does not validate it against a registry.
1965
+ FormatVersion *string `json:"formatVersion,omitempty"`
1966
+ // Optional IANA media type describing the on-disk serialization, orthogonal to 'format'
1967
+ // (the semantic standard). Examples: application/x-ndjson, application/json,
1968
+ // application/vnd.apache.parquet, text/csv.
1969
+ MediaType *string `json:"mediaType,omitempty"`
1970
+ // Optional descriptive metadata about the referenced corpus. Does not affect integrity.
1971
+ Metadata *ExternalEvidenceMetadata `json:"metadata,omitempty"`
1972
+ // URI to the external native-format evidence artifact (log/telemetry corpus, etc.). Can be
1973
+ // a relative path or absolute URL. The data stays canonical in its native format — HDF
1974
+ // references it, never parses or transcodes it.
1975
+ URI string `json:"uri"`
1976
+ }
1977
+
1978
+ // Descriptive metadata about a referenced external evidence corpus. Does not affect integrity.
1979
+ type ExternalEvidenceMetadata struct {
1980
+ // The tool/pipeline that collected or produced the corpus. Example: 'aws-security-lake',
1981
+ // 'elastic-agent'.
1982
+ Collector *string `json:"collector,omitempty"`
1983
+ // Approximate number of records/events in the referenced corpus.
1984
+ RecordCount *int64 `json:"recordCount,omitempty"`
1985
+ // The time window the referenced evidence covers.
1986
+ TimeRange *ExternalEvidenceTimeRange `json:"timeRange,omitempty"`
1987
+ }
1988
+
1989
+ // The time window a referenced external evidence corpus covers.
1990
+ type ExternalEvidenceTimeRange struct {
1991
+ // End of the time window the corpus covers (ISO 8601).
1992
+ End *time.Time `json:"end,omitempty"`
1993
+ // Start of the time window the corpus covers (ISO 8601).
1994
+ Start *time.Time `json:"start,omitempty"`
1995
+ }
1996
+
1931
1997
  // Comparison operator for evaluating the input value against observed values. Numeric:
1932
1998
  // eq/ne/lt/le/gt/ge. String: eq/ne/contains/matches. Collection: in/notIn.
1933
1999
  type ComparisonOperator string
@@ -1945,8 +2011,6 @@ const (
1945
2011
  NotIn ComparisonOperator = "notIn"
1946
2012
  )
1947
2013
 
1948
- // The data type of this input.
1949
- //
1950
2014
  // The data type of the input value. Aligns with InSpec input types.
1951
2015
  type InputType string
1952
2016
 
@@ -1959,12 +2023,12 @@ const (
1959
2023
  String InputType = "String"
1960
2024
  )
1961
2025
 
1962
- // The hash algorithm used for the checksum.
1963
- //
1964
- // Supported cryptographic hash algorithms for checksums and integrity verification.
2026
+ // Supported cryptographic hash algorithms for checksums and integrity verification. blake3 covers
2027
+ // container-image and other artifact digests that use it.
1965
2028
  type HashAlgorithm string
1966
2029
 
1967
2030
  const (
2031
+ Blake3 HashAlgorithm = "blake3"
1968
2032
  Sha256 HashAlgorithm = "sha256"
1969
2033
  Sha384 HashAlgorithm = "sha384"
1970
2034
  Sha512 HashAlgorithm = "sha512"
@@ -2017,15 +2081,9 @@ const (
2017
2081
  Technical ControlType = "technical"
2018
2082
  )
2019
2083
 
2020
- // Qualitative severity band corresponding to baseScore. CVSS 2.0 does not natively use
2021
- // 'none' or 'critical' bands; map accordingly when populating.
2022
- //
2023
2084
  // Qualitative CVSS severity band. Aligns with FIRST/NVD bands: none=0.0, low=0.1-3.9,
2024
- // medium=4.0-6.9, high=7.0-8.9, critical=9.0-10.0. Distinct from the broader Severity enum
2025
- // used on Requirement_Core (which includes 'informational').
2026
- //
2027
- // Qualitative severity band corresponding to computedScore. Same band convention as
2028
- // baseSeverity.
2085
+ // medium=4.0-6.9, high=7.0-8.9, critical=9.0-10.0. Distinct from the broader Severity enum used on
2086
+ // Requirement_Core (which includes 'informational').
2029
2087
  type CVSSSeverity string
2030
2088
 
2031
2089
  const (
@@ -2047,29 +2105,19 @@ const (
2047
2105
  The40 Version = "4.0"
2048
2106
  )
2049
2107
 
2050
- // The type of the most recent non-expired override or POAM governing this requirement.
2051
- // Indicates why the requirement is in its current state (e.g., waiver, falsePositive,
2052
- // riskAdjustment) or what remediation is being tracked (poam). Absent when no overrides or
2053
- // POAMs apply.
2054
- //
2055
- // The type of amendment, aligned with FedRAMP deviation request categories. 'waiver': risk
2056
- // accepted by Authorizing Official. 'attestation': manually verified by assessor. 'poam':
2057
- // remediation tracked (no status change). 'inherited': control provided by another
2058
- // component or system. 'falsePositive': scanner incorrectly identified a finding — for
2059
- // compliance scans (STIG, CIS), the check actually passes, so status is typically set to
2060
- // 'passed'; for vulnerability scans (CVE, SCA), the flagged vulnerability does not apply to
2061
- // this system, so status is typically set to 'notApplicable'. The disposition field on the
2062
- // requirement distinguishes false positives from genuinely not-applicable findings.
2063
- // 'riskAdjustment': impact score adjusted based on environmental context (FedRAMP Risk
2064
- // Adjustment); does not change pass/fail status, only impact via the impact field.
2065
- // 'operationalRequirement': deviation required by operational constraints (FedRAMP
2066
- // Operational Requirement); the finding cannot be remediated because the system requires
2067
- // the affected functionality. Remains an open risk. Migration note: 'exception' was removed
2068
- // in v3.1.0 — use 'waiver' with status 'notApplicable' instead.
2069
- //
2070
- // The type of override applied to this requirement.
2071
- //
2072
- // The type of amendment.
2108
+ // The type of amendment, aligned with FedRAMP deviation request categories. 'waiver': risk accepted
2109
+ // by Authorizing Official. 'attestation': manually verified by assessor. 'poam': remediation
2110
+ // tracked (no status change). 'inherited': control provided by another component or system.
2111
+ // 'falsePositive': scanner incorrectly identified a finding — for compliance scans (STIG, CIS), the
2112
+ // check actually passes, so status is typically set to 'passed'; for vulnerability scans (CVE,
2113
+ // SCA), the flagged vulnerability does not apply to this system, so status is typically set to
2114
+ // 'notApplicable'. The disposition field on the requirement distinguishes false positives from
2115
+ // genuinely not-applicable findings. 'riskAdjustment': impact score adjusted based on environmental
2116
+ // context (FedRAMP Risk Adjustment); does not change pass/fail status, only impact via the impact
2117
+ // field. 'operationalRequirement': deviation required by operational constraints (FedRAMP
2118
+ // Operational Requirement); the finding cannot be remediated because the system requires the
2119
+ // affected functionality. Remains an open risk. Migration note: 'exception' was removed in v3.1.0 —
2120
+ // use 'waiver' with status 'notApplicable' instead.
2073
2121
  type OverrideType string
2074
2122
 
2075
2123
  const (
@@ -2082,20 +2130,9 @@ const (
2082
2130
  RiskAdjustment OverrideType = "riskAdjustment"
2083
2131
  )
2084
2132
 
2085
- // The current effective compliance status of this requirement after applying the most
2086
- // recent non-expired override with a status field, or computed from results (worst-wins) if
2087
- // no status-bearing overrides exist.
2088
- //
2089
- // The status of an individual test result. 'notApplicable' indicates the requirement does
2090
- // not apply to the target. 'notReviewed' indicates the requirement was not assessed (e.g.,
2091
- // requires manual verification).
2092
- //
2093
- // The status of this test within the requirement. Example: 'failed'.
2094
- //
2095
- // The new status this override sets for the requirement. Optional when only impact is being
2096
- // overridden.
2097
- //
2098
- // The new status this amendment sets. Optional when only impact is being overridden.
2133
+ // The status of an individual test result. 'notApplicable' indicates the requirement does not apply
2134
+ // to the target. 'notReviewed' indicates the requirement was not assessed (e.g., requires manual
2135
+ // verification).
2099
2136
  type ResultStatus string
2100
2137
 
2101
2138
  const (
@@ -2107,11 +2144,16 @@ const (
2107
2144
  )
2108
2145
 
2109
2146
  // The type of identifier. Use 'email' for email addresses, 'username' for user accounts,
2110
- // 'system' for automated systems, 'simple' for basic string identifiers without additional
2111
- // classification, or 'other' for custom identity systems.
2147
+ // 'system' for deterministic non-interactive automation (CI jobs, cron, scanners), 'agent'
2148
+ // for an AI/LLM agent acting with autonomy — kept distinct from 'system' so auditors can
2149
+ // apply AI-specific scrutiny (e.g. 'an LLM proposed this' vs a deterministic job) and
2150
+ // satisfy AI-source disclosure under frameworks like the EU AI Act and NIST AI RMF,
2151
+ // 'simple' for basic string identifiers without additional classification, or 'other' for
2152
+ // custom identity systems.
2112
2153
  type IdentityType string
2113
2154
 
2114
2155
  const (
2156
+ Agent IdentityType = "agent"
2115
2157
  Email IdentityType = "email"
2116
2158
  IdentityTypeOther IdentityType = "other"
2117
2159
  IdentityTypeSystem IdentityType = "system"
@@ -2152,9 +2194,6 @@ const (
2152
2194
  VendorDependency POAMType = "vendorDependency"
2153
2195
  )
2154
2196
 
2155
- // Explicit severity rating. Typically derived from impact score but provided explicitly for
2156
- // clarity.
2157
- //
2158
2197
  // Severity rating for a requirement. Typically derived from the numeric impact score.
2159
2198
  type Severity string
2160
2199
 
@@ -2166,28 +2205,21 @@ const (
2166
2205
  SeverityMedium Severity = "medium"
2167
2206
  )
2168
2207
 
2169
- // Structured controlled-vocabulary classification for why this override applies.
2170
- // Complements (does not replace) the free-text 'reason' field. Most useful on falsePositive
2171
- // and attestation overrides where the structured category enables filtering and lossless
2172
- // round-trip with VEX / OSCAL / FedRAMP DR. See the Justification primitive for the
2173
- // precedent vocabulary and rationale.
2174
- //
2175
- // Structured controlled-vocabulary reason for an override, complementing the free-text
2176
- // 'reason' field. 'reason' carries the human-readable rationale an auditor reads;
2177
- // 'justification' carries the machine-readable category enabling filtering, aggregation,
2178
- // and lossless round-trip with structured ecosystems (VEX, OSCAL, FedRAMP DR). Both fields
2179
- // may be present simultaneously and are NOT redundant: 'reason' explains the specific
2180
- // circumstance; 'justification' classifies it. Authors SHOULD populate both when a
2181
- // controlled-vocabulary value applies — the enum value alone is not self-explanatory to an
2182
- // auditor. The vocabulary is drawn from the VEX ecosystem: the first five values are common
2183
- // across OpenVEX, CSAF VEX, and CycloneDX VEX; the remaining six (requires_configuration /
2184
- // requires_dependency / requires_environment / protected_by_compiler / protected_at_runtime
2185
- // / protected_at_perimeter) are CycloneDX-specific and describe why the vulnerable code
2186
- // path is unreachable in the deployed configuration. The enum is extended additively across
2187
- // schema versions as other ecosystems' controlled vocabularies are integrated; documents
2188
- // using values added in a newer schema version will fail validation against an older
2189
- // schema. Consumers SHOULD validate against the schema version declared by the document
2190
- // ($schema) rather than assume a fixed vocabulary.
2208
+ // Structured controlled-vocabulary reason for an override, complementing the free-text 'reason'
2209
+ // field. 'reason' carries the human-readable rationale an auditor reads; 'justification' carries
2210
+ // the machine-readable category enabling filtering, aggregation, and lossless round-trip with
2211
+ // structured ecosystems (VEX, OSCAL, FedRAMP DR). Both fields may be present simultaneously and are
2212
+ // NOT redundant: 'reason' explains the specific circumstance; 'justification' classifies it.
2213
+ // Authors SHOULD populate both when a controlled-vocabulary value applies — the enum value alone is
2214
+ // not self-explanatory to an auditor. The vocabulary is drawn from the VEX ecosystem: the first
2215
+ // five values are common across OpenVEX, CSAF VEX, and CycloneDX VEX; the remaining six
2216
+ // (requires_configuration / requires_dependency / requires_environment / protected_by_compiler /
2217
+ // protected_at_runtime / protected_at_perimeter) are CycloneDX-specific and describe why the
2218
+ // vulnerable code path is unreachable in the deployed configuration. The enum is extended
2219
+ // additively across schema versions as other ecosystems' controlled vocabularies are integrated;
2220
+ // documents using values added in a newer schema version will fail validation against an older
2221
+ // schema. Consumers SHOULD validate against the schema version declared by the document ($schema)
2222
+ // rather than assume a fixed vocabulary.
2191
2223
  type Justification string
2192
2224
 
2193
2225
  const (
@@ -2204,19 +2236,12 @@ const (
2204
2236
  VulnerableCodeNotPresent Justification = "vulnerable_code_not_present"
2205
2237
  )
2206
2238
 
2207
- // How this requirement is intended to be verified. Disambiguates the two cases that null
2208
- // 'code' overloads: 'manual-by-design' (the requirement is statement-form and not amenable
2209
- // to automation, e.g. FedRAMP 20x KSIs); 'manual-pending-automation' (automation could
2210
- // exist but does not yet, e.g. a STIG rule lacking a fix). 'automated' = a check exists and
2211
- // runs without operator action; 'hybrid' = part automated, part manual. Optional: when
2212
- // omitted, consumers should not infer a default.
2213
- //
2214
- // How a requirement is intended to be verified. Disambiguates the two cases that null
2215
- // 'code' overloads: 'manual-by-design' (the requirement is statement-form and not amenable
2216
- // to automation, e.g. FedRAMP 20x KSIs); 'manual-pending-automation' (automation could
2217
- // exist but does not yet, e.g. a STIG rule lacking a fix). 'automated' = a check exists and
2218
- // runs without operator action; 'hybrid' = part automated, part manual. Named '_Enum' to
2219
- // disambiguate from the unrelated Verification_Method DID-context struct.
2239
+ // How a requirement is intended to be verified. Disambiguates the two cases that null 'code'
2240
+ // overloads: 'manual-by-design' (the requirement is statement-form and not amenable to automation,
2241
+ // e.g. FedRAMP 20x KSIs); 'manual-pending-automation' (automation could exist but does not yet,
2242
+ // e.g. a STIG rule lacking a fix). 'automated' = a check exists and runs without operator action;
2243
+ // 'hybrid' = part automated, part manual. Named '_Enum' to disambiguate from the unrelated
2244
+ // Verification_Method DID-context struct.
2220
2245
  type VerificationMethodEnum string
2221
2246
 
2222
2247
  const (
@@ -2226,6 +2251,29 @@ const (
2226
2251
  VerificationMethodEnumHybrid VerificationMethodEnum = "hybrid"
2227
2252
  )
2228
2253
 
2254
+ // Relationship of this dataset to baseDatasetRefs, parallel to the model extension's
2255
+ // adaptationType. Minimal + extensible: filtered (subset by rule), augmented
2256
+ // (added/synthesized records), merged (union of sources), sampled (statistical draw).
2257
+ type DatasetDerivationType string
2258
+
2259
+ const (
2260
+ Augmented DatasetDerivationType = "augmented"
2261
+ DatasetDerivationTypeMerged DatasetDerivationType = "merged"
2262
+ Filtered DatasetDerivationType = "filtered"
2263
+ Sampled DatasetDerivationType = "sampled"
2264
+ )
2265
+
2266
+ // Lineage relationship to baseModelRef, adopting Hugging Face's base_model_relation
2267
+ // vocabulary (the only typed lineage enum in the ecosystem).
2268
+ type ModelAdaptationType string
2269
+
2270
+ const (
2271
+ Adapter ModelAdaptationType = "adapter"
2272
+ Finetune ModelAdaptationType = "finetune"
2273
+ Merge ModelAdaptationType = "merge"
2274
+ Quantized ModelAdaptationType = "quantized"
2275
+ )
2276
+
2229
2277
  type CloudProvider string
2230
2278
 
2231
2279
  const (
@@ -2236,18 +2284,12 @@ const (
2236
2284
  Oci CloudProvider = "oci"
2237
2285
  )
2238
2286
 
2239
- // Format of the SBOM (embedded or referenced). Required when sbom or sbomRef is present.
2240
- type SBOMFormat string
2241
-
2242
- const (
2243
- Cyclonedx SBOMFormat = "cyclonedx"
2244
- Spdx SBOMFormat = "spdx"
2245
- )
2246
-
2247
- // Component type discriminator. Same values as Target types.
2287
+ // Component type discriminator. Same values as Target types, plus aiModel and dataset (thin
2288
+ // AI subject components whose detail lives in an attached ai-model / dataset BOM).
2248
2289
  type TargetType string
2249
2290
 
2250
2291
  const (
2292
+ AIModel TargetType = "aiModel"
2251
2293
  Application TargetType = "application"
2252
2294
  Artifact TargetType = "artifact"
2253
2295
  CloudAccount TargetType = "cloudAccount"
@@ -2256,13 +2298,12 @@ const (
2256
2298
  ContainerInstance TargetType = "containerInstance"
2257
2299
  ContainerPlatform TargetType = "containerPlatform"
2258
2300
  Database TargetType = "database"
2301
+ Dataset TargetType = "dataset"
2259
2302
  Host TargetType = "host"
2260
2303
  Network TargetType = "network"
2261
2304
  Repository TargetType = "repository"
2262
2305
  )
2263
2306
 
2264
- // The category of this annotation.
2265
- //
2266
2307
  // The category of an annotation attached to a comparison.
2267
2308
  type AnnotationCategory string
2268
2309
 
@@ -2286,13 +2327,11 @@ const (
2286
2327
  BaselineDiffStateUpdated BaselineDiffState = "updated"
2287
2328
  )
2288
2329
 
2289
- // The mode of comparison being performed.
2290
- //
2291
- // The mode of comparison. 'temporal' compares the same target over time. 'baseline'
2292
- // compares against a golden reference. 'fleet' compares across multiple systems.
2293
- // 'multiSource' compares outputs from different scanners. 'baselineEvolution' compares two
2294
- // baseline documents to detect requirement changes between versions. 'systemDrift' compares
2295
- // two system documents to detect component-level changes.
2330
+ // The mode of comparison. 'temporal' compares the same target over time. 'baseline' compares
2331
+ // against a golden reference. 'fleet' compares across multiple systems. 'multiSource' compares
2332
+ // outputs from different scanners. 'baselineEvolution' compares two baseline documents to detect
2333
+ // requirement changes between versions. 'systemDrift' compares two system documents to detect
2334
+ // component-level changes.
2296
2335
  type ComparisonMode string
2297
2336
 
2298
2337
  const (
@@ -2331,8 +2370,6 @@ const (
2331
2370
  TargetChanged ChangeReason = "targetChanged"
2332
2371
  )
2333
2372
 
2334
- // How the conflict was resolved.
2335
- //
2336
2373
  // How a conflict between multiple scanner results was resolved.
2337
2374
  type ConflictResolution string
2338
2375
 
@@ -2343,13 +2380,9 @@ const (
2343
2380
  Unresolved ConflictResolution = "unresolved"
2344
2381
  )
2345
2382
 
2346
- // The strategy that was used to match this requirement across sources.
2347
- //
2348
- // The strategy used to match requirements across sources. 'exactId' matches by identical
2349
- // IDs. 'mappedId' uses an ID mapping table. 'cciMatch'/'nistMatch' match by framework
2350
- // identifiers. 'fuzzyTitle'/'fuzzyContent' use text similarity.
2351
- //
2352
- // The primary strategy used to match requirements across sources.
2383
+ // The strategy used to match requirements across sources. 'exactId' matches by identical IDs.
2384
+ // 'mappedId' uses an ID mapping table. 'cciMatch'/'nistMatch' match by framework identifiers.
2385
+ // 'fuzzyTitle'/'fuzzyContent' use text similarity.
2353
2386
  type MatchStrategy string
2354
2387
 
2355
2388
  const (
@@ -2361,20 +2394,18 @@ const (
2361
2394
  NISTMatch MatchStrategy = "nistMatch"
2362
2395
  )
2363
2396
 
2364
- // The state of this requirement in the comparison.
2365
- //
2366
- // SARIF-compatible vocabulary extended for security. 'new' = present only in new source,
2367
- // 'absent' = present only in old, 'unchanged' = same effective status, 'updated' = status
2368
- // changed (generic), 'fixed' = was failing now passing, 'regressed' = was passing now
2369
- // failing, 'moved' = reorganized same content, 'split'/'merged' = reserved for v1.1.
2397
+ // SARIF-compatible vocabulary extended for security. 'new' = present only in new source, 'absent' =
2398
+ // present only in old, 'unchanged' = same effective status, 'updated' = status changed (generic),
2399
+ // 'fixed' = was failing now passing, 'regressed' = was passing now failing, 'moved' = reorganized
2400
+ // same content, 'split'/'merged' = reserved for v1.1.
2370
2401
  type RequirementState string
2371
2402
 
2372
2403
  const (
2373
2404
  Fixed RequirementState = "fixed"
2374
- Merged RequirementState = "merged"
2375
2405
  Moved RequirementState = "moved"
2376
2406
  Regressed RequirementState = "regressed"
2377
2407
  RequirementStateAbsent RequirementState = "absent"
2408
+ RequirementStateMerged RequirementState = "merged"
2378
2409
  RequirementStateNew RequirementState = "new"
2379
2410
  RequirementStateUnchanged RequirementState = "unchanged"
2380
2411
  RequirementStateUpdated RequirementState = "updated"
@@ -2409,8 +2440,6 @@ const (
2409
2440
  Xccdf OriginalFormat = "xccdf"
2410
2441
  )
2411
2442
 
2412
- // The role of this source in the comparison.
2413
- //
2414
2443
  // The role of a source document in the comparison.
2415
2444
  type SourceRole string
2416
2445
 
@@ -2422,8 +2451,6 @@ const (
2422
2451
  SourceRoleSystem SourceRole = "system"
2423
2452
  )
2424
2453
 
2425
- // Current Authorization to Operate (ATO) status.
2426
- //
2427
2454
  // Authorization to Operate (ATO) status for the system.
2428
2455
  type AuthorizationStatus string
2429
2456
 
@@ -2436,8 +2463,6 @@ const (
2436
2463
  Revoked AuthorizationStatus = "revoked"
2437
2464
  )
2438
2465
 
2439
- // FIPS 199 security categorization (impact level).
2440
- //
2441
2466
  // FIPS 199 security categorization level (impact level).
2442
2467
  type CategorizationLevel string
2443
2468
 
@@ -2467,10 +2492,8 @@ const (
2467
2492
  Unidirectional Direction = "unidirectional"
2468
2493
  )
2469
2494
 
2470
- // The type of assessment plan.
2471
- //
2472
- // The type of assessment. 'automated' for scanner-driven, 'manual' for human-performed,
2473
- // 'hybrid' for both.
2495
+ // The type of assessment. 'automated' for scanner-driven, 'manual' for human-performed, 'hybrid'
2496
+ // for both.
2474
2497
  type PlanType string
2475
2498
 
2476
2499
  const (
@@ -2479,19 +2502,20 @@ const (
2479
2502
  PlanTypeManual PlanType = "manual"
2480
2503
  )
2481
2504
 
2482
- // The type of HDF document being referenced.
2483
- //
2484
- // The type of document referenced in the evidence package.
2505
+ // The type of document referenced in the evidence package. 'bom' covers any
2506
+ // Bill-of-Materials/manifest document (SBOM, AI model/dataset, and reserved future kinds) — its
2507
+ // specific kind is carried by the referenced document's bomType, not by a per-kind Content_Type
2508
+ // value.
2485
2509
  type ContentType string
2486
2510
 
2487
2511
  const (
2512
+ BOM ContentType = "bom"
2488
2513
  HdfAmendments ContentType = "hdf-amendments"
2489
2514
  HdfBaseline ContentType = "hdf-baseline"
2490
2515
  HdfComparison ContentType = "hdf-comparison"
2491
2516
  HdfPlan ContentType = "hdf-plan"
2492
2517
  HdfResults ContentType = "hdf-results"
2493
2518
  HdfSystem ContentType = "hdf-system"
2494
- Sbom ContentType = "sbom"
2495
2519
  )
2496
2520
 
2497
2521
  type Ref struct {
@@ -2514,6 +2538,33 @@ func (x *Ref) MarshalJSON() ([]byte, error) {
2514
2538
  return marshalUnion(nil, nil, nil, x.String, x.AnythingMapArray != nil, x.AnythingMapArray, false, nil, false, nil, false, nil, false)
2515
2539
  }
2516
2540
 
2541
+ // Content modality/kind of the data (CISA/G7 'Dataset content: modality'). Examples: text,
2542
+ // image, tabular, timeseries, audio. DISTINCT from datasetFormat, which is the physical
2543
+ // encoding (parquet/csv). Resolves SPDX 3.0 dataset_datasetType, which is content-kind, not
2544
+ // physical format. String or array of strings.
2545
+ //
2546
+ // Input/output modalities. String or array of strings. Examples: text, image, audio.
2547
+ // Symmetric with Dataset_Extension.modality.
2548
+ type Modality struct {
2549
+ String *string
2550
+ StringArray []string
2551
+ }
2552
+
2553
+ func (x *Modality) UnmarshalJSON(data []byte) error {
2554
+ x.StringArray = nil
2555
+ object, err := unmarshalUnion(data, nil, nil, nil, &x.String, true, &x.StringArray, false, nil, false, nil, false, nil, false)
2556
+ if err != nil {
2557
+ return err
2558
+ }
2559
+ if object {
2560
+ }
2561
+ return nil
2562
+ }
2563
+
2564
+ func (x *Modality) MarshalJSON() ([]byte, error) {
2565
+ return marshalUnion(nil, nil, nil, x.String, x.StringArray != nil, x.StringArray, false, nil, false, nil, false, nil, false)
2566
+ }
2567
+
2517
2568
  func unmarshalUnion(data []byte, pi **int64, pf **float64, pb **bool, ps **string, haveArray bool, pa interface{}, haveObject bool, pc interface{}, haveMap bool, pm interface{}, haveEnum bool, pe interface{}, nullable bool) (bool, error) {
2518
2569
  if pi != nil {
2519
2570
  *pi = nil