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,233 @@
1
+ #!/usr/bin/env node
2
+
3
+ import fs from "node:fs";
4
+ import path from "node:path";
5
+ import process from "node:process";
6
+
7
+ const DEFAULT_AUDIT_PATH = "planning/kernel-v0-truth-audit.md";
8
+
9
+ const REQUIRED_TRUE_CLAIMS_BY_MODE = {
10
+ prepublish: [
11
+ {
12
+ key: "dispute_envelope_required",
13
+ description: "Signed dispute-open envelope required for non-admin opens",
14
+ match: /signed dispute-open envelope required for non-admin opens/i
15
+ },
16
+ {
17
+ key: "holdback_freeze_open_arbitration",
18
+ description: "Holdback tick skips auto-release when arbitration is open",
19
+ match: /holdback tick skips auto-release when arbitration is open/i
20
+ },
21
+ {
22
+ key: "deterministic_holdback_adjustment",
23
+ description: "Deterministic holdback adjustment flow exists",
24
+ match: /deterministic holdback adjustment flow exists/i
25
+ },
26
+ {
27
+ key: "tool_call_replay_endpoint",
28
+ description: "Tool-call replay endpoint exists and is wired",
29
+ match: /tool-call replay endpoint exists and is wired/i
30
+ },
31
+ {
32
+ key: "run_replay_endpoint",
33
+ description: "Run settlement replay endpoint exists",
34
+ match: /run settlement replay endpoint exists/i
35
+ },
36
+ {
37
+ key: "closepack_offline_verify_gated",
38
+ description: "Closepack export + offline verify exists and is conformance-gated",
39
+ match: /closepack export \+ offline verify exists and is conformance-gated/i
40
+ },
41
+ {
42
+ key: "deterministic_verifier_meaningful_fail",
43
+ description: "Deterministic verifier exists with at least one meaningful failing case",
44
+ match: /deterministic verifier exists with at least one meaningful failing case/i
45
+ },
46
+ {
47
+ key: "reputation_true",
48
+ description: "Reputation is indexed/readable and idempotent insert paths exist",
49
+ match: /reputation is indexed\/readable and idempotent insert paths exist/i
50
+ },
51
+ {
52
+ key: "registry_publish_wired",
53
+ description: "Registry publish is wired",
54
+ match: /registry publish is wired/i
55
+ }
56
+ ],
57
+ postpublish: [
58
+ {
59
+ key: "dispute_envelope_required",
60
+ description: "Signed dispute-open envelope required for non-admin opens",
61
+ match: /signed dispute-open envelope required for non-admin opens/i
62
+ },
63
+ {
64
+ key: "holdback_freeze_open_arbitration",
65
+ description: "Holdback tick skips auto-release when arbitration is open",
66
+ match: /holdback tick skips auto-release when arbitration is open/i
67
+ },
68
+ {
69
+ key: "deterministic_holdback_adjustment",
70
+ description: "Deterministic holdback adjustment flow exists",
71
+ match: /deterministic holdback adjustment flow exists/i
72
+ },
73
+ {
74
+ key: "tool_call_replay_endpoint",
75
+ description: "Tool-call replay endpoint exists and is wired",
76
+ match: /tool-call replay endpoint exists and is wired/i
77
+ },
78
+ {
79
+ key: "run_replay_endpoint",
80
+ description: "Run settlement replay endpoint exists",
81
+ match: /run settlement replay endpoint exists/i
82
+ },
83
+ {
84
+ key: "closepack_offline_verify_gated",
85
+ description: "Closepack export + offline verify exists and is conformance-gated",
86
+ match: /closepack export \+ offline verify exists and is conformance-gated/i
87
+ },
88
+ {
89
+ key: "deterministic_verifier_meaningful_fail",
90
+ description: "Deterministic verifier exists with at least one meaningful failing case",
91
+ match: /deterministic verifier exists with at least one meaningful failing case/i
92
+ },
93
+ {
94
+ key: "reputation_true",
95
+ description: "Reputation is indexed/readable and idempotent insert paths exist",
96
+ match: /reputation is indexed\/readable and idempotent insert paths exist/i
97
+ },
98
+ {
99
+ key: "npm_publish_proven",
100
+ description: "First live npm publish proven",
101
+ match: /first live npm publish proven/i
102
+ }
103
+ ]
104
+ };
105
+
106
+ const REQUIRED_TRUE_CLAIMS = REQUIRED_TRUE_CLAIMS_BY_MODE.prepublish;
107
+
108
+ function parseArgs(argv) {
109
+ const args = argv.slice(2);
110
+ const out = { file: DEFAULT_AUDIT_PATH, mode: "prepublish" };
111
+ for (let i = 0; i < args.length; i += 1) {
112
+ const a = args[i];
113
+ if ((a === "--file" || a === "-f") && args[i + 1]) {
114
+ out.file = args[i + 1];
115
+ i += 1;
116
+ } else if ((a === "--mode" || a === "-m") && args[i + 1]) {
117
+ const mode = String(args[i + 1]).trim().toLowerCase();
118
+ if (mode !== "prepublish" && mode !== "postpublish") {
119
+ throw new Error(`invalid --mode: ${mode} (expected prepublish|postpublish)`);
120
+ }
121
+ out.mode = mode;
122
+ i += 1;
123
+ } else if (a === "--help" || a === "-h") {
124
+ out.help = true;
125
+ } else {
126
+ throw new Error(`unknown argument: ${a}`);
127
+ }
128
+ }
129
+ return out;
130
+ }
131
+
132
+ function usage() {
133
+ return [
134
+ "Usage: node scripts/ci/check-kernel-v0-launch-gate.mjs [--file <path>] [--mode prepublish|postpublish]",
135
+ "",
136
+ "Fails when required Kernel v0 launch claims are not marked TRUE in",
137
+ "planning/kernel-v0-truth-audit.md."
138
+ ].join("\n");
139
+ }
140
+
141
+ function parseClaimStatuses(markdown) {
142
+ const rows = [];
143
+ const lines = markdown.split(/\r?\n/);
144
+ for (const line of lines) {
145
+ if (!line.startsWith("|")) continue;
146
+ const cols = line.split("|").map((c) => c.trim());
147
+ if (cols.length < 4) continue;
148
+ const claim = cols[1] || "";
149
+ const statusCell = cols[2] || "";
150
+ if (!claim || /^-+$/.test(claim.replace(/\s+/g, ""))) continue;
151
+ const statusMatch = statusCell.match(/\*\*(TRUE|PARTIAL|FALSE)\*\*/i);
152
+ if (!statusMatch) continue;
153
+ rows.push({ claim, status: statusMatch[1].toUpperCase() });
154
+ }
155
+ return rows;
156
+ }
157
+
158
+ function findClaim(rows, matcher) {
159
+ return rows.find((r) => matcher.test(r.claim));
160
+ }
161
+
162
+ function main() {
163
+ let opts;
164
+ try {
165
+ opts = parseArgs(process.argv);
166
+ } catch (err) {
167
+ console.error(String(err?.message || err));
168
+ console.error("");
169
+ console.error(usage());
170
+ process.exit(2);
171
+ }
172
+
173
+ if (opts.help) {
174
+ console.log(usage());
175
+ return;
176
+ }
177
+
178
+ const auditPath = path.resolve(process.cwd(), opts.file);
179
+ if (!fs.existsSync(auditPath)) {
180
+ console.error(`launch gate audit file not found: ${auditPath}`);
181
+ process.exit(2);
182
+ }
183
+
184
+ const markdown = fs.readFileSync(auditPath, "utf8");
185
+ const rows = parseClaimStatuses(markdown);
186
+ if (rows.length === 0) {
187
+ console.error(`no TRUE/PARTIAL/FALSE claim rows found in ${auditPath}`);
188
+ process.exit(2);
189
+ }
190
+ const requiredClaims = REQUIRED_TRUE_CLAIMS_BY_MODE[opts.mode] || REQUIRED_TRUE_CLAIMS;
191
+
192
+ const failures = [];
193
+ const passes = [];
194
+ for (const requirement of requiredClaims) {
195
+ const row = findClaim(rows, requirement.match);
196
+ if (!row) {
197
+ failures.push({
198
+ key: requirement.key,
199
+ description: requirement.description,
200
+ reason: "MISSING_CLAIM_ROW"
201
+ });
202
+ continue;
203
+ }
204
+ if (row.status !== "TRUE") {
205
+ failures.push({
206
+ key: requirement.key,
207
+ description: requirement.description,
208
+ reason: `STATUS_${row.status}`
209
+ });
210
+ continue;
211
+ }
212
+ passes.push({ key: requirement.key, description: requirement.description });
213
+ }
214
+
215
+ console.log("Kernel v0 launch gate checklist");
216
+ console.log(`Mode: ${opts.mode}`);
217
+ console.log(`Audit file: ${path.relative(process.cwd(), auditPath)}`);
218
+ console.log(`Required TRUE claims: ${requiredClaims.length}`);
219
+ console.log(`Pass: ${passes.length}`);
220
+ console.log(`Fail: ${failures.length}`);
221
+
222
+ if (failures.length > 0) {
223
+ console.error("\nLaunch gate check failed:");
224
+ for (const failure of failures) {
225
+ console.error(`- ${failure.key}: ${failure.description} (${failure.reason})`);
226
+ }
227
+ process.exit(1);
228
+ }
229
+
230
+ console.log("\nAll required launch gate claims are TRUE.");
231
+ }
232
+
233
+ main();
@@ -0,0 +1,78 @@
1
+ #!/usr/bin/env node
2
+ import fs from "node:fs";
3
+ import path from "node:path";
4
+ import { execFileSync } from "node:child_process";
5
+
6
+ const PRIVATE_KEY_PATTERNS = Object.freeze([
7
+ /(^|\r?\n)-----BEGIN PRIVATE KEY-----\r?\n/m,
8
+ /(^|\r?\n)-----BEGIN EC PRIVATE KEY-----\r?\n/m,
9
+ /(^|\r?\n)-----BEGIN RSA PRIVATE KEY-----\r?\n/m,
10
+ /(^|\r?\n)-----BEGIN OPENSSH PRIVATE KEY-----\r?\n/m
11
+ ]);
12
+
13
+ const ALLOWED_PREFIXES = Object.freeze([
14
+ "test/fixtures/",
15
+ "conformance/",
16
+ "docs/spec/examples/",
17
+ "scripts/pilot/fixtures/"
18
+ ]);
19
+
20
+ function listTrackedFiles() {
21
+ const output = execFileSync("git", ["ls-files", "-z"], { encoding: "utf8" });
22
+ return output
23
+ .split("\0")
24
+ .map((row) => row.trim())
25
+ .filter((row) => row.length > 0);
26
+ }
27
+
28
+ function isAllowedFixturePath(filePath) {
29
+ return ALLOWED_PREFIXES.some((prefix) => filePath.startsWith(prefix));
30
+ }
31
+
32
+ function hasPrivateKeyMaterial(filePath) {
33
+ const absolutePath = path.resolve(process.cwd(), filePath);
34
+ const buffer = fs.readFileSync(absolutePath);
35
+ if (buffer.includes(0)) return false;
36
+ const text = buffer.toString("utf8");
37
+ return PRIVATE_KEY_PATTERNS.some((pattern) => pattern.test(text));
38
+ }
39
+
40
+ function main() {
41
+ const tracked = listTrackedFiles();
42
+ const violations = [];
43
+
44
+ for (const filePath of tracked) {
45
+ if (filePath.startsWith("keys/")) {
46
+ violations.push(`${filePath}: tracked key material is forbidden`);
47
+ continue;
48
+ }
49
+ if (isAllowedFixturePath(filePath)) continue;
50
+ try {
51
+ if (hasPrivateKeyMaterial(filePath)) {
52
+ violations.push(`${filePath}: private key marker detected`);
53
+ }
54
+ } catch (err) {
55
+ violations.push(`${filePath}: failed to scan (${err?.message ?? String(err)})`);
56
+ }
57
+ }
58
+
59
+ if (violations.length > 0) {
60
+ process.stderr.write("secret hygiene check failed:\n");
61
+ for (const violation of violations) process.stderr.write(`- ${violation}\n`);
62
+ process.exit(1);
63
+ }
64
+
65
+ process.stdout.write(
66
+ JSON.stringify(
67
+ {
68
+ ok: true,
69
+ checkedAt: new Date().toISOString(),
70
+ trackedFilesScanned: tracked.length
71
+ },
72
+ null,
73
+ 2
74
+ ) + "\n"
75
+ );
76
+ }
77
+
78
+ main();
@@ -0,0 +1,42 @@
1
+ import fs from "node:fs";
2
+ import path from "node:path";
3
+
4
+ function readTrimmed(filePath) {
5
+ return String(fs.readFileSync(filePath, "utf8")).trim();
6
+ }
7
+
8
+ function fail(message) {
9
+ // eslint-disable-next-line no-console
10
+ console.error(message);
11
+ process.exit(1);
12
+ }
13
+
14
+ const repoRoot = process.cwd();
15
+ const settldVersionPath = path.join(repoRoot, "SETTLD_VERSION");
16
+ const artifactVerifyPackagePath = path.join(repoRoot, "packages", "artifact-verify", "package.json");
17
+
18
+ if (!fs.existsSync(settldVersionPath)) {
19
+ fail("version consistency check failed: SETTLD_VERSION file is missing");
20
+ }
21
+ if (!fs.existsSync(artifactVerifyPackagePath)) {
22
+ fail("version consistency check failed: packages/artifact-verify/package.json is missing");
23
+ }
24
+
25
+ const repoVersion = readTrimmed(settldVersionPath);
26
+ const artifactVerifyPackage = JSON.parse(fs.readFileSync(artifactVerifyPackagePath, "utf8"));
27
+ const artifactVerifyVersion = String(artifactVerifyPackage.version ?? "").trim();
28
+
29
+ if (!repoVersion) {
30
+ fail("version consistency check failed: SETTLD_VERSION is empty");
31
+ }
32
+ if (!artifactVerifyVersion) {
33
+ fail("version consistency check failed: packages/artifact-verify/package.json version is empty");
34
+ }
35
+ if (repoVersion !== artifactVerifyVersion) {
36
+ fail(
37
+ `version consistency check failed: SETTLD_VERSION=${repoVersion} does not match packages/artifact-verify/package.json version=${artifactVerifyVersion}`
38
+ );
39
+ }
40
+
41
+ // eslint-disable-next-line no-console
42
+ console.log(`version consistency check passed: ${repoVersion}`);
@@ -0,0 +1,160 @@
1
+ import { 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 res = spawnSync(cmd, args, { cwd, env, encoding: "utf8" });
8
+ if (res.status !== 0) {
9
+ const err = (res.stderr || res.stdout || "").trim();
10
+ throw new Error(`${cmd} ${args.join(" ")} failed (exit ${res.status})${err ? `: ${err}` : ""}`);
11
+ }
12
+ return res.stdout;
13
+ }
14
+
15
+ function assert(cond, msg) {
16
+ if (!cond) throw new Error(msg);
17
+ }
18
+
19
+ function shellQuote(value) {
20
+ return `'${String(value).replace(/'/g, `'\"'\"'`)}'`;
21
+ }
22
+
23
+ async function main() {
24
+ const repoRoot = process.cwd();
25
+ const packDir = await fs.mkdtemp(path.join(os.tmpdir(), "settld-cli-pack-"));
26
+ const unpackDir = await fs.mkdtemp(path.join(os.tmpdir(), "settld-cli-unpack-"));
27
+ const outDir = await fs.mkdtemp(path.join(os.tmpdir(), "settld-cli-out-"));
28
+ const npmCacheDir = await fs.mkdtemp(path.join(os.tmpdir(), "settld-cli-cache-"));
29
+
30
+ const npmEnv = {
31
+ ...process.env,
32
+ NPM_CONFIG_CACHE: npmCacheDir,
33
+ npm_config_cache: npmCacheDir,
34
+ npm_config_update_notifier: "false"
35
+ };
36
+
37
+ try {
38
+ sh("npm", ["--cache", npmCacheDir, "pack", "--silent", "--pack-destination", packDir], { cwd: repoRoot, env: npmEnv });
39
+ const packed = (await fs.readdir(packDir)).filter((name) => /^settld-.*\.tgz$/.test(name)).sort();
40
+ assert(packed.length > 0, "npm pack did not produce settld-*.tgz");
41
+ const tarballPath = path.join(packDir, packed[packed.length - 1]);
42
+ sh("tar", ["-xzf", tarballPath, "-C", unpackDir], { env: npmEnv });
43
+ const packageRoot = path.join(unpackDir, "package");
44
+ const cliPath = path.join(packageRoot, "bin", "settld.js");
45
+
46
+ const runTarballCli = (args) => {
47
+ const cmd = ["npx", "--yes", "--package", tarballPath, "--", "settld", ...args].map(shellQuote).join(" ");
48
+ const res = spawnSync("bash", ["-lc", cmd], {
49
+ cwd: packDir,
50
+ env: npmEnv,
51
+ encoding: "utf8"
52
+ });
53
+ const blockedBySandbox =
54
+ res.error &&
55
+ res.error.code === "EPERM" &&
56
+ res.status === 0 &&
57
+ String(res.stdout ?? "").trim() === "" &&
58
+ String(res.stderr ?? "").trim() === "";
59
+ if (blockedBySandbox) return { stdout: "", blockedBySandbox: true };
60
+ if (res.status !== 0) {
61
+ const err = (res.stderr || res.stdout || "").trim();
62
+ throw new Error(`npx --package <tarball> settld ${args.join(" ")} failed (exit ${res.status})${err ? `: ${err}` : ""}`);
63
+ }
64
+ return { stdout: String(res.stdout ?? ""), blockedBySandbox: false };
65
+ };
66
+
67
+ const runCli = (args) => {
68
+ const cmd = [process.execPath, cliPath, ...args].map(shellQuote).join(" ");
69
+ const res = spawnSync("bash", ["-lc", cmd], {
70
+ cwd: packageRoot,
71
+ env: npmEnv,
72
+ encoding: "utf8"
73
+ });
74
+ const blockedBySandbox =
75
+ res.error &&
76
+ res.error.code === "EPERM" &&
77
+ res.status === 0 &&
78
+ String(res.stdout ?? "").trim() === "" &&
79
+ String(res.stderr ?? "").trim() === "";
80
+ if (blockedBySandbox) return { stdout: "", blockedBySandbox: true };
81
+ if (res.status !== 0) {
82
+ const err = (res.stderr || res.stdout || "").trim();
83
+ throw new Error(`settld ${args.join(" ")} failed (exit ${res.status})${err ? `: ${err}` : ""}`);
84
+ }
85
+ return { stdout: String(res.stdout ?? ""), blockedBySandbox: false };
86
+ };
87
+
88
+ const versionResult = runTarballCli(["--version"]);
89
+ const sandboxBlocked = versionResult.blockedBySandbox === true;
90
+ if (!sandboxBlocked) {
91
+ const version = versionResult.stdout.trim();
92
+ assert(/^[0-9]+\.[0-9]+\.[0-9]+(?:-[0-9A-Za-z-.]+)?$/.test(version), `unexpected settld --version output: ${JSON.stringify(version)}`);
93
+ }
94
+
95
+ if (sandboxBlocked) {
96
+ // In restricted sandboxes some child-process invocations return EPERM with status=0 and no IO.
97
+ // Fall back to static package checks; CI environments still execute the full behavioral path above.
98
+ await fs.access(path.join(packageRoot, "bin", "settld.js"));
99
+ await fs.access(path.join(packageRoot, "scripts", "init", "capability.mjs"));
100
+ await fs.access(path.join(packageRoot, "conformance", "kernel-v0", "run.mjs"));
101
+ await fs.access(path.join(packageRoot, "scripts", "closepack", "verify.mjs"));
102
+ await fs.access(path.join(packageRoot, "SETTLD_VERSION"));
103
+ await fs.access(path.join(packageRoot, "Dockerfile"));
104
+ await fs.access(path.join(packageRoot, "docker-compose.yml"));
105
+ await fs.access(path.join(packageRoot, "src", "api", "server.js"));
106
+ await fs.access(path.join(packageRoot, "services", "receiver", "src", "server.js"));
107
+ try {
108
+ await fs.access(path.join(packageRoot, "test"));
109
+ throw new Error("packed CLI unexpectedly includes test/ directory");
110
+ } catch (err) {
111
+ if (String(err?.message ?? "").includes("unexpectedly includes")) throw err;
112
+ }
113
+ try {
114
+ await fs.access(path.join(packageRoot, ".github"));
115
+ throw new Error("packed CLI unexpectedly includes .github/ directory");
116
+ } catch (err) {
117
+ if (String(err?.message ?? "").includes("unexpectedly includes")) throw err;
118
+ }
119
+ return;
120
+ }
121
+
122
+ const tarballCases = runTarballCli(["conformance", "kernel:list"]).stdout
123
+ .split(/\r?\n/)
124
+ .map((line) => line.trim())
125
+ .filter(Boolean);
126
+ assert(tarballCases.length > 0, "npx --package <tarball> settld conformance kernel:list returned no cases");
127
+
128
+ const infoRaw = runCli(["dev", "info"]).stdout.trim();
129
+ const info = JSON.parse(infoRaw);
130
+ assert(String(info.baseUrl ?? "") === "http://127.0.0.1:3000", "settld dev info baseUrl mismatch");
131
+ assert(String(info.tenantId ?? "") === "tenant_default", "settld dev info tenantId mismatch");
132
+ assert(String(info.opsToken ?? "") === "tok_ops", "settld dev info opsToken mismatch");
133
+
134
+ const cases = runCli(["conformance", "kernel:list"]).stdout
135
+ .split(/\r?\n/)
136
+ .map((line) => line.trim())
137
+ .filter(Boolean);
138
+ assert(cases.length > 0, "settld conformance kernel:list returned no cases");
139
+
140
+ runCli(["closepack", "verify", "--help"]);
141
+ runCli(["x402", "receipt", "verify", "--help"]);
142
+
143
+ const starterDir = path.join(outDir, "starter-capability");
144
+ runCli(["init", "capability", "smoke-capability", "--out", starterDir]);
145
+ await fs.access(path.join(starterDir, "manifest.json"));
146
+ await fs.access(path.join(starterDir, "manifest.sig.json"));
147
+ await fs.access(path.join(starterDir, "server.js"));
148
+ await fs.access(path.join(starterDir, "scripts", "kernel-prove.mjs"));
149
+ await fs.access(path.join(starterDir, "scripts", "kernel-conformance.mjs"));
150
+ const kernelProveSource = await fs.readFile(path.join(starterDir, "scripts", "kernel-prove.mjs"), "utf8");
151
+ assert(kernelProveSource.includes("import(\"settld-api-sdk\")"), "starter kernel-prove script must attempt npm SDK import first");
152
+ } finally {
153
+ await fs.rm(packDir, { recursive: true, force: true });
154
+ await fs.rm(unpackDir, { recursive: true, force: true });
155
+ await fs.rm(outDir, { recursive: true, force: true });
156
+ await fs.rm(npmCacheDir, { recursive: true, force: true });
157
+ }
158
+ }
159
+
160
+ await main();
@@ -0,0 +1,68 @@
1
+ #!/usr/bin/env node
2
+
3
+ import { readFile } from "node:fs/promises";
4
+ import path from "node:path";
5
+
6
+ const ROOT = process.cwd();
7
+ const WORKFLOW_PATH = path.join(ROOT, ".github", "workflows", "tests.yml");
8
+ const POLICY_DOC_PATH = path.join(ROOT, "docs", "ops", "CI_FLAKE_BUDGET.md");
9
+
10
+ function fail(msg) {
11
+ process.stderr.write(`[flake-budget-guard] ${msg}\n`);
12
+ process.exit(1);
13
+ }
14
+
15
+ function requirePattern({ text, pattern, label }) {
16
+ if (!pattern.test(text)) {
17
+ fail(`missing required policy marker: ${label}`);
18
+ }
19
+ }
20
+
21
+ function forbidPattern({ text, pattern, label }) {
22
+ if (pattern.test(text)) {
23
+ fail(`forbidden flaky tolerance detected: ${label}`);
24
+ }
25
+ }
26
+
27
+ async function main() {
28
+ const [workflowText, policyText] = await Promise.all([
29
+ readFile(WORKFLOW_PATH, "utf8"),
30
+ readFile(POLICY_DOC_PATH, "utf8")
31
+ ]);
32
+
33
+ // Guard against silent flake debt by forbidding retry/continue-on-error patterns
34
+ // in the canonical tests workflow.
35
+ forbidPattern({
36
+ text: workflowText,
37
+ pattern: /\bcontinue-on-error\s*:\s*true\b/i,
38
+ label: "continue-on-error: true"
39
+ });
40
+ forbidPattern({
41
+ text: workflowText,
42
+ pattern: /\b--retries?\b/i,
43
+ label: "explicit retry flag"
44
+ });
45
+
46
+ // Keep policy explicit and discoverable.
47
+ requirePattern({
48
+ text: policyText,
49
+ pattern: /^#\s*CI Flake Budget/m,
50
+ label: "CI Flake Budget heading"
51
+ });
52
+ requirePattern({
53
+ text: policyText,
54
+ pattern: /\bBudget:\s*0\b/i,
55
+ label: "Budget: 0 policy"
56
+ });
57
+ requirePattern({
58
+ text: policyText,
59
+ pattern: /\bEscalation\b/i,
60
+ label: "Escalation section"
61
+ });
62
+
63
+ process.stdout.write("[flake-budget-guard] ok\n");
64
+ }
65
+
66
+ main().catch((err) => {
67
+ fail(err?.message ?? String(err ?? ""));
68
+ });
@@ -0,0 +1,54 @@
1
+ import fs from "node:fs/promises";
2
+ import path from "node:path";
3
+
4
+ async function walk(dir) {
5
+ const out = [];
6
+ const entries = await fs.readdir(dir, { withFileTypes: true });
7
+ for (const e of entries) {
8
+ const fp = path.join(dir, e.name);
9
+ if (e.isDirectory()) {
10
+ // eslint-disable-next-line no-await-in-loop
11
+ out.push(...(await walk(fp)));
12
+ } else if (e.isFile() && fp.endsWith(".js")) out.push(fp);
13
+ }
14
+ return out;
15
+ }
16
+
17
+ function stableSortStrings(list) {
18
+ return [...list].sort((a, b) => (a < b ? -1 : a > b ? 1 : 0));
19
+ }
20
+
21
+ function extractErrorCodesFromJsSource(source) {
22
+ const codes = new Set();
23
+ const re = /\berror\s*:\s*"([^"]+)"/g;
24
+ let m;
25
+ while ((m = re.exec(source)) !== null) {
26
+ codes.add(m[1]);
27
+ }
28
+ // CLI-specific "errors[]" code (not an `error:` field).
29
+ if (source.includes('code: "FAIL_ON_WARNINGS"')) codes.add("FAIL_ON_WARNINGS");
30
+ // Defensive fallback used by CLI when no `result.error` exists.
31
+ if (source.includes('"FAILED"')) codes.add("FAILED");
32
+ return codes;
33
+ }
34
+
35
+ async function main() {
36
+ const repoRoot = process.cwd();
37
+ const srcFiles = await walk(path.join(repoRoot, "packages", "artifact-verify", "src"));
38
+ const cliFile = path.join(repoRoot, "packages", "artifact-verify", "bin", "settld-verify.js");
39
+ const files = [...srcFiles, cliFile];
40
+
41
+ const codes = new Set();
42
+ for (const fp of files) {
43
+ // eslint-disable-next-line no-await-in-loop
44
+ const text = await fs.readFile(fp, "utf8");
45
+ for (const c of extractErrorCodesFromJsSource(text)) codes.add(c);
46
+ }
47
+
48
+ const outPath = path.join(repoRoot, "docs", "spec", "error-codes.v1.txt");
49
+ const lines = stableSortStrings(codes);
50
+ await fs.writeFile(outPath, lines.join("\n") + "\n", "utf8");
51
+ }
52
+
53
+ await main();
54
+