settld 0.1.2 → 0.2.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 (483) hide show
  1. package/README.md +93 -3
  2. package/SETTLD_VERSION +1 -1
  3. package/bin/settld-mcp +2 -0
  4. package/bin/settld.js +71 -0
  5. package/conformance/kernel-v0/README.md +7 -0
  6. package/conformance/kernel-v0/run.mjs +292 -4
  7. package/docs/ACCESS.md +57 -0
  8. package/docs/ADOPTION_CHECKLIST.md +44 -0
  9. package/docs/ALERTS.md +198 -0
  10. package/docs/ARCHITECTURE.md +69 -0
  11. package/docs/ARCHITECTURE_FOUNDER_GUIDE.md +284 -0
  12. package/docs/ARTIFACTS.md +60 -0
  13. package/docs/CERTIFICATION_CHECKLIST.md +33 -0
  14. package/docs/CIRCLE_SANDBOX_E2E.md +152 -0
  15. package/docs/CONFIG.md +297 -0
  16. package/docs/CONTRACTS_APIS.md +23 -0
  17. package/docs/DEPRECATION.md +31 -0
  18. package/docs/DOMAIN_MODEL.md +92 -0
  19. package/docs/EVENT_ENVELOPE.md +53 -0
  20. package/docs/FINANCE_PACK_FORMAT.md +53 -0
  21. package/docs/INCIDENT_TAXONOMY.md +30 -0
  22. package/docs/JOB_STATE_MACHINE.md +66 -0
  23. package/docs/KERNEL_COMPATIBLE.md +60 -0
  24. package/docs/KERNEL_V0.md +40 -0
  25. package/docs/KEY_ROTATION.md +80 -0
  26. package/docs/LEDGER.md +82 -0
  27. package/docs/LIVENESS.md +76 -0
  28. package/docs/MVP_BUILD_ORDER.md +36 -0
  29. package/docs/ONCALL_PLAYBOOK.md +39 -0
  30. package/docs/OPERATIONS_SIGNING.md +20 -0
  31. package/docs/OVERVIEW.md +190 -0
  32. package/docs/PERF_BASELINE.md +85 -0
  33. package/docs/PRD.md +77 -0
  34. package/docs/QUICKSTART_KERNEL_V0.md +96 -0
  35. package/docs/QUICKSTART_MCP.md +377 -0
  36. package/docs/QUICKSTART_MCP_HOSTS.md +210 -0
  37. package/docs/QUICKSTART_POLICY_PACKS.md +65 -0
  38. package/docs/QUICKSTART_PRODUCE.md +61 -0
  39. package/docs/QUICKSTART_PROFILES.md +198 -0
  40. package/docs/QUICKSTART_RELEASE_VERIFY.md +39 -0
  41. package/docs/QUICKSTART_SDK.md +125 -0
  42. package/docs/QUICKSTART_SDK_PYTHON.md +111 -0
  43. package/docs/QUICKSTART_VERIFY.md +54 -0
  44. package/docs/QUICKSTART_X402_GATEWAY.md +317 -0
  45. package/docs/README.md +33 -0
  46. package/docs/RELEASE_CHECKLIST.md +182 -0
  47. package/docs/RELEASING.md +82 -0
  48. package/docs/REPO_SETTINGS.md +37 -0
  49. package/docs/RUNBOOK.md +86 -0
  50. package/docs/SKILLS.md +42 -0
  51. package/docs/SKILL_BUNDLE_FORMAT.md +48 -0
  52. package/docs/SLO.md +131 -0
  53. package/docs/SUMMARY.md +17 -0
  54. package/docs/SUPPORT.md +31 -0
  55. package/docs/THREAT_MODEL.md +36 -0
  56. package/docs/TRUST.md +59 -0
  57. package/docs/WORKFLOW.md +35 -0
  58. package/docs/X402_BATCH_SETTLEMENT.md +126 -0
  59. package/docs/blog/2026-02-14-your-ai-agent-just-spent-500-where-is-the-receipt.md +73 -0
  60. package/docs/examples/x402-provider-payout-registry.example.json +14 -0
  61. package/docs/gitbook/README.md +64 -0
  62. package/docs/gitbook/SETUP.md +25 -0
  63. package/docs/gitbook/SUMMARY.md +15 -0
  64. package/docs/gitbook/api-reference.md +73 -0
  65. package/docs/gitbook/closepacks.md +55 -0
  66. package/docs/gitbook/conformance.md +59 -0
  67. package/docs/gitbook/core-primitives.md +85 -0
  68. package/docs/gitbook/dispute-lifecycle.md +33 -0
  69. package/docs/gitbook/faq.md +21 -0
  70. package/docs/gitbook/guides.md +49 -0
  71. package/docs/gitbook/operations-runbook.md +36 -0
  72. package/docs/gitbook/quickstart.md +103 -0
  73. package/docs/gitbook/replay-and-audit.md +30 -0
  74. package/docs/gitbook/sdk-reference.md +35 -0
  75. package/docs/gitbook/security-model.md +58 -0
  76. package/docs/integrations/README.md +15 -0
  77. package/docs/integrations/github-actions-verify.yml +31 -0
  78. package/docs/integrations/github-actions.md +34 -0
  79. package/docs/integrations/openclaw/CLAWHUB_PUBLISH_CHECKLIST.md +65 -0
  80. package/docs/integrations/openclaw/PUBLIC_QUICKSTART.md +95 -0
  81. package/docs/integrations/openclaw/settld-mcp-skill/SKILL.md +69 -0
  82. package/docs/integrations/openclaw/settld-mcp-skill/mcp-server.example.json +12 -0
  83. package/docs/kernel-compatible/capabilities.json +36 -0
  84. package/docs/marketing/agent-commerce-substrate.md +78 -0
  85. package/docs/marketing/hn-repost-2026-02-17.md +102 -0
  86. package/docs/marketing/show-hn-post.md +45 -0
  87. package/docs/ops/ARTIFACT_VERIFICATION_STATUS.md +43 -0
  88. package/docs/ops/BILLING_WEBHOOK_REPLAY.md +105 -0
  89. package/docs/ops/CI_FLAKE_BUDGET.md +31 -0
  90. package/docs/ops/DISPUTE_FINANCE_RECONCILIATION_PACKET.md +56 -0
  91. package/docs/ops/GO_LIVE_GATE_S13.md +27 -0
  92. package/docs/ops/HOSTED_BASELINE_R2.md +129 -0
  93. package/docs/ops/KERNEL_V0_SHIP_GATE.md +69 -0
  94. package/docs/ops/LIGHTHOUSE_PRODUCTION_CLOSE.md +51 -0
  95. package/docs/ops/MCP_COMPATIBILITY_MATRIX.md +30 -0
  96. package/docs/ops/MINIMUM_PRODUCTION_TOPOLOGY.md +89 -0
  97. package/docs/ops/P0_BACKEND_PROGRESS.md +150 -0
  98. package/docs/ops/PAYMENTS_ALPHA_R5.md +105 -0
  99. package/docs/ops/PILOT_ONBOARDING_RUNBOOK.md +112 -0
  100. package/docs/ops/PRODUCTION_DEPLOYMENT_CHECKLIST.md +140 -0
  101. package/docs/ops/R1_SLOS.md +66 -0
  102. package/docs/ops/RELEASE_SIGNING_INCIDENT.md +58 -0
  103. package/docs/ops/SELF_SERVE_LAUNCH_AUTOMATION.md +89 -0
  104. package/docs/ops/THROUGHPUT_DRILL_10X.md +48 -0
  105. package/docs/ops/TRUST_CONFIG_WIZARD.md +60 -0
  106. package/docs/ops/X402_PILOT_WEEKLY_METRICS.md +76 -0
  107. package/docs/ops/tool-call-disputes-holdback.md +52 -0
  108. package/docs/pilot-kit/PILOT_PACKAGE_SCORECARD_X402.md +46 -0
  109. package/docs/pilot-kit/README.md +29 -0
  110. package/docs/pilot-kit/architecture-one-pager.md +48 -0
  111. package/docs/pilot-kit/buyer-email.txt +19 -0
  112. package/docs/pilot-kit/buyer-one-pager.md +31 -0
  113. package/docs/pilot-kit/gtm-pilot-playbook.md +182 -0
  114. package/docs/pilot-kit/offline-verify.md +33 -0
  115. package/docs/pilot-kit/procurement-one-pager.md +50 -0
  116. package/docs/pilot-kit/rfp-clause.md +46 -0
  117. package/docs/pilot-kit/roi-calculator-template.csv +2 -0
  118. package/docs/pilot-kit/security-qa.md +153 -0
  119. package/docs/pilot-kit/security-summary.md +35 -0
  120. package/docs/plans/2026-02-13-mcp-spike-design.md +113 -0
  121. package/docs/plans/2026-02-20-trust-os-v1-jira-backlog.md +348 -0
  122. package/docs/plans/2026-02-21-agent-economic-actor-operating-model.md +169 -0
  123. package/docs/plans/2026-02-21-trust-os-v1-strategy.md +241 -0
  124. package/docs/research/2026-02-21-agent-spend-host-landscape.md +57 -0
  125. package/docs/spec/AcceptanceCriteria.v1.md +17 -0
  126. package/docs/spec/AcceptanceEvaluation.v1.md +10 -0
  127. package/docs/spec/AgentEvent.v1.md +47 -0
  128. package/docs/spec/AgentIdentity.v1.md +62 -0
  129. package/docs/spec/AgentPassport.v1.md +95 -0
  130. package/docs/spec/AgentReputation.v1.md +59 -0
  131. package/docs/spec/AgentReputation.v2.md +52 -0
  132. package/docs/spec/AgentRun.v1.md +47 -0
  133. package/docs/spec/AgentRunSettlement.v1.md +52 -0
  134. package/docs/spec/AgentWallet.v1.md +43 -0
  135. package/docs/spec/AgreementDelegation.v1.md +109 -0
  136. package/docs/spec/ArbitrationCase.v1.md +67 -0
  137. package/docs/spec/ArbitrationOutcomeMapping.v1.md +62 -0
  138. package/docs/spec/ArbitrationVerdict.v1.md +60 -0
  139. package/docs/spec/BundleHeadAttestation.v1.md +32 -0
  140. package/docs/spec/CANONICAL_JSON.md +31 -0
  141. package/docs/spec/CRYPTOGRAPHY.md +61 -0
  142. package/docs/spec/ClosePack.v1.md +49 -0
  143. package/docs/spec/ClosePackManifest.v1.md +24 -0
  144. package/docs/spec/DelegationGrant.v1.md +90 -0
  145. package/docs/spec/DisputeCaseLifecycle.v1.md +51 -0
  146. package/docs/spec/DisputeOpenEnvelope.v1.md +43 -0
  147. package/docs/spec/ERRORS.md +76 -0
  148. package/docs/spec/ESCROW_NETTING_INVARIANTS.md +71 -0
  149. package/docs/spec/EvidenceIndex.v1.md +20 -0
  150. package/docs/spec/ExecutionIntent.v1.md +90 -0
  151. package/docs/spec/FinancePackBundleManifest.v1.md +24 -0
  152. package/docs/spec/FundingHold.v1.md +60 -0
  153. package/docs/spec/GovernancePolicy.v1.md +34 -0
  154. package/docs/spec/GovernancePolicy.v2.md +30 -0
  155. package/docs/spec/INVARIANTS.md +389 -0
  156. package/docs/spec/InteractionDirectionMatrix.v1.md +30 -0
  157. package/docs/spec/InvoiceBundleManifest.v1.md +24 -0
  158. package/docs/spec/InvoiceClaim.v1.md +11 -0
  159. package/docs/spec/MONEY_RAIL_STATE_MACHINE.md +58 -0
  160. package/docs/spec/MarketplaceAcceptance.v2.md +46 -0
  161. package/docs/spec/MarketplaceOffer.v2.md +54 -0
  162. package/docs/spec/MeteringReport.v1.md +18 -0
  163. package/docs/spec/OperatorAction.v1.md +90 -0
  164. package/docs/spec/PRODUCER_ERRORS.md +42 -0
  165. package/docs/spec/PolicyDecision.v1.md +83 -0
  166. package/docs/spec/PricingMatrix.v1.md +20 -0
  167. package/docs/spec/PricingMatrixSignatures.v1.md +30 -0
  168. package/docs/spec/PricingMatrixSignatures.v2.md +29 -0
  169. package/docs/spec/ProduceCliOutput.v1.md +46 -0
  170. package/docs/spec/ProofBundleManifest.v1.md +24 -0
  171. package/docs/spec/README.md +109 -0
  172. package/docs/spec/REFERENCE_IMPLEMENTATIONS.md +29 -0
  173. package/docs/spec/REFERENCE_VERIFIER_BEHAVIOR.md +68 -0
  174. package/docs/spec/REMOTE_SIGNER.md +66 -0
  175. package/docs/spec/ReleaseIndex.v1.md +32 -0
  176. package/docs/spec/ReleaseIndexSignatures.v1.md +17 -0
  177. package/docs/spec/ReleaseTrust.v1.md +13 -0
  178. package/docs/spec/ReleaseTrust.v2.md +26 -0
  179. package/docs/spec/RemoteSignerRequest.v1.md +21 -0
  180. package/docs/spec/RemoteSignerResponse.v1.md +16 -0
  181. package/docs/spec/ReputationEvent.v1.md +63 -0
  182. package/docs/spec/RevocationList.v1.md +28 -0
  183. package/docs/spec/SIGNER_PROVIDER_PLUGIN.md +32 -0
  184. package/docs/spec/STRICTNESS.md +68 -0
  185. package/docs/spec/SUPPLY_CHAIN.md +33 -0
  186. package/docs/spec/SettlementAdjustment.v1.md +45 -0
  187. package/docs/spec/SettlementDecisionRecord.v1.md +48 -0
  188. package/docs/spec/SettlementDecisionRecord.v2.md +53 -0
  189. package/docs/spec/SettlementDecisionReport.v1.md +44 -0
  190. package/docs/spec/SettlementKernel.v1.md +59 -0
  191. package/docs/spec/SettlementReceipt.v1.md +63 -0
  192. package/docs/spec/SlaDefinition.v1.md +24 -0
  193. package/docs/spec/SlaEvaluation.v1.md +12 -0
  194. package/docs/spec/THREAT_MODEL.md +113 -0
  195. package/docs/spec/TOOL_PROVENANCE.md +30 -0
  196. package/docs/spec/TRUST_ANCHORS.md +84 -0
  197. package/docs/spec/TenantSettings.v1.md +90 -0
  198. package/docs/spec/TenantSettings.v2.md +99 -0
  199. package/docs/spec/TimestampProof.v1.md +25 -0
  200. package/docs/spec/ToolCallAgreement.v1.md +34 -0
  201. package/docs/spec/ToolCallEvidence.v1.md +47 -0
  202. package/docs/spec/ToolManifest.v1.md +47 -0
  203. package/docs/spec/VERIFIER_ENVIRONMENT.md +38 -0
  204. package/docs/spec/VERSIONING.md +107 -0
  205. package/docs/spec/VerificationReport.v1.md +50 -0
  206. package/docs/spec/VerifyAboutOutput.v1.md +10 -0
  207. package/docs/spec/VerifyCliOutput.v1.md +28 -0
  208. package/docs/spec/WARNINGS.md +83 -0
  209. package/docs/spec/error-codes.v1.txt +285 -0
  210. package/docs/spec/examples/agreement_delegation_v1.example.json +21 -0
  211. package/docs/spec/examples/arbitration_case_v1.example.json +26 -0
  212. package/docs/spec/examples/arbitration_verdict_v1.example.json +32 -0
  213. package/docs/spec/examples/dispute_open_envelope_v1.example.json +18 -0
  214. package/docs/spec/examples/produce_cli_output_v1.example.json +32 -0
  215. package/docs/spec/examples/release_index_signature_v1.example.json +9 -0
  216. package/docs/spec/examples/release_index_signatures_v1.example.json +14 -0
  217. package/docs/spec/examples/release_index_v1.example.json +15 -0
  218. package/docs/spec/examples/release_trust_v1.example.json +7 -0
  219. package/docs/spec/examples/release_trust_v2.example.json +22 -0
  220. package/docs/spec/examples/remote_signer_request_v1.example.json +18 -0
  221. package/docs/spec/examples/remote_signer_response_v1.example.json +8 -0
  222. package/docs/spec/examples/reputation_event_v1.example.json +29 -0
  223. package/docs/spec/examples/verification_report_v1.example.json +24 -0
  224. package/docs/spec/examples/verify_about_output_v1.example.json +29 -0
  225. package/docs/spec/examples/verify_cli_output_v1.example.json +13 -0
  226. package/docs/spec/legacy/MarketplaceAcceptance.v1.md +48 -0
  227. package/docs/spec/legacy/MarketplaceOffer.v1.md +56 -0
  228. package/docs/spec/legacy/schemas/MarketplaceAcceptance.v1.schema.json +53 -0
  229. package/docs/spec/legacy/schemas/MarketplaceOffer.v1.schema.json +61 -0
  230. package/docs/spec/producer-error-codes.v1.txt +14 -0
  231. package/docs/spec/schemas/AcceptanceCriteria.v1.schema.json +24 -0
  232. package/docs/spec/schemas/AcceptanceEvaluation.v1.schema.json +26 -0
  233. package/docs/spec/schemas/AgentEvent.v1.schema.json +49 -0
  234. package/docs/spec/schemas/AgentIdentity.v1.schema.json +129 -0
  235. package/docs/spec/schemas/AgentPassport.v1.schema.json +112 -0
  236. package/docs/spec/schemas/AgentReputation.v1.schema.json +151 -0
  237. package/docs/spec/schemas/AgentReputation.v2.schema.json +120 -0
  238. package/docs/spec/schemas/AgentRun.v1.schema.json +71 -0
  239. package/docs/spec/schemas/AgentRunSettlement.v1.schema.json +75 -0
  240. package/docs/spec/schemas/AgentWallet.v1.schema.json +54 -0
  241. package/docs/spec/schemas/AgreementDelegation.v1.schema.json +50 -0
  242. package/docs/spec/schemas/ArbitrationCase.v1.schema.json +133 -0
  243. package/docs/spec/schemas/ArbitrationVerdict.v1.schema.json +149 -0
  244. package/docs/spec/schemas/BundleHeadAttestation.v1.schema.json +21 -0
  245. package/docs/spec/schemas/ClosePackManifest.v1.schema.json +38 -0
  246. package/docs/spec/schemas/DelegationGrant.v1.schema.json +102 -0
  247. package/docs/spec/schemas/DisputeOpenEnvelope.v1.schema.json +78 -0
  248. package/docs/spec/schemas/EvidenceIndex.v1.schema.json +41 -0
  249. package/docs/spec/schemas/ExecutionIntent.v1.schema.json +85 -0
  250. package/docs/spec/schemas/FinancePackBundleManifest.v1.schema.json +38 -0
  251. package/docs/spec/schemas/FundingHold.v1.schema.json +46 -0
  252. package/docs/spec/schemas/GovernancePolicy.v1.schema.json +45 -0
  253. package/docs/spec/schemas/GovernancePolicy.v2.schema.json +70 -0
  254. package/docs/spec/schemas/InteractionDirectionMatrix.v1.schema.json +43 -0
  255. package/docs/spec/schemas/InvoiceBundleManifest.v1.schema.json +38 -0
  256. package/docs/spec/schemas/InvoiceClaim.v1.schema.json +39 -0
  257. package/docs/spec/schemas/MarketplaceAcceptance.v2.schema.json +53 -0
  258. package/docs/spec/schemas/MarketplaceOffer.v2.schema.json +61 -0
  259. package/docs/spec/schemas/MeteringReport.v1.schema.json +45 -0
  260. package/docs/spec/schemas/OperatorAction.v1.schema.json +113 -0
  261. package/docs/spec/schemas/PolicyDecision.v1.schema.json +74 -0
  262. package/docs/spec/schemas/PricingMatrix.v1.schema.json +24 -0
  263. package/docs/spec/schemas/PricingMatrixSignatures.v1.schema.json +24 -0
  264. package/docs/spec/schemas/PricingMatrixSignatures.v2.schema.json +24 -0
  265. package/docs/spec/schemas/ProduceCliOutput.v1.schema.json +107 -0
  266. package/docs/spec/schemas/ProofBundleManifest.v1.schema.json +37 -0
  267. package/docs/spec/schemas/PublicKeys.v1.schema.json +33 -0
  268. package/docs/spec/schemas/ReleaseIndex.v1.schema.json +45 -0
  269. package/docs/spec/schemas/ReleaseIndexSignature.v1.schema.json +16 -0
  270. package/docs/spec/schemas/ReleaseIndexSignatures.v1.schema.json +16 -0
  271. package/docs/spec/schemas/ReleaseTrust.v1.schema.json +15 -0
  272. package/docs/spec/schemas/ReleaseTrust.v2.schema.json +37 -0
  273. package/docs/spec/schemas/RemoteSignerPublicKeyResponse.v1.schema.json +14 -0
  274. package/docs/spec/schemas/RemoteSignerRequest.v1.schema.json +24 -0
  275. package/docs/spec/schemas/RemoteSignerResponse.v1.schema.json +10 -0
  276. package/docs/spec/schemas/RemoteSignerSignRequest.v1.schema.json +27 -0
  277. package/docs/spec/schemas/RemoteSignerSignResponse.v1.schema.json +16 -0
  278. package/docs/spec/schemas/ReputationEvent.v1.schema.json +164 -0
  279. package/docs/spec/schemas/RevocationList.v1.schema.json +51 -0
  280. package/docs/spec/schemas/SettlementAdjustment.v1.schema.json +44 -0
  281. package/docs/spec/schemas/SettlementDecisionRecord.v1.schema.json +66 -0
  282. package/docs/spec/schemas/SettlementDecisionRecord.v2.schema.json +149 -0
  283. package/docs/spec/schemas/SettlementDecisionReport.v1.schema.json +61 -0
  284. package/docs/spec/schemas/SettlementReceipt.v1.schema.json +135 -0
  285. package/docs/spec/schemas/SlaDefinition.v1.schema.json +33 -0
  286. package/docs/spec/schemas/SlaEvaluation.v1.schema.json +26 -0
  287. package/docs/spec/schemas/TenantSettings.v1.schema.json +90 -0
  288. package/docs/spec/schemas/TenantSettings.v2.schema.json +161 -0
  289. package/docs/spec/schemas/TimestampProof.v1.schema.json +17 -0
  290. package/docs/spec/schemas/ToolCallAgreement.v1.schema.json +34 -0
  291. package/docs/spec/schemas/ToolCallEvidence.v1.schema.json +45 -0
  292. package/docs/spec/schemas/ToolManifest.v1.schema.json +54 -0
  293. package/docs/spec/schemas/VerificationReport.v1.schema.json +83 -0
  294. package/docs/spec/schemas/VerifyAboutOutput.v1.schema.json +54 -0
  295. package/docs/spec/schemas/VerifyCliOutput.v1.schema.json +75 -0
  296. package/docs/spec/schemas/VerifyReleaseOutput.v1.schema.json +47 -0
  297. package/docs/spec/x402-error-codes.v1.txt +35 -0
  298. package/docs/templates/buyer-email.txt +18 -0
  299. package/docs/templates/buyer-one-pager.md +24 -0
  300. package/package.json +53 -6
  301. package/scripts/acceptance/full-stack.mjs +734 -0
  302. package/scripts/acceptance/full-stack.sh +99 -0
  303. package/scripts/audit/build-audit-packet.mjs +242 -0
  304. package/scripts/backup-pg.sh +45 -0
  305. package/scripts/backup-restore/README.md +18 -0
  306. package/scripts/backup-restore/capture-state.mjs +130 -0
  307. package/scripts/backup-restore/client.mjs +97 -0
  308. package/scripts/backup-restore/seed-workload.mjs +235 -0
  309. package/scripts/backup-restore/verify-state.mjs +139 -0
  310. package/scripts/backup-restore-test.sh +217 -0
  311. package/scripts/chaos.js +221 -0
  312. package/scripts/ci/build-launch-cutover-packet.mjs +304 -0
  313. package/scripts/ci/build-self-serve-benchmark-report.mjs +122 -0
  314. package/scripts/ci/changelog-guard.mjs +145 -0
  315. package/scripts/ci/check-kernel-v0-launch-gate.mjs +233 -0
  316. package/scripts/ci/check-secret-hygiene.mjs +78 -0
  317. package/scripts/ci/check-version-consistency.mjs +42 -0
  318. package/scripts/ci/cli-pack-smoke.mjs +160 -0
  319. package/scripts/ci/flake-budget-guard.mjs +68 -0
  320. package/scripts/ci/generate-error-codes.mjs +54 -0
  321. package/scripts/ci/lib/lighthouse-tracker.mjs +90 -0
  322. package/scripts/ci/lib/self-serve-launch-gate.mjs +89 -0
  323. package/scripts/ci/npm-pack-smoke.mjs +454 -0
  324. package/scripts/ci/run-10x-throughput-drill.mjs +318 -0
  325. package/scripts/ci/run-10x-throughput-incident-rehearsal.mjs +368 -0
  326. package/scripts/ci/run-arbitration-workspace-browser-e2e.sh +22 -0
  327. package/scripts/ci/run-circle-sandbox-smoke.mjs +237 -0
  328. package/scripts/ci/run-go-live-gate.mjs +150 -0
  329. package/scripts/ci/run-kernel-v0-ship-gate.mjs +97 -0
  330. package/scripts/ci/run-mcp-host-cert-matrix.mjs +201 -0
  331. package/scripts/ci/run-mcp-host-smoke.mjs +473 -0
  332. package/scripts/ci/run-offline-verification-parity-gate.mjs +762 -0
  333. package/scripts/ci/run-onboarding-host-success-gate.mjs +516 -0
  334. package/scripts/ci/run-onboarding-policy-slo-gate.mjs +537 -0
  335. package/scripts/ci/run-production-cutover-gate.mjs +540 -0
  336. package/scripts/ci/run-public-openclaw-npx-smoke.mjs +148 -0
  337. package/scripts/ci/run-release-promotion-guard.mjs +756 -0
  338. package/scripts/ci/run-self-serve-launch-gate.mjs +56 -0
  339. package/scripts/ci/runtime-import-smoke.mjs +58 -0
  340. package/scripts/ci/update-lighthouse-tracker.mjs +112 -0
  341. package/scripts/closepack/lib.mjs +286 -0
  342. package/scripts/collect-debug.sh +263 -0
  343. package/scripts/demo/compositional-settlement-3hop.mjs +237 -0
  344. package/scripts/demo/delivery-robot/export-ui-fixture.mjs +188 -0
  345. package/scripts/demo/delivery-robot/generate.mjs +377 -0
  346. package/scripts/demo/kernel-agent-goes-shopping.mjs +202 -0
  347. package/scripts/demo/magic-link-first-green.mjs +118 -0
  348. package/scripts/demo/magic-link-kind-smoke.mjs +577 -0
  349. package/scripts/demo/mcp-paid-exa.mjs +1110 -0
  350. package/scripts/dev/billing-doctor.sh +145 -0
  351. package/scripts/dev/billing-smoke-prod.sh +219 -0
  352. package/scripts/dev/billing-webhook-replay.sh +161 -0
  353. package/scripts/dev/env.dev.example +29 -0
  354. package/scripts/dev/env.sh +37 -0
  355. package/scripts/dev/new-sdk-key.sh +81 -0
  356. package/scripts/dev/sdk-first-run.sh +21 -0
  357. package/scripts/dev/smoke-x402-gateway.sh +115 -0
  358. package/scripts/dev/start-api.sh +24 -0
  359. package/scripts/doctor/mcp-host.mjs +120 -0
  360. package/scripts/examples/produce-and-verify-jobproof.mjs +191 -0
  361. package/scripts/examples/sdk-first-paid-rfq.py +105 -0
  362. package/scripts/examples/sdk-first-verified-run.mjs +85 -0
  363. package/scripts/examples/sdk-first-verified-run.py +99 -0
  364. package/scripts/examples/sdk-tenant-analytics.mjs +103 -0
  365. package/scripts/examples/sdk-tenant-analytics.py +118 -0
  366. package/scripts/finance-pack/bundle.mjs +284 -0
  367. package/scripts/fixtures/generate-bundle-fixtures.mjs +877 -0
  368. package/scripts/governance/export.mjs +169 -0
  369. package/scripts/load/delivery-stress.k6.js +183 -0
  370. package/scripts/load/ingest-burst.k6.js +236 -0
  371. package/scripts/load/run-delivery-load.js +66 -0
  372. package/scripts/load/webhook-receiver.js +131 -0
  373. package/scripts/magic-link/migrate-run-records-to-db.mjs +35 -0
  374. package/scripts/mcp/probe.mjs +238 -0
  375. package/scripts/mcp/settld-mcp-http-gateway.mjs +178 -0
  376. package/scripts/mcp/settld-mcp-server.mjs +1511 -0
  377. package/scripts/openapi/write.mjs +13 -0
  378. package/scripts/ops/bootstrap-tenant-conformance.mjs +185 -0
  379. package/scripts/ops/build-x402-pilot-reliability-report.mjs +489 -0
  380. package/scripts/ops/check-x402-receipt-sample.mjs +181 -0
  381. package/scripts/ops/design-partner-run-packet.mjs +466 -0
  382. package/scripts/ops/dispute-finance-reconciliation-packet.mjs +313 -0
  383. package/scripts/ops/hosted-baseline-evidence.mjs +890 -0
  384. package/scripts/ops/money-rails-chargeback-evidence.mjs +509 -0
  385. package/scripts/ops/money-rails-reconcile-evidence.mjs +180 -0
  386. package/scripts/ops/p0-seed-money-rail-operation.mjs +432 -0
  387. package/scripts/ops/run-x402-hitl-smoke.mjs +607 -0
  388. package/scripts/pilot/finance-pack.mjs +495 -0
  389. package/scripts/pilot/fixtures/robot-keypair.json +4 -0
  390. package/scripts/pilot/fixtures/server-signer.json +4 -0
  391. package/scripts/policy/cli.mjs +600 -0
  392. package/scripts/profile/cli.mjs +1324 -0
  393. package/scripts/proof-bundle/job.mjs +109 -0
  394. package/scripts/proof-bundle/lib.mjs +92 -0
  395. package/scripts/proof-bundle/month.mjs +103 -0
  396. package/scripts/provider/conformance-run.mjs +159 -0
  397. package/scripts/provider/keys-generate.mjs +135 -0
  398. package/scripts/provider/publish.mjs +420 -0
  399. package/scripts/quickstart/x402.mjs +334 -0
  400. package/scripts/register-entity-secret.mjs +102 -0
  401. package/scripts/release/build-artifacts.mjs +181 -0
  402. package/scripts/release/generate-release-index.mjs +112 -0
  403. package/scripts/release/release-index-lib.mjs +232 -0
  404. package/scripts/release/sign-release-index.mjs +85 -0
  405. package/scripts/release/validate-release-assets.mjs +170 -0
  406. package/scripts/release/verify-release.mjs +261 -0
  407. package/scripts/restore-pg.sh +34 -0
  408. package/scripts/scaffold/create-settld-paid-tool.mjs +19 -0
  409. package/scripts/sdk/smoke-python.py +30 -0
  410. package/scripts/sdk/smoke.mjs +16 -0
  411. package/scripts/settlement/x402-batch-worker.mjs +1091 -0
  412. package/scripts/setup/circle-bootstrap.mjs +310 -0
  413. package/scripts/setup/host-config.mjs +617 -0
  414. package/scripts/setup/onboard.mjs +1337 -0
  415. package/scripts/setup/openclaw-onboard.mjs +423 -0
  416. package/scripts/setup/wizard.mjs +986 -0
  417. package/scripts/slo/check.mjs +239 -0
  418. package/scripts/smoke/k8s-smoke.mjs +214 -0
  419. package/scripts/spec/generate-protocol-vectors.mjs +1019 -0
  420. package/scripts/test/check-no-generated-artifacts.sh +12 -0
  421. package/scripts/test/run.sh +59 -0
  422. package/scripts/trust/validate-trust-file.mjs +57 -0
  423. package/scripts/trust-config/rotate-settld-pay.mjs +277 -0
  424. package/scripts/trust-config/wizard.mjs +161 -0
  425. package/scripts/vendor-contract-test-lib.mjs +182 -0
  426. package/scripts/vendor-contract-test.mjs +55 -0
  427. package/scripts/vercel/build-mkdocs.sh +9 -0
  428. package/scripts/vercel/ignore-mkdocs.sh +25 -0
  429. package/scripts/vercel/install-mkdocs.sh +6 -0
  430. package/scripts/verify-pg.js +217 -0
  431. package/scripts/x402/receipt-verify.mjs +289 -0
  432. package/services/finance-sink/src/dedupe-store.js +29 -6
  433. package/services/receiver/src/dedupe-store.js +29 -5
  434. package/services/x402-gateway/Dockerfile +13 -0
  435. package/services/x402-gateway/README.md +58 -0
  436. package/services/x402-gateway/examples/upstream-mock.js +337 -0
  437. package/services/x402-gateway/src/server.js +1058 -0
  438. package/src/api/app.js +34658 -16940
  439. package/src/api/maintenance.js +70 -0
  440. package/src/api/middleware/trust-kernel.js +114 -0
  441. package/src/api/openapi.js +1778 -70
  442. package/src/api/persistence.js +456 -0
  443. package/src/api/server.js +81 -5
  444. package/src/api/store.js +1581 -62
  445. package/src/api/workers/deliveries.js +99 -4
  446. package/src/api/workers/insolvency-sweep.js +159 -0
  447. package/src/core/agent-card.js +69 -0
  448. package/src/core/agent-wallets.js +231 -0
  449. package/src/core/agreement-delegation.js +549 -0
  450. package/src/core/billing-plans.js +40 -6
  451. package/src/core/circle-reserve-adapter.js +845 -0
  452. package/src/core/event-policy.js +21 -2
  453. package/src/core/maintenance-locks.js +1 -0
  454. package/src/core/operator-action.js +303 -0
  455. package/src/core/paid-tool-manifest.js +318 -0
  456. package/src/core/policy-decision.js +322 -0
  457. package/src/core/policy-packs.js +207 -0
  458. package/src/core/profile-fingerprint.js +27 -0
  459. package/src/core/profile-simulation-reasons.js +84 -0
  460. package/src/core/profile-templates.js +242 -0
  461. package/src/core/provider-publish-conformance.js +525 -0
  462. package/src/core/provider-publish-proof.js +396 -0
  463. package/src/core/provider-quote-signature.js +170 -0
  464. package/src/core/settld-keys.js +112 -0
  465. package/src/core/settld-pay-token.js +344 -0
  466. package/src/core/settlement-kernel.js +239 -2
  467. package/src/core/settlement-verifier.js +335 -0
  468. package/src/core/tool-call-agreement.js +112 -0
  469. package/src/core/tool-call-evidence.js +144 -0
  470. package/src/core/tool-provider-signature.js +98 -0
  471. package/src/core/wallet-assignment-resolver.js +129 -0
  472. package/src/core/wallet-provider-bootstrap.js +365 -0
  473. package/src/core/x402-escalation-override.js +258 -0
  474. package/src/core/x402-gate.js +118 -0
  475. package/src/core/x402-provider-refund-decision.js +220 -0
  476. package/src/core/x402-receipt-verifier.js +708 -0
  477. package/src/core/x402-reversal-command.js +251 -0
  478. package/src/core/x402-wallet-issuer-decision.js +252 -0
  479. package/src/core/zk-verifier.js +300 -0
  480. package/src/db/migrations/029_reputation_event_index.sql +54 -0
  481. package/src/db/migrations/030_artifacts_source_event_unique_job_only.sql +15 -0
  482. package/src/db/pg.js +18 -7
  483. package/src/db/store-pg.js +1508 -111
