settld 0.1.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 (863) hide show
  1. package/Dockerfile +45 -0
  2. package/README.md +150 -0
  3. package/SETTLD_VERSION +1 -0
  4. package/bin/settld.js +212 -0
  5. package/conformance/README.md +14 -0
  6. package/conformance/kernel-v0/README.md +60 -0
  7. package/conformance/kernel-v0/cases.json +19 -0
  8. package/conformance/kernel-v0/run.mjs +830 -0
  9. package/conformance/v1/README.md +77 -0
  10. package/conformance/v1/bundles/closepack/nonstrict-pass-missing-sla-acceptance/attestation/bundle_head_attestation.json +1 -0
  11. package/conformance/v1/bundles/closepack/nonstrict-pass-missing-sla-acceptance/evidence/evidence_index.json +1 -0
  12. package/conformance/v1/bundles/closepack/nonstrict-pass-missing-sla-acceptance/governance/policy.json +1 -0
  13. package/conformance/v1/bundles/closepack/nonstrict-pass-missing-sla-acceptance/governance/revocations.json +1 -0
  14. package/conformance/v1/bundles/closepack/nonstrict-pass-missing-sla-acceptance/manifest.json +1 -0
  15. package/conformance/v1/bundles/closepack/nonstrict-pass-missing-sla-acceptance/payload/invoice_bundle/attestation/bundle_head_attestation.json +1 -0
  16. package/conformance/v1/bundles/closepack/nonstrict-pass-missing-sla-acceptance/payload/invoice_bundle/governance/policy.json +1 -0
  17. package/conformance/v1/bundles/closepack/nonstrict-pass-missing-sla-acceptance/payload/invoice_bundle/governance/revocations.json +1 -0
  18. package/conformance/v1/bundles/closepack/nonstrict-pass-missing-sla-acceptance/payload/invoice_bundle/invoice/invoice_claim.json +1 -0
  19. package/conformance/v1/bundles/closepack/nonstrict-pass-missing-sla-acceptance/payload/invoice_bundle/manifest.json +1 -0
  20. package/conformance/v1/bundles/closepack/nonstrict-pass-missing-sla-acceptance/payload/invoice_bundle/metering/metering_report.json +1 -0
  21. package/conformance/v1/bundles/closepack/nonstrict-pass-missing-sla-acceptance/payload/invoice_bundle/payload/job_proof_bundle/attestation/bundle_head_attestation.json +1 -0
  22. package/conformance/v1/bundles/closepack/nonstrict-pass-missing-sla-acceptance/payload/invoice_bundle/payload/job_proof_bundle/events/events.jsonl +1 -0
  23. package/conformance/v1/bundles/closepack/nonstrict-pass-missing-sla-acceptance/payload/invoice_bundle/payload/job_proof_bundle/events/payload_material.jsonl +1 -0
  24. package/conformance/v1/bundles/closepack/nonstrict-pass-missing-sla-acceptance/payload/invoice_bundle/payload/job_proof_bundle/governance/global/events/events.jsonl +1 -0
  25. package/conformance/v1/bundles/closepack/nonstrict-pass-missing-sla-acceptance/payload/invoice_bundle/payload/job_proof_bundle/governance/global/events/payload_material.jsonl +1 -0
  26. package/conformance/v1/bundles/closepack/nonstrict-pass-missing-sla-acceptance/payload/invoice_bundle/payload/job_proof_bundle/governance/global/snapshot.json +1 -0
  27. package/conformance/v1/bundles/closepack/nonstrict-pass-missing-sla-acceptance/payload/invoice_bundle/payload/job_proof_bundle/governance/policy.json +1 -0
  28. package/conformance/v1/bundles/closepack/nonstrict-pass-missing-sla-acceptance/payload/invoice_bundle/payload/job_proof_bundle/governance/revocations.json +1 -0
  29. package/conformance/v1/bundles/closepack/nonstrict-pass-missing-sla-acceptance/payload/invoice_bundle/payload/job_proof_bundle/governance/tenant/events/events.jsonl +0 -0
  30. package/conformance/v1/bundles/closepack/nonstrict-pass-missing-sla-acceptance/payload/invoice_bundle/payload/job_proof_bundle/governance/tenant/events/payload_material.jsonl +0 -0
  31. package/conformance/v1/bundles/closepack/nonstrict-pass-missing-sla-acceptance/payload/invoice_bundle/payload/job_proof_bundle/governance/tenant/snapshot.json +1 -0
  32. package/conformance/v1/bundles/closepack/nonstrict-pass-missing-sla-acceptance/payload/invoice_bundle/payload/job_proof_bundle/job/snapshot.json +1 -0
  33. package/conformance/v1/bundles/closepack/nonstrict-pass-missing-sla-acceptance/payload/invoice_bundle/payload/job_proof_bundle/keys/public_keys.json +1 -0
  34. package/conformance/v1/bundles/closepack/nonstrict-pass-missing-sla-acceptance/payload/invoice_bundle/payload/job_proof_bundle/manifest.json +1 -0
  35. package/conformance/v1/bundles/closepack/nonstrict-pass-missing-sla-acceptance/payload/invoice_bundle/payload/job_proof_bundle/verify/report.json +1 -0
  36. package/conformance/v1/bundles/closepack/nonstrict-pass-missing-sla-acceptance/payload/invoice_bundle/payload/job_proof_bundle/verify/verification_report.json +1 -0
  37. package/conformance/v1/bundles/closepack/nonstrict-pass-missing-sla-acceptance/payload/invoice_bundle/pricing/pricing_matrix.json +1 -0
  38. package/conformance/v1/bundles/closepack/nonstrict-pass-missing-sla-acceptance/payload/invoice_bundle/pricing/pricing_matrix_signatures.json +1 -0
  39. package/conformance/v1/bundles/closepack/nonstrict-pass-missing-sla-acceptance/payload/invoice_bundle/settld.json +1 -0
  40. package/conformance/v1/bundles/closepack/nonstrict-pass-missing-sla-acceptance/payload/invoice_bundle/verify/verification_report.json +1 -0
  41. package/conformance/v1/bundles/closepack/nonstrict-pass-missing-sla-acceptance/settld.json +1 -0
  42. package/conformance/v1/bundles/closepack/nonstrict-pass-missing-sla-acceptance/verify/verification_report.json +1 -0
  43. package/conformance/v1/bundles/closepack/strict-fail-embedded-invoice-fails/acceptance/acceptance_criteria.json +1 -0
  44. package/conformance/v1/bundles/closepack/strict-fail-embedded-invoice-fails/acceptance/acceptance_evaluation.json +1 -0
  45. package/conformance/v1/bundles/closepack/strict-fail-embedded-invoice-fails/attestation/bundle_head_attestation.json +1 -0
  46. package/conformance/v1/bundles/closepack/strict-fail-embedded-invoice-fails/evidence/evidence_index.json +1 -0
  47. package/conformance/v1/bundles/closepack/strict-fail-embedded-invoice-fails/governance/policy.json +1 -0
  48. package/conformance/v1/bundles/closepack/strict-fail-embedded-invoice-fails/governance/revocations.json +1 -0
  49. package/conformance/v1/bundles/closepack/strict-fail-embedded-invoice-fails/manifest.json +1 -0
  50. package/conformance/v1/bundles/closepack/strict-fail-embedded-invoice-fails/payload/invoice_bundle/attestation/bundle_head_attestation.json +1 -0
  51. package/conformance/v1/bundles/closepack/strict-fail-embedded-invoice-fails/payload/invoice_bundle/governance/policy.json +1 -0
  52. package/conformance/v1/bundles/closepack/strict-fail-embedded-invoice-fails/payload/invoice_bundle/governance/revocations.json +1 -0
  53. package/conformance/v1/bundles/closepack/strict-fail-embedded-invoice-fails/payload/invoice_bundle/invoice/invoice_claim.json +1 -0
  54. package/conformance/v1/bundles/closepack/strict-fail-embedded-invoice-fails/payload/invoice_bundle/manifest.json +1 -0
  55. package/conformance/v1/bundles/closepack/strict-fail-embedded-invoice-fails/payload/invoice_bundle/metering/metering_report.json +1 -0
  56. package/conformance/v1/bundles/closepack/strict-fail-embedded-invoice-fails/payload/invoice_bundle/payload/job_proof_bundle/attestation/bundle_head_attestation.json +1 -0
  57. package/conformance/v1/bundles/closepack/strict-fail-embedded-invoice-fails/payload/invoice_bundle/payload/job_proof_bundle/events/events.jsonl +1 -0
  58. package/conformance/v1/bundles/closepack/strict-fail-embedded-invoice-fails/payload/invoice_bundle/payload/job_proof_bundle/events/payload_material.jsonl +1 -0
  59. package/conformance/v1/bundles/closepack/strict-fail-embedded-invoice-fails/payload/invoice_bundle/payload/job_proof_bundle/governance/global/events/events.jsonl +1 -0
  60. package/conformance/v1/bundles/closepack/strict-fail-embedded-invoice-fails/payload/invoice_bundle/payload/job_proof_bundle/governance/global/events/payload_material.jsonl +1 -0
  61. package/conformance/v1/bundles/closepack/strict-fail-embedded-invoice-fails/payload/invoice_bundle/payload/job_proof_bundle/governance/global/snapshot.json +1 -0
  62. package/conformance/v1/bundles/closepack/strict-fail-embedded-invoice-fails/payload/invoice_bundle/payload/job_proof_bundle/governance/policy.json +1 -0
  63. package/conformance/v1/bundles/closepack/strict-fail-embedded-invoice-fails/payload/invoice_bundle/payload/job_proof_bundle/governance/revocations.json +1 -0
  64. package/conformance/v1/bundles/closepack/strict-fail-embedded-invoice-fails/payload/invoice_bundle/payload/job_proof_bundle/governance/tenant/events/events.jsonl +0 -0
  65. package/conformance/v1/bundles/closepack/strict-fail-embedded-invoice-fails/payload/invoice_bundle/payload/job_proof_bundle/governance/tenant/events/payload_material.jsonl +0 -0
  66. package/conformance/v1/bundles/closepack/strict-fail-embedded-invoice-fails/payload/invoice_bundle/payload/job_proof_bundle/governance/tenant/snapshot.json +1 -0
  67. package/conformance/v1/bundles/closepack/strict-fail-embedded-invoice-fails/payload/invoice_bundle/payload/job_proof_bundle/job/snapshot.json +1 -0
  68. package/conformance/v1/bundles/closepack/strict-fail-embedded-invoice-fails/payload/invoice_bundle/payload/job_proof_bundle/keys/public_keys.json +1 -0
  69. package/conformance/v1/bundles/closepack/strict-fail-embedded-invoice-fails/payload/invoice_bundle/payload/job_proof_bundle/manifest.json +1 -0
  70. package/conformance/v1/bundles/closepack/strict-fail-embedded-invoice-fails/payload/invoice_bundle/payload/job_proof_bundle/verify/report.json +1 -0
  71. package/conformance/v1/bundles/closepack/strict-fail-embedded-invoice-fails/payload/invoice_bundle/payload/job_proof_bundle/verify/verification_report.json +1 -0
  72. package/conformance/v1/bundles/closepack/strict-fail-embedded-invoice-fails/payload/invoice_bundle/pricing/pricing_matrix.json +1 -0
  73. package/conformance/v1/bundles/closepack/strict-fail-embedded-invoice-fails/payload/invoice_bundle/pricing/pricing_matrix_signatures.json +1 -0
  74. package/conformance/v1/bundles/closepack/strict-fail-embedded-invoice-fails/payload/invoice_bundle/settld.json +1 -0
  75. package/conformance/v1/bundles/closepack/strict-fail-embedded-invoice-fails/payload/invoice_bundle/verify/verification_report.json +1 -0
  76. package/conformance/v1/bundles/closepack/strict-fail-embedded-invoice-fails/settld.json +1 -0
  77. package/conformance/v1/bundles/closepack/strict-fail-embedded-invoice-fails/sla/sla_definition.json +1 -0
  78. package/conformance/v1/bundles/closepack/strict-fail-embedded-invoice-fails/sla/sla_evaluation.json +1 -0
  79. package/conformance/v1/bundles/closepack/strict-fail-embedded-invoice-fails/verify/verification_report.json +1 -0
  80. package/conformance/v1/bundles/closepack/strict-fail-evidence-index-mismatch/acceptance/acceptance_criteria.json +1 -0
  81. package/conformance/v1/bundles/closepack/strict-fail-evidence-index-mismatch/acceptance/acceptance_evaluation.json +1 -0
  82. package/conformance/v1/bundles/closepack/strict-fail-evidence-index-mismatch/attestation/bundle_head_attestation.json +1 -0
  83. package/conformance/v1/bundles/closepack/strict-fail-evidence-index-mismatch/evidence/evidence_index.json +1 -0
  84. package/conformance/v1/bundles/closepack/strict-fail-evidence-index-mismatch/governance/policy.json +1 -0
  85. package/conformance/v1/bundles/closepack/strict-fail-evidence-index-mismatch/governance/revocations.json +1 -0
  86. package/conformance/v1/bundles/closepack/strict-fail-evidence-index-mismatch/manifest.json +1 -0
  87. package/conformance/v1/bundles/closepack/strict-fail-evidence-index-mismatch/payload/invoice_bundle/attestation/bundle_head_attestation.json +1 -0
  88. package/conformance/v1/bundles/closepack/strict-fail-evidence-index-mismatch/payload/invoice_bundle/governance/policy.json +1 -0
  89. package/conformance/v1/bundles/closepack/strict-fail-evidence-index-mismatch/payload/invoice_bundle/governance/revocations.json +1 -0
  90. package/conformance/v1/bundles/closepack/strict-fail-evidence-index-mismatch/payload/invoice_bundle/invoice/invoice_claim.json +1 -0
  91. package/conformance/v1/bundles/closepack/strict-fail-evidence-index-mismatch/payload/invoice_bundle/manifest.json +1 -0
  92. package/conformance/v1/bundles/closepack/strict-fail-evidence-index-mismatch/payload/invoice_bundle/metering/metering_report.json +1 -0
  93. package/conformance/v1/bundles/closepack/strict-fail-evidence-index-mismatch/payload/invoice_bundle/payload/job_proof_bundle/attestation/bundle_head_attestation.json +1 -0
  94. package/conformance/v1/bundles/closepack/strict-fail-evidence-index-mismatch/payload/invoice_bundle/payload/job_proof_bundle/events/events.jsonl +1 -0
  95. package/conformance/v1/bundles/closepack/strict-fail-evidence-index-mismatch/payload/invoice_bundle/payload/job_proof_bundle/events/payload_material.jsonl +1 -0
  96. package/conformance/v1/bundles/closepack/strict-fail-evidence-index-mismatch/payload/invoice_bundle/payload/job_proof_bundle/governance/global/events/events.jsonl +1 -0
  97. package/conformance/v1/bundles/closepack/strict-fail-evidence-index-mismatch/payload/invoice_bundle/payload/job_proof_bundle/governance/global/events/payload_material.jsonl +1 -0
  98. package/conformance/v1/bundles/closepack/strict-fail-evidence-index-mismatch/payload/invoice_bundle/payload/job_proof_bundle/governance/global/snapshot.json +1 -0
  99. package/conformance/v1/bundles/closepack/strict-fail-evidence-index-mismatch/payload/invoice_bundle/payload/job_proof_bundle/governance/policy.json +1 -0
  100. package/conformance/v1/bundles/closepack/strict-fail-evidence-index-mismatch/payload/invoice_bundle/payload/job_proof_bundle/governance/revocations.json +1 -0
  101. package/conformance/v1/bundles/closepack/strict-fail-evidence-index-mismatch/payload/invoice_bundle/payload/job_proof_bundle/governance/tenant/events/events.jsonl +0 -0
  102. package/conformance/v1/bundles/closepack/strict-fail-evidence-index-mismatch/payload/invoice_bundle/payload/job_proof_bundle/governance/tenant/events/payload_material.jsonl +0 -0
  103. package/conformance/v1/bundles/closepack/strict-fail-evidence-index-mismatch/payload/invoice_bundle/payload/job_proof_bundle/governance/tenant/snapshot.json +1 -0
  104. package/conformance/v1/bundles/closepack/strict-fail-evidence-index-mismatch/payload/invoice_bundle/payload/job_proof_bundle/job/snapshot.json +1 -0
  105. package/conformance/v1/bundles/closepack/strict-fail-evidence-index-mismatch/payload/invoice_bundle/payload/job_proof_bundle/keys/public_keys.json +1 -0
  106. package/conformance/v1/bundles/closepack/strict-fail-evidence-index-mismatch/payload/invoice_bundle/payload/job_proof_bundle/manifest.json +1 -0
  107. package/conformance/v1/bundles/closepack/strict-fail-evidence-index-mismatch/payload/invoice_bundle/payload/job_proof_bundle/verify/report.json +1 -0
  108. package/conformance/v1/bundles/closepack/strict-fail-evidence-index-mismatch/payload/invoice_bundle/payload/job_proof_bundle/verify/verification_report.json +1 -0
  109. package/conformance/v1/bundles/closepack/strict-fail-evidence-index-mismatch/payload/invoice_bundle/pricing/pricing_matrix.json +1 -0
  110. package/conformance/v1/bundles/closepack/strict-fail-evidence-index-mismatch/payload/invoice_bundle/pricing/pricing_matrix_signatures.json +1 -0
  111. package/conformance/v1/bundles/closepack/strict-fail-evidence-index-mismatch/payload/invoice_bundle/settld.json +1 -0
  112. package/conformance/v1/bundles/closepack/strict-fail-evidence-index-mismatch/payload/invoice_bundle/verify/verification_report.json +1 -0
  113. package/conformance/v1/bundles/closepack/strict-fail-evidence-index-mismatch/settld.json +1 -0
  114. package/conformance/v1/bundles/closepack/strict-fail-evidence-index-mismatch/sla/sla_definition.json +1 -0
  115. package/conformance/v1/bundles/closepack/strict-fail-evidence-index-mismatch/sla/sla_evaluation.json +1 -0
  116. package/conformance/v1/bundles/closepack/strict-fail-evidence-index-mismatch/verify/verification_report.json +1 -0
  117. package/conformance/v1/bundles/closepack/strict-pass/acceptance/acceptance_criteria.json +1 -0
  118. package/conformance/v1/bundles/closepack/strict-pass/acceptance/acceptance_evaluation.json +1 -0
  119. package/conformance/v1/bundles/closepack/strict-pass/attestation/bundle_head_attestation.json +1 -0
  120. package/conformance/v1/bundles/closepack/strict-pass/evidence/evidence_index.json +1 -0
  121. package/conformance/v1/bundles/closepack/strict-pass/governance/policy.json +1 -0
  122. package/conformance/v1/bundles/closepack/strict-pass/governance/revocations.json +1 -0
  123. package/conformance/v1/bundles/closepack/strict-pass/manifest.json +1 -0
  124. package/conformance/v1/bundles/closepack/strict-pass/payload/invoice_bundle/attestation/bundle_head_attestation.json +1 -0
  125. package/conformance/v1/bundles/closepack/strict-pass/payload/invoice_bundle/governance/policy.json +1 -0
  126. package/conformance/v1/bundles/closepack/strict-pass/payload/invoice_bundle/governance/revocations.json +1 -0
  127. package/conformance/v1/bundles/closepack/strict-pass/payload/invoice_bundle/invoice/invoice_claim.json +1 -0
  128. package/conformance/v1/bundles/closepack/strict-pass/payload/invoice_bundle/manifest.json +1 -0
  129. package/conformance/v1/bundles/closepack/strict-pass/payload/invoice_bundle/metering/metering_report.json +1 -0
  130. package/conformance/v1/bundles/closepack/strict-pass/payload/invoice_bundle/payload/job_proof_bundle/attestation/bundle_head_attestation.json +1 -0
  131. package/conformance/v1/bundles/closepack/strict-pass/payload/invoice_bundle/payload/job_proof_bundle/events/events.jsonl +1 -0
  132. package/conformance/v1/bundles/closepack/strict-pass/payload/invoice_bundle/payload/job_proof_bundle/events/payload_material.jsonl +1 -0
  133. package/conformance/v1/bundles/closepack/strict-pass/payload/invoice_bundle/payload/job_proof_bundle/governance/global/events/events.jsonl +1 -0
  134. package/conformance/v1/bundles/closepack/strict-pass/payload/invoice_bundle/payload/job_proof_bundle/governance/global/events/payload_material.jsonl +1 -0
  135. package/conformance/v1/bundles/closepack/strict-pass/payload/invoice_bundle/payload/job_proof_bundle/governance/global/snapshot.json +1 -0
  136. package/conformance/v1/bundles/closepack/strict-pass/payload/invoice_bundle/payload/job_proof_bundle/governance/policy.json +1 -0
  137. package/conformance/v1/bundles/closepack/strict-pass/payload/invoice_bundle/payload/job_proof_bundle/governance/revocations.json +1 -0
  138. package/conformance/v1/bundles/closepack/strict-pass/payload/invoice_bundle/payload/job_proof_bundle/governance/tenant/events/events.jsonl +0 -0
  139. package/conformance/v1/bundles/closepack/strict-pass/payload/invoice_bundle/payload/job_proof_bundle/governance/tenant/events/payload_material.jsonl +0 -0
  140. package/conformance/v1/bundles/closepack/strict-pass/payload/invoice_bundle/payload/job_proof_bundle/governance/tenant/snapshot.json +1 -0
  141. package/conformance/v1/bundles/closepack/strict-pass/payload/invoice_bundle/payload/job_proof_bundle/job/snapshot.json +1 -0
  142. package/conformance/v1/bundles/closepack/strict-pass/payload/invoice_bundle/payload/job_proof_bundle/keys/public_keys.json +1 -0
  143. package/conformance/v1/bundles/closepack/strict-pass/payload/invoice_bundle/payload/job_proof_bundle/manifest.json +1 -0
  144. package/conformance/v1/bundles/closepack/strict-pass/payload/invoice_bundle/payload/job_proof_bundle/verify/report.json +1 -0
  145. package/conformance/v1/bundles/closepack/strict-pass/payload/invoice_bundle/payload/job_proof_bundle/verify/verification_report.json +1 -0
  146. package/conformance/v1/bundles/closepack/strict-pass/payload/invoice_bundle/pricing/pricing_matrix.json +1 -0
  147. package/conformance/v1/bundles/closepack/strict-pass/payload/invoice_bundle/pricing/pricing_matrix_signatures.json +1 -0
  148. package/conformance/v1/bundles/closepack/strict-pass/payload/invoice_bundle/settld.json +1 -0
  149. package/conformance/v1/bundles/closepack/strict-pass/payload/invoice_bundle/verify/verification_report.json +1 -0
  150. package/conformance/v1/bundles/closepack/strict-pass/settld.json +1 -0
  151. package/conformance/v1/bundles/closepack/strict-pass/sla/sla_definition.json +1 -0
  152. package/conformance/v1/bundles/closepack/strict-pass/sla/sla_evaluation.json +1 -0
  153. package/conformance/v1/bundles/closepack/strict-pass/verify/verification_report.json +1 -0
  154. package/conformance/v1/bundles/financepack/pass-with-tool-version-unknown-warning/attestation/bundle_head_attestation.json +1 -0
  155. package/conformance/v1/bundles/financepack/pass-with-tool-version-unknown-warning/finance/GLBatch.v1.json +1 -0
  156. package/conformance/v1/bundles/financepack/pass-with-tool-version-unknown-warning/finance/JournalCsv.v1.csv +2 -0
  157. package/conformance/v1/bundles/financepack/pass-with-tool-version-unknown-warning/finance/JournalCsv.v1.json +1 -0
  158. package/conformance/v1/bundles/financepack/pass-with-tool-version-unknown-warning/finance/reconcile.json +1 -0
  159. package/conformance/v1/bundles/financepack/pass-with-tool-version-unknown-warning/governance/policy.json +1 -0
  160. package/conformance/v1/bundles/financepack/pass-with-tool-version-unknown-warning/governance/revocations.json +1 -0
  161. package/conformance/v1/bundles/financepack/pass-with-tool-version-unknown-warning/manifest.json +1 -0
  162. package/conformance/v1/bundles/financepack/pass-with-tool-version-unknown-warning/month/attestation/bundle_head_attestation.json +1 -0
  163. package/conformance/v1/bundles/financepack/pass-with-tool-version-unknown-warning/month/events/events.jsonl +1 -0
  164. package/conformance/v1/bundles/financepack/pass-with-tool-version-unknown-warning/month/events/payload_material.jsonl +1 -0
  165. package/conformance/v1/bundles/financepack/pass-with-tool-version-unknown-warning/month/governance/global/events/events.jsonl +1 -0
  166. package/conformance/v1/bundles/financepack/pass-with-tool-version-unknown-warning/month/governance/global/events/payload_material.jsonl +1 -0
  167. package/conformance/v1/bundles/financepack/pass-with-tool-version-unknown-warning/month/governance/global/snapshot.json +1 -0
  168. package/conformance/v1/bundles/financepack/pass-with-tool-version-unknown-warning/month/governance/policy.json +1 -0
  169. package/conformance/v1/bundles/financepack/pass-with-tool-version-unknown-warning/month/governance/revocations.json +1 -0
  170. package/conformance/v1/bundles/financepack/pass-with-tool-version-unknown-warning/month/governance/tenant/events/events.jsonl +0 -0
  171. package/conformance/v1/bundles/financepack/pass-with-tool-version-unknown-warning/month/governance/tenant/events/payload_material.jsonl +0 -0
  172. package/conformance/v1/bundles/financepack/pass-with-tool-version-unknown-warning/month/governance/tenant/snapshot.json +1 -0
  173. package/conformance/v1/bundles/financepack/pass-with-tool-version-unknown-warning/month/keys/public_keys.json +1 -0
  174. package/conformance/v1/bundles/financepack/pass-with-tool-version-unknown-warning/month/manifest.json +1 -0
  175. package/conformance/v1/bundles/financepack/pass-with-tool-version-unknown-warning/month/verify/report.json +1 -0
  176. package/conformance/v1/bundles/financepack/pass-with-tool-version-unknown-warning/month/verify/verification_report.json +1 -0
  177. package/conformance/v1/bundles/financepack/pass-with-tool-version-unknown-warning/settld.json +1 -0
  178. package/conformance/v1/bundles/financepack/pass-with-tool-version-unknown-warning/verify/verification_report.json +1 -0
  179. package/conformance/v1/bundles/financepack/strict-fail-manifest-tamper/attestation/bundle_head_attestation.json +1 -0
  180. package/conformance/v1/bundles/financepack/strict-fail-manifest-tamper/finance/GLBatch.v1.json +1 -0
  181. package/conformance/v1/bundles/financepack/strict-fail-manifest-tamper/finance/JournalCsv.v1.csv +2 -0
  182. package/conformance/v1/bundles/financepack/strict-fail-manifest-tamper/finance/JournalCsv.v1.json +1 -0
  183. package/conformance/v1/bundles/financepack/strict-fail-manifest-tamper/finance/reconcile.json +2 -0
  184. package/conformance/v1/bundles/financepack/strict-fail-manifest-tamper/governance/policy.json +1 -0
  185. package/conformance/v1/bundles/financepack/strict-fail-manifest-tamper/governance/revocations.json +1 -0
  186. package/conformance/v1/bundles/financepack/strict-fail-manifest-tamper/manifest.json +1 -0
  187. package/conformance/v1/bundles/financepack/strict-fail-manifest-tamper/month/attestation/bundle_head_attestation.json +1 -0
  188. package/conformance/v1/bundles/financepack/strict-fail-manifest-tamper/month/events/events.jsonl +1 -0
  189. package/conformance/v1/bundles/financepack/strict-fail-manifest-tamper/month/events/payload_material.jsonl +1 -0
  190. package/conformance/v1/bundles/financepack/strict-fail-manifest-tamper/month/governance/global/events/events.jsonl +1 -0
  191. package/conformance/v1/bundles/financepack/strict-fail-manifest-tamper/month/governance/global/events/payload_material.jsonl +1 -0
  192. package/conformance/v1/bundles/financepack/strict-fail-manifest-tamper/month/governance/global/snapshot.json +1 -0
  193. package/conformance/v1/bundles/financepack/strict-fail-manifest-tamper/month/governance/policy.json +1 -0
  194. package/conformance/v1/bundles/financepack/strict-fail-manifest-tamper/month/governance/revocations.json +1 -0
  195. package/conformance/v1/bundles/financepack/strict-fail-manifest-tamper/month/governance/tenant/events/events.jsonl +0 -0
  196. package/conformance/v1/bundles/financepack/strict-fail-manifest-tamper/month/governance/tenant/events/payload_material.jsonl +0 -0
  197. package/conformance/v1/bundles/financepack/strict-fail-manifest-tamper/month/governance/tenant/snapshot.json +1 -0
  198. package/conformance/v1/bundles/financepack/strict-fail-manifest-tamper/month/keys/public_keys.json +1 -0
  199. package/conformance/v1/bundles/financepack/strict-fail-manifest-tamper/month/manifest.json +1 -0
  200. package/conformance/v1/bundles/financepack/strict-fail-manifest-tamper/month/verify/report.json +1 -0
  201. package/conformance/v1/bundles/financepack/strict-fail-manifest-tamper/month/verify/verification_report.json +1 -0
  202. package/conformance/v1/bundles/financepack/strict-fail-manifest-tamper/settld.json +1 -0
  203. package/conformance/v1/bundles/financepack/strict-fail-manifest-tamper/verify/verification_report.json +1 -0
  204. package/conformance/v1/bundles/financepack/strict-fail-missing-verification-report/attestation/bundle_head_attestation.json +1 -0
  205. package/conformance/v1/bundles/financepack/strict-fail-missing-verification-report/finance/GLBatch.v1.json +1 -0
  206. package/conformance/v1/bundles/financepack/strict-fail-missing-verification-report/finance/JournalCsv.v1.csv +2 -0
  207. package/conformance/v1/bundles/financepack/strict-fail-missing-verification-report/finance/JournalCsv.v1.json +1 -0
  208. package/conformance/v1/bundles/financepack/strict-fail-missing-verification-report/finance/reconcile.json +1 -0
  209. package/conformance/v1/bundles/financepack/strict-fail-missing-verification-report/governance/policy.json +1 -0
  210. package/conformance/v1/bundles/financepack/strict-fail-missing-verification-report/governance/revocations.json +1 -0
  211. package/conformance/v1/bundles/financepack/strict-fail-missing-verification-report/manifest.json +1 -0
  212. package/conformance/v1/bundles/financepack/strict-fail-missing-verification-report/month/attestation/bundle_head_attestation.json +1 -0
  213. package/conformance/v1/bundles/financepack/strict-fail-missing-verification-report/month/events/events.jsonl +1 -0
  214. package/conformance/v1/bundles/financepack/strict-fail-missing-verification-report/month/events/payload_material.jsonl +1 -0
  215. package/conformance/v1/bundles/financepack/strict-fail-missing-verification-report/month/governance/global/events/events.jsonl +1 -0
  216. package/conformance/v1/bundles/financepack/strict-fail-missing-verification-report/month/governance/global/events/payload_material.jsonl +1 -0
  217. package/conformance/v1/bundles/financepack/strict-fail-missing-verification-report/month/governance/global/snapshot.json +1 -0
  218. package/conformance/v1/bundles/financepack/strict-fail-missing-verification-report/month/governance/policy.json +1 -0
  219. package/conformance/v1/bundles/financepack/strict-fail-missing-verification-report/month/governance/revocations.json +1 -0
  220. package/conformance/v1/bundles/financepack/strict-fail-missing-verification-report/month/governance/tenant/events/events.jsonl +0 -0
  221. package/conformance/v1/bundles/financepack/strict-fail-missing-verification-report/month/governance/tenant/events/payload_material.jsonl +0 -0
  222. package/conformance/v1/bundles/financepack/strict-fail-missing-verification-report/month/governance/tenant/snapshot.json +1 -0
  223. package/conformance/v1/bundles/financepack/strict-fail-missing-verification-report/month/keys/public_keys.json +1 -0
  224. package/conformance/v1/bundles/financepack/strict-fail-missing-verification-report/month/manifest.json +1 -0
  225. package/conformance/v1/bundles/financepack/strict-fail-missing-verification-report/month/verify/report.json +1 -0
  226. package/conformance/v1/bundles/financepack/strict-fail-missing-verification-report/month/verify/verification_report.json +1 -0
  227. package/conformance/v1/bundles/financepack/strict-fail-missing-verification-report/settld.json +1 -0
  228. package/conformance/v1/bundles/financepack/strict-pass/attestation/bundle_head_attestation.json +1 -0
  229. package/conformance/v1/bundles/financepack/strict-pass/finance/GLBatch.v1.json +1 -0
  230. package/conformance/v1/bundles/financepack/strict-pass/finance/JournalCsv.v1.csv +2 -0
  231. package/conformance/v1/bundles/financepack/strict-pass/finance/JournalCsv.v1.json +1 -0
  232. package/conformance/v1/bundles/financepack/strict-pass/finance/reconcile.json +1 -0
  233. package/conformance/v1/bundles/financepack/strict-pass/governance/policy.json +1 -0
  234. package/conformance/v1/bundles/financepack/strict-pass/governance/revocations.json +1 -0
  235. package/conformance/v1/bundles/financepack/strict-pass/manifest.json +1 -0
  236. package/conformance/v1/bundles/financepack/strict-pass/month/attestation/bundle_head_attestation.json +1 -0
  237. package/conformance/v1/bundles/financepack/strict-pass/month/events/events.jsonl +1 -0
  238. package/conformance/v1/bundles/financepack/strict-pass/month/events/payload_material.jsonl +1 -0
  239. package/conformance/v1/bundles/financepack/strict-pass/month/governance/global/events/events.jsonl +1 -0
  240. package/conformance/v1/bundles/financepack/strict-pass/month/governance/global/events/payload_material.jsonl +1 -0
  241. package/conformance/v1/bundles/financepack/strict-pass/month/governance/global/snapshot.json +1 -0
  242. package/conformance/v1/bundles/financepack/strict-pass/month/governance/policy.json +1 -0
  243. package/conformance/v1/bundles/financepack/strict-pass/month/governance/revocations.json +1 -0
  244. package/conformance/v1/bundles/financepack/strict-pass/month/governance/tenant/events/events.jsonl +0 -0
  245. package/conformance/v1/bundles/financepack/strict-pass/month/governance/tenant/events/payload_material.jsonl +0 -0
  246. package/conformance/v1/bundles/financepack/strict-pass/month/governance/tenant/snapshot.json +1 -0
  247. package/conformance/v1/bundles/financepack/strict-pass/month/keys/public_keys.json +1 -0
  248. package/conformance/v1/bundles/financepack/strict-pass/month/manifest.json +1 -0
  249. package/conformance/v1/bundles/financepack/strict-pass/month/verify/report.json +1 -0
  250. package/conformance/v1/bundles/financepack/strict-pass/month/verify/verification_report.json +1 -0
  251. package/conformance/v1/bundles/financepack/strict-pass/settld.json +1 -0
  252. package/conformance/v1/bundles/financepack/strict-pass/verify/verification_report.json +1 -0
  253. package/conformance/v1/bundles/invoicebundle/nonstrict-pass-missing-verification-report/attestation/bundle_head_attestation.json +1 -0
  254. package/conformance/v1/bundles/invoicebundle/nonstrict-pass-missing-verification-report/governance/policy.json +1 -0
  255. package/conformance/v1/bundles/invoicebundle/nonstrict-pass-missing-verification-report/governance/revocations.json +1 -0
  256. package/conformance/v1/bundles/invoicebundle/nonstrict-pass-missing-verification-report/invoice/invoice_claim.json +1 -0
  257. package/conformance/v1/bundles/invoicebundle/nonstrict-pass-missing-verification-report/manifest.json +1 -0
  258. package/conformance/v1/bundles/invoicebundle/nonstrict-pass-missing-verification-report/metering/metering_report.json +1 -0
  259. package/conformance/v1/bundles/invoicebundle/nonstrict-pass-missing-verification-report/payload/job_proof_bundle/attestation/bundle_head_attestation.json +1 -0
  260. package/conformance/v1/bundles/invoicebundle/nonstrict-pass-missing-verification-report/payload/job_proof_bundle/events/events.jsonl +1 -0
  261. package/conformance/v1/bundles/invoicebundle/nonstrict-pass-missing-verification-report/payload/job_proof_bundle/events/payload_material.jsonl +1 -0
  262. package/conformance/v1/bundles/invoicebundle/nonstrict-pass-missing-verification-report/payload/job_proof_bundle/governance/global/events/events.jsonl +1 -0
  263. package/conformance/v1/bundles/invoicebundle/nonstrict-pass-missing-verification-report/payload/job_proof_bundle/governance/global/events/payload_material.jsonl +1 -0
  264. package/conformance/v1/bundles/invoicebundle/nonstrict-pass-missing-verification-report/payload/job_proof_bundle/governance/global/snapshot.json +1 -0
  265. package/conformance/v1/bundles/invoicebundle/nonstrict-pass-missing-verification-report/payload/job_proof_bundle/governance/policy.json +1 -0
  266. package/conformance/v1/bundles/invoicebundle/nonstrict-pass-missing-verification-report/payload/job_proof_bundle/governance/revocations.json +1 -0
  267. package/conformance/v1/bundles/invoicebundle/nonstrict-pass-missing-verification-report/payload/job_proof_bundle/governance/tenant/events/events.jsonl +0 -0
  268. package/conformance/v1/bundles/invoicebundle/nonstrict-pass-missing-verification-report/payload/job_proof_bundle/governance/tenant/events/payload_material.jsonl +0 -0
  269. package/conformance/v1/bundles/invoicebundle/nonstrict-pass-missing-verification-report/payload/job_proof_bundle/governance/tenant/snapshot.json +1 -0
  270. package/conformance/v1/bundles/invoicebundle/nonstrict-pass-missing-verification-report/payload/job_proof_bundle/job/snapshot.json +1 -0
  271. package/conformance/v1/bundles/invoicebundle/nonstrict-pass-missing-verification-report/payload/job_proof_bundle/keys/public_keys.json +1 -0
  272. package/conformance/v1/bundles/invoicebundle/nonstrict-pass-missing-verification-report/payload/job_proof_bundle/manifest.json +1 -0
  273. package/conformance/v1/bundles/invoicebundle/nonstrict-pass-missing-verification-report/payload/job_proof_bundle/verify/report.json +1 -0
  274. package/conformance/v1/bundles/invoicebundle/nonstrict-pass-missing-verification-report/payload/job_proof_bundle/verify/verification_report.json +1 -0
  275. package/conformance/v1/bundles/invoicebundle/nonstrict-pass-missing-verification-report/pricing/pricing_matrix.json +1 -0
  276. package/conformance/v1/bundles/invoicebundle/nonstrict-pass-missing-verification-report/pricing/pricing_matrix_signatures.json +1 -0
  277. package/conformance/v1/bundles/invoicebundle/nonstrict-pass-missing-verification-report/settld.json +1 -0
  278. package/conformance/v1/bundles/invoicebundle/nonstrict-pass-unsigned-pricing-matrix-warning/attestation/bundle_head_attestation.json +1 -0
  279. package/conformance/v1/bundles/invoicebundle/nonstrict-pass-unsigned-pricing-matrix-warning/governance/policy.json +1 -0
  280. package/conformance/v1/bundles/invoicebundle/nonstrict-pass-unsigned-pricing-matrix-warning/governance/revocations.json +1 -0
  281. package/conformance/v1/bundles/invoicebundle/nonstrict-pass-unsigned-pricing-matrix-warning/invoice/invoice_claim.json +1 -0
  282. package/conformance/v1/bundles/invoicebundle/nonstrict-pass-unsigned-pricing-matrix-warning/manifest.json +1 -0
  283. package/conformance/v1/bundles/invoicebundle/nonstrict-pass-unsigned-pricing-matrix-warning/metering/metering_report.json +1 -0
  284. package/conformance/v1/bundles/invoicebundle/nonstrict-pass-unsigned-pricing-matrix-warning/payload/job_proof_bundle/attestation/bundle_head_attestation.json +1 -0
  285. package/conformance/v1/bundles/invoicebundle/nonstrict-pass-unsigned-pricing-matrix-warning/payload/job_proof_bundle/events/events.jsonl +1 -0
  286. package/conformance/v1/bundles/invoicebundle/nonstrict-pass-unsigned-pricing-matrix-warning/payload/job_proof_bundle/events/payload_material.jsonl +1 -0
  287. package/conformance/v1/bundles/invoicebundle/nonstrict-pass-unsigned-pricing-matrix-warning/payload/job_proof_bundle/governance/global/events/events.jsonl +1 -0
  288. package/conformance/v1/bundles/invoicebundle/nonstrict-pass-unsigned-pricing-matrix-warning/payload/job_proof_bundle/governance/global/events/payload_material.jsonl +1 -0
  289. package/conformance/v1/bundles/invoicebundle/nonstrict-pass-unsigned-pricing-matrix-warning/payload/job_proof_bundle/governance/global/snapshot.json +1 -0
  290. package/conformance/v1/bundles/invoicebundle/nonstrict-pass-unsigned-pricing-matrix-warning/payload/job_proof_bundle/governance/policy.json +1 -0
  291. package/conformance/v1/bundles/invoicebundle/nonstrict-pass-unsigned-pricing-matrix-warning/payload/job_proof_bundle/governance/revocations.json +1 -0
  292. package/conformance/v1/bundles/invoicebundle/nonstrict-pass-unsigned-pricing-matrix-warning/payload/job_proof_bundle/governance/tenant/events/events.jsonl +0 -0
  293. package/conformance/v1/bundles/invoicebundle/nonstrict-pass-unsigned-pricing-matrix-warning/payload/job_proof_bundle/governance/tenant/events/payload_material.jsonl +0 -0
  294. package/conformance/v1/bundles/invoicebundle/nonstrict-pass-unsigned-pricing-matrix-warning/payload/job_proof_bundle/governance/tenant/snapshot.json +1 -0
  295. package/conformance/v1/bundles/invoicebundle/nonstrict-pass-unsigned-pricing-matrix-warning/payload/job_proof_bundle/job/snapshot.json +1 -0
  296. package/conformance/v1/bundles/invoicebundle/nonstrict-pass-unsigned-pricing-matrix-warning/payload/job_proof_bundle/keys/public_keys.json +1 -0
  297. package/conformance/v1/bundles/invoicebundle/nonstrict-pass-unsigned-pricing-matrix-warning/payload/job_proof_bundle/manifest.json +1 -0
  298. package/conformance/v1/bundles/invoicebundle/nonstrict-pass-unsigned-pricing-matrix-warning/payload/job_proof_bundle/verify/report.json +1 -0
  299. package/conformance/v1/bundles/invoicebundle/nonstrict-pass-unsigned-pricing-matrix-warning/payload/job_proof_bundle/verify/verification_report.json +1 -0
  300. package/conformance/v1/bundles/invoicebundle/nonstrict-pass-unsigned-pricing-matrix-warning/pricing/pricing_matrix.json +1 -0
  301. package/conformance/v1/bundles/invoicebundle/nonstrict-pass-unsigned-pricing-matrix-warning/settld.json +1 -0
  302. package/conformance/v1/bundles/invoicebundle/nonstrict-pass-unsigned-pricing-matrix-warning/verify/verification_report.json +1 -0
  303. package/conformance/v1/bundles/invoicebundle/strict-fail-evidence-sha-mismatch/attestation/bundle_head_attestation.json +1 -0
  304. package/conformance/v1/bundles/invoicebundle/strict-fail-evidence-sha-mismatch/governance/policy.json +1 -0
  305. package/conformance/v1/bundles/invoicebundle/strict-fail-evidence-sha-mismatch/governance/revocations.json +1 -0
  306. package/conformance/v1/bundles/invoicebundle/strict-fail-evidence-sha-mismatch/invoice/invoice_claim.json +1 -0
  307. package/conformance/v1/bundles/invoicebundle/strict-fail-evidence-sha-mismatch/manifest.json +1 -0
  308. package/conformance/v1/bundles/invoicebundle/strict-fail-evidence-sha-mismatch/metering/metering_report.json +1 -0
  309. package/conformance/v1/bundles/invoicebundle/strict-fail-evidence-sha-mismatch/payload/job_proof_bundle/attestation/bundle_head_attestation.json +1 -0
  310. package/conformance/v1/bundles/invoicebundle/strict-fail-evidence-sha-mismatch/payload/job_proof_bundle/events/events.jsonl +1 -0
  311. package/conformance/v1/bundles/invoicebundle/strict-fail-evidence-sha-mismatch/payload/job_proof_bundle/events/payload_material.jsonl +1 -0
  312. package/conformance/v1/bundles/invoicebundle/strict-fail-evidence-sha-mismatch/payload/job_proof_bundle/governance/global/events/events.jsonl +1 -0
  313. package/conformance/v1/bundles/invoicebundle/strict-fail-evidence-sha-mismatch/payload/job_proof_bundle/governance/global/events/payload_material.jsonl +1 -0
  314. package/conformance/v1/bundles/invoicebundle/strict-fail-evidence-sha-mismatch/payload/job_proof_bundle/governance/global/snapshot.json +1 -0
  315. package/conformance/v1/bundles/invoicebundle/strict-fail-evidence-sha-mismatch/payload/job_proof_bundle/governance/policy.json +1 -0
  316. package/conformance/v1/bundles/invoicebundle/strict-fail-evidence-sha-mismatch/payload/job_proof_bundle/governance/revocations.json +1 -0
  317. package/conformance/v1/bundles/invoicebundle/strict-fail-evidence-sha-mismatch/payload/job_proof_bundle/governance/tenant/events/events.jsonl +0 -0
  318. package/conformance/v1/bundles/invoicebundle/strict-fail-evidence-sha-mismatch/payload/job_proof_bundle/governance/tenant/events/payload_material.jsonl +0 -0
  319. package/conformance/v1/bundles/invoicebundle/strict-fail-evidence-sha-mismatch/payload/job_proof_bundle/governance/tenant/snapshot.json +1 -0
  320. package/conformance/v1/bundles/invoicebundle/strict-fail-evidence-sha-mismatch/payload/job_proof_bundle/job/snapshot.json +1 -0
  321. package/conformance/v1/bundles/invoicebundle/strict-fail-evidence-sha-mismatch/payload/job_proof_bundle/keys/public_keys.json +1 -0
  322. package/conformance/v1/bundles/invoicebundle/strict-fail-evidence-sha-mismatch/payload/job_proof_bundle/manifest.json +1 -0
  323. package/conformance/v1/bundles/invoicebundle/strict-fail-evidence-sha-mismatch/payload/job_proof_bundle/verify/report.json +1 -0
  324. package/conformance/v1/bundles/invoicebundle/strict-fail-evidence-sha-mismatch/payload/job_proof_bundle/verify/verification_report.json +1 -0
  325. package/conformance/v1/bundles/invoicebundle/strict-fail-evidence-sha-mismatch/pricing/pricing_matrix.json +1 -0
  326. package/conformance/v1/bundles/invoicebundle/strict-fail-evidence-sha-mismatch/pricing/pricing_matrix_signatures.json +1 -0
  327. package/conformance/v1/bundles/invoicebundle/strict-fail-evidence-sha-mismatch/settld.json +1 -0
  328. package/conformance/v1/bundles/invoicebundle/strict-fail-evidence-sha-mismatch/verify/verification_report.json +1 -0
  329. package/conformance/v1/bundles/invoicebundle/strict-fail-invalid-pricing-matrix-signature/attestation/bundle_head_attestation.json +1 -0
  330. package/conformance/v1/bundles/invoicebundle/strict-fail-invalid-pricing-matrix-signature/governance/policy.json +1 -0
  331. package/conformance/v1/bundles/invoicebundle/strict-fail-invalid-pricing-matrix-signature/governance/revocations.json +1 -0
  332. package/conformance/v1/bundles/invoicebundle/strict-fail-invalid-pricing-matrix-signature/invoice/invoice_claim.json +1 -0
  333. package/conformance/v1/bundles/invoicebundle/strict-fail-invalid-pricing-matrix-signature/manifest.json +1 -0
  334. package/conformance/v1/bundles/invoicebundle/strict-fail-invalid-pricing-matrix-signature/metering/metering_report.json +1 -0
  335. package/conformance/v1/bundles/invoicebundle/strict-fail-invalid-pricing-matrix-signature/payload/job_proof_bundle/attestation/bundle_head_attestation.json +1 -0
  336. package/conformance/v1/bundles/invoicebundle/strict-fail-invalid-pricing-matrix-signature/payload/job_proof_bundle/events/events.jsonl +1 -0
  337. package/conformance/v1/bundles/invoicebundle/strict-fail-invalid-pricing-matrix-signature/payload/job_proof_bundle/events/payload_material.jsonl +1 -0
  338. package/conformance/v1/bundles/invoicebundle/strict-fail-invalid-pricing-matrix-signature/payload/job_proof_bundle/governance/global/events/events.jsonl +1 -0
  339. package/conformance/v1/bundles/invoicebundle/strict-fail-invalid-pricing-matrix-signature/payload/job_proof_bundle/governance/global/events/payload_material.jsonl +1 -0
  340. package/conformance/v1/bundles/invoicebundle/strict-fail-invalid-pricing-matrix-signature/payload/job_proof_bundle/governance/global/snapshot.json +1 -0
  341. package/conformance/v1/bundles/invoicebundle/strict-fail-invalid-pricing-matrix-signature/payload/job_proof_bundle/governance/policy.json +1 -0
  342. package/conformance/v1/bundles/invoicebundle/strict-fail-invalid-pricing-matrix-signature/payload/job_proof_bundle/governance/revocations.json +1 -0
  343. package/conformance/v1/bundles/invoicebundle/strict-fail-invalid-pricing-matrix-signature/payload/job_proof_bundle/governance/tenant/events/events.jsonl +0 -0
  344. package/conformance/v1/bundles/invoicebundle/strict-fail-invalid-pricing-matrix-signature/payload/job_proof_bundle/governance/tenant/events/payload_material.jsonl +0 -0
  345. package/conformance/v1/bundles/invoicebundle/strict-fail-invalid-pricing-matrix-signature/payload/job_proof_bundle/governance/tenant/snapshot.json +1 -0
  346. package/conformance/v1/bundles/invoicebundle/strict-fail-invalid-pricing-matrix-signature/payload/job_proof_bundle/job/snapshot.json +1 -0
  347. package/conformance/v1/bundles/invoicebundle/strict-fail-invalid-pricing-matrix-signature/payload/job_proof_bundle/keys/public_keys.json +1 -0
  348. package/conformance/v1/bundles/invoicebundle/strict-fail-invalid-pricing-matrix-signature/payload/job_proof_bundle/manifest.json +1 -0
  349. package/conformance/v1/bundles/invoicebundle/strict-fail-invalid-pricing-matrix-signature/payload/job_proof_bundle/verify/report.json +1 -0
  350. package/conformance/v1/bundles/invoicebundle/strict-fail-invalid-pricing-matrix-signature/payload/job_proof_bundle/verify/verification_report.json +1 -0
  351. package/conformance/v1/bundles/invoicebundle/strict-fail-invalid-pricing-matrix-signature/pricing/pricing_matrix.json +1 -0
  352. package/conformance/v1/bundles/invoicebundle/strict-fail-invalid-pricing-matrix-signature/pricing/pricing_matrix_signatures.json +1 -0
  353. package/conformance/v1/bundles/invoicebundle/strict-fail-invalid-pricing-matrix-signature/settld.json +1 -0
  354. package/conformance/v1/bundles/invoicebundle/strict-fail-invalid-pricing-matrix-signature/verify/verification_report.json +1 -0
  355. package/conformance/v1/bundles/invoicebundle/strict-fail-invoice-total-mismatch/attestation/bundle_head_attestation.json +1 -0
  356. package/conformance/v1/bundles/invoicebundle/strict-fail-invoice-total-mismatch/governance/policy.json +1 -0
  357. package/conformance/v1/bundles/invoicebundle/strict-fail-invoice-total-mismatch/governance/revocations.json +1 -0
  358. package/conformance/v1/bundles/invoicebundle/strict-fail-invoice-total-mismatch/invoice/invoice_claim.json +1 -0
  359. package/conformance/v1/bundles/invoicebundle/strict-fail-invoice-total-mismatch/manifest.json +1 -0
  360. package/conformance/v1/bundles/invoicebundle/strict-fail-invoice-total-mismatch/metering/metering_report.json +1 -0
  361. package/conformance/v1/bundles/invoicebundle/strict-fail-invoice-total-mismatch/payload/job_proof_bundle/attestation/bundle_head_attestation.json +1 -0
  362. package/conformance/v1/bundles/invoicebundle/strict-fail-invoice-total-mismatch/payload/job_proof_bundle/events/events.jsonl +1 -0
  363. package/conformance/v1/bundles/invoicebundle/strict-fail-invoice-total-mismatch/payload/job_proof_bundle/events/payload_material.jsonl +1 -0
  364. package/conformance/v1/bundles/invoicebundle/strict-fail-invoice-total-mismatch/payload/job_proof_bundle/governance/global/events/events.jsonl +1 -0
  365. package/conformance/v1/bundles/invoicebundle/strict-fail-invoice-total-mismatch/payload/job_proof_bundle/governance/global/events/payload_material.jsonl +1 -0
  366. package/conformance/v1/bundles/invoicebundle/strict-fail-invoice-total-mismatch/payload/job_proof_bundle/governance/global/snapshot.json +1 -0
  367. package/conformance/v1/bundles/invoicebundle/strict-fail-invoice-total-mismatch/payload/job_proof_bundle/governance/policy.json +1 -0
  368. package/conformance/v1/bundles/invoicebundle/strict-fail-invoice-total-mismatch/payload/job_proof_bundle/governance/revocations.json +1 -0
  369. package/conformance/v1/bundles/invoicebundle/strict-fail-invoice-total-mismatch/payload/job_proof_bundle/governance/tenant/events/events.jsonl +0 -0
  370. package/conformance/v1/bundles/invoicebundle/strict-fail-invoice-total-mismatch/payload/job_proof_bundle/governance/tenant/events/payload_material.jsonl +0 -0
  371. package/conformance/v1/bundles/invoicebundle/strict-fail-invoice-total-mismatch/payload/job_proof_bundle/governance/tenant/snapshot.json +1 -0
  372. package/conformance/v1/bundles/invoicebundle/strict-fail-invoice-total-mismatch/payload/job_proof_bundle/job/snapshot.json +1 -0
  373. package/conformance/v1/bundles/invoicebundle/strict-fail-invoice-total-mismatch/payload/job_proof_bundle/keys/public_keys.json +1 -0
  374. package/conformance/v1/bundles/invoicebundle/strict-fail-invoice-total-mismatch/payload/job_proof_bundle/manifest.json +1 -0
  375. package/conformance/v1/bundles/invoicebundle/strict-fail-invoice-total-mismatch/payload/job_proof_bundle/verify/report.json +1 -0
  376. package/conformance/v1/bundles/invoicebundle/strict-fail-invoice-total-mismatch/payload/job_proof_bundle/verify/verification_report.json +1 -0
  377. package/conformance/v1/bundles/invoicebundle/strict-fail-invoice-total-mismatch/pricing/pricing_matrix.json +1 -0
  378. package/conformance/v1/bundles/invoicebundle/strict-fail-invoice-total-mismatch/pricing/pricing_matrix_signatures.json +1 -0
  379. package/conformance/v1/bundles/invoicebundle/strict-fail-invoice-total-mismatch/settld.json +1 -0
  380. package/conformance/v1/bundles/invoicebundle/strict-fail-invoice-total-mismatch/verify/verification_report.json +1 -0
  381. package/conformance/v1/bundles/invoicebundle/strict-fail-missing-pricing-matrix-signature/attestation/bundle_head_attestation.json +1 -0
  382. package/conformance/v1/bundles/invoicebundle/strict-fail-missing-pricing-matrix-signature/governance/policy.json +1 -0
  383. package/conformance/v1/bundles/invoicebundle/strict-fail-missing-pricing-matrix-signature/governance/revocations.json +1 -0
  384. package/conformance/v1/bundles/invoicebundle/strict-fail-missing-pricing-matrix-signature/invoice/invoice_claim.json +1 -0
  385. package/conformance/v1/bundles/invoicebundle/strict-fail-missing-pricing-matrix-signature/manifest.json +1 -0
  386. package/conformance/v1/bundles/invoicebundle/strict-fail-missing-pricing-matrix-signature/metering/metering_report.json +1 -0
  387. package/conformance/v1/bundles/invoicebundle/strict-fail-missing-pricing-matrix-signature/payload/job_proof_bundle/attestation/bundle_head_attestation.json +1 -0
  388. package/conformance/v1/bundles/invoicebundle/strict-fail-missing-pricing-matrix-signature/payload/job_proof_bundle/events/events.jsonl +1 -0
  389. package/conformance/v1/bundles/invoicebundle/strict-fail-missing-pricing-matrix-signature/payload/job_proof_bundle/events/payload_material.jsonl +1 -0
  390. package/conformance/v1/bundles/invoicebundle/strict-fail-missing-pricing-matrix-signature/payload/job_proof_bundle/governance/global/events/events.jsonl +1 -0
  391. package/conformance/v1/bundles/invoicebundle/strict-fail-missing-pricing-matrix-signature/payload/job_proof_bundle/governance/global/events/payload_material.jsonl +1 -0
  392. package/conformance/v1/bundles/invoicebundle/strict-fail-missing-pricing-matrix-signature/payload/job_proof_bundle/governance/global/snapshot.json +1 -0
  393. package/conformance/v1/bundles/invoicebundle/strict-fail-missing-pricing-matrix-signature/payload/job_proof_bundle/governance/policy.json +1 -0
  394. package/conformance/v1/bundles/invoicebundle/strict-fail-missing-pricing-matrix-signature/payload/job_proof_bundle/governance/revocations.json +1 -0
  395. package/conformance/v1/bundles/invoicebundle/strict-fail-missing-pricing-matrix-signature/payload/job_proof_bundle/governance/tenant/events/events.jsonl +0 -0
  396. package/conformance/v1/bundles/invoicebundle/strict-fail-missing-pricing-matrix-signature/payload/job_proof_bundle/governance/tenant/events/payload_material.jsonl +0 -0
  397. package/conformance/v1/bundles/invoicebundle/strict-fail-missing-pricing-matrix-signature/payload/job_proof_bundle/governance/tenant/snapshot.json +1 -0
  398. package/conformance/v1/bundles/invoicebundle/strict-fail-missing-pricing-matrix-signature/payload/job_proof_bundle/job/snapshot.json +1 -0
  399. package/conformance/v1/bundles/invoicebundle/strict-fail-missing-pricing-matrix-signature/payload/job_proof_bundle/keys/public_keys.json +1 -0
  400. package/conformance/v1/bundles/invoicebundle/strict-fail-missing-pricing-matrix-signature/payload/job_proof_bundle/manifest.json +1 -0
  401. package/conformance/v1/bundles/invoicebundle/strict-fail-missing-pricing-matrix-signature/payload/job_proof_bundle/verify/report.json +1 -0
  402. package/conformance/v1/bundles/invoicebundle/strict-fail-missing-pricing-matrix-signature/payload/job_proof_bundle/verify/verification_report.json +1 -0
  403. package/conformance/v1/bundles/invoicebundle/strict-fail-missing-pricing-matrix-signature/pricing/pricing_matrix.json +1 -0
  404. package/conformance/v1/bundles/invoicebundle/strict-fail-missing-pricing-matrix-signature/settld.json +1 -0
  405. package/conformance/v1/bundles/invoicebundle/strict-fail-missing-pricing-matrix-signature/verify/verification_report.json +1 -0
  406. package/conformance/v1/bundles/invoicebundle/strict-fail-missing-verification-report/attestation/bundle_head_attestation.json +1 -0
  407. package/conformance/v1/bundles/invoicebundle/strict-fail-missing-verification-report/governance/policy.json +1 -0
  408. package/conformance/v1/bundles/invoicebundle/strict-fail-missing-verification-report/governance/revocations.json +1 -0
  409. package/conformance/v1/bundles/invoicebundle/strict-fail-missing-verification-report/invoice/invoice_claim.json +1 -0
  410. package/conformance/v1/bundles/invoicebundle/strict-fail-missing-verification-report/manifest.json +1 -0
  411. package/conformance/v1/bundles/invoicebundle/strict-fail-missing-verification-report/metering/metering_report.json +1 -0
  412. package/conformance/v1/bundles/invoicebundle/strict-fail-missing-verification-report/payload/job_proof_bundle/attestation/bundle_head_attestation.json +1 -0
  413. package/conformance/v1/bundles/invoicebundle/strict-fail-missing-verification-report/payload/job_proof_bundle/events/events.jsonl +1 -0
  414. package/conformance/v1/bundles/invoicebundle/strict-fail-missing-verification-report/payload/job_proof_bundle/events/payload_material.jsonl +1 -0
  415. package/conformance/v1/bundles/invoicebundle/strict-fail-missing-verification-report/payload/job_proof_bundle/governance/global/events/events.jsonl +1 -0
  416. package/conformance/v1/bundles/invoicebundle/strict-fail-missing-verification-report/payload/job_proof_bundle/governance/global/events/payload_material.jsonl +1 -0
  417. package/conformance/v1/bundles/invoicebundle/strict-fail-missing-verification-report/payload/job_proof_bundle/governance/global/snapshot.json +1 -0
  418. package/conformance/v1/bundles/invoicebundle/strict-fail-missing-verification-report/payload/job_proof_bundle/governance/policy.json +1 -0
  419. package/conformance/v1/bundles/invoicebundle/strict-fail-missing-verification-report/payload/job_proof_bundle/governance/revocations.json +1 -0
  420. package/conformance/v1/bundles/invoicebundle/strict-fail-missing-verification-report/payload/job_proof_bundle/governance/tenant/events/events.jsonl +0 -0
  421. package/conformance/v1/bundles/invoicebundle/strict-fail-missing-verification-report/payload/job_proof_bundle/governance/tenant/events/payload_material.jsonl +0 -0
  422. package/conformance/v1/bundles/invoicebundle/strict-fail-missing-verification-report/payload/job_proof_bundle/governance/tenant/snapshot.json +1 -0
  423. package/conformance/v1/bundles/invoicebundle/strict-fail-missing-verification-report/payload/job_proof_bundle/job/snapshot.json +1 -0
  424. package/conformance/v1/bundles/invoicebundle/strict-fail-missing-verification-report/payload/job_proof_bundle/keys/public_keys.json +1 -0
  425. package/conformance/v1/bundles/invoicebundle/strict-fail-missing-verification-report/payload/job_proof_bundle/manifest.json +1 -0
  426. package/conformance/v1/bundles/invoicebundle/strict-fail-missing-verification-report/payload/job_proof_bundle/verify/report.json +1 -0
  427. package/conformance/v1/bundles/invoicebundle/strict-fail-missing-verification-report/payload/job_proof_bundle/verify/verification_report.json +1 -0
  428. package/conformance/v1/bundles/invoicebundle/strict-fail-missing-verification-report/pricing/pricing_matrix.json +1 -0
  429. package/conformance/v1/bundles/invoicebundle/strict-fail-missing-verification-report/pricing/pricing_matrix_signatures.json +1 -0
  430. package/conformance/v1/bundles/invoicebundle/strict-fail-missing-verification-report/settld.json +1 -0
  431. package/conformance/v1/bundles/invoicebundle/strict-fail-pricing-code-unknown/attestation/bundle_head_attestation.json +1 -0
  432. package/conformance/v1/bundles/invoicebundle/strict-fail-pricing-code-unknown/governance/policy.json +1 -0
  433. package/conformance/v1/bundles/invoicebundle/strict-fail-pricing-code-unknown/governance/revocations.json +1 -0
  434. package/conformance/v1/bundles/invoicebundle/strict-fail-pricing-code-unknown/invoice/invoice_claim.json +1 -0
  435. package/conformance/v1/bundles/invoicebundle/strict-fail-pricing-code-unknown/manifest.json +1 -0
  436. package/conformance/v1/bundles/invoicebundle/strict-fail-pricing-code-unknown/metering/metering_report.json +1 -0
  437. package/conformance/v1/bundles/invoicebundle/strict-fail-pricing-code-unknown/payload/job_proof_bundle/attestation/bundle_head_attestation.json +1 -0
  438. package/conformance/v1/bundles/invoicebundle/strict-fail-pricing-code-unknown/payload/job_proof_bundle/events/events.jsonl +1 -0
  439. package/conformance/v1/bundles/invoicebundle/strict-fail-pricing-code-unknown/payload/job_proof_bundle/events/payload_material.jsonl +1 -0
  440. package/conformance/v1/bundles/invoicebundle/strict-fail-pricing-code-unknown/payload/job_proof_bundle/governance/global/events/events.jsonl +1 -0
  441. package/conformance/v1/bundles/invoicebundle/strict-fail-pricing-code-unknown/payload/job_proof_bundle/governance/global/events/payload_material.jsonl +1 -0
  442. package/conformance/v1/bundles/invoicebundle/strict-fail-pricing-code-unknown/payload/job_proof_bundle/governance/global/snapshot.json +1 -0
  443. package/conformance/v1/bundles/invoicebundle/strict-fail-pricing-code-unknown/payload/job_proof_bundle/governance/policy.json +1 -0
  444. package/conformance/v1/bundles/invoicebundle/strict-fail-pricing-code-unknown/payload/job_proof_bundle/governance/revocations.json +1 -0
  445. package/conformance/v1/bundles/invoicebundle/strict-fail-pricing-code-unknown/payload/job_proof_bundle/governance/tenant/events/events.jsonl +0 -0
  446. package/conformance/v1/bundles/invoicebundle/strict-fail-pricing-code-unknown/payload/job_proof_bundle/governance/tenant/events/payload_material.jsonl +0 -0
  447. package/conformance/v1/bundles/invoicebundle/strict-fail-pricing-code-unknown/payload/job_proof_bundle/governance/tenant/snapshot.json +1 -0
  448. package/conformance/v1/bundles/invoicebundle/strict-fail-pricing-code-unknown/payload/job_proof_bundle/job/snapshot.json +1 -0
  449. package/conformance/v1/bundles/invoicebundle/strict-fail-pricing-code-unknown/payload/job_proof_bundle/keys/public_keys.json +1 -0
  450. package/conformance/v1/bundles/invoicebundle/strict-fail-pricing-code-unknown/payload/job_proof_bundle/manifest.json +1 -0
  451. package/conformance/v1/bundles/invoicebundle/strict-fail-pricing-code-unknown/payload/job_proof_bundle/verify/report.json +1 -0
  452. package/conformance/v1/bundles/invoicebundle/strict-fail-pricing-code-unknown/payload/job_proof_bundle/verify/verification_report.json +1 -0
  453. package/conformance/v1/bundles/invoicebundle/strict-fail-pricing-code-unknown/pricing/pricing_matrix.json +1 -0
  454. package/conformance/v1/bundles/invoicebundle/strict-fail-pricing-code-unknown/pricing/pricing_matrix_signatures.json +1 -0
  455. package/conformance/v1/bundles/invoicebundle/strict-fail-pricing-code-unknown/settld.json +1 -0
  456. package/conformance/v1/bundles/invoicebundle/strict-fail-pricing-code-unknown/verify/verification_report.json +1 -0
  457. package/conformance/v1/bundles/invoicebundle/strict-pass/attestation/bundle_head_attestation.json +1 -0
  458. package/conformance/v1/bundles/invoicebundle/strict-pass/governance/policy.json +1 -0
  459. package/conformance/v1/bundles/invoicebundle/strict-pass/governance/revocations.json +1 -0
  460. package/conformance/v1/bundles/invoicebundle/strict-pass/invoice/invoice_claim.json +1 -0
  461. package/conformance/v1/bundles/invoicebundle/strict-pass/manifest.json +1 -0
  462. package/conformance/v1/bundles/invoicebundle/strict-pass/metering/metering_report.json +1 -0
  463. package/conformance/v1/bundles/invoicebundle/strict-pass/payload/job_proof_bundle/attestation/bundle_head_attestation.json +1 -0
  464. package/conformance/v1/bundles/invoicebundle/strict-pass/payload/job_proof_bundle/events/events.jsonl +1 -0
  465. package/conformance/v1/bundles/invoicebundle/strict-pass/payload/job_proof_bundle/events/payload_material.jsonl +1 -0
  466. package/conformance/v1/bundles/invoicebundle/strict-pass/payload/job_proof_bundle/governance/global/events/events.jsonl +1 -0
  467. package/conformance/v1/bundles/invoicebundle/strict-pass/payload/job_proof_bundle/governance/global/events/payload_material.jsonl +1 -0
  468. package/conformance/v1/bundles/invoicebundle/strict-pass/payload/job_proof_bundle/governance/global/snapshot.json +1 -0
  469. package/conformance/v1/bundles/invoicebundle/strict-pass/payload/job_proof_bundle/governance/policy.json +1 -0
  470. package/conformance/v1/bundles/invoicebundle/strict-pass/payload/job_proof_bundle/governance/revocations.json +1 -0
  471. package/conformance/v1/bundles/invoicebundle/strict-pass/payload/job_proof_bundle/governance/tenant/events/events.jsonl +0 -0
  472. package/conformance/v1/bundles/invoicebundle/strict-pass/payload/job_proof_bundle/governance/tenant/events/payload_material.jsonl +0 -0
  473. package/conformance/v1/bundles/invoicebundle/strict-pass/payload/job_proof_bundle/governance/tenant/snapshot.json +1 -0
  474. package/conformance/v1/bundles/invoicebundle/strict-pass/payload/job_proof_bundle/job/snapshot.json +1 -0
  475. package/conformance/v1/bundles/invoicebundle/strict-pass/payload/job_proof_bundle/keys/public_keys.json +1 -0
  476. package/conformance/v1/bundles/invoicebundle/strict-pass/payload/job_proof_bundle/manifest.json +1 -0
  477. package/conformance/v1/bundles/invoicebundle/strict-pass/payload/job_proof_bundle/verify/report.json +1 -0
  478. package/conformance/v1/bundles/invoicebundle/strict-pass/payload/job_proof_bundle/verify/verification_report.json +1 -0
  479. package/conformance/v1/bundles/invoicebundle/strict-pass/pricing/pricing_matrix.json +1 -0
  480. package/conformance/v1/bundles/invoicebundle/strict-pass/pricing/pricing_matrix_signatures.json +1 -0
  481. package/conformance/v1/bundles/invoicebundle/strict-pass/settld.json +1 -0
  482. package/conformance/v1/bundles/invoicebundle/strict-pass/verify/verification_report.json +1 -0
  483. package/conformance/v1/bundles/jobproof/nonstrict-pass-missing-verification-report/attestation/bundle_head_attestation.json +1 -0
  484. package/conformance/v1/bundles/jobproof/nonstrict-pass-missing-verification-report/events/events.jsonl +1 -0
  485. package/conformance/v1/bundles/jobproof/nonstrict-pass-missing-verification-report/events/payload_material.jsonl +1 -0
  486. package/conformance/v1/bundles/jobproof/nonstrict-pass-missing-verification-report/governance/global/events/events.jsonl +1 -0
  487. package/conformance/v1/bundles/jobproof/nonstrict-pass-missing-verification-report/governance/global/events/payload_material.jsonl +1 -0
  488. package/conformance/v1/bundles/jobproof/nonstrict-pass-missing-verification-report/governance/global/snapshot.json +1 -0
  489. package/conformance/v1/bundles/jobproof/nonstrict-pass-missing-verification-report/governance/policy.json +1 -0
  490. package/conformance/v1/bundles/jobproof/nonstrict-pass-missing-verification-report/governance/revocations.json +1 -0
  491. package/conformance/v1/bundles/jobproof/nonstrict-pass-missing-verification-report/governance/tenant/events/events.jsonl +0 -0
  492. package/conformance/v1/bundles/jobproof/nonstrict-pass-missing-verification-report/governance/tenant/events/payload_material.jsonl +0 -0
  493. package/conformance/v1/bundles/jobproof/nonstrict-pass-missing-verification-report/governance/tenant/snapshot.json +1 -0
  494. package/conformance/v1/bundles/jobproof/nonstrict-pass-missing-verification-report/job/snapshot.json +1 -0
  495. package/conformance/v1/bundles/jobproof/nonstrict-pass-missing-verification-report/keys/public_keys.json +1 -0
  496. package/conformance/v1/bundles/jobproof/nonstrict-pass-missing-verification-report/manifest.json +1 -0
  497. package/conformance/v1/bundles/jobproof/nonstrict-pass-missing-verification-report/verify/report.json +1 -0
  498. package/conformance/v1/bundles/jobproof/strict-fail-manifest-tamper/attestation/bundle_head_attestation.json +1 -0
  499. package/conformance/v1/bundles/jobproof/strict-fail-manifest-tamper/events/events.jsonl +1 -0
  500. package/conformance/v1/bundles/jobproof/strict-fail-manifest-tamper/events/payload_material.jsonl +1 -0
  501. package/conformance/v1/bundles/jobproof/strict-fail-manifest-tamper/governance/global/events/events.jsonl +1 -0
  502. package/conformance/v1/bundles/jobproof/strict-fail-manifest-tamper/governance/global/events/payload_material.jsonl +1 -0
  503. package/conformance/v1/bundles/jobproof/strict-fail-manifest-tamper/governance/global/snapshot.json +1 -0
  504. package/conformance/v1/bundles/jobproof/strict-fail-manifest-tamper/governance/policy.json +1 -0
  505. package/conformance/v1/bundles/jobproof/strict-fail-manifest-tamper/governance/revocations.json +1 -0
  506. package/conformance/v1/bundles/jobproof/strict-fail-manifest-tamper/governance/tenant/events/events.jsonl +0 -0
  507. package/conformance/v1/bundles/jobproof/strict-fail-manifest-tamper/governance/tenant/events/payload_material.jsonl +0 -0
  508. package/conformance/v1/bundles/jobproof/strict-fail-manifest-tamper/governance/tenant/snapshot.json +1 -0
  509. package/conformance/v1/bundles/jobproof/strict-fail-manifest-tamper/job/snapshot.json +1 -0
  510. package/conformance/v1/bundles/jobproof/strict-fail-manifest-tamper/keys/public_keys.json +1 -0
  511. package/conformance/v1/bundles/jobproof/strict-fail-manifest-tamper/manifest.json +1 -0
  512. package/conformance/v1/bundles/jobproof/strict-fail-manifest-tamper/verify/report.json +1 -0
  513. package/conformance/v1/bundles/jobproof/strict-fail-manifest-tamper/verify/verification_report.json +1 -0
  514. package/conformance/v1/bundles/jobproof/strict-fail-unauthorized-signer/attestation/bundle_head_attestation.json +1 -0
  515. package/conformance/v1/bundles/jobproof/strict-fail-unauthorized-signer/events/events.jsonl +1 -0
  516. package/conformance/v1/bundles/jobproof/strict-fail-unauthorized-signer/events/payload_material.jsonl +1 -0
  517. package/conformance/v1/bundles/jobproof/strict-fail-unauthorized-signer/governance/global/events/events.jsonl +1 -0
  518. package/conformance/v1/bundles/jobproof/strict-fail-unauthorized-signer/governance/global/events/payload_material.jsonl +1 -0
  519. package/conformance/v1/bundles/jobproof/strict-fail-unauthorized-signer/governance/global/snapshot.json +1 -0
  520. package/conformance/v1/bundles/jobproof/strict-fail-unauthorized-signer/governance/policy.json +1 -0
  521. package/conformance/v1/bundles/jobproof/strict-fail-unauthorized-signer/governance/revocations.json +1 -0
  522. package/conformance/v1/bundles/jobproof/strict-fail-unauthorized-signer/governance/tenant/events/events.jsonl +0 -0
  523. package/conformance/v1/bundles/jobproof/strict-fail-unauthorized-signer/governance/tenant/events/payload_material.jsonl +0 -0
  524. package/conformance/v1/bundles/jobproof/strict-fail-unauthorized-signer/governance/tenant/snapshot.json +1 -0
  525. package/conformance/v1/bundles/jobproof/strict-fail-unauthorized-signer/job/snapshot.json +1 -0
  526. package/conformance/v1/bundles/jobproof/strict-fail-unauthorized-signer/keys/public_keys.json +1 -0
  527. package/conformance/v1/bundles/jobproof/strict-fail-unauthorized-signer/manifest.json +1 -0
  528. package/conformance/v1/bundles/jobproof/strict-fail-unauthorized-signer/verify/report.json +1 -0
  529. package/conformance/v1/bundles/jobproof/strict-fail-unauthorized-signer/verify/verification_report.json +1 -0
  530. package/conformance/v1/bundles/jobproof/strict-pass/attestation/bundle_head_attestation.json +1 -0
  531. package/conformance/v1/bundles/jobproof/strict-pass/events/events.jsonl +1 -0
  532. package/conformance/v1/bundles/jobproof/strict-pass/events/payload_material.jsonl +1 -0
  533. package/conformance/v1/bundles/jobproof/strict-pass/governance/global/events/events.jsonl +1 -0
  534. package/conformance/v1/bundles/jobproof/strict-pass/governance/global/events/payload_material.jsonl +1 -0
  535. package/conformance/v1/bundles/jobproof/strict-pass/governance/global/snapshot.json +1 -0
  536. package/conformance/v1/bundles/jobproof/strict-pass/governance/policy.json +1 -0
  537. package/conformance/v1/bundles/jobproof/strict-pass/governance/revocations.json +1 -0
  538. package/conformance/v1/bundles/jobproof/strict-pass/governance/tenant/events/events.jsonl +0 -0
  539. package/conformance/v1/bundles/jobproof/strict-pass/governance/tenant/events/payload_material.jsonl +0 -0
  540. package/conformance/v1/bundles/jobproof/strict-pass/governance/tenant/snapshot.json +1 -0
  541. package/conformance/v1/bundles/jobproof/strict-pass/job/snapshot.json +1 -0
  542. package/conformance/v1/bundles/jobproof/strict-pass/keys/public_keys.json +1 -0
  543. package/conformance/v1/bundles/jobproof/strict-pass/manifest.json +1 -0
  544. package/conformance/v1/bundles/jobproof/strict-pass/verify/report.json +1 -0
  545. package/conformance/v1/bundles/jobproof/strict-pass/verify/verification_report.json +1 -0
  546. package/conformance/v1/bundles/monthproof/nonstrict-pass-missing-verification-report/attestation/bundle_head_attestation.json +1 -0
  547. package/conformance/v1/bundles/monthproof/nonstrict-pass-missing-verification-report/events/events.jsonl +1 -0
  548. package/conformance/v1/bundles/monthproof/nonstrict-pass-missing-verification-report/events/payload_material.jsonl +1 -0
  549. package/conformance/v1/bundles/monthproof/nonstrict-pass-missing-verification-report/governance/global/events/events.jsonl +1 -0
  550. package/conformance/v1/bundles/monthproof/nonstrict-pass-missing-verification-report/governance/global/events/payload_material.jsonl +1 -0
  551. package/conformance/v1/bundles/monthproof/nonstrict-pass-missing-verification-report/governance/global/snapshot.json +1 -0
  552. package/conformance/v1/bundles/monthproof/nonstrict-pass-missing-verification-report/governance/policy.json +1 -0
  553. package/conformance/v1/bundles/monthproof/nonstrict-pass-missing-verification-report/governance/revocations.json +1 -0
  554. package/conformance/v1/bundles/monthproof/nonstrict-pass-missing-verification-report/governance/tenant/events/events.jsonl +0 -0
  555. package/conformance/v1/bundles/monthproof/nonstrict-pass-missing-verification-report/governance/tenant/events/payload_material.jsonl +0 -0
  556. package/conformance/v1/bundles/monthproof/nonstrict-pass-missing-verification-report/governance/tenant/snapshot.json +1 -0
  557. package/conformance/v1/bundles/monthproof/nonstrict-pass-missing-verification-report/keys/public_keys.json +1 -0
  558. package/conformance/v1/bundles/monthproof/nonstrict-pass-missing-verification-report/manifest.json +1 -0
  559. package/conformance/v1/bundles/monthproof/nonstrict-pass-missing-verification-report/verify/report.json +1 -0
  560. package/conformance/v1/bundles/monthproof/strict-fail-manifest-tamper/attestation/bundle_head_attestation.json +1 -0
  561. package/conformance/v1/bundles/monthproof/strict-fail-manifest-tamper/events/events.jsonl +2 -0
  562. package/conformance/v1/bundles/monthproof/strict-fail-manifest-tamper/events/payload_material.jsonl +1 -0
  563. package/conformance/v1/bundles/monthproof/strict-fail-manifest-tamper/governance/global/events/events.jsonl +1 -0
  564. package/conformance/v1/bundles/monthproof/strict-fail-manifest-tamper/governance/global/events/payload_material.jsonl +1 -0
  565. package/conformance/v1/bundles/monthproof/strict-fail-manifest-tamper/governance/global/snapshot.json +1 -0
  566. package/conformance/v1/bundles/monthproof/strict-fail-manifest-tamper/governance/policy.json +1 -0
  567. package/conformance/v1/bundles/monthproof/strict-fail-manifest-tamper/governance/revocations.json +1 -0
  568. package/conformance/v1/bundles/monthproof/strict-fail-manifest-tamper/governance/tenant/events/events.jsonl +0 -0
  569. package/conformance/v1/bundles/monthproof/strict-fail-manifest-tamper/governance/tenant/events/payload_material.jsonl +0 -0
  570. package/conformance/v1/bundles/monthproof/strict-fail-manifest-tamper/governance/tenant/snapshot.json +1 -0
  571. package/conformance/v1/bundles/monthproof/strict-fail-manifest-tamper/keys/public_keys.json +1 -0
  572. package/conformance/v1/bundles/monthproof/strict-fail-manifest-tamper/manifest.json +1 -0
  573. package/conformance/v1/bundles/monthproof/strict-fail-manifest-tamper/verify/report.json +1 -0
  574. package/conformance/v1/bundles/monthproof/strict-fail-manifest-tamper/verify/verification_report.json +1 -0
  575. package/conformance/v1/bundles/monthproof/strict-fail-unauthorized-signer/attestation/bundle_head_attestation.json +1 -0
  576. package/conformance/v1/bundles/monthproof/strict-fail-unauthorized-signer/events/events.jsonl +1 -0
  577. package/conformance/v1/bundles/monthproof/strict-fail-unauthorized-signer/events/payload_material.jsonl +1 -0
  578. package/conformance/v1/bundles/monthproof/strict-fail-unauthorized-signer/governance/global/events/events.jsonl +1 -0
  579. package/conformance/v1/bundles/monthproof/strict-fail-unauthorized-signer/governance/global/events/payload_material.jsonl +1 -0
  580. package/conformance/v1/bundles/monthproof/strict-fail-unauthorized-signer/governance/global/snapshot.json +1 -0
  581. package/conformance/v1/bundles/monthproof/strict-fail-unauthorized-signer/governance/policy.json +1 -0
  582. package/conformance/v1/bundles/monthproof/strict-fail-unauthorized-signer/governance/revocations.json +1 -0
  583. package/conformance/v1/bundles/monthproof/strict-fail-unauthorized-signer/governance/tenant/events/events.jsonl +0 -0
  584. package/conformance/v1/bundles/monthproof/strict-fail-unauthorized-signer/governance/tenant/events/payload_material.jsonl +0 -0
  585. package/conformance/v1/bundles/monthproof/strict-fail-unauthorized-signer/governance/tenant/snapshot.json +1 -0
  586. package/conformance/v1/bundles/monthproof/strict-fail-unauthorized-signer/keys/public_keys.json +1 -0
  587. package/conformance/v1/bundles/monthproof/strict-fail-unauthorized-signer/manifest.json +1 -0
  588. package/conformance/v1/bundles/monthproof/strict-fail-unauthorized-signer/verify/report.json +1 -0
  589. package/conformance/v1/bundles/monthproof/strict-fail-unauthorized-signer/verify/verification_report.json +1 -0
  590. package/conformance/v1/bundles/monthproof/strict-pass/attestation/bundle_head_attestation.json +1 -0
  591. package/conformance/v1/bundles/monthproof/strict-pass/events/events.jsonl +1 -0
  592. package/conformance/v1/bundles/monthproof/strict-pass/events/payload_material.jsonl +1 -0
  593. package/conformance/v1/bundles/monthproof/strict-pass/governance/global/events/events.jsonl +1 -0
  594. package/conformance/v1/bundles/monthproof/strict-pass/governance/global/events/payload_material.jsonl +1 -0
  595. package/conformance/v1/bundles/monthproof/strict-pass/governance/global/snapshot.json +1 -0
  596. package/conformance/v1/bundles/monthproof/strict-pass/governance/policy.json +1 -0
  597. package/conformance/v1/bundles/monthproof/strict-pass/governance/revocations.json +1 -0
  598. package/conformance/v1/bundles/monthproof/strict-pass/governance/tenant/events/events.jsonl +0 -0
  599. package/conformance/v1/bundles/monthproof/strict-pass/governance/tenant/events/payload_material.jsonl +0 -0
  600. package/conformance/v1/bundles/monthproof/strict-pass/governance/tenant/snapshot.json +1 -0
  601. package/conformance/v1/bundles/monthproof/strict-pass/keys/public_keys.json +1 -0
  602. package/conformance/v1/bundles/monthproof/strict-pass/manifest.json +1 -0
  603. package/conformance/v1/bundles/monthproof/strict-pass/verify/report.json +1 -0
  604. package/conformance/v1/bundles/monthproof/strict-pass/verify/verification_report.json +1 -0
  605. package/conformance/v1/cases.json +381 -0
  606. package/conformance/v1/expected/closepack_nonstrict_pass_missing_sla_acceptance.json +9 -0
  607. package/conformance/v1/expected/closepack_strict_fail_embedded_invoice_fails.json +9 -0
  608. package/conformance/v1/expected/closepack_strict_fail_evidence_index_mismatch.json +9 -0
  609. package/conformance/v1/expected/closepack_strict_pass.json +9 -0
  610. package/conformance/v1/expected/financepack_strict_fail_missing_verification_report.json +9 -0
  611. package/conformance/v1/expected/financepack_strict_fail_on_warnings_tool_version_unknown.json +9 -0
  612. package/conformance/v1/expected/financepack_strict_fail_trust_roots_missing.json +9 -0
  613. package/conformance/v1/expected/financepack_strict_fail_trust_roots_wrong.json +9 -0
  614. package/conformance/v1/expected/financepack_strict_pass.json +9 -0
  615. package/conformance/v1/expected/invoicebundle_nonstrict_pass_missing_verification_report.json +9 -0
  616. package/conformance/v1/expected/invoicebundle_nonstrict_pass_unsigned_pricing_matrix_warning.json +9 -0
  617. package/conformance/v1/expected/invoicebundle_strict_fail_evidence_sha_mismatch.json +9 -0
  618. package/conformance/v1/expected/invoicebundle_strict_fail_invalid_pricing_matrix_signature.json +9 -0
  619. package/conformance/v1/expected/invoicebundle_strict_fail_invoice_total_mismatch.json +9 -0
  620. package/conformance/v1/expected/invoicebundle_strict_fail_missing_pricing_matrix_signature.json +9 -0
  621. package/conformance/v1/expected/invoicebundle_strict_fail_missing_verification_report.json +9 -0
  622. package/conformance/v1/expected/invoicebundle_strict_fail_pricing_code_unknown.json +9 -0
  623. package/conformance/v1/expected/invoicebundle_strict_pass.json +9 -0
  624. package/conformance/v1/expected/jobproof_nonstrict_pass_missing_verification_report.json +9 -0
  625. package/conformance/v1/expected/jobproof_strict_fail_manifest_tamper.json +9 -0
  626. package/conformance/v1/expected/jobproof_strict_fail_unauthorized_signer.json +9 -0
  627. package/conformance/v1/expected/jobproof_strict_pass.json +9 -0
  628. package/conformance/v1/expected/monthproof_nonstrict_pass_missing_verification_report.json +9 -0
  629. package/conformance/v1/expected/monthproof_strict_fail_manifest_tamper.json +9 -0
  630. package/conformance/v1/expected/monthproof_strict_fail_unauthorized_signer.json +9 -0
  631. package/conformance/v1/expected/monthproof_strict_pass.json +9 -0
  632. package/conformance/v1/expected/security_bundle_symlink_outside.json +9 -0
  633. package/conformance/v1/expected/security_manifest_case_collision.json +8 -0
  634. package/conformance/v1/expected/security_manifest_duplicate_paths.json +9 -0
  635. package/conformance/v1/expected/security_manifest_path_traversal.json +9 -0
  636. package/conformance/v1/lib/harness.mjs +78 -0
  637. package/conformance/v1/lib/mutations.mjs +61 -0
  638. package/conformance/v1/produce-cases.json +75 -0
  639. package/conformance/v1/producer/bad-plugin-invalid-provider.mjs +4 -0
  640. package/conformance/v1/producer/bad-plugin-no-export.mjs +3 -0
  641. package/conformance/v1/producer/fixture_keypairs.json +18 -0
  642. package/conformance/v1/producer/inmemory-signer-plugin.mjs +47 -0
  643. package/conformance/v1/producer/signer-stdio-bad-json.mjs +54 -0
  644. package/conformance/v1/producer/signer-stdio-partial-stdout-exit1.mjs +51 -0
  645. package/conformance/v1/producer/signer-stdio-stderr-only-exit1.mjs +46 -0
  646. package/conformance/v1/producer/signer-stdio-stub.mjs +134 -0
  647. package/conformance/v1/protocol-vectors/v1.json +81 -0
  648. package/conformance/v1/release-cases.json +111 -0
  649. package/conformance/v1/release-trust-quorum.json +15 -0
  650. package/conformance/v1/release-trust-revoked.json +16 -0
  651. package/conformance/v1/release-trust.json +15 -0
  652. package/conformance/v1/releases/release_fail_asset_hash_mismatch/a.tgz +1 -0
  653. package/conformance/v1/releases/release_fail_asset_hash_mismatch/b.tar.gz +1 -0
  654. package/conformance/v1/releases/release_fail_asset_hash_mismatch/release_index_v1.json +1 -0
  655. package/conformance/v1/releases/release_fail_asset_hash_mismatch/release_index_v1.sig +1 -0
  656. package/conformance/v1/releases/release_fail_missing_asset/a.tgz +1 -0
  657. package/conformance/v1/releases/release_fail_missing_asset/release_index_v1.json +1 -0
  658. package/conformance/v1/releases/release_fail_missing_asset/release_index_v1.sig +1 -0
  659. package/conformance/v1/releases/release_fail_signature_invalid/a.tgz +1 -0
  660. package/conformance/v1/releases/release_fail_signature_invalid/b.tar.gz +1 -0
  661. package/conformance/v1/releases/release_fail_signature_invalid/release_index_v1.json +1 -0
  662. package/conformance/v1/releases/release_fail_signature_invalid/release_index_v1.sig +1 -0
  663. package/conformance/v1/releases/release_pass/a.tgz +1 -0
  664. package/conformance/v1/releases/release_pass/b.tar.gz +1 -0
  665. package/conformance/v1/releases/release_pass/release_index_v1.json +1 -0
  666. package/conformance/v1/releases/release_pass/release_index_v1.sig +1 -0
  667. package/conformance/v1/run-produce.mjs +507 -0
  668. package/conformance/v1/run-release.mjs +129 -0
  669. package/conformance/v1/run.mjs +229 -0
  670. package/conformance/v1/trust.json +11 -0
  671. package/docker-compose.yml +154 -0
  672. package/package.json +98 -0
  673. package/packages/artifact-verify/src/bundle-path.js +60 -0
  674. package/packages/artifact-verify/src/canonical-json.js +48 -0
  675. package/packages/artifact-verify/src/close-pack-bundle.js +914 -0
  676. package/packages/artifact-verify/src/crypto.js +18 -0
  677. package/packages/artifact-verify/src/finance-pack-bundle.js +750 -0
  678. package/packages/artifact-verify/src/governance-policy.js +312 -0
  679. package/packages/artifact-verify/src/hash-file.js +38 -0
  680. package/packages/artifact-verify/src/index.js +100 -0
  681. package/packages/artifact-verify/src/invoice-bundle.js +865 -0
  682. package/packages/artifact-verify/src/job-proof-bundle.js +1996 -0
  683. package/packages/artifact-verify/src/map-with-concurrency.js +32 -0
  684. package/packages/artifact-verify/src/reconcile.js +135 -0
  685. package/packages/artifact-verify/src/release/release-index-lib.js +190 -0
  686. package/packages/artifact-verify/src/release/verify-release.js +187 -0
  687. package/packages/artifact-verify/src/revocation-list.js +119 -0
  688. package/packages/artifact-verify/src/safe-unzip.js +335 -0
  689. package/packages/artifact-verify/src/settlement-decision-report.js +61 -0
  690. package/packages/artifact-verify/src/timestamp-proof.js +49 -0
  691. package/packages/artifact-verify/src/tool-provenance.js +49 -0
  692. package/packages/artifact-verify/src/trust.js +54 -0
  693. package/packages/artifact-verify/src/verification-warnings.js +34 -0
  694. package/scripts/closepack/export.mjs +101 -0
  695. package/scripts/closepack/lib.mjs +1068 -0
  696. package/scripts/closepack/verify.mjs +65 -0
  697. package/scripts/init/capability.mjs +556 -0
  698. package/scripts/init/postinstall-sanity.mjs +18 -0
  699. package/services/finance-sink/README.md +37 -0
  700. package/services/finance-sink/package.json +6 -0
  701. package/services/finance-sink/src/ack-worker.js +152 -0
  702. package/services/finance-sink/src/config.js +176 -0
  703. package/services/finance-sink/src/dedupe-store.js +232 -0
  704. package/services/finance-sink/src/s3-store.js +139 -0
  705. package/services/finance-sink/src/server.js +391 -0
  706. package/services/receiver/README.md +49 -0
  707. package/services/receiver/package.json +6 -0
  708. package/services/receiver/src/ack-worker.js +166 -0
  709. package/services/receiver/src/config.js +178 -0
  710. package/services/receiver/src/dedupe-store.js +232 -0
  711. package/services/receiver/src/s3-store.js +111 -0
  712. package/services/receiver/src/server.js +304 -0
  713. package/src/agent/agent-sim.js +167 -0
  714. package/src/api/app.js +31794 -0
  715. package/src/api/http.js +124 -0
  716. package/src/api/maintenance.js +174 -0
  717. package/src/api/middleware/auth.js +105 -0
  718. package/src/api/middleware/authz.js +19 -0
  719. package/src/api/openapi.js +5684 -0
  720. package/src/api/outbox.js +93 -0
  721. package/src/api/persistence.js +628 -0
  722. package/src/api/server.js +100 -0
  723. package/src/api/store.js +2088 -0
  724. package/src/api/workers/artifacts.js +574 -0
  725. package/src/api/workers/deliveries.js +628 -0
  726. package/src/api/workers/proof.js +374 -0
  727. package/src/core/acceptance-criteria.js +78 -0
  728. package/src/core/access.js +130 -0
  729. package/src/core/agent-reputation.js +311 -0
  730. package/src/core/agent-runs.js +253 -0
  731. package/src/core/agent-wallets.js +883 -0
  732. package/src/core/allocations.js +160 -0
  733. package/src/core/artifact-verification-status.js +216 -0
  734. package/src/core/artifacts.js +938 -0
  735. package/src/core/assist.js +106 -0
  736. package/src/core/audit-export.js +68 -0
  737. package/src/core/auth.js +189 -0
  738. package/src/core/billing-plans.js +187 -0
  739. package/src/core/booking.js +268 -0
  740. package/src/core/cancellation.js +34 -0
  741. package/src/core/canonical-json.js +104 -0
  742. package/src/core/claims.js +152 -0
  743. package/src/core/close-pack-bundle.js +527 -0
  744. package/src/core/config.js +272 -0
  745. package/src/core/contract-compiler.js +68 -0
  746. package/src/core/contract-document.js +226 -0
  747. package/src/core/contract-selection.js +152 -0
  748. package/src/core/contracts.js +439 -0
  749. package/src/core/crypto.js +30 -0
  750. package/src/core/deterministic-zip.js +169 -0
  751. package/src/core/dispatch-events.js +113 -0
  752. package/src/core/dispatch.js +26 -0
  753. package/src/core/dispute-open-envelope.js +163 -0
  754. package/src/core/escrow-ledger.js +329 -0
  755. package/src/core/event-chain.js +114 -0
  756. package/src/core/event-policy.js +120 -0
  757. package/src/core/evidence-linker.js +93 -0
  758. package/src/core/evidence-store.js +286 -0
  759. package/src/core/evidence.js +119 -0
  760. package/src/core/failpoints.js +30 -0
  761. package/src/core/finance-account-map.js +59 -0
  762. package/src/core/finance-pack-bundle.js +554 -0
  763. package/src/core/funding-hold.js +185 -0
  764. package/src/core/gl-batch.js +107 -0
  765. package/src/core/governance-policy.js +174 -0
  766. package/src/core/governance.js +92 -0
  767. package/src/core/hold-exposure.js +74 -0
  768. package/src/core/idempotency.js +51 -0
  769. package/src/core/ids.js +21 -0
  770. package/src/core/incidents.js +75 -0
  771. package/src/core/insurer-reimbursements.js +58 -0
  772. package/src/core/interaction-directions.js +170 -0
  773. package/src/core/invoice-bundle.js +564 -0
  774. package/src/core/job-reducer.js +702 -0
  775. package/src/core/job-state-machine.js +266 -0
  776. package/src/core/journal-csv.js +94 -0
  777. package/src/core/ledger-postings-finance.js +31 -0
  778. package/src/core/ledger-postings.js +476 -0
  779. package/src/core/ledger.js +59 -0
  780. package/src/core/liveness.js +154 -0
  781. package/src/core/log.js +156 -0
  782. package/src/core/maintenance-locks.js +3 -0
  783. package/src/core/marketplace-kernel.js +243 -0
  784. package/src/core/metrics.js +133 -0
  785. package/src/core/money-rail-adapters.js +735 -0
  786. package/src/core/month-close-hold-policy.js +19 -0
  787. package/src/core/month-close.js +159 -0
  788. package/src/core/operator-cost.js +79 -0
  789. package/src/core/operator-coverage.js +46 -0
  790. package/src/core/operator-reducer.js +73 -0
  791. package/src/core/operators.js +52 -0
  792. package/src/core/ops-audit.js +45 -0
  793. package/src/core/party-statements.js +145 -0
  794. package/src/core/pilot-templates.js +26 -0
  795. package/src/core/policy.js +76 -0
  796. package/src/core/pricing.js +71 -0
  797. package/src/core/proof-bundle.js +1153 -0
  798. package/src/core/proof-events.js +88 -0
  799. package/src/core/proof-verifier.js +261 -0
  800. package/src/core/proof.js +46 -0
  801. package/src/core/protocol.js +105 -0
  802. package/src/core/quotas.js +32 -0
  803. package/src/core/reputation-event.js +203 -0
  804. package/src/core/rescheduling.js +51 -0
  805. package/src/core/retention.js +32 -0
  806. package/src/core/revocation-list.js +70 -0
  807. package/src/core/risk.js +383 -0
  808. package/src/core/robot-health.js +111 -0
  809. package/src/core/robot-reducer.js +198 -0
  810. package/src/core/robots.js +152 -0
  811. package/src/core/s3-presign.js +111 -0
  812. package/src/core/secrets.js +128 -0
  813. package/src/core/settlement-adjustment.js +151 -0
  814. package/src/core/settlement-kernel.js +405 -0
  815. package/src/core/settlement-policy.js +206 -0
  816. package/src/core/settlement-splits.js +46 -0
  817. package/src/core/signer-keys.js +33 -0
  818. package/src/core/skills.js +86 -0
  819. package/src/core/sla-events.js +229 -0
  820. package/src/core/sla-metering.js +169 -0
  821. package/src/core/sla-policy-templates.js +340 -0
  822. package/src/core/sla.js +29 -0
  823. package/src/core/statements.js +426 -0
  824. package/src/core/tenancy.js +55 -0
  825. package/src/core/timestamp-proof.js +36 -0
  826. package/src/core/tool-manifest.js +116 -0
  827. package/src/core/tool-provenance.js +36 -0
  828. package/src/core/url-safety.js +263 -0
  829. package/src/core/verification-warnings.js +53 -0
  830. package/src/core/zone-coverage.js +59 -0
  831. package/src/core/zones.js +8 -0
  832. package/src/core/zoneset.js +67 -0
  833. package/src/db/migrate.js +61 -0
  834. package/src/db/migrations/001_init.sql +92 -0
  835. package/src/db/migrations/002_robot_reservations.sql +23 -0
  836. package/src/db/migrations/003_idempotency_v2.sql +32 -0
  837. package/src/db/migrations/004_notifications.sql +12 -0
  838. package/src/db/migrations/005_multi_tenant.sql +106 -0
  839. package/src/db/migrations/006_contracts.sql +27 -0
  840. package/src/db/migrations/007_artifacts_deliveries_correlations.sql +53 -0
  841. package/src/db/migrations/008_delivery_ingest_hardening.sql +52 -0
  842. package/src/db/migrations/009_auth_keys.sql +21 -0
  843. package/src/db/migrations/010_signer_keys.sql +25 -0
  844. package/src/db/migrations/011_ops_audit.sql +33 -0
  845. package/src/db/migrations/012_retention.sql +16 -0
  846. package/src/db/migrations/013_perf_indexes.sql +18 -0
  847. package/src/db/migrations/014_contracts_v2.sql +68 -0
  848. package/src/db/migrations/015_parties.sql +16 -0
  849. package/src/db/migrations/016_ledger_allocations.sql +18 -0
  850. package/src/db/migrations/017_party_statements.sql +31 -0
  851. package/src/db/migrations/018_finance_account_map.sql +12 -0
  852. package/src/db/migrations/019_ledger_allocations_account_id.sql +7 -0
  853. package/src/db/migrations/020_artifacts_source_event_unique.sql +10 -0
  854. package/src/db/migrations/021_artifacts_by_job_created_at_id.sql +6 -0
  855. package/src/db/migrations/022_governance_uniqueness.sql +28 -0
  856. package/src/db/migrations/023_marketplace_tasks.sql +45 -0
  857. package/src/db/migrations/024_agent_runtime_state.sql +70 -0
  858. package/src/db/migrations/025_tenant_settlement_policies.sql +19 -0
  859. package/src/db/migrations/026_money_rails_billable_events.sql +82 -0
  860. package/src/db/migrations/027_tenant_billing_config.sql +10 -0
  861. package/src/db/migrations/028_marketplace_rfq_storage.sql +121 -0
  862. package/src/db/pg.js +123 -0
  863. package/src/db/store-pg.js +6465 -0
