@mitre/hdf-schema 3.1.0 → 3.3.0

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.
Files changed (38) hide show
  1. package/README.md +20 -14
  2. package/dist/go/go.mod +2 -2
  3. package/dist/go/hdf.go +570 -210
  4. package/dist/helpers.d.ts +5 -1
  5. package/dist/index.d.ts +27 -52
  6. package/dist/index.js +30 -48
  7. package/dist/schemas/hdf-amendments.schema.json +565 -45
  8. package/dist/schemas/hdf-baseline.schema.json +570 -50
  9. package/dist/schemas/hdf-comparison.schema.json +820 -103
  10. package/dist/schemas/hdf-evidence-package.schema.json +564 -44
  11. package/dist/schemas/hdf-plan.schema.json +571 -50
  12. package/dist/schemas/hdf-results.schema.json +777 -80
  13. package/dist/schemas/hdf-system.schema.json +596 -59
  14. package/dist/ts/hdf.d.ts +3562 -0
  15. package/dist/ts/hdf.js +564 -0
  16. package/dist/ts/hdf.ts +3623 -0
  17. package/package.json +18 -17
  18. package/dist/ts/hdf-amendments.d.ts +0 -474
  19. package/dist/ts/hdf-amendments.js +0 -88
  20. package/dist/ts/hdf-amendments.ts +0 -486
  21. package/dist/ts/hdf-baseline.d.ts +0 -472
  22. package/dist/ts/hdf-baseline.js +0 -58
  23. package/dist/ts/hdf-baseline.ts +0 -483
  24. package/dist/ts/hdf-comparison.d.ts +0 -1185
  25. package/dist/ts/hdf-comparison.js +0 -216
  26. package/dist/ts/hdf-comparison.ts +0 -1210
  27. package/dist/ts/hdf-evidence-package.d.ts +0 -348
  28. package/dist/ts/hdf-evidence-package.js +0 -39
  29. package/dist/ts/hdf-evidence-package.ts +0 -356
  30. package/dist/ts/hdf-plan.d.ts +0 -204
  31. package/dist/ts/hdf-plan.js +0 -23
  32. package/dist/ts/hdf-plan.ts +0 -205
  33. package/dist/ts/hdf-results.d.ts +0 -1511
  34. package/dist/ts/hdf-results.js +0 -194
  35. package/dist/ts/hdf-results.ts +0 -1536
  36. package/dist/ts/hdf-system.d.ts +0 -609
  37. package/dist/ts/hdf-system.js +0 -102
  38. package/dist/ts/hdf-system.ts +0 -617
package/dist/go/hdf.go CHANGED
@@ -253,7 +253,7 @@ type Input struct {
253
253
  // The data type of this input.
254
254
  Type *InputType `json:"type,omitempty"`
255
255
  // The input value. Type should match the declared type field. Accepts any JSON value.
256
- Value interface{} `json:"value,omitempty"`
256
+ Value interface{} `json:"value,omitempty"`
257
257
  }
258
258
 
259
259
  // Validation constraints for the input value.