@@ -0,0 +1,56 @@
1
+ #!/usr/bin/env node
2
+ import { mkdir, writeFile } from "node:fs/promises";
3
+ import { dirname, resolve } from "node:path";
4
+ import { loadSelfServeLaunchTrackerFromPath } from "./lib/self-serve-launch-gate.mjs";
5
+
6
+ async function main() {
7
+ const trackerPath = resolve(
8
+ process.cwd(),
9
+ process.env.SELF_SERVE_LAUNCH_TRACKER_PATH || "planning/launch/self-serve-launch-tracker.json"
10
+ );
11
+ const reportPath = resolve(
12
+ process.cwd(),
13
+ process.env.SELF_SERVE_LAUNCH_GATE_REPORT_PATH || "artifacts/gates/self-serve-launch-gate.json"
14
+ );
15
+ await mkdir(dirname(reportPath), { recursive: true });
16
+
17
+ let evaluation = null;
18
+ let trackerOk = false;
19
+ try {
20
+ evaluation = await loadSelfServeLaunchTrackerFromPath(trackerPath);
21
+ trackerOk = evaluation.ok === true;
22
+ } catch (err) {
23
+ evaluation = {
24
+ ok: false,
25
+ error: err?.message ?? "unable to load self-serve launch tracker"
26
+ };
27
+ trackerOk = false;
28
+ }
29
+
30
+ const report = {
31
+ schemaVersion: "SelfServeLaunchGateReport.v1",
32
+ generatedAt: new Date().toISOString(),
33
+ checks: [
34
+ {
35
+ id: "self_serve_kpi_thresholds",
36
+ ok: trackerOk,
37
+ trackerPath,
38
+ summary: evaluation
39
+ }
40
+ ],
41
+ verdict: {
42
+ ok: trackerOk,
43
+ requiredChecks: 1,
44
+ passedChecks: trackerOk ? 1 : 0
45
+ }
46
+ };
47
+
48
+ await writeFile(reportPath, JSON.stringify(report, null, 2) + "\n", "utf8");
49
+ process.stdout.write(`wrote self-serve launch gate report: ${reportPath}\n`);
50
+ if (!trackerOk) process.exitCode = 1;
51
+ }
52
+
53
+ main().catch((err) => {
54
+ process.stderr.write(`${err?.stack || err?.message || String(err)}\n`);
55
+ process.exit(1);
56
+ });
@@ -0,0 +1,58 @@
1
+ #!/usr/bin/env node
2
+ import fs from "node:fs";
3
+ import path from "node:path";
4
+ import { pathToFileURL } from "node:url";
5
+
6
+ const REQUIRED_MODULES = Object.freeze([
7
+ "src/api/app.js",
8
+ "src/core/settlement-kernel.js",
9
+ "src/core/settlement-verifier.js",
10
+ "src/db/store-pg.js"
11
+ ]);
12
+
13
+ function toAbsolute(modulePath) {
14
+ return path.resolve(process.cwd(), modulePath);
15
+ }
16
+
17
+ function assertFileReadable(modulePath) {
18
+ const absolute = toAbsolute(modulePath);
19
+ try {
20
+ fs.accessSync(absolute, fs.constants.R_OK);
21
+ } catch (err) {
22
+ const wrapped = new Error(`missing or unreadable module: ${modulePath}`);
23
+ wrapped.cause = err;
24
+ throw wrapped;
25
+ }
26
+ return absolute;
27
+ }
28
+
29
+ async function importModule(absolutePath) {
30
+ const moduleUrl = pathToFileURL(absolutePath).toString();
31
+ await import(moduleUrl);
32
+ }
33
+
34
+ async function main() {
35
+ const imported = [];
36
+ for (const modulePath of REQUIRED_MODULES) {
37
+ const absolutePath = assertFileReadable(modulePath);
38
+ await importModule(absolutePath);
39
+ imported.push(modulePath);
40
+ }
41
+ process.stdout.write(
42
+ JSON.stringify(
43
+ {
44
+ ok: true,
45
+ checkedAt: new Date().toISOString(),
46
+ imported
47
+ },
48
+ null,
49
+ 2
50
+ ) + "\n"
51
+ );
52
+ }
53
+
54
+ main().catch((err) => {
55
+ const message = err?.stack ?? err?.message ?? String(err);
56
+ process.stderr.write(`${message}\n`);
57
+ process.exit(1);
58
+ });
@@ -0,0 +1,112 @@
1
+ #!/usr/bin/env node
2
+ import { readFile, writeFile } from "node:fs/promises";
3
+ import { resolve } from "node:path";
4
+ import { evaluateLighthouseTracker } from "./lib/lighthouse-tracker.mjs";
5
+
6
+ const ALLOWED_STATUSES = new Set([
7
+ "targeting",
8
+ "contracting",
9
+ "integration_in_progress",
10
+ "go_live_scheduled",
11
+ "paid_production_settlement_confirmed",
12
+ "production_active"
13
+ ]);
14
+
15
+ function parseArgs(argv) {
16
+ const flags = {};
17
+ for (let index = 0; index < argv.length; index += 1) {
18
+ const token = argv[index];
19
+ if (!token.startsWith("--")) continue;
20
+ const key = token.slice(2);
21
+ const next = argv[index + 1];
22
+ if (next && !next.startsWith("--")) {
23
+ flags[key] = next;
24
+ index += 1;
25
+ continue;
26
+ }
27
+ flags[key] = "true";
28
+ }
29
+ return flags;
30
+ }
31
+
32
+ function normalizeNonEmptyString(value) {
33
+ return typeof value === "string" && value.trim() !== "" ? value.trim() : null;
34
+ }
35
+
36
+ function normalizeNullableString(value) {
37
+ if (value === undefined) return undefined;
38
+ if (value === null) return null;
39
+ const text = String(value).trim();
40
+ if (text === "" || text.toLowerCase() === "null") return null;
41
+ return text;
42
+ }
43
+
44
+ function assertIsoOrNull(name, value) {
45
+ if (value === undefined || value === null) return;
46
+ if (!Number.isFinite(Date.parse(value))) {
47
+ throw new Error(`${name} must be a valid ISO timestamp`);
48
+ }
49
+ }
50
+
51
+ async function main() {
52
+ const flags = parseArgs(process.argv.slice(2));
53
+ const trackerPath = resolve(process.cwd(), flags.path || "planning/launch/lighthouse-production-tracker.json");
54
+ const accountId = normalizeNonEmptyString(flags.account);
55
+ const status = normalizeNullableString(flags.status);
56
+ if (!accountId) throw new Error("--account is required");
57
+ if (!status || !ALLOWED_STATUSES.has(status)) {
58
+ throw new Error(`--status is required and must be one of: ${Array.from(ALLOWED_STATUSES).join(", ")}`);
59
+ }
60
+
61
+ const raw = await readFile(trackerPath, "utf8");
62
+ const tracker = JSON.parse(raw);
63
+ if (!Array.isArray(tracker?.accounts)) throw new Error("tracker.accounts must be an array");
64
+ const row = tracker.accounts.find((item) => String(item?.accountId ?? "") === accountId);
65
+ if (!row) throw new Error(`account not found: ${accountId}`);
66
+
67
+ row.status = status;
68
+
69
+ const companyName = normalizeNullableString(flags["company-name"]);
70
+ const owner = normalizeNullableString(flags.owner);
71
+ const signedAt = normalizeNullableString(flags["signed-at"]);
72
+ const goLiveAt = normalizeNullableString(flags["go-live-at"]);
73
+ const settlementRef = normalizeNullableString(flags["settlement-ref"]);
74
+ const notes = normalizeNullableString(flags.notes);
75
+
76
+ assertIsoOrNull("signed-at", signedAt);
77
+ assertIsoOrNull("go-live-at", goLiveAt);
78
+
79
+ if (companyName !== undefined) row.companyName = companyName ?? "";
80
+ if (owner !== undefined) row.owner = owner ?? "";
81
+ if (signedAt !== undefined) row.signedAt = signedAt;
82
+ if (goLiveAt !== undefined) row.goLiveAt = goLiveAt;
83
+ if (settlementRef !== undefined) row.productionSettlementRef = settlementRef;
84
+ if (notes !== undefined) row.notes = notes ?? "";
85
+
86
+ tracker.updatedAt = new Date().toISOString();
87
+ const evaluation = evaluateLighthouseTracker(tracker);
88
+
89
+ await writeFile(trackerPath, JSON.stringify(tracker, null, 2) + "\n", "utf8");
90
+ process.stdout.write(
91
+ JSON.stringify(
92
+ {
93
+ ok: true,
94
+ trackerPath,
95
+ accountId,
96
+ status,
97
+ trackerSummary: {
98
+ readyAccounts: evaluation.activeAccounts,
99
+ requiredActiveAccounts: evaluation.requiredActiveAccounts,
100
+ trackerOk: evaluation.ok
101
+ }
102
+ },
103
+ null,
104
+ 2
105
+ ) + "\n"
106
+ );
107
+ }
108
+
109
+ main().catch((err) => {
110
+ process.stderr.write(`${err?.stack || err?.message || String(err)}\n`);
111
+ process.exit(1);
112
+ });
@@ -15,6 +15,7 @@ import {
15
15
  SETTLEMENT_ADJUSTMENT_KIND,
16
16
  validateSettlementAdjustmentV1
17
17
  } from "../../src/core/settlement-adjustment.js";
