settld 0.1.1 → 0.1.5

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 (441) hide show
  1. package/README.md +61 -3
  2. package/SETTLD_VERSION +1 -1
  3. package/bin/settld-mcp +2 -0
  4. package/bin/settld.js +13 -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 +140 -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 +337 -0
  36. package/docs/QUICKSTART_MCP_HOSTS.md +143 -0
  37. package/docs/QUICKSTART_PRODUCE.md +61 -0
  38. package/docs/QUICKSTART_RELEASE_VERIFY.md +39 -0
  39. package/docs/QUICKSTART_SDK.md +125 -0
  40. package/docs/QUICKSTART_SDK_PYTHON.md +111 -0
  41. package/docs/QUICKSTART_VERIFY.md +54 -0
  42. package/docs/QUICKSTART_X402_GATEWAY.md +317 -0
  43. package/docs/README.md +15 -0
  44. package/docs/RELEASE_CHECKLIST.md +156 -0
  45. package/docs/RELEASING.md +81 -0
  46. package/docs/REPO_SETTINGS.md +37 -0
  47. package/docs/RUNBOOK.md +86 -0
  48. package/docs/SKILLS.md +42 -0
  49. package/docs/SKILL_BUNDLE_FORMAT.md +48 -0
  50. package/docs/SLO.md +70 -0
  51. package/docs/SUMMARY.md +16 -0
  52. package/docs/SUPPORT.md +31 -0
  53. package/docs/THREAT_MODEL.md +36 -0
  54. package/docs/TRUST.md +59 -0
  55. package/docs/WORKFLOW.md +35 -0
  56. package/docs/X402_BATCH_SETTLEMENT.md +126 -0
  57. package/docs/blog/2026-02-14-your-ai-agent-just-spent-500-where-is-the-receipt.md +73 -0
  58. package/docs/examples/x402-provider-payout-registry.example.json +14 -0
  59. package/docs/gitbook/README.md +52 -0
  60. package/docs/gitbook/SETUP.md +25 -0
  61. package/docs/gitbook/SUMMARY.md +15 -0
  62. package/docs/gitbook/api-reference.md +73 -0
  63. package/docs/gitbook/closepacks.md +55 -0
  64. package/docs/gitbook/conformance.md +59 -0
  65. package/docs/gitbook/core-primitives.md +85 -0
  66. package/docs/gitbook/dispute-lifecycle.md +33 -0
  67. package/docs/gitbook/faq.md +21 -0
  68. package/docs/gitbook/guides.md +49 -0
  69. package/docs/gitbook/operations-runbook.md +36 -0
  70. package/docs/gitbook/quickstart.md +104 -0
  71. package/docs/gitbook/replay-and-audit.md +30 -0
  72. package/docs/gitbook/sdk-reference.md +35 -0
  73. package/docs/gitbook/security-model.md +58 -0
  74. package/docs/integrations/README.md +14 -0
  75. package/docs/integrations/github-actions-verify.yml +31 -0
  76. package/docs/integrations/github-actions.md +34 -0
  77. package/docs/integrations/openclaw/CLAWHUB_PUBLISH_CHECKLIST.md +65 -0
  78. package/docs/integrations/openclaw/settld-mcp-skill/SKILL.md +69 -0
  79. package/docs/integrations/openclaw/settld-mcp-skill/mcp-server.example.json +12 -0
  80. package/docs/kernel-compatible/capabilities.json +36 -0
  81. package/docs/marketing/agent-commerce-substrate.md +78 -0
  82. package/docs/marketing/hn-repost-2026-02-17.md +102 -0
  83. package/docs/marketing/show-hn-post.md +45 -0
  84. package/docs/ops/ARTIFACT_VERIFICATION_STATUS.md +43 -0
  85. package/docs/ops/BILLING_WEBHOOK_REPLAY.md +105 -0
  86. package/docs/ops/CI_FLAKE_BUDGET.md +31 -0
  87. package/docs/ops/GO_LIVE_GATE_S13.md +27 -0
  88. package/docs/ops/HOSTED_BASELINE_R2.md +129 -0
  89. package/docs/ops/KERNEL_V0_SHIP_GATE.md +67 -0
  90. package/docs/ops/LIGHTHOUSE_PRODUCTION_CLOSE.md +51 -0
  91. package/docs/ops/MCP_COMPATIBILITY_MATRIX.md +28 -0
  92. package/docs/ops/MINIMUM_PRODUCTION_TOPOLOGY.md +89 -0
  93. package/docs/ops/P0_BACKEND_PROGRESS.md +150 -0
  94. package/docs/ops/PAYMENTS_ALPHA_R5.md +105 -0
  95. package/docs/ops/PILOT_ONBOARDING_RUNBOOK.md +112 -0
  96. package/docs/ops/PRODUCTION_DEPLOYMENT_CHECKLIST.md +103 -0
  97. package/docs/ops/R1_SLOS.md +66 -0
  98. package/docs/ops/RELEASE_SIGNING_INCIDENT.md +58 -0
  99. package/docs/ops/SELF_SERVE_LAUNCH_AUTOMATION.md +89 -0
  100. package/docs/ops/THROUGHPUT_DRILL_10X.md +48 -0
  101. package/docs/ops/TRUST_CONFIG_WIZARD.md +47 -0
  102. package/docs/ops/X402_PILOT_WEEKLY_METRICS.md +76 -0
  103. package/docs/ops/tool-call-disputes-holdback.md +52 -0
  104. package/docs/pilot-kit/PILOT_PACKAGE_SCORECARD_X402.md +46 -0
  105. package/docs/pilot-kit/README.md +29 -0
  106. package/docs/pilot-kit/architecture-one-pager.md +48 -0
  107. package/docs/pilot-kit/buyer-email.txt +19 -0
  108. package/docs/pilot-kit/buyer-one-pager.md +31 -0
  109. package/docs/pilot-kit/gtm-pilot-playbook.md +182 -0
  110. package/docs/pilot-kit/offline-verify.md +33 -0
  111. package/docs/pilot-kit/procurement-one-pager.md +50 -0
  112. package/docs/pilot-kit/rfp-clause.md +46 -0
  113. package/docs/pilot-kit/roi-calculator-template.csv +2 -0
  114. package/docs/pilot-kit/security-qa.md +153 -0
  115. package/docs/pilot-kit/security-summary.md +35 -0
  116. package/docs/plans/2026-02-13-mcp-spike-design.md +113 -0
  117. package/docs/spec/AcceptanceCriteria.v1.md +17 -0
  118. package/docs/spec/AcceptanceEvaluation.v1.md +10 -0
  119. package/docs/spec/AgentEvent.v1.md +47 -0
  120. package/docs/spec/AgentIdentity.v1.md +62 -0
  121. package/docs/spec/AgentPassport.v1.md +95 -0
  122. package/docs/spec/AgentReputation.v1.md +59 -0
  123. package/docs/spec/AgentReputation.v2.md +52 -0
  124. package/docs/spec/AgentRun.v1.md +47 -0
  125. package/docs/spec/AgentRunSettlement.v1.md +52 -0
  126. package/docs/spec/AgentWallet.v1.md +43 -0
  127. package/docs/spec/AgreementDelegation.v1.md +109 -0
  128. package/docs/spec/ArbitrationCase.v1.md +67 -0
  129. package/docs/spec/ArbitrationVerdict.v1.md +60 -0
  130. package/docs/spec/BundleHeadAttestation.v1.md +32 -0
  131. package/docs/spec/CANONICAL_JSON.md +31 -0
  132. package/docs/spec/CRYPTOGRAPHY.md +61 -0
  133. package/docs/spec/ClosePack.v1.md +49 -0
  134. package/docs/spec/ClosePackManifest.v1.md +24 -0
  135. package/docs/spec/DelegationGrant.v1.md +90 -0
  136. package/docs/spec/DisputeOpenEnvelope.v1.md +43 -0
  137. package/docs/spec/ERRORS.md +76 -0
  138. package/docs/spec/ESCROW_NETTING_INVARIANTS.md +71 -0
  139. package/docs/spec/EvidenceIndex.v1.md +20 -0
  140. package/docs/spec/ExecutionIntent.v1.md +90 -0
  141. package/docs/spec/FinancePackBundleManifest.v1.md +24 -0
  142. package/docs/spec/FundingHold.v1.md +60 -0
  143. package/docs/spec/GovernancePolicy.v1.md +34 -0
  144. package/docs/spec/GovernancePolicy.v2.md +30 -0
  145. package/docs/spec/INVARIANTS.md +389 -0
  146. package/docs/spec/InteractionDirectionMatrix.v1.md +30 -0
  147. package/docs/spec/InvoiceBundleManifest.v1.md +24 -0
  148. package/docs/spec/InvoiceClaim.v1.md +11 -0
  149. package/docs/spec/MONEY_RAIL_STATE_MACHINE.md +58 -0
  150. package/docs/spec/MarketplaceAcceptance.v2.md +46 -0
  151. package/docs/spec/MarketplaceOffer.v2.md +54 -0
  152. package/docs/spec/MeteringReport.v1.md +18 -0
  153. package/docs/spec/PRODUCER_ERRORS.md +42 -0
  154. package/docs/spec/PricingMatrix.v1.md +20 -0
  155. package/docs/spec/PricingMatrixSignatures.v1.md +30 -0
  156. package/docs/spec/PricingMatrixSignatures.v2.md +29 -0
  157. package/docs/spec/ProduceCliOutput.v1.md +46 -0
  158. package/docs/spec/ProofBundleManifest.v1.md +24 -0
  159. package/docs/spec/README.md +104 -0
  160. package/docs/spec/REFERENCE_IMPLEMENTATIONS.md +29 -0
  161. package/docs/spec/REFERENCE_VERIFIER_BEHAVIOR.md +68 -0
  162. package/docs/spec/REMOTE_SIGNER.md +66 -0
  163. package/docs/spec/ReleaseIndex.v1.md +32 -0
  164. package/docs/spec/ReleaseIndexSignatures.v1.md +17 -0
  165. package/docs/spec/ReleaseTrust.v1.md +13 -0
  166. package/docs/spec/ReleaseTrust.v2.md +26 -0
  167. package/docs/spec/RemoteSignerRequest.v1.md +21 -0
  168. package/docs/spec/RemoteSignerResponse.v1.md +16 -0
  169. package/docs/spec/ReputationEvent.v1.md +63 -0
  170. package/docs/spec/RevocationList.v1.md +28 -0
  171. package/docs/spec/SIGNER_PROVIDER_PLUGIN.md +32 -0
  172. package/docs/spec/STRICTNESS.md +68 -0
  173. package/docs/spec/SUPPLY_CHAIN.md +33 -0
  174. package/docs/spec/SettlementAdjustment.v1.md +45 -0
  175. package/docs/spec/SettlementDecisionRecord.v1.md +48 -0
  176. package/docs/spec/SettlementDecisionRecord.v2.md +51 -0
  177. package/docs/spec/SettlementDecisionReport.v1.md +44 -0
  178. package/docs/spec/SettlementKernel.v1.md +59 -0
  179. package/docs/spec/SettlementReceipt.v1.md +63 -0
  180. package/docs/spec/SlaDefinition.v1.md +24 -0
  181. package/docs/spec/SlaEvaluation.v1.md +12 -0
  182. package/docs/spec/THREAT_MODEL.md +113 -0
  183. package/docs/spec/TOOL_PROVENANCE.md +30 -0
  184. package/docs/spec/TRUST_ANCHORS.md +84 -0
  185. package/docs/spec/TenantSettings.v1.md +90 -0
  186. package/docs/spec/TenantSettings.v2.md +99 -0
  187. package/docs/spec/TimestampProof.v1.md +25 -0
  188. package/docs/spec/ToolCallAgreement.v1.md +34 -0
  189. package/docs/spec/ToolCallEvidence.v1.md +47 -0
  190. package/docs/spec/ToolManifest.v1.md +47 -0
  191. package/docs/spec/VERIFIER_ENVIRONMENT.md +38 -0
  192. package/docs/spec/VERSIONING.md +107 -0
  193. package/docs/spec/VerificationReport.v1.md +50 -0
  194. package/docs/spec/VerifyAboutOutput.v1.md +10 -0
  195. package/docs/spec/VerifyCliOutput.v1.md +28 -0
  196. package/docs/spec/WARNINGS.md +83 -0
  197. package/docs/spec/error-codes.v1.txt +285 -0
  198. package/docs/spec/examples/agreement_delegation_v1.example.json +21 -0
  199. package/docs/spec/examples/arbitration_case_v1.example.json +26 -0
  200. package/docs/spec/examples/arbitration_verdict_v1.example.json +32 -0
  201. package/docs/spec/examples/dispute_open_envelope_v1.example.json +18 -0
  202. package/docs/spec/examples/produce_cli_output_v1.example.json +32 -0
  203. package/docs/spec/examples/release_index_signature_v1.example.json +9 -0
  204. package/docs/spec/examples/release_index_signatures_v1.example.json +14 -0
  205. package/docs/spec/examples/release_index_v1.example.json +15 -0
  206. package/docs/spec/examples/release_trust_v1.example.json +7 -0
  207. package/docs/spec/examples/release_trust_v2.example.json +22 -0
  208. package/docs/spec/examples/remote_signer_request_v1.example.json +18 -0
  209. package/docs/spec/examples/remote_signer_response_v1.example.json +8 -0
  210. package/docs/spec/examples/reputation_event_v1.example.json +29 -0
  211. package/docs/spec/examples/verification_report_v1.example.json +24 -0
  212. package/docs/spec/examples/verify_about_output_v1.example.json +29 -0
  213. package/docs/spec/examples/verify_cli_output_v1.example.json +13 -0
  214. package/docs/spec/legacy/MarketplaceAcceptance.v1.md +48 -0
  215. package/docs/spec/legacy/MarketplaceOffer.v1.md +56 -0
  216. package/docs/spec/legacy/schemas/MarketplaceAcceptance.v1.schema.json +53 -0
  217. package/docs/spec/legacy/schemas/MarketplaceOffer.v1.schema.json +61 -0
  218. package/docs/spec/producer-error-codes.v1.txt +14 -0
  219. package/docs/spec/schemas/AcceptanceCriteria.v1.schema.json +24 -0
  220. package/docs/spec/schemas/AcceptanceEvaluation.v1.schema.json +26 -0
  221. package/docs/spec/schemas/AgentEvent.v1.schema.json +49 -0
  222. package/docs/spec/schemas/AgentIdentity.v1.schema.json +129 -0
  223. package/docs/spec/schemas/AgentPassport.v1.schema.json +112 -0
  224. package/docs/spec/schemas/AgentReputation.v1.schema.json +151 -0
  225. package/docs/spec/schemas/AgentReputation.v2.schema.json +120 -0
  226. package/docs/spec/schemas/AgentRun.v1.schema.json +71 -0
  227. package/docs/spec/schemas/AgentRunSettlement.v1.schema.json +75 -0
  228. package/docs/spec/schemas/AgentWallet.v1.schema.json +54 -0
  229. package/docs/spec/schemas/AgreementDelegation.v1.schema.json +50 -0
  230. package/docs/spec/schemas/ArbitrationCase.v1.schema.json +133 -0
  231. package/docs/spec/schemas/ArbitrationVerdict.v1.schema.json +149 -0
  232. package/docs/spec/schemas/BundleHeadAttestation.v1.schema.json +21 -0
  233. package/docs/spec/schemas/ClosePackManifest.v1.schema.json +38 -0
  234. package/docs/spec/schemas/DelegationGrant.v1.schema.json +102 -0
  235. package/docs/spec/schemas/DisputeOpenEnvelope.v1.schema.json +78 -0
  236. package/docs/spec/schemas/EvidenceIndex.v1.schema.json +41 -0
  237. package/docs/spec/schemas/ExecutionIntent.v1.schema.json +85 -0
  238. package/docs/spec/schemas/FinancePackBundleManifest.v1.schema.json +38 -0
  239. package/docs/spec/schemas/FundingHold.v1.schema.json +46 -0
  240. package/docs/spec/schemas/GovernancePolicy.v1.schema.json +45 -0
  241. package/docs/spec/schemas/GovernancePolicy.v2.schema.json +70 -0
  242. package/docs/spec/schemas/InteractionDirectionMatrix.v1.schema.json +43 -0
  243. package/docs/spec/schemas/InvoiceBundleManifest.v1.schema.json +38 -0
  244. package/docs/spec/schemas/InvoiceClaim.v1.schema.json +39 -0
  245. package/docs/spec/schemas/MarketplaceAcceptance.v2.schema.json +53 -0
  246. package/docs/spec/schemas/MarketplaceOffer.v2.schema.json +61 -0
  247. package/docs/spec/schemas/MeteringReport.v1.schema.json +45 -0
  248. package/docs/spec/schemas/PricingMatrix.v1.schema.json +24 -0
  249. package/docs/spec/schemas/PricingMatrixSignatures.v1.schema.json +24 -0
  250. package/docs/spec/schemas/PricingMatrixSignatures.v2.schema.json +24 -0
  251. package/docs/spec/schemas/ProduceCliOutput.v1.schema.json +107 -0
  252. package/docs/spec/schemas/ProofBundleManifest.v1.schema.json +37 -0
  253. package/docs/spec/schemas/PublicKeys.v1.schema.json +33 -0
  254. package/docs/spec/schemas/ReleaseIndex.v1.schema.json +45 -0
  255. package/docs/spec/schemas/ReleaseIndexSignature.v1.schema.json +16 -0
  256. package/docs/spec/schemas/ReleaseIndexSignatures.v1.schema.json +16 -0
  257. package/docs/spec/schemas/ReleaseTrust.v1.schema.json +15 -0
  258. package/docs/spec/schemas/ReleaseTrust.v2.schema.json +37 -0
  259. package/docs/spec/schemas/RemoteSignerPublicKeyResponse.v1.schema.json +14 -0
  260. package/docs/spec/schemas/RemoteSignerRequest.v1.schema.json +24 -0
  261. package/docs/spec/schemas/RemoteSignerResponse.v1.schema.json +10 -0
  262. package/docs/spec/schemas/RemoteSignerSignRequest.v1.schema.json +27 -0
  263. package/docs/spec/schemas/RemoteSignerSignResponse.v1.schema.json +16 -0
  264. package/docs/spec/schemas/ReputationEvent.v1.schema.json +164 -0
  265. package/docs/spec/schemas/RevocationList.v1.schema.json +51 -0
  266. package/docs/spec/schemas/SettlementAdjustment.v1.schema.json +44 -0
  267. package/docs/spec/schemas/SettlementDecisionRecord.v1.schema.json +66 -0
  268. package/docs/spec/schemas/SettlementDecisionRecord.v2.schema.json +148 -0
  269. package/docs/spec/schemas/SettlementDecisionReport.v1.schema.json +61 -0
  270. package/docs/spec/schemas/SettlementReceipt.v1.schema.json +135 -0
  271. package/docs/spec/schemas/SlaDefinition.v1.schema.json +33 -0
  272. package/docs/spec/schemas/SlaEvaluation.v1.schema.json +26 -0
  273. package/docs/spec/schemas/TenantSettings.v1.schema.json +90 -0
  274. package/docs/spec/schemas/TenantSettings.v2.schema.json +161 -0
  275. package/docs/spec/schemas/TimestampProof.v1.schema.json +17 -0
  276. package/docs/spec/schemas/ToolCallAgreement.v1.schema.json +34 -0
  277. package/docs/spec/schemas/ToolCallEvidence.v1.schema.json +45 -0
  278. package/docs/spec/schemas/ToolManifest.v1.schema.json +54 -0
  279. package/docs/spec/schemas/VerificationReport.v1.schema.json +83 -0
  280. package/docs/spec/schemas/VerifyAboutOutput.v1.schema.json +54 -0
  281. package/docs/spec/schemas/VerifyCliOutput.v1.schema.json +75 -0
  282. package/docs/spec/schemas/VerifyReleaseOutput.v1.schema.json +47 -0
  283. package/docs/spec/x402-error-codes.v1.txt +21 -0
  284. package/docs/templates/buyer-email.txt +18 -0
  285. package/docs/templates/buyer-one-pager.md +24 -0
  286. package/package.json +40 -6
  287. package/scripts/acceptance/full-stack.mjs +734 -0
  288. package/scripts/acceptance/full-stack.sh +99 -0
  289. package/scripts/audit/build-audit-packet.mjs +242 -0
  290. package/scripts/backup-pg.sh +45 -0
  291. package/scripts/backup-restore/README.md +18 -0
  292. package/scripts/backup-restore/capture-state.mjs +130 -0
  293. package/scripts/backup-restore/client.mjs +97 -0
  294. package/scripts/backup-restore/seed-workload.mjs +235 -0
  295. package/scripts/backup-restore/verify-state.mjs +139 -0
  296. package/scripts/backup-restore-test.sh +217 -0
  297. package/scripts/chaos.js +221 -0
  298. package/scripts/ci/build-launch-cutover-packet.mjs +148 -0
  299. package/scripts/ci/build-self-serve-benchmark-report.mjs +122 -0
  300. package/scripts/ci/changelog-guard.mjs +145 -0
  301. package/scripts/ci/check-kernel-v0-launch-gate.mjs +233 -0
  302. package/scripts/ci/check-secret-hygiene.mjs +78 -0
  303. package/scripts/ci/check-version-consistency.mjs +42 -0
  304. package/scripts/ci/cli-pack-smoke.mjs +160 -0
  305. package/scripts/ci/flake-budget-guard.mjs +68 -0
  306. package/scripts/ci/generate-error-codes.mjs +54 -0
  307. package/scripts/ci/lib/lighthouse-tracker.mjs +90 -0
  308. package/scripts/ci/lib/self-serve-launch-gate.mjs +89 -0
  309. package/scripts/ci/npm-pack-smoke.mjs +454 -0
  310. package/scripts/ci/run-10x-throughput-drill.mjs +246 -0
  311. package/scripts/ci/run-10x-throughput-incident-rehearsal.mjs +325 -0
  312. package/scripts/ci/run-arbitration-workspace-browser-e2e.sh +22 -0
  313. package/scripts/ci/run-circle-sandbox-smoke.mjs +237 -0
  314. package/scripts/ci/run-go-live-gate.mjs +150 -0
  315. package/scripts/ci/run-kernel-v0-ship-gate.mjs +97 -0
  316. package/scripts/ci/run-mcp-host-smoke.mjs +275 -0
  317. package/scripts/ci/run-self-serve-launch-gate.mjs +56 -0
  318. package/scripts/ci/runtime-import-smoke.mjs +58 -0
  319. package/scripts/ci/update-lighthouse-tracker.mjs +112 -0
  320. package/scripts/closepack/lib.mjs +286 -0
  321. package/scripts/collect-debug.sh +263 -0
  322. package/scripts/demo/compositional-settlement-3hop.mjs +237 -0
  323. package/scripts/demo/delivery-robot/export-ui-fixture.mjs +188 -0
  324. package/scripts/demo/delivery-robot/generate.mjs +377 -0
  325. package/scripts/demo/kernel-agent-goes-shopping.mjs +202 -0
  326. package/scripts/demo/magic-link-first-green.mjs +118 -0
  327. package/scripts/demo/magic-link-kind-smoke.mjs +577 -0
  328. package/scripts/demo/mcp-paid-exa.mjs +1110 -0
  329. package/scripts/dev/billing-doctor.sh +145 -0
  330. package/scripts/dev/billing-smoke-prod.sh +219 -0
  331. package/scripts/dev/billing-webhook-replay.sh +161 -0
  332. package/scripts/dev/env.dev.example +29 -0
  333. package/scripts/dev/env.sh +37 -0
  334. package/scripts/dev/new-sdk-key.sh +81 -0
  335. package/scripts/dev/sdk-first-run.sh +21 -0
  336. package/scripts/dev/smoke-x402-gateway.sh +115 -0
  337. package/scripts/dev/start-api.sh +24 -0
  338. package/scripts/examples/produce-and-verify-jobproof.mjs +191 -0
  339. package/scripts/examples/sdk-first-paid-rfq.py +105 -0
  340. package/scripts/examples/sdk-first-verified-run.mjs +85 -0
  341. package/scripts/examples/sdk-first-verified-run.py +99 -0
  342. package/scripts/examples/sdk-tenant-analytics.mjs +103 -0
  343. package/scripts/examples/sdk-tenant-analytics.py +118 -0
  344. package/scripts/finance-pack/bundle.mjs +284 -0
  345. package/scripts/fixtures/generate-bundle-fixtures.mjs +877 -0
  346. package/scripts/governance/export.mjs +169 -0
  347. package/scripts/load/delivery-stress.k6.js +183 -0
  348. package/scripts/load/ingest-burst.k6.js +236 -0
  349. package/scripts/load/run-delivery-load.js +66 -0
  350. package/scripts/load/webhook-receiver.js +131 -0
  351. package/scripts/magic-link/migrate-run-records-to-db.mjs +35 -0
  352. package/scripts/mcp/probe.mjs +238 -0
  353. package/scripts/mcp/settld-mcp-http-gateway.mjs +178 -0
  354. package/scripts/mcp/settld-mcp-server.mjs +1201 -0
  355. package/scripts/openapi/write.mjs +13 -0
  356. package/scripts/ops/bootstrap-tenant-conformance.mjs +185 -0
  357. package/scripts/ops/build-x402-pilot-reliability-report.mjs +489 -0
  358. package/scripts/ops/check-x402-receipt-sample.mjs +181 -0
  359. package/scripts/ops/design-partner-run-packet.mjs +466 -0
  360. package/scripts/ops/hosted-baseline-evidence.mjs +681 -0
  361. package/scripts/ops/money-rails-chargeback-evidence.mjs +509 -0
  362. package/scripts/ops/money-rails-reconcile-evidence.mjs +180 -0
  363. package/scripts/ops/p0-seed-money-rail-operation.mjs +432 -0
  364. package/scripts/pilot/finance-pack.mjs +495 -0
  365. package/scripts/pilot/fixtures/robot-keypair.json +4 -0
  366. package/scripts/pilot/fixtures/server-signer.json +4 -0
  367. package/scripts/proof-bundle/job.mjs +109 -0
  368. package/scripts/proof-bundle/lib.mjs +92 -0
  369. package/scripts/proof-bundle/month.mjs +103 -0
  370. package/scripts/provider/conformance-run.mjs +159 -0
  371. package/scripts/provider/keys-generate.mjs +135 -0
  372. package/scripts/provider/publish.mjs +420 -0
  373. package/scripts/quickstart/x402.mjs +334 -0
  374. package/scripts/release/build-artifacts.mjs +181 -0
  375. package/scripts/release/generate-release-index.mjs +112 -0
  376. package/scripts/release/release-index-lib.mjs +232 -0
  377. package/scripts/release/sign-release-index.mjs +85 -0
  378. package/scripts/release/validate-release-assets.mjs +170 -0
  379. package/scripts/release/verify-release.mjs +261 -0
  380. package/scripts/restore-pg.sh +34 -0
  381. package/scripts/scaffold/create-settld-paid-tool.mjs +19 -0
  382. package/scripts/sdk/smoke-python.py +30 -0
  383. package/scripts/sdk/smoke.mjs +16 -0
  384. package/scripts/settlement/x402-batch-worker.mjs +1091 -0
  385. package/scripts/slo/check.mjs +178 -0
  386. package/scripts/smoke/k8s-smoke.mjs +214 -0
  387. package/scripts/spec/generate-protocol-vectors.mjs +931 -0
  388. package/scripts/test/check-no-generated-artifacts.sh +12 -0
  389. package/scripts/test/run.sh +45 -0
  390. package/scripts/trust/validate-trust-file.mjs +57 -0
  391. package/scripts/trust-config/rotate-settld-pay.mjs +277 -0
  392. package/scripts/trust-config/wizard.mjs +161 -0
  393. package/scripts/vendor-contract-test-lib.mjs +182 -0
  394. package/scripts/vendor-contract-test.mjs +55 -0
  395. package/scripts/vercel/build-mkdocs.sh +9 -0
  396. package/scripts/vercel/ignore-mkdocs.sh +25 -0
  397. package/scripts/vercel/install-mkdocs.sh +6 -0
  398. package/scripts/verify-pg.js +217 -0
  399. package/scripts/x402/receipt-verify.mjs +289 -0
  400. package/services/finance-sink/src/dedupe-store.js +29 -6
  401. package/services/receiver/src/dedupe-store.js +29 -5
  402. package/services/x402-gateway/Dockerfile +13 -0
  403. package/services/x402-gateway/README.md +58 -0
  404. package/services/x402-gateway/examples/upstream-mock.js +337 -0
  405. package/services/x402-gateway/src/server.js +947 -0
  406. package/src/api/app.js +32517 -16877
  407. package/src/api/maintenance.js +70 -0
  408. package/src/api/openapi.js +1130 -17
  409. package/src/api/persistence.js +272 -0
  410. package/src/api/server.js +81 -5
  411. package/src/api/store.js +1248 -6
  412. package/src/api/workers/deliveries.js +99 -4
  413. package/src/api/workers/insolvency-sweep.js +159 -0
  414. package/src/core/agent-card.js +69 -0
  415. package/src/core/agent-wallets.js +97 -0
  416. package/src/core/agreement-delegation.js +549 -0
  417. package/src/core/billing-plans.js +40 -6
  418. package/src/core/circle-reserve-adapter.js +845 -0
  419. package/src/core/maintenance-locks.js +1 -0
  420. package/src/core/paid-tool-manifest.js +318 -0
  421. package/src/core/provider-publish-conformance.js +525 -0
  422. package/src/core/provider-publish-proof.js +396 -0
  423. package/src/core/provider-quote-signature.js +170 -0
  424. package/src/core/settld-keys.js +112 -0
  425. package/src/core/settld-pay-token.js +344 -0
  426. package/src/core/settlement-kernel.js +213 -2
  427. package/src/core/settlement-verifier.js +335 -0
  428. package/src/core/tool-call-agreement.js +112 -0
  429. package/src/core/tool-call-evidence.js +144 -0
  430. package/src/core/tool-provider-signature.js +98 -0
  431. package/src/core/x402-escalation-override.js +258 -0
  432. package/src/core/x402-gate.js +118 -0
  433. package/src/core/x402-provider-refund-decision.js +220 -0
  434. package/src/core/x402-receipt-verifier.js +708 -0
  435. package/src/core/x402-reversal-command.js +251 -0
  436. package/src/core/x402-wallet-issuer-decision.js +252 -0
  437. package/src/core/zk-verifier.js +300 -0
  438. package/src/db/migrations/029_reputation_event_index.sql +54 -0
  439. package/src/db/migrations/030_artifacts_source_event_unique_job_only.sql +15 -0
  440. package/src/db/pg.js +18 -7
  441. package/src/db/store-pg.js +838 -72
