settld 0.1.1 → 0.1.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (441) hide show
  1. package/README.md +61 -3
  2. package/SETTLD_VERSION +1 -1
  3. package/bin/settld-mcp +2 -0
  4. package/bin/settld.js +13 -0
  5. package/conformance/kernel-v0/README.md +7 -0
  6. package/conformance/kernel-v0/run.mjs +292 -4
  7. package/docs/ACCESS.md +57 -0
  8. package/docs/ADOPTION_CHECKLIST.md +44 -0
  9. package/docs/ALERTS.md +198 -0
  10. package/docs/ARCHITECTURE.md +69 -0
  11. package/docs/ARCHITECTURE_FOUNDER_GUIDE.md +284 -0
  12. package/docs/ARTIFACTS.md +60 -0
  13. package/docs/CERTIFICATION_CHECKLIST.md +33 -0
  14. package/docs/CIRCLE_SANDBOX_E2E.md +140 -0
  15. package/docs/CONFIG.md +297 -0
  16. package/docs/CONTRACTS_APIS.md +23 -0
  17. package/docs/DEPRECATION.md +31 -0
  18. package/docs/DOMAIN_MODEL.md +92 -0
  19. package/docs/EVENT_ENVELOPE.md +53 -0
  20. package/docs/FINANCE_PACK_FORMAT.md +53 -0
  21. package/docs/INCIDENT_TAXONOMY.md +30 -0
  22. package/docs/JOB_STATE_MACHINE.md +66 -0
  23. package/docs/KERNEL_COMPATIBLE.md +60 -0
  24. package/docs/KERNEL_V0.md +40 -0
  25. package/docs/KEY_ROTATION.md +80 -0
  26. package/docs/LEDGER.md +82 -0
  27. package/docs/LIVENESS.md +76 -0
  28. package/docs/MVP_BUILD_ORDER.md +36 -0
  29. package/docs/ONCALL_PLAYBOOK.md +39 -0
  30. package/docs/OPERATIONS_SIGNING.md +20 -0
  31. package/docs/OVERVIEW.md +190 -0
  32. package/docs/PERF_BASELINE.md +85 -0
  33. package/docs/PRD.md +77 -0
  34. package/docs/QUICKSTART_KERNEL_V0.md +96 -0
  35. package/docs/QUICKSTART_MCP.md +337 -0
  36. package/docs/QUICKSTART_MCP_HOSTS.md +143 -0
  37. package/docs/QUICKSTART_PRODUCE.md +61 -0
  38. package/docs/QUICKSTART_RELEASE_VERIFY.md +39 -0
  39. package/docs/QUICKSTART_SDK.md +125 -0
  40. package/docs/QUICKSTART_SDK_PYTHON.md +111 -0
  41. package/docs/QUICKSTART_VERIFY.md +54 -0
  42. package/docs/QUICKSTART_X402_GATEWAY.md +317 -0
  43. package/docs/README.md +15 -0
  44. package/docs/RELEASE_CHECKLIST.md +156 -0
  45. package/docs/RELEASING.md +81 -0
  46. package/docs/REPO_SETTINGS.md +37 -0
  47. package/docs/RUNBOOK.md +86 -0
  48. package/docs/SKILLS.md +42 -0
  49. package/docs/SKILL_BUNDLE_FORMAT.md +48 -0
  50. package/docs/SLO.md +70 -0
  51. package/docs/SUMMARY.md +16 -0
  52. package/docs/SUPPORT.md +31 -0
  53. package/docs/THREAT_MODEL.md +36 -0
  54. package/docs/TRUST.md +59 -0
  55. package/docs/WORKFLOW.md +35 -0
  56. package/docs/X402_BATCH_SETTLEMENT.md +126 -0
  57. package/docs/blog/2026-02-14-your-ai-agent-just-spent-500-where-is-the-receipt.md +73 -0
  58. package/docs/examples/x402-provider-payout-registry.example.json +14 -0
  59. package/docs/gitbook/README.md +52 -0
  60. package/docs/gitbook/SETUP.md +25 -0
  61. package/docs/gitbook/SUMMARY.md +15 -0
  62. package/docs/gitbook/api-reference.md +73 -0
  63. package/docs/gitbook/closepacks.md +55 -0
  64. package/docs/gitbook/conformance.md +59 -0
  65. package/docs/gitbook/core-primitives.md +85 -0
  66. package/docs/gitbook/dispute-lifecycle.md +33 -0
  67. package/docs/gitbook/faq.md +21 -0
  68. package/docs/gitbook/guides.md +49 -0
  69. package/docs/gitbook/operations-runbook.md +36 -0
  70. package/docs/gitbook/quickstart.md +104 -0
  71. package/docs/gitbook/replay-and-audit.md +30 -0
  72. package/docs/gitbook/sdk-reference.md +35 -0
  73. package/docs/gitbook/security-model.md +58 -0
  74. package/docs/integrations/README.md +14 -0
  75. package/docs/integrations/github-actions-verify.yml +31 -0
  76. package/docs/integrations/github-actions.md +34 -0
  77. package/docs/integrations/openclaw/CLAWHUB_PUBLISH_CHECKLIST.md +65 -0
  78. package/docs/integrations/openclaw/settld-mcp-skill/SKILL.md +69 -0
  79. package/docs/integrations/openclaw/settld-mcp-skill/mcp-server.example.json +12 -0
  80. package/docs/kernel-compatible/capabilities.json +36 -0
  81. package/docs/marketing/agent-commerce-substrate.md +78 -0
  82. package/docs/marketing/hn-repost-2026-02-17.md +102 -0
  83. package/docs/marketing/show-hn-post.md +45 -0
  84. package/docs/ops/ARTIFACT_VERIFICATION_STATUS.md +43 -0
  85. package/docs/ops/BILLING_WEBHOOK_REPLAY.md +105 -0
  86. package/docs/ops/CI_FLAKE_BUDGET.md +31 -0
  87. package/docs/ops/GO_LIVE_GATE_S13.md +27 -0
  88. package/docs/ops/HOSTED_BASELINE_R2.md +129 -0
  89. package/docs/ops/KERNEL_V0_SHIP_GATE.md +67 -0
  90. package/docs/ops/LIGHTHOUSE_PRODUCTION_CLOSE.md +51 -0
  91. package/docs/ops/MCP_COMPATIBILITY_MATRIX.md +28 -0
  92. package/docs/ops/MINIMUM_PRODUCTION_TOPOLOGY.md +89 -0
  93. package/docs/ops/P0_BACKEND_PROGRESS.md +150 -0
  94. package/docs/ops/PAYMENTS_ALPHA_R5.md +105 -0
  95. package/docs/ops/PILOT_ONBOARDING_RUNBOOK.md +112 -0
  96. package/docs/ops/PRODUCTION_DEPLOYMENT_CHECKLIST.md +103 -0
  97. package/docs/ops/R1_SLOS.md +66 -0
  98. package/docs/ops/RELEASE_SIGNING_INCIDENT.md +58 -0
  99. package/docs/ops/SELF_SERVE_LAUNCH_AUTOMATION.md +89 -0
  100. package/docs/ops/THROUGHPUT_DRILL_10X.md +48 -0
  101. package/docs/ops/TRUST_CONFIG_WIZARD.md +47 -0
  102. package/docs/ops/X402_PILOT_WEEKLY_METRICS.md +76 -0
  103. package/docs/ops/tool-call-disputes-holdback.md +52 -0
  104. package/docs/pilot-kit/PILOT_PACKAGE_SCORECARD_X402.md +46 -0
  105. package/docs/pilot-kit/README.md +29 -0
  106. package/docs/pilot-kit/architecture-one-pager.md +48 -0
  107. package/docs/pilot-kit/buyer-email.txt +19 -0
  108. package/docs/pilot-kit/buyer-one-pager.md +31 -0
  109. package/docs/pilot-kit/gtm-pilot-playbook.md +182 -0
  110. package/docs/pilot-kit/offline-verify.md +33 -0
  111. package/docs/pilot-kit/procurement-one-pager.md +50 -0
  112. package/docs/pilot-kit/rfp-clause.md +46 -0
  113. package/docs/pilot-kit/roi-calculator-template.csv +2 -0
  114. package/docs/pilot-kit/security-qa.md +153 -0
  115. package/docs/pilot-kit/security-summary.md +35 -0
  116. package/docs/plans/2026-02-13-mcp-spike-design.md +113 -0
  117. package/docs/spec/AcceptanceCriteria.v1.md +17 -0
  118. package/docs/spec/AcceptanceEvaluation.v1.md +10 -0
  119. package/docs/spec/AgentEvent.v1.md +47 -0
  120. package/docs/spec/AgentIdentity.v1.md +62 -0
  121. package/docs/spec/AgentPassport.v1.md +95 -0
  122. package/docs/spec/AgentReputation.v1.md +59 -0
  123. package/docs/spec/AgentReputation.v2.md +52 -0
  124. package/docs/spec/AgentRun.v1.md +47 -0
  125. package/docs/spec/AgentRunSettlement.v1.md +52 -0
  126. package/docs/spec/AgentWallet.v1.md +43 -0
  127. package/docs/spec/AgreementDelegation.v1.md +109 -0
  128. package/docs/spec/ArbitrationCase.v1.md +67 -0
  129. package/docs/spec/ArbitrationVerdict.v1.md +60 -0
  130. package/docs/spec/BundleHeadAttestation.v1.md +32 -0
  131. package/docs/spec/CANONICAL_JSON.md +31 -0
  132. package/docs/spec/CRYPTOGRAPHY.md +61 -0
  133. package/docs/spec/ClosePack.v1.md +49 -0
  134. package/docs/spec/ClosePackManifest.v1.md +24 -0
  135. package/docs/spec/DelegationGrant.v1.md +90 -0
  136. package/docs/spec/DisputeOpenEnvelope.v1.md +43 -0
  137. package/docs/spec/ERRORS.md +76 -0
  138. package/docs/spec/ESCROW_NETTING_INVARIANTS.md +71 -0
  139. package/docs/spec/EvidenceIndex.v1.md +20 -0
  140. package/docs/spec/ExecutionIntent.v1.md +90 -0
  141. package/docs/spec/FinancePackBundleManifest.v1.md +24 -0
  142. package/docs/spec/FundingHold.v1.md +60 -0
  143. package/docs/spec/GovernancePolicy.v1.md +34 -0
  144. package/docs/spec/GovernancePolicy.v2.md +30 -0
  145. package/docs/spec/INVARIANTS.md +389 -0
  146. package/docs/spec/InteractionDirectionMatrix.v1.md +30 -0
  147. package/docs/spec/InvoiceBundleManifest.v1.md +24 -0
  148. package/docs/spec/InvoiceClaim.v1.md +11 -0
  149. package/docs/spec/MONEY_RAIL_STATE_MACHINE.md +58 -0
  150. package/docs/spec/MarketplaceAcceptance.v2.md +46 -0
  151. package/docs/spec/MarketplaceOffer.v2.md +54 -0
  152. package/docs/spec/MeteringReport.v1.md +18 -0
  153. package/docs/spec/PRODUCER_ERRORS.md +42 -0
  154. package/docs/spec/PricingMatrix.v1.md +20 -0
  155. package/docs/spec/PricingMatrixSignatures.v1.md +30 -0
  156. package/docs/spec/PricingMatrixSignatures.v2.md +29 -0
  157. package/docs/spec/ProduceCliOutput.v1.md +46 -0
  158. package/docs/spec/ProofBundleManifest.v1.md +24 -0
  159. package/docs/spec/README.md +104 -0
  160. package/docs/spec/REFERENCE_IMPLEMENTATIONS.md +29 -0
  161. package/docs/spec/REFERENCE_VERIFIER_BEHAVIOR.md +68 -0
  162. package/docs/spec/REMOTE_SIGNER.md +66 -0
  163. package/docs/spec/ReleaseIndex.v1.md +32 -0
  164. package/docs/spec/ReleaseIndexSignatures.v1.md +17 -0
  165. package/docs/spec/ReleaseTrust.v1.md +13 -0
  166. package/docs/spec/ReleaseTrust.v2.md +26 -0
  167. package/docs/spec/RemoteSignerRequest.v1.md +21 -0
  168. package/docs/spec/RemoteSignerResponse.v1.md +16 -0
  169. package/docs/spec/ReputationEvent.v1.md +63 -0
  170. package/docs/spec/RevocationList.v1.md +28 -0
  171. package/docs/spec/SIGNER_PROVIDER_PLUGIN.md +32 -0
  172. package/docs/spec/STRICTNESS.md +68 -0
  173. package/docs/spec/SUPPLY_CHAIN.md +33 -0
  174. package/docs/spec/SettlementAdjustment.v1.md +45 -0
  175. package/docs/spec/SettlementDecisionRecord.v1.md +48 -0
  176. package/docs/spec/SettlementDecisionRecord.v2.md +51 -0
  177. package/docs/spec/SettlementDecisionReport.v1.md +44 -0
  178. package/docs/spec/SettlementKernel.v1.md +59 -0
  179. package/docs/spec/SettlementReceipt.v1.md +63 -0
  180. package/docs/spec/SlaDefinition.v1.md +24 -0
  181. package/docs/spec/SlaEvaluation.v1.md +12 -0
  182. package/docs/spec/THREAT_MODEL.md +113 -0
  183. package/docs/spec/TOOL_PROVENANCE.md +30 -0
  184. package/docs/spec/TRUST_ANCHORS.md +84 -0
  185. package/docs/spec/TenantSettings.v1.md +90 -0
  186. package/docs/spec/TenantSettings.v2.md +99 -0
  187. package/docs/spec/TimestampProof.v1.md +25 -0
  188. package/docs/spec/ToolCallAgreement.v1.md +34 -0
  189. package/docs/spec/ToolCallEvidence.v1.md +47 -0
  190. package/docs/spec/ToolManifest.v1.md +47 -0
  191. package/docs/spec/VERIFIER_ENVIRONMENT.md +38 -0
  192. package/docs/spec/VERSIONING.md +107 -0
  193. package/docs/spec/VerificationReport.v1.md +50 -0
  194. package/docs/spec/VerifyAboutOutput.v1.md +10 -0
  195. package/docs/spec/VerifyCliOutput.v1.md +28 -0
  196. package/docs/spec/WARNINGS.md +83 -0
  197. package/docs/spec/error-codes.v1.txt +285 -0
  198. package/docs/spec/examples/agreement_delegation_v1.example.json +21 -0
  199. package/docs/spec/examples/arbitration_case_v1.example.json +26 -0
  200. package/docs/spec/examples/arbitration_verdict_v1.example.json +32 -0
  201. package/docs/spec/examples/dispute_open_envelope_v1.example.json +18 -0
  202. package/docs/spec/examples/produce_cli_output_v1.example.json +32 -0
  203. package/docs/spec/examples/release_index_signature_v1.example.json +9 -0
  204. package/docs/spec/examples/release_index_signatures_v1.example.json +14 -0
  205. package/docs/spec/examples/release_index_v1.example.json +15 -0
  206. package/docs/spec/examples/release_trust_v1.example.json +7 -0
  207. package/docs/spec/examples/release_trust_v2.example.json +22 -0
  208. package/docs/spec/examples/remote_signer_request_v1.example.json +18 -0
  209. package/docs/spec/examples/remote_signer_response_v1.example.json +8 -0
  210. package/docs/spec/examples/reputation_event_v1.example.json +29 -0
  211. package/docs/spec/examples/verification_report_v1.example.json +24 -0
  212. package/docs/spec/examples/verify_about_output_v1.example.json +29 -0
  213. package/docs/spec/examples/verify_cli_output_v1.example.json +13 -0
  214. package/docs/spec/legacy/MarketplaceAcceptance.v1.md +48 -0
  215. package/docs/spec/legacy/MarketplaceOffer.v1.md +56 -0
  216. package/docs/spec/legacy/schemas/MarketplaceAcceptance.v1.schema.json +53 -0
  217. package/docs/spec/legacy/schemas/MarketplaceOffer.v1.schema.json +61 -0
  218. package/docs/spec/producer-error-codes.v1.txt +14 -0
  219. package/docs/spec/schemas/AcceptanceCriteria.v1.schema.json +24 -0
  220. package/docs/spec/schemas/AcceptanceEvaluation.v1.schema.json +26 -0
  221. package/docs/spec/schemas/AgentEvent.v1.schema.json +49 -0
  222. package/docs/spec/schemas/AgentIdentity.v1.schema.json +129 -0
  223. package/docs/spec/schemas/AgentPassport.v1.schema.json +112 -0
  224. package/docs/spec/schemas/AgentReputation.v1.schema.json +151 -0
  225. package/docs/spec/schemas/AgentReputation.v2.schema.json +120 -0
  226. package/docs/spec/schemas/AgentRun.v1.schema.json +71 -0
  227. package/docs/spec/schemas/AgentRunSettlement.v1.schema.json +75 -0
  228. package/docs/spec/schemas/AgentWallet.v1.schema.json +54 -0
  229. package/docs/spec/schemas/AgreementDelegation.v1.schema.json +50 -0
  230. package/docs/spec/schemas/ArbitrationCase.v1.schema.json +133 -0
  231. package/docs/spec/schemas/ArbitrationVerdict.v1.schema.json +149 -0
  232. package/docs/spec/schemas/BundleHeadAttestation.v1.schema.json +21 -0
  233. package/docs/spec/schemas/ClosePackManifest.v1.schema.json +38 -0
  234. package/docs/spec/schemas/DelegationGrant.v1.schema.json +102 -0
  235. package/docs/spec/schemas/DisputeOpenEnvelope.v1.schema.json +78 -0
  236. package/docs/spec/schemas/EvidenceIndex.v1.schema.json +41 -0
  237. package/docs/spec/schemas/ExecutionIntent.v1.schema.json +85 -0
  238. package/docs/spec/schemas/FinancePackBundleManifest.v1.schema.json +38 -0
  239. package/docs/spec/schemas/FundingHold.v1.schema.json +46 -0
  240. package/docs/spec/schemas/GovernancePolicy.v1.schema.json +45 -0
  241. package/docs/spec/schemas/GovernancePolicy.v2.schema.json +70 -0
  242. package/docs/spec/schemas/InteractionDirectionMatrix.v1.schema.json +43 -0
  243. package/docs/spec/schemas/InvoiceBundleManifest.v1.schema.json +38 -0
  244. package/docs/spec/schemas/InvoiceClaim.v1.schema.json +39 -0
  245. package/docs/spec/schemas/MarketplaceAcceptance.v2.schema.json +53 -0
  246. package/docs/spec/schemas/MarketplaceOffer.v2.schema.json +61 -0
  247. package/docs/spec/schemas/MeteringReport.v1.schema.json +45 -0
  248. package/docs/spec/schemas/PricingMatrix.v1.schema.json +24 -0
  249. package/docs/spec/schemas/PricingMatrixSignatures.v1.schema.json +24 -0
  250. package/docs/spec/schemas/PricingMatrixSignatures.v2.schema.json +24 -0
  251. package/docs/spec/schemas/ProduceCliOutput.v1.schema.json +107 -0
  252. package/docs/spec/schemas/ProofBundleManifest.v1.schema.json +37 -0
  253. package/docs/spec/schemas/PublicKeys.v1.schema.json +33 -0
  254. package/docs/spec/schemas/ReleaseIndex.v1.schema.json +45 -0
  255. package/docs/spec/schemas/ReleaseIndexSignature.v1.schema.json +16 -0
  256. package/docs/spec/schemas/ReleaseIndexSignatures.v1.schema.json +16 -0
  257. package/docs/spec/schemas/ReleaseTrust.v1.schema.json +15 -0
  258. package/docs/spec/schemas/ReleaseTrust.v2.schema.json +37 -0
  259. package/docs/spec/schemas/RemoteSignerPublicKeyResponse.v1.schema.json +14 -0
  260. package/docs/spec/schemas/RemoteSignerRequest.v1.schema.json +24 -0
  261. package/docs/spec/schemas/RemoteSignerResponse.v1.schema.json +10 -0
  262. package/docs/spec/schemas/RemoteSignerSignRequest.v1.schema.json +27 -0
  263. package/docs/spec/schemas/RemoteSignerSignResponse.v1.schema.json +16 -0
  264. package/docs/spec/schemas/ReputationEvent.v1.schema.json +164 -0
  265. package/docs/spec/schemas/RevocationList.v1.schema.json +51 -0
  266. package/docs/spec/schemas/SettlementAdjustment.v1.schema.json +44 -0
  267. package/docs/spec/schemas/SettlementDecisionRecord.v1.schema.json +66 -0
  268. package/docs/spec/schemas/SettlementDecisionRecord.v2.schema.json +148 -0
  269. package/docs/spec/schemas/SettlementDecisionReport.v1.schema.json +61 -0
  270. package/docs/spec/schemas/SettlementReceipt.v1.schema.json +135 -0
  271. package/docs/spec/schemas/SlaDefinition.v1.schema.json +33 -0
  272. package/docs/spec/schemas/SlaEvaluation.v1.schema.json +26 -0
  273. package/docs/spec/schemas/TenantSettings.v1.schema.json +90 -0
  274. package/docs/spec/schemas/TenantSettings.v2.schema.json +161 -0
  275. package/docs/spec/schemas/TimestampProof.v1.schema.json +17 -0
  276. package/docs/spec/schemas/ToolCallAgreement.v1.schema.json +34 -0
  277. package/docs/spec/schemas/ToolCallEvidence.v1.schema.json +45 -0
  278. package/docs/spec/schemas/ToolManifest.v1.schema.json +54 -0
  279. package/docs/spec/schemas/VerificationReport.v1.schema.json +83 -0
  280. package/docs/spec/schemas/VerifyAboutOutput.v1.schema.json +54 -0
  281. package/docs/spec/schemas/VerifyCliOutput.v1.schema.json +75 -0
  282. package/docs/spec/schemas/VerifyReleaseOutput.v1.schema.json +47 -0
  283. package/docs/spec/x402-error-codes.v1.txt +21 -0
  284. package/docs/templates/buyer-email.txt +18 -0
  285. package/docs/templates/buyer-one-pager.md +24 -0
  286. package/package.json +40 -6
  287. package/scripts/acceptance/full-stack.mjs +734 -0
  288. package/scripts/acceptance/full-stack.sh +99 -0
  289. package/scripts/audit/build-audit-packet.mjs +242 -0
  290. package/scripts/backup-pg.sh +45 -0
  291. package/scripts/backup-restore/README.md +18 -0
  292. package/scripts/backup-restore/capture-state.mjs +130 -0
  293. package/scripts/backup-restore/client.mjs +97 -0
  294. package/scripts/backup-restore/seed-workload.mjs +235 -0
  295. package/scripts/backup-restore/verify-state.mjs +139 -0
  296. package/scripts/backup-restore-test.sh +217 -0
  297. package/scripts/chaos.js +221 -0
  298. package/scripts/ci/build-launch-cutover-packet.mjs +148 -0
  299. package/scripts/ci/build-self-serve-benchmark-report.mjs +122 -0
  300. package/scripts/ci/changelog-guard.mjs +145 -0
  301. package/scripts/ci/check-kernel-v0-launch-gate.mjs +233 -0
  302. package/scripts/ci/check-secret-hygiene.mjs +78 -0
  303. package/scripts/ci/check-version-consistency.mjs +42 -0
  304. package/scripts/ci/cli-pack-smoke.mjs +160 -0
  305. package/scripts/ci/flake-budget-guard.mjs +68 -0
  306. package/scripts/ci/generate-error-codes.mjs +54 -0
  307. package/scripts/ci/lib/lighthouse-tracker.mjs +90 -0
  308. package/scripts/ci/lib/self-serve-launch-gate.mjs +89 -0
  309. package/scripts/ci/npm-pack-smoke.mjs +454 -0
  310. package/scripts/ci/run-10x-throughput-drill.mjs +246 -0
  311. package/scripts/ci/run-10x-throughput-incident-rehearsal.mjs +325 -0
  312. package/scripts/ci/run-arbitration-workspace-browser-e2e.sh +22 -0
  313. package/scripts/ci/run-circle-sandbox-smoke.mjs +237 -0
  314. package/scripts/ci/run-go-live-gate.mjs +150 -0
  315. package/scripts/ci/run-kernel-v0-ship-gate.mjs +97 -0
  316. package/scripts/ci/run-mcp-host-smoke.mjs +275 -0
  317. package/scripts/ci/run-self-serve-launch-gate.mjs +56 -0
  318. package/scripts/ci/runtime-import-smoke.mjs +58 -0
  319. package/scripts/ci/update-lighthouse-tracker.mjs +112 -0
  320. package/scripts/closepack/lib.mjs +286 -0
  321. package/scripts/collect-debug.sh +263 -0
  322. package/scripts/demo/compositional-settlement-3hop.mjs +237 -0
  323. package/scripts/demo/delivery-robot/export-ui-fixture.mjs +188 -0
  324. package/scripts/demo/delivery-robot/generate.mjs +377 -0
  325. package/scripts/demo/kernel-agent-goes-shopping.mjs +202 -0
  326. package/scripts/demo/magic-link-first-green.mjs +118 -0
  327. package/scripts/demo/magic-link-kind-smoke.mjs +577 -0
  328. package/scripts/demo/mcp-paid-exa.mjs +1110 -0
  329. package/scripts/dev/billing-doctor.sh +145 -0
  330. package/scripts/dev/billing-smoke-prod.sh +219 -0
  331. package/scripts/dev/billing-webhook-replay.sh +161 -0
  332. package/scripts/dev/env.dev.example +29 -0
  333. package/scripts/dev/env.sh +37 -0
  334. package/scripts/dev/new-sdk-key.sh +81 -0
  335. package/scripts/dev/sdk-first-run.sh +21 -0
  336. package/scripts/dev/smoke-x402-gateway.sh +115 -0
  337. package/scripts/dev/start-api.sh +24 -0
  338. package/scripts/examples/produce-and-verify-jobproof.mjs +191 -0
  339. package/scripts/examples/sdk-first-paid-rfq.py +105 -0
  340. package/scripts/examples/sdk-first-verified-run.mjs +85 -0
  341. package/scripts/examples/sdk-first-verified-run.py +99 -0
  342. package/scripts/examples/sdk-tenant-analytics.mjs +103 -0
  343. package/scripts/examples/sdk-tenant-analytics.py +118 -0
  344. package/scripts/finance-pack/bundle.mjs +284 -0
  345. package/scripts/fixtures/generate-bundle-fixtures.mjs +877 -0
  346. package/scripts/governance/export.mjs +169 -0
  347. package/scripts/load/delivery-stress.k6.js +183 -0
  348. package/scripts/load/ingest-burst.k6.js +236 -0
  349. package/scripts/load/run-delivery-load.js +66 -0
  350. package/scripts/load/webhook-receiver.js +131 -0
  351. package/scripts/magic-link/migrate-run-records-to-db.mjs +35 -0
  352. package/scripts/mcp/probe.mjs +238 -0
  353. package/scripts/mcp/settld-mcp-http-gateway.mjs +178 -0
  354. package/scripts/mcp/settld-mcp-server.mjs +1201 -0
  355. package/scripts/openapi/write.mjs +13 -0
  356. package/scripts/ops/bootstrap-tenant-conformance.mjs +185 -0
  357. package/scripts/ops/build-x402-pilot-reliability-report.mjs +489 -0
  358. package/scripts/ops/check-x402-receipt-sample.mjs +181 -0
  359. package/scripts/ops/design-partner-run-packet.mjs +466 -0
  360. package/scripts/ops/hosted-baseline-evidence.mjs +681 -0
  361. package/scripts/ops/money-rails-chargeback-evidence.mjs +509 -0
  362. package/scripts/ops/money-rails-reconcile-evidence.mjs +180 -0
  363. package/scripts/ops/p0-seed-money-rail-operation.mjs +432 -0
  364. package/scripts/pilot/finance-pack.mjs +495 -0
  365. package/scripts/pilot/fixtures/robot-keypair.json +4 -0
  366. package/scripts/pilot/fixtures/server-signer.json +4 -0
  367. package/scripts/proof-bundle/job.mjs +109 -0
  368. package/scripts/proof-bundle/lib.mjs +92 -0
  369. package/scripts/proof-bundle/month.mjs +103 -0
  370. package/scripts/provider/conformance-run.mjs +159 -0
  371. package/scripts/provider/keys-generate.mjs +135 -0
  372. package/scripts/provider/publish.mjs +420 -0
  373. package/scripts/quickstart/x402.mjs +334 -0
  374. package/scripts/release/build-artifacts.mjs +181 -0
  375. package/scripts/release/generate-release-index.mjs +112 -0
  376. package/scripts/release/release-index-lib.mjs +232 -0
  377. package/scripts/release/sign-release-index.mjs +85 -0
  378. package/scripts/release/validate-release-assets.mjs +170 -0
  379. package/scripts/release/verify-release.mjs +261 -0
  380. package/scripts/restore-pg.sh +34 -0
  381. package/scripts/scaffold/create-settld-paid-tool.mjs +19 -0
  382. package/scripts/sdk/smoke-python.py +30 -0
  383. package/scripts/sdk/smoke.mjs +16 -0
  384. package/scripts/settlement/x402-batch-worker.mjs +1091 -0
  385. package/scripts/slo/check.mjs +178 -0
  386. package/scripts/smoke/k8s-smoke.mjs +214 -0
  387. package/scripts/spec/generate-protocol-vectors.mjs +931 -0
  388. package/scripts/test/check-no-generated-artifacts.sh +12 -0
  389. package/scripts/test/run.sh +45 -0
  390. package/scripts/trust/validate-trust-file.mjs +57 -0
  391. package/scripts/trust-config/rotate-settld-pay.mjs +277 -0
  392. package/scripts/trust-config/wizard.mjs +161 -0
  393. package/scripts/vendor-contract-test-lib.mjs +182 -0
  394. package/scripts/vendor-contract-test.mjs +55 -0
  395. package/scripts/vercel/build-mkdocs.sh +9 -0
  396. package/scripts/vercel/ignore-mkdocs.sh +25 -0
  397. package/scripts/vercel/install-mkdocs.sh +6 -0
  398. package/scripts/verify-pg.js +217 -0
  399. package/scripts/x402/receipt-verify.mjs +289 -0
  400. package/services/finance-sink/src/dedupe-store.js +29 -6
  401. package/services/receiver/src/dedupe-store.js +29 -5
  402. package/services/x402-gateway/Dockerfile +13 -0
  403. package/services/x402-gateway/README.md +58 -0
  404. package/services/x402-gateway/examples/upstream-mock.js +337 -0
  405. package/services/x402-gateway/src/server.js +947 -0
  406. package/src/api/app.js +32517 -16877
  407. package/src/api/maintenance.js +70 -0
  408. package/src/api/openapi.js +1130 -17
  409. package/src/api/persistence.js +272 -0
  410. package/src/api/server.js +81 -5
  411. package/src/api/store.js +1248 -6
  412. package/src/api/workers/deliveries.js +99 -4
  413. package/src/api/workers/insolvency-sweep.js +159 -0
  414. package/src/core/agent-card.js +69 -0
  415. package/src/core/agent-wallets.js +97 -0
  416. package/src/core/agreement-delegation.js +549 -0
  417. package/src/core/billing-plans.js +40 -6
  418. package/src/core/circle-reserve-adapter.js +845 -0
  419. package/src/core/maintenance-locks.js +1 -0
  420. package/src/core/paid-tool-manifest.js +318 -0
  421. package/src/core/provider-publish-conformance.js +525 -0
  422. package/src/core/provider-publish-proof.js +396 -0
  423. package/src/core/provider-quote-signature.js +170 -0
  424. package/src/core/settld-keys.js +112 -0
  425. package/src/core/settld-pay-token.js +344 -0
  426. package/src/core/settlement-kernel.js +213 -2
  427. package/src/core/settlement-verifier.js +335 -0
  428. package/src/core/tool-call-agreement.js +112 -0
  429. package/src/core/tool-call-evidence.js +144 -0
  430. package/src/core/tool-provider-signature.js +98 -0
  431. package/src/core/x402-escalation-override.js +258 -0
  432. package/src/core/x402-gate.js +118 -0
  433. package/src/core/x402-provider-refund-decision.js +220 -0
  434. package/src/core/x402-receipt-verifier.js +708 -0
  435. package/src/core/x402-reversal-command.js +251 -0
  436. package/src/core/x402-wallet-issuer-decision.js +252 -0
  437. package/src/core/zk-verifier.js +300 -0
  438. package/src/db/migrations/029_reputation_event_index.sql +54 -0
  439. package/src/db/migrations/030_artifacts_source_event_unique_job_only.sql +15 -0
  440. package/src/db/pg.js +18 -7
  441. package/src/db/store-pg.js +838 -72