18
+ import { verifyX402ExecutionProofV1 } from "../../src/core/zk-verifier.js";
18
19
  import { unzipToTempSafe } from "../../packages/artifact-verify/src/safe-unzip.js";
19
20
 
20
21
  const CLOSEPACK_SCHEMA_VERSION = "KernelToolCallClosePack.v0";
@@ -210,6 +211,25 @@ function appendFile(files, filepath, jsonObject) {
210
211
  files.set(filepath, encodeJson(normalizeForCanonicalJson(jsonObject, { path: "$" })));
211
212
  }
212
213
 
214
+ function isPlainObject(value) {
215
+ return Boolean(value) && typeof value === "object" && !Array.isArray(value);
216
+ }
217
+
218
+ function extractX402ReceiptZkEvidence(receipt) {
219
+ if (!isPlainObject(receipt)) return null;
220
+ if (isPlainObject(receipt.zkProof)) return receipt.zkProof;
221
+ if (isPlainObject(receipt.bindings?.zkProof)) return receipt.bindings.zkProof;
222
+ return null;
223
+ }
224
+
225
+ function canonicalJsonEquals(left, right) {
226
+ if (!isPlainObject(left) || !isPlainObject(right)) return false;
227
+ return (
228
+ canonicalJsonStringify(normalizeForCanonicalJson(left, { path: "$" })) ===
229
+ canonicalJsonStringify(normalizeForCanonicalJson(right, { path: "$" }))
230
+ );
231
+ }
232
+
213
233
  function extractArtifactHash(artifact) {
214
234
  return typeof artifact?.artifactHash === "string" && artifact.artifactHash.trim() !== "" ? artifact.artifactHash.trim().toLowerCase() : null;
215
235
  }
