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,237 @@
1
+ #!/usr/bin/env node
2
+
3
+ import { spawn } from "node:child_process";
4
+ import fs from "node:fs";
5
+ import path from "node:path";
6
+ import process from "node:process";
7
+
8
+ const ARTIFACT_PATH = path.resolve(process.cwd(), "artifacts/gates/x402-circle-sandbox-smoke.json");
9
+
10
+ function nowIso() {
11
+ return new Date().toISOString();
12
+ }
13
+
14
+ function readEnv(name, fallback = null) {
15
+ const raw = process.env[name];
16
+ if (raw === undefined || raw === null || String(raw).trim() === "") return fallback;
17
+ return String(raw).trim();
18
+ }
19
+
20
+ function hasTruthyEnv(name) {
21
+ const value = readEnv(name, "");
22
+ if (!value) return false;
23
+ const normalized = value.toLowerCase();
24
+ return normalized === "1" || normalized === "true" || normalized === "yes" || normalized === "on";
25
+ }
26
+
27
+ function parseJsonSafe(text) {
28
+ try {
29
+ return JSON.parse(text);
30
+ } catch {
31
+ return null;
32
+ }
33
+ }
34
+
35
+ function ensureDir(filePath) {
36
+ fs.mkdirSync(path.dirname(filePath), { recursive: true });
37
+ }
38
+
39
+ function writeArtifact(value) {
40
+ ensureDir(ARTIFACT_PATH);
41
+ fs.writeFileSync(ARTIFACT_PATH, `${JSON.stringify(value, null, 2)}\n`, "utf8");
42
+ }
43
+
44
+ function assertRequiredEnv() {
45
+ const required = ["CIRCLE_API_KEY", "CIRCLE_WALLET_ID_SPEND", "CIRCLE_WALLET_ID_ESCROW", "CIRCLE_TOKEN_ID_USDC"];
46
+ const missing = required.filter((name) => !readEnv(name));
47
+ if (missing.length > 0) {
48
+ throw new Error(`missing required env: ${missing.join(", ")}`);
49
+ }
50
+ const hasEntityProvider =
51
+ Boolean(readEnv("ENTITY_SECRET")) ||
52
+ Boolean(readEnv("CIRCLE_ENTITY_SECRET_HEX")) ||
53
+ Boolean(readEnv("CIRCLE_ENTITY_SECRET_CIPHERTEXT_TEMPLATE")) ||
54
+ (Boolean(readEnv("CIRCLE_ENTITY_SECRET_CIPHERTEXT")) && hasTruthyEnv("CIRCLE_ALLOW_STATIC_ENTITY_SECRET"));
55
+ if (!hasEntityProvider) {
56
+ throw new Error(
57
+ "missing entity secret provider: set ENTITY_SECRET/CIRCLE_ENTITY_SECRET_HEX, CIRCLE_ENTITY_SECRET_CIPHERTEXT_TEMPLATE, or CIRCLE_ENTITY_SECRET_CIPHERTEXT + CIRCLE_ALLOW_STATIC_ENTITY_SECRET=1"
58
+ );
59
+ }
60
+ }
61
+
62
+ async function callCircle({ method, endpoint, body = null }) {
63
+ const baseUrl = readEnv("CIRCLE_BASE_URL", "https://api.circle.com").replace(/\/+$/, "");
64
+ const apiKey = readEnv("CIRCLE_API_KEY", "");
65
+ const response = await fetch(`${baseUrl}${endpoint}`, {
66
+ method,
67
+ headers: {
68
+ authorization: `Bearer ${apiKey}`,
69
+ accept: "application/json",
70
+ ...(body ? { "content-type": "application/json; charset=utf-8" } : {})
71
+ },
72
+ body: body ? JSON.stringify(body) : undefined
73
+ });
74
+ const text = await response.text();
75
+ const json = parseJsonSafe(text);
76
+ return { status: response.status, text, json };
77
+ }
78
+
79
+ async function requestFaucetTopup({ walletAddress, blockchain, native, usdc }) {
80
+ const out = await callCircle({
81
+ method: "POST",
82
+ endpoint: "/v1/faucet/drips",
83
+ body: {
84
+ address: walletAddress,
85
+ blockchain,
86
+ native: Boolean(native),
87
+ usdc: Boolean(usdc),
88
+ eurc: false
89
+ }
90
+ });
91
+ const accepted = out.status === 204 || out.status === 409 || out.status === 429 || out.status === 400;
92
+ return {
93
+ ok: accepted,
94
+ status: out.status,
95
+ body: out.json ?? out.text ?? null
96
+ };
97
+ }
98
+
99
+ async function resolveWalletAddress(walletId) {
100
+ const out = await callCircle({
101
+ method: "GET",
102
+ endpoint: `/v1/w3s/wallets/${encodeURIComponent(walletId)}`
103
+ });
104
+ if (out.status < 200 || out.status >= 300) {
105
+ throw new Error(`wallet lookup failed (${walletId}): HTTP ${out.status}`);
106
+ }
107
+ const payload = out.json ?? {};
108
+ const candidates = [payload, payload.wallet, payload.data, payload.data?.wallet];
109
+ if (Array.isArray(payload?.data?.wallets)) {
110
+ for (const row of payload.data.wallets) candidates.push(row);
111
+ }
112
+ for (const row of candidates) {
113
+ if (!row || typeof row !== "object" || Array.isArray(row)) continue;
114
+ if (typeof row.address === "string" && row.address.trim() !== "") return row.address.trim();
115
+ if (typeof row.blockchainAddress === "string" && row.blockchainAddress.trim() !== "") return row.blockchainAddress.trim();
116
+ }
117
+ throw new Error(`wallet lookup did not include address (${walletId})`);
118
+ }
119
+
120
+ function runNodeTest({ label, testFile, env }) {
121
+ return new Promise((resolve) => {
122
+ const startedAt = Date.now();
123
+ const child = spawn(process.execPath, ["--test", testFile], {
124
+ cwd: process.cwd(),
125
+ env: { ...process.env, ...env },
126
+ stdio: "inherit"
127
+ });
128
+ child.once("close", (code, signal) => {
129
+ resolve({
130
+ label,
131
+ testFile,
132
+ code,
133
+ signal,
134
+ ok: code === 0,
135
+ durationMs: Date.now() - startedAt
136
+ });
137
+ });
138
+ });
139
+ }
140
+
141
+ async function main() {
142
+ const startedAt = nowIso();
143
+ const report = {
144
+ schemaVersion: "X402CircleSandboxSmoke.v1",
145
+ ok: false,
146
+ startedAt,
147
+ completedAt: null,
148
+ steps: [],
149
+ errors: []
150
+ };
151
+
152
+ try {
153
+ assertRequiredEnv();
154
+
155
+ const circleMode = readEnv("X402_CIRCLE_RESERVE_MODE", readEnv("SETTLD_DEMO_CIRCLE_MODE", "sandbox"));
156
+ if (String(circleMode).toLowerCase() !== "sandbox") {
157
+ throw new Error(`expected sandbox mode, got ${circleMode}`);
158
+ }
159
+
160
+ const blockchain = readEnv("CIRCLE_BLOCKCHAIN", "BASE-SEPOLIA");
161
+ const spendWalletId = readEnv("CIRCLE_WALLET_ID_SPEND", "");
162
+ const escrowWalletId = readEnv("CIRCLE_WALLET_ID_ESCROW", "");
163
+ const spendAddress = await resolveWalletAddress(spendWalletId);
164
+ const escrowAddress = await resolveWalletAddress(escrowWalletId);
165
+
166
+ const shouldTopup = !hasTruthyEnv("CIRCLE_SKIP_TOPUP");
167
+ if (shouldTopup) {
168
+ const spendTopup = await requestFaucetTopup({
169
+ walletAddress: spendAddress,
170
+ blockchain,
171
+ native: true,
172
+ usdc: true
173
+ });
174
+ report.steps.push({ step: "faucet_topup_spend", ...spendTopup });
175
+
176
+ const escrowTopup = await requestFaucetTopup({
177
+ walletAddress: escrowAddress,
178
+ blockchain,
179
+ native: true,
180
+ usdc: false
181
+ });
182
+ report.steps.push({ step: "faucet_topup_escrow", ...escrowTopup });
183
+ } else {
184
+ report.steps.push({ step: "faucet_topup", skipped: true, reason: "CIRCLE_SKIP_TOPUP=1" });
185
+ }
186
+
187
+ const testEnv = {
188
+ CIRCLE_E2E: "1",
189
+ CIRCLE_BATCH_E2E: "1",
190
+ CIRCLE_E2E_AMOUNT_CENTS: readEnv("CIRCLE_E2E_AMOUNT_CENTS", "100"),
191
+ CIRCLE_BATCH_E2E_AMOUNT_CENTS: readEnv("CIRCLE_BATCH_E2E_AMOUNT_CENTS", "100")
192
+ };
193
+
194
+ const reserve = await runNodeTest({
195
+ label: "reserve_e2e",
196
+ testFile: "test/circle-sandbox-reserve-e2e.test.js",
197
+ env: testEnv
198
+ });
199
+ report.steps.push(reserve);
200
+ if (!reserve.ok) throw new Error("reserve e2e failed");
201
+
202
+ const batch = await runNodeTest({
203
+ label: "batch_settlement_e2e",
204
+ testFile: "test/circle-sandbox-batch-settlement-e2e.test.js",
205
+ env: testEnv
206
+ });
207
+ report.steps.push(batch);
208
+ if (!batch.ok) throw new Error("batch settlement e2e failed");
209
+
210
+ report.ok = true;
211
+ } catch (err) {
212
+ report.errors.push({
213
+ message: err?.message ?? String(err ?? "")
214
+ });
215
+ report.ok = false;
216
+ } finally {
217
+ report.completedAt = nowIso();
218
+ writeArtifact(report);
219
+ process.stdout.write(`wrote circle sandbox smoke report: ${ARTIFACT_PATH}\n`);
220
+ }
221
+
222
+ if (!report.ok) process.exitCode = 1;
223
+ }
224
+
225
+ main().catch((err) => {
226
+ const fallback = {
227
+ schemaVersion: "X402CircleSandboxSmoke.v1",
228
+ ok: false,
229
+ startedAt: nowIso(),
230
+ completedAt: nowIso(),
231
+ steps: [],
232
+ errors: [{ message: err?.message ?? String(err ?? "") }]
233
+ };
234
+ writeArtifact(fallback);
235
+ process.stderr.write(`${err?.stack ?? err?.message ?? String(err)}\n`);
236
+ process.exitCode = 1;
237
+ });
@@ -0,0 +1,150 @@
1
+ #!/usr/bin/env node
2
+ import { mkdir, readFile, writeFile } from "node:fs/promises";
3
+ import { dirname, resolve } from "node:path";
4
+ import { spawn } from "node:child_process";
5
+ import { loadLighthouseTrackerFromPath } from "./lib/lighthouse-tracker.mjs";
6
+
7
+ function parseBoolEnv(name, fallback = false) {
8
+ const raw = process.env[name];
9
+ if (raw === undefined || raw === null || String(raw).trim() === "") return fallback;
10
+ const value = String(raw).trim().toLowerCase();
11
+ if (["1", "true", "yes", "y"].includes(value)) return true;
12
+ if (["0", "false", "no", "n"].includes(value)) return false;
13
+ throw new Error(`${name} must be boolean-like (true/false)`);
14
+ }
15
+
16
+ function runShell(command, { env = process.env } = {}) {
17
+ return new Promise((resolvePromise, rejectPromise) => {
18
+ const child = spawn("bash", ["-lc", command], { stdio: "inherit", env });
19
+ child.on("error", rejectPromise);
20
+ child.on("exit", (code) => resolvePromise(code ?? 1));
21
+ });
22
+ }
23
+
24
+ async function main() {
25
+ const reportPath = resolve(process.cwd(), process.env.GO_LIVE_GATE_REPORT_PATH || "artifacts/gates/s13-go-live-gate.json");
26
+ const throughputReportPath = resolve(
27
+ process.cwd(),
28
+ process.env.THROUGHPUT_REPORT_PATH || "artifacts/throughput/10x-drill-summary.json"
29
+ );
30
+ const incidentRehearsalReportPath = resolve(
31
+ process.cwd(),
32
+ process.env.THROUGHPUT_INCIDENT_REHEARSAL_REPORT_PATH || "artifacts/throughput/10x-incident-rehearsal-summary.json"
33
+ );
34
+ const lighthouseTrackerPath = resolve(
35
+ process.cwd(),
36
+ process.env.LIGHTHOUSE_TRACKER_PATH || "planning/launch/lighthouse-production-tracker.json"
37
+ );
38
+ await mkdir(dirname(reportPath), { recursive: true });
39
+
40
+ const runThroughput = parseBoolEnv("RUN_THROUGHPUT_DRILL", true);
41
+ const allowThroughputSkip = parseBoolEnv("ALLOW_THROUGHPUT_SKIP", false);
42
+ const runIncidentRehearsal = parseBoolEnv("RUN_INCIDENT_REHEARSAL", runThroughput);
43
+ const allowIncidentRehearsalSkip = parseBoolEnv("ALLOW_INCIDENT_REHEARSAL_SKIP", false);
44
+ const deterministicTestCommand =
45
+ process.env.GO_LIVE_TEST_COMMAND ||
46
+ "node --test test/settlement-kernel.test.js && node --test test/api-e2e-ops-money-rails.test.js && node --test test/api-e2e-ops-finance-net-close.test.js && node --test test/api-e2e-ops-arbitration-workspace.test.js && node --test test/api-e2e-ops-command-center.test.js && node --test test/api-e2e-billing-plan-enforcement.test.js";
47
+
48
+ const checks = [];
49
+ const startedAt = Date.now();
50
+
51
+ const deterministicStartedAt = Date.now();
52
+ const deterministicExitCode = await runShell(deterministicTestCommand);
53
+ checks.push({
54
+ id: "deterministic_critical_suite",
55
+ ok: deterministicExitCode === 0,
56
+ command: deterministicTestCommand,
57
+ exitCode: deterministicExitCode,
58
+ durationMs: Date.now() - deterministicStartedAt
59
+ });
60
+
61
+ if (runThroughput) {
62
+ const throughputCommand = "node scripts/ci/run-10x-throughput-drill.mjs";
63
+ const throughputStartedAt = Date.now();
64
+ const throughputExitCode = await runShell(throughputCommand, { env: process.env });
65
+ let throughputVerdictOk = throughputExitCode === 0;
66
+ let throughputSummary = null;
67
+ try {
68
+ throughputSummary = JSON.parse(await readFile(throughputReportPath, "utf8"));
69
+ throughputVerdictOk = throughputSummary?.verdict?.ok === true && throughputVerdictOk;
70
+ } catch (err) {
71
+ throughputVerdictOk = false;
72
+ throughputSummary = { error: err?.message ?? "unable to read throughput report" };
73
+ }
74
+ const throughputSkipped = allowThroughputSkip && throughputVerdictOk !== true;
75
+ checks.push({
76
+ id: "throughput_10x_drill",
77
+ ok: throughputSkipped ? true : throughputVerdictOk,
78
+ skipped: throughputSkipped,
79
+ command: throughputCommand,
80
+ exitCode: throughputExitCode,
81
+ durationMs: Date.now() - throughputStartedAt,
82
+ reportPath: throughputReportPath,
83
+ summary: throughputSummary
84
+ });
85
+ }
86
+
87
+ if (runIncidentRehearsal) {
88
+ const incidentRehearsalCommand = "node scripts/ci/run-10x-throughput-incident-rehearsal.mjs";
89
+ const incidentRehearsalStartedAt = Date.now();
90
+ const incidentRehearsalExitCode = await runShell(incidentRehearsalCommand, { env: process.env });
91
+ let incidentRehearsalVerdictOk = incidentRehearsalExitCode === 0;
92
+ let incidentRehearsalSummary = null;
93
+ try {
94
+ incidentRehearsalSummary = JSON.parse(await readFile(incidentRehearsalReportPath, "utf8"));
95
+ incidentRehearsalVerdictOk = incidentRehearsalSummary?.verdict?.ok === true && incidentRehearsalVerdictOk;
96
+ } catch (err) {
97
+ incidentRehearsalVerdictOk = false;
98
+ incidentRehearsalSummary = { error: err?.message ?? "unable to read incident rehearsal report" };
99
+ }
100
+ const incidentRehearsalSkipped = allowIncidentRehearsalSkip && incidentRehearsalVerdictOk !== true;
101
+ checks.push({
102
+ id: "throughput_incident_rehearsal",
103
+ ok: incidentRehearsalSkipped ? true : incidentRehearsalVerdictOk,
104
+ skipped: incidentRehearsalSkipped,
105
+ command: incidentRehearsalCommand,
106
+ exitCode: incidentRehearsalExitCode,
107
+ durationMs: Date.now() - incidentRehearsalStartedAt,
108
+ reportPath: incidentRehearsalReportPath,
109
+ summary: incidentRehearsalSummary
110
+ });
111
+ }
112
+
113
+ let lighthouse = null;
114
+ let lighthouseOk = false;
115
+ try {
116
+ lighthouse = await loadLighthouseTrackerFromPath(lighthouseTrackerPath);
117
+ lighthouseOk = lighthouse.ok === true;
118
+ } catch (err) {
119
+ lighthouse = { error: err?.message ?? "unable to load lighthouse tracker" };
120
+ lighthouseOk = false;
121
+ }
122
+ checks.push({
123
+ id: "lighthouse_customers_paid_production",
124
+ ok: lighthouseOk,
125
+ trackerPath: lighthouseTrackerPath,
126
+ summary: lighthouse
127
+ });
128
+
129
+ const overallOk = checks.every((check) => check.ok === true);
130
+ const report = {
131
+ schemaVersion: "GoLiveGateReport.v1",
132
+ generatedAt: new Date().toISOString(),
133
+ durationMs: Date.now() - startedAt,
134
+ checks,
135
+ verdict: {
136
+ ok: overallOk,
137
+ requiredChecks: checks.length,
138
+ passedChecks: checks.filter((check) => check.ok === true).length
139
+ }
140
+ };
141
+
142
+ await writeFile(reportPath, JSON.stringify(report, null, 2) + "\n", "utf8");
143
+ process.stdout.write(`wrote go-live gate report: ${reportPath}\n`);
144
+ if (!overallOk) process.exitCode = 1;
145
+ }
146
+
147
+ main().catch((err) => {
148
+ process.stderr.write(`${err?.stack || err?.message || String(err)}\n`);
149
+ process.exit(1);
150
+ });
@@ -0,0 +1,97 @@
1
+ #!/usr/bin/env node
2
+ import { mkdir, writeFile } from "node:fs/promises";
3
+ import { dirname, resolve } from "node:path";
4
+ import { spawn } from "node:child_process";
5
+
6
+ function parseBoolEnv(name, fallback = false) {
7
+ const raw = process.env[name];
8
+ if (raw === undefined || raw === null || String(raw).trim() === "") return fallback;
9
+ const value = String(raw).trim().toLowerCase();
10
+ if (["1", "true", "yes", "y"].includes(value)) return true;
11
+ if (["0", "false", "no", "n"].includes(value)) return false;
12
+ throw new Error(`${name} must be boolean-like (true/false)`);
13
+ }
14
+
15
+ function runShell(command, { env = process.env } = {}) {
16
+ return new Promise((resolvePromise, rejectPromise) => {
17
+ const child = spawn("bash", ["-lc", command], { stdio: "inherit", env });
18
+ child.on("error", rejectPromise);
19
+ child.on("exit", (code) => resolvePromise(code ?? 1));
20
+ });
21
+ }
22
+
23
+ async function runCheck(check, env) {
24
+ const startedAt = Date.now();
25
+ const exitCode = await runShell(check.command, { env });
26
+ return {
27
+ id: check.id,
28
+ ok: exitCode === 0,
29
+ command: check.command,
30
+ exitCode,
31
+ durationMs: Date.now() - startedAt
32
+ };
33
+ }
34
+
35
+ async function main() {
36
+ const reportPath = resolve(
37
+ process.cwd(),
38
+ process.env.KERNEL_V0_SHIP_GATE_REPORT_PATH || "artifacts/gates/kernel-v0-ship-gate.json"
39
+ );
40
+ const runQuickstart = parseBoolEnv("RUN_KERNEL_V0_QUICKSTART_SMOKE", true);
41
+ await mkdir(dirname(reportPath), { recursive: true });
42
+
43
+ const checks = [
44
+ {
45
+ id: "kernel_v0_truth_launch_claims",
46
+ command: "node scripts/ci/check-kernel-v0-launch-gate.mjs --mode prepublish"
47
+ },
48
+ {
49
+ id: "x402_core_e2e_suite",
50
+ command:
51
+ "node --test test/api-e2e-x402-authorize-payment.test.js test/api-e2e-x402-receipts.test.js test/api-e2e-x402-gate-reversal.test.js test/api-e2e-x402-wallet-issuer.test.js test/api-e2e-x402-provider-signature.test.js test/x402-gateway-autopay.test.js test/x402-receipt-verifier.test.js test/x402-receipt-store.test.js test/x402-wallet-issuer-decision.test.js test/x402-provider-refund-decision.test.js test/x402-reversal-command.test.js"
52
+ },
53
+ {
54
+ id: "api_sdk_contract_suite",
55
+ command:
56
+ "node --test test/api-r1-contract-freeze.test.js test/api-sdk-contract-freeze.test.js test/api-openapi.test.js"
57
+ }
58
+ ];
59
+
60
+ if (runQuickstart) {
61
+ checks.push({
62
+ id: "x402_quickstart_smoke",
63
+ command: "SETTLD_QUICKSTART_KEEP_ALIVE=0 npm run -s quickstart:x402"
64
+ });
65
+ }
66
+
67
+ const startedAt = Date.now();
68
+ const results = [];
69
+ for (const check of checks) {
70
+ const result = await runCheck(check, process.env);
71
+ results.push(result);
72
+ if (!result.ok) break;
73
+ }
74
+
75
+ const passedChecks = results.filter((row) => row.ok).length;
76
+ const allPassed = passedChecks === checks.length;
77
+ const report = {
78
+ schemaVersion: "KernelV0ShipGateReport.v1",
79
+ generatedAt: new Date().toISOString(),
80
+ durationMs: Date.now() - startedAt,
81
+ checks: results,
82
+ verdict: {
83
+ ok: allPassed,
84
+ requiredChecks: checks.length,
85
+ passedChecks
86
+ }
87
+ };
88
+
89
+ await writeFile(reportPath, JSON.stringify(report, null, 2) + "\n", "utf8");
90
+ process.stdout.write(`wrote kernel v0 ship gate report: ${reportPath}\n`);
91
+ if (!allPassed) process.exitCode = 1;
92
+ }
93
+
94
+ main().catch((err) => {
95
+ process.stderr.write(`${err?.stack || err?.message || String(err)}\n`);
96
+ process.exit(1);
97
+ });
@@ -0,0 +1,201 @@
1
+ #!/usr/bin/env node
2
+ import fs from "node:fs/promises";
3
+ import os from "node:os";
4
+ import path from "node:path";
5
+ import { runHostConfigSetup, SUPPORTED_HOSTS } from "../setup/host-config.mjs";
6
+
7
+ const REPORT_SCHEMA_VERSION = "SettldMcpHostCertMatrix.v1";
8
+ const DEFAULT_REPORT_PATH = path.resolve(process.cwd(), "artifacts/ops/mcp-host-cert-matrix.json");
9
+
10
+ function parseArgs(argv) {
11
+ const out = { reportPath: DEFAULT_REPORT_PATH };
12
+ for (let i = 0; i < argv.length; i += 1) {
13
+ const arg = String(argv[i] ?? "").trim();
14
+ if (!arg) continue;
15
+ if (arg === "--report") {
16
+ out.reportPath = path.resolve(process.cwd(), String(argv[i + 1] ?? "").trim());
17
+ i += 1;
18
+ continue;
19
+ }
20
+ if (arg === "--help" || arg === "-h") {
21
+ out.help = true;
22
+ continue;
23
+ }
24
+ throw new Error(`unknown argument: ${arg}`);
25
+ }
26
+ return out;
27
+ }
28
+
29
+ function getServerNode(config, host) {
30
+ if (config && typeof config === "object") {
31
+ if (config.mcpServers && typeof config.mcpServers === "object" && config.mcpServers.settld) return config.mcpServers.settld;
32
+ if (config.servers && typeof config.servers === "object" && config.servers.settld) return config.servers.settld;
33
+ if (host === "openclaw" && typeof config.command === "string") return config;
34
+ }
35
+ return null;
36
+ }
37
+
38
+ function normalizeErrorCode(err) {
39
+ return typeof err?.code === "string" && err.code.trim() ? err.code.trim() : "ERROR";
40
+ }
41
+
42
+ async function runFailClosedBypassChecks({ host, configPath, env }) {
43
+ const checks = [];
44
+ const scenarios = [
45
+ {
46
+ id: "reject_missing_api_key",
47
+ expectedCode: "MISSING_ENV",
48
+ expectedMessageIncludes: "SETTLD_API_KEY",
49
+ buildEnv: () => {
50
+ const next = { ...env };
51
+ delete next.SETTLD_API_KEY;
52
+ return next;
53
+ }
54
+ },
55
+ {
56
+ id: "reject_invalid_base_url",
57
+ expectedCode: "INVALID_ENV",
58
+ expectedMessageIncludes: "SETTLD_BASE_URL must be a valid http(s) URL",
59
+ buildEnv: () => ({
60
+ ...env,
61
+ SETTLD_BASE_URL: "ftp://127.0.0.1:3000"
62
+ })
63
+ }
64
+ ];
65
+
66
+ for (const scenario of scenarios) {
67
+ try {
68
+ await runHostConfigSetup({
69
+ host,
70
+ configPath,
71
+ dryRun: true,
72
+ env: scenario.buildEnv()
73
+ });
74
+ checks.push({
75
+ id: scenario.id,
76
+ ok: false,
77
+ detail: "host config setup unexpectedly succeeded"
78
+ });
79
+ } catch (err) {
80
+ const observedCode = normalizeErrorCode(err);
81
+ const observedMessage = err?.message ?? String(err);
82
+ const matchesCode = observedCode === scenario.expectedCode;
83
+ const matchesMessage = observedMessage.includes(scenario.expectedMessageIncludes);
84
+ checks.push({
85
+ id: scenario.id,
86
+ ok: matchesCode && matchesMessage,
87
+ expectedCode: scenario.expectedCode,
88
+ observedCode,
89
+ observedMessage
90
+ });
91
+ }
92
+ }
93
+
94
+ return checks;
95
+ }
96
+
97
+ async function certHost({ host, rootDir }) {
98
+ const configPath = path.join(rootDir, `${host}.json`);
99
+ const env = {
100
+ SETTLD_BASE_URL: "http://127.0.0.1:3000",
101
+ SETTLD_TENANT_ID: "tenant_default",
102
+ SETTLD_API_KEY: "key_test.secret_test",
103
+ SETTLD_PAID_TOOLS_BASE_URL: "http://127.0.0.1:3005",
104
+ SETTLD_PAID_TOOLS_AGENT_PASSPORT: JSON.stringify({
105
+ schemaVersion: "X402AgentPassport.v1",
106
+ sponsorRef: "sponsor_local",
107
+ sponsorWalletRef: "wallet_local",
108
+ agentKeyId: "agent_key_local",
109
+ policyRef: "policy_local",
110
+ policyVersion: 1,
111
+ delegationDepth: 0
112
+ })
113
+ };
114
+
115
+ const first = await runHostConfigSetup({ host, configPath, dryRun: false, env });
116
+ const second = await runHostConfigSetup({ host, configPath, dryRun: false, env });
117
+
118
+ const parsed = JSON.parse(await fs.readFile(configPath, "utf8"));
119
+ const server = getServerNode(parsed, host);
120
+ if (!server || typeof server !== "object") {
121
+ throw new Error(`missing settld server entry for host ${host}`);
122
+ }
123
+ const envKeys = Object.keys(server.env ?? {});
124
+ if (!envKeys.includes("SETTLD_BASE_URL") || !envKeys.includes("SETTLD_TENANT_ID") || !envKeys.includes("SETTLD_API_KEY")) {
125
+ throw new Error(`incomplete env projection for host ${host}`);
126
+ }
127
+ if (second.changed !== false) {
128
+ throw new Error(`host config setup is not idempotent for host ${host} (second pass changed=true)`);
129
+ }
130
+
131
+ const bypassChecks = await runFailClosedBypassChecks({ host, configPath, env });
132
+ const bypassFailures = bypassChecks.filter((check) => check.ok !== true);
133
+ if (bypassFailures.length) {
134
+ const err = new Error(`host bridge bypass checks failed for host ${host}`);
135
+ err.details = {
136
+ bypassChecks
137
+ };
138
+ throw err;
139
+ }
140
+
141
+ return {
142
+ host,
143
+ ok: true,
144
+ configPath,
145
+ keyPath: first.keyPath,
146
+ firstChanged: first.changed,
147
+ secondChanged: second.changed,
148
+ envKeys,
149
+ bypassChecks
150
+ };
151
+ }
152
+
153
+ async function main() {
154
+ const args = parseArgs(process.argv.slice(2));
155
+ if (args.help) {
156
+ process.stdout.write("usage:\n");
157
+ process.stdout.write(" node scripts/ci/run-mcp-host-cert-matrix.mjs [--report <path>]\n");
158
+ return;
159
+ }
160
+
161
+ const tempRoot = await fs.mkdtemp(path.join(os.tmpdir(), "settld-mcp-host-cert-"));
162
+ const checks = [];
163
+ let ok = true;
164
+
165
+ try {
166
+ for (const host of SUPPORTED_HOSTS) {
167
+ try {
168
+ const row = await certHost({ host, rootDir: tempRoot });
169
+ checks.push(row);
170
+ } catch (err) {
171
+ ok = false;
172
+ checks.push({
173
+ host,
174
+ ok: false,
175
+ error: err?.message ?? String(err),
176
+ details: err?.details ?? null
177
+ });
178
+ }
179
+ }
180
+ } finally {
181
+ await fs.rm(tempRoot, { recursive: true, force: true });
182
+ }
183
+
184
+ const report = {
185
+ schemaVersion: REPORT_SCHEMA_VERSION,
186
+ generatedAt: new Date().toISOString(),
187
+ ok,
188
+ checks
189
+ };
190
+
191
+ await fs.mkdir(path.dirname(args.reportPath), { recursive: true });
192
+ await fs.writeFile(args.reportPath, JSON.stringify(report, null, 2) + "\n", "utf8");
193
+
194
+ process.stdout.write(JSON.stringify({ ok, reportPath: args.reportPath }, null, 2) + "\n");
195
+ if (!ok) process.exitCode = 1;
196
+ }
197
+
198
+ main().catch((err) => {
199
+ process.stderr.write(`${err?.stack ?? err?.message ?? String(err)}\n`);
200
+ process.exit(1);
201
+ });