@@ -0,0 +1,1996 @@
1
+ import fs from "node:fs/promises";
2
+ import path from "node:path";
3
+
4
+ import { canonicalJsonStringify } from "./canonical-json.js";
5
+ import { sha256HexUtf8, verifyHashHexEd25519 } from "./crypto.js";
6
+ import { hashFile } from "./hash-file.js";
7
+ import { mapWithConcurrency } from "./map-with-concurrency.js";
8
+ import { prevalidateManifestFileEntries, resolveBundlePath } from "./bundle-path.js";
9
+ import {
10
+ GOVERNANCE_POLICY_SCHEMA_V2,
11
+ authorizeServerSignerForPolicy,
12
+ parseGovernancePolicyV1,
13
+ parseGovernancePolicyV2,
14
+ verifyGovernancePolicyV2Signature
15
+ } from "./governance-policy.js";
16
+ import { deriveKeyTimelineFromRevocationList, parseRevocationListV1, verifyRevocationListV1Signature } from "./revocation-list.js";
17
+ import { verifyTimestampProofV1 } from "./timestamp-proof.js";
18
+ import { trustedGovernanceRootKeysFromEnv, trustedTimeAuthorityKeysFromEnv } from "./trust.js";
19
+ import { VERIFICATION_WARNING_CODE, validateVerificationWarnings } from "./verification-warnings.js";
20
+
21
+ export const PROOF_BUNDLE_MANIFEST_SCHEMA_V1 = "ProofBundleManifest.v1";
22
+ export const BUNDLE_HEAD_ATTESTATION_SCHEMA_V1 = "BundleHeadAttestation.v1";
23
+ export const MONTH_PROOF_BUNDLE_SCHEMA_VERSION_V1 = "MonthProofBundle.v1";
24
+ export const JOB_PROOF_BUNDLE_SCHEMA_VERSION_V1 = "JobProofBundle.v1";
25
+
26
+ const DEFAULT_HASH_CONCURRENCY = 16;
27
+
28
+ async function readJson(filepath) {
29
+ const raw = await fs.readFile(filepath, "utf8");
30
+ return JSON.parse(raw);
31
+ }
32
+
33
+ function normalizeHashConcurrency(value) {
34
+ if (value === null || value === undefined) return DEFAULT_HASH_CONCURRENCY;
35
+ if (!Number.isInteger(value) || value < 1) throw new TypeError("hashConcurrency must be a positive integer");
36
+ return value;
37
+ }
38
+
39
+ async function verifyManifestFileHashes({ dir, manifestFiles, warnings, hashConcurrency }) {
40
+ const entries = [];
41
+ const seen = new Set();
42
+ for (const f of manifestFiles ?? []) {
43
+ if (!f || typeof f !== "object") continue;
44
+ const name = typeof f.name === "string" ? f.name : null;
45
+ const expectedSha = typeof f.sha256 === "string" ? f.sha256 : null;
46
+ if (!name || !expectedSha) continue;
47
+ if (seen.has(name)) return { ok: false, error: "MANIFEST_DUPLICATE_PATH", name, warnings };
48
+ seen.add(name);
49
+ const rp = resolveBundlePath({ bundleDir: dir, name });
50
+ if (!rp.ok) return { ok: false, error: rp.error, name: rp.name ?? name, reason: rp.reason ?? null, warnings };
51
+ entries.push({ name, expectedSha, fp: rp.path });
52
+ }
53
+
54
+ const actualByIndex = await mapWithConcurrency(
55
+ entries,
56
+ hashConcurrency,
57
+ async (e) => {
58
+ try {
59
+ const st = await fs.lstat(e.fp);
60
+ if (st.isSymbolicLink()) return { ok: false, error: { name: "SYMLINK", code: "SYMLINK", message: "symlink" } };
61
+ if (!st.isFile()) return { ok: false, error: { name: "NOT_FILE", code: "NOT_FILE", message: "not a regular file" } };
62
+ const actualSha = await hashFile(e.fp, { algo: "sha256" });
63
+ return { ok: true, actualSha };
64
+ } catch (err) {
65
+ return { ok: false, error: err };
66
+ }
67
+ },
68
+ {}
69
+ );
70
+
71
+ for (let i = 0; i < entries.length; i += 1) {
72
+ const e = entries[i];
73
+ const res = actualByIndex[i];
74
+ if (!res?.ok) {
75
+ if (res?.error?.code === "SYMLINK") return { ok: false, error: "MANIFEST_SYMLINK_FORBIDDEN", name: e.name, warnings };
76
+ const code = res?.error?.code ?? null;
77
+ if (code === "ENOENT") return { ok: false, error: "missing file", name: e.name, warnings };
78
+ return {
79
+ ok: false,
80
+ error: "failed to hash file",
81
+ name: e.name,
82
+ warnings,
83
+ detail: { code, message: res?.error?.message ?? String(res?.error ?? "") }
84
+ };
85
+ }
86
+ if (res.actualSha !== e.expectedSha) return { ok: false, error: "sha256 mismatch", name: e.name, expected: e.expectedSha, actual: res.actualSha, warnings };
87
+ }
88
+
89
+ return { ok: true };
90
+ }
91
+
92
+ // Optional governance streams (used to derive server key lifecycle timelines).
93
+ // Prefer the dual-scope layout:
94
+ // governance/global/*
95
+ // governance/tenant/*
96
+ // Fall back to legacy single-scope layout:
97
+ // governance/*
98
+ async function tryReadGovernance({ dir, base }) {
99
+ let e = null;
100
+ let m = null;
101
+ let s = null;
102
+ let eventsPresent = false;
103
+ let materialPresent = false;
104
+ let snapshotPresent = false;
105
+ try {
106
+ e = parseJsonl(await fs.readFile(path.join(dir, base, "events", "events.jsonl"), "utf8"));
107
+ eventsPresent = true;
108
+ } catch {
109
+ e = null;
110
+ }
111
+ try {
112
+ m = parseJsonl(await fs.readFile(path.join(dir, base, "events", "payload_material.jsonl"), "utf8"));
113
+ materialPresent = true;
114
+ } catch {
115
+ m = null;
116
+ }
117
+ try {
118
+ s = await readJson(path.join(dir, base, "snapshot.json"));
119
+ snapshotPresent = true;
120
+ } catch {
121
+ s = null;
122
+ }
123
+ if (e === null && m === null && s === null) return null;
124
+ return {
125
+ events: e ?? [],
126
+ payloadMaterial: m ?? [],
127
+ snapshot: s ?? null,
128
+ present: { events: eventsPresent, payloadMaterial: materialPresent, snapshot: snapshotPresent },
129
+ base
130
+ };
131
+ }
132
+
133
+ function stripManifestHash(manifestWithHash) {
134
+ const { manifestHash: _ignored, ...rest } = manifestWithHash ?? {};
135
+ return rest;
136
+ }
137
+
138
+ function stripAttestationSig(attestation) {
139
+ const { signature: _sig, attestationHash: _hash, ...rest } = attestation ?? {};
140
+ return rest;
141
+ }
142
+
143
+ function stripVerificationReportSig(report) {
144
+ const { reportHash: _h, signature: _sig, ...rest } = report ?? {};
145
+ return rest;
146
+ }
147
+
148
+ function verifyVerificationReportV1ForProofBundle({
149
+ report,
150
+ expectedManifestHash,
151
+ expectedBundleType,
152
+ expectedBundleHeadAttestationHash,
153
+ publicKeyByKeyId,
154
+ keyMetaByKeyId,
155
+ governancePolicy,
156
+ revocationTimelineByKeyId,
157
+ trustedTimeAuthorities,
158
+ strict
159
+ }) {
160
+ if (!report || typeof report !== "object" || Array.isArray(report)) return { ok: false, error: "invalid verification report JSON" };
161
+ if (String(report.schemaVersion ?? "") !== "VerificationReport.v1") return { ok: false, error: "unsupported verification report schemaVersion" };
162
+ if (String(report.profile ?? "") !== "strict") return { ok: false, error: "unsupported verification report profile", profile: report.profile ?? null };
163
+
164
+ const warningsCheck = validateVerificationWarnings(report.warnings ?? null);
165
+ if (!warningsCheck.ok) return { ok: false, error: `verification report warnings invalid: ${warningsCheck.error}`, detail: warningsCheck };
166
+
167
+ const subject = report.subject ?? null;
168
+ if (!subject || typeof subject !== "object" || Array.isArray(subject)) return { ok: false, error: "invalid verification report subject" };
169
+ if (String(subject.type ?? "") !== String(expectedBundleType ?? "")) {
170
+ return { ok: false, error: "verification report subject.type mismatch", expected: expectedBundleType ?? null, actual: subject.type ?? null };
171
+ }
172
+ if (String(subject.manifestHash ?? "") !== String(expectedManifestHash ?? "")) {
173
+ return { ok: false, error: "verification report subject.manifestHash mismatch", expected: expectedManifestHash ?? null, actual: subject.manifestHash ?? null };
174
+ }
175
+
176
+ if (strict) {
177
+ const b = report.bundleHeadAttestation ?? null;
178
+ if (!b || typeof b !== "object" || Array.isArray(b)) return { ok: false, error: "verification report missing bundleHeadAttestation" };
179
+ const declared = typeof b.attestationHash === "string" && b.attestationHash.trim() ? b.attestationHash : null;
180
+ if (!declared) return { ok: false, error: "verification report bundleHeadAttestation.attestationHash missing" };
181
+ if (typeof expectedBundleHeadAttestationHash === "string" && expectedBundleHeadAttestationHash.trim() && declared !== expectedBundleHeadAttestationHash) {
182
+ return { ok: false, error: "verification report bundleHeadAttestation.attestationHash mismatch", expected: expectedBundleHeadAttestationHash, actual: declared };
183
+ }
184
+ }
185
+
186
+ const reportCore = stripVerificationReportSig(report);
187
+ const expectedReportHash = sha256HexUtf8(canonicalJsonStringify(reportCore));
188
+ const actualReportHash = typeof report.reportHash === "string" ? report.reportHash : null;
189
+ if (!actualReportHash) return { ok: false, error: "verification report missing reportHash" };
190
+ if (expectedReportHash !== actualReportHash) return { ok: false, error: "verification report reportHash mismatch", expected: expectedReportHash, actual: actualReportHash };
191
+
192
+ const signature = typeof report.signature === "string" && report.signature.trim() ? report.signature : null;
193
+ const signerKeyId = typeof report.signerKeyId === "string" && report.signerKeyId.trim() ? report.signerKeyId : null;
194
+ const signedAt = typeof report.signedAt === "string" && report.signedAt.trim() ? report.signedAt : null;
195
+ if (strict && (!signature || !signerKeyId || !signedAt)) {
196
+ return { ok: false, error: "verification report missing signature", signature: Boolean(signature), signerKeyId, signedAt };
197
+ }
198
+
199
+ const signer = report.signer ?? null;
200
+ if (signer !== null && signer !== undefined) {
201
+ if (!signer || typeof signer !== "object" || Array.isArray(signer)) return { ok: false, error: "verification report signer must be an object" };
202
+ if (typeof signer.keyId !== "string" || !signer.keyId.trim()) return { ok: false, error: "verification report signer.keyId missing" };
203
+ if (signerKeyId && signer.keyId !== signerKeyId) return { ok: false, error: "verification report signer.keyId mismatch", expected: signerKeyId, actual: signer.keyId };
204
+ const scope = signer.scope ?? null;
205
+ if (scope !== null && scope !== "global" && scope !== "tenant") return { ok: false, error: "verification report signer.scope invalid", scope };
206
+ }
207
+
208
+ if (signature && signerKeyId) {
209
+ if (!(publicKeyByKeyId instanceof Map)) return { ok: false, error: "publicKeyByKeyId must be a Map" };
210
+ const publicKeyPem = publicKeyByKeyId.get(signerKeyId) ?? null;
211
+ if (!publicKeyPem) return { ok: false, error: "unknown verification report signerKeyId", signerKeyId };
212
+ const okSig = verifyHashHexEd25519({ hashHex: expectedReportHash, signatureBase64: signature, publicKeyPem });
213
+ if (!okSig) return { ok: false, error: "verification report signature invalid", signerKeyId };
214
+
215
+ if (strict) {
216
+ const meta = (keyMetaByKeyId instanceof Map ? keyMetaByKeyId.get(signerKeyId) ?? null : null) ?? null;
217
+ const auth = authorizeServerSignerForPolicy({
218
+ policy: governancePolicy,
219
+ documentKind: "verification_report",
220
+ subjectType: expectedBundleType,
221
+ signerKeyId,
222
+ signerScope: signer?.scope ?? "global",
223
+ keyMeta: meta
224
+ });
225
+ if (!auth.ok) return { ok: false, error: "verification report signer not authorized", detail: auth, signerKeyId };
226
+ if (!(typeof meta?.validFrom === "string" && meta.validFrom.trim())) return { ok: false, error: "verification report signer key missing validFrom", signerKeyId };
227
+ if (revocationTimelineByKeyId instanceof Map) {
228
+ const time = effectiveSigningTimeFromTimestampProof({ documentCoreWithProof: reportCore, fallbackSignedAt: signedAt, trustedTimeAuthorities });
229
+ const effectiveSignedAt = time.effectiveSignedAt;
230
+ const basic = isKeyUsableAt(meta, effectiveSignedAt);
231
+ if (!basic.ok) return { ok: false, error: "verification report signer key not valid", signerKeyId, reason: basic.reason, boundary: basic.boundary ?? null };
232
+ const row = revocationTimelineByKeyId.get(signerKeyId) ?? null;
233
+ const timelineCheck = enforceProspectiveKeyTimeline({ signerKeyId, effectiveSignedAt, trustworthyTime: time.trustworthy, timelineRow: row });
234
+ if (!timelineCheck.ok) return { ok: false, error: timelineCheck.error, detail: { ...timelineCheck, timeProof: time.proof ?? null }, signerKeyId };
235
+ } else {
236
+ const usable = isServerKeyUsableAtForAttestation({ meta, atIso: signedAt });
237
+ if (!usable.ok) return { ok: false, error: "verification report signer key not valid", signerKeyId, reason: usable.reason, boundary: usable.boundary ?? null };
238
+ }
239
+ }
240
+ }
241
+
242
+ return { ok: true };
243
+ }
244
+
245
+ function parseJsonl(text) {
246
+ const out = [];
247
+ const lines = String(text ?? "").split("\n");
248
+ for (const line of lines) {
249
+ const trimmed = line.trim();
250
+ if (!trimmed) continue;
251
+ out.push(JSON.parse(trimmed));
252
+ }
253
+ return out;
254
+ }
255
+
256
+ function assertNonEmptyString(value, name) {
257
+ if (typeof value !== "string" || !value.trim()) throw new Error(`${name} must be a non-empty string`);
258
+ }
259
+
260
+ function arrayEqual(a, b) {
261
+ const aa = Array.isArray(a) ? a : [];
262
+ const bb = Array.isArray(b) ? b : [];
263
+ if (aa.length !== bb.length) return false;
264
+ for (let i = 0; i < aa.length; i += 1) {
265
+ if (aa[i] !== bb[i]) return false;
266
+ }
267
+ return true;
268
+ }
269
+
270
+ function safeIsoToMs(value) {
271
+ const t = Date.parse(String(value ?? ""));
272
+ return Number.isFinite(t) ? t : NaN;
273
+ }
274
+
275
+ export const EVENT_ENVELOPE_VERSION = 1;
276
+
277
+ export const SIGNER_KIND = Object.freeze({
278
+ SERVER: "server",
279
+ ROBOT: "robot",
280
+ OPERATOR: "operator",
281
+ ROBOT_OR_OPERATOR: "robot_or_operator",
282
+ SERVER_OR_OPERATOR: "server_or_operator",
283
+ SERVER_OR_ROBOT: "server_or_robot",
284
+ NONE: "none"
285
+ });
286
+
287
+ // Keep in sync with src/core/event-policy.js for "must be signed" semantics.
288
+ const ROBOT_SIGNED_TYPES = new Set([
289
+ "TELEMETRY_HEARTBEAT",
290
+ "CHECKPOINT_REACHED",
291
+ "EN_ROUTE",
292
+ "ASSIST_REQUESTED",
293
+ "EXECUTION_STARTED",
294
+ "JOB_EXECUTION_STARTED",
295
+ "JOB_HEARTBEAT",
296
+ "EXECUTION_COMPLETED",
297
+ "JOB_EXECUTION_COMPLETED",
298
+ "EXECUTION_ABORTED",
299
+ "INCIDENT_DETECTED",
300
+ "SKILL_METER_REPORTED",
301
+ "ROBOT_HEARTBEAT"
302
+ ]);
303
+
304
+ const OPERATOR_SIGNED_TYPES = new Set(["ASSIST_STARTED", "ASSIST_ENDED", "ASSIST_ACCEPTED", "ASSIST_DECLINED", "OPERATOR_SHIFT_OPENED", "OPERATOR_SHIFT_CLOSED"]);
305
+
306
+ const ROBOT_OR_OPERATOR_SIGNED_TYPES = new Set(["ACCESS_GRANTED", "ACCESS_DENIED", "SKILL_USED", "ZONE_COVERAGE_REPORTED"]);
307
+
308
+ const SERVER_OR_OPERATOR_SIGNED_TYPES = new Set(["INCIDENT_REPORTED", "CLAIM_TRIAGED"]);
309
+
310
+ const SERVER_OR_ROBOT_SIGNED_TYPES = new Set(["EVIDENCE_CAPTURED", "JOB_EXECUTION_ABORTED", "JOB_EXECUTION_RESUMED", "ROBOT_UNHEALTHY"]);
311
+
312
+ const SERVER_SIGNED_TYPES = new Set([
313
+ "JOB_CREATED",
314
+ "QUOTE_PROPOSED",
315
+ "RISK_SCORED",
316
+ "BOOKED",
317
+ "DISPATCH_REQUESTED",
318
+ "DISPATCH_EVALUATED",
319
+ "DISPATCH_CONFIRMED",
320
+ "DISPATCH_FAILED",
321
+ "OPERATOR_COVERAGE_RESERVED",
322
+ "OPERATOR_COVERAGE_RELEASED",
323
+ "ASSIST_QUEUED",
324
+ "ASSIST_ASSIGNED",
325
+ "ASSIST_TIMEOUT",
326
+ "MATCHED",
327
+ "RESERVED",
328
+ "SETTLED",
329
+ "JOB_EXECUTION_STALLED",
330
+ "JOB_RESCHEDULED",
331
+ "JOB_CANCELLED",
332
+ "ACCESS_PLAN_ISSUED",
333
+ "ACCESS_REVOKED",
334
+ "ACCESS_EXPIRED",
335
+ "SKILL_LICENSED",
336
+ "CLAIM_OPENED",
337
+ "CLAIM_APPROVED",
338
+ "CLAIM_DENIED",
339
+ "CLAIM_PAID",
340
+ "JOB_ADJUSTED",
341
+ "ROBOT_REGISTERED",
342
+ "ROBOT_AVAILABILITY_SET",
343
+ "ROBOT_QUARANTINED",
344
+ "ROBOT_QUARANTINE_CLEARED",
345
+ "MAINTENANCE_REQUESTED",
346
+ "MAINTENANCE_COMPLETED",
347
+ "ROBOT_STATUS_CHANGED",
348
+ "OPERATOR_REGISTERED",
349
+ "OPERATOR_COST_RECORDED",
350
+ "SLA_BREACH_DETECTED",
351
+ "SLA_CREDIT_ISSUED",
352
+ "PROOF_EVALUATED",
353
+ "PROOF_OVERRIDDEN",
354
+ "SETTLEMENT_HELD",
355
+ "SETTLEMENT_RELEASED",
356
+ "SETTLEMENT_FORFEITED",
357
+ "DISPUTE_OPENED",
358
+ "DISPUTE_CLOSED",
359
+ "EVIDENCE_VIEWED",
360
+ "EVIDENCE_EXPIRED",
361
+ "CORRELATION_LINKED",
362
+ "CORRELATION_RELINKED",
363
+ "MONTH_CLOSE_REQUESTED",
364
+ "MONTH_CLOSED",
365
+ "MONTH_CLOSE_REOPENED",
366
+ "INSURER_REIMBURSEMENT_RECORDED",
367
+ "DECISION_RECORDED"
368
+ ]);
369
+
370
+ function requiredSignerKindForEventType(eventType) {
371
+ if (ROBOT_SIGNED_TYPES.has(eventType)) return SIGNER_KIND.ROBOT;
372
+ if (OPERATOR_SIGNED_TYPES.has(eventType)) return SIGNER_KIND.OPERATOR;
373
+ if (ROBOT_OR_OPERATOR_SIGNED_TYPES.has(eventType)) return SIGNER_KIND.ROBOT_OR_OPERATOR;
374
+ if (SERVER_OR_OPERATOR_SIGNED_TYPES.has(eventType)) return SIGNER_KIND.SERVER_OR_OPERATOR;
375
+ if (SERVER_OR_ROBOT_SIGNED_TYPES.has(eventType)) return SIGNER_KIND.SERVER_OR_ROBOT;
376
+ if (SERVER_SIGNED_TYPES.has(eventType)) return SIGNER_KIND.SERVER;
377
+ return SIGNER_KIND.NONE;
378
+ }
379
+
380
+ function findLatestBookedPayload(events) {
381
+ for (let i = events.length - 1; i >= 0; i -= 1) {
382
+ const e = events[i];
383
+ if (e?.type !== "BOOKED") continue;
384
+ const p = e?.payload ?? null;
385
+ if (p && typeof p === "object" && !Array.isArray(p)) return p;
386
+ }
387
+ return null;
388
+ }
389
+
390
+ function sliceThroughChainHash(events, chainHash) {
391
+ assertNonEmptyString(chainHash, "evaluatedAtChainHash");
392
+ const idx = events.findIndex((e) => e?.chainHash === chainHash);
393
+ if (idx === -1) throw new Error("evaluatedAtChainHash not found in stream");
394
+ return events.slice(0, idx + 1);
395
+ }
396
+
397
+ function latestCoverageByZone(events) {
398
+ const byZoneId = new Map();
399
+ for (const e of events) {
400
+ if (e?.type !== "ZONE_COVERAGE_REPORTED") continue;
401
+ const p = e.payload ?? null;
402
+ const zoneId = typeof p?.zoneId === "string" ? p.zoneId.trim() : "";
403
+ if (!zoneId) continue;
404
+ const endMs = safeIsoToMs(p?.window?.endAt);
405
+ const prev = byZoneId.get(zoneId) ?? null;
406
+ const prevEndMs = prev ? safeIsoToMs(prev?.payload?.window?.endAt) : NaN;
407
+ if (!prev) {
408
+ byZoneId.set(zoneId, e);
409
+ continue;
410
+ }
411
+ if (Number.isFinite(endMs) && (!Number.isFinite(prevEndMs) || endMs > prevEndMs)) {
412
+ byZoneId.set(zoneId, e);
413
+ continue;
414
+ }
415
+ if (endMs === prevEndMs) {
416
+ const prevId = String(prev?.id ?? "");
417
+ const nextId = String(e?.id ?? "");
418
+ if (nextId && (!prevId || nextId > prevId)) byZoneId.set(zoneId, e);
419
+ }
420
+ }
421
+ return byZoneId;
422
+ }
423
+
424
+ function excusedZonesFromIncidents(events, { excuseIncidentTypes }) {
425
+ const excuseTypes = new Set(Array.isArray(excuseIncidentTypes) ? excuseIncidentTypes.map((t) => String(t)) : []);
426
+ const excused = new Set();
427
+ for (const e of events) {
428
+ if (e?.type !== "INCIDENT_REPORTED" && e?.type !== "INCIDENT_DETECTED") continue;
429
+ const p = e.payload ?? null;
430
+ const type = typeof p?.type === "string" ? p.type : null;
431
+ if (!type || !excuseTypes.has(type)) continue;
432
+ const zoneId = typeof p?.zoneId === "string" ? p.zoneId.trim() : "";
433
+ if (!zoneId) continue;
434
+ excused.add(zoneId);
435
+ }
436
+ return excused;
437
+ }
438
+
439
+ function computeZoneCoverageFactsHashV1({ events, evaluatedAtChainHash }) {
440
+ if (!Array.isArray(events)) throw new Error("events must be an array");
441
+ assertNonEmptyString(evaluatedAtChainHash, "evaluatedAtChainHash");
442
+
443
+ // Anchor must exist, but evidence can arrive after completion within the same history prefix.
444
+ const anchorSlice = sliceThroughChainHash(events, evaluatedAtChainHash);
445
+
446
+ const booked = findLatestBookedPayload(anchorSlice);
447
+ const requiredZones = booked?.requiredZones ?? null;
448
+ const requiredZonesHash = booked?.requiredZonesHash ?? null;
449
+
450
+ const proofPolicy = booked?.policySnapshot?.proofPolicy ?? booked?.policySnapshot?.proof ?? null;
451
+ const zc = proofPolicy?.zoneCoverage ?? {};
452
+ const thresholdPct = Number.isSafeInteger(zc?.thresholdPct) ? zc.thresholdPct : 95;
453
+ const excuseIncidentTypes = Array.isArray(zc?.excuseIncidentTypes) ? zc.excuseIncidentTypes : ["BLOCKED_ZONE"];
454
+
455
+ const requiredZoneIdsRaw =
456
+ requiredZones && typeof requiredZones === "object" && Array.isArray(requiredZones.zones)
457
+ ? requiredZones.zones.map((z) => String(z?.zoneId ?? "")).filter(Boolean)
458
+ : [];
459
+ const requiredZoneIds = Array.from(new Set(requiredZoneIdsRaw)).sort();
460
+
461
+ const coverageByZone = latestCoverageByZone(events);
462
+ const excused = excusedZonesFromIncidents(events, { excuseIncidentTypes });
463
+
464
+ const facts = {
465
+ schemaVersion: "ZoneCoverageFacts.v1",
466
+ evaluatedAtChainHash,
467
+ requiredZonesHash: typeof requiredZonesHash === "string" && requiredZonesHash.trim() ? requiredZonesHash : null,
468
+ thresholdPct,
469
+ requiredZoneIds,
470
+ coverageByZone: Array.from(coverageByZone.entries())
471
+ .filter(([zoneId]) => requiredZoneIds.includes(zoneId))
472
+ .map(([zoneId, ev]) => ({
473
+ zoneId,
474
+ coveragePct: Number.isSafeInteger(ev?.payload?.coveragePct) ? ev.payload.coveragePct : null,
475
+ window: ev?.payload?.window ?? null,
476
+ eventId: ev?.id ?? null,
477
+ chainHash: ev?.chainHash ?? null,
478
+ at: ev?.at ?? null
479
+ }))
480
+ .sort((a, b) => String(a.zoneId).localeCompare(String(b.zoneId)) || String(a.eventId ?? "").localeCompare(String(b.eventId ?? ""))),
481
+ excusedZones: Array.from(excused.values()).sort(),
482
+ excuseIncidentTypes: Array.from(new Set(excuseIncidentTypes.map((t) => String(t)))).sort()
483
+ };
484
+ return sha256HexUtf8(canonicalJsonStringify(facts));
485
+ }
486
+
487
+ function payloadHashForMaterial(mat) {
488
+ return sha256HexUtf8(
489
+ canonicalJsonStringify({
490
+ v: mat?.v ?? null,
491
+ id: mat?.id ?? null,
492
+ at: mat?.at ?? null,
493
+ streamId: mat?.streamId ?? null,
494
+ type: mat?.type ?? null,
495
+ actor: mat?.actor ?? null,
496
+ payload: mat?.payload ?? null
497
+ })
498
+ );
499
+ }
500
+
501
+ function chainHashForEvent({ prevChainHash, payloadHash }) {
502
+ return sha256HexUtf8(
503
+ canonicalJsonStringify({
504
+ v: EVENT_ENVELOPE_VERSION,
505
+ prevChainHash: prevChainHash ?? null,
506
+ payloadHash: payloadHash ?? null
507
+ })
508
+ );
509
+ }
510
+
511
+ function eventMaterialMatches({ material, event }) {
512
+ if (!material || typeof material !== "object") return false;
513
+ if (!event || typeof event !== "object") return false;
514
+ const keys = ["v", "id", "at", "streamId", "type"];
515
+ for (const k of keys) {
516
+ if ((material?.[k] ?? null) !== (event?.[k] ?? null)) return false;
517
+ }
518
+ // actor/payload are plain JSON; compare canonical encodings for stability.
519
+ try {
520
+ if (canonicalJsonStringify(material?.actor ?? null) !== canonicalJsonStringify(event?.actor ?? null)) return false;
521
+ if (canonicalJsonStringify(material?.payload ?? null) !== canonicalJsonStringify(event?.payload ?? null)) return false;
522
+ } catch {
523
+ return false;
524
+ }
525
+ return true;
526
+ }
527
+
528
+ function normalizeIsoOrNull(value) {
529
+ if (value === null || value === undefined) return null;
530
+ if (typeof value !== "string" || !value.trim()) return null;
531
+ const s = String(value).trim();
532
+ const ms = Date.parse(s);
533
+ return Number.isFinite(ms) ? s : null;
534
+ }
535
+
536
+ function parsePublicKeysFile(keysJson) {
537
+ if (!keysJson || typeof keysJson !== "object" || Array.isArray(keysJson)) throw new Error("keys/public_keys.json must be an object");
538
+
539
+ // Back-compat: legacy format is { [keyId]: publicKeyPem }.
540
+ if (!("schemaVersion" in keysJson)) {
541
+ const publicKeyByKeyId = new Map();
542
+ const keyMetaByKeyId = new Map();
543
+ for (const [keyId, publicKeyPem] of Object.entries(keysJson)) {
544
+ if (typeof keyId !== "string" || !keyId.trim()) continue;
545
+ if (typeof publicKeyPem !== "string" || !publicKeyPem.trim()) continue;
546
+ publicKeyByKeyId.set(keyId, publicKeyPem);
547
+ keyMetaByKeyId.set(keyId, {
548
+ keyId,
549
+ publicKeyPem,
550
+ purpose: null,
551
+ status: null,
552
+ validFrom: null,
553
+ validTo: null,
554
+ createdAt: null,
555
+ rotatedAt: null,
556
+ revokedAt: null
557
+ });
558
+ }
559
+ return { publicKeyByKeyId, keyMetaByKeyId };
560
+ }
561
+
562
+ if (String(keysJson.schemaVersion ?? "") !== "PublicKeys.v1") throw new Error("keys/public_keys.json schemaVersion must be PublicKeys.v1");
563
+ if (!Array.isArray(keysJson.keys)) throw new Error("keys/public_keys.json keys[] is required");
564
+
565
+ const publicKeyByKeyId = new Map();
566
+ const keyMetaByKeyId = new Map();
567
+
568
+ for (const row of keysJson.keys) {
569
+ if (!row || typeof row !== "object") continue;
570
+ const keyId = typeof row.keyId === "string" && row.keyId.trim() ? row.keyId : null;
571
+ const publicKeyPem = typeof row.publicKeyPem === "string" && row.publicKeyPem.trim() ? row.publicKeyPem : null;
572
+ if (!keyId || !publicKeyPem) continue;
573
+ publicKeyByKeyId.set(keyId, publicKeyPem);
574
+ keyMetaByKeyId.set(keyId, {
575
+ keyId,
576
+ publicKeyPem,
577
+ purpose: typeof row.purpose === "string" && row.purpose.trim() ? row.purpose : null,
578
+ status: typeof row.status === "string" && row.status.trim() ? row.status : null,
579
+ validFrom: normalizeIsoOrNull(row.validFrom ?? null),
580
+ validTo: normalizeIsoOrNull(row.validTo ?? null),
581
+ createdAt: normalizeIsoOrNull(row.createdAt ?? null),
582
+ rotatedAt: normalizeIsoOrNull(row.rotatedAt ?? null),
583
+ revokedAt: normalizeIsoOrNull(row.revokedAt ?? null)
584
+ });
585
+ }
586
+
587
+ return { publicKeyByKeyId, keyMetaByKeyId };
588
+ }
589
+
590
+ function keyEffectiveWindowMs(meta) {
591
+ const validFromMs = meta?.validFrom ? Date.parse(meta.validFrom) : NaN;
592
+ const validToMs = meta?.validTo ? Date.parse(meta.validTo) : NaN;
593
+ const rotatedAtMs = meta?.rotatedAt ? Date.parse(meta.rotatedAt) : NaN;
594
+ const revokedAtMs = meta?.revokedAt ? Date.parse(meta.revokedAt) : NaN;
595
+ return { validFromMs, validToMs, rotatedAtMs, revokedAtMs };
596
+ }
597
+
598
+ function isKeyUsableAt(meta, atIso) {
599
+ if (!meta || typeof meta !== "object") return { ok: true };
600
+ if (typeof atIso !== "string" || !atIso.trim()) return { ok: true };
601
+ const atMs = Date.parse(atIso);
602
+ if (!Number.isFinite(atMs)) return { ok: true };
603
+ const { validFromMs, validToMs, rotatedAtMs, revokedAtMs } = keyEffectiveWindowMs(meta);
604
+ if (Number.isFinite(validFromMs) && atMs < validFromMs) return { ok: false, reason: "KEY_NOT_YET_VALID", boundary: meta.validFrom };
605
+ if (Number.isFinite(validToMs) && atMs > validToMs) return { ok: false, reason: "KEY_EXPIRED", boundary: meta.validTo };
606
+ return { ok: true };
607
+ }
608
+
609
+ function isKeyUsableAtForEvent({ meta, event }) {
610
+ if (!event || typeof event !== "object") return { ok: true };
611
+ const requiredKind = requiredSignerKindForEventType(String(event.type ?? ""));
612
+ const usable = isKeyUsableAt(meta, String(event.at ?? ""));
613
+ if (!usable.ok) return usable;
614
+
615
+ // Rotation/revocation are prospective controls that only make sense when the timestamp used
616
+ // for enforcement is authoritative. We enforce them for server-required signatures only.
617
+ if (requiredKind !== SIGNER_KIND.SERVER) return { ok: true };
618
+
619
+ const atMs = Date.parse(String(event.at ?? ""));
620
+ if (!Number.isFinite(atMs)) return { ok: true };
621
+ const { rotatedAtMs, revokedAtMs } = keyEffectiveWindowMs(meta);
622
+ if (Number.isFinite(revokedAtMs) && atMs > revokedAtMs) return { ok: false, reason: "KEY_REVOKED", boundary: meta.revokedAt };
623
+ if (Number.isFinite(rotatedAtMs) && atMs > rotatedAtMs) return { ok: false, reason: "KEY_ROTATED", boundary: meta.rotatedAt };
624
+ return { ok: true };
625
+ }
626
+
627
+ function isServerKeyUsableAtForAttestation({ meta, atIso }) {
628
+ const usable = isKeyUsableAt(meta, atIso);
629
+ if (!usable.ok) return usable;
630
+ const atMs = Date.parse(String(atIso ?? ""));
631
+ if (!Number.isFinite(atMs)) return { ok: true };
632
+ const { rotatedAtMs, revokedAtMs } = keyEffectiveWindowMs(meta);
633
+ if (Number.isFinite(revokedAtMs) && atMs > revokedAtMs) return { ok: false, reason: "KEY_REVOKED", boundary: meta.revokedAt };
634
+ if (Number.isFinite(rotatedAtMs) && atMs > rotatedAtMs) return { ok: false, reason: "KEY_ROTATED", boundary: meta.rotatedAt };
635
+ return { ok: true };
636
+ }
637
+
638
+ function effectiveSigningTimeFromTimestampProof({ documentCoreWithProof, fallbackSignedAt, trustedTimeAuthorities }) {
639
+ if (!(trustedTimeAuthorities instanceof Map)) return { ok: true, effectiveSignedAt: fallbackSignedAt, trustworthy: false, proof: null };
640
+ const check = verifyTimestampProofV1({ documentCoreWithProof, trustedPublicKeyByKeyId: trustedTimeAuthorities });
641
+ if (check.ok) return { ok: true, effectiveSignedAt: check.timestamp, trustworthy: true, proof: check };
642
+ return { ok: true, effectiveSignedAt: fallbackSignedAt, trustworthy: false, proof: check };
643
+ }
644
+
645
+ function enforceProspectiveKeyTimeline({ signerKeyId, effectiveSignedAt, trustworthyTime, timelineRow }) {
646
+ const atMs = Date.parse(String(effectiveSignedAt ?? ""));
647
+ if (!Number.isFinite(atMs)) return { ok: true };
648
+ if (!timelineRow || typeof timelineRow !== "object") return { ok: true };
649
+
650
+ const revokedAt = typeof timelineRow.revokedAt === "string" && timelineRow.revokedAt.trim() ? timelineRow.revokedAt.trim() : null;
651
+ const rotatedAt = typeof timelineRow.rotatedAt === "string" && timelineRow.rotatedAt.trim() ? timelineRow.rotatedAt.trim() : null;
652
+ const validFrom = typeof timelineRow.validFrom === "string" && timelineRow.validFrom.trim() ? timelineRow.validFrom.trim() : null;
653
+
654
+ // validity window start
655
+ if (validFrom) {
656
+ const vfMs = Date.parse(validFrom);
657
+ if (Number.isFinite(vfMs) && atMs < vfMs) return { ok: false, error: "SIGNER_NOT_YET_VALID", signerKeyId, boundary: validFrom };
658
+ }
659
+
660
+ // revocation wins over rotation
661
+ if (revokedAt) {
662
+ const rMs = Date.parse(revokedAt);
663
+ if (Number.isFinite(rMs)) {
664
+ if (atMs >= rMs) return { ok: false, error: "SIGNER_REVOKED", signerKeyId, boundary: revokedAt };
665
+ if (!trustworthyTime) return { ok: false, error: "SIGNING_TIME_UNPROVABLE", signerKeyId, boundary: revokedAt };
666
+ }
667
+ }
668
+ if (rotatedAt) {
669
+ const rtMs = Date.parse(rotatedAt);
670
+ if (Number.isFinite(rtMs)) {
671
+ if (atMs >= rtMs) return { ok: false, error: "SIGNER_ROTATED", signerKeyId, boundary: rotatedAt };
672
+ if (!trustworthyTime) return { ok: false, error: "SIGNING_TIME_UNPROVABLE", signerKeyId, boundary: rotatedAt };
673
+ }
674
+ }
675
+
676
+ return { ok: true };
677
+ }
678
+
679
+ function normalizedPurpose(meta) {
680
+ if (!meta || typeof meta !== "object") return null;
681
+ const p = typeof meta.purpose === "string" && meta.purpose.trim() ? meta.purpose.trim().toLowerCase() : null;
682
+ return p || null;
683
+ }
684
+
685
+ function verifyEventStreamIntegrityV1({ events, payloadMaterial, publicKeyByKeyId, keyMetaByKeyId, declaredHeadChainHash, declaredHeadEventId, strict }) {
686
+ if (!Array.isArray(events)) return { ok: false, error: "missing events" };
687
+ if (strict !== true && strict !== false) strict = false;
688
+ if (events.length === 0) {
689
+ if (!Array.isArray(payloadMaterial) || payloadMaterial.length !== 0) {
690
+ return { ok: false, error: "payload_material length mismatch", expected: 0, actual: Array.isArray(payloadMaterial) ? payloadMaterial.length : null };
691
+ }
692
+ if (declaredHeadChainHash) return { ok: false, error: "declared head chainHash mismatch", expected: declaredHeadChainHash, actual: null };
693
+ if (declaredHeadEventId) return { ok: false, error: "declared head eventId mismatch", expected: declaredHeadEventId, actual: null };
694
+ return { ok: true, head: null, eventCount: 0 };
695
+ }
696
+ if (!Array.isArray(payloadMaterial) || payloadMaterial.length !== events.length) {
697
+ return { ok: false, error: "payload_material length mismatch", expected: events.length, actual: Array.isArray(payloadMaterial) ? payloadMaterial.length : null };
698
+ }
699
+ if (!(publicKeyByKeyId instanceof Map)) return { ok: false, error: "publicKeyByKeyId must be a Map" };
700
+ if (!(keyMetaByKeyId instanceof Map)) return { ok: false, error: "keyMetaByKeyId must be a Map" };
701
+
702
+ for (let i = 0; i < events.length; i += 1) {
703
+ const e = events[i];
704
+ const m = payloadMaterial[i];
705
+ if (!e || typeof e !== "object") return { ok: false, error: `invalid event at index ${i}` };
706
+ if (!m || typeof m !== "object") return { ok: false, error: `invalid payload material at index ${i}` };
707
+
708
+ if (!eventMaterialMatches({ material: m, event: e })) {
709
+ return { ok: false, error: `payload material mismatch at index ${i}`, eventId: e?.id ?? null };
710
+ }
711
+
712
+ const expectedPayloadHash = payloadHashForMaterial(m);
713
+ if (e.payloadHash !== expectedPayloadHash) {
714
+ return { ok: false, error: `payloadHash mismatch at index ${i}`, eventId: e?.id ?? null, expected: expectedPayloadHash, actual: e.payloadHash ?? null };
715
+ }
716
+
717
+ const expectedPrev = i === 0 ? null : events[i - 1]?.chainHash ?? null;
718
+ if ((e.prevChainHash ?? null) !== (expectedPrev ?? null)) {
719
+ return { ok: false, error: `prevChainHash mismatch at index ${i}`, eventId: e?.id ?? null, expected: expectedPrev, actual: e.prevChainHash ?? null };
720
+ }
721
+
722
+ const expectedChainHash = chainHashForEvent({ prevChainHash: expectedPrev, payloadHash: expectedPayloadHash });
723
+ if (e.chainHash !== expectedChainHash) {
724
+ return { ok: false, error: `chainHash mismatch at index ${i}`, eventId: e?.id ?? null, expected: expectedChainHash, actual: e.chainHash ?? null };
725
+ }
726
+
727
+ const requiredKind = requiredSignerKindForEventType(String(e.type ?? ""));
728
+ const requiresSignature = requiredKind !== SIGNER_KIND.NONE;
729
+ if (requiresSignature) {
730
+ if (!e.signature || typeof e.signature !== "string") return { ok: false, error: `missing signature at index ${i}`, eventId: e?.id ?? null, type: e.type ?? null };
731
+ if (!e.signerKeyId || typeof e.signerKeyId !== "string") return { ok: false, error: `missing signerKeyId at index ${i}`, eventId: e?.id ?? null, type: e.type ?? null };
732
+ }
733
+
734
+ if (e.signature) {
735
+ if (!e.signerKeyId) return { ok: false, error: `missing signerKeyId at index ${i}`, eventId: e?.id ?? null };
736
+ const publicKeyPem = publicKeyByKeyId.get(e.signerKeyId) ?? null;
737
+ if (!publicKeyPem) return { ok: false, error: `unknown signerKeyId at index ${i}`, eventId: e?.id ?? null, signerKeyId: e.signerKeyId };
738
+ const meta = keyMetaByKeyId.get(e.signerKeyId) ?? null;
739
+
740
+ // Strict profile: server-required signatures must use a governed server signer key
741
+ // (registered/rotated/revoked via governance events included in the bundle).
742
+ if (strict && requiredKind === SIGNER_KIND.SERVER) {
743
+ const governed = Boolean(meta && typeof meta === "object" && meta.serverGoverned === true);
744
+ if (!governed) {
745
+ return { ok: false, error: `server signer key not governed at index ${i}`, eventId: e?.id ?? null, signerKeyId: e.signerKeyId };
746
+ }
747
+ const hasValidFrom = typeof meta?.validFrom === "string" && meta.validFrom.trim();
748
+ if (!hasValidFrom) {
749
+ return { ok: false, error: `server signer key missing validFrom at index ${i}`, eventId: e?.id ?? null, signerKeyId: e.signerKeyId };
750
+ }
751
+ const purpose = normalizedPurpose(meta);
752
+ if (purpose !== "server") {
753
+ return { ok: false, error: `server signer key purpose invalid at index ${i}`, eventId: e?.id ?? null, signerKeyId: e.signerKeyId, purpose: meta?.purpose ?? null };
754
+ }
755
+ }
756
+
757
+ const usable = isKeyUsableAtForEvent({ meta, event: e });
758
+ if (!usable.ok) {
759
+ return {
760
+ ok: false,
761
+ error: `signer key not valid at index ${i}`,
762
+ reason: usable.reason,
763
+ boundary: usable.boundary ?? null,
764
+ eventId: e?.id ?? null,
765
+ signerKeyId: e.signerKeyId
766
+ };
767
+ }
768
+ const ok = verifyHashHexEd25519({ hashHex: expectedPayloadHash, signatureBase64: e.signature, publicKeyPem });
769
+ if (!ok) return { ok: false, error: `signature invalid at index ${i}`, eventId: e?.id ?? null, signerKeyId: e.signerKeyId };
770
+ }
771
+ }
772
+
773
+ const head = events[events.length - 1];
774
+ if (declaredHeadChainHash && head?.chainHash !== declaredHeadChainHash) {
775
+ return { ok: false, error: "declared head chainHash mismatch", expected: declaredHeadChainHash, actual: head?.chainHash ?? null };
776
+ }
777
+ if (declaredHeadEventId && head?.id !== declaredHeadEventId) {
778
+ return { ok: false, error: "declared head eventId mismatch", expected: declaredHeadEventId, actual: head?.id ?? null };
779
+ }
780
+
781
+ return { ok: true, head: { eventId: head?.id ?? null, chainHash: head?.chainHash ?? null }, eventCount: events.length };
782
+ }
783
+
784
+ function deriveServerKeyTimelineFromGovernanceEvents(events) {
785
+ const derived = new Map(); // keyId -> { validFrom, rotatedAt, revokedAt, serverGoverned }
786
+ for (const e of Array.isArray(events) ? events : []) {
787
+ if (!e || typeof e !== "object") continue;
788
+ const type = String(e.type ?? "");
789
+ const at = typeof e.at === "string" && e.at.trim() ? e.at : null;
790
+ const p = e.payload ?? null;
791
+ if (!p || typeof p !== "object") continue;
792
+
793
+ if (type === "SERVER_SIGNER_KEY_REGISTERED") {
794
+ const keyId = typeof p.keyId === "string" && p.keyId.trim() ? p.keyId : null;
795
+ const registeredAt = typeof p.registeredAt === "string" && p.registeredAt.trim() ? p.registeredAt : at;
796
+ if (!keyId || !registeredAt) continue;
797
+ const row = derived.get(keyId) ?? {};
798
+ if (!row.validFrom) row.validFrom = registeredAt;
799
+ row.serverGoverned = true;
800
+ derived.set(keyId, row);
801
+ }
802
+
803
+ if (type === "SERVER_SIGNER_KEY_ROTATED") {
804
+ const oldKeyId = typeof p.oldKeyId === "string" && p.oldKeyId.trim() ? p.oldKeyId : null;
805
+ const newKeyId = typeof p.newKeyId === "string" && p.newKeyId.trim() ? p.newKeyId : null;
806
+ const rotatedAt = typeof p.rotatedAt === "string" && p.rotatedAt.trim() ? p.rotatedAt : at;
807
+ if (!rotatedAt) continue;
808
+ if (oldKeyId) {
809
+ const row = derived.get(oldKeyId) ?? {};
810
+ row.rotatedAt = rotatedAt;
811
+ row.serverGoverned = true;
812
+ derived.set(oldKeyId, row);
813
+ }
814
+ if (newKeyId) {
815
+ const row = derived.get(newKeyId) ?? {};
816
+ if (!row.validFrom) row.validFrom = rotatedAt;
817
+ row.serverGoverned = true;
818
+ derived.set(newKeyId, row);
819
+ }
820
+ }
821
+
822
+ if (type === "SERVER_SIGNER_KEY_REVOKED") {
823
+ const keyId = typeof p.keyId === "string" && p.keyId.trim() ? p.keyId : null;
824
+ const revokedAt = typeof p.revokedAt === "string" && p.revokedAt.trim() ? p.revokedAt : at;
825
+ if (!keyId || !revokedAt) continue;
826
+ const row = derived.get(keyId) ?? {};
827
+ row.revokedAt = revokedAt;
828
+ row.serverGoverned = true;
829
+ derived.set(keyId, row);
830
+ }
831
+ }
832
+ return derived;
833
+ }
834
+
835
+ function applyDerivedServerTimeline({ keyMetaByKeyId, derived }) {
836
+ if (!(keyMetaByKeyId instanceof Map)) throw new TypeError("keyMetaByKeyId must be a Map");
837
+ if (!(derived instanceof Map)) throw new TypeError("derived must be a Map");
838
+ const next = new Map(keyMetaByKeyId);
839
+ for (const [keyId, timeline] of derived.entries()) {
840
+ const existing = next.get(keyId) ?? null;
841
+ if (!existing || typeof existing !== "object") continue;
842
+ next.set(keyId, {
843
+ ...existing,
844
+ validFrom: timeline.validFrom ?? existing.validFrom ?? null,
845
+ rotatedAt: timeline.rotatedAt ?? existing.rotatedAt ?? null,
846
+ revokedAt: timeline.revokedAt ?? existing.revokedAt ?? null,
847
+ serverGoverned: timeline.serverGoverned === true ? true : existing.serverGoverned === true
848
+ });
849
+ }
850
+ return next;
851
+ }
852
+
853
+ function proofRefMatchesEvent({ ref, proofEvent, allowForfeitStatusOverride = false }) {
854
+ if (!ref || typeof ref !== "object") return false;
855
+ if (!proofEvent || typeof proofEvent !== "object") return false;
856
+ const p = proofEvent.payload ?? null;
857
+ if (!p || typeof p !== "object") return false;
858
+
859
+ if (ref.proofEventId && ref.proofEventId !== proofEvent.id) return false;
860
+ if (ref.proofEventChainHash && ref.proofEventChainHash !== proofEvent.chainHash) return false;
861
+ if (ref.proofEventPayloadHash && ref.proofEventPayloadHash !== proofEvent.payloadHash) return false;
862
+ if (ref.proofEventSignerKeyId && ref.proofEventSignerKeyId !== proofEvent.signerKeyId) return false;
863
+ if (ref.proofEventSignature && ref.proofEventSignature !== proofEvent.signature) return false;
864
+
865
+ if (ref.evaluationId && ref.evaluationId !== p.evaluationId) return false;
866
+ if (ref.evaluatedAtChainHash && ref.evaluatedAtChainHash !== p.evaluatedAtChainHash) return false;
867
+ if (ref.factsHash && ref.factsHash !== p.factsHash) return false;
868
+
869
+ if (ref.status) {
870
+ const ok =
871
+ ref.status === p.status ||
872
+ (allowForfeitStatusOverride && ref.forfeit && typeof ref.forfeit === "object" && p.status === "INSUFFICIENT_EVIDENCE" && ref.status === "FAIL");
873
+ if (!ok) return false;
874
+ }
875
+ if (ref.requiredZonesHash && ref.requiredZonesHash !== p.requiredZonesHash) return false;
876
+ if (ref.customerPolicyHash && ref.customerPolicyHash !== p.customerPolicyHash) return false;
877
+ if (ref.operatorPolicyHash && ref.operatorPolicyHash !== p.operatorPolicyHash) return false;
878
+
879
+ if (ref.reasonCodes && !arrayEqual(ref.reasonCodes, p.reasonCodes)) return false;
880
+
881
+ return true;
882
+ }
883
+
884
+ function decisionRefMatchesEvent({ ref, decisionEvent }) {
885
+ if (!ref || typeof ref !== "object") return false;
886
+ if (!decisionEvent || typeof decisionEvent !== "object") return false;
887
+ const p = decisionEvent.payload ?? null;
888
+ if (!p || typeof p !== "object") return false;
889
+
890
+ if (ref.decisionEventId && ref.decisionEventId !== decisionEvent.id) return false;
891
+ if (ref.decisionEventChainHash && ref.decisionEventChainHash !== decisionEvent.chainHash) return false;
892
+ if (ref.decisionEventPayloadHash && ref.decisionEventPayloadHash !== decisionEvent.payloadHash) return false;
893
+ if (ref.decisionEventSignerKeyId && ref.decisionEventSignerKeyId !== decisionEvent.signerKeyId) return false;
894
+ if (ref.decisionEventSignature && ref.decisionEventSignature !== decisionEvent.signature) return false;
895
+
896
+ if (ref.decisionId && ref.decisionId !== p.decisionId) return false;
897
+ if (ref.kind && ref.kind !== p.kind) return false;
898
+ if (ref.holdId && ref.holdId !== p.holdId) return false;
899
+ if (ref.forfeitureReason && ref.forfeitureReason !== p.forfeitureReason) return false;
900
+ if (ref.policyHash && ref.policyHash !== p.policyHash) return false;
901
+
902
+ if (ref.reasonCodes && !arrayEqual(ref.reasonCodes, Array.isArray(p.reasonCodes) ? p.reasonCodes : [])) return false;
903
+ if (ref.evidenceRefs && !arrayEqual(ref.evidenceRefs, Array.isArray(p.evidenceRefs) ? p.evidenceRefs : [])) return false;
904
+
905
+ return true;
906
+ }
907
+
908
+ function verifyHoldAndSettlementProofRefs(events) {
909
+ const out = { ok: true, checked: 0, errors: [] };
910
+ if (!Array.isArray(events) || events.length === 0) return out;
911
+
912
+ const byId = new Map();
913
+ for (const e of events) {
914
+ if (!e || typeof e !== "object") continue;
915
+ if (typeof e.id === "string" && e.id.trim()) byId.set(e.id, e);
916
+ }
917
+
918
+ for (let idx = 0; idx < events.length; idx += 1) {
919
+ const e = events[idx];
920
+ if (!e || typeof e !== "object") continue;
921
+ const eventsBeforeDecision = events.slice(0, idx);
922
+
923
+ if (e.type === "SETTLEMENT_HELD") {
924
+ out.checked += 1;
925
+ const p = e.payload ?? null;
926
+ const ref = p?.triggeringProofRef ?? null;
927
+ const proofEventId = typeof ref?.proofEventId === "string" ? ref.proofEventId : null;
928
+ const proofEvent = proofEventId ? byId.get(proofEventId) ?? null : null;
929
+ if (!proofEvent || proofEvent.type !== "PROOF_EVALUATED") {
930
+ out.ok = false;
931
+ out.errors.push({ error: "hold missing referenced PROOF_EVALUATED", holdEventId: e.id ?? null, proofEventId });
932
+ continue;
933
+ }
934
+ if (!proofRefMatchesEvent({ ref, proofEvent })) {
935
+ out.ok = false;
936
+ out.errors.push({ error: "hold triggeringProofRef mismatch", holdEventId: e.id ?? null, proofEventId });
937
+ }
938
+ const pp = proofEvent.payload ?? null;
939
+ if (!arrayEqual(p?.missingEvidence, pp?.missingEvidence)) {
940
+ out.ok = false;
941
+ out.errors.push({ error: "hold missingEvidence mismatch", holdEventId: e.id ?? null, proofEventId });
942
+ }
943
+ if (!arrayEqual(p?.reasonCodes, pp?.reasonCodes)) {
944
+ out.ok = false;
945
+ out.errors.push({ error: "hold reasonCodes mismatch", holdEventId: e.id ?? null, proofEventId });
946
+ }
947
+
948
+ // Time-travel freshness: proof factsHash must match facts as-of the hold append point.
949
+ try {
950
+ const expectedFactsHash = computeZoneCoverageFactsHashV1({ events: eventsBeforeDecision, evaluatedAtChainHash: pp?.evaluatedAtChainHash ?? "" });
951
+ if (pp?.factsHash && expectedFactsHash !== pp.factsHash) {
952
+ out.ok = false;
953
+ out.errors.push({ error: "hold stale at decision time", holdEventId: e.id ?? null, proofEventId, expectedFactsHash, actualFactsHash: pp.factsHash });
954
+ }
955
+ } catch (err) {
956
+ out.ok = false;
957
+ out.errors.push({ error: "hold freshness check failed", holdEventId: e.id ?? null, proofEventId, message: err?.message ?? String(err ?? "") });
958
+ }
959
+ }
960
+
961
+ if (e.type === "SETTLEMENT_RELEASED") {
962
+ out.checked += 1;
963
+ const p = e.payload ?? null;
964
+ const ref = p?.releasingProofRef ?? null;
965
+ const proofEventId = typeof ref?.proofEventId === "string" ? ref.proofEventId : null;
966
+ const proofEvent = proofEventId ? byId.get(proofEventId) ?? null : null;
967
+ if (!proofEvent || proofEvent.type !== "PROOF_EVALUATED") {
968
+ out.ok = false;
969
+ out.errors.push({ error: "release missing referenced PROOF_EVALUATED", releaseEventId: e.id ?? null, proofEventId });
970
+ continue;
971
+ }
972
+ if (!proofRefMatchesEvent({ ref, proofEvent })) {
973
+ out.ok = false;
974
+ out.errors.push({ error: "release releasingProofRef mismatch", releaseEventId: e.id ?? null, proofEventId });
975
+ }
976
+
977
+ // Time-travel freshness: proof factsHash must match facts as-of the release append point.
978
+ try {
979
+ const pp = proofEvent.payload ?? null;
980
+ const expectedFactsHash = computeZoneCoverageFactsHashV1({ events: eventsBeforeDecision, evaluatedAtChainHash: pp?.evaluatedAtChainHash ?? "" });
981
+ if (pp?.factsHash && expectedFactsHash !== pp.factsHash) {
982
+ out.ok = false;
983
+ out.errors.push({
984
+ error: "release stale at decision time",
985
+ releaseEventId: e.id ?? null,
986
+ proofEventId,
987
+ expectedFactsHash,
988
+ actualFactsHash: pp.factsHash
989
+ });
990
+ }
991
+ } catch (err) {
992
+ out.ok = false;
993
+ out.errors.push({ error: "release freshness check failed", releaseEventId: e.id ?? null, proofEventId, message: err?.message ?? String(err ?? "") });
994
+ }
995
+ }
996
+
997
+ if (e.type === "SETTLED") {
998
+ out.checked += 1;
999
+ const ref = e?.payload?.settlementProofRef ?? null;
1000
+ const proofEventId = typeof ref?.proofEventId === "string" ? ref.proofEventId : null;
1001
+ const proofEvent = proofEventId ? byId.get(proofEventId) ?? null : null;
1002
+ if (!proofEvent || proofEvent.type !== "PROOF_EVALUATED") {
1003
+ out.ok = false;
1004
+ out.errors.push({ error: "settlement missing referenced PROOF_EVALUATED", settledEventId: e.id ?? null, proofEventId });
1005
+ continue;
1006
+ }
1007
+ if (!proofRefMatchesEvent({ ref, proofEvent, allowForfeitStatusOverride: true })) {
1008
+ out.ok = false;
1009
+ out.errors.push({ error: "settlement settlementProofRef mismatch", settledEventId: e.id ?? null, proofEventId });
1010
+ }
1011
+
1012
+ // Time-travel freshness: proof factsHash must match facts as-of the settlement append point.
1013
+ try {
1014
+ const pp = proofEvent.payload ?? null;
1015
+ const expectedFactsHash = computeZoneCoverageFactsHashV1({ events: eventsBeforeDecision, evaluatedAtChainHash: pp?.evaluatedAtChainHash ?? "" });
1016
+ if (pp?.factsHash && expectedFactsHash !== pp.factsHash) {
1017
+ out.ok = false;
1018
+ out.errors.push({
1019
+ error: "settlement stale at decision time",
1020
+ settledEventId: e.id ?? null,
1021
+ proofEventId,
1022
+ expectedFactsHash,
1023
+ actualFactsHash: pp.factsHash
1024
+ });
1025
+ }
1026
+ } catch (err) {
1027
+ out.ok = false;
1028
+ out.errors.push({ error: "settlement freshness check failed", settledEventId: e.id ?? null, proofEventId, message: err?.message ?? String(err ?? "") });
1029
+ }
1030
+
1031
+ const forfeit = ref?.forfeit && typeof ref.forfeit === "object" ? ref.forfeit : null;
1032
+ if (forfeit) {
1033
+ const forfeitEventId = typeof forfeit.forfeitEventId === "string" ? forfeit.forfeitEventId : null;
1034
+ const forfeitEvent = forfeitEventId ? byId.get(forfeitEventId) ?? null : null;
1035
+ if (!forfeitEvent || forfeitEvent.type !== "SETTLEMENT_FORFEITED") {
1036
+ out.ok = false;
1037
+ out.errors.push({ error: "settlement forfeit ref missing SETTLEMENT_FORFEITED", settledEventId: e.id ?? null, forfeitEventId });
1038
+ } else {
1039
+ if (forfeit.forfeitEventChainHash && forfeit.forfeitEventChainHash !== forfeitEvent.chainHash) {
1040
+ out.ok = false;
1041
+ out.errors.push({ error: "settlement forfeitEventChainHash mismatch", settledEventId: e.id ?? null, forfeitEventId });
1042
+ }
1043
+ if (forfeit.forfeitEventPayloadHash && forfeit.forfeitEventPayloadHash !== forfeitEvent.payloadHash) {
1044
+ out.ok = false;
1045
+ out.errors.push({ error: "settlement forfeitEventPayloadHash mismatch", settledEventId: e.id ?? null, forfeitEventId });
1046
+ }
1047
+ }
1048
+ }
1049
+ }
1050
+
1051
+ if (e.type === "SETTLEMENT_FORFEITED") {
1052
+ out.checked += 1;
1053
+ const p = e.payload ?? null;
1054
+ const evaluatedAtChainHash = typeof p?.evaluatedAtChainHash === "string" ? p.evaluatedAtChainHash : "";
1055
+ const actualFactsHash = typeof p?.factsHash === "string" ? p.factsHash : null;
1056
+ try {
1057
+ const expectedFactsHash = computeZoneCoverageFactsHashV1({ events: eventsBeforeDecision, evaluatedAtChainHash });
1058
+ if (actualFactsHash && expectedFactsHash !== actualFactsHash) {
1059
+ out.ok = false;
1060
+ out.errors.push({
1061
+ error: "forfeit stale at decision time",
1062
+ forfeitEventId: e.id ?? null,
1063
+ expectedFactsHash,
1064
+ actualFactsHash
1065
+ });
1066
+ }
1067
+ } catch (err) {
1068
+ out.ok = false;
1069
+ out.errors.push({ error: "forfeit freshness check failed", forfeitEventId: e.id ?? null, message: err?.message ?? String(err ?? "") });
1070
+ }
1071
+
1072
+ const decisionEventRef = p?.decisionEventRef ?? null;
1073
+ const decisionRef = p?.decisionRef ?? null;
1074
+ if (!decisionEventRef && !decisionRef) {
1075
+ out.ok = false;
1076
+ out.errors.push({ error: "forfeit missing decision provenance", forfeitEventId: e.id ?? null });
1077
+ }
1078
+ if (decisionEventRef) {
1079
+ const decisionEventId = typeof decisionEventRef?.decisionEventId === "string" ? decisionEventRef.decisionEventId : null;
1080
+ const decisionEvent = decisionEventId ? byId.get(decisionEventId) ?? null : null;
1081
+ if (!decisionEvent || decisionEvent.type !== "DECISION_RECORDED") {
1082
+ out.ok = false;
1083
+ out.errors.push({ error: "forfeit decisionEventRef missing DECISION_RECORDED", forfeitEventId: e.id ?? null, decisionEventId });
1084
+ } else if (!decisionRefMatchesEvent({ ref: decisionEventRef, decisionEvent })) {
1085
+ out.ok = false;
1086
+ out.errors.push({ error: "forfeit decisionEventRef mismatch", forfeitEventId: e.id ?? null, decisionEventId });
1087
+ }
1088
+ }
1089
+ }
1090
+ }
1091
+
1092
+ return out;
1093
+ }
1094
+
1095
+ function verifyBundleHeadAttestationV1({
1096
+ attestation,
1097
+ manifestHash,
1098
+ manifestKind,
1099
+ tenantId,
1100
+ scope,
1101
+ jobSnapshot,
1102
+ monthHead,
1103
+ governanceSnapshots,
1104
+ governancePolicy,
1105
+ revocationTimelineByKeyId,
1106
+ trustedTimeAuthorities,
1107
+ publicKeyByKeyId,
1108
+ keyMetaByKeyId,
1109
+ strict
1110
+ }) {
1111
+ if (!attestation || typeof attestation !== "object" || Array.isArray(attestation)) return { ok: false, error: "invalid attestation JSON" };
1112
+ if (strict !== true && strict !== false) strict = false;
1113
+ if (String(attestation.schemaVersion ?? "") !== BUNDLE_HEAD_ATTESTATION_SCHEMA_V1) {
1114
+ return { ok: false, error: "unsupported attestation schemaVersion", schemaVersion: attestation.schemaVersion ?? null };
1115
+ }
1116
+ if (String(attestation.kind ?? "") !== String(manifestKind ?? "")) return { ok: false, error: "attestation kind mismatch", expected: manifestKind ?? null, actual: attestation.kind ?? null };
1117
+ if (String(attestation.tenantId ?? "") !== String(tenantId ?? "")) return { ok: false, error: "attestation tenantId mismatch", expected: tenantId ?? null, actual: attestation.tenantId ?? null };
1118
+ if (canonicalJsonStringify(attestation.scope ?? null) !== canonicalJsonStringify(scope ?? null)) {
1119
+ return { ok: false, error: "attestation scope mismatch", expected: scope ?? null, actual: attestation.scope ?? null };
1120
+ }
1121
+ if (String(attestation.manifestHash ?? "") !== String(manifestHash ?? "")) return { ok: false, error: "attestation manifestHash mismatch", expected: manifestHash ?? null, actual: attestation.manifestHash ?? null };
1122
+
1123
+ const signerKeyId = typeof attestation.signerKeyId === "string" && attestation.signerKeyId.trim() ? attestation.signerKeyId : null;
1124
+ const signature = typeof attestation.signature === "string" && attestation.signature.trim() ? attestation.signature : null;
1125
+ const signedAt = typeof attestation.signedAt === "string" && attestation.signedAt.trim() ? attestation.signedAt : null;
1126
+ if (!signerKeyId || !signature || !signedAt) return { ok: false, error: "attestation missing signer fields" };
1127
+
1128
+ const attestationCore = stripAttestationSig(attestation);
1129
+ const expectedHash = sha256HexUtf8(canonicalJsonStringify(attestationCore));
1130
+ const declaredHash = typeof attestation.attestationHash === "string" && attestation.attestationHash.trim() ? attestation.attestationHash : null;
1131
+ if (declaredHash && declaredHash !== expectedHash) return { ok: false, error: "attestationHash mismatch", expected: expectedHash, actual: declaredHash };
1132
+
1133
+ const publicKeyPem = publicKeyByKeyId.get(signerKeyId) ?? null;
1134
+ if (!publicKeyPem) return { ok: false, error: "unknown attestation signerKeyId", signerKeyId };
1135
+ const okSig = verifyHashHexEd25519({ hashHex: expectedHash, signatureBase64: signature, publicKeyPem });
1136
+ if (!okSig) return { ok: false, error: "attestation signature invalid", signerKeyId };
1137
+
1138
+ const meta = keyMetaByKeyId.get(signerKeyId) ?? null;
1139
+ if (strict) {
1140
+ const subjectType = String(attestation.kind ?? manifestKind ?? "");
1141
+ const auth = authorizeServerSignerForPolicy({
1142
+ policy: governancePolicy,
1143
+ documentKind: "bundle_head_attestation",
1144
+ subjectType,
1145
+ signerKeyId,
1146
+ signerScope: "global",
1147
+ keyMeta: meta
1148
+ });
1149
+ if (!auth.ok) return { ok: false, error: "attestation signer not authorized", detail: auth, signerKeyId };
1150
+ if (!(typeof meta?.validFrom === "string" && meta.validFrom.trim())) return { ok: false, error: "attestation signer key missing validFrom", signerKeyId };
1151
+ }
1152
+ if (strict && revocationTimelineByKeyId instanceof Map) {
1153
+ const time = effectiveSigningTimeFromTimestampProof({ documentCoreWithProof: attestationCore, fallbackSignedAt: signedAt, trustedTimeAuthorities });
1154
+ const effectiveSignedAt = time.effectiveSignedAt;
1155
+ const basic = isKeyUsableAt(meta, effectiveSignedAt);
1156
+ if (!basic.ok) return { ok: false, error: "attestation signer key not valid", signerKeyId, reason: basic.reason, boundary: basic.boundary ?? null };
1157
+ const row = revocationTimelineByKeyId.get(signerKeyId) ?? null;
1158
+ const timelineCheck = enforceProspectiveKeyTimeline({ signerKeyId, effectiveSignedAt, trustworthyTime: time.trustworthy, timelineRow: row });
1159
+ if (!timelineCheck.ok) return { ok: false, error: timelineCheck.error, detail: { ...timelineCheck, timeProof: time.proof ?? null }, signerKeyId };
1160
+ } else {
1161
+ const usable = isServerKeyUsableAtForAttestation({ meta, atIso: signedAt });
1162
+ if (!usable.ok) return { ok: false, error: "attestation signer key not valid", signerKeyId, reason: usable.reason, boundary: usable.boundary ?? null };
1163
+ }
1164
+
1165
+ // Heads must match what the bundle declares.
1166
+ const heads = attestation.heads ?? null;
1167
+ if (!heads || typeof heads !== "object" || Array.isArray(heads)) return { ok: false, error: "attestation missing heads" };
1168
+
1169
+ if (String(attestation.kind ?? "") === JOB_PROOF_BUNDLE_SCHEMA_VERSION_V1) {
1170
+ const declaredJob = heads.job ?? null;
1171
+ const jobLastChainHash = jobSnapshot?.lastChainHash ?? null;
1172
+ const jobLastEventId = jobSnapshot?.lastEventId ?? null;
1173
+ if (!declaredJob) return { ok: false, error: "attestation missing heads.job" };
1174
+ if (jobLastChainHash && declaredJob.lastChainHash && declaredJob.lastChainHash !== jobLastChainHash) {
1175
+ return { ok: false, error: "attestation job head mismatch (chainHash)", expected: jobLastChainHash, actual: declaredJob.lastChainHash };
1176
+ }
1177
+ if (jobLastEventId && declaredJob.lastEventId && declaredJob.lastEventId !== jobLastEventId) {
1178
+ return { ok: false, error: "attestation job head mismatch (eventId)", expected: jobLastEventId, actual: declaredJob.lastEventId };
1179
+ }
1180
+ }
1181
+
1182
+ if (String(attestation.kind ?? "") === MONTH_PROOF_BUNDLE_SCHEMA_VERSION_V1) {
1183
+ const declaredMonth = heads.month ?? null;
1184
+ if (!declaredMonth) return { ok: false, error: "attestation missing heads.month" };
1185
+ if (monthHead?.chainHash && declaredMonth.lastChainHash && declaredMonth.lastChainHash !== monthHead.chainHash) {
1186
+ return { ok: false, error: "attestation month head mismatch (chainHash)", expected: monthHead.chainHash, actual: declaredMonth.lastChainHash };
1187
+ }
1188
+ if (monthHead?.eventId && declaredMonth.lastEventId && declaredMonth.lastEventId !== monthHead.eventId) {
1189
+ return { ok: false, error: "attestation month head mismatch (eventId)", expected: monthHead.eventId, actual: declaredMonth.lastEventId };
1190
+ }
1191
+ }
1192
+
1193
+ const gov = heads.governance ?? null;
1194
+ if (gov && typeof gov === "object" && !Array.isArray(gov)) {
1195
+ const t = gov.tenant ?? null;
1196
+ const g = gov.global ?? null;
1197
+ if (t && governanceSnapshots?.tenant) {
1198
+ if (t.lastChainHash && governanceSnapshots.tenant.lastChainHash && t.lastChainHash !== governanceSnapshots.tenant.lastChainHash) {
1199
+ return { ok: false, error: "attestation tenant governance head mismatch (chainHash)", expected: governanceSnapshots.tenant.lastChainHash, actual: t.lastChainHash };
1200
+ }
1201
+ if (t.lastEventId && governanceSnapshots.tenant.lastEventId && t.lastEventId !== governanceSnapshots.tenant.lastEventId) {
1202
+ return { ok: false, error: "attestation tenant governance head mismatch (eventId)", expected: governanceSnapshots.tenant.lastEventId, actual: t.lastEventId };
1203
+ }
1204
+ }
1205
+ if (g && governanceSnapshots?.global) {
1206
+ if (g.lastChainHash && governanceSnapshots.global.lastChainHash && g.lastChainHash !== governanceSnapshots.global.lastChainHash) {
1207
+ return { ok: false, error: "attestation global governance head mismatch (chainHash)", expected: governanceSnapshots.global.lastChainHash, actual: g.lastChainHash };
1208
+ }
1209
+ if (g.lastEventId && governanceSnapshots.global.lastEventId && g.lastEventId !== governanceSnapshots.global.lastEventId) {
1210
+ return { ok: false, error: "attestation global governance head mismatch (eventId)", expected: governanceSnapshots.global.lastEventId, actual: g.lastEventId };
1211
+ }
1212
+ }
1213
+ }
1214
+
1215
+ return { ok: true, signerKeyId, signedAt, attestationHash: expectedHash };
1216
+ }
1217
+
1218
+ function assertGovernanceScopeIsolation({ globalGovernanceEvents, tenantGovernanceEvents }) {
1219
+ for (const e of Array.isArray(globalGovernanceEvents) ? globalGovernanceEvents : []) {
1220
+ const type = String(e?.type ?? "");
1221
+ if (type === "TENANT_POLICY_UPDATED") {
1222
+ return { ok: false, error: "governance/global contains tenant-scoped event", type };
1223
+ }
1224
+ }
1225
+ for (const e of Array.isArray(tenantGovernanceEvents) ? tenantGovernanceEvents : []) {
1226
+ const type = String(e?.type ?? "");
1227
+ if (type.startsWith("SERVER_SIGNER_KEY_")) {
1228
+ return { ok: false, error: "governance/tenant contains global-scoped event", type };
1229
+ }
1230
+ }
1231
+ return { ok: true };
1232
+ }
1233
+
1234
+ export async function verifyJobProofBundleDir({ dir, strict = false, hashConcurrency = null } = {}) {
1235
+ if (!dir) throw new Error("dir is required");
1236
+ if (strict !== true && strict !== false) throw new TypeError("strict must be a boolean");
1237
+ hashConcurrency = normalizeHashConcurrency(hashConcurrency);
1238
+
1239
+ const warnings = [];
1240
+ if (!strict) {
1241
+ const rawTrusted = String(process.env.SETTLD_TRUSTED_GOVERNANCE_ROOT_KEYS_JSON ?? "").trim();
1242
+ if (!rawTrusted) warnings.push({ code: VERIFICATION_WARNING_CODE.TRUSTED_GOVERNANCE_ROOT_KEYS_MISSING_LENIENT, detail: { env: "SETTLD_TRUSTED_GOVERNANCE_ROOT_KEYS_JSON" } });
1243
+ }
1244
+
1245
+ const manifestPath = path.join(dir, "manifest.json");
1246
+ const manifestWithHash = await readJson(manifestPath);
1247
+ if (manifestWithHash?.schemaVersion !== PROOF_BUNDLE_MANIFEST_SCHEMA_V1) {
1248
+ return { ok: false, error: "unsupported manifest schemaVersion", schemaVersion: manifestWithHash?.schemaVersion ?? null, warnings };
1249
+ }
1250
+
1251
+ {
1252
+ const pre = prevalidateManifestFileEntries({ bundleDir: dir, manifestFiles: manifestWithHash?.files });
1253
+ if (!pre.ok) return { ...pre, warnings };
1254
+ }
1255
+
1256
+ const expectedManifestHash = String(manifestWithHash?.manifestHash ?? "");
1257
+ if (!expectedManifestHash) return { ok: false, error: "manifest missing manifestHash", warnings };
1258
+ const manifestCore = stripManifestHash(manifestWithHash);
1259
+ const actualManifestHash = sha256HexUtf8(canonicalJsonStringify(manifestCore));
1260
+ if (actualManifestHash !== expectedManifestHash) {
1261
+ return { ok: false, error: "manifestHash mismatch", expected: expectedManifestHash, actual: actualManifestHash, warnings };
1262
+ }
1263
+
1264
+ // Strict profile: manifest must enumerate mandatory bundle files (prevents "selective manifest" attacks).
1265
+ {
1266
+ const present = new Set();
1267
+ for (const f of manifestWithHash.files ?? []) {
1268
+ const name = typeof f?.name === "string" ? f.name : null;
1269
+ if (!name) continue;
1270
+ present.add(name);
1271
+ }
1272
+
1273
+ const kind = String(manifestWithHash?.kind ?? "");
1274
+ const required = [];
1275
+ // Base: all job bundles require event stream, payload material, job snapshot, and keys.
1276
+ // `verify/*` files are derived outputs and intentionally excluded from the manifest.
1277
+ required.push("events/events.jsonl", "events/payload_material.jsonl", "job/snapshot.json", "keys/public_keys.json");
1278
+ // Dual-scope governance is mandatory in strict mode.
1279
+ if (strict) {
1280
+ required.push(
1281
+ "governance/policy.json",
1282
+ "governance/revocations.json",
1283
+ "governance/global/events/events.jsonl",
1284
+ "governance/global/events/payload_material.jsonl",
1285
+ "governance/global/snapshot.json",
1286
+ "governance/tenant/events/events.jsonl",
1287
+ "governance/tenant/events/payload_material.jsonl",
1288
+ "governance/tenant/snapshot.json"
1289
+ );
1290
+ }
1291
+ const missing = required.filter((n) => !present.has(n));
1292
+ if (missing.length) {
1293
+ if (strict) return { ok: false, error: "manifest missing required files", kind, missing, warnings };
1294
+ warnings.push({ warning: "MANIFEST_MISSING_REQUIRED_FILES", kind, missing });
1295
+ }
1296
+ }
1297
+
1298
+ // Verify every file hash listed in manifest.json (streaming, concurrency-limited).
1299
+ {
1300
+ const check = await verifyManifestFileHashes({ dir, manifestFiles: manifestWithHash.files, warnings, hashConcurrency });
1301
+ if (!check.ok) return check;
1302
+ }
1303
+
1304
+ // Governance policy: strict signer authorization contract.
1305
+ // v1 exists for non-strict/legacy compatibility; strict requires v2 with governance-root signature.
1306
+ let governancePolicy = null;
1307
+ let revocationTimelineByKeyId = new Map();
1308
+ let trustedGovernanceRoots = new Map();
1309
+ let trustedTimeAuthorities = new Map();
1310
+ try {
1311
+ const policyJson = await readJson(path.join(dir, "governance", "policy.json"));
1312
+ const schemaVersion = String(policyJson?.schemaVersion ?? "");
1313
+ if (schemaVersion === GOVERNANCE_POLICY_SCHEMA_V2) {
1314
+ const parsed = parseGovernancePolicyV2(policyJson);
1315
+ if (!parsed.ok) {
1316
+ if (strict) return { ok: false, error: "invalid governance/policy.json", detail: parsed, warnings };
1317
+ } else {
1318
+ governancePolicy = parsed.policy;
1319
+ }
1320
+ } else {
1321
+ const parsed = parseGovernancePolicyV1(policyJson);
1322
+ if (!parsed.ok) {
1323
+ if (strict) return { ok: false, error: "invalid governance/policy.json", detail: parsed, warnings };
1324
+ } else {
1325
+ governancePolicy = parsed.policy;
1326
+ }
1327
+ }
1328
+ } catch {
1329
+ if (strict) return { ok: false, error: "missing governance/policy.json", warnings };
1330
+ warnings.push({ code: VERIFICATION_WARNING_CODE.GOVERNANCE_POLICY_MISSING_LENIENT });
1331
+ }
1332
+ if (!strict && governancePolicy && String(governancePolicy.schemaVersion ?? "") !== GOVERNANCE_POLICY_SCHEMA_V2) {
1333
+ warnings.push({
1334
+ code: VERIFICATION_WARNING_CODE.GOVERNANCE_POLICY_V1_ACCEPTED_LENIENT,
1335
+ detail: { schemaVersion: governancePolicy.schemaVersion ?? null }
1336
+ });
1337
+ }
1338
+
1339
+ if (strict) {
1340
+ if (!governancePolicy) return { ok: false, error: "missing governance policy", warnings };
1341
+ if (String(governancePolicy.schemaVersion ?? "") !== GOVERNANCE_POLICY_SCHEMA_V2) {
1342
+ return { ok: false, error: "strict requires GovernancePolicy.v2", schemaVersion: governancePolicy.schemaVersion ?? null, warnings };
1343
+ }
1344
+
1345
+ trustedGovernanceRoots = trustedGovernanceRootKeysFromEnv();
1346
+ if (trustedGovernanceRoots.size === 0) {
1347
+ return { ok: false, error: "strict requires trusted governance root keys", env: "SETTLD_TRUSTED_GOVERNANCE_ROOT_KEYS_JSON", warnings };
1348
+ }
1349
+
1350
+ const sigOk = verifyGovernancePolicyV2Signature({ policy: governancePolicy, trustedGovernanceRootPublicKeyByKeyId: trustedGovernanceRoots });
1351
+ if (!sigOk.ok) return { ok: false, error: "governance policy signature invalid", detail: sigOk, warnings };
1352
+
1353
+ const refPath = String(governancePolicy?.revocationList?.path ?? "");
1354
+ if (!refPath || !refPath.startsWith("governance/")) {
1355
+ return { ok: false, error: "governance policy revocationList.path invalid", path: governancePolicy?.revocationList?.path ?? null, warnings };
1356
+ }
1357
+ const revJson = await readJson(path.join(dir, refPath));
1358
+ const parsedList = parseRevocationListV1(revJson);
1359
+ if (!parsedList.ok) return { ok: false, error: "invalid governance revocation list", detail: parsedList, warnings };
1360
+ const listSigOk = verifyRevocationListV1Signature({ list: parsedList.list, trustedGovernanceRootPublicKeyByKeyId: trustedGovernanceRoots });
1361
+ if (!listSigOk.ok) return { ok: false, error: "revocation list signature invalid", detail: listSigOk, warnings };
1362
+ const expectedSha = String(governancePolicy?.revocationList?.sha256 ?? "");
1363
+ if (!expectedSha || listSigOk.listHash !== expectedSha) {
1364
+ return { ok: false, error: "revocation list hash mismatch", expected: expectedSha || null, actual: listSigOk.listHash ?? null, warnings };
1365
+ }
1366
+ revocationTimelineByKeyId = deriveKeyTimelineFromRevocationList(parsedList.list);
1367
+
1368
+ trustedTimeAuthorities = trustedTimeAuthorityKeysFromEnv();
1369
+ }
1370
+
1371
+ // Event stream integrity (no gaps, no selective history): validate against payload material + signatures.
1372
+ let events = null;
1373
+ let payloadMaterial = null;
1374
+ let publicKeyByKeyId = new Map();
1375
+ let keyMetaByKeyId = new Map();
1376
+ let globalGovernanceEvents = null;
1377
+ let globalGovernanceMaterial = null;
1378
+ let globalGovernanceSnapshot = null;
1379
+ let globalGovernanceInfo = null;
1380
+
1381
+ let tenantGovernanceEvents = null;
1382
+ let tenantGovernanceMaterial = null;
1383
+ let tenantGovernanceSnapshot = null;
1384
+ let tenantGovernanceInfo = null;
1385
+ let jobSnapshot = null;
1386
+ try {
1387
+ const raw = await fs.readFile(path.join(dir, "events", "events.jsonl"), "utf8");
1388
+ events = parseJsonl(raw);
1389
+ } catch {
1390
+ events = null;
1391
+ }
1392
+ if (!Array.isArray(events) || events.length === 0) return { ok: false, error: "missing events/events.jsonl", warnings };
1393
+
1394
+ try {
1395
+ const raw = await fs.readFile(path.join(dir, "events", "payload_material.jsonl"), "utf8");
1396
+ payloadMaterial = parseJsonl(raw);
1397
+ } catch {
1398
+ payloadMaterial = null;
1399
+ }
1400
+ if (!payloadMaterial) return { ok: false, error: "missing events/payload_material.jsonl", warnings };
1401
+
1402
+ try {
1403
+ const keysJson = await readJson(path.join(dir, "keys", "public_keys.json"));
1404
+ const parsed = parsePublicKeysFile(keysJson);
1405
+ publicKeyByKeyId = parsed.publicKeyByKeyId;
1406
+ keyMetaByKeyId = parsed.keyMetaByKeyId;
1407
+ } catch (err) {
1408
+ return { ok: false, error: "missing or invalid keys/public_keys.json", message: err?.message ?? String(err ?? ""), warnings };
1409
+ }
1410
+
1411
+ const tenantGov = await tryReadGovernance({ dir, base: path.join("governance", "tenant") });
1412
+ if (tenantGov) {
1413
+ tenantGovernanceInfo = tenantGov;
1414
+ tenantGovernanceEvents = tenantGov.events;
1415
+ tenantGovernanceMaterial = tenantGov.payloadMaterial;
1416
+ tenantGovernanceSnapshot = tenantGov.snapshot;
1417
+ }
1418
+
1419
+ const globalGov = await tryReadGovernance({ dir, base: path.join("governance", "global") });
1420
+ if (globalGov) {
1421
+ globalGovernanceInfo = globalGov;
1422
+ globalGovernanceEvents = globalGov.events;
1423
+ globalGovernanceMaterial = globalGov.payloadMaterial;
1424
+ globalGovernanceSnapshot = globalGov.snapshot;
1425
+ } else {
1426
+ const legacyGov = await tryReadGovernance({ dir, base: "governance" });
1427
+ if (legacyGov) {
1428
+ globalGovernanceInfo = legacyGov;
1429
+ globalGovernanceEvents = legacyGov.events;
1430
+ globalGovernanceMaterial = legacyGov.payloadMaterial;
1431
+ globalGovernanceSnapshot = legacyGov.snapshot;
1432
+ }
1433
+ }
1434
+
1435
+ try {
1436
+ jobSnapshot = await readJson(path.join(dir, "job", "snapshot.json"));
1437
+ } catch {
1438
+ jobSnapshot = null;
1439
+ }
1440
+ if (strict && !jobSnapshot) return { ok: false, error: "missing job/snapshot.json", warnings };
1441
+
1442
+ // Optional bundle head attestation (strict requires it).
1443
+ let headAttestation = null;
1444
+ try {
1445
+ headAttestation = await readJson(path.join(dir, "attestation", "bundle_head_attestation.json"));
1446
+ } catch {
1447
+ headAttestation = null;
1448
+ }
1449
+ if (strict && !headAttestation) return { ok: false, error: "missing attestation/bundle_head_attestation.json", warnings };
1450
+
1451
+ // VerificationReport.v1 (strict requires it, signed).
1452
+ let verificationReport = null;
1453
+ try {
1454
+ verificationReport = await readJson(path.join(dir, "verify", "verification_report.json"));
1455
+ } catch {
1456
+ verificationReport = null;
1457
+ }
1458
+ if (strict && !verificationReport) return { ok: false, error: "missing verify/verification_report.json", warnings };
1459
+ if (!strict && !verificationReport) warnings.push({ code: VERIFICATION_WARNING_CODE.VERIFICATION_REPORT_MISSING_LENIENT });
1460
+
1461
+ let governance = { global: null, tenant: null };
1462
+ let governanceStream = null;
1463
+
1464
+ function declaredHeadFromSnapshot(snapshot) {
1465
+ const declaredChainHash = typeof snapshot?.lastChainHash === "string" && snapshot.lastChainHash.trim() ? snapshot.lastChainHash : null;
1466
+ const declaredEventId = typeof snapshot?.lastEventId === "string" && snapshot.lastEventId.trim() ? snapshot.lastEventId : null;
1467
+ return { declaredChainHash, declaredEventId };
1468
+ }
1469
+
1470
+ // If governance streams are present, derive server key lifecycle timelines first so
1471
+ // strict verification can enforce "server keys must be governed".
1472
+ {
1473
+ const derivedFrom = [
1474
+ ...(Array.isArray(globalGovernanceEvents) ? globalGovernanceEvents : []),
1475
+ ...(Array.isArray(tenantGovernanceEvents) ? tenantGovernanceEvents : [])
1476
+ ];
1477
+ if (derivedFrom.length) {
1478
+ const derived = deriveServerKeyTimelineFromGovernanceEvents(derivedFrom);
1479
+ keyMetaByKeyId = applyDerivedServerTimeline({ keyMetaByKeyId, derived });
1480
+ }
1481
+ }
1482
+
1483
+ if (strict) {
1484
+ const iso = assertGovernanceScopeIsolation({ globalGovernanceEvents, tenantGovernanceEvents });
1485
+ if (!iso.ok) return { ok: false, error: iso.error, detail: iso, warnings };
1486
+ }
1487
+
1488
+ // Verify global governance stream (or legacy).
1489
+ if (Array.isArray(globalGovernanceEvents) && Array.isArray(globalGovernanceMaterial)) {
1490
+ if (strict) {
1491
+ const p = globalGovernanceInfo?.present ?? null;
1492
+ if (!p?.events || !p?.payloadMaterial || !p?.snapshot) {
1493
+ return { ok: false, error: "incomplete governance/global stream files", warnings };
1494
+ }
1495
+ }
1496
+ const { declaredChainHash, declaredEventId } = declaredHeadFromSnapshot(globalGovernanceSnapshot);
1497
+ const globalStream = verifyEventStreamIntegrityV1({
1498
+ events: globalGovernanceEvents,
1499
+ payloadMaterial: globalGovernanceMaterial,
1500
+ publicKeyByKeyId,
1501
+ keyMetaByKeyId,
1502
+ declaredHeadChainHash: declaredChainHash,
1503
+ declaredHeadEventId: declaredEventId,
1504
+ strict
1505
+ });
1506
+ governance.global = globalStream;
1507
+ governanceStream = globalStream; // backward-compat: primary governance stream
1508
+ if (!globalStream.ok) return { ok: false, error: "governance stream integrity invalid", detail: globalStream, warnings };
1509
+ } else if (strict) {
1510
+ return { ok: false, error: "missing governance/global stream", warnings };
1511
+ } else {
1512
+ warnings.push({ warning: "MISSING_GOVERNANCE_GLOBAL_STREAM" });
1513
+ }
1514
+
1515
+ // Verify tenant governance stream (optional).
1516
+ if (Array.isArray(tenantGovernanceEvents) && Array.isArray(tenantGovernanceMaterial)) {
1517
+ if (strict) {
1518
+ const p = tenantGovernanceInfo?.present ?? null;
1519
+ if (!p?.events || !p?.payloadMaterial || !p?.snapshot) {
1520
+ return { ok: false, error: "incomplete governance/tenant stream files", warnings };
1521
+ }
1522
+ }
1523
+ const { declaredChainHash, declaredEventId } = declaredHeadFromSnapshot(tenantGovernanceSnapshot);
1524
+ const tenantStream = verifyEventStreamIntegrityV1({
1525
+ events: tenantGovernanceEvents,
1526
+ payloadMaterial: tenantGovernanceMaterial,
1527
+ publicKeyByKeyId,
1528
+ keyMetaByKeyId,
1529
+ declaredHeadChainHash: declaredChainHash,
1530
+ declaredHeadEventId: declaredEventId,
1531
+ strict
1532
+ });
1533
+ governance.tenant = tenantStream;
1534
+ if (!tenantStream.ok) return { ok: false, error: "tenant governance stream integrity invalid", detail: tenantStream, warnings };
1535
+ } else if (strict) {
1536
+ return { ok: false, error: "missing governance/tenant stream", warnings };
1537
+ } else {
1538
+ warnings.push({ warning: "MISSING_GOVERNANCE_TENANT_STREAM" });
1539
+ }
1540
+
1541
+ const declaredHeadChainHash = typeof jobSnapshot?.lastChainHash === "string" && jobSnapshot.lastChainHash.trim() ? jobSnapshot.lastChainHash : null;
1542
+ const declaredHeadEventId = typeof jobSnapshot?.lastEventId === "string" && jobSnapshot.lastEventId.trim() ? jobSnapshot.lastEventId : null;
1543
+ const eventStream = verifyEventStreamIntegrityV1({
1544
+ events,
1545
+ payloadMaterial,
1546
+ publicKeyByKeyId,
1547
+ keyMetaByKeyId,
1548
+ declaredHeadChainHash,
1549
+ declaredHeadEventId,
1550
+ strict
1551
+ });
1552
+ if (!eventStream.ok) return { ok: false, error: "event stream integrity invalid", detail: eventStream, warnings };
1553
+
1554
+ let attestationVerify = null;
1555
+ if (headAttestation) {
1556
+ const governanceSnapshots = {
1557
+ tenant: tenantGovernanceSnapshot
1558
+ ? {
1559
+ lastChainHash: typeof tenantGovernanceSnapshot?.lastChainHash === "string" ? tenantGovernanceSnapshot.lastChainHash : null,
1560
+ lastEventId: typeof tenantGovernanceSnapshot?.lastEventId === "string" ? tenantGovernanceSnapshot.lastEventId : null
1561
+ }
1562
+ : null,
1563
+ global: globalGovernanceSnapshot
1564
+ ? {
1565
+ lastChainHash: typeof globalGovernanceSnapshot?.lastChainHash === "string" ? globalGovernanceSnapshot.lastChainHash : null,
1566
+ lastEventId: typeof globalGovernanceSnapshot?.lastEventId === "string" ? globalGovernanceSnapshot.lastEventId : null
1567
+ }
1568
+ : null
1569
+ };
1570
+ attestationVerify = verifyBundleHeadAttestationV1({
1571
+ attestation: headAttestation,
1572
+ manifestHash: expectedManifestHash,
1573
+ manifestKind: manifestWithHash.kind ?? null,
1574
+ tenantId: manifestWithHash.tenantId ?? null,
1575
+ scope: manifestWithHash.scope ?? null,
1576
+ jobSnapshot,
1577
+ monthHead: null,
1578
+ governanceSnapshots,
1579
+ governancePolicy,
1580
+ revocationTimelineByKeyId,
1581
+ trustedTimeAuthorities,
1582
+ publicKeyByKeyId,
1583
+ keyMetaByKeyId,
1584
+ strict
1585
+ });
1586
+ if (!attestationVerify.ok) {
1587
+ if (strict) return { ok: false, error: "bundle head attestation invalid", detail: attestationVerify, warnings };
1588
+ warnings.push({ warning: "BUNDLE_HEAD_ATTESTATION_INVALID", detail: attestationVerify });
1589
+ }
1590
+ } else {
1591
+ warnings.push({ warning: "MISSING_BUNDLE_HEAD_ATTESTATION" });
1592
+ warnings.push({ code: VERIFICATION_WARNING_CODE.BUNDLE_HEAD_ATTESTATION_MISSING_LENIENT });
1593
+ }
1594
+
1595
+ // Provenance refs: settlement/hold decisions must reference real proof events and be fresh at decision time.
1596
+ const refs = verifyHoldAndSettlementProofRefs(events);
1597
+ if (!refs.ok) return { ok: false, error: "provenance refs invalid", detail: refs, warnings };
1598
+
1599
+ // Signed verification report must match the bundle manifestHash.
1600
+ let verificationReportVerify = null;
1601
+ if (verificationReport) {
1602
+ verificationReportVerify = verifyVerificationReportV1ForProofBundle({
1603
+ report: verificationReport,
1604
+ expectedManifestHash,
1605
+ expectedBundleType: JOB_PROOF_BUNDLE_SCHEMA_VERSION_V1,
1606
+ expectedBundleHeadAttestationHash: attestationVerify?.attestationHash ?? null,
1607
+ publicKeyByKeyId,
1608
+ keyMetaByKeyId,
1609
+ governancePolicy,
1610
+ revocationTimelineByKeyId,
1611
+ trustedTimeAuthorities,
1612
+ strict
1613
+ });
1614
+ if (!verificationReportVerify.ok) return { ok: false, error: "verification report invalid", detail: verificationReportVerify, warnings };
1615
+ }
1616
+
1617
+ return {
1618
+ ok: true,
1619
+ strict,
1620
+ warnings,
1621
+ headAttestation: attestationVerify,
1622
+ kind: manifestWithHash.kind ?? null,
1623
+ tenantId: manifestWithHash.tenantId ?? null,
1624
+ scope: manifestWithHash.scope ?? null,
1625
+ manifestHash: expectedManifestHash,
1626
+ governance,
1627
+ governanceStream,
1628
+ eventStream,
1629
+ provenanceRefs: refs,
1630
+ verificationReport: verificationReportVerify?.ok ? verificationReportVerify : null
1631
+ };
1632
+ }
1633
+
1634
+ export async function verifyMonthProofBundleDir({ dir, strict = false, hashConcurrency = null } = {}) {
1635
+ if (!dir) throw new Error("dir is required");
1636
+ if (strict !== true && strict !== false) throw new TypeError("strict must be a boolean");
1637
+ hashConcurrency = normalizeHashConcurrency(hashConcurrency);
1638
+
1639
+ const warnings = [];
1640
+ if (!strict) {
1641
+ const rawTrusted = String(process.env.SETTLD_TRUSTED_GOVERNANCE_ROOT_KEYS_JSON ?? "").trim();
1642
+ if (!rawTrusted) warnings.push({ code: VERIFICATION_WARNING_CODE.TRUSTED_GOVERNANCE_ROOT_KEYS_MISSING_LENIENT, detail: { env: "SETTLD_TRUSTED_GOVERNANCE_ROOT_KEYS_JSON" } });
1643
+ }
1644
+
1645
+ const manifestPath = path.join(dir, "manifest.json");
1646
+ const manifestWithHash = await readJson(manifestPath);
1647
+ if (manifestWithHash?.schemaVersion !== PROOF_BUNDLE_MANIFEST_SCHEMA_V1) {
1648
+ return { ok: false, error: "unsupported manifest schemaVersion", schemaVersion: manifestWithHash?.schemaVersion ?? null, warnings };
1649
+ }
1650
+ if (String(manifestWithHash?.kind ?? "") !== MONTH_PROOF_BUNDLE_SCHEMA_VERSION_V1) {
1651
+ return { ok: false, error: "unsupported bundle kind", kind: manifestWithHash?.kind ?? null, warnings };
1652
+ }
1653
+
1654
+ {
1655
+ const pre = prevalidateManifestFileEntries({ bundleDir: dir, manifestFiles: manifestWithHash?.files });
1656
+ if (!pre.ok) return { ...pre, warnings };
1657
+ }
1658
+
1659
+ const expectedManifestHash = String(manifestWithHash?.manifestHash ?? "");
1660
+ if (!expectedManifestHash) return { ok: false, error: "manifest missing manifestHash", warnings };
1661
+ const manifestCore = stripManifestHash(manifestWithHash);
1662
+ const actualManifestHash = sha256HexUtf8(canonicalJsonStringify(manifestCore));
1663
+ if (actualManifestHash !== expectedManifestHash) {
1664
+ return { ok: false, error: "manifestHash mismatch", expected: expectedManifestHash, actual: actualManifestHash, warnings };
1665
+ }
1666
+
1667
+ // Strict profile: manifest must enumerate mandatory bundle files.
1668
+ {
1669
+ const present = new Set();
1670
+ for (const f of manifestWithHash.files ?? []) {
1671
+ const name = typeof f?.name === "string" ? f.name : null;
1672
+ if (!name) continue;
1673
+ present.add(name);
1674
+ }
1675
+ // `verify/*` files are derived outputs and intentionally excluded from the manifest.
1676
+ const required = ["events/events.jsonl", "events/payload_material.jsonl", "keys/public_keys.json"];
1677
+ if (strict) {
1678
+ required.push(
1679
+ "governance/policy.json",
1680
+ "governance/revocations.json",
1681
+ "governance/global/events/events.jsonl",
1682
+ "governance/global/events/payload_material.jsonl",
1683
+ "governance/global/snapshot.json",
1684
+ "governance/tenant/events/events.jsonl",
1685
+ "governance/tenant/events/payload_material.jsonl",
1686
+ "governance/tenant/snapshot.json"
1687
+ );
1688
+ }
1689
+ const missing = required.filter((n) => !present.has(n));
1690
+ if (missing.length) {
1691
+ if (strict) return { ok: false, error: "manifest missing required files", missing, warnings };
1692
+ warnings.push({ warning: "MANIFEST_MISSING_REQUIRED_FILES", missing });
1693
+ }
1694
+ }
1695
+
1696
+ // Verify every file hash listed in manifest.json (streaming, concurrency-limited).
1697
+ {
1698
+ const check = await verifyManifestFileHashes({ dir, manifestFiles: manifestWithHash.files, warnings, hashConcurrency });
1699
+ if (!check.ok) return check;
1700
+ }
1701
+
1702
+ // Governance policy: strict signer authorization contract.
1703
+ // v1 exists for non-strict/legacy compatibility; strict requires v2 with governance-root signature.
1704
+ let governancePolicy = null;
1705
+ let revocationTimelineByKeyId = new Map();
1706
+ let trustedGovernanceRoots = new Map();
1707
+ let trustedTimeAuthorities = new Map();
1708
+ try {
1709
+ const policyJson = await readJson(path.join(dir, "governance", "policy.json"));
1710
+ const schemaVersion = String(policyJson?.schemaVersion ?? "");
1711
+ if (schemaVersion === GOVERNANCE_POLICY_SCHEMA_V2) {
1712
+ const parsed = parseGovernancePolicyV2(policyJson);
1713
+ if (!parsed.ok) {
1714
+ if (strict) return { ok: false, error: "invalid governance/policy.json", detail: parsed, warnings };
1715
+ } else {
1716
+ governancePolicy = parsed.policy;
1717
+ }
1718
+ } else {
1719
+ const parsed = parseGovernancePolicyV1(policyJson);
1720
+ if (!parsed.ok) {
1721
+ if (strict) return { ok: false, error: "invalid governance/policy.json", detail: parsed, warnings };
1722
+ } else {
1723
+ governancePolicy = parsed.policy;
1724
+ }
1725
+ }
1726
+ } catch {
1727
+ if (strict) return { ok: false, error: "missing governance/policy.json", warnings };
1728
+ warnings.push({ code: VERIFICATION_WARNING_CODE.GOVERNANCE_POLICY_MISSING_LENIENT });
1729
+ }
1730
+ if (!strict && governancePolicy && String(governancePolicy.schemaVersion ?? "") !== GOVERNANCE_POLICY_SCHEMA_V2) {
1731
+ warnings.push({
1732
+ code: VERIFICATION_WARNING_CODE.GOVERNANCE_POLICY_V1_ACCEPTED_LENIENT,
1733
+ detail: { schemaVersion: governancePolicy.schemaVersion ?? null }
1734
+ });
1735
+ }
1736
+
1737
+ if (strict) {
1738
+ if (!governancePolicy) return { ok: false, error: "missing governance policy", warnings };
1739
+ if (String(governancePolicy.schemaVersion ?? "") !== GOVERNANCE_POLICY_SCHEMA_V2) {
1740
+ return { ok: false, error: "strict requires GovernancePolicy.v2", schemaVersion: governancePolicy.schemaVersion ?? null, warnings };
1741
+ }
1742
+
1743
+ trustedGovernanceRoots = trustedGovernanceRootKeysFromEnv();
1744
+ if (trustedGovernanceRoots.size === 0) {
1745
+ return { ok: false, error: "strict requires trusted governance root keys", env: "SETTLD_TRUSTED_GOVERNANCE_ROOT_KEYS_JSON", warnings };
1746
+ }
1747
+
1748
+ const sigOk = verifyGovernancePolicyV2Signature({ policy: governancePolicy, trustedGovernanceRootPublicKeyByKeyId: trustedGovernanceRoots });
1749
+ if (!sigOk.ok) return { ok: false, error: "governance policy signature invalid", detail: sigOk, warnings };
1750
+
1751
+ const refPath = String(governancePolicy?.revocationList?.path ?? "");
1752
+ if (!refPath || !refPath.startsWith("governance/")) {
1753
+ return { ok: false, error: "governance policy revocationList.path invalid", path: governancePolicy?.revocationList?.path ?? null, warnings };
1754
+ }
1755
+ const revJson = await readJson(path.join(dir, refPath));
1756
+ const parsedList = parseRevocationListV1(revJson);
1757
+ if (!parsedList.ok) return { ok: false, error: "invalid governance revocation list", detail: parsedList, warnings };
1758
+ const listSigOk = verifyRevocationListV1Signature({ list: parsedList.list, trustedGovernanceRootPublicKeyByKeyId: trustedGovernanceRoots });
1759
+ if (!listSigOk.ok) return { ok: false, error: "revocation list signature invalid", detail: listSigOk, warnings };
1760
+ const expectedSha = String(governancePolicy?.revocationList?.sha256 ?? "");
1761
+ if (!expectedSha || listSigOk.listHash !== expectedSha) {
1762
+ return { ok: false, error: "revocation list hash mismatch", expected: expectedSha || null, actual: listSigOk.listHash ?? null, warnings };
1763
+ }
1764
+ revocationTimelineByKeyId = deriveKeyTimelineFromRevocationList(parsedList.list);
1765
+ trustedTimeAuthorities = trustedTimeAuthorityKeysFromEnv();
1766
+ }
1767
+
1768
+ // Read keys.
1769
+ let publicKeyByKeyId = new Map();
1770
+ let keyMetaByKeyId = new Map();
1771
+ try {
1772
+ const keys = await readJson(path.join(dir, "keys", "public_keys.json"));
1773
+ ({ publicKeyByKeyId, keyMetaByKeyId } = parsePublicKeysFile(keys));
1774
+ } catch (err) {
1775
+ if (strict) return { ok: false, error: "missing keys/public_keys.json", warnings };
1776
+ warnings.push({ warning: "MISSING_PUBLIC_KEYS" });
1777
+ }
1778
+
1779
+ // Read month events and payload material.
1780
+ let events = null;
1781
+ let payloadMaterial = null;
1782
+ try {
1783
+ const raw = await fs.readFile(path.join(dir, "events", "events.jsonl"), "utf8");
1784
+ events = parseJsonl(raw);
1785
+ } catch {
1786
+ events = null;
1787
+ }
1788
+ if (!Array.isArray(events) || events.length === 0) return { ok: false, error: "missing events/events.jsonl", warnings };
1789
+
1790
+ try {
1791
+ const raw = await fs.readFile(path.join(dir, "events", "payload_material.jsonl"), "utf8");
1792
+ payloadMaterial = parseJsonl(raw);
1793
+ } catch {
1794
+ payloadMaterial = null;
1795
+ }
1796
+ if (!Array.isArray(payloadMaterial)) return { ok: false, error: "missing events/payload_material.jsonl", warnings };
1797
+
1798
+ // Governance streams.
1799
+ let globalGovernanceEvents = null;
1800
+ let globalGovernanceMaterial = null;
1801
+ let globalGovernanceSnapshot = null;
1802
+ let globalGovernanceInfo = null;
1803
+
1804
+ let tenantGovernanceEvents = null;
1805
+ let tenantGovernanceMaterial = null;
1806
+ let tenantGovernanceSnapshot = null;
1807
+ let tenantGovernanceInfo = null;
1808
+
1809
+ const tenantGov = await tryReadGovernance({ dir, base: path.join("governance", "tenant") });
1810
+ if (tenantGov) {
1811
+ tenantGovernanceInfo = tenantGov;
1812
+ tenantGovernanceEvents = tenantGov.events;
1813
+ tenantGovernanceMaterial = tenantGov.payloadMaterial;
1814
+ tenantGovernanceSnapshot = tenantGov.snapshot;
1815
+ }
1816
+ const globalGov = await tryReadGovernance({ dir, base: path.join("governance", "global") });
1817
+ if (globalGov) {
1818
+ globalGovernanceInfo = globalGov;
1819
+ globalGovernanceEvents = globalGov.events;
1820
+ globalGovernanceMaterial = globalGov.payloadMaterial;
1821
+ globalGovernanceSnapshot = globalGov.snapshot;
1822
+ }
1823
+
1824
+ // Optional bundle head attestation (strict requires it).
1825
+ let headAttestation = null;
1826
+ try {
1827
+ headAttestation = await readJson(path.join(dir, "attestation", "bundle_head_attestation.json"));
1828
+ } catch {
1829
+ headAttestation = null;
1830
+ }
1831
+ if (strict && !headAttestation) return { ok: false, error: "missing attestation/bundle_head_attestation.json", warnings };
1832
+
1833
+ // VerificationReport.v1 (strict requires it, signed).
1834
+ let verificationReport = null;
1835
+ try {
1836
+ verificationReport = await readJson(path.join(dir, "verify", "verification_report.json"));
1837
+ } catch {
1838
+ verificationReport = null;
1839
+ }
1840
+ if (strict && !verificationReport) return { ok: false, error: "missing verify/verification_report.json", warnings };
1841
+ if (!strict && !verificationReport) warnings.push({ code: VERIFICATION_WARNING_CODE.VERIFICATION_REPORT_MISSING_LENIENT });
1842
+
1843
+ // Derive server key timelines.
1844
+ {
1845
+ const derivedFrom = [
1846
+ ...(Array.isArray(globalGovernanceEvents) ? globalGovernanceEvents : []),
1847
+ ...(Array.isArray(tenantGovernanceEvents) ? tenantGovernanceEvents : [])
1848
+ ];
1849
+ if (derivedFrom.length) {
1850
+ const derived = deriveServerKeyTimelineFromGovernanceEvents(derivedFrom);
1851
+ keyMetaByKeyId = applyDerivedServerTimeline({ keyMetaByKeyId, derived });
1852
+ }
1853
+ }
1854
+
1855
+ if (strict) {
1856
+ const iso = assertGovernanceScopeIsolation({ globalGovernanceEvents, tenantGovernanceEvents });
1857
+ if (!iso.ok) return { ok: false, error: iso.error, detail: iso, warnings };
1858
+ }
1859
+
1860
+ const governance = { global: null, tenant: null };
1861
+
1862
+ function declaredHeadFromSnapshot(snapshot) {
1863
+ const declaredChainHash = typeof snapshot?.lastChainHash === "string" && snapshot.lastChainHash.trim() ? snapshot.lastChainHash : null;
1864
+ const declaredEventId = typeof snapshot?.lastEventId === "string" && snapshot.lastEventId.trim() ? snapshot.lastEventId : null;
1865
+ return { declaredChainHash, declaredEventId };
1866
+ }
1867
+
1868
+ if (Array.isArray(globalGovernanceEvents) && Array.isArray(globalGovernanceMaterial)) {
1869
+ if (strict) {
1870
+ const p = globalGovernanceInfo?.present ?? null;
1871
+ if (!p?.events || !p?.payloadMaterial || !p?.snapshot) {
1872
+ return { ok: false, error: "incomplete governance/global stream files", warnings };
1873
+ }
1874
+ }
1875
+ const { declaredChainHash, declaredEventId } = declaredHeadFromSnapshot(globalGovernanceSnapshot);
1876
+ const globalStream = verifyEventStreamIntegrityV1({
1877
+ events: globalGovernanceEvents,
1878
+ payloadMaterial: globalGovernanceMaterial,
1879
+ publicKeyByKeyId,
1880
+ keyMetaByKeyId,
1881
+ declaredHeadChainHash: declaredChainHash,
1882
+ declaredHeadEventId: declaredEventId,
1883
+ strict
1884
+ });
1885
+ governance.global = globalStream;
1886
+ if (!globalStream.ok) return { ok: false, error: "governance stream integrity invalid", detail: globalStream, warnings };
1887
+ } else if (strict) {
1888
+ return { ok: false, error: "missing governance/global stream", warnings };
1889
+ } else {
1890
+ warnings.push({ warning: "MISSING_GOVERNANCE_GLOBAL_STREAM" });
1891
+ }
1892
+
1893
+ if (Array.isArray(tenantGovernanceEvents) && Array.isArray(tenantGovernanceMaterial)) {
1894
+ if (strict) {
1895
+ const p = tenantGovernanceInfo?.present ?? null;
1896
+ if (!p?.events || !p?.payloadMaterial || !p?.snapshot) {
1897
+ return { ok: false, error: "incomplete governance/tenant stream files", warnings };
1898
+ }
1899
+ }
1900
+ const { declaredChainHash, declaredEventId } = declaredHeadFromSnapshot(tenantGovernanceSnapshot);
1901
+ const tenantStream = verifyEventStreamIntegrityV1({
1902
+ events: tenantGovernanceEvents,
1903
+ payloadMaterial: tenantGovernanceMaterial,
1904
+ publicKeyByKeyId,
1905
+ keyMetaByKeyId,
1906
+ declaredHeadChainHash: declaredChainHash,
1907
+ declaredHeadEventId: declaredEventId,
1908
+ strict
1909
+ });
1910
+ governance.tenant = tenantStream;
1911
+ if (!tenantStream.ok) return { ok: false, error: "tenant governance stream integrity invalid", detail: tenantStream, warnings };
1912
+ } else if (strict) {
1913
+ return { ok: false, error: "missing governance/tenant stream", warnings };
1914
+ } else {
1915
+ warnings.push({ warning: "MISSING_GOVERNANCE_TENANT_STREAM" });
1916
+ }
1917
+
1918
+ const eventStream = verifyEventStreamIntegrityV1({
1919
+ events,
1920
+ payloadMaterial,
1921
+ publicKeyByKeyId,
1922
+ keyMetaByKeyId,
1923
+ declaredHeadChainHash: null,
1924
+ declaredHeadEventId: null,
1925
+ strict
1926
+ });
1927
+ if (!eventStream.ok) return { ok: false, error: "event stream integrity invalid", detail: eventStream, warnings };
1928
+
1929
+ let attestationVerify = null;
1930
+ if (headAttestation) {
1931
+ const governanceSnapshots = {
1932
+ tenant: tenantGovernanceSnapshot
1933
+ ? { lastChainHash: tenantGovernanceSnapshot?.lastChainHash ?? null, lastEventId: tenantGovernanceSnapshot?.lastEventId ?? null }
1934
+ : null,
1935
+ global: globalGovernanceSnapshot
1936
+ ? { lastChainHash: globalGovernanceSnapshot?.lastChainHash ?? null, lastEventId: globalGovernanceSnapshot?.lastEventId ?? null }
1937
+ : null
1938
+ };
1939
+ const monthHead = eventStream.head ? { eventId: eventStream.head.eventId, chainHash: eventStream.head.chainHash } : null;
1940
+ attestationVerify = verifyBundleHeadAttestationV1({
1941
+ attestation: headAttestation,
1942
+ manifestHash: expectedManifestHash,
1943
+ manifestKind: manifestWithHash.kind ?? null,
1944
+ tenantId: manifestWithHash.tenantId ?? null,
1945
+ scope: manifestWithHash.scope ?? null,
1946
+ jobSnapshot: null,
1947
+ monthHead,
1948
+ governanceSnapshots,
1949
+ governancePolicy,
1950
+ revocationTimelineByKeyId,
1951
+ trustedTimeAuthorities,
1952
+ publicKeyByKeyId,
1953
+ keyMetaByKeyId,
1954
+ strict
1955
+ });
1956
+ if (!attestationVerify.ok) {
1957
+ if (strict) return { ok: false, error: "bundle head attestation invalid", detail: attestationVerify, warnings };
1958
+ warnings.push({ warning: "BUNDLE_HEAD_ATTESTATION_INVALID", detail: attestationVerify });
1959
+ }
1960
+ } else {
1961
+ warnings.push({ warning: "MISSING_BUNDLE_HEAD_ATTESTATION" });
1962
+ warnings.push({ code: VERIFICATION_WARNING_CODE.BUNDLE_HEAD_ATTESTATION_MISSING_LENIENT });
1963
+ }
1964
+
1965
+ // Signed verification report must match the bundle manifestHash.
1966
+ let verificationReportVerify = null;
1967
+ if (verificationReport) {
1968
+ verificationReportVerify = verifyVerificationReportV1ForProofBundle({
1969
+ report: verificationReport,
1970
+ expectedManifestHash,
1971
+ expectedBundleType: MONTH_PROOF_BUNDLE_SCHEMA_VERSION_V1,
1972
+ expectedBundleHeadAttestationHash: attestationVerify?.attestationHash ?? null,
1973
+ publicKeyByKeyId,
1974
+ keyMetaByKeyId,
1975
+ governancePolicy,
1976
+ revocationTimelineByKeyId,
1977
+ trustedTimeAuthorities,
1978
+ strict
1979
+ });
1980
+ if (!verificationReportVerify.ok) return { ok: false, error: "verification report invalid", detail: verificationReportVerify, warnings };
1981
+ }
1982
+
1983
+ return {
1984
+ ok: true,
1985
+ strict,
1986
+ warnings,
1987
+ headAttestation: attestationVerify,
1988
+ kind: manifestWithHash.kind ?? null,
1989
+ tenantId: manifestWithHash.tenantId ?? null,
1990
+ scope: manifestWithHash.scope ?? null,
1991
+ manifestHash: expectedManifestHash,
1992
+ governance,
1993
+ eventStream,
1994
+ verificationReport: verificationReportVerify?.ok ? verificationReportVerify : null
1995
+ };
1996
+ }