@@ -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
@@ -0,0 +1,263 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+
4
+ SCRIPT_VERSION="1"
5
+ WORKDIR=""
6
+
7
+ usage() {
8
+ cat <<'EOH' >&2
9
+ Collect a Settld debug bundle for quickstart / Docker issues.
10
+
11
+ This script captures basic host + repo + Docker/Compose info and (optionally) compose logs,
12
+ then packages everything into a single archive you can attach to a GitHub issue.
13
+
14
+ Usage:
15
+ scripts/collect-debug.sh [--out <path>] [--project-dir <dir>] [--tail <N>] [--no-logs] [--zip] [--dry-run]
16
+
17
+ Options:
18
+ --out <path> Output archive path. Default: ./settld-debug-<ts>.tar.gz
19
+ --project-dir <dir> Directory to run docker compose from. Default: repo root.
20
+ --tail <N> Number of log lines to collect per service. Default: 2000
21
+ --no-logs Skip collecting compose logs.
22
+ --zip Create a .zip (requires `zip`). Default is .tar.gz
23
+ --dry-run Print what would be collected and exit.
24
+ -h, --help Show this help.
25
+
26
+ Notes:
27
+ - Review the bundle before sharing. Logs can contain secrets.
28
+ - The script will still produce a bundle even if Docker is not installed/running.
29
+ EOH
30
+ }
31
+
32
+ die() {
33
+ echo "error: $*" >&2
34
+ exit 2
35
+ }
36
+
37
+ quote_cmd() {
38
+ local out=""
39
+ local arg
40
+ for arg in "$@"; do
41
+ out+="$(printf '%q ' "$arg")"
42
+ done
43
+ printf '%s' "${out% }"
44
+ }
45
+
46
+ run_cmd() {
47
+ local out_file="$1"
48
+ shift
49
+ mkdir -p "$(dirname "$out_file")"
50
+ local cmd
51
+ cmd="$(quote_cmd "$@")"
52
+ {
53
+ echo "\$ ${cmd}"
54
+ set +e
55
+ "$@"
56
+ local rc=$?
57
+ set -e
58
+ echo
59
+ echo "exit_code=${rc}"
60
+ } >"$out_file" 2>&1
61
+ return 0
62
+ }
63
+
64
+ write_kv_file() {
65
+ local out_file="$1"
66
+ shift
67
+ mkdir -p "$(dirname "$out_file")"
68
+ {
69
+ for kv in "$@"; do
70
+ echo "$kv"
71
+ done
72
+ } >"$out_file"
73
+ }
74
+
75
+ sha256_file() {
76
+ local p="$1"
77
+ if command -v sha256sum >/dev/null 2>&1; then
78
+ sha256sum "$p" | awk '{print $1}'
79
+ return 0
80
+ fi
81
+ if command -v shasum >/dev/null 2>&1; then
82
+ shasum -a 256 "$p" | awk '{print $1}'
83
+ return 0
84
+ fi
85
+ echo "unknown"
86
+ }
87
+
88
+ main() {
89
+ local root
90
+ root="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
91
+
92
+ local out_path=""
93
+ local project_dir="$root"
94
+ local tail_lines="2000"
95
+ local no_logs="0"
96
+ local want_zip="0"
97
+ local dry_run="0"
98
+
99
+ while [[ $# -gt 0 ]]; do
100
+ case "$1" in
101
+ --out)
102
+ [[ $# -ge 2 ]] || die "--out requires a value"
103
+ out_path="$2"
104
+ shift 2
105
+ ;;
106
+ --project-dir)
107
+ [[ $# -ge 2 ]] || die "--project-dir requires a value"
108
+ project_dir="$2"
109
+ shift 2
110
+ ;;
111
+ --tail)
112
+ [[ $# -ge 2 ]] || die "--tail requires a value"
113
+ tail_lines="$2"
114
+ shift 2
115
+ ;;
116
+ --no-logs)
117
+ no_logs="1"
118
+ shift
119
+ ;;
120
+ --zip)
121
+ want_zip="1"
122
+ shift
123
+ ;;
124
+ --dry-run)
125
+ dry_run="1"
126
+ shift
127
+ ;;
128
+ -h|--help)
129
+ usage
130
+ exit 0
131
+ ;;
132
+ *)
133
+ die "unknown argument: $1"
134
+ ;;
135
+ esac
136
+ done
137
+
138
+ if [[ ! -d "$project_dir" ]]; then
139
+ die "project dir not found: $project_dir"
140
+ fi
141
+
142
+ local ts bundle_name
143
+ ts="$(date -u +%Y%m%dT%H%M%SZ)"
144
+ bundle_name="settld-debug-${ts}"
145
+
146
+ if [[ -z "$out_path" ]]; then
147
+ if [[ "$want_zip" == "1" ]]; then
148
+ out_path="./${bundle_name}.zip"
149
+ else
150
+ out_path="./${bundle_name}.tar.gz"
151
+ fi
152
+ fi
153
+
154
+ if [[ "$dry_run" == "1" ]]; then
155
+ local logs_msg="enabled"
156
+ if [[ "$no_logs" == "1" ]]; then
157
+ logs_msg="skipped (--no-logs)"
158
+ fi
159
+ cat <<EOF
160
+ Would create:
161
+ bundle: ${bundle_name}/
162
+ archive: ${out_path}
163
+
164
+ Would collect:
165
+ - Host: uname, os-release (if present), sw_vers (if present)
166
+ - Runtime: bash/node/npm versions (if present)
167
+ - Repo: git head + git status (if present)
168
+ - Docker: version + info (if present)
169
+ - Compose: version + ps + config
170
+ - Compose logs: ${logs_msg} (tail=${tail_lines})
171
+ EOF
172
+ exit 0
173
+ fi
174
+
175
+ WORKDIR="$(mktemp -d)"
176
+ local bundle_dir
177
+ bundle_dir="${WORKDIR}/${bundle_name}"
178
+ mkdir -p "$bundle_dir"
179
+ trap 'if [ -n "${WORKDIR:-}" ] && [ -d "${WORKDIR:-}" ]; then rm -rf "$WORKDIR"; fi' EXIT
180
+
181
+ write_kv_file "${bundle_dir}/meta.txt" \
182
+ "script=collect-debug.sh" \
183
+ "script_version=${SCRIPT_VERSION}" \
184
+ "collected_at_utc=$(date -u +%Y-%m-%dT%H:%M:%SZ)" \
185
+ "project_dir=${project_dir}"
186
+
187
+ run_cmd "${bundle_dir}/host/uname.txt" uname -a
188
+ if [[ -f /etc/os-release ]]; then
189
+ run_cmd "${bundle_dir}/host/os-release.txt" cat /etc/os-release
190
+ fi
191
+ if command -v sw_vers >/dev/null 2>&1; then
192
+ run_cmd "${bundle_dir}/host/sw_vers.txt" sw_vers
193
+ fi
194
+
195
+ run_cmd "${bundle_dir}/runtime/bash-version.txt" bash --version
196
+ if command -v node >/dev/null 2>&1; then
197
+ run_cmd "${bundle_dir}/runtime/node-version.txt" node --version
198
+ fi
199
+ if command -v npm >/dev/null 2>&1; then
200
+ run_cmd "${bundle_dir}/runtime/npm-version.txt" npm --version
201
+ fi
202
+
203
+ if command -v git >/dev/null 2>&1; then
204
+ run_cmd "${bundle_dir}/repo/git-head.txt" git -C "$root" rev-parse HEAD
205
+ run_cmd "${bundle_dir}/repo/git-status.txt" git -C "$root" status -sb
206
+ fi
207
+
208
+ write_kv_file "${bundle_dir}/env/selected.txt" \
209
+ "PATH=$([[ -n "${PATH:-}" ]] && echo '<set>' || echo '<unset>')" \
210
+ "DOCKER_HOST=$([[ -n "${DOCKER_HOST:-}" ]] && echo '<set>' || echo '<unset>')" \
211
+ "DOCKER_CONTEXT=$([[ -n "${DOCKER_CONTEXT:-}" ]] && echo '<set>' || echo '<unset>')" \
212
+ "COMPOSE_FILE=$([[ -n "${COMPOSE_FILE:-}" ]] && echo '<set>' || echo '<unset>')" \
213
+ "COMPOSE_PROJECT_NAME=$([[ -n "${COMPOSE_PROJECT_NAME:-}" ]] && echo '<set>' || echo '<unset>')" \
214
+ "HTTP_PROXY=$([[ -n "${HTTP_PROXY:-}" ]] && echo '<set>' || echo '<unset>')" \
215
+ "HTTPS_PROXY=$([[ -n "${HTTPS_PROXY:-}" ]] && echo '<set>' || echo '<unset>')" \
216
+ "NO_PROXY=$([[ -n "${NO_PROXY:-}" ]] && echo '<set>' || echo '<unset>')"
217
+
218
+ if command -v docker >/dev/null 2>&1; then
219
+ run_cmd "${bundle_dir}/docker/docker-version.txt" docker --version
220
+ run_cmd "${bundle_dir}/docker/docker-info.txt" docker info
221
+ else
222
+ write_kv_file "${bundle_dir}/docker/docker-missing.txt" "docker=<missing>"
223
+ fi
224
+
225
+ # Compose info (prefer `docker compose`, fall back to `docker-compose`).
226
+ local compose_kind="none"
227
+ local -a compose_cmd=()
228
+ if command -v docker >/dev/null 2>&1 && docker compose version >/dev/null 2>&1; then
229
+ compose_kind="docker-compose-plugin"
230
+ compose_cmd=(docker compose)
231
+ elif command -v docker-compose >/dev/null 2>&1; then
232
+ compose_kind="docker-compose-standalone"
233
+ compose_cmd=(docker-compose)
234
+ fi
235
+
236
+ write_kv_file "${bundle_dir}/compose/compose-kind.txt" "compose_kind=${compose_kind}"
237
+ if [[ "$compose_kind" != "none" ]]; then
238
+ run_cmd "${bundle_dir}/compose/compose-version.txt" "${compose_cmd[@]}" version
239
+ run_cmd "${bundle_dir}/compose/compose-ps.txt" "${compose_cmd[@]}" -f "${project_dir}/docker-compose.yml" ps
240
+ run_cmd "${bundle_dir}/compose/compose-config.txt" "${compose_cmd[@]}" -f "${project_dir}/docker-compose.yml" config
241
+
242
+ if [[ "$no_logs" != "1" ]]; then
243
+ run_cmd "${bundle_dir}/compose/compose-logs.txt" "${compose_cmd[@]}" -f "${project_dir}/docker-compose.yml" logs --no-color --tail "$tail_lines"
244
+ fi
245
+ fi
246
+
247
+ # Pack archive.
248
+ mkdir -p "$(dirname "$out_path")" || true
249
+ if [[ "$want_zip" == "1" ]]; then
250
+ command -v zip >/dev/null 2>&1 || die "--zip requested but `zip` is not installed"
251
+ (cd "$WORKDIR" && zip -r -q "$out_path" "$bundle_name")
252
+ else
253
+ (cd "$WORKDIR" && tar -czf "$out_path" "$bundle_name")
254
+ fi
255
+
256
+ local sum
257
+ sum="$(sha256_file "$out_path")"
258
+ printf '%s %s\n' "$sum" "$(basename "$out_path")" > "${out_path}.sha256" 2>/dev/null || true
259
+ echo "wrote: ${out_path}"
260
+ echo "sha256: ${sum}"
261
+ }
262
+
263
+ main "$@"