@@ -338,56 +338,190 @@ type Checksum struct {
338
338
  // Core requirement fields shared between baseline requirements and evaluated requirements.
339
339
  // Contains the fundamental requirement definition without assessment results.
340
340
  type EvaluatedRequirement struct {
341
- // Array of labeled descriptions. At least one description with label 'default' must be
342
- // present. Convention: place default description first. Common labels: 'default', 'check',
343
- // 'fix', 'rationale'.
344
- Descriptions []Description `json:"descriptions"`
345
- // The type of the most recent non-expired override or POAM governing this requirement.
346
- // Indicates why the requirement is in its current state (e.g., waiver, falsePositive,
347
- // riskAdjustment) or what remediation is being tracked (poam). Absent when no overrides or
348
- // POAMs apply.
349
- Disposition *OverrideType `json:"disposition,omitempty"`
350
- // The current effective impact score (0.0–1.0) after applying the most recent non-expired
351
- // override with an impact field. Absent when no impact overrides apply; consumers should
352
- // use the requirement's impact field in that case.
353
- EffectiveImpact *float64 `json:"effectiveImpact,omitempty"`
354
- // The current effective compliance status of this requirement after applying the most
355
- // recent non-expired override with a status field, or computed from results (worst-wins) if
356
- // no status-bearing overrides exist.
357
- EffectiveStatus *ResultStatus `json:"effectiveStatus,omitempty"`
358
- // Supporting evidence for this requirement's findings, such as screenshots, code samples,
359
- // or log excerpts.
360
- Evidence []Evidence `json:"evidence,omitempty"`
361
- // Plan of Action and Milestones for tracking remediation, mitigation, or risk acceptance.
362
- // POAMs do NOT change effectiveStatus - they track the work being done to address a
363
- // failure. Separate from statusOverrides which DO change status.
364
- Poams []PoamElement `json:"poams,omitempty"`
365
- // The set of all tests within the requirement and their results.
366
- Results []RequirementResult `json:"results"`
367
- // Explicit severity rating. Typically derived from impact score but provided explicitly for
368
- // clarity.
369
- Severity *Severity `json:"severity,omitempty"`
370
- // The explicit location of the requirement within the source code.
371
- SourceLocation *SourceLocation `json:"sourceLocation,omitempty"`
372
- // Chronological history of all overrides applied to this requirement. Overrides are
373
- // intentional changes to the compliance status and/or impact score (waivers, attestations,
374
- // false positives, risk adjustments). Most recent override should be first in array.
375
- // Preserves full audit trail.
376
- StatusOverrides []StatusOverride `json:"statusOverrides,omitempty"`
377
- // The requirement identifier. Example: 'SV-238196'.
378
- ID string `json:"id"`
379
- // The impactfulness or severity (0.0 to 1.0).
380
- Impact float64 `json:"impact"`
381
- // A set of tags - usually metadata like CCI, STIG ID, severity.
382
- Tags map[string]interface{} `json:"tags"`
383
- // The raw source code of the requirement. Set to null for manual-only requirements or
384
- // requirements not yet implemented. Note that if this is an overlay, it does not include
385
- // the underlying source code.
386
- Code *string `json:"code,omitempty"`
387
- // The set of references to external documents.
388
- Refs []Reference `json:"refs,omitempty"`
389
- // The title - is nullable.
390
- Title *string `json:"title,omitempty"`
341
+ // Packages affected by this vulnerability finding. Vulnerability-finding-scoped see
342
+ // components[] on hdf-system for component-level package inventories. One entry per matched
343
+ // package signature (scanners often report multiple CPE variations per CVE).
344
+ AffectedPackages []AffectedPackage `json:"affectedPackages,omitempty"`
345
+ // Structured CVSS scoring data for vulnerability findings. One entry per CVE a finding
346
+ // may match multiple CVEs (common in vulnerability scanners). Captures vendor-supplied Base
347
+ // metrics plus optional consumer-owned Threat / Environmental / Supplemental groups for
348
+ // risk adjustment. See cvss.schema.json.
349
+ Cvss []Cvss `json:"cvss,omitempty"`
350
+ // Common Weakness Enumeration IDs associated with this finding. Use CWE-N format with no
351
+ // leading zeros (matches the MITRE catalog convention). For NIST control mappings derived
352
+ // from CWE, see tags.nist.
353
+ Cwe []string `json:"cwe,omitempty"`
354
+ // Array of labeled descriptions. At least one description with label 'default' must be
355
+ // present. Convention: place default description first. Common labels: 'default', 'check',
356
+ // 'fix', 'rationale'.
357
+ Descriptions []Description `json:"descriptions"`
358
+ // The type of the most recent non-expired override or POAM governing this requirement.
359
+ // Indicates why the requirement is in its current state (e.g., waiver, falsePositive,
360
+ // riskAdjustment) or what remediation is being tracked (poam). Absent when no overrides or
361
+ // POAMs apply.
362
+ Disposition *OverrideType `json:"disposition,omitempty"`
363
+ // The current effective impact score (0.0–1.0) after applying the most recent non-expired
364
+ // override with an impact field. Absent when no impact overrides apply; consumers should
365
+ // use the requirement's impact field in that case.
366
+ EffectiveImpact *float64 `json:"effectiveImpact,omitempty"`
367
+ // The current effective compliance status of this requirement after applying the most
368
+ // recent non-expired override with a status field, or computed from results (worst-wins) if
369
+ // no status-bearing overrides exist.
370
+ EffectiveStatus *ResultStatus `json:"effectiveStatus,omitempty"`
371
+ // FIRST.org EPSS (Exploit Prediction Scoring System) score for this CVE finding. Used
372
+ // alongside CVSS for prioritization captures the probability the vulnerability will be
373
+ // exploited.
374
+ Epss *Epss `json:"epss,omitempty"`
375
+ // Supporting evidence for this requirement's findings, such as screenshots, code samples,
376
+ // or log excerpts.
377
+ Evidence []Evidence `json:"evidence,omitempty"`
378
+ // CISA Known Exploited Vulnerabilities (KEV) catalog status. When inKev=true, dateAdded and
379
+ // dueDate carry the federal patching deadline.
380
+ Kev *Kev `json:"kev,omitempty"`
381
+ // Plan of Action and Milestones for tracking remediation, mitigation, or risk acceptance.
382
+ // POAMs do NOT change effectiveStatus - they track the work being done to address a
383
+ // failure. Separate from statusOverrides which DO change status.
384
+ Poams []PoamElement `json:"poams,omitempty"`
385
+ // The set of all tests within the requirement and their results.
386
+ Results []RequirementResult `json:"results"`
387
+ // Explicit severity rating. Typically derived from impact score but provided explicitly for
388
+ // clarity.
389
+ Severity *Severity `json:"severity,omitempty"`
390
+ // The explicit location of the requirement within the source code.
391
+ SourceLocation *SourceLocation `json:"sourceLocation,omitempty"`
392
+ // Chronological history of all overrides applied to this requirement. Overrides are
393
+ // intentional changes to the compliance status and/or impact score (waivers, attestations,
394
+ // false positives, risk adjustments). Most recent override should be first in array.
395
+ // Preserves full audit trail.
396
+ StatusOverrides []StatusOverride `json:"statusOverrides,omitempty"`
397
+ // The requirement identifier. Example: 'SV-238196'.
398
+ ID string `json:"id"`
399
+ // The impactfulness or severity (0.0 to 1.0).
400
+ Impact float64 `json:"impact"`
401
+ // A set of tags - usually metadata like CCI, STIG ID, severity.
402
+ Tags map[string]interface{} `json:"tags"`
403
+ // Whether the requirement is mandatory within its baseline. Distinct from severity (risk
404
+ // weight) and status (lifecycle state). Maps cleanly onto: FedRAMP rev5 OSCAL 'CORE' prop,
405
+ // FedRAMP 20x inline 'Optional:' markers, CMMC sublevel rows, and CIS Implementation Group
406
+ // memberships (IG1/IG2/IG3 may carry richer semantics; layer those onto props[]/tags{}).
407
+ // Optional: when omitted, consumers should treat the requirement as 'required' by
408
+ // convention.
409
+ Applicability *Applicability `json:"applicability,omitempty"`
410
+ // The raw source code of the requirement. Set to null for manual-only requirements or
411
+ // requirements not yet implemented; use verificationMethod to disambiguate manual-by-design
412
+ // from manual-pending-automation. Note that if this is an overlay, it does not include the
413
+ // underlying source code.
414
+ Code *string `json:"code,omitempty"`
415
+ // Classification of the control's nature, aligning with NIST SP 800-53 / SP 800-53A
416
+ // categories. 'policy' = an authored governance statement; 'procedure' = a documented
417
+ // process; 'technical' = an enforced technical configuration; 'management' = a
418
+ // programmatic/management activity; 'operational' = a recurring operational activity (e.g.
419
+ // AT, IR, MA families). Optional: when omitted, consumers may infer heuristically from
420
+ // family/id but should not assume a default.
421
+ ControlType *ControlType `json:"controlType,omitempty"`
422
+ // The set of references to external documents.
423
+ Refs []Reference `json:"refs,omitempty"`
424
+ // The title - is nullable.
425
+ Title *string `json:"title,omitempty"`
426
+ // How this requirement is intended to be verified. Disambiguates the two cases that null
427
+ // 'code' overloads: 'manual-by-design' (the requirement is statement-form and not amenable
428
+ // to automation, e.g. FedRAMP 20x KSIs); 'manual-pending-automation' (automation could
429
+ // exist but does not yet, e.g. a STIG rule lacking a fix). 'automated' = a check exists and
430
+ // runs without operator action; 'hybrid' = part automated, part manual. Optional: when
431
+ // omitted, consumers should not infer a default.
432
+ VerificationMethod *VerificationMethodEnum `json:"verificationMethod,omitempty"`
433
+ }
434
+
435
+ // 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.
444
+ type AffectedPackage struct {
445
+ // Optional CPE 2.3 URI identifying the affected product. Validated leniently: only the
446
+ // 'cpe:2.3:' prefix and the part-type letter ('a' application, 'h' hardware, 'o' operating
447
+ // system) are enforced here. Use `hdf-utilities.parseCpe` for full-grammar parsing.
448
+ // Example: 'cpe:2.3:a:openssl:openssl:1.1.1k:*:*:*:*:*:*:*'.
449
+ Cpe *string `json:"cpe,omitempty"`
450
+ // The packaging ecosystem the package belongs to. Use 'generic' for hardware, firmware, or
451
+ // anything outside the listed language/OS package managers.
452
+ Ecosystem *Ecosystem `json:"ecosystem,omitempty"`
453
+ // Optional version string identifying the first release that contains the fix for the
454
+ // vulnerability. Use the same version syntax as `version`. Example: '1.1.1l' fixes
455
+ // 'openssl@1.1.1k'.
456
+ FixedInVersion *string `json:"fixedInVersion,omitempty"`
457
+ // The package name as published in its ecosystem. Examples: 'openssl' (rpm), 'lodash'
458
+ // (npm), 'org.apache.logging.log4j:log4j-core' (maven, group:artifact).
459
+ Name *string `json:"name,omitempty"`
460
+ // Optional Package URL (PURL) identifying the affected package. Validated leniently: only
461
+ // the 'pkg:TYPE/' scheme prefix is enforced here, where TYPE follows the PURL grammar (a
462
+ // letter followed by letters, digits, '.', '+', or '-') and is matched case-insensitively
463
+ // to mirror `hdf-utilities.parsePurl`'s accept-and-warn behavior. Use `parsePurl` for full
464
+ // PURL parsing. Example: 'pkg:rpm/redhat/openssl@1.1.1k-7.el8_4?arch=x86_64'.
465
+ Purl *string `json:"purl,omitempty"`
466
+ // The exact version of the package that the vulnerability scanner observed. Use the
467
+ // ecosystem's native version string verbatim (e.g., '1.1.1k-7.el8_4' for rpm, '4.17.20' for
468
+ // npm).
469
+ Version *string `json:"version,omitempty"`
470
+ }
471
+
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.
482
+ type Cvss struct {
483
+ // The Base score (0.0–10.0) computed from the base vector. Reflects the intrinsic,
484
+ // vendor-published severity before consumer enrichment.
485
+ BaseScore *float64 `json:"baseScore,omitempty"`
486
+ // Qualitative severity band corresponding to baseScore. CVSS 2.0 does not natively use
487
+ // 'none' or 'critical' bands; map accordingly when populating.
488
+ BaseSeverity *CVSSSeverity `json:"baseSeverity,omitempty"`
489
+ // Optional Base metric group vector string as emitted by the source (e.g.,
490
+ // 'CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H'). For CVSS 2.0 the version prefix is
491
+ // omitted. Some vendor tools emit a final baseScore without the vector — in that case this
492
+ // field is absent and the score cannot be recomputed or decomposed. The pattern accepts any
493
+ // version-prefixed or prefix-less metric token sequence; semantic validity of individual
494
+ // metrics is checked by hdf-utilities, not by the schema.
495
+ BaseVector *string `json:"baseVector,omitempty"`
496
+ // Optional final score after combining Base + Threat + Environmental metrics. This is the
497
+ // score consumers should treat as authoritative for risk decisions when present.
498
+ ComputedScore *float64 `json:"computedScore,omitempty"`
499
+ // Qualitative severity band corresponding to computedScore. Same band convention as
500
+ // baseSeverity.
501
+ ComputedSeverity *CVSSSeverity `json:"computedSeverity,omitempty"`
502
+ // Optional score (0.0–10.0) recomputed after applying Environmental metrics.
503
+ EnvironmentalScore *float64 `json:"environmentalScore,omitempty"`
504
+ // Optional Environmental metric group vector segment (e.g., 'MAV:N/CR:H/IR:H/AR:H').
505
+ // Consumer-supplied — reflects the deployment context (criticality, mitigations, network
506
+ // exposure).
507
+ EnvironmentalVector *string `json:"environmentalVector,omitempty"`
508
+ // Optional identifier the CVSS data is associated with — most commonly a CVE ID (e.g.,
509
+ // 'CVE-2024-12345'), but may also be a vendor advisory ID, GHSA, or similar.
510
+ Source *string `json:"source,omitempty"`
511
+ // Optional Supplemental metric group vector segment (CVSS 4.0 only). Examples:
512
+ // 'S:P/AU:N/V:C/RE:M/U:Amber'. Per CVSS 4.0 spec, supplemental metrics convey additional
513
+ // context but have no impact on the computed score.
514
+ SupplementalVector *string `json:"supplementalVector,omitempty"`
515
+ // Optional score (0.0–10.0) recomputed after applying Threat metrics. Always less than or
516
+ // equal to baseScore in practice.
517
+ ThreatScore *float64 `json:"threatScore,omitempty"`
518
+ // Optional Threat metric group vector segment (e.g., 'E:U/RL:O/RC:C' for CVSS 3.1, or 'E:A'
519
+ // for CVSS 4.0). Consumer-supplied — captures real-world exploitation and remediation
520
+ // context the vendor cannot know.
521
+ ThreatVector *string `json:"threatVector,omitempty"`
522
+ // The CVSS specification version this entry conforms to. Vendor scanners typically emit 3.1
523
+ // or 4.0; legacy data may use 2.0 or 3.0.
524
+ Version Version `json:"version"`
391
525
  }
392
526
 
393
527
  type Description struct {
@@ -398,6 +532,26 @@ type Description struct {
398
532
  Label string `json:"label"`
399
533
  }
400
534
 
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.
542
+ type Epss struct {
543
+ // ISO 8601 date (YYYY-MM-DD) on which FIRST.org published this EPSS score.
544
+ Date string `json:"date"`
545
+ // Rank of this score relative to all scored CVEs, expressed as a value between 0.0 and 1.0
546
+ // inclusive. A percentile of 0.99 means this CVE is scored at or above 99% of all scored
547
+ // CVEs.
548
+ Percentile float64 `json:"percentile"`
549
+ // Exploit probability as a value between 0.0 and 1.0 inclusive. Higher values indicate
550
+ // greater predicted likelihood of exploitation in the next 30 days. Example: 0.97532 means
551
+ // roughly a 97.5% predicted probability.
552
+ Score float64 `json:"score"`
553
+ }
554
+
401
555
  // Supporting evidence for a finding or override, such as screenshots, code samples, log
402
556
  // excerpts, or URLs.
403
557
  type Evidence struct {
@@ -456,15 +610,32 @@ type Evidence struct {
456
610
  //
457
611
  // Identity of who prepared this evidence package.
458
612
  type Identity struct {
459
- // Optional description of the identity or identity system, particularly useful when type is
460
- // 'other'.
461
- Description *string `json:"description,omitempty"`
462
- // The identifier value. Example: 'user@example.com', 'jdoe', 'automated-scanner-01'.
463
- Identifier string `json:"identifier"`
464
- // The type of identifier. Use 'email' for email addresses, 'username' for user accounts,
465
- // 'system' for automated systems, 'simple' for basic string identifiers without additional
466
- // classification, or 'other' for custom identity systems.
467
- Type OwnerType `json:"type"`
613
+ // Optional description of the identity or identity system, particularly useful when type is
614
+ // 'other'.
615
+ Description *string `json:"description,omitempty"`
616
+ // The identifier value. Example: 'user@example.com', 'jdoe', 'automated-scanner-01'.
617
+ Identifier string `json:"identifier"`
618
+ // 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.
621
+ Type IdentityType `json:"type"`
622
+ }
623
+
624
+ // CISA Known Exploited Vulnerabilities (KEV) catalog status. When inKev=true, dateAdded and
625
+ // dueDate carry the federal patching deadline.
626
+ type Kev struct {
627
+ // ISO 8601 calendar date (YYYY-MM-DD) the vulnerability was added to the CISA KEV catalog.
628
+ // Required when inKev is true.
629
+ DateAdded *string `json:"dateAdded,omitempty"`
630
+ // ISO 8601 calendar date (YYYY-MM-DD) by which federal agencies must remediate per CISA BOD
631
+ // 22-01. Normally later than dateAdded, but the schema does not enforce ordering because
632
+ // CISA occasionally adjusts published dates. Required when inKev is true.
633
+ DueDate *string `json:"dueDate,omitempty"`
634
+ // Whether this vulnerability is currently in the CISA Known Exploited Vulnerabilities
635
+ // catalog. When true, dateAdded and dueDate are required.
636
+ InKev bool `json:"inKev"`
637
+ // CISA's notes describing the vulnerability, observed exploitation, or remediation guidance.
638
+ Notes *string `json:"notes,omitempty"`
468
639
  }
469
640
 
470
641
  // Plan of Action and Milestones for tracking remediation, mitigation, or risk acceptance.
@@ -494,21 +665,21 @@ type PoamElement struct {
494
665
  // The type of POA&M. 'remediation' fixes root cause. 'mitigation' reduces risk via
495
666
  // compensating controls. 'riskAcceptance' documents decision to accept risk.
496
667
  // 'vendorDependency' tracks a fix that depends on a vendor releasing a patch or update.
497
- Type PoamType `json:"type"`
668
+ Type POAMType `json:"type"`
498
669
  }
499
670
 
500
671
  // A milestone or task within a POA&M remediation plan.
501
672
  type Milestone struct {
502
- // Actual completion timestamp. ISO 8601 format.
503
- CompletedAt *time.Time `json:"completedAt,omitempty"`
504
- // Identity of who completed this milestone.
505
- CompletedBy *Identity `json:"completedBy,omitempty"`
506
- // Description of this milestone or task.
507
- Description string `json:"description"`
508
- // Estimated completion date. ISO 8601 format.
509
- EstimatedCompletion time.Time `json:"estimatedCompletion"`
510
- // Current status of this milestone.
511
- Status Status `json:"status"`
673
+ // Actual completion timestamp. ISO 8601 format.
674
+ CompletedAt *time.Time `json:"completedAt,omitempty"`
675
+ // Identity of who completed this milestone.
676
+ CompletedBy *Identity `json:"completedBy,omitempty"`
677
+ // Description of this milestone or task.
678
+ Description string `json:"description"`
679
+ // Estimated completion date. ISO 8601 format.
680
+ EstimatedCompletion time.Time `json:"estimatedCompletion"`
681
+ // Current status of this milestone.
682
+ Status MilestoneStatus `json:"status"`
512
683
  }
513
684
 
514
685
  // Optional digital signature for enhanced trust and non-repudiation.
@@ -576,7 +747,7 @@ type VerificationMethod struct {
576
747
  //
577
748
  // A URI pointing at the reference.
578
749
  type Reference struct {
579
- Ref *Ref `json:"ref,omitempty"`
750
+ Ref *Ref `json:"ref,omitempty"`
580
751
  URL *string `json:"url,omitempty"`
581
752
  URI *string `json:"uri,omitempty"`
582
753
  }
@@ -624,6 +795,10 @@ type StatusOverride struct {
624
795
  // Identity of who applied this override. For simple cases, use type 'simple' with just an
625
796
  // identifier.
626
797
  AppliedBy Identity `json:"appliedBy"`
798
+ // Structured CVSS scoring data backing this override. Captures the rubric (which
799
+ // Environmental/Threat metrics the consumer modified, the recomputed score) used to justify
800
+ // a riskAdjustment. For other override types this is optional context.
801
+ Cvss *Cvss `json:"cvss,omitempty"`
627
802
  // Supporting evidence for this override, such as screenshots demonstrating manual
628
803
  // verification for attestations.
629
804
  Evidence []Evidence `json:"evidence,omitempty"`
@@ -632,6 +807,12 @@ type StatusOverride struct {
632
807
  ExpiresAt time.Time `json:"expiresAt"`
633
808
  // Override to the requirement's impact score. At least one of status or impact must be set.
634
809
  Impact *ImpactOverride `json:"impact,omitempty"`
810
+ // Structured controlled-vocabulary classification for why this override applies.
811
+ // Complements (does not replace) the free-text 'reason' field. Most useful on falsePositive
812
+ // and attestation overrides where the structured category enables filtering and lossless
813
+ // round-trip with VEX / OSCAL / FedRAMP DR. See the Justification primitive for the
814
+ // precedent vocabulary and rationale.
815
+ Justification *Justification `json:"justification,omitempty"`
635
816
  // SHA-256 checksum of the previous amendment in chronological order. Creates a
636
817
  // tamper-evident chain of amendments (similar to blockchain). Null for the first amendment
637
818
  // on a requirement.
@@ -722,9 +903,9 @@ type Component struct {
722
903
  Owner *Identity `json:"owner,omitempty"`
723
904
  // Embedded CycloneDX or SPDX SBOM document representing this component's software
724
905
  // inventory. The sbomFormat field determines which format constraints apply.
725
- Sbom interface{} `json:"sbom,omitempty"`
906
+ Sbom interface{} `json:"sbom,omitempty"`
726
907
  // Format of the SBOM (embedded or referenced). Required when sbom or sbomRef is present.
727
- SbomFormat *SbomFormat `json:"sbomFormat,omitempty"`
908
+ SbomFormat *SBOMFormat `json:"sbomFormat,omitempty"`
728
909
  // URI reference to an external CycloneDX or SPDX SBOM document for this component. May be a
729
910
  // relative path, absolute URI, or fragment identifier.
730
911
  SbomRef *string `json:"sbomRef,omitempty"`
@@ -732,7 +913,7 @@ type Component struct {
732
913
  // with matching labels are automatically included.
733
914
  TargetSelector map[string]string `json:"targetSelector,omitempty"`
734
915
  // Component type discriminator. Same values as Target types.
735
- Type Copyright `json:"type"`
916
+ Type TargetType `json:"type"`
736
917
  // Fully qualified domain name.
737
918
  FQDN *string `json:"fqdn,omitempty"`
738
919
  // IP address of the host.
@@ -776,7 +957,7 @@ type Component struct {
776
957
  // Cloud account identifier.
777
958
  AccountID *string `json:"accountId,omitempty"`
778
959
  // Cloud provider.
779
- Provider *CloudProvider `json:"provider,omitempty"`
960
+ Provider *CloudProvider `json:"provider,omitempty"`
780
961
  // Cloud region, if applicable.
781
962
  //
782
963
  // Cloud region where the resource resides.
@@ -828,7 +1009,7 @@ type InputOverride struct {
828
1009
  // Rationale for why this override is needed.
829
1010
  Justification *string `json:"justification,omitempty"`
830
1011
  // The overridden value. Should match the type of the original input.
831
- Value interface{} `json:"value,omitempty"`
1012
+ Value interface{} `json:"value"`
832
1013
  }
833
1014
 
834
1015
  // Information about the tool that generated this file.
@@ -1012,29 +1193,51 @@ type HDFBaseline struct {
1012
1193
  // Core requirement fields shared between baseline requirements and evaluated requirements.
1013
1194
  // Contains the fundamental requirement definition without assessment results.
1014
1195
  type BaselineRequirement struct {
1015
- // Array of labeled descriptions. At least one description with label 'default' must be
1016
- // present. Convention: place default description first. Common labels: 'default', 'check',
1017
- // 'fix', 'rationale'.
1018
- Descriptions []Description `json:"descriptions"`
1019
- // Explicit severity rating. Typically derived from impact score but provided explicitly for
1020
- // clarity.
1021
- Severity *Severity `json:"severity,omitempty"`
1022
- // The requirement identifier. Example: 'SV-238196'.
1023
- ID string `json:"id"`
1024
- // The impactfulness or severity (0.0 to 1.0).
1025
- Impact float64 `json:"impact"`
1026
- // A set of tags - usually metadata like CCI, STIG ID, severity.
1027
- Tags map[string]interface{} `json:"tags"`
1028
- // The raw source code of the requirement. Set to null for manual-only requirements or
1029
- // requirements not yet implemented. Note that if this is an overlay, it does not include
1030
- // the underlying source code.
1031
- Code *string `json:"code,omitempty"`
1032
- // The set of references to external documents.
1033
- Refs []Reference `json:"refs,omitempty"`
1034
- // The explicit location of the requirement within the source code.
1035
- SourceLocation *SourceLocation `json:"sourceLocation,omitempty"`
1036
- // The title - is nullable.
1037
- Title *string `json:"title,omitempty"`
1196
+ // Array of labeled descriptions. At least one description with label 'default' must be
1197
+ // present. Convention: place default description first. Common labels: 'default', 'check',
1198
+ // 'fix', 'rationale'.
1199
+ Descriptions []Description `json:"descriptions"`
1200
+ // Explicit severity rating. Typically derived from impact score but provided explicitly for
1201
+ // clarity.
1202
+ Severity *Severity `json:"severity,omitempty"`
1203
+ // The requirement identifier. Example: 'SV-238196'.
1204
+ ID string `json:"id"`
1205
+ // The impactfulness or severity (0.0 to 1.0).
1206
+ Impact float64 `json:"impact"`
1207
+ // A set of tags - usually metadata like CCI, STIG ID, severity.
1208
+ Tags map[string]interface{} `json:"tags"`
1209
+ // Whether the requirement is mandatory within its baseline. Distinct from severity (risk
1210
+ // weight) and status (lifecycle state). Maps cleanly onto: FedRAMP rev5 OSCAL 'CORE' prop,
1211
+ // FedRAMP 20x inline 'Optional:' markers, CMMC sublevel rows, and CIS Implementation Group
1212
+ // memberships (IG1/IG2/IG3 may carry richer semantics; layer those onto props[]/tags{}).
1213
+ // Optional: when omitted, consumers should treat the requirement as 'required' by
1214
+ // convention.
1215
+ Applicability *Applicability `json:"applicability,omitempty"`
1216
+ // The raw source code of the requirement. Set to null for manual-only requirements or
1217
+ // requirements not yet implemented; use verificationMethod to disambiguate manual-by-design
1218
+ // from manual-pending-automation. Note that if this is an overlay, it does not include the
1219
+ // underlying source code.
1220
+ Code *string `json:"code,omitempty"`
1221
+ // Classification of the control's nature, aligning with NIST SP 800-53 / SP 800-53A
1222
+ // categories. 'policy' = an authored governance statement; 'procedure' = a documented
1223
+ // process; 'technical' = an enforced technical configuration; 'management' = a
1224
+ // programmatic/management activity; 'operational' = a recurring operational activity (e.g.
1225
+ // AT, IR, MA families). Optional: when omitted, consumers may infer heuristically from
1226
+ // family/id but should not assume a default.
1227
+ ControlType *ControlType `json:"controlType,omitempty"`
1228
+ // The set of references to external documents.
1229
+ Refs []Reference `json:"refs,omitempty"`
1230
+ // The explicit location of the requirement within the source code.
1231
+ SourceLocation *SourceLocation `json:"sourceLocation,omitempty"`
1232
+ // The title - is nullable.
1233
+ Title *string `json:"title,omitempty"`
1234
+ // How this requirement is intended to be verified. Disambiguates the two cases that null
1235
+ // 'code' overloads: 'manual-by-design' (the requirement is statement-form and not amenable
1236
+ // to automation, e.g. FedRAMP 20x KSIs); 'manual-pending-automation' (automation could
1237
+ // exist but does not yet, e.g. a STIG rule lacking a fix). 'automated' = a check exists and
1238
+ // runs without operator action; 'hybrid' = part automated, part manual. Optional: when
1239
+ // omitted, consumers should not infer a default.
1240
+ VerificationMethod *VerificationMethodEnum `json:"verificationMethod,omitempty"`
1038
1241
  }
1039
1242
 
1040
1243
  // Structured comparison between two or more HDF security assessment documents. Supports
@@ -1103,10 +1306,10 @@ type BaselineDiff struct {
1103
1306
 
1104
1307
  // Comparison of a single component between two system document versions.
1105
1308
  type ComponentDiff struct {
1106
- // Component snapshot from the new system document.
1107
- After interface{} `json:"after,omitempty"`
1108
- // Component snapshot from the old system document.
1109
- Before interface{} `json:"before,omitempty"`
1309
+ // Component snapshot from the new system document. Null when state is 'absent'.
1310
+ After interface{} `json:"after,omitempty"`
1311
+ // Component snapshot from the old system document. Null when state is 'new'.
1312
+ Before interface{} `json:"before,omitempty"`
1110
1313
  // Detailed field-level changes between the before and after component snapshots.
1111
1314
  FieldChanges []FieldChange `json:"fieldChanges,omitempty"`
1112
1315
  // Component name used for matching across system versions.
@@ -1118,9 +1321,9 @@ type ComponentDiff struct {
1118
1321
  // A single field-level change between two versions of a requirement.
1119
1322
  type FieldChange struct {
1120
1323
  // The new value of the field (for 'add' and 'replace' operations).
1121
- NewValue interface{} `json:"newValue,omitempty"`
1324
+ NewValue interface{} `json:"newValue,omitempty"`
1122
1325
  // The previous value of the field (for 'remove' and 'replace' operations).
1123
- OldValue interface{} `json:"oldValue,omitempty"`
1326
+ OldValue interface{} `json:"oldValue,omitempty"`
1124
1327
  // The type of change operation.
1125
1328
  Op Op `json:"op"`
1126
1329
  // JSON Pointer path to the changed field.
@@ -1131,13 +1334,13 @@ type FieldChange struct {
1131
1334
  // before/after snapshots.
1132
1335
  type RequirementDiff struct {
1133
1336
  // The requirement as it appeared in the new source. Null when state is 'absent'.
1134
- After interface{} `json:"after,omitempty"`
1337
+ After interface{} `json:"after"`
1135
1338
  // Sensitive data from the new source that should not be included in the main after snapshot.
1136
1339
  AfterSensitive map[string]interface{} `json:"afterSensitive,omitempty"`
1137
1340
  // IDs of annotations attached to this requirement diff.
1138
1341
  AnnotationIDS []string `json:"annotationIds,omitempty"`
1139
1342
  // The requirement as it appeared in the old/reference source. Null when state is 'new'.
1140
- Before interface{} `json:"before,omitempty"`
1343
+ Before interface{} `json:"before"`
1141
1344
  // Sensitive data from the old source that should not be included in the main before
1142
1345
  // snapshot.
1143
1346
  BeforeSensitive map[string]interface{} `json:"beforeSensitive,omitempty"`
@@ -1193,7 +1396,7 @@ type Value struct {
1193
1396
  // Human-readable label for the source.
1194
1397
  SourceLabel string `json:"sourceLabel"`
1195
1398
  // The value reported by this source for the conflicting field.
1196
- Value interface{} `json:"value,omitempty"`
1399
+ Value interface{} `json:"value"`
1197
1400
  }
1198
1401
 
1199
1402
  // Configuration for how requirements were matched across sources.
@@ -1456,7 +1659,7 @@ type DataFlow struct {
1456
1659
  Protocol *string `json:"protocol,omitempty"`
1457
1660
  // The other end of this data flow. Can be a local component (UUID), a cross-system
1458
1661
  // component reference, or an external endpoint.
1459
- To interface{} `json:"to,omitempty"`
1662
+ To interface{} `json:"to"`
1460
1663
  }
1461
1664
 
1462
1665
  // Defines an assessment plan — what baselines to run against which targets, with resolved
@@ -1570,47 +1773,74 @@ type HDFAmendments struct {
1570
1773
  Version *string `json:"version,omitempty"`
1571
1774
  }
1572
1775
 
1573
- // A standalone amendment that modifies a requirement's compliance status and/or impact
1574
- // score. At least one of status or impact must be set. Extends the inline Override concept
1575
- // with requirementId and baselineRef for use outside of results documents.
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
1781
+ // 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).
1576
1788
  type StandaloneOverride struct {
1577
- // When this amendment was applied. ISO 8601 format.
1578
- AppliedAt time.Time `json:"appliedAt"`
1579
- // Identity of who applied this amendment.
1580
- AppliedBy Identity `json:"appliedBy"`
1581
- // Name of the baseline containing the requirement. Required when the system has multiple
1582
- // baselines with potentially overlapping requirement IDs.
1583
- BaselineRef *string `json:"baselineRef,omitempty"`
1584
- // componentId of the component this amendment is scoped to. When set, the amendment only
1585
- // applies to the specified component. When omitted, the amendment applies system-wide.
1586
- ComponentRef *string `json:"componentRef,omitempty"`
1587
- // Supporting evidence (screenshots, logs, URLs, documents).
1588
- Evidence []Evidence `json:"evidence,omitempty"`
1589
- // When this amendment expires and must be reviewed. No permanent amendments. ISO 8601
1590
- // format.
1591
- ExpiresAt time.Time `json:"expiresAt"`
1592
- // Override to the requirement's impact score. At least one of status or impact must be set.
1593
- Impact *ImpactOverride `json:"impact,omitempty"`
1594
- // componentId of the local component that provides this control. Set when the provider is
1595
- // in the same system. Omit for external or cross-system providers; the reason field
1596
- // explains the source. Primarily used with type 'inherited'.
1597
- InheritedFrom *string `json:"inheritedFrom,omitempty"`
1598
- // Remediation milestones (primarily for POA&M type amendments).
1599
- Milestones []Milestone `json:"milestones,omitempty"`
1600
- // Checksum of the prior amendment in the chain. Creates a tamper-evident linked list. Null
1601
- // for the first amendment.
1602
- PreviousChecksum *Checksum `json:"previousChecksum,omitempty"`
1603
- // Justification for this amendment.
1604
- Reason string `json:"reason"`
1605
- // The ID of the requirement being amended. Must match a requirement ID in the referenced
1606
- // baseline.
1607
- RequirementID string `json:"requirementId"`
1608
- // Digital signature for non-repudiation.
1609
- Signature *Signature `json:"signature,omitempty"`
1610
- // The new status this amendment sets. Optional when only impact is being overridden.
1611
- Status *ResultStatus `json:"status,omitempty"`
1612
- // The type of amendment.
1613
- Type OverrideType `json:"type"`
1789
+ // Software packages this amendment is scoped to, distinct from componentRef (which scopes
1790
+ // to an HDF-internal Component by UUID). Use when the source amendment format references
1791
+ // packages by purl/cpe/name+version e.g., VEX `affects[]` / `products[]`, OSCAL POA&M
1792
+ // `subjects[]`, FedRAMP component-aware amendments. Symmetric with
1793
+ // Evaluated_Requirement.affectedPackages, which scopes findings to the same package
1794
+ // vocabulary. When omitted, the amendment applies system-wide (or only to componentRef when
1795
+ // that is set).
1796
+ AffectedPackages []AffectedPackage `json:"affectedPackages,omitempty"`
1797
+ // When this amendment was applied. ISO 8601 format.
1798
+ AppliedAt time.Time `json:"appliedAt"`
1799
+ // Identity of who applied this amendment.
1800
+ AppliedBy Identity `json:"appliedBy"`
1801
+ // Name of the baseline containing the requirement. Required when the system has multiple
1802
+ // baselines with potentially overlapping requirement IDs.
1803
+ BaselineRef *string `json:"baselineRef,omitempty"`
1804
+ // componentId of the component this amendment is scoped to. When set, the amendment only
1805
+ // applies to the specified component. When omitted, the amendment applies system-wide.
1806
+ ComponentRef *string `json:"componentRef,omitempty"`
1807
+ // Structured CVSS scoring data backing this override. Captures the rubric (which
1808
+ // Environmental/Threat metrics the consumer modified, the recomputed score) used to justify
1809
+ // a riskAdjustment. For other override types this is optional context.
1810
+ Cvss *Cvss `json:"cvss,omitempty"`
1811
+ // Supporting evidence (screenshots, logs, URLs, documents).
1812
+ Evidence []Evidence `json:"evidence,omitempty"`
1813
+ // When this amendment expires and must be reviewed. No permanent amendments. ISO 8601
1814
+ // format.
1815
+ ExpiresAt time.Time `json:"expiresAt"`
1816
+ // Override to the requirement's impact score. At least one of status or impact must be set.
1817
+ Impact *ImpactOverride `json:"impact,omitempty"`
1818
+ // componentId of the local component that provides this control. Set when the provider is
1819
+ // in the same system. Omit for external or cross-system providers; the reason field
1820
+ // explains the source. Primarily used with type 'inherited'.
1821
+ InheritedFrom *string `json:"inheritedFrom,omitempty"`
1822
+ // Structured controlled-vocabulary classification for why this override applies.
1823
+ // Complements (does not replace) the free-text 'reason' field. Most useful on falsePositive
1824
+ // and attestation overrides where the structured category enables filtering and lossless
1825
+ // round-trip with VEX / OSCAL / FedRAMP DR. See the Justification primitive for the
1826
+ // precedent vocabulary and rationale.
1827
+ Justification *Justification `json:"justification,omitempty"`
1828
+ // Remediation milestones (primarily for POA&M type amendments).
1829
+ Milestones []Milestone `json:"milestones,omitempty"`
1830
+ // Checksum of the prior amendment in the chain. Creates a tamper-evident linked list. Null
1831
+ // for the first amendment.
1832
+ PreviousChecksum *Checksum `json:"previousChecksum,omitempty"`
1833
+ // Justification for this amendment.
1834
+ Reason string `json:"reason"`
1835
+ // The ID of the requirement being amended. Must match a requirement ID in the referenced
1836
+ // baseline.
1837
+ RequirementID string `json:"requirementId"`
1838
+ // Digital signature for non-repudiation.
1839
+ Signature *Signature `json:"signature,omitempty"`
1840
+ // The new status this amendment sets. Optional when only impact is being overridden.
1841
+ Status *ResultStatus `json:"status,omitempty"`
1842
+ // The type of amendment.
1843
+ Type OverrideType `json:"type"`
1614
1844
  }
1615
1845
 
1616
1846
  // Bundles references to all HDF documents for audit, authorization, and compliance review.
@@ -1740,6 +1970,83 @@ const (
1740
1970
  Sha512 HashAlgorithm = "sha512"
1741
1971
  )
1742
1972
 
1973
+ // The packaging ecosystem the package belongs to. Use 'generic' for hardware, firmware, or
1974
+ // anything outside the listed language/OS package managers.
1975
+ type Ecosystem string
1976
+
1977
+ const (
1978
+ Cargo Ecosystem = "cargo"
1979
+ Deb Ecosystem = "deb"
1980
+ Gem Ecosystem = "gem"
1981
+ Generic Ecosystem = "generic"
1982
+ Go Ecosystem = "go"
1983
+ Maven Ecosystem = "maven"
1984
+ Npm Ecosystem = "npm"
1985
+ Nuget Ecosystem = "nuget"
1986
+ Pypi Ecosystem = "pypi"
1987
+ RPM Ecosystem = "rpm"
1988
+ )
1989
+
1990
+ // Whether the requirement is mandatory within its baseline. Distinct from severity (risk
1991
+ // weight) and status (lifecycle state). Maps cleanly onto: FedRAMP rev5 OSCAL 'CORE' prop,
1992
+ // FedRAMP 20x inline 'Optional:' markers, CMMC sublevel rows, and CIS Implementation Group
1993
+ // memberships (IG1/IG2/IG3 may carry richer semantics; layer those onto props[]/tags{}).
1994
+ // Optional: when omitted, consumers should treat the requirement as 'required' by
1995
+ // convention.
1996
+ type Applicability string
1997
+
1998
+ const (
1999
+ Advisory Applicability = "advisory"
2000
+ Optional Applicability = "optional"
2001
+ Required Applicability = "required"
2002
+ )
2003
+
2004
+ // Classification of the control's nature, aligning with NIST SP 800-53 / SP 800-53A
2005
+ // categories. 'policy' = an authored governance statement; 'procedure' = a documented
2006
+ // process; 'technical' = an enforced technical configuration; 'management' = a
2007
+ // programmatic/management activity; 'operational' = a recurring operational activity (e.g.
2008
+ // AT, IR, MA families). Optional: when omitted, consumers may infer heuristically from
2009
+ // family/id but should not assume a default.
2010
+ type ControlType string
2011
+
2012
+ const (
2013
+ Management ControlType = "management"
2014
+ Operational ControlType = "operational"
2015
+ Policy ControlType = "policy"
2016
+ Procedure ControlType = "procedure"
2017
+ Technical ControlType = "technical"
2018
+ )
2019
+
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
+ // 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.
2029
+ type CVSSSeverity string
2030
+
2031
+ const (
2032
+ CVSSSeverityCritical CVSSSeverity = "critical"
2033
+ CVSSSeverityHigh CVSSSeverity = "high"
2034
+ CVSSSeverityLow CVSSSeverity = "low"
2035
+ CVSSSeverityMedium CVSSSeverity = "medium"
2036
+ None CVSSSeverity = "none"
2037
+ )
2038
+
2039
+ // The CVSS specification version this entry conforms to. Vendor scanners typically emit 3.1
2040
+ // or 4.0; legacy data may use 2.0 or 3.0.
2041
+ type Version string
2042
+
2043
+ const (
2044
+ The20 Version = "2.0"
2045
+ The30 Version = "3.0"
2046
+ The31 Version = "3.1"
2047
+ The40 Version = "4.0"
2048
+ )
2049
+
1743
2050
  // The type of the most recent non-expired override or POAM governing this requirement.
1744
2051
  // Indicates why the requirement is in its current state (e.g., waiver, falsePositive,
1745
2052
  // riskAdjustment) or what remediation is being tracked (poam). Absent when no overrides or
@@ -1802,47 +2109,47 @@ const (
1802
2109
  // The type of identifier. Use 'email' for email addresses, 'username' for user accounts,
1803
2110
  // 'system' for automated systems, 'simple' for basic string identifiers without additional
1804
2111
  // classification, or 'other' for custom identity systems.
1805
- type OwnerType string
2112
+ type IdentityType string
1806
2113
 
1807
2114
  const (
1808
- Email OwnerType = "email"
1809
- PurpleOther OwnerType = "other"
1810
- Simple OwnerType = "simple"
1811
- TypeSystem OwnerType = "system"
1812
- Username OwnerType = "username"
2115
+ Email IdentityType = "email"
2116
+ IdentityTypeOther IdentityType = "other"
2117
+ IdentityTypeSystem IdentityType = "system"
2118
+ Simple IdentityType = "simple"
2119
+ Username IdentityType = "username"
1813
2120
  )
1814
2121
 
1815
2122
  // The type of evidence being provided.
1816
2123
  type EvidenceType string
1817
2124
 
1818
2125
  const (
1819
- Code EvidenceType = "code"
1820
- File EvidenceType = "file"
1821
- FluffyOther EvidenceType = "other"
1822
- Log EvidenceType = "log"
1823
- Screenshot EvidenceType = "screenshot"
1824
- URL EvidenceType = "url"
2126
+ Code EvidenceType = "code"
2127
+ EvidenceTypeOther EvidenceType = "other"
2128
+ File EvidenceType = "file"
2129
+ Log EvidenceType = "log"
2130
+ Screenshot EvidenceType = "screenshot"
2131
+ URL EvidenceType = "url"
1825
2132
  )
1826
2133
 
1827
2134
  // Current status of this milestone.
1828
- type Status string
2135
+ type MilestoneStatus string
1829
2136
 
1830
2137
  const (
1831
- Completed Status = "completed"
1832
- InProgress Status = "inProgress"
1833
- Pending Status = "pending"
2138
+ Completed MilestoneStatus = "completed"
2139
+ InProgress MilestoneStatus = "inProgress"
2140
+ Pending MilestoneStatus = "pending"
1834
2141
  )
1835
2142
 
1836
2143
  // The type of POA&M. 'remediation' fixes root cause. 'mitigation' reduces risk via
1837
2144
  // compensating controls. 'riskAcceptance' documents decision to accept risk.
1838
2145
  // 'vendorDependency' tracks a fix that depends on a vendor releasing a patch or update.
1839
- type PoamType string
2146
+ type POAMType string
1840
2147
 
1841
2148
  const (
1842
- Mitigation PoamType = "mitigation"
1843
- RiskAcceptance PoamType = "riskAcceptance"
1844
- TypeRemediation PoamType = "remediation"
1845
- VendorDependency PoamType = "vendorDependency"
2149
+ Mitigation POAMType = "mitigation"
2150
+ POAMTypeRemediation POAMType = "remediation"
2151
+ RiskAcceptance POAMType = "riskAcceptance"
2152
+ VendorDependency POAMType = "vendorDependency"
1846
2153
  )
1847
2154
 
1848
2155
  // Explicit severity rating. Typically derived from impact score but provided explicitly for
@@ -1852,11 +2159,71 @@ const (
1852
2159
  type Severity string
1853
2160
 
1854
2161
  const (
1855
- Critical Severity = "critical"
1856
- Informational Severity = "informational"
1857
- Medium Severity = "medium"
1858
- SeverityHigh Severity = "high"
1859
- SeverityLow Severity = "low"
2162
+ Informational Severity = "informational"
2163
+ SeverityCritical Severity = "critical"
2164
+ SeverityHigh Severity = "high"
2165
+ SeverityLow Severity = "low"
2166
+ SeverityMedium Severity = "medium"
2167
+ )
2168
+
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.
2191
+ type Justification string
2192
+
2193
+ const (
2194
+ ComponentNotPresent Justification = "component_not_present"
2195
+ InlineMitigationsAlreadyExist Justification = "inline_mitigations_already_exist"
2196
+ ProtectedAtPerimeter Justification = "protected_at_perimeter"
2197
+ ProtectedAtRuntime Justification = "protected_at_runtime"
2198
+ ProtectedByCompiler Justification = "protected_by_compiler"
2199
+ RequiresConfiguration Justification = "requires_configuration"
2200
+ RequiresDependency Justification = "requires_dependency"
2201
+ RequiresEnvironment Justification = "requires_environment"
2202
+ VulnerableCodeCannotBeControlledByAdversary Justification = "vulnerable_code_cannot_be_controlled_by_adversary"
2203
+ VulnerableCodeNotInExecutePath Justification = "vulnerable_code_not_in_execute_path"
2204
+ VulnerableCodeNotPresent Justification = "vulnerable_code_not_present"
2205
+ )
2206
+
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.
2220
+ type VerificationMethodEnum string
2221
+
2222
+ const (
2223
+ ManualByDesign VerificationMethodEnum = "manual-by-design"
2224
+ ManualPendingAutomation VerificationMethodEnum = "manual-pending-automation"
2225
+ VerificationMethodEnumAutomated VerificationMethodEnum = "automated"
2226
+ VerificationMethodEnumHybrid VerificationMethodEnum = "hybrid"
1860
2227
  )
1861
2228
 
1862
2229
  type CloudProvider string
@@ -1870,30 +2237,28 @@ const (
1870
2237
  )
1871
2238
 
1872
2239
  // Format of the SBOM (embedded or referenced). Required when sbom or sbomRef is present.
1873
- type SbomFormat string
2240
+ type SBOMFormat string
1874
2241
 
1875
2242
  const (
1876
- Cyclonedx SbomFormat = "cyclonedx"
1877
- Spdx SbomFormat = "spdx"
2243
+ Cyclonedx SBOMFormat = "cyclonedx"
2244
+ Spdx SBOMFormat = "spdx"
1878
2245
  )
1879
2246
 
1880
- // A human readable/meaningful reference. Example: a book title.
1881
- //
1882
- // IP address of the host.
1883
- type Copyright string
2247
+ // Component type discriminator. Same values as Target types.
2248
+ type TargetType string
1884
2249
 
1885
2250
  const (
1886
- Application Copyright = "application"
1887
- Artifact Copyright = "artifact"
1888
- CloudAccount Copyright = "cloudAccount"
1889
- CloudResource Copyright = "cloudResource"
1890
- ContainerImage Copyright = "containerImage"
1891
- ContainerInstance Copyright = "containerInstance"
1892
- ContainerPlatform Copyright = "containerPlatform"
1893
- Database Copyright = "database"
1894
- Host Copyright = "host"
1895
- Network Copyright = "network"
1896
- Repository Copyright = "repository"
2251
+ Application TargetType = "application"
2252
+ Artifact TargetType = "artifact"
2253
+ CloudAccount TargetType = "cloudAccount"
2254
+ CloudResource TargetType = "cloudResource"
2255
+ ContainerImage TargetType = "containerImage"
2256
+ ContainerInstance TargetType = "containerInstance"
2257
+ ContainerPlatform TargetType = "containerPlatform"
2258
+ Database TargetType = "database"
2259
+ Host TargetType = "host"
2260
+ Network TargetType = "network"
2261
+ Repository TargetType = "repository"
1897
2262
  )
1898
2263
 
1899
2264
  // The category of this annotation.
@@ -1915,10 +2280,10 @@ const (
1915
2280
  type BaselineDiffState string
1916
2281
 
1917
2282
  const (
1918
- PurpleUnchanged BaselineDiffState = "unchanged"
1919
- PurpleUpdated BaselineDiffState = "updated"
1920
- StateAbsent BaselineDiffState = "absent"
1921
- StateNew BaselineDiffState = "new"
2283
+ BaselineDiffStateAbsent BaselineDiffState = "absent"
2284
+ BaselineDiffStateNew BaselineDiffState = "new"
2285
+ BaselineDiffStateUnchanged BaselineDiffState = "unchanged"
2286
+ BaselineDiffStateUpdated BaselineDiffState = "updated"
1922
2287
  )
1923
2288
 
1924
2289
  // The mode of comparison being performed.
@@ -2027,10 +2392,10 @@ const (
2027
2392
  type PackageDiffState string
2028
2393
 
2029
2394
  const (
2030
- Added PackageDiffState = "added"
2031
- FluffyUnchanged PackageDiffState = "unchanged"
2032
- FluffyUpdated PackageDiffState = "updated"
2033
- Removed PackageDiffState = "removed"
2395
+ Added PackageDiffState = "added"
2396
+ PackageDiffStateUnchanged PackageDiffState = "unchanged"
2397
+ PackageDiffStateUpdated PackageDiffState = "updated"
2398
+ Removed PackageDiffState = "removed"
2034
2399
  )
2035
2400
 
2036
2401
  // The original format of the source document before conversion to HDF.
@@ -2109,9 +2474,9 @@ const (
2109
2474
  type PlanType string
2110
2475
 
2111
2476
  const (
2112
- Automated PlanType = "automated"
2113
- PlanTypeHybrid PlanType = "hybrid"
2114
- PlanTypeManual PlanType = "manual"
2477
+ PlanTypeAutomated PlanType = "automated"
2478
+ PlanTypeHybrid PlanType = "hybrid"
2479
+ PlanTypeManual PlanType = "manual"
2115
2480
  )
2116
2481
 
2117
2482
  // The type of HDF document being referenced.
@@ -2261,8 +2626,3 @@ func marshalUnion(pi *int64, pf *float64, pb *bool, ps *string, haveArray bool,
2261
2626
  }
2262
2627
  return nil, errors.New("Union must not be null")
2263
2628
  }
2264
-
2265
- // Backward-compatible aliases for renamed constants.
2266
- const (
2267
- CopyrightApplication = Application
2268
- )