@@ -279,6 +299,40 @@ export async function exportToolCallClosepack({
279
299
  method: "GET",
280
300
  pathname: `/ops/tool-calls/replay-evaluate?agreementHash=${encodeURIComponent(normalizedAgreementHash)}`
281
301
  });
302
+ let x402Receipt = null;
303
+ try {
304
+ const receiptList = await requestJson({
305
+ ...requestContext,
306
+ method: "GET",
307
+ pathname: `/x402/receipts?agreementId=${encodeURIComponent(normalizedAgreementHash)}&limit=1`
308
+ });
309
+ const receipts = Array.isArray(receiptList?.receipts) ? receiptList.receipts : [];
310
+ x402Receipt = receipts[0] ?? null;
311
+ } catch (err) {
312
+ addIssue(issues, {
313
+ code: "CLOSEPACK_X402_RECEIPT_FETCH_FAILED",
314
+ severity: "warning",
315
+ message: "failed to fetch x402 receipt for agreementHash",
316
+ details: { message: err?.message ?? String(err ?? "") }
317
+ });
318
+ x402Receipt = null;
319
+ }
320
+ const x402ZkEvidence = extractX402ReceiptZkEvidence(x402Receipt);
321
+ const x402ZkProtocol =
322
+ typeof x402ZkEvidence?.protocol === "string" && x402ZkEvidence.protocol.trim() !== ""
323
+ ? x402ZkEvidence.protocol.trim().toLowerCase()
324
+ : null;
325
+ const x402ZkPublicSignals = Array.isArray(x402ZkEvidence?.publicSignals) ? x402ZkEvidence.publicSignals : [];
326
+ const x402ZkProofData =
327
+ x402ZkEvidence?.proofData && typeof x402ZkEvidence.proofData === "object" && !Array.isArray(x402ZkEvidence.proofData)
328
+ ? x402ZkEvidence.proofData
329
+ : null;
330
+ const x402ZkVerificationKey =
331
+ x402ZkEvidence?.verificationKey &&
332
+ typeof x402ZkEvidence.verificationKey === "object" &&
333
+ !Array.isArray(x402ZkEvidence.verificationKey)
334
+ ? x402ZkEvidence.verificationKey
335
+ : null;
282
336
 