@@ -0,0 +1,140 @@
1
+ # Circle Sandbox E2E (Reserve Adapter)
2
+
3
+ This guide is for validating the x402 reserve path against Circle sandbox before enabling production mode.
4
+
5
+ ## Goal
6
+
7
+ Prove the reserve contract used by `POST /x402/gate/authorize-payment`:
8
+
9
+ 1. Reserve succeeds before token mint.
10
+ 2. Reserve failure does not mint a token.
11
+ 3. Reserve rollback path restores internal wallet state.
12
+
13
+ ## Production safety defaults
14
+
15
+ The API is configured to fail closed in production-like environments:
16
+
17
+ - `X402_REQUIRE_EXTERNAL_RESERVE` defaults to `true` when `SETTLD_ENV=production|prod`, `NODE_ENV=production`, or `RAILWAY_ENVIRONMENT_NAME=production|prod`.
18
+ - `X402_CIRCLE_RESERVE_MODE` defaults to `production` in production-like environments.
19
+ - In local/test environments, defaults remain:
20
+ - `X402_REQUIRE_EXTERNAL_RESERVE=false`
21
+ - `X402_CIRCLE_RESERVE_MODE=stub`
22
+
23
+ To force explicit behavior in any environment, set both env vars directly.
24
+
25
+ ## Required env
26
+
27
+ Set these for sandbox runs:
28
+
29
+ - `CIRCLE_E2E=1` (enables sandbox e2e tests)
30
+ - `CIRCLE_API_KEY` (sandbox key)
31
+ - `CIRCLE_BASE_URL=https://api-sandbox.circle.com`
32
+ - `CIRCLE_BLOCKCHAIN` (for example `BASE-SEPOLIA`)
33
+ - `CIRCLE_WALLET_ID_SPEND`
34
+ - `CIRCLE_WALLET_ID_ESCROW`
35
+ - `CIRCLE_TOKEN_ID_USDC`
36
+
37
+ If your environment uses a different naming convention, map these into the adapter config before running tests.
38
+
39
+ ## Suggested test flow
40
+
41
+ 1. Verify spend wallet has sufficient USDC.
42
+ 2. Call reserve (`spend -> escrow`) with idempotency key = gate id.
43
+ 3. Poll transaction status until terminal/safe state.
44
+ 4. Attempt rollback:
45
+ - cancel when still cancellable, or
46
+ - compensating transfer (`escrow -> spend`) when already confirmed.
47
+ 5. Verify resulting balances + persisted reserve status.
48
+
49
+ ## Run command
50
+
51
+ After adapter wiring is complete:
52
+
53
+ ```bash
54
+ CIRCLE_E2E=1 node --test test/circle-sandbox-reserve-e2e.test.js
55
+ ```
56
+
57
+ ## Run full paid MCP demo in Circle mode
58
+
59
+ The demo now supports explicit reserve rail mode:
60
+
61
+ ```bash
62
+ SETTLD_DEMO_CIRCLE_MODE=sandbox \
63
+ X402_REQUIRE_EXTERNAL_RESERVE=1 \
64
+ node scripts/demo/mcp-paid-exa.mjs --circle=sandbox
65
+ ```
66
+
67
+ Artifacts include:
68
+
69
+ - `summary.json` with `circleMode`, `circleReserveId`, `reserveTransitions`, and `payoutDestination`.
70
+ - `reserve-state.json` with reserve details, transition timeline, and configured Circle rail metadata.
71
+
72
+ ## Run paid MCP demo + batch settlement in Circle mode
73
+
74
+ This runs the same demo flow and then executes the batch payout worker against the generated artifact root:
75
+
76
+ ```bash
77
+ SETTLD_DEMO_CIRCLE_MODE=sandbox \
78
+ SETTLD_DEMO_RUN_BATCH_SETTLEMENT=1 \
79
+ SETTLD_DEMO_BATCH_PROVIDER_WALLET_ID="$CIRCLE_WALLET_ID_ESCROW" \
80
+ X402_REQUIRE_EXTERNAL_RESERVE=1 \
81
+ node scripts/demo/mcp-paid-exa.mjs --circle=sandbox
82
+ ```
83
+
84
+ Additional artifacts:
85
+
86
+ - `batch-payout-registry.json`
87
+ - `batch-worker-state.json`
88
+ - `batch-settlement.json`
89
+
90
+ ## Run sandbox-gated batch settlement E2E test
91
+
92
+ ```bash
93
+ CIRCLE_E2E=1 CIRCLE_BATCH_E2E=1 node --test test/circle-sandbox-batch-settlement-e2e.test.js
94
+ ```
95
+
96
+ This test:
97
+
98
+ 1. Runs the paid MCP demo in sandbox mode with batch settlement enabled.
99
+ 2. Confirms payout submission state is recorded.
100
+ 3. Reruns the worker and verifies payout idempotency (no duplicate submit).
101
+
102
+ ## Run the full Circle sandbox smoke gate
103
+
104
+ This command is the recommended "no-regression" check. It runs:
105
+
106
+ 1. Optional faucet top-ups for spend/escrow wallets (can be disabled with `CIRCLE_SKIP_TOPUP=1`).
107
+ 2. `test/circle-sandbox-reserve-e2e.test.js`
108
+ 3. `test/circle-sandbox-batch-settlement-e2e.test.js`
109
+
110
+ ```bash
111
+ npm run test:x402:circle:sandbox:smoke
112
+ ```
113
+
114
+ Smoke output artifact:
115
+
116
+ - `artifacts/gates/x402-circle-sandbox-smoke.json`
117
+
118
+ ## GitHub Actions smoke workflow
119
+
120
+ The repo includes `.github/workflows/x402-circle-sandbox-smoke.yml` for manual/nightly runs.
121
+
122
+ Required repo secrets:
123
+
124
+ - `CIRCLE_SANDBOX_API_KEY`
125
+ - `CIRCLE_SANDBOX_WALLET_ID_SPEND`
126
+ - `CIRCLE_SANDBOX_WALLET_ID_ESCROW`
127
+ - `CIRCLE_SANDBOX_TOKEN_ID_USDC`
128
+ - `CIRCLE_SANDBOX_ENTITY_SECRET_HEX`
129
+
130
+ Optional repo secrets:
131
+
132
+ - `CIRCLE_SANDBOX_BASE_URL` (defaults to `https://api.circle.com`)
133
+ - `CIRCLE_SANDBOX_BLOCKCHAIN` (defaults to `BASE-SEPOLIA`)
134
+
135
+ ## Pass criteria
136
+
137
+ - Reserve call returns a stable `reserveId`.
138
+ - Repeated reserve calls with same gate id are idempotent.
139
+ - Failed reserves return `X402_RESERVE_FAILED` and leave no stranded internal escrow lock.
140
+ - Rollback returns funds to spend wallet (cancel or compensation).
package/docs/CONFIG.md ADDED
@@ -0,0 +1,297 @@
1
+ # Settld Configuration (Runtime)
2
+
3
+ This repo is intentionally “ops-first”: **safe defaults**, explicit hardening toggles, and predictable failure modes.
4
+
5
+ ## Store / durability
6
+
7
+ - `STORE` (`memory` | `pg`, default: `memory`)
8
+ - `DATABASE_URL` (required when `STORE=pg`)
9
+ - `PROXY_PG_SCHEMA` (default: `public`)
10
+ - `PROXY_PG_LOG_SLOW_MS` (default: `0` = disabled)
11
+ When nonzero, logs slow queries as `pg.query.slow` with duration + a best-effort query label (never logs query args).
12
+ - `PROXY_MIGRATE_ON_STARTUP` (`1` | `0`, default: `1`)
13
+ When `1`, Settld runs SQL migrations on startup (PG advisory-lock protected so concurrent instances are safe). Set `0` if you run migrations out-of-band.
14
+ - `PROXY_DATA_DIR` (memory mode durability via file tx-log; default: unset = purely in-memory)
15
+
16
+ ## HTTP limits
17
+
18
+ - `PROXY_MAX_BODY_BYTES` (default: `1000000`)
19
+ - `PROXY_INGEST_MAX_EVENTS` (default: `200`)
20
+
21
+ ## Protocol / versioning
22
+
23
+ Settld exposes a protocol version contract via `x-settld-protocol` and enforces compatibility windows.
24
+
25
+ - `PROXY_PROTOCOL_MIN` (default: current, e.g. `1.0`)
26
+ Requests below this return `426` with `code: PROTOCOL_TOO_OLD`.
27
+
28
+ - `PROXY_PROTOCOL_MAX` (default: current, e.g. `1.0`)
29
+ Requests above this return `400` with `code: PROTOCOL_TOO_NEW`.
30
+
31
+ - `PROXY_PROTOCOL_DEPRECATIONS` (optional file path)
32
+ JSON map of protocol version -> cutoff date; requests past cutoff return `426` with `code: PROTOCOL_DEPRECATED`.
33
+ Example:
34
+
35
+ ```json
36
+ { "1.0": { "cutoff": "2026-12-31T00:00:00.000Z" } }
37
+ ```
38
+
39
+ Production enforcement:
40
+
41
+ - When `NODE_ENV=production`, `/ingest/proxy` and `POST /{jobs|robots|operators}/:id/events` require the request header `x-settld-protocol` (else `400` with `code: PROTOCOL_VERSION_REQUIRED`).
42
+
43
+ ## Rate limiting
44
+
45
+ - `PROXY_RATE_LIMIT_RPM` (default: `0` = disabled)
46
+ - `PROXY_RATE_LIMIT_BURST` (default: `PROXY_RATE_LIMIT_RPM`)
47
+ - `PROXY_RATE_LIMIT_PER_KEY_RPM` (default: `0` = disabled)
48
+ Applies an additional token bucket per authenticated API key (`auth.keyId`) after tenant-level limiting.
49
+ - `PROXY_RATE_LIMIT_PER_KEY_BURST` (default: `PROXY_RATE_LIMIT_PER_KEY_RPM`)
50
+
51
+ ## Outbox reclaim / worker loop
52
+
53
+ - `PROXY_RECLAIM_AFTER_SECONDS` (default: `60`)
54
+ Reclaim “claimed but not processed” outbox rows after this window.
55
+
56
+ - `PROXY_PG_WORKER_STATEMENT_TIMEOUT_MS` (default: `0` = disabled; PG only)
57
+ Sets `statement_timeout` for worker-transaction queries (outbox claims + delivery claims + outbox processors) to prevent “hung query” pileups.
58
+
59
+ - `PROXY_AUTOTICK` (`1` enables a default loop)
60
+ - `PROXY_AUTOTICK_INTERVAL_MS` (default: `0`, or `250` when `PROXY_AUTOTICK=1`)
61
+ - `PROXY_AUTOTICK_MAX_MESSAGES` (default: `100`)
62
+
63
+ Delivery/worker tuning:
64
+
65
+ - `PROXY_WORKER_CONCURRENCY_ARTIFACTS` (default: `1`)
66
+ Max concurrent artifact build groups (grouped by `tenantId + jobId`).
67
+
68
+ - `PROXY_WORKER_CONCURRENCY_DELIVERIES` (default: `1`)
69
+ Max concurrent delivery scope groups (grouped by `scopeKey`; preserves ordering within each scope).
70
+
71
+ - `PROXY_DELIVERY_HTTP_TIMEOUT_MS` (default: `0` = disabled)
72
+ Abort outbound delivery HTTP requests after this timeout and retry with backoff.
73
+
74
+ ## Ops / API auth
75
+
76
+ - `PROXY_OPS_TOKENS`
77
+ Format: `token:scope1,scope2;token2:scopeA` (scopes include `ops_read`, `ops_write`, `audit_read`, `finance_write`, …)
78
+
79
+ - `PROXY_OPS_TOKEN` (legacy)
80
+ If `PROXY_OPS_TOKENS` is empty, this single token grants full ops access.
81
+
82
+ - `PROXY_AUTH_KEY_TOUCH_MIN_SECONDS` (default: `60`)
83
+ Throttle how often `last_used_at` is updated for API keys (reduces DB write amplification).
84
+
85
+ ## Ingest auth
86
+
87
+ - `PROXY_INGEST_TOKEN` (optional)
88
+ When set, `/ingest/proxy` requires header `x-proxy-ingest-token` to match.
89
+
90
+ ## Export destinations (deliveries)
91
+
92
+ - `PROXY_EXPORT_DESTINATIONS` (JSON)
93
+ Maps `tenantId -> destinations[]`.
94
+
95
+ Webhook destination (preferred, secrets via ref):
96
+
97
+ ```json
98
+ {
99
+ "tenant_default": [
100
+ { "destinationId": "dst_webhook", "kind": "webhook", "url": "https://example.com/hook", "secretRef": "file:/var/run/secrets/webhook_secret" }
101
+ ]
102
+ }
103
+ ```
104
+
105
+ S3 destination (preferred, credentials via ref):
106
+
107
+ ```json
108
+ {
109
+ "tenant_default": [
110
+ {
111
+ "destinationId": "dst_s3",
112
+ "kind": "s3",
113
+ "endpoint": "https://s3.amazonaws.com",
114
+ "bucket": "my-bucket",
115
+ "region": "us-east-1",
116
+ "accessKeyIdRef": "file:/var/run/secrets/aws_access_key_id",
117
+ "secretAccessKeyRef": "file:/var/run/secrets/aws_secret_access_key"
118
+ }
119
+ ]
120
+ }
121
+ ```
122
+
123
+ Hardening note:
124
+
125
+ - Inline secrets (`secret`, `accessKeyId`, `secretAccessKey`) are rejected when `NODE_ENV=production` unless `PROXY_ALLOW_INLINE_SECRETS=1`.
126
+
127
+ ## Evidence store
128
+
129
+ - `PROXY_EVIDENCE_STORE` (`fs` | `memory` | `s3` | `minio`, default: `fs`)
130
+ - `PROXY_EVIDENCE_DIR` (fs store root; default: tmp dir when not using `PROXY_DATA_DIR`)
131
+
132
+ S3/minio evidence store config:
133
+
134
+ - `PROXY_EVIDENCE_S3_ENDPOINT`
135
+ - `PROXY_EVIDENCE_S3_REGION` (default: `us-east-1`)
136
+ - `PROXY_EVIDENCE_S3_BUCKET`
137
+ - `PROXY_EVIDENCE_S3_ACCESS_KEY_ID` (or `AWS_ACCESS_KEY_ID`)
138
+ - `PROXY_EVIDENCE_S3_SECRET_ACCESS_KEY` (or `AWS_SECRET_ACCESS_KEY`)
139
+ - `PROXY_EVIDENCE_S3_FORCE_PATH_STYLE` (default: `1`)
140
+
141
+ Evidence download security:
142
+
143
+ - `PROXY_EVIDENCE_SIGNING_SECRET` (optional; default derived from server signer)
144
+ - `PROXY_EVIDENCE_PRESIGN_MAX_SECONDS` (default: `300`, max: `3600`)
145
+ - `PROXY_EVIDENCE_RETENTION_MAX_DAYS` (default: `365`)
146
+ Tenant cap for `contract.policies.evidencePolicy.retentionDays`.
147
+ - `PROXY_EVIDENCE_RETENTION_MAX_DAYS_BY_TENANT` (JSON map, optional)
148
+ Per-tenant override for `PROXY_EVIDENCE_RETENTION_MAX_DAYS`.
149
+
150
+ ## Secrets provider
151
+
152
+ - `PROXY_ENABLE_ENV_SECRETS` (`1` enables `env:NAME` refs; default: disabled unless `NODE_ENV=development`)
153
+ - `PROXY_SECRETS_CACHE_TTL_SECONDS` (default: `30`)
154
+
155
+ Supported refs:
156
+
157
+ - `env:NAME` (dev-only unless explicitly enabled)
158
+ - `file:/absolute/path` (k8s secret mounts)
159
+
160
+ ## URL safety overrides (dev only)
161
+
162
+ These exist to make local development possible (e.g. MinIO on `localhost`). Do not enable in production.
163
+
164
+ - `PROXY_ALLOW_HTTP_URLS` (`1` allows `http://` where URL safety checks apply)
165
+ - `PROXY_ALLOW_PRIVATE_URLS` (`1` allows private IP ranges)
166
+ - `PROXY_ALLOW_LOOPBACK_URLS` (`1` allows `localhost` / loopback)
167
+
168
+ ## Retention / cleanup
169
+
170
+ Retention is tenant-configurable via in-memory config and capped by these runtime env vars.
171
+
172
+ - `PROXY_RETENTION_INGEST_RECORDS_DAYS` (default: `0` = no expiry)
173
+ Sets `expires_at` for `ingest_records`.
174
+
175
+ - `PROXY_RETENTION_INGEST_RECORDS_MAX_DAYS` (default: `0` = no platform cap)
176
+ When set, tenant `0` means “use the cap”.
177
+
178
+ - `PROXY_RETENTION_DELIVERIES_DAYS` (default: `0` = no expiry)
179
+ Expiration for delivered deliveries.
180
+
181
+ - `PROXY_RETENTION_DELIVERIES_MAX_DAYS` (default: `0` = no platform cap)
182
+
183
+ - `PROXY_RETENTION_DELIVERY_DLQ_DAYS` (default: `PROXY_RETENTION_DELIVERIES_DAYS`)
184
+ Expiration for failed (DLQ) deliveries.
185
+
186
+ - `PROXY_RETENTION_DELIVERY_DLQ_MAX_DAYS` (default: `PROXY_RETENTION_DELIVERIES_MAX_DAYS`)
187
+
188
+ Cleanup execution (PG mode):
189
+
190
+ - `PROXY_RETENTION_CLEANUP_BATCH_SIZE` (default: `500`)
191
+ Max rows per table per cleanup run.
192
+
193
+ - `PROXY_RETENTION_CLEANUP_MAX_MILLIS` (default: `1500`)
194
+ Wall-clock budget for a single cleanup run (enforced via PG `statement_timeout`).
195
+
196
+ - `PROXY_RETENTION_CLEANUP_DRY_RUN` (`1` prints would-delete counts; no deletes)
197
+
198
+ Finance reconciliation scheduling:
199
+
200
+ - `PROXY_FINANCE_RECONCILE_ENABLED` (default: `1`)
201
+ Enables periodic finance reconciliation maintenance ticks.
202
+
203
+ - `PROXY_FINANCE_RECONCILE_INTERVAL_SECONDS` (default: `300`)
204
+ Minimum interval between automatic reconciliation runs.
205
+
206
+ - `PROXY_FINANCE_RECONCILE_MAX_TENANTS` (default: `50`)
207
+ Max tenants scanned per automatic run.
208
+
209
+ - `PROXY_FINANCE_RECONCILE_MAX_PERIODS_PER_TENANT` (default: `2`)
210
+ Max GL periods reconciled per tenant in one run.
211
+
212
+ Money-rail reconciliation scheduling:
213
+
214
+ - `PROXY_MONEY_RAIL_RECONCILE_ENABLED` (default: `1`)
215
+ Enables periodic money-rail reconciliation maintenance ticks.
216
+
217
+ - `PROXY_MONEY_RAIL_RECONCILE_INTERVAL_SECONDS` (default: `300`)
218
+ Minimum interval between automatic money-rail reconciliation runs.
219
+
220
+ - `PROXY_MONEY_RAIL_RECONCILE_MAX_TENANTS` (default: `50`)
221
+ Max tenants scanned per automatic run.
222
+
223
+ - `PROXY_MONEY_RAIL_RECONCILE_MAX_PERIODS_PER_TENANT` (default: `2`)
224
+ Max payout periods reconciled per tenant in one run.
225
+
226
+ - `PROXY_MONEY_RAIL_RECONCILE_MAX_PROVIDERS_PER_TENANT` (default: `10`)
227
+ Max money-rail providers reconciled per tenant in one run.
228
+
229
+ Maintenance runner (recommended in prod):
230
+
231
+ - `PROXY_MAINTENANCE_INTERVAL_SECONDS` (default: `300`)
232
+ Sleep between cleanup runs in `src/api/maintenance.js`.
233
+
234
+ ## Quotas / backpressure
235
+
236
+ On quota breach, requests return `429` with `code: TENANT_QUOTA_EXCEEDED`.
237
+
238
+ - `PROXY_QUOTA_MAX_OPEN_JOBS` (default: `0` = unlimited)
239
+ - `PROXY_QUOTA_PLATFORM_MAX_OPEN_JOBS` (default: `0` = no platform cap)
240
+
241
+ - `PROXY_QUOTA_MAX_PENDING_DELIVERIES` (default: `0` = unlimited)
242
+ - `PROXY_QUOTA_PLATFORM_MAX_PENDING_DELIVERIES` (default: `0` = no platform cap)
243
+
244
+ - `PROXY_QUOTA_MAX_INGEST_DLQ_DEPTH` (default: `0` = unlimited)
245
+ - `PROXY_QUOTA_PLATFORM_MAX_INGEST_DLQ_DEPTH` (default: `0` = no platform cap)
246
+
247
+ - `PROXY_QUOTA_MAX_EVIDENCE_REFS_PER_JOB` (default: `0` = unlimited)
248
+ - `PROXY_QUOTA_PLATFORM_MAX_EVIDENCE_REFS_PER_JOB` (default: `0` = no platform cap)
249
+
250
+ - `PROXY_QUOTA_MAX_ARTIFACTS_PER_JOB_TYPE` (default: `0` = unlimited)
251
+ - `PROXY_QUOTA_PLATFORM_MAX_ARTIFACTS_PER_JOB_TYPE` (default: `0` = no platform cap)
252
+
253
+ ## Outbox poison-pill
254
+
255
+ - `PROXY_OUTBOX_MAX_ATTEMPTS` (default: `25`)
256
+ After this many attempts, outbox work is marked done with a DLQ error marker.
257
+
258
+ ## Evidence ingest constraints (optional hardening)
259
+
260
+ - `PROXY_EVIDENCE_CONTENT_TYPE_ALLOWLIST` (comma-separated)
261
+ If set, `EVIDENCE_CAPTURED.payload.contentType` must be in the allowlist.
262
+
263
+ - `PROXY_EVIDENCE_REQUIRE_SIZE_BYTES` (`1` requires `EVIDENCE_CAPTURED.payload.sizeBytes`)
264
+ - `PROXY_EVIDENCE_MAX_SIZE_BYTES` (default: `0` = unlimited)
265
+
266
+ ## Backups / restore (Postgres)
267
+
268
+ These helper scripts assume you have Postgres client tools installed (`pg_dump`, `pg_restore`, `psql`).
269
+
270
+ - Backup:
271
+
272
+ ```sh
273
+ DATABASE_URL=postgres://... PROXY_PG_SCHEMA=public OUT_DIR=./backups bash scripts/backup-pg.sh
274
+ ```
275
+
276
+ - Restore (to a fresh DB is recommended):
277
+
278
+ ```sh
279
+ DATABASE_URL=postgres://... PROXY_PG_SCHEMA=public bash scripts/restore-pg.sh ./backups/backup_*/db.dump
280
+ ```
281
+
282
+ - Verify a restored DB:
283
+
284
+ ```sh
285
+ DATABASE_URL=postgres://... PROXY_PG_SCHEMA=public node scripts/verify-pg.js
286
+ ```
287
+
288
+ Verification knobs:
289
+
290
+ - `VERIFY_MAX_STREAMS` (default: `100`)
291
+ - `VERIFY_MAX_ARTIFACTS` (default: `100`)
292
+ - `VERIFY_MAX_LEDGER_ENTRIES` (default: `0` = all)
293
+
294
+ RPO/RTO (practical):
295
+
296
+ - RPO is the time between successful backups.
297
+ - RTO is `restore time + verification time` and scales with DB size.
@@ -0,0 +1,23 @@
1
+ # Contracts APIs (Legacy vs Contracts-as-Code)
2
+
3
+ Settld exposes two separate “contracts” API families on purpose.
4
+
5
+ ## Legacy: `/ops/contracts` (policy upsert)
6
+
7
+ - Semantics: mutable upsert of “policy templates” (JSON `policies.*` blobs).
8
+ - Compatibility: kept for existing integrations and tests.
9
+ - Output: legacy `contract` records with `contractVersion` incrementing per upsert.
10
+
11
+ Use this when you want to keep the existing quoting/booking contract behavior.
12
+
13
+ ## Contracts-as-Code: `/ops/contracts-v2` (hash-addressed documents)
14
+
15
+ - Semantics: immutable, hash-addressed `ContractDocument.v1` documents with optional signatures and an activation step.
16
+ - Output: v2 contract records that carry `contractHash`, `policyHash`, and `compilerId`.
17
+ - Jobs pin hashes at booking-time (so later edits cannot retroactively change what governed the job).
18
+
19
+ Use this when you need audit-grade pinning (hashes), signing, and deterministic compilation.
20
+
21
+ ## Capabilities
22
+
23
+ `GET /capabilities` advertises which contract APIs and schema/compiler versions the server supports.
@@ -0,0 +1,31 @@
1
+ # Deprecation Policy
2
+
3
+ Settld is infrastructure. We don’t break integrators casually.
4
+
5
+ ## Protocol versions (`x-settld-protocol`)
6
+
7
+ - Format: `major.minor` (example: `1.0`)
8
+ - Server advertises:
9
+ - `x-settld-protocol` (current)
10
+ - `x-settld-supported-protocols` (comma-separated)
11
+
12
+ ### Minimum windows
13
+
14
+ - Breaking change requires a protocol bump.
15
+ - Deprecated protocol versions remain supported for **at least 6 months**, except for urgent security fixes.
16
+
17
+ ### Enforcing deprecation cutoffs
18
+
19
+ If configured, the server rejects deprecated versions past cutoff via `PROXY_PROTOCOL_DEPRECATIONS` and reason code `PROTOCOL_DEPRECATED`.
20
+
21
+ ## APIs
22
+
23
+ When an API family is deprecated:
24
+ - it will be called out in `CHANGELOG.md`
25
+ - it may emit a warning header in non-test mode
26
+ - it will have a published replacement
27
+
28
+ Current split:
29
+ - Legacy contracts: `/ops/contracts` (mutable policy upsert; back-compat)
30
+ - Contracts v2: `/ops/contracts-v2` (contracts-as-code; hash-addressed + compiled)
31
+
@@ -0,0 +1,92 @@
1
+ # Settld Domain Model (v0)
2
+
3
+ ## Actors
4
+
5
+ - **Requester**: Household or Business that pays and grants scoped access.
6
+ - **Owner**: supplies executors and receives payouts.
7
+ - **Executor**: endpoint with capabilities, health, and safety profile.
8
+ - **Operator**: remote assist + exception handling; actions are audited.
9
+ - **Developer**: publishes skills.
10
+ - **Trust Counterparty**: insurance/guarantee/claims partner.
11
+
12
+ ## First-class entities
13
+
14
+ ### Job
15
+
16
+ Purchasable outcome with SLA and constraints.
17
+
18
+ Key fields:
19
+
20
+ - `templateId` (e.g., `reset_lite`)
21
+ - constraints (rooms allowed, privacy mode, fragile items, pets, etc.)
22
+ - scheduling window
23
+ - price quote + risk premium
24
+ - selected executor + operator coverage (optional)
25
+ - state machine status
26
+
27
+ ### Task Template
28
+
29
+ Defines:
30
+
31
+ - required skills
32
+ - environment requirements (managed vs home)
33
+ - SLA expectations
34
+ - pricing inputs and guardrails
35
+
36
+ ### Skill
37
+
38
+ Signed bundle:
39
+
40
+ - metadata (name, version, developer, description)
41
+ - required capabilities + safety constraints
42
+ - deterministic policy graph (BT/SM) and tests
43
+ - optional model artifacts
44
+ - certification tier
45
+
46
+ ### Capability
47
+
48
+ Runtime-agnostic API surface (e.g., `ExecuteWorkflow`, `CallTool`, `CollectEvidence`, `ObserveROI`).
49
+
50
+ Executors advertise:
51
+
52
+ - mobility/manipulation properties
53
+ - allowed speed/force envelopes
54
+ - autonomy/teleop allowed flags
55
+ - sensor modes (privacy implications)
56
+
57
+ ### Access Plan
58
+
59
+ Time-bounded, revocable credential set and instructions to access the space:
60
+
61
+ - credential scope + expiry
62
+ - revocation path
63
+ - entry/exit safe behaviors
64
+
65
+ ### Incident / Claim
66
+
67
+ Incident: operationally detected anomaly or requester-reported issue.
68
+
69
+ Claim: workflow for remediation/payout:
70
+
71
+ - triage, classify, evidence bundle attach
72
+ - approve small payouts quickly, escalate large claims
73
+ - ledger adjustments (refunds, owner clawbacks, reserve draws)
74
+
75
+ ### Ledger
76
+
77
+ Double-entry system of record for money movement:
78
+
79
+ - escrow/holds
80
+ - payout splits (owner, Settld fee, operator fee, developer royalty, reserve)
81
+ - refunds, chargebacks, tips
82
+
83
+ Invariant: every journal entry balances to zero.
84
+
85
+ ## Trust scores (initially naive)
86
+
87
+ Used for dispatch, pricing, and environment gating:
88
+
89
+ - executor trust score
90
+ - owner trust score
91
+ - building trust score
92
+ - skill trust score / certification tier
@@ -0,0 +1,53 @@
1
+ # Event Envelope & Black Box Rules (v0.2)
2
+
3
+ Settld’s “black box” is an append-only, hash-chained event stream. The API rejects events that fail envelope, causality, or signer-policy validation.
4
+
5
+ ## Envelope
6
+
7
+ Each stored event uses this shape:
8
+
9
+ - `v`: envelope version (currently `1`)
10
+ - `id`: event id (`evt_...`)
11
+ - `at`: ISO-8601 timestamp
12
+ - `streamId`: aggregate stream id (e.g. a job id)
13
+ - `type`: event type (e.g. `BOOKED`, `EN_ROUTE`)
14
+ - `actor`: `{ type, id }` (who initiated the action)
15
+ - `payload`: JSON payload (nullable)
16
+ - `payloadHash`: `sha256(canonical(eventPayload))`
17
+ - `prevChainHash`: previous event’s `chainHash` (or `null` for genesis)
18
+ - `chainHash`: `sha256(canonical(chainLink))`
19
+ - `signature`: base64 Ed25519 signature (nullable)
20
+ - `signerKeyId`: key id of the signer (nullable)
21
+
22
+ ## Canonical hashing
23
+
24
+ Canonical JSON rules (implemented in `src/core/canonical-json.js`):
25
+
26
+ - Object keys are sorted deterministically.
27
+ - No `undefined`, non-finite numbers, or `-0`.
28
+ - Only JSON values (plain objects/arrays/strings/numbers/booleans/null).
29
+
30
+ Hashes:
31
+
32
+ - `payloadHash = sha256( canonicalJson({ v, id, at, streamId, type, actor, payload }) )`
33
+ - `chainHash = sha256( canonicalJson({ v, prevChainHash, payloadHash }) )`
34
+
35
+ Signatures:
36
+
37
+ - `signature = Ed25519.sign(payloadHash)`
38
+ - Verification uses the signer’s public key looked up by `signerKeyId`.
39
+
40
+ ## Append-time acceptance rules
41
+
42
+ The server rejects an append if any of the following are true:
43
+
44
+ - The envelope is missing required fields for the append mode (draft vs finalized).
45
+ - `prevChainHash` does not match the current stream head (optimistic concurrency).
46
+ - The hash chain or signature verification fails.
47
+ - The event violates signature policy (who must sign what).
48
+ - The event would cause an illegal job state transition.
49
+
50
+ ## Concurrency & idempotency
51
+
52
+ - **Optimistic concurrency**: draft events must include `x-proxy-expected-prev-chain-hash`, and the server returns `409` on mismatch.
53
+ - **Idempotency**: mutation endpoints accept `x-idempotency-key`; replays return the original response (and don’t append twice).
@@ -0,0 +1,53 @@
1
+ # FinancePackBundle.v1 Format (Finance-Grade)
2
+
3
+ This document defines the on-disk format for `FinancePackBundle.v1` and its strict-verification invariants.
4
+
5
+ ## Directory Layout
6
+
7
+ ```
8
+ settld.json
9
+ manifest.json
10
+ attestation/bundle_head_attestation.json
11
+ month/...
12
+ finance/...
13
+ verify/verification_report.json
14
+ ```
15
+
16
+ Notes:
17
+ - `month/` is a full embedded `MonthProofBundle.v1` directory tree.
18
+ - `attestation/bundle_head_attestation.json` is a signed `BundleHeadAttestation.v1` committing to the FinancePack manifestHash and MonthProof anchor.
19
+ - `verify/verification_report.json` is a signed, machine-ingestible `VerificationReport.v1`.
20
+
21
+ ## `manifest.json` (FinancePackBundleManifest.v1)
22
+
23
+ `manifest.json` includes:
24
+ - `files[]`: sha256 hashes for the **non-verify** bundle files
25
+ - `manifestHash`: sha256 over canonical JSON of the manifest object **excluding** `manifestHash`
26
+
27
+ ### Hashing Contract (`hashing.schemaVersion = FinancePackBundleManifestHash.v1`)
28
+
29
+ - `fileOrder = path_asc`
30
+ - `excludes = ["verify/**"]` (all `verify/*` derived outputs are intentionally excluded)
31
+
32
+ Rationale: `VerificationReport.v1` needs to refer to `manifestHash`, so including `verify/*` in the manifest would create circular hashing.
33
+
34
+ ## `verify/verification_report.json` (VerificationReport.v1)
35
+
36
+ `VerificationReport.v1` is canonical JSON with:
37
+ - `tool`: identifies the generator/verifier version for auditability
38
+ - `signer`: provenance for the report signer (including governance event ref when available)
39
+ - `subject.manifestHash`: must equal the bundle `manifestHash`
40
+ - `reportHash`: sha256 over canonical JSON of the report core (excluding signature fields)
41
+ - `signature`: Ed25519 signature over `reportHash`
42
+
43
+ Strict verification requires the report to be present **and signed**.
44
+
45
+ If the tool version cannot be determined, the report will include a warning code `TOOL_VERSION_UNKNOWN`.
46
+
47
+ ## Strict Verification Invariants
48
+
49
+ In strict mode (`settld-verify --strict --finance-pack ...`):
50
+ - The embedded `MonthProofBundle.v1` must strictly verify.
51
+ - `attestation/bundle_head_attestation.json` must exist and have a valid signature.
52
+ - `verify/verification_report.json` must exist, have a valid `reportHash`, and have a valid signature.
53
+ - `VerificationReport.v1.subject.manifestHash` must match the computed bundle `manifestHash`.