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,454 @@
1
+ import { execFileSync, spawnSync } from "node:child_process";
2
+ import fs from "node:fs/promises";
3
+ import os from "node:os";
4
+ import path from "node:path";
5
+
6
+ function sh(cmd, args, { cwd, env } = {}) {
7
+ const isWin = process.platform === "win32";
8
+ const resolvedCmd = cmd;
9
+ // On Windows runners, invoking npm via a shell is more reliable than trying to exec a .cmd shim directly.
10
+ const res = spawnSync(resolvedCmd, args, { cwd, env, encoding: "utf8", shell: isWin && cmd === "npm" });
11
+ if (res.status !== 0) {
12
+ const err = (res.stderr || res.stdout || res.error?.message || "").trim();
13
+ throw new Error(`${resolvedCmd} ${args.join(" ")} failed (exit ${res.status})${err ? `: ${err}` : ""}`);
14
+ }
15
+ return res.stdout;
16
+ }
17
+
18
+ function nodeCli({ cliJs, cwd, env, args }) {
19
+ if (typeof cliJs !== "string" || cliJs.trim() === "") throw new TypeError("cliJs is required");
20
+ const res = spawnSync(process.execPath, [cliJs, ...args], { cwd, env, encoding: "utf8" });
21
+ if (res.status !== 0) {
22
+ const err = (res.stderr || res.stdout || res.error?.message || "").trim();
23
+ throw new Error(`node ${cliJs} ${args.join(" ")} failed (exit ${res.status})${err ? `: ${err}` : ""}`);
24
+ }
25
+ return res.stdout;
26
+ }
27
+
28
+ function nodeEvalModule({ cwd, env, source }) {
29
+ if (typeof source !== "string" || source.trim() === "") throw new TypeError("source is required");
30
+ const res = spawnSync(process.execPath, ["--input-type=module", "-e", source], { cwd, env, encoding: "utf8" });
31
+ if (res.status !== 0) {
32
+ const err = (res.stderr || res.stdout || res.error?.message || "").trim();
33
+ throw new Error(`node --input-type=module -e <source> failed (exit ${res.status})${err ? `: ${err}` : ""}`);
34
+ }
35
+ return res.stdout;
36
+ }
37
+
38
+ async function main() {
39
+ const repoRoot = process.cwd();
40
+ const verifyPkgDir = path.resolve(repoRoot, "packages", "artifact-verify");
41
+ const producePkgDir = path.resolve(repoRoot, "packages", "artifact-produce");
42
+ const providerKitPkgDir = path.resolve(repoRoot, "packages", "provider-kit");
43
+ const paidToolScaffoldPkgDir = path.resolve(repoRoot, "packages", "create-settld-paid-tool");
44
+
45
+ const outDir = await fs.mkdtemp(path.join(os.tmpdir(), "settld-pack-"));
46
+ const installDir = await fs.mkdtemp(path.join(os.tmpdir(), "settld-install-"));
47
+ const npmCacheDir = await fs.mkdtemp(path.join(os.tmpdir(), "settld-npm-cache-"));
48
+
49
+ try {
50
+ // Force npm cache/log writes into /tmp so CI-like sandboxes don't block ~/.npm.
51
+ const npmEnv = {
52
+ ...process.env,
53
+ NPM_CONFIG_CACHE: npmCacheDir,
54
+ npm_config_cache: npmCacheDir,
55
+ npm_config_update_notifier: "false"
56
+ };
57
+
58
+ sh("npm", ["pack", "--pack-destination", outDir], { cwd: verifyPkgDir, env: npmEnv });
59
+ sh("npm", ["pack", "--pack-destination", outDir], { cwd: producePkgDir, env: npmEnv });
60
+ sh("npm", ["pack", "--pack-destination", outDir], { cwd: providerKitPkgDir, env: npmEnv });
61
+ sh("npm", ["pack", "--pack-destination", outDir], { cwd: paidToolScaffoldPkgDir, env: npmEnv });
62
+ const packed = (await fs.readdir(outDir)).filter((n) => n.endsWith(".tgz"));
63
+ if (!packed.length) throw new Error("npm pack did not produce a .tgz in pack destination");
64
+ const verifyCandidates = packed.filter((n) => n.startsWith("settld-artifact-verify-"));
65
+ const produceCandidates = packed.filter((n) => n.startsWith("settld-artifact-produce-"));
66
+ const providerKitCandidates = packed.filter((n) => n.startsWith("settld-provider-kit-"));
67
+ const paidToolScaffoldCandidates = packed.filter((n) => n.startsWith("create-settld-paid-tool-"));
68
+ if (!verifyCandidates.length) throw new Error("expected settld-artifact-verify-*.tgz in pack destination");
69
+ if (!produceCandidates.length) throw new Error("expected settld-artifact-produce-*.tgz in pack destination");
70
+ if (!providerKitCandidates.length) throw new Error("expected settld-provider-kit-*.tgz in pack destination");
71
+ if (!paidToolScaffoldCandidates.length) throw new Error("expected create-settld-paid-tool-*.tgz in pack destination");
72
+ const verifyTarball = path.join(outDir, verifyCandidates[0]);
73
+ const produceTarball = path.join(outDir, produceCandidates[0]);
74
+ const providerKitTarball = path.join(outDir, providerKitCandidates[0]);
75
+ const paidToolScaffoldTarball = path.join(outDir, paidToolScaffoldCandidates[0]);
76
+
77
+ sh("npm", ["init", "-y"], { cwd: installDir, env: npmEnv });
78
+ sh("npm", ["install", "--silent", verifyTarball, produceTarball, providerKitTarball, paidToolScaffoldTarball], {
79
+ cwd: installDir,
80
+ env: npmEnv
81
+ });
82
+
83
+ const verifyCliJs = path.join(installDir, "node_modules", "settld-artifact-verify", "bin", "settld-verify.js");
84
+ const produceCliJs = path.join(installDir, "node_modules", "settld-artifact-produce", "bin", "settld-produce.js");
85
+ const trustCliJs = path.join(installDir, "node_modules", "settld-artifact-produce", "bin", "settld-trust.js");
86
+
87
+ const ver = nodeCli({ cliJs: verifyCliJs, cwd: installDir, env: npmEnv, args: ["--version"] }).trim();
88
+ if (!/^[0-9]+\.[0-9]+\.[0-9]+(-[0-9A-Za-z-.]+)?$/.test(ver)) {
89
+ throw new Error(`unexpected --version output: ${JSON.stringify(ver)}`);
90
+ }
91
+ const prodVer = nodeCli({ cliJs: produceCliJs, cwd: installDir, env: npmEnv, args: ["--version"] }).trim();
92
+ if (!/^[0-9]+\.[0-9]+\.[0-9]+(-[0-9A-Za-z-.]+)?$/.test(prodVer)) {
93
+ throw new Error(`unexpected settld-produce --version output: ${JSON.stringify(prodVer)}`);
94
+ }
95
+ const trustVer = nodeCli({ cliJs: trustCliJs, cwd: installDir, env: npmEnv, args: ["--version"] }).trim();
96
+ if (!/^[0-9]+\.[0-9]+\.[0-9]+(-[0-9A-Za-z-.]+)?$/.test(trustVer)) {
97
+ throw new Error(`unexpected settld-trust --version output: ${JSON.stringify(trustVer)}`);
98
+ }
99
+ nodeEvalModule({
100
+ cwd: installDir,
101
+ env: npmEnv,
102
+ source: [
103
+ "import * as kit from '@settld/provider-kit';",
104
+ "const exportsToCheck = [",
105
+ " 'createSettldPaidNodeHttpHandler',",
106
+ " 'createSettldPayKeysetResolver',",
107
+ " 'createInMemoryReplayStore',",
108
+ " 'parseSettldPayAuthorizationHeader',",
109
+ " 'buildPaymentRequiredHeaderValue'",
110
+ "];",
111
+ "for (const name of exportsToCheck) {",
112
+ " if (typeof kit[name] !== 'function') throw new Error(`missing export: ${name}`);",
113
+ "}"
114
+ ].join("\n")
115
+ });
116
+
117
+ const scaffoldOutDir = path.join(installDir, "scaffold-smoke");
118
+ sh("npm", ["exec", "--yes", "--", "create-settld-paid-tool", scaffoldOutDir, "--provider-id", "prov_smoke_pack"], {
119
+ cwd: installDir,
120
+ env: npmEnv
121
+ });
122
+ const scaffoldPackageJson = JSON.parse(await fs.readFile(path.join(scaffoldOutDir, "package.json"), "utf8"));
123
+ if (scaffoldPackageJson?.dependencies?.["@settld/provider-kit"] !== "latest") {
124
+ throw new Error("scaffolded package.json missing @settld/provider-kit dependency");
125
+ }
126
+ await fs.access(path.join(scaffoldOutDir, "server.mjs"));
127
+ await fs.access(path.join(scaffoldOutDir, ".env.example"));
128
+
129
+ // Producer bootstrap: init trust + produce bundles + strict verify them using the installed packages.
130
+ const trustOutDir = await fs.mkdtemp(path.join(os.tmpdir(), "settld-trust-init-"));
131
+ const trustInitRaw = nodeCli({
132
+ cliJs: trustCliJs,
133
+ cwd: installDir,
134
+ env: npmEnv,
135
+ args: ["init", "--format", "json", "--out", trustOutDir, "--force"]
136
+ });
137
+ const trustInit = JSON.parse(trustInitRaw);
138
+ if (trustInit?.schemaVersion !== "TrustInitOutput.v1") throw new Error("settld-trust init returned unexpected JSON");
139
+ const trust = JSON.parse(await fs.readFile(trustInit.trustPath, "utf8"));
140
+ const producedEnv = {
141
+ ...npmEnv,
142
+ SETTLD_TRUSTED_GOVERNANCE_ROOT_KEYS_JSON: JSON.stringify(trust.governanceRoots ?? {}),
143
+ SETTLD_TRUSTED_TIME_AUTHORITY_KEYS_JSON: JSON.stringify(trust.timeAuthorities ?? {})
144
+ };
145
+
146
+ const tmpOut = await fs.mkdtemp(path.join(os.tmpdir(), "settld-produce-"));
147
+ const jobBundle = path.join(tmpOut, "jobproof");
148
+ const monthBundle = path.join(tmpOut, "monthproof");
149
+ const financeBundle = path.join(tmpOut, "financepack");
150
+
151
+ const prodJob = nodeCli({
152
+ cliJs: produceCliJs,
153
+ cwd: installDir,
154
+ env: npmEnv,
155
+ args: ["jobproof", "--format", "json", "--deterministic", "--force", "--out", jobBundle, "--keys", trustInit.keypairsPath]
156
+ });
157
+ const prodJobJson = JSON.parse(prodJob);
158
+ if (prodJobJson?.schemaVersion !== "ProduceCliOutput.v1") throw new Error("settld-produce jobproof did not return ProduceCliOutput.v1");
159
+ if (prodJobJson?.ok !== true) throw new Error(`settld-produce jobproof failed: ${JSON.stringify(prodJobJson)}`);
160
+
161
+ const verifyJob = nodeCli({
162
+ cliJs: verifyCliJs,
163
+ cwd: installDir,
164
+ env: producedEnv,
165
+ args: ["--format", "json", "--strict", "--hash-concurrency", "4", "--job-proof", jobBundle]
166
+ });
167
+ const verifyJobJson = JSON.parse(verifyJob);
168
+ if (verifyJobJson?.ok !== true) throw new Error("installed settld-verify failed produced jobproof bundle verification");
169
+
170
+ // Delegated signing smoke: run a dev remote signer (holds private keys in a separate process),
171
+ // init trust in remote-only mode, and produce a jobproof bundle using --signer remote.
172
+ const kp = JSON.parse(await fs.readFile(trustInit.keypairsPath, "utf8"));
173
+ const govKeyId = String(kp?.govRoot?.keyId ?? "");
174
+ const serverKeyId = String(kp?.serverA?.keyId ?? "");
175
+ if (!govKeyId || !serverKeyId) throw new Error("missing govRoot/serverA key ids in keypairs.json");
176
+
177
+ const signerDevJs = path.join(installDir, "node_modules", "settld-artifact-produce", "bin", "settld-signer-dev.js");
178
+ const signerCommand = process.execPath;
179
+ const signerArgsJson = JSON.stringify([signerDevJs, "--stdio", "--keys", trustInit.keypairsPath]);
180
+
181
+ const remoteTrustDir = await fs.mkdtemp(path.join(os.tmpdir(), "settld-trust-remote-"));
182
+ const remoteTrustRaw = nodeCli({
183
+ cliJs: trustCliJs,
184
+ cwd: installDir,
185
+ env: npmEnv,
186
+ args: [
187
+ "init",
188
+ "--mode",
189
+ "remote-only",
190
+ "--out",
191
+ remoteTrustDir,
192
+ "--signer-command",
193
+ signerCommand,
194
+ "--signer-args-json",
195
+ signerArgsJson,
196
+ "--governance-root-key-id",
197
+ govKeyId,
198
+ "--format",
199
+ "json",
200
+ "--force"
201
+ ]
202
+ });
203
+ const remoteTrust = JSON.parse(remoteTrustRaw);
204
+ const trustRemote = JSON.parse(await fs.readFile(remoteTrust.trustPath, "utf8"));
205
+ const remoteEnv = {
206
+ ...npmEnv,
207
+ SETTLD_TRUSTED_GOVERNANCE_ROOT_KEYS_JSON: JSON.stringify(trustRemote.governanceRoots ?? {}),
208
+ SETTLD_TRUSTED_TIME_AUTHORITY_KEYS_JSON: JSON.stringify(trustRemote.timeAuthorities ?? {})
209
+ };
210
+
211
+ const jobBundleRemote = path.join(tmpOut, "jobproof-remote");
212
+ const prodJobRemote = nodeCli({
213
+ cliJs: produceCliJs,
214
+ cwd: installDir,
215
+ env: npmEnv,
216
+ args: [
217
+ "jobproof",
218
+ "--format",
219
+ "json",
220
+ "--deterministic",
221
+ "--force",
222
+ "--out",
223
+ jobBundleRemote,
224
+ "--signer",
225
+ "remote",
226
+ "--signer-command",
227
+ signerCommand,
228
+ "--signer-args-json",
229
+ signerArgsJson,
230
+ "--gov-key-id",
231
+ govKeyId,
232
+ "--server-key-id",
233
+ serverKeyId
234
+ ]
235
+ });
236
+ const prodJobRemoteJson = JSON.parse(prodJobRemote);
237
+ if (prodJobRemoteJson?.ok !== true) throw new Error("settld-produce jobproof remote signer failed");
238
+
239
+ const verifyJobRemote = nodeCli({
240
+ cliJs: verifyCliJs,
241
+ cwd: installDir,
242
+ env: remoteEnv,
243
+ args: ["--format", "json", "--strict", "--hash-concurrency", "4", "--job-proof", jobBundleRemote]
244
+ });
245
+ const verifyJobRemoteJson = JSON.parse(verifyJobRemote);
246
+ if (verifyJobRemoteJson?.ok !== true) throw new Error("installed settld-verify failed remote-signed jobproof verification");
247
+
248
+ // Plugin signer smoke: load a signer provider via a local plugin file (no private keys in Settld core).
249
+ const pluginCfgDir = await fs.mkdtemp(path.join(os.tmpdir(), "settld-plugin-cfg-"));
250
+ const pluginCfgPath = path.join(pluginCfgDir, "config.json");
251
+ await fs.writeFile(pluginCfgPath, JSON.stringify({ keypairsPath: trustInit.keypairsPath }, null, 2) + "\n", "utf8");
252
+ const pluginPath = path.join(pluginCfgDir, "plugin.mjs");
253
+ await fs.writeFile(
254
+ pluginPath,
255
+ [
256
+ "import fs from 'node:fs/promises';",
257
+ "import path from 'node:path';",
258
+ "import { sign as nodeSign } from 'node:crypto';",
259
+ "",
260
+ "export async function createSignerProvider({ config } = {}) {",
261
+ " const abs = path.resolve(process.cwd(), config.keypairsPath);",
262
+ " const kp = JSON.parse(await fs.readFile(abs, 'utf8'));",
263
+ " const byKeyId = new Map();",
264
+ " for (const v of Object.values(kp ?? {})) {",
265
+ " if (!v?.keyId || !v?.publicKeyPem || !v?.privateKeyPem) continue;",
266
+ " byKeyId.set(v.keyId, v);",
267
+ " }",
268
+ " return {",
269
+ " async getPublicKeyPem({ keyId }) {",
270
+ " const r = byKeyId.get(keyId);",
271
+ " if (!r) throw new Error('unknown keyId');",
272
+ " return r.publicKeyPem;",
273
+ " },",
274
+ " async sign({ keyId, algorithm, messageBytes }) {",
275
+ " const r = byKeyId.get(keyId);",
276
+ " if (!r) throw new Error('unknown keyId');",
277
+ " if (algorithm !== 'ed25519') throw new Error('unsupported algorithm');",
278
+ " const sig = nodeSign(null, Buffer.from(messageBytes), r.privateKeyPem).toString('base64');",
279
+ " return { signatureBase64: sig };",
280
+ " }",
281
+ " };",
282
+ "}",
283
+ ""
284
+ ].join("\n"),
285
+ "utf8"
286
+ );
287
+
288
+ const jobBundlePlugin = path.join(tmpOut, "jobproof-plugin");
289
+ const prodJobPlugin = nodeCli({
290
+ cliJs: produceCliJs,
291
+ cwd: installDir,
292
+ env: npmEnv,
293
+ args: [
294
+ "jobproof",
295
+ "--format",
296
+ "json",
297
+ "--deterministic",
298
+ "--force",
299
+ "--out",
300
+ jobBundlePlugin,
301
+ "--signer",
302
+ "plugin",
303
+ "--signer-plugin",
304
+ pluginPath,
305
+ "--signer-plugin-config",
306
+ pluginCfgPath,
307
+ "--gov-key-id",
308
+ govKeyId,
309
+ "--server-key-id",
310
+ serverKeyId
311
+ ]
312
+ });
313
+ const prodJobPluginJson = JSON.parse(prodJobPlugin);
314
+ if (prodJobPluginJson?.ok !== true) throw new Error("settld-produce jobproof plugin signer failed");
315
+
316
+ const verifyJobPlugin = nodeCli({
317
+ cliJs: verifyCliJs,
318
+ cwd: installDir,
319
+ env: producedEnv,
320
+ args: ["--format", "json", "--strict", "--hash-concurrency", "4", "--job-proof", jobBundlePlugin]
321
+ });
322
+ const verifyJobPluginJson = JSON.parse(verifyJobPlugin);
323
+ if (verifyJobPluginJson?.ok !== true) throw new Error("installed settld-verify failed plugin-signed jobproof verification");
324
+
325
+ const prodMonth = nodeCli({
326
+ cliJs: produceCliJs,
327
+ cwd: installDir,
328
+ env: npmEnv,
329
+ args: [
330
+ "monthproof",
331
+ "--format",
332
+ "json",
333
+ "--deterministic",
334
+ "--force",
335
+ "--out",
336
+ monthBundle,
337
+ "--keys",
338
+ trustInit.keypairsPath,
339
+ "--tenant",
340
+ "tenant_default",
341
+ "--period",
342
+ "1970-01",
343
+ "--basis",
344
+ "settledAt"
345
+ ]
346
+ });
347
+ const prodMonthJson = JSON.parse(prodMonth);
348
+ if (prodMonthJson?.ok !== true) throw new Error("settld-produce monthproof failed");
349
+
350
+ const verifyMonth = nodeCli({
351
+ cliJs: verifyCliJs,
352
+ cwd: installDir,
353
+ env: producedEnv,
354
+ args: ["--format", "json", "--strict", "--hash-concurrency", "4", "--month-proof", monthBundle]
355
+ });
356
+ const verifyMonthJson = JSON.parse(verifyMonth);
357
+ if (verifyMonthJson?.ok !== true) throw new Error("installed settld-verify failed produced monthproof bundle verification");
358
+
359
+ const prodFin = nodeCli({
360
+ cliJs: produceCliJs,
361
+ cwd: installDir,
362
+ env: npmEnv,
363
+ args: [
364
+ "financepack",
365
+ "--format",
366
+ "json",
367
+ "--deterministic",
368
+ "--force",
369
+ "--out",
370
+ financeBundle,
371
+ "--keys",
372
+ trustInit.keypairsPath,
373
+ "--monthproof",
374
+ monthBundle,
375
+ "--tenant",
376
+ "tenant_default",
377
+ "--period",
378
+ "1970-01",
379
+ "--protocol",
380
+ "1.0"
381
+ ]
382
+ });
383
+ const prodFinJson = JSON.parse(prodFin);
384
+ if (prodFinJson?.ok !== true) throw new Error("settld-produce financepack failed");
385
+
386
+ const verifyFin = nodeCli({
387
+ cliJs: verifyCliJs,
388
+ cwd: installDir,
389
+ env: producedEnv,
390
+ args: ["--format", "json", "--strict", "--hash-concurrency", "4", "--finance-pack", financeBundle]
391
+ });
392
+ const verifyFinJson = JSON.parse(verifyFin);
393
+ if (verifyFinJson?.ok !== true) throw new Error("installed settld-verify failed produced financepack bundle verification");
394
+
395
+ // Fixture/conformance trust roots (these bundles are signed by fixture keys, not the bootstrap keys).
396
+ const fixtureTrustPath = path.resolve(repoRoot, "test", "fixtures", "bundles", "v1", "trust.json");
397
+ const fixtureTrust = JSON.parse(await fs.readFile(fixtureTrustPath, "utf8"));
398
+ const fixtureEnv = {
399
+ ...npmEnv,
400
+ SETTLD_TRUSTED_GOVERNANCE_ROOT_KEYS_JSON: JSON.stringify(fixtureTrust.governanceRoots ?? {}),
401
+ SETTLD_TRUSTED_PRICING_SIGNER_KEYS_JSON: JSON.stringify(fixtureTrust.pricingSigners ?? {}),
402
+ SETTLD_TRUSTED_TIME_AUTHORITY_KEYS_JSON: JSON.stringify(fixtureTrust.timeAuthorities ?? {})
403
+ };
404
+
405
+ const fixtureDir = path.resolve(repoRoot, "test", "fixtures", "bundles", "v1", "jobproof", "strict-pass");
406
+ const verifyOut = nodeCli({
407
+ cliJs: verifyCliJs,
408
+ cwd: installDir,
409
+ env: fixtureEnv,
410
+ args: ["--format", "json", "--strict", "--hash-concurrency", "4", "--job-proof", fixtureDir]
411
+ });
412
+ const parsed = JSON.parse(verifyOut);
413
+ if (!parsed || typeof parsed !== "object") throw new Error("verify output was not JSON object");
414
+ if (parsed.ok !== true) throw new Error(`installed settld-verify failed fixture verification: ${JSON.stringify(parsed)}`);
415
+
416
+ // Conformance must run against the installed package bits (not repo-relative JS entrypoint).
417
+ const installedCliJs = path.join(installDir, "node_modules", "settld-artifact-verify", "bin", "settld-verify.js");
418
+ const conf = spawnSync(process.execPath, [path.resolve(repoRoot, "conformance", "v1", "run.mjs"), "--node-bin", installedCliJs], {
419
+ cwd: repoRoot,
420
+ env: fixtureEnv,
421
+ encoding: "utf8"
422
+ });
423
+ if (conf.status !== 0) {
424
+ throw new Error(`conformance failed against installed package\n\nstdout:\n${conf.stdout}\n\nstderr:\n${conf.stderr}`);
425
+ }
426
+
427
+ // Producer conformance must also run against installed package bits.
428
+ const installedProduceJs = path.join(installDir, "node_modules", "settld-artifact-produce", "bin", "settld-produce.js");
429
+ const confProduce = spawnSync(
430
+ process.execPath,
431
+ [
432
+ path.resolve(repoRoot, "conformance", "v1", "run-produce.mjs"),
433
+ "--produce-node-bin",
434
+ installedProduceJs,
435
+ "--verify-node-bin",
436
+ installedCliJs
437
+ ],
438
+ {
439
+ cwd: repoRoot,
440
+ env: fixtureEnv,
441
+ encoding: "utf8"
442
+ }
443
+ );
444
+ if (confProduce.status !== 0) {
445
+ throw new Error(`producer conformance failed against installed package\n\nstdout:\n${confProduce.stdout}\n\nstderr:\n${confProduce.stderr}`);
446
+ }
447
+ } finally {
448
+ await fs.rm(outDir, { recursive: true, force: true });
449
+ await fs.rm(installDir, { recursive: true, force: true });
450
+ await fs.rm(npmCacheDir, { recursive: true, force: true });
451
+ }
452
+ }
453
+
454
+ await main();