283
337
  const adjustmentId = deterministicAdjustmentId(normalizedAgreementHash);
284
338
  const adjustmentResponse = await requestJson({
@@ -432,11 +486,20 @@ export async function exportToolCallClosepack({
432
486
  agreementHash: normalizedAgreementHash,
433
487
  receiptHash: String(hold?.receiptHash ?? ""),
434
488
  holdHash: String(hold?.holdHash ?? ""),
489
+ x402ReceiptId:
490
+ typeof x402Receipt?.receiptId === "string" && x402Receipt.receiptId.trim() !== "" ? x402Receipt.receiptId.trim() : null,
435
491
  caseId: arbitrationCase?.caseId ?? null,
436
492
  adjustmentId
437
493
  },
438
494
  files: {
439
495
  hold: "state/funding_hold.json",
496
+ x402Receipt: x402Receipt ? "state/x402_receipt.json" : null,
497
+ x402ZkProof:
498
+ x402ZkProofData && typeof x402ZkProofData === "object" && x402ZkProtocol ? "evidence/zk/proof.json" : null,
499
+ x402ZkPublicSignals:
500
+ Array.isArray(x402ZkPublicSignals) && x402ZkPublicSignals.length > 0 && x402ZkProtocol ? "evidence/zk/public.json" : null,
501
+ x402ZkVerificationKey:
502
+ x402ZkVerificationKey && typeof x402ZkVerificationKey === "object" && x402ZkProtocol ? "evidence/zk/verification_key.json" : null,
440
503
  arbitrationCase: arbitrationCase ? "state/arbitration_case.json" : null,
441
504
  settlementAdjustment: settlementAdjustment ? "state/settlement_adjustment.json" : null,
442
505
  reputationEvents: reputationEvents.length > 0 ? "state/reputation_events.json" : null,
@@ -465,6 +528,30 @@ export async function exportToolCallClosepack({
465
528
  const files = new Map();
466
529
  appendFile(files, "closepack.json", closepack);
467
530
  appendFile(files, "state/funding_hold.json", hold);
531
+ if (x402Receipt && typeof x402Receipt === "object" && !Array.isArray(x402Receipt)) {
532
+ appendFile(files, "state/x402_receipt.json", x402Receipt);
533
+ }
534
+ if (x402ZkProofData && typeof x402ZkProofData === "object" && !Array.isArray(x402ZkProofData) && x402ZkProtocol) {
535
+ appendFile(files, "evidence/zk/proof.json", {
536
+ schemaVersion: "X402ExecutionProofData.v1",
537
+ protocol: x402ZkProtocol,
538
+ proofData: x402ZkProofData
539
+ });
540
+ }
541
+ if (Array.isArray(x402ZkPublicSignals) && x402ZkPublicSignals.length > 0 && x402ZkProtocol) {
542
+ appendFile(files, "evidence/zk/public.json", {
543
+ schemaVersion: "X402ExecutionProofPublicSignals.v1",
544
+ protocol: x402ZkProtocol,
545
+ publicSignals: x402ZkPublicSignals
546
+ });
547
+ }
548
+ if (x402ZkVerificationKey && typeof x402ZkVerificationKey === "object" && !Array.isArray(x402ZkVerificationKey) && x402ZkProtocol) {
549
+ appendFile(files, "evidence/zk/verification_key.json", {
550
+ schemaVersion: "X402ExecutionProofVerificationKey.v1",
551
+ protocol: x402ZkProtocol,
552
+ verificationKey: x402ZkVerificationKey
553
+ });
554
+ }
468
555
  if (arbitrationCase) appendFile(files, "state/arbitration_case.json", arbitrationCase);
469
556
  if (settlementAdjustment) appendFile(files, "state/settlement_adjustment.json", settlementAdjustment);
470
557
  if (reputationEvents.length > 0) {
@@ -628,6 +715,41 @@ export async function verifyToolCallClosepackZip({ zipPath } = {}) {
628
715
  reputationEvents = [];
629
716
  reputationEnvelope = null;
630
717
  }
718
+ const x402ReceiptPath = path.join(tmpDir, "state", "x402_receipt.json");
719
+ let x402Receipt = null;
720
+ try {
721
+ x402Receipt = await readJsonFile(x402ReceiptPath);
722
+ } catch (err) {
723
+ if (String(closepack?.files?.x402Receipt ?? "").trim() !== "") {
724
+ addIssue(issues, {
725
+ code: "CLOSEPACK_X402_RECEIPT_MISSING",
726
+ message: "state/x402_receipt.json is missing or invalid",
727
+ details: { message: err?.message ?? String(err ?? "") }
728
+ });
729
+ }
730
+ x402Receipt = null;
731
+ }
732
+ const x402ZkProofPath = path.join(tmpDir, "evidence", "zk", "proof.json");
733
+ const x402ZkPublicSignalsPath = path.join(tmpDir, "evidence", "zk", "public.json");
734
+ const x402ZkVerificationKeyPath = path.join(tmpDir, "evidence", "zk", "verification_key.json");
735
+ let x402ZkProofFile = null;
736
+ let x402ZkPublicSignalsFile = null;
737
+ let x402ZkVerificationKeyFile = null;
738
+ try {
739
+ x402ZkProofFile = await readJsonFile(x402ZkProofPath);
740
+ } catch {
741
+ x402ZkProofFile = null;
742
+ }
743
+ try {
744
+ x402ZkPublicSignalsFile = await readJsonFile(x402ZkPublicSignalsPath);
745
+ } catch {
746
+ x402ZkPublicSignalsFile = null;
747
+ }
748
+ try {
749
+ x402ZkVerificationKeyFile = await readJsonFile(x402ZkVerificationKeyPath);
750
+ } catch {
751
+ x402ZkVerificationKeyFile = null;
752
+ }
631
753
 
632
754
  if (hold && agreementHash && String(hold.agreementHash ?? "").toLowerCase() !== agreementHash) {
633
755
  addIssue(issues, {
@@ -1038,6 +1160,167 @@ export async function verifyToolCallClosepackZip({ zipPath } = {}) {
1038
1160
  });
1039
1161
  }
1040
1162
 
1163
+ let x402ZkVerification = null;
1164
+ if (x402Receipt && isPlainObject(x402Receipt)) {
1165
+ const receiptZkEvidence = extractX402ReceiptZkEvidence(x402Receipt);
1166
+ if (receiptZkEvidence && isPlainObject(receiptZkEvidence)) {
1167
+ const required = receiptZkEvidence.required === true;
1168
+ const protocolFromReceipt =
1169
+ typeof receiptZkEvidence.protocol === "string" && receiptZkEvidence.protocol.trim() !== ""
1170
+ ? receiptZkEvidence.protocol.trim().toLowerCase()
1171
+ : null;
1172
+ const proofDataFromReceipt =
1173
+ receiptZkEvidence.proofData && typeof receiptZkEvidence.proofData === "object" && !Array.isArray(receiptZkEvidence.proofData)
1174
+ ? receiptZkEvidence.proofData
1175
+ : null;
1176
+ const publicSignalsFromReceipt = Array.isArray(receiptZkEvidence.publicSignals) ? receiptZkEvidence.publicSignals : null;
1177
+ const verificationKeyFromReceipt =
1178
+ receiptZkEvidence.verificationKey &&
1179
+ typeof receiptZkEvidence.verificationKey === "object" &&
1180
+ !Array.isArray(receiptZkEvidence.verificationKey)
1181
+ ? receiptZkEvidence.verificationKey
1182
+ : null;
1183
+ const verificationKeyRefFromReceipt =
1184
+ typeof receiptZkEvidence.verificationKeyRef === "string" && receiptZkEvidence.verificationKeyRef.trim() !== ""
1185
+ ? receiptZkEvidence.verificationKeyRef.trim()
1186
+ : null;
1187
+
1188
+ const protocolFromFiles =
1189
+ typeof x402ZkProofFile?.protocol === "string" && x402ZkProofFile.protocol.trim() !== ""
1190
+ ? x402ZkProofFile.protocol.trim().toLowerCase()
1191
+ : typeof x402ZkPublicSignalsFile?.protocol === "string" && x402ZkPublicSignalsFile.protocol.trim() !== ""
1192
+ ? x402ZkPublicSignalsFile.protocol.trim().toLowerCase()
1193
+ : typeof x402ZkVerificationKeyFile?.protocol === "string" && x402ZkVerificationKeyFile.protocol.trim() !== ""
1194
+ ? x402ZkVerificationKeyFile.protocol.trim().toLowerCase()
1195
+ : null;
1196
+ const protocol = protocolFromReceipt ?? protocolFromFiles;
1197
+
1198
+ const proofDataFromFiles =
1199
+ x402ZkProofFile?.proofData && typeof x402ZkProofFile.proofData === "object" && !Array.isArray(x402ZkProofFile.proofData)
1200
+ ? x402ZkProofFile.proofData
1201
+ : null;
1202
+ const publicSignalsFromFiles = Array.isArray(x402ZkPublicSignalsFile?.publicSignals) ? x402ZkPublicSignalsFile.publicSignals : null;
1203
+ const verificationKeyFromFiles =
1204
+ x402ZkVerificationKeyFile?.verificationKey &&
1205
+ typeof x402ZkVerificationKeyFile.verificationKey === "object" &&
1206
+ !Array.isArray(x402ZkVerificationKeyFile.verificationKey)
1207
+ ? x402ZkVerificationKeyFile.verificationKey
1208
+ : null;
1209
+
1210
+ if (proofDataFromReceipt && proofDataFromFiles && !canonicalJsonEquals(proofDataFromReceipt, proofDataFromFiles)) {
1211
+ addIssue(issues, {
1212
+ code: "CLOSEPACK_X402_ZK_PROOF_MISMATCH",
1213
+ message: "x402 zk proof in receipt and evidence/zk/proof.json do not match"
1214
+ });
1215
+ }
1216
+ if (
1217
+ Array.isArray(publicSignalsFromReceipt) &&
1218
+ Array.isArray(publicSignalsFromFiles) &&
1219
+ canonicalJsonStringify(normalizeForCanonicalJson(publicSignalsFromReceipt, { path: "$" })) !==
1220
+ canonicalJsonStringify(normalizeForCanonicalJson(publicSignalsFromFiles, { path: "$" }))
1221
+ ) {
1222
+ addIssue(issues, {
1223
+ code: "CLOSEPACK_X402_ZK_PUBLIC_SIGNALS_MISMATCH",
1224
+ message: "x402 zk publicSignals in receipt and evidence/zk/public.json do not match"
1225
+ });
1226
+ }
1227
+ if (verificationKeyFromReceipt && verificationKeyFromFiles && !canonicalJsonEquals(verificationKeyFromReceipt, verificationKeyFromFiles)) {
1228
+ addIssue(issues, {
1229
+ code: "CLOSEPACK_X402_ZK_VERIFICATION_KEY_MISMATCH",
1230
+ message: "x402 zk verification key in receipt and evidence/zk/verification_key.json do not match"
1231
+ });
1232
+ }
1233
+
1234
+ const proofData = proofDataFromFiles ?? proofDataFromReceipt;
1235
+ const publicSignals = publicSignalsFromFiles ?? publicSignalsFromReceipt;
1236
+ const verificationKey = verificationKeyFromFiles ?? verificationKeyFromReceipt;
1237
+ const statementHashSha256 =
1238
+ typeof receiptZkEvidence.statementHashSha256 === "string" && receiptZkEvidence.statementHashSha256.trim() !== ""
1239
+ ? receiptZkEvidence.statementHashSha256.trim().toLowerCase()
1240
+ : typeof x402Receipt?.bindings?.quote?.quoteSha256 === "string" && x402Receipt.bindings.quote.quoteSha256.trim() !== ""
1241
+ ? x402Receipt.bindings.quote.quoteSha256.trim().toLowerCase()
1242
+ : null;
1243
+ const inputDigestSha256 =
1244
+ typeof receiptZkEvidence.inputDigestSha256 === "string" && receiptZkEvidence.inputDigestSha256.trim() !== ""
1245
+ ? receiptZkEvidence.inputDigestSha256.trim().toLowerCase()
1246
+ : typeof x402Receipt?.bindings?.request?.sha256 === "string" && x402Receipt.bindings.request.sha256.trim() !== ""
1247
+ ? x402Receipt.bindings.request.sha256.trim().toLowerCase()
1248
+ : null;
1249
+ const outputDigestSha256 =
1250
+ typeof receiptZkEvidence.outputDigestSha256 === "string" && receiptZkEvidence.outputDigestSha256.trim() !== ""
1251
+ ? receiptZkEvidence.outputDigestSha256.trim().toLowerCase()
1252
+ : typeof x402Receipt?.bindings?.response?.sha256 === "string" && x402Receipt.bindings.response.sha256.trim() !== ""
1253
+ ? x402Receipt.bindings.response.sha256.trim().toLowerCase()
1254
+ : null;
1255
+ const hasProofMaterial =
1256
+ typeof protocol === "string" &&
1257
+ protocol.trim() !== "" &&
1258
+ Array.isArray(publicSignals) &&
1259
+ proofData &&
1260
+ typeof proofData === "object" &&
1261
+ !Array.isArray(proofData);
1262
+
1263
+ if (!hasProofMaterial) {
1264
+ if (required) {
1265
+ addIssue(issues, {
1266
+ code: "CLOSEPACK_X402_ZK_PROOF_MISSING",
1267
+ message: "required x402 zk proof material is missing from closepack",
1268
+ details: {
1269
+ hasProtocol: Boolean(protocol),
1270
+ hasPublicSignals: Array.isArray(publicSignals),
1271
+ hasProofData: Boolean(proofData)
1272
+ }
1273
+ });
1274
+ }
1275
+ } else {
1276
+ x402ZkVerification = await verifyX402ExecutionProofV1({
1277
+ proof: {
1278
+ protocol,
1279
+ publicSignals,
1280
+ proofData,
1281
+ ...(verificationKey ? { verificationKey } : {}),
1282
+ ...(verificationKeyRefFromReceipt ? { verificationKeyRef: verificationKeyRefFromReceipt } : {}),
1283
+ ...(statementHashSha256 ? { statementHashSha256 } : {}),
1284
+ ...(inputDigestSha256 ? { inputDigestSha256 } : {}),
1285
+ ...(outputDigestSha256 ? { outputDigestSha256 } : {})
1286
+ },
1287
+ verificationKey,
1288
+ expectedVerificationKeyRef: verificationKeyRefFromReceipt,
1289
+ requiredProtocol: protocol,
1290
+ expectedBindings: {
1291
+ statementHashSha256,
1292
+ inputDigestSha256,
1293
+ outputDigestSha256
1294
+ },
1295
+ requireBindings: required
1296
+ });
1297
+ if (x402ZkVerification?.verified !== true) {
1298
+ if (required) {
1299
+ addIssue(issues, {
1300
+ code: "CLOSEPACK_X402_ZK_PROOF_INVALID",
1301
+ message: "required x402 zk proof failed offline verification",
1302
+ details: {
1303
+ status: x402ZkVerification?.status ?? null,
1304
+ code: x402ZkVerification?.code ?? null,
1305
+ message: x402ZkVerification?.message ?? null
1306
+ }
1307
+ });
1308
+ } else {
1309
+ addIssue(issues, {
1310
+ code: "CLOSEPACK_X402_ZK_PROOF_OPTIONAL_UNVERIFIED",
1311
+ severity: "warning",
1312
+ message: "optional x402 zk proof did not verify offline",
1313
+ details: {
1314
+ status: x402ZkVerification?.status ?? null,
1315
+ code: x402ZkVerification?.code ?? null
1316
+ }
1317
+ });
1318
+ }
1319
+ }
1320
+ }
1321
+ }
1322
+ }
1323
+
1041
1324
  const errorCount = issues.filter((issue) => issue.severity !== "warning").length;
1042
1325
  return {
1043
1326
  schemaVersion: VERIFY_REPORT_SCHEMA_VERSION,
@@ -1056,6 +1339,9 @@ export async function verifyToolCallClosepackZip({ zipPath } = {}) {
1056
1339
  holdHash: hold?.holdHash ?? null,
1057
1340
  caseId: arbitrationCase?.caseId ?? null,
1058
1341
  adjustmentId: settlementAdjustment?.adjustmentId ?? null,
1342
+ x402ReceiptId:
1343
+ typeof x402Receipt?.receiptId === "string" && x402Receipt.receiptId.trim() !== "" ? x402Receipt.receiptId.trim() : null,
1344
+ x402ZkVerified: x402ZkVerification?.verified === true,
1059
1345
  artifacts: artifacts.length,
1060
1346
  identities: identities.length,
1061
1347
  reputationEvents: reputationEvents.length