settld 0.1.2 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (483) hide show
  1. package/README.md +93 -3
  2. package/SETTLD_VERSION +1 -1
  3. package/bin/settld-mcp +2 -0
  4. package/bin/settld.js +71 -0
  5. package/conformance/kernel-v0/README.md +7 -0
  6. package/conformance/kernel-v0/run.mjs +292 -4
  7. package/docs/ACCESS.md +57 -0
  8. package/docs/ADOPTION_CHECKLIST.md +44 -0
  9. package/docs/ALERTS.md +198 -0
  10. package/docs/ARCHITECTURE.md +69 -0
  11. package/docs/ARCHITECTURE_FOUNDER_GUIDE.md +284 -0
  12. package/docs/ARTIFACTS.md +60 -0
  13. package/docs/CERTIFICATION_CHECKLIST.md +33 -0
  14. package/docs/CIRCLE_SANDBOX_E2E.md +152 -0
  15. package/docs/CONFIG.md +297 -0
  16. package/docs/CONTRACTS_APIS.md +23 -0
  17. package/docs/DEPRECATION.md +31 -0
  18. package/docs/DOMAIN_MODEL.md +92 -0
  19. package/docs/EVENT_ENVELOPE.md +53 -0
  20. package/docs/FINANCE_PACK_FORMAT.md +53 -0
  21. package/docs/INCIDENT_TAXONOMY.md +30 -0
  22. package/docs/JOB_STATE_MACHINE.md +66 -0
  23. package/docs/KERNEL_COMPATIBLE.md +60 -0
  24. package/docs/KERNEL_V0.md +40 -0
  25. package/docs/KEY_ROTATION.md +80 -0
  26. package/docs/LEDGER.md +82 -0
  27. package/docs/LIVENESS.md +76 -0
  28. package/docs/MVP_BUILD_ORDER.md +36 -0
  29. package/docs/ONCALL_PLAYBOOK.md +39 -0
  30. package/docs/OPERATIONS_SIGNING.md +20 -0
  31. package/docs/OVERVIEW.md +190 -0
  32. package/docs/PERF_BASELINE.md +85 -0
  33. package/docs/PRD.md +77 -0
  34. package/docs/QUICKSTART_KERNEL_V0.md +96 -0
  35. package/docs/QUICKSTART_MCP.md +377 -0
  36. package/docs/QUICKSTART_MCP_HOSTS.md +210 -0
  37. package/docs/QUICKSTART_POLICY_PACKS.md +65 -0
  38. package/docs/QUICKSTART_PRODUCE.md +61 -0
  39. package/docs/QUICKSTART_PROFILES.md +198 -0
  40. package/docs/QUICKSTART_RELEASE_VERIFY.md +39 -0
  41. package/docs/QUICKSTART_SDK.md +125 -0
  42. package/docs/QUICKSTART_SDK_PYTHON.md +111 -0
  43. package/docs/QUICKSTART_VERIFY.md +54 -0
  44. package/docs/QUICKSTART_X402_GATEWAY.md +317 -0
  45. package/docs/README.md +33 -0
  46. package/docs/RELEASE_CHECKLIST.md +182 -0
  47. package/docs/RELEASING.md +82 -0
  48. package/docs/REPO_SETTINGS.md +37 -0
  49. package/docs/RUNBOOK.md +86 -0
  50. package/docs/SKILLS.md +42 -0
  51. package/docs/SKILL_BUNDLE_FORMAT.md +48 -0
  52. package/docs/SLO.md +131 -0
  53. package/docs/SUMMARY.md +17 -0
  54. package/docs/SUPPORT.md +31 -0
  55. package/docs/THREAT_MODEL.md +36 -0
  56. package/docs/TRUST.md +59 -0
  57. package/docs/WORKFLOW.md +35 -0
  58. package/docs/X402_BATCH_SETTLEMENT.md +126 -0
  59. package/docs/blog/2026-02-14-your-ai-agent-just-spent-500-where-is-the-receipt.md +73 -0
  60. package/docs/examples/x402-provider-payout-registry.example.json +14 -0
  61. package/docs/gitbook/README.md +64 -0
  62. package/docs/gitbook/SETUP.md +25 -0
  63. package/docs/gitbook/SUMMARY.md +15 -0
  64. package/docs/gitbook/api-reference.md +73 -0
  65. package/docs/gitbook/closepacks.md +55 -0
  66. package/docs/gitbook/conformance.md +59 -0
  67. package/docs/gitbook/core-primitives.md +85 -0
  68. package/docs/gitbook/dispute-lifecycle.md +33 -0
  69. package/docs/gitbook/faq.md +21 -0
  70. package/docs/gitbook/guides.md +49 -0
  71. package/docs/gitbook/operations-runbook.md +36 -0
  72. package/docs/gitbook/quickstart.md +103 -0
  73. package/docs/gitbook/replay-and-audit.md +30 -0
  74. package/docs/gitbook/sdk-reference.md +35 -0
  75. package/docs/gitbook/security-model.md +58 -0
  76. package/docs/integrations/README.md +15 -0
  77. package/docs/integrations/github-actions-verify.yml +31 -0
  78. package/docs/integrations/github-actions.md +34 -0
  79. package/docs/integrations/openclaw/CLAWHUB_PUBLISH_CHECKLIST.md +65 -0
  80. package/docs/integrations/openclaw/PUBLIC_QUICKSTART.md +95 -0
  81. package/docs/integrations/openclaw/settld-mcp-skill/SKILL.md +69 -0
  82. package/docs/integrations/openclaw/settld-mcp-skill/mcp-server.example.json +12 -0
  83. package/docs/kernel-compatible/capabilities.json +36 -0
  84. package/docs/marketing/agent-commerce-substrate.md +78 -0
  85. package/docs/marketing/hn-repost-2026-02-17.md +102 -0
  86. package/docs/marketing/show-hn-post.md +45 -0
  87. package/docs/ops/ARTIFACT_VERIFICATION_STATUS.md +43 -0
  88. package/docs/ops/BILLING_WEBHOOK_REPLAY.md +105 -0
  89. package/docs/ops/CI_FLAKE_BUDGET.md +31 -0
  90. package/docs/ops/DISPUTE_FINANCE_RECONCILIATION_PACKET.md +56 -0
  91. package/docs/ops/GO_LIVE_GATE_S13.md +27 -0
  92. package/docs/ops/HOSTED_BASELINE_R2.md +129 -0
  93. package/docs/ops/KERNEL_V0_SHIP_GATE.md +69 -0
  94. package/docs/ops/LIGHTHOUSE_PRODUCTION_CLOSE.md +51 -0
  95. package/docs/ops/MCP_COMPATIBILITY_MATRIX.md +30 -0
  96. package/docs/ops/MINIMUM_PRODUCTION_TOPOLOGY.md +89 -0
  97. package/docs/ops/P0_BACKEND_PROGRESS.md +150 -0
  98. package/docs/ops/PAYMENTS_ALPHA_R5.md +105 -0
  99. package/docs/ops/PILOT_ONBOARDING_RUNBOOK.md +112 -0
  100. package/docs/ops/PRODUCTION_DEPLOYMENT_CHECKLIST.md +140 -0
  101. package/docs/ops/R1_SLOS.md +66 -0
  102. package/docs/ops/RELEASE_SIGNING_INCIDENT.md +58 -0
  103. package/docs/ops/SELF_SERVE_LAUNCH_AUTOMATION.md +89 -0
  104. package/docs/ops/THROUGHPUT_DRILL_10X.md +48 -0
  105. package/docs/ops/TRUST_CONFIG_WIZARD.md +60 -0
  106. package/docs/ops/X402_PILOT_WEEKLY_METRICS.md +76 -0
  107. package/docs/ops/tool-call-disputes-holdback.md +52 -0
  108. package/docs/pilot-kit/PILOT_PACKAGE_SCORECARD_X402.md +46 -0
  109. package/docs/pilot-kit/README.md +29 -0
  110. package/docs/pilot-kit/architecture-one-pager.md +48 -0
  111. package/docs/pilot-kit/buyer-email.txt +19 -0
  112. package/docs/pilot-kit/buyer-one-pager.md +31 -0
  113. package/docs/pilot-kit/gtm-pilot-playbook.md +182 -0
  114. package/docs/pilot-kit/offline-verify.md +33 -0
  115. package/docs/pilot-kit/procurement-one-pager.md +50 -0
  116. package/docs/pilot-kit/rfp-clause.md +46 -0
  117. package/docs/pilot-kit/roi-calculator-template.csv +2 -0
  118. package/docs/pilot-kit/security-qa.md +153 -0
  119. package/docs/pilot-kit/security-summary.md +35 -0
  120. package/docs/plans/2026-02-13-mcp-spike-design.md +113 -0
  121. package/docs/plans/2026-02-20-trust-os-v1-jira-backlog.md +348 -0
  122. package/docs/plans/2026-02-21-agent-economic-actor-operating-model.md +169 -0
  123. package/docs/plans/2026-02-21-trust-os-v1-strategy.md +241 -0
  124. package/docs/research/2026-02-21-agent-spend-host-landscape.md +57 -0
  125. package/docs/spec/AcceptanceCriteria.v1.md +17 -0
  126. package/docs/spec/AcceptanceEvaluation.v1.md +10 -0
  127. package/docs/spec/AgentEvent.v1.md +47 -0
  128. package/docs/spec/AgentIdentity.v1.md +62 -0
  129. package/docs/spec/AgentPassport.v1.md +95 -0
  130. package/docs/spec/AgentReputation.v1.md +59 -0
  131. package/docs/spec/AgentReputation.v2.md +52 -0
  132. package/docs/spec/AgentRun.v1.md +47 -0
  133. package/docs/spec/AgentRunSettlement.v1.md +52 -0
  134. package/docs/spec/AgentWallet.v1.md +43 -0
  135. package/docs/spec/AgreementDelegation.v1.md +109 -0
  136. package/docs/spec/ArbitrationCase.v1.md +67 -0
  137. package/docs/spec/ArbitrationOutcomeMapping.v1.md +62 -0
  138. package/docs/spec/ArbitrationVerdict.v1.md +60 -0
  139. package/docs/spec/BundleHeadAttestation.v1.md +32 -0
  140. package/docs/spec/CANONICAL_JSON.md +31 -0
  141. package/docs/spec/CRYPTOGRAPHY.md +61 -0
  142. package/docs/spec/ClosePack.v1.md +49 -0
  143. package/docs/spec/ClosePackManifest.v1.md +24 -0
  144. package/docs/spec/DelegationGrant.v1.md +90 -0
  145. package/docs/spec/DisputeCaseLifecycle.v1.md +51 -0
  146. package/docs/spec/DisputeOpenEnvelope.v1.md +43 -0
  147. package/docs/spec/ERRORS.md +76 -0
  148. package/docs/spec/ESCROW_NETTING_INVARIANTS.md +71 -0
  149. package/docs/spec/EvidenceIndex.v1.md +20 -0
  150. package/docs/spec/ExecutionIntent.v1.md +90 -0
  151. package/docs/spec/FinancePackBundleManifest.v1.md +24 -0
  152. package/docs/spec/FundingHold.v1.md +60 -0
  153. package/docs/spec/GovernancePolicy.v1.md +34 -0
  154. package/docs/spec/GovernancePolicy.v2.md +30 -0
  155. package/docs/spec/INVARIANTS.md +389 -0
  156. package/docs/spec/InteractionDirectionMatrix.v1.md +30 -0
  157. package/docs/spec/InvoiceBundleManifest.v1.md +24 -0
  158. package/docs/spec/InvoiceClaim.v1.md +11 -0
  159. package/docs/spec/MONEY_RAIL_STATE_MACHINE.md +58 -0
  160. package/docs/spec/MarketplaceAcceptance.v2.md +46 -0
  161. package/docs/spec/MarketplaceOffer.v2.md +54 -0
  162. package/docs/spec/MeteringReport.v1.md +18 -0
  163. package/docs/spec/OperatorAction.v1.md +90 -0
  164. package/docs/spec/PRODUCER_ERRORS.md +42 -0
  165. package/docs/spec/PolicyDecision.v1.md +83 -0
  166. package/docs/spec/PricingMatrix.v1.md +20 -0
  167. package/docs/spec/PricingMatrixSignatures.v1.md +30 -0
  168. package/docs/spec/PricingMatrixSignatures.v2.md +29 -0
  169. package/docs/spec/ProduceCliOutput.v1.md +46 -0
  170. package/docs/spec/ProofBundleManifest.v1.md +24 -0
  171. package/docs/spec/README.md +109 -0
  172. package/docs/spec/REFERENCE_IMPLEMENTATIONS.md +29 -0
  173. package/docs/spec/REFERENCE_VERIFIER_BEHAVIOR.md +68 -0
  174. package/docs/spec/REMOTE_SIGNER.md +66 -0
  175. package/docs/spec/ReleaseIndex.v1.md +32 -0
  176. package/docs/spec/ReleaseIndexSignatures.v1.md +17 -0
  177. package/docs/spec/ReleaseTrust.v1.md +13 -0
  178. package/docs/spec/ReleaseTrust.v2.md +26 -0
  179. package/docs/spec/RemoteSignerRequest.v1.md +21 -0
  180. package/docs/spec/RemoteSignerResponse.v1.md +16 -0
  181. package/docs/spec/ReputationEvent.v1.md +63 -0
  182. package/docs/spec/RevocationList.v1.md +28 -0
  183. package/docs/spec/SIGNER_PROVIDER_PLUGIN.md +32 -0
  184. package/docs/spec/STRICTNESS.md +68 -0
  185. package/docs/spec/SUPPLY_CHAIN.md +33 -0
  186. package/docs/spec/SettlementAdjustment.v1.md +45 -0
  187. package/docs/spec/SettlementDecisionRecord.v1.md +48 -0
  188. package/docs/spec/SettlementDecisionRecord.v2.md +53 -0
  189. package/docs/spec/SettlementDecisionReport.v1.md +44 -0
  190. package/docs/spec/SettlementKernel.v1.md +59 -0
  191. package/docs/spec/SettlementReceipt.v1.md +63 -0
  192. package/docs/spec/SlaDefinition.v1.md +24 -0
  193. package/docs/spec/SlaEvaluation.v1.md +12 -0
  194. package/docs/spec/THREAT_MODEL.md +113 -0
  195. package/docs/spec/TOOL_PROVENANCE.md +30 -0
  196. package/docs/spec/TRUST_ANCHORS.md +84 -0
  197. package/docs/spec/TenantSettings.v1.md +90 -0
  198. package/docs/spec/TenantSettings.v2.md +99 -0
  199. package/docs/spec/TimestampProof.v1.md +25 -0
  200. package/docs/spec/ToolCallAgreement.v1.md +34 -0
  201. package/docs/spec/ToolCallEvidence.v1.md +47 -0
  202. package/docs/spec/ToolManifest.v1.md +47 -0
  203. package/docs/spec/VERIFIER_ENVIRONMENT.md +38 -0
  204. package/docs/spec/VERSIONING.md +107 -0
  205. package/docs/spec/VerificationReport.v1.md +50 -0
  206. package/docs/spec/VerifyAboutOutput.v1.md +10 -0
  207. package/docs/spec/VerifyCliOutput.v1.md +28 -0
  208. package/docs/spec/WARNINGS.md +83 -0
  209. package/docs/spec/error-codes.v1.txt +285 -0
  210. package/docs/spec/examples/agreement_delegation_v1.example.json +21 -0
  211. package/docs/spec/examples/arbitration_case_v1.example.json +26 -0
  212. package/docs/spec/examples/arbitration_verdict_v1.example.json +32 -0
  213. package/docs/spec/examples/dispute_open_envelope_v1.example.json +18 -0
  214. package/docs/spec/examples/produce_cli_output_v1.example.json +32 -0
  215. package/docs/spec/examples/release_index_signature_v1.example.json +9 -0
  216. package/docs/spec/examples/release_index_signatures_v1.example.json +14 -0
  217. package/docs/spec/examples/release_index_v1.example.json +15 -0
  218. package/docs/spec/examples/release_trust_v1.example.json +7 -0
  219. package/docs/spec/examples/release_trust_v2.example.json +22 -0
  220. package/docs/spec/examples/remote_signer_request_v1.example.json +18 -0
  221. package/docs/spec/examples/remote_signer_response_v1.example.json +8 -0
  222. package/docs/spec/examples/reputation_event_v1.example.json +29 -0
  223. package/docs/spec/examples/verification_report_v1.example.json +24 -0
  224. package/docs/spec/examples/verify_about_output_v1.example.json +29 -0
  225. package/docs/spec/examples/verify_cli_output_v1.example.json +13 -0
  226. package/docs/spec/legacy/MarketplaceAcceptance.v1.md +48 -0
  227. package/docs/spec/legacy/MarketplaceOffer.v1.md +56 -0
  228. package/docs/spec/legacy/schemas/MarketplaceAcceptance.v1.schema.json +53 -0
  229. package/docs/spec/legacy/schemas/MarketplaceOffer.v1.schema.json +61 -0
  230. package/docs/spec/producer-error-codes.v1.txt +14 -0
  231. package/docs/spec/schemas/AcceptanceCriteria.v1.schema.json +24 -0
  232. package/docs/spec/schemas/AcceptanceEvaluation.v1.schema.json +26 -0
  233. package/docs/spec/schemas/AgentEvent.v1.schema.json +49 -0
  234. package/docs/spec/schemas/AgentIdentity.v1.schema.json +129 -0
  235. package/docs/spec/schemas/AgentPassport.v1.schema.json +112 -0
  236. package/docs/spec/schemas/AgentReputation.v1.schema.json +151 -0
  237. package/docs/spec/schemas/AgentReputation.v2.schema.json +120 -0
  238. package/docs/spec/schemas/AgentRun.v1.schema.json +71 -0
  239. package/docs/spec/schemas/AgentRunSettlement.v1.schema.json +75 -0
  240. package/docs/spec/schemas/AgentWallet.v1.schema.json +54 -0
  241. package/docs/spec/schemas/AgreementDelegation.v1.schema.json +50 -0
  242. package/docs/spec/schemas/ArbitrationCase.v1.schema.json +133 -0
  243. package/docs/spec/schemas/ArbitrationVerdict.v1.schema.json +149 -0
  244. package/docs/spec/schemas/BundleHeadAttestation.v1.schema.json +21 -0
  245. package/docs/spec/schemas/ClosePackManifest.v1.schema.json +38 -0
  246. package/docs/spec/schemas/DelegationGrant.v1.schema.json +102 -0
  247. package/docs/spec/schemas/DisputeOpenEnvelope.v1.schema.json +78 -0
  248. package/docs/spec/schemas/EvidenceIndex.v1.schema.json +41 -0
  249. package/docs/spec/schemas/ExecutionIntent.v1.schema.json +85 -0
  250. package/docs/spec/schemas/FinancePackBundleManifest.v1.schema.json +38 -0
  251. package/docs/spec/schemas/FundingHold.v1.schema.json +46 -0
  252. package/docs/spec/schemas/GovernancePolicy.v1.schema.json +45 -0
  253. package/docs/spec/schemas/GovernancePolicy.v2.schema.json +70 -0
  254. package/docs/spec/schemas/InteractionDirectionMatrix.v1.schema.json +43 -0
  255. package/docs/spec/schemas/InvoiceBundleManifest.v1.schema.json +38 -0
  256. package/docs/spec/schemas/InvoiceClaim.v1.schema.json +39 -0
  257. package/docs/spec/schemas/MarketplaceAcceptance.v2.schema.json +53 -0
  258. package/docs/spec/schemas/MarketplaceOffer.v2.schema.json +61 -0
  259. package/docs/spec/schemas/MeteringReport.v1.schema.json +45 -0
  260. package/docs/spec/schemas/OperatorAction.v1.schema.json +113 -0
  261. package/docs/spec/schemas/PolicyDecision.v1.schema.json +74 -0
  262. package/docs/spec/schemas/PricingMatrix.v1.schema.json +24 -0
  263. package/docs/spec/schemas/PricingMatrixSignatures.v1.schema.json +24 -0
  264. package/docs/spec/schemas/PricingMatrixSignatures.v2.schema.json +24 -0
  265. package/docs/spec/schemas/ProduceCliOutput.v1.schema.json +107 -0
  266. package/docs/spec/schemas/ProofBundleManifest.v1.schema.json +37 -0
  267. package/docs/spec/schemas/PublicKeys.v1.schema.json +33 -0
  268. package/docs/spec/schemas/ReleaseIndex.v1.schema.json +45 -0
  269. package/docs/spec/schemas/ReleaseIndexSignature.v1.schema.json +16 -0
  270. package/docs/spec/schemas/ReleaseIndexSignatures.v1.schema.json +16 -0
  271. package/docs/spec/schemas/ReleaseTrust.v1.schema.json +15 -0
  272. package/docs/spec/schemas/ReleaseTrust.v2.schema.json +37 -0
  273. package/docs/spec/schemas/RemoteSignerPublicKeyResponse.v1.schema.json +14 -0
  274. package/docs/spec/schemas/RemoteSignerRequest.v1.schema.json +24 -0
  275. package/docs/spec/schemas/RemoteSignerResponse.v1.schema.json +10 -0
  276. package/docs/spec/schemas/RemoteSignerSignRequest.v1.schema.json +27 -0
  277. package/docs/spec/schemas/RemoteSignerSignResponse.v1.schema.json +16 -0
  278. package/docs/spec/schemas/ReputationEvent.v1.schema.json +164 -0
  279. package/docs/spec/schemas/RevocationList.v1.schema.json +51 -0
  280. package/docs/spec/schemas/SettlementAdjustment.v1.schema.json +44 -0
  281. package/docs/spec/schemas/SettlementDecisionRecord.v1.schema.json +66 -0
  282. package/docs/spec/schemas/SettlementDecisionRecord.v2.schema.json +149 -0
  283. package/docs/spec/schemas/SettlementDecisionReport.v1.schema.json +61 -0
  284. package/docs/spec/schemas/SettlementReceipt.v1.schema.json +135 -0
  285. package/docs/spec/schemas/SlaDefinition.v1.schema.json +33 -0
  286. package/docs/spec/schemas/SlaEvaluation.v1.schema.json +26 -0
  287. package/docs/spec/schemas/TenantSettings.v1.schema.json +90 -0
  288. package/docs/spec/schemas/TenantSettings.v2.schema.json +161 -0
  289. package/docs/spec/schemas/TimestampProof.v1.schema.json +17 -0
  290. package/docs/spec/schemas/ToolCallAgreement.v1.schema.json +34 -0
  291. package/docs/spec/schemas/ToolCallEvidence.v1.schema.json +45 -0
  292. package/docs/spec/schemas/ToolManifest.v1.schema.json +54 -0
  293. package/docs/spec/schemas/VerificationReport.v1.schema.json +83 -0
  294. package/docs/spec/schemas/VerifyAboutOutput.v1.schema.json +54 -0
  295. package/docs/spec/schemas/VerifyCliOutput.v1.schema.json +75 -0
  296. package/docs/spec/schemas/VerifyReleaseOutput.v1.schema.json +47 -0
  297. package/docs/spec/x402-error-codes.v1.txt +35 -0
  298. package/docs/templates/buyer-email.txt +18 -0
  299. package/docs/templates/buyer-one-pager.md +24 -0
  300. package/package.json +53 -6
  301. package/scripts/acceptance/full-stack.mjs +734 -0
  302. package/scripts/acceptance/full-stack.sh +99 -0
  303. package/scripts/audit/build-audit-packet.mjs +242 -0
  304. package/scripts/backup-pg.sh +45 -0
  305. package/scripts/backup-restore/README.md +18 -0
  306. package/scripts/backup-restore/capture-state.mjs +130 -0
  307. package/scripts/backup-restore/client.mjs +97 -0
  308. package/scripts/backup-restore/seed-workload.mjs +235 -0
  309. package/scripts/backup-restore/verify-state.mjs +139 -0
  310. package/scripts/backup-restore-test.sh +217 -0
  311. package/scripts/chaos.js +221 -0
  312. package/scripts/ci/build-launch-cutover-packet.mjs +304 -0
  313. package/scripts/ci/build-self-serve-benchmark-report.mjs +122 -0
  314. package/scripts/ci/changelog-guard.mjs +145 -0
  315. package/scripts/ci/check-kernel-v0-launch-gate.mjs +233 -0
  316. package/scripts/ci/check-secret-hygiene.mjs +78 -0
  317. package/scripts/ci/check-version-consistency.mjs +42 -0
  318. package/scripts/ci/cli-pack-smoke.mjs +160 -0
  319. package/scripts/ci/flake-budget-guard.mjs +68 -0
  320. package/scripts/ci/generate-error-codes.mjs +54 -0
  321. package/scripts/ci/lib/lighthouse-tracker.mjs +90 -0
  322. package/scripts/ci/lib/self-serve-launch-gate.mjs +89 -0
  323. package/scripts/ci/npm-pack-smoke.mjs +454 -0
  324. package/scripts/ci/run-10x-throughput-drill.mjs +318 -0
  325. package/scripts/ci/run-10x-throughput-incident-rehearsal.mjs +368 -0
  326. package/scripts/ci/run-arbitration-workspace-browser-e2e.sh +22 -0
  327. package/scripts/ci/run-circle-sandbox-smoke.mjs +237 -0
  328. package/scripts/ci/run-go-live-gate.mjs +150 -0
  329. package/scripts/ci/run-kernel-v0-ship-gate.mjs +97 -0
  330. package/scripts/ci/run-mcp-host-cert-matrix.mjs +201 -0
  331. package/scripts/ci/run-mcp-host-smoke.mjs +473 -0
  332. package/scripts/ci/run-offline-verification-parity-gate.mjs +762 -0
  333. package/scripts/ci/run-onboarding-host-success-gate.mjs +516 -0
  334. package/scripts/ci/run-onboarding-policy-slo-gate.mjs +537 -0
  335. package/scripts/ci/run-production-cutover-gate.mjs +540 -0
  336. package/scripts/ci/run-public-openclaw-npx-smoke.mjs +148 -0
  337. package/scripts/ci/run-release-promotion-guard.mjs +756 -0
  338. package/scripts/ci/run-self-serve-launch-gate.mjs +56 -0
  339. package/scripts/ci/runtime-import-smoke.mjs +58 -0
  340. package/scripts/ci/update-lighthouse-tracker.mjs +112 -0
  341. package/scripts/closepack/lib.mjs +286 -0
  342. package/scripts/collect-debug.sh +263 -0
  343. package/scripts/demo/compositional-settlement-3hop.mjs +237 -0
  344. package/scripts/demo/delivery-robot/export-ui-fixture.mjs +188 -0
  345. package/scripts/demo/delivery-robot/generate.mjs +377 -0
  346. package/scripts/demo/kernel-agent-goes-shopping.mjs +202 -0
  347. package/scripts/demo/magic-link-first-green.mjs +118 -0
  348. package/scripts/demo/magic-link-kind-smoke.mjs +577 -0
  349. package/scripts/demo/mcp-paid-exa.mjs +1110 -0
  350. package/scripts/dev/billing-doctor.sh +145 -0
  351. package/scripts/dev/billing-smoke-prod.sh +219 -0
  352. package/scripts/dev/billing-webhook-replay.sh +161 -0
  353. package/scripts/dev/env.dev.example +29 -0
  354. package/scripts/dev/env.sh +37 -0
  355. package/scripts/dev/new-sdk-key.sh +81 -0
  356. package/scripts/dev/sdk-first-run.sh +21 -0
  357. package/scripts/dev/smoke-x402-gateway.sh +115 -0
  358. package/scripts/dev/start-api.sh +24 -0
  359. package/scripts/doctor/mcp-host.mjs +120 -0
  360. package/scripts/examples/produce-and-verify-jobproof.mjs +191 -0
  361. package/scripts/examples/sdk-first-paid-rfq.py +105 -0
  362. package/scripts/examples/sdk-first-verified-run.mjs +85 -0
  363. package/scripts/examples/sdk-first-verified-run.py +99 -0
  364. package/scripts/examples/sdk-tenant-analytics.mjs +103 -0
  365. package/scripts/examples/sdk-tenant-analytics.py +118 -0
  366. package/scripts/finance-pack/bundle.mjs +284 -0
  367. package/scripts/fixtures/generate-bundle-fixtures.mjs +877 -0
  368. package/scripts/governance/export.mjs +169 -0
  369. package/scripts/load/delivery-stress.k6.js +183 -0
  370. package/scripts/load/ingest-burst.k6.js +236 -0
  371. package/scripts/load/run-delivery-load.js +66 -0
  372. package/scripts/load/webhook-receiver.js +131 -0
  373. package/scripts/magic-link/migrate-run-records-to-db.mjs +35 -0
  374. package/scripts/mcp/probe.mjs +238 -0
  375. package/scripts/mcp/settld-mcp-http-gateway.mjs +178 -0
  376. package/scripts/mcp/settld-mcp-server.mjs +1511 -0
  377. package/scripts/openapi/write.mjs +13 -0
  378. package/scripts/ops/bootstrap-tenant-conformance.mjs +185 -0
  379. package/scripts/ops/build-x402-pilot-reliability-report.mjs +489 -0
  380. package/scripts/ops/check-x402-receipt-sample.mjs +181 -0
  381. package/scripts/ops/design-partner-run-packet.mjs +466 -0
  382. package/scripts/ops/dispute-finance-reconciliation-packet.mjs +313 -0
  383. package/scripts/ops/hosted-baseline-evidence.mjs +890 -0
  384. package/scripts/ops/money-rails-chargeback-evidence.mjs +509 -0
  385. package/scripts/ops/money-rails-reconcile-evidence.mjs +180 -0
  386. package/scripts/ops/p0-seed-money-rail-operation.mjs +432 -0
  387. package/scripts/ops/run-x402-hitl-smoke.mjs +607 -0
  388. package/scripts/pilot/finance-pack.mjs +495 -0
  389. package/scripts/pilot/fixtures/robot-keypair.json +4 -0
  390. package/scripts/pilot/fixtures/server-signer.json +4 -0
  391. package/scripts/policy/cli.mjs +600 -0
  392. package/scripts/profile/cli.mjs +1324 -0
  393. package/scripts/proof-bundle/job.mjs +109 -0
  394. package/scripts/proof-bundle/lib.mjs +92 -0
  395. package/scripts/proof-bundle/month.mjs +103 -0
  396. package/scripts/provider/conformance-run.mjs +159 -0
  397. package/scripts/provider/keys-generate.mjs +135 -0
  398. package/scripts/provider/publish.mjs +420 -0
  399. package/scripts/quickstart/x402.mjs +334 -0
  400. package/scripts/register-entity-secret.mjs +102 -0
  401. package/scripts/release/build-artifacts.mjs +181 -0
  402. package/scripts/release/generate-release-index.mjs +112 -0
  403. package/scripts/release/release-index-lib.mjs +232 -0
  404. package/scripts/release/sign-release-index.mjs +85 -0
  405. package/scripts/release/validate-release-assets.mjs +170 -0
  406. package/scripts/release/verify-release.mjs +261 -0
  407. package/scripts/restore-pg.sh +34 -0
  408. package/scripts/scaffold/create-settld-paid-tool.mjs +19 -0
  409. package/scripts/sdk/smoke-python.py +30 -0
  410. package/scripts/sdk/smoke.mjs +16 -0
  411. package/scripts/settlement/x402-batch-worker.mjs +1091 -0
  412. package/scripts/setup/circle-bootstrap.mjs +310 -0
  413. package/scripts/setup/host-config.mjs +617 -0
  414. package/scripts/setup/onboard.mjs +1337 -0
  415. package/scripts/setup/openclaw-onboard.mjs +423 -0
  416. package/scripts/setup/wizard.mjs +986 -0
  417. package/scripts/slo/check.mjs +239 -0
  418. package/scripts/smoke/k8s-smoke.mjs +214 -0
  419. package/scripts/spec/generate-protocol-vectors.mjs +1019 -0
  420. package/scripts/test/check-no-generated-artifacts.sh +12 -0
  421. package/scripts/test/run.sh +59 -0
  422. package/scripts/trust/validate-trust-file.mjs +57 -0
  423. package/scripts/trust-config/rotate-settld-pay.mjs +277 -0
  424. package/scripts/trust-config/wizard.mjs +161 -0
  425. package/scripts/vendor-contract-test-lib.mjs +182 -0
  426. package/scripts/vendor-contract-test.mjs +55 -0
  427. package/scripts/vercel/build-mkdocs.sh +9 -0
  428. package/scripts/vercel/ignore-mkdocs.sh +25 -0
  429. package/scripts/vercel/install-mkdocs.sh +6 -0
  430. package/scripts/verify-pg.js +217 -0
  431. package/scripts/x402/receipt-verify.mjs +289 -0
  432. package/services/finance-sink/src/dedupe-store.js +29 -6
  433. package/services/receiver/src/dedupe-store.js +29 -5
  434. package/services/x402-gateway/Dockerfile +13 -0
  435. package/services/x402-gateway/README.md +58 -0
  436. package/services/x402-gateway/examples/upstream-mock.js +337 -0
  437. package/services/x402-gateway/src/server.js +1058 -0
  438. package/src/api/app.js +34658 -16940
  439. package/src/api/maintenance.js +70 -0
  440. package/src/api/middleware/trust-kernel.js +114 -0
  441. package/src/api/openapi.js +1778 -70
  442. package/src/api/persistence.js +456 -0
  443. package/src/api/server.js +81 -5
  444. package/src/api/store.js +1581 -62
  445. package/src/api/workers/deliveries.js +99 -4
  446. package/src/api/workers/insolvency-sweep.js +159 -0
  447. package/src/core/agent-card.js +69 -0
  448. package/src/core/agent-wallets.js +231 -0
  449. package/src/core/agreement-delegation.js +549 -0
  450. package/src/core/billing-plans.js +40 -6
  451. package/src/core/circle-reserve-adapter.js +845 -0
  452. package/src/core/event-policy.js +21 -2
  453. package/src/core/maintenance-locks.js +1 -0
  454. package/src/core/operator-action.js +303 -0
  455. package/src/core/paid-tool-manifest.js +318 -0
  456. package/src/core/policy-decision.js +322 -0
  457. package/src/core/policy-packs.js +207 -0
  458. package/src/core/profile-fingerprint.js +27 -0
  459. package/src/core/profile-simulation-reasons.js +84 -0
  460. package/src/core/profile-templates.js +242 -0
  461. package/src/core/provider-publish-conformance.js +525 -0
  462. package/src/core/provider-publish-proof.js +396 -0
  463. package/src/core/provider-quote-signature.js +170 -0
  464. package/src/core/settld-keys.js +112 -0
  465. package/src/core/settld-pay-token.js +344 -0
  466. package/src/core/settlement-kernel.js +239 -2
  467. package/src/core/settlement-verifier.js +335 -0
  468. package/src/core/tool-call-agreement.js +112 -0
  469. package/src/core/tool-call-evidence.js +144 -0
  470. package/src/core/tool-provider-signature.js +98 -0
  471. package/src/core/wallet-assignment-resolver.js +129 -0
  472. package/src/core/wallet-provider-bootstrap.js +365 -0
  473. package/src/core/x402-escalation-override.js +258 -0
  474. package/src/core/x402-gate.js +118 -0
  475. package/src/core/x402-provider-refund-decision.js +220 -0
  476. package/src/core/x402-receipt-verifier.js +708 -0
  477. package/src/core/x402-reversal-command.js +251 -0
  478. package/src/core/x402-wallet-issuer-decision.js +252 -0
  479. package/src/core/zk-verifier.js +300 -0
  480. package/src/db/migrations/029_reputation_event_index.sql +54 -0
  481. package/src/db/migrations/030_artifacts_source_event_unique_job_only.sql +15 -0
  482. package/src/db/pg.js +18 -7
  483. package/src/db/store-pg.js +1508 -111
@@ -0,0 +1,145 @@
1
+ import { execFileSync } from "node:child_process";
2
+ import fs from "node:fs";
3
+
4
+ function loadV1FreezeFiles() {
5
+ try {
6
+ const raw = fs.readFileSync("test/fixtures/protocol-v1-freeze.json", "utf8");
7
+ const json = JSON.parse(raw);
8
+ const files = json?.files && typeof json.files === "object" && !Array.isArray(json.files) ? Object.keys(json.files) : [];
9
+ return new Set(files);
10
+ } catch {
11
+ return new Set();
12
+ }
13
+ }
14
+
15
+ const V1_FROZEN_FILES = loadV1FreezeFiles();
16
+
17
+ function usage() {
18
+ // eslint-disable-next-line no-console
19
+ console.error("usage: node scripts/ci/changelog-guard.mjs --base <sha> --head <sha>");
20
+ process.exit(2);
21
+ }
22
+
23
+ function parseArgs(argv) {
24
+ let base = null;
25
+ let head = null;
26
+ for (let i = 0; i < argv.length; i += 1) {
27
+ const a = argv[i];
28
+ if (a === "--base") {
29
+ base = argv[i + 1] ?? null;
30
+ i += 1;
31
+ continue;
32
+ }
33
+ if (a === "--head") {
34
+ head = argv[i + 1] ?? null;
35
+ i += 1;
36
+ continue;
37
+ }
38
+ if (a === "--help" || a === "-h") usage();
39
+ usage();
40
+ }
41
+ if (!base || !head) usage();
42
+ return { base, head };
43
+ }
44
+
45
+ function changedFiles(base, head) {
46
+ const out = execFileSync("git", ["diff", "--name-only", `${base}..${head}`], { encoding: "utf8" });
47
+ return out
48
+ .split("\n")
49
+ .map((s) => s.trim())
50
+ .filter(Boolean);
51
+ }
52
+
53
+ function commitMessages(base, head) {
54
+ try {
55
+ const out = execFileSync("git", ["log", "--format=%B", `${base}..${head}`], { encoding: "utf8" });
56
+ return String(out ?? "");
57
+ } catch {
58
+ return "";
59
+ }
60
+ }
61
+
62
+ function readLabelsFromGithubEvent() {
63
+ try {
64
+ const p = process.env.GITHUB_EVENT_PATH ?? null;
65
+ if (!p || !fs.existsSync(p)) return [];
66
+ const raw = fs.readFileSync(p, "utf8");
67
+ const json = JSON.parse(raw);
68
+ const labels = json?.pull_request?.labels ?? [];
69
+ if (!Array.isArray(labels)) return [];
70
+ return labels.map((l) => String(l?.name ?? "")).filter(Boolean);
71
+ } catch {
72
+ return [];
73
+ }
74
+ }
75
+
76
+ function readPrBodyFromGithubEvent() {
77
+ try {
78
+ const p = process.env.GITHUB_EVENT_PATH ?? null;
79
+ if (!p || !fs.existsSync(p)) return "";
80
+ const raw = fs.readFileSync(p, "utf8");
81
+ const json = JSON.parse(raw);
82
+ return String(json?.pull_request?.body ?? "");
83
+ } catch {
84
+ return "";
85
+ }
86
+ }
87
+
88
+ function matchesProtocolSurface(fp) {
89
+ const prefixes = [
90
+ "docs/spec/",
91
+ "scripts/spec/",
92
+ "test/fixtures/protocol-vectors/",
93
+ "test/fixtures/bundles/"
94
+ ];
95
+ return prefixes.some((p) => fp.startsWith(p));
96
+ }
97
+
98
+ function isV1FrozenSurface(fp) {
99
+ return V1_FROZEN_FILES.has(fp);
100
+ }
101
+
102
+ function hasProtocolChangeMarker(text) {
103
+ const t = String(text ?? "").toLowerCase();
104
+ return t.includes("[protocol-change]") || t.includes("protocol-change:");
105
+ }
106
+
107
+ const { base, head } = parseArgs(process.argv.slice(2));
108
+ const files = changedFiles(base, head);
109
+ const touchedChangelog = files.includes("CHANGELOG.md");
110
+ const protocolSurfaceChanged = files.some(matchesProtocolSurface);
111
+ const v1FrozenChanged = files.some(isV1FrozenSurface);
112
+ const labels = readLabelsFromGithubEvent();
113
+ const hasReleaseNoteLabel = labels.includes("release-note");
114
+
115
+ if (!touchedChangelog && (protocolSurfaceChanged || hasReleaseNoteLabel)) {
116
+ // eslint-disable-next-line no-console
117
+ console.error("CHANGELOG.md must be updated for this PR.");
118
+ // eslint-disable-next-line no-console
119
+ if (protocolSurfaceChanged) console.error("- Reason: protocol surface files changed (docs/spec, schemas, vectors, or fixtures).");
120
+ // eslint-disable-next-line no-console
121
+ if (hasReleaseNoteLabel) console.error("- Reason: PR is labeled release-note.");
122
+ process.exit(1);
123
+ }
124
+
125
+ if (v1FrozenChanged && process.env.ALLOW_PROTOCOL_V1_MUTATION !== "1") {
126
+ const markerText = `${readPrBodyFromGithubEvent()}\n${commitMessages(base, head)}`;
127
+ const hasMarker = hasProtocolChangeMarker(markerText);
128
+ if (!hasMarker || !touchedChangelog) {
129
+ // eslint-disable-next-line no-console
130
+ console.error("Protocol v1 freeze gate: v1 schemas/vectors changed.");
131
+ // eslint-disable-next-line no-console
132
+ console.error("- This requires (1) CHANGELOG.md update and (2) an explicit protocol-change marker in the PR body or commit message.");
133
+ // eslint-disable-next-line no-console
134
+ console.error("- Marker examples: [protocol-change] or protocol-change:");
135
+ // eslint-disable-next-line no-console
136
+ console.error("- Override (local only): ALLOW_PROTOCOL_V1_MUTATION=1");
137
+ // eslint-disable-next-line no-console
138
+ console.error("Changed frozen files:");
139
+ for (const fp of files.filter(isV1FrozenSurface)) {
140
+ // eslint-disable-next-line no-console
141
+ console.error(`- ${fp}`);
142
+ }
143
+ process.exit(1);
144
+ }
145
+ }
@@ -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();