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.
- package/README.md +61 -3
- package/SETTLD_VERSION +1 -1
- package/bin/settld-mcp +2 -0
- package/bin/settld.js +13 -0
- package/conformance/kernel-v0/README.md +7 -0
- package/conformance/kernel-v0/run.mjs +292 -4
- package/docs/ACCESS.md +57 -0
- package/docs/ADOPTION_CHECKLIST.md +44 -0
- package/docs/ALERTS.md +198 -0
- package/docs/ARCHITECTURE.md +69 -0
- package/docs/ARCHITECTURE_FOUNDER_GUIDE.md +284 -0
- package/docs/ARTIFACTS.md +60 -0
- package/docs/CERTIFICATION_CHECKLIST.md +33 -0
- package/docs/CIRCLE_SANDBOX_E2E.md +140 -0
- package/docs/CONFIG.md +297 -0
- package/docs/CONTRACTS_APIS.md +23 -0
- package/docs/DEPRECATION.md +31 -0
- package/docs/DOMAIN_MODEL.md +92 -0
- package/docs/EVENT_ENVELOPE.md +53 -0
- package/docs/FINANCE_PACK_FORMAT.md +53 -0
- package/docs/INCIDENT_TAXONOMY.md +30 -0
- package/docs/JOB_STATE_MACHINE.md +66 -0
- package/docs/KERNEL_COMPATIBLE.md +60 -0
- package/docs/KERNEL_V0.md +40 -0
- package/docs/KEY_ROTATION.md +80 -0
- package/docs/LEDGER.md +82 -0
- package/docs/LIVENESS.md +76 -0
- package/docs/MVP_BUILD_ORDER.md +36 -0
- package/docs/ONCALL_PLAYBOOK.md +39 -0
- package/docs/OPERATIONS_SIGNING.md +20 -0
- package/docs/OVERVIEW.md +190 -0
- package/docs/PERF_BASELINE.md +85 -0
- package/docs/PRD.md +77 -0
- package/docs/QUICKSTART_KERNEL_V0.md +96 -0
- package/docs/QUICKSTART_MCP.md +337 -0
- package/docs/QUICKSTART_MCP_HOSTS.md +143 -0
- package/docs/QUICKSTART_PRODUCE.md +61 -0
- package/docs/QUICKSTART_RELEASE_VERIFY.md +39 -0
- package/docs/QUICKSTART_SDK.md +125 -0
- package/docs/QUICKSTART_SDK_PYTHON.md +111 -0
- package/docs/QUICKSTART_VERIFY.md +54 -0
- package/docs/QUICKSTART_X402_GATEWAY.md +317 -0
- package/docs/README.md +15 -0
- package/docs/RELEASE_CHECKLIST.md +156 -0
- package/docs/RELEASING.md +81 -0
- package/docs/REPO_SETTINGS.md +37 -0
- package/docs/RUNBOOK.md +86 -0
- package/docs/SKILLS.md +42 -0
- package/docs/SKILL_BUNDLE_FORMAT.md +48 -0
- package/docs/SLO.md +70 -0
- package/docs/SUMMARY.md +16 -0
- package/docs/SUPPORT.md +31 -0
- package/docs/THREAT_MODEL.md +36 -0
- package/docs/TRUST.md +59 -0
- package/docs/WORKFLOW.md +35 -0
- package/docs/X402_BATCH_SETTLEMENT.md +126 -0
- package/docs/blog/2026-02-14-your-ai-agent-just-spent-500-where-is-the-receipt.md +73 -0
- package/docs/examples/x402-provider-payout-registry.example.json +14 -0
- package/docs/gitbook/README.md +52 -0
- package/docs/gitbook/SETUP.md +25 -0
- package/docs/gitbook/SUMMARY.md +15 -0
- package/docs/gitbook/api-reference.md +73 -0
- package/docs/gitbook/closepacks.md +55 -0
- package/docs/gitbook/conformance.md +59 -0
- package/docs/gitbook/core-primitives.md +85 -0
- package/docs/gitbook/dispute-lifecycle.md +33 -0
- package/docs/gitbook/faq.md +21 -0
- package/docs/gitbook/guides.md +49 -0
- package/docs/gitbook/operations-runbook.md +36 -0
- package/docs/gitbook/quickstart.md +104 -0
- package/docs/gitbook/replay-and-audit.md +30 -0
- package/docs/gitbook/sdk-reference.md +35 -0
- package/docs/gitbook/security-model.md +58 -0
- package/docs/integrations/README.md +14 -0
- package/docs/integrations/github-actions-verify.yml +31 -0
- package/docs/integrations/github-actions.md +34 -0
- package/docs/integrations/openclaw/CLAWHUB_PUBLISH_CHECKLIST.md +65 -0
- package/docs/integrations/openclaw/settld-mcp-skill/SKILL.md +69 -0
- package/docs/integrations/openclaw/settld-mcp-skill/mcp-server.example.json +12 -0
- package/docs/kernel-compatible/capabilities.json +36 -0
- package/docs/marketing/agent-commerce-substrate.md +78 -0
- package/docs/marketing/hn-repost-2026-02-17.md +102 -0
- package/docs/marketing/show-hn-post.md +45 -0
- package/docs/ops/ARTIFACT_VERIFICATION_STATUS.md +43 -0
- package/docs/ops/BILLING_WEBHOOK_REPLAY.md +105 -0
- package/docs/ops/CI_FLAKE_BUDGET.md +31 -0
- package/docs/ops/GO_LIVE_GATE_S13.md +27 -0
- package/docs/ops/HOSTED_BASELINE_R2.md +129 -0
- package/docs/ops/KERNEL_V0_SHIP_GATE.md +67 -0
- package/docs/ops/LIGHTHOUSE_PRODUCTION_CLOSE.md +51 -0
- package/docs/ops/MCP_COMPATIBILITY_MATRIX.md +28 -0
- package/docs/ops/MINIMUM_PRODUCTION_TOPOLOGY.md +89 -0
- package/docs/ops/P0_BACKEND_PROGRESS.md +150 -0
- package/docs/ops/PAYMENTS_ALPHA_R5.md +105 -0
- package/docs/ops/PILOT_ONBOARDING_RUNBOOK.md +112 -0
- package/docs/ops/PRODUCTION_DEPLOYMENT_CHECKLIST.md +103 -0
- package/docs/ops/R1_SLOS.md +66 -0
- package/docs/ops/RELEASE_SIGNING_INCIDENT.md +58 -0
- package/docs/ops/SELF_SERVE_LAUNCH_AUTOMATION.md +89 -0
- package/docs/ops/THROUGHPUT_DRILL_10X.md +48 -0
- package/docs/ops/TRUST_CONFIG_WIZARD.md +47 -0
- package/docs/ops/X402_PILOT_WEEKLY_METRICS.md +76 -0
- package/docs/ops/tool-call-disputes-holdback.md +52 -0
- package/docs/pilot-kit/PILOT_PACKAGE_SCORECARD_X402.md +46 -0
- package/docs/pilot-kit/README.md +29 -0
- package/docs/pilot-kit/architecture-one-pager.md +48 -0
- package/docs/pilot-kit/buyer-email.txt +19 -0
- package/docs/pilot-kit/buyer-one-pager.md +31 -0
- package/docs/pilot-kit/gtm-pilot-playbook.md +182 -0
- package/docs/pilot-kit/offline-verify.md +33 -0
- package/docs/pilot-kit/procurement-one-pager.md +50 -0
- package/docs/pilot-kit/rfp-clause.md +46 -0
- package/docs/pilot-kit/roi-calculator-template.csv +2 -0
- package/docs/pilot-kit/security-qa.md +153 -0
- package/docs/pilot-kit/security-summary.md +35 -0
- package/docs/plans/2026-02-13-mcp-spike-design.md +113 -0
- package/docs/spec/AcceptanceCriteria.v1.md +17 -0
- package/docs/spec/AcceptanceEvaluation.v1.md +10 -0
- package/docs/spec/AgentEvent.v1.md +47 -0
- package/docs/spec/AgentIdentity.v1.md +62 -0
- package/docs/spec/AgentPassport.v1.md +95 -0
- package/docs/spec/AgentReputation.v1.md +59 -0
- package/docs/spec/AgentReputation.v2.md +52 -0
- package/docs/spec/AgentRun.v1.md +47 -0
- package/docs/spec/AgentRunSettlement.v1.md +52 -0
- package/docs/spec/AgentWallet.v1.md +43 -0
- package/docs/spec/AgreementDelegation.v1.md +109 -0
- package/docs/spec/ArbitrationCase.v1.md +67 -0
- package/docs/spec/ArbitrationVerdict.v1.md +60 -0
- package/docs/spec/BundleHeadAttestation.v1.md +32 -0
- package/docs/spec/CANONICAL_JSON.md +31 -0
- package/docs/spec/CRYPTOGRAPHY.md +61 -0
- package/docs/spec/ClosePack.v1.md +49 -0
- package/docs/spec/ClosePackManifest.v1.md +24 -0
- package/docs/spec/DelegationGrant.v1.md +90 -0
- package/docs/spec/DisputeOpenEnvelope.v1.md +43 -0
- package/docs/spec/ERRORS.md +76 -0
- package/docs/spec/ESCROW_NETTING_INVARIANTS.md +71 -0
- package/docs/spec/EvidenceIndex.v1.md +20 -0
- package/docs/spec/ExecutionIntent.v1.md +90 -0
- package/docs/spec/FinancePackBundleManifest.v1.md +24 -0
- package/docs/spec/FundingHold.v1.md +60 -0
- package/docs/spec/GovernancePolicy.v1.md +34 -0
- package/docs/spec/GovernancePolicy.v2.md +30 -0
- package/docs/spec/INVARIANTS.md +389 -0
- package/docs/spec/InteractionDirectionMatrix.v1.md +30 -0
- package/docs/spec/InvoiceBundleManifest.v1.md +24 -0
- package/docs/spec/InvoiceClaim.v1.md +11 -0
- package/docs/spec/MONEY_RAIL_STATE_MACHINE.md +58 -0
- package/docs/spec/MarketplaceAcceptance.v2.md +46 -0
- package/docs/spec/MarketplaceOffer.v2.md +54 -0
- package/docs/spec/MeteringReport.v1.md +18 -0
- package/docs/spec/PRODUCER_ERRORS.md +42 -0
- package/docs/spec/PricingMatrix.v1.md +20 -0
- package/docs/spec/PricingMatrixSignatures.v1.md +30 -0
- package/docs/spec/PricingMatrixSignatures.v2.md +29 -0
- package/docs/spec/ProduceCliOutput.v1.md +46 -0
- package/docs/spec/ProofBundleManifest.v1.md +24 -0
- package/docs/spec/README.md +104 -0
- package/docs/spec/REFERENCE_IMPLEMENTATIONS.md +29 -0
- package/docs/spec/REFERENCE_VERIFIER_BEHAVIOR.md +68 -0
- package/docs/spec/REMOTE_SIGNER.md +66 -0
- package/docs/spec/ReleaseIndex.v1.md +32 -0
- package/docs/spec/ReleaseIndexSignatures.v1.md +17 -0
- package/docs/spec/ReleaseTrust.v1.md +13 -0
- package/docs/spec/ReleaseTrust.v2.md +26 -0
- package/docs/spec/RemoteSignerRequest.v1.md +21 -0
- package/docs/spec/RemoteSignerResponse.v1.md +16 -0
- package/docs/spec/ReputationEvent.v1.md +63 -0
- package/docs/spec/RevocationList.v1.md +28 -0
- package/docs/spec/SIGNER_PROVIDER_PLUGIN.md +32 -0
- package/docs/spec/STRICTNESS.md +68 -0
- package/docs/spec/SUPPLY_CHAIN.md +33 -0
- package/docs/spec/SettlementAdjustment.v1.md +45 -0
- package/docs/spec/SettlementDecisionRecord.v1.md +48 -0
- package/docs/spec/SettlementDecisionRecord.v2.md +51 -0
- package/docs/spec/SettlementDecisionReport.v1.md +44 -0
- package/docs/spec/SettlementKernel.v1.md +59 -0
- package/docs/spec/SettlementReceipt.v1.md +63 -0
- package/docs/spec/SlaDefinition.v1.md +24 -0
- package/docs/spec/SlaEvaluation.v1.md +12 -0
- package/docs/spec/THREAT_MODEL.md +113 -0
- package/docs/spec/TOOL_PROVENANCE.md +30 -0
- package/docs/spec/TRUST_ANCHORS.md +84 -0
- package/docs/spec/TenantSettings.v1.md +90 -0
- package/docs/spec/TenantSettings.v2.md +99 -0
- package/docs/spec/TimestampProof.v1.md +25 -0
- package/docs/spec/ToolCallAgreement.v1.md +34 -0
- package/docs/spec/ToolCallEvidence.v1.md +47 -0
- package/docs/spec/ToolManifest.v1.md +47 -0
- package/docs/spec/VERIFIER_ENVIRONMENT.md +38 -0
- package/docs/spec/VERSIONING.md +107 -0
- package/docs/spec/VerificationReport.v1.md +50 -0
- package/docs/spec/VerifyAboutOutput.v1.md +10 -0
- package/docs/spec/VerifyCliOutput.v1.md +28 -0
- package/docs/spec/WARNINGS.md +83 -0
- package/docs/spec/error-codes.v1.txt +285 -0
- package/docs/spec/examples/agreement_delegation_v1.example.json +21 -0
- package/docs/spec/examples/arbitration_case_v1.example.json +26 -0
- package/docs/spec/examples/arbitration_verdict_v1.example.json +32 -0
- package/docs/spec/examples/dispute_open_envelope_v1.example.json +18 -0
- package/docs/spec/examples/produce_cli_output_v1.example.json +32 -0
- package/docs/spec/examples/release_index_signature_v1.example.json +9 -0
- package/docs/spec/examples/release_index_signatures_v1.example.json +14 -0
- package/docs/spec/examples/release_index_v1.example.json +15 -0
- package/docs/spec/examples/release_trust_v1.example.json +7 -0
- package/docs/spec/examples/release_trust_v2.example.json +22 -0
- package/docs/spec/examples/remote_signer_request_v1.example.json +18 -0
- package/docs/spec/examples/remote_signer_response_v1.example.json +8 -0
- package/docs/spec/examples/reputation_event_v1.example.json +29 -0
- package/docs/spec/examples/verification_report_v1.example.json +24 -0
- package/docs/spec/examples/verify_about_output_v1.example.json +29 -0
- package/docs/spec/examples/verify_cli_output_v1.example.json +13 -0
- package/docs/spec/legacy/MarketplaceAcceptance.v1.md +48 -0
- package/docs/spec/legacy/MarketplaceOffer.v1.md +56 -0
- package/docs/spec/legacy/schemas/MarketplaceAcceptance.v1.schema.json +53 -0
- package/docs/spec/legacy/schemas/MarketplaceOffer.v1.schema.json +61 -0
- package/docs/spec/producer-error-codes.v1.txt +14 -0
- package/docs/spec/schemas/AcceptanceCriteria.v1.schema.json +24 -0
- package/docs/spec/schemas/AcceptanceEvaluation.v1.schema.json +26 -0
- package/docs/spec/schemas/AgentEvent.v1.schema.json +49 -0
- package/docs/spec/schemas/AgentIdentity.v1.schema.json +129 -0
- package/docs/spec/schemas/AgentPassport.v1.schema.json +112 -0
- package/docs/spec/schemas/AgentReputation.v1.schema.json +151 -0
- package/docs/spec/schemas/AgentReputation.v2.schema.json +120 -0
- package/docs/spec/schemas/AgentRun.v1.schema.json +71 -0
- package/docs/spec/schemas/AgentRunSettlement.v1.schema.json +75 -0
- package/docs/spec/schemas/AgentWallet.v1.schema.json +54 -0
- package/docs/spec/schemas/AgreementDelegation.v1.schema.json +50 -0
- package/docs/spec/schemas/ArbitrationCase.v1.schema.json +133 -0
- package/docs/spec/schemas/ArbitrationVerdict.v1.schema.json +149 -0
- package/docs/spec/schemas/BundleHeadAttestation.v1.schema.json +21 -0
- package/docs/spec/schemas/ClosePackManifest.v1.schema.json +38 -0
- package/docs/spec/schemas/DelegationGrant.v1.schema.json +102 -0
- package/docs/spec/schemas/DisputeOpenEnvelope.v1.schema.json +78 -0
- package/docs/spec/schemas/EvidenceIndex.v1.schema.json +41 -0
- package/docs/spec/schemas/ExecutionIntent.v1.schema.json +85 -0
- package/docs/spec/schemas/FinancePackBundleManifest.v1.schema.json +38 -0
- package/docs/spec/schemas/FundingHold.v1.schema.json +46 -0
- package/docs/spec/schemas/GovernancePolicy.v1.schema.json +45 -0
- package/docs/spec/schemas/GovernancePolicy.v2.schema.json +70 -0
- package/docs/spec/schemas/InteractionDirectionMatrix.v1.schema.json +43 -0
- package/docs/spec/schemas/InvoiceBundleManifest.v1.schema.json +38 -0
- package/docs/spec/schemas/InvoiceClaim.v1.schema.json +39 -0
- package/docs/spec/schemas/MarketplaceAcceptance.v2.schema.json +53 -0
- package/docs/spec/schemas/MarketplaceOffer.v2.schema.json +61 -0
- package/docs/spec/schemas/MeteringReport.v1.schema.json +45 -0
- package/docs/spec/schemas/PricingMatrix.v1.schema.json +24 -0
- package/docs/spec/schemas/PricingMatrixSignatures.v1.schema.json +24 -0
- package/docs/spec/schemas/PricingMatrixSignatures.v2.schema.json +24 -0
- package/docs/spec/schemas/ProduceCliOutput.v1.schema.json +107 -0
- package/docs/spec/schemas/ProofBundleManifest.v1.schema.json +37 -0
- package/docs/spec/schemas/PublicKeys.v1.schema.json +33 -0
- package/docs/spec/schemas/ReleaseIndex.v1.schema.json +45 -0
- package/docs/spec/schemas/ReleaseIndexSignature.v1.schema.json +16 -0
- package/docs/spec/schemas/ReleaseIndexSignatures.v1.schema.json +16 -0
- package/docs/spec/schemas/ReleaseTrust.v1.schema.json +15 -0
- package/docs/spec/schemas/ReleaseTrust.v2.schema.json +37 -0
- package/docs/spec/schemas/RemoteSignerPublicKeyResponse.v1.schema.json +14 -0
- package/docs/spec/schemas/RemoteSignerRequest.v1.schema.json +24 -0
- package/docs/spec/schemas/RemoteSignerResponse.v1.schema.json +10 -0
- package/docs/spec/schemas/RemoteSignerSignRequest.v1.schema.json +27 -0
- package/docs/spec/schemas/RemoteSignerSignResponse.v1.schema.json +16 -0
- package/docs/spec/schemas/ReputationEvent.v1.schema.json +164 -0
- package/docs/spec/schemas/RevocationList.v1.schema.json +51 -0
- package/docs/spec/schemas/SettlementAdjustment.v1.schema.json +44 -0
- package/docs/spec/schemas/SettlementDecisionRecord.v1.schema.json +66 -0
- package/docs/spec/schemas/SettlementDecisionRecord.v2.schema.json +148 -0
- package/docs/spec/schemas/SettlementDecisionReport.v1.schema.json +61 -0
- package/docs/spec/schemas/SettlementReceipt.v1.schema.json +135 -0
- package/docs/spec/schemas/SlaDefinition.v1.schema.json +33 -0
- package/docs/spec/schemas/SlaEvaluation.v1.schema.json +26 -0
- package/docs/spec/schemas/TenantSettings.v1.schema.json +90 -0
- package/docs/spec/schemas/TenantSettings.v2.schema.json +161 -0
- package/docs/spec/schemas/TimestampProof.v1.schema.json +17 -0
- package/docs/spec/schemas/ToolCallAgreement.v1.schema.json +34 -0
- package/docs/spec/schemas/ToolCallEvidence.v1.schema.json +45 -0
- package/docs/spec/schemas/ToolManifest.v1.schema.json +54 -0
- package/docs/spec/schemas/VerificationReport.v1.schema.json +83 -0
- package/docs/spec/schemas/VerifyAboutOutput.v1.schema.json +54 -0
- package/docs/spec/schemas/VerifyCliOutput.v1.schema.json +75 -0
- package/docs/spec/schemas/VerifyReleaseOutput.v1.schema.json +47 -0
- package/docs/spec/x402-error-codes.v1.txt +21 -0
- package/docs/templates/buyer-email.txt +18 -0
- package/docs/templates/buyer-one-pager.md +24 -0
- package/package.json +40 -6
- package/scripts/acceptance/full-stack.mjs +734 -0
- package/scripts/acceptance/full-stack.sh +99 -0
- package/scripts/audit/build-audit-packet.mjs +242 -0
- package/scripts/backup-pg.sh +45 -0
- package/scripts/backup-restore/README.md +18 -0
- package/scripts/backup-restore/capture-state.mjs +130 -0
- package/scripts/backup-restore/client.mjs +97 -0
- package/scripts/backup-restore/seed-workload.mjs +235 -0
- package/scripts/backup-restore/verify-state.mjs +139 -0
- package/scripts/backup-restore-test.sh +217 -0
- package/scripts/chaos.js +221 -0
- package/scripts/ci/build-launch-cutover-packet.mjs +148 -0
- package/scripts/ci/build-self-serve-benchmark-report.mjs +122 -0
- package/scripts/ci/changelog-guard.mjs +145 -0
- package/scripts/ci/check-kernel-v0-launch-gate.mjs +233 -0
- package/scripts/ci/check-secret-hygiene.mjs +78 -0
- package/scripts/ci/check-version-consistency.mjs +42 -0
- package/scripts/ci/cli-pack-smoke.mjs +160 -0
- package/scripts/ci/flake-budget-guard.mjs +68 -0
- package/scripts/ci/generate-error-codes.mjs +54 -0
- package/scripts/ci/lib/lighthouse-tracker.mjs +90 -0
- package/scripts/ci/lib/self-serve-launch-gate.mjs +89 -0
- package/scripts/ci/npm-pack-smoke.mjs +454 -0
- package/scripts/ci/run-10x-throughput-drill.mjs +246 -0
- package/scripts/ci/run-10x-throughput-incident-rehearsal.mjs +325 -0
- package/scripts/ci/run-arbitration-workspace-browser-e2e.sh +22 -0
- package/scripts/ci/run-circle-sandbox-smoke.mjs +237 -0
- package/scripts/ci/run-go-live-gate.mjs +150 -0
- package/scripts/ci/run-kernel-v0-ship-gate.mjs +97 -0
- package/scripts/ci/run-mcp-host-smoke.mjs +275 -0
- package/scripts/ci/run-self-serve-launch-gate.mjs +56 -0
- package/scripts/ci/runtime-import-smoke.mjs +58 -0
- package/scripts/ci/update-lighthouse-tracker.mjs +112 -0
- package/scripts/closepack/lib.mjs +286 -0
- package/scripts/collect-debug.sh +263 -0
- package/scripts/demo/compositional-settlement-3hop.mjs +237 -0
- package/scripts/demo/delivery-robot/export-ui-fixture.mjs +188 -0
- package/scripts/demo/delivery-robot/generate.mjs +377 -0
- package/scripts/demo/kernel-agent-goes-shopping.mjs +202 -0
- package/scripts/demo/magic-link-first-green.mjs +118 -0
- package/scripts/demo/magic-link-kind-smoke.mjs +577 -0
- package/scripts/demo/mcp-paid-exa.mjs +1110 -0
- package/scripts/dev/billing-doctor.sh +145 -0
- package/scripts/dev/billing-smoke-prod.sh +219 -0
- package/scripts/dev/billing-webhook-replay.sh +161 -0
- package/scripts/dev/env.dev.example +29 -0
- package/scripts/dev/env.sh +37 -0
- package/scripts/dev/new-sdk-key.sh +81 -0
- package/scripts/dev/sdk-first-run.sh +21 -0
- package/scripts/dev/smoke-x402-gateway.sh +115 -0
- package/scripts/dev/start-api.sh +24 -0
- package/scripts/examples/produce-and-verify-jobproof.mjs +191 -0
- package/scripts/examples/sdk-first-paid-rfq.py +105 -0
- package/scripts/examples/sdk-first-verified-run.mjs +85 -0
- package/scripts/examples/sdk-first-verified-run.py +99 -0
- package/scripts/examples/sdk-tenant-analytics.mjs +103 -0
- package/scripts/examples/sdk-tenant-analytics.py +118 -0
- package/scripts/finance-pack/bundle.mjs +284 -0
- package/scripts/fixtures/generate-bundle-fixtures.mjs +877 -0
- package/scripts/governance/export.mjs +169 -0
- package/scripts/load/delivery-stress.k6.js +183 -0
- package/scripts/load/ingest-burst.k6.js +236 -0
- package/scripts/load/run-delivery-load.js +66 -0
- package/scripts/load/webhook-receiver.js +131 -0
- package/scripts/magic-link/migrate-run-records-to-db.mjs +35 -0
- package/scripts/mcp/probe.mjs +238 -0
- package/scripts/mcp/settld-mcp-http-gateway.mjs +178 -0
- package/scripts/mcp/settld-mcp-server.mjs +1201 -0
- package/scripts/openapi/write.mjs +13 -0
- package/scripts/ops/bootstrap-tenant-conformance.mjs +185 -0
- package/scripts/ops/build-x402-pilot-reliability-report.mjs +489 -0
- package/scripts/ops/check-x402-receipt-sample.mjs +181 -0
- package/scripts/ops/design-partner-run-packet.mjs +466 -0
- package/scripts/ops/hosted-baseline-evidence.mjs +681 -0
- package/scripts/ops/money-rails-chargeback-evidence.mjs +509 -0
- package/scripts/ops/money-rails-reconcile-evidence.mjs +180 -0
- package/scripts/ops/p0-seed-money-rail-operation.mjs +432 -0
- package/scripts/pilot/finance-pack.mjs +495 -0
- package/scripts/pilot/fixtures/robot-keypair.json +4 -0
- package/scripts/pilot/fixtures/server-signer.json +4 -0
- package/scripts/proof-bundle/job.mjs +109 -0
- package/scripts/proof-bundle/lib.mjs +92 -0
- package/scripts/proof-bundle/month.mjs +103 -0
- package/scripts/provider/conformance-run.mjs +159 -0
- package/scripts/provider/keys-generate.mjs +135 -0
- package/scripts/provider/publish.mjs +420 -0
- package/scripts/quickstart/x402.mjs +334 -0
- package/scripts/release/build-artifacts.mjs +181 -0
- package/scripts/release/generate-release-index.mjs +112 -0
- package/scripts/release/release-index-lib.mjs +232 -0
- package/scripts/release/sign-release-index.mjs +85 -0
- package/scripts/release/validate-release-assets.mjs +170 -0
- package/scripts/release/verify-release.mjs +261 -0
- package/scripts/restore-pg.sh +34 -0
- package/scripts/scaffold/create-settld-paid-tool.mjs +19 -0
- package/scripts/sdk/smoke-python.py +30 -0
- package/scripts/sdk/smoke.mjs +16 -0
- package/scripts/settlement/x402-batch-worker.mjs +1091 -0
- package/scripts/slo/check.mjs +178 -0
- package/scripts/smoke/k8s-smoke.mjs +214 -0
- package/scripts/spec/generate-protocol-vectors.mjs +931 -0
- package/scripts/test/check-no-generated-artifacts.sh +12 -0
- package/scripts/test/run.sh +45 -0
- package/scripts/trust/validate-trust-file.mjs +57 -0
- package/scripts/trust-config/rotate-settld-pay.mjs +277 -0
- package/scripts/trust-config/wizard.mjs +161 -0
- package/scripts/vendor-contract-test-lib.mjs +182 -0
- package/scripts/vendor-contract-test.mjs +55 -0
- package/scripts/vercel/build-mkdocs.sh +9 -0
- package/scripts/vercel/ignore-mkdocs.sh +25 -0
- package/scripts/vercel/install-mkdocs.sh +6 -0
- package/scripts/verify-pg.js +217 -0
- package/scripts/x402/receipt-verify.mjs +289 -0
- package/services/finance-sink/src/dedupe-store.js +29 -6
- package/services/receiver/src/dedupe-store.js +29 -5
- package/services/x402-gateway/Dockerfile +13 -0
- package/services/x402-gateway/README.md +58 -0
- package/services/x402-gateway/examples/upstream-mock.js +337 -0
- package/services/x402-gateway/src/server.js +947 -0
- package/src/api/app.js +32517 -16877
- package/src/api/maintenance.js +70 -0
- package/src/api/openapi.js +1130 -17
- package/src/api/persistence.js +272 -0
- package/src/api/server.js +81 -5
- package/src/api/store.js +1248 -6
- package/src/api/workers/deliveries.js +99 -4
- package/src/api/workers/insolvency-sweep.js +159 -0
- package/src/core/agent-card.js +69 -0
- package/src/core/agent-wallets.js +97 -0
- package/src/core/agreement-delegation.js +549 -0
- package/src/core/billing-plans.js +40 -6
- package/src/core/circle-reserve-adapter.js +845 -0
- package/src/core/maintenance-locks.js +1 -0
- package/src/core/paid-tool-manifest.js +318 -0
- package/src/core/provider-publish-conformance.js +525 -0
- package/src/core/provider-publish-proof.js +396 -0
- package/src/core/provider-quote-signature.js +170 -0
- package/src/core/settld-keys.js +112 -0
- package/src/core/settld-pay-token.js +344 -0
- package/src/core/settlement-kernel.js +213 -2
- package/src/core/settlement-verifier.js +335 -0
- package/src/core/tool-call-agreement.js +112 -0
- package/src/core/tool-call-evidence.js +144 -0
- package/src/core/tool-provider-signature.js +98 -0
- package/src/core/x402-escalation-override.js +258 -0
- package/src/core/x402-gate.js +118 -0
- package/src/core/x402-provider-refund-decision.js +220 -0
- package/src/core/x402-receipt-verifier.js +708 -0
- package/src/core/x402-reversal-command.js +251 -0
- package/src/core/x402-wallet-issuer-decision.js +252 -0
- package/src/core/zk-verifier.js +300 -0
- package/src/db/migrations/029_reputation_event_index.sql +54 -0
- package/src/db/migrations/030_artifacts_source_event_unique_job_only.sql +15 -0
- package/src/db/pg.js +18 -7
- package/src/db/store-pg.js +838 -72
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
# P0 Backend Progress Tracker
|
|
2
|
+
|
|
3
|
+
Status date: February 13, 2026
|
|
4
|
+
|
|
5
|
+
This tracker is the source of truth for P0 backend execution status in code.
|
|
6
|
+
|
|
7
|
+
## Scope
|
|
8
|
+
|
|
9
|
+
P0 backend scope tracked here:
|
|
10
|
+
|
|
11
|
+
1. Hosted baseline hardening controls
|
|
12
|
+
2. Real-money payout controls and rail safety
|
|
13
|
+
3. Deterministic reconciliation + enforcement evidence
|
|
14
|
+
4. Billing/runtime and launch-gate alignment
|
|
15
|
+
|
|
16
|
+
## Shipped in this change set
|
|
17
|
+
|
|
18
|
+
- [x] Tenant-level real-money payout gate (production providers require explicit tenant enablement)
|
|
19
|
+
- [x] Tenant-level payout kill switch
|
|
20
|
+
- [x] Tenant-level max single payout cap
|
|
21
|
+
- [x] Tenant-level daily payout exposure cap
|
|
22
|
+
- [x] Tenant-level allowed provider allowlist
|
|
23
|
+
- [x] Optional signed provider event ingestion enforcement for money-rail events
|
|
24
|
+
- [x] Stripe production payout submit endpoint executes `/v1/transfers` with deterministic metadata mapping
|
|
25
|
+
- [x] Stripe Connect payout submit enforces `stripe_connect:<acct_...>` counterparty destination in production mode
|
|
26
|
+
- [x] Submit endpoint idempotency + ops audit trail (`MONEY_RAIL_OPERATION_SUBMITTED`)
|
|
27
|
+
- [x] Stripe Connect KYB/capability sync endpoint updates payout eligibility from provider account state
|
|
28
|
+
- [x] Chargeback policy automation (`hold|net`) with negative-balance payout enforcement
|
|
29
|
+
- [x] Chargeback exposure API for per-party outstanding/recovered tracking
|
|
30
|
+
- [x] Chargeback evidence automation command emits deterministic run artifact hash (optional Ed25519 signature)
|
|
31
|
+
- [x] Hosted baseline evidence automation command (health/status/metrics + optional rate-limit probe + optional backup/restore drill)
|
|
32
|
+
- [x] Design-partner run packet generator chaining reconcile + chargeback evidence into one hashable/signable artifact
|
|
33
|
+
- [x] Periodic money-rail reconciliation scheduler with advisory-lock safety
|
|
34
|
+
- [x] Money-rail reconciliation maintenance run endpoint with ops audit trail
|
|
35
|
+
- [x] Maintenance status surface now includes money-rail reconciliation state/result
|
|
36
|
+
- [x] Money-rail controls surfaced through existing billing plan control-plane API
|
|
37
|
+
- [x] Runtime billing catalog aligns with public pricing (including Growth $0.007/run via milli-cent accounting)
|
|
38
|
+
- [x] CI smoke runs exact local tarball `npx --package ./settld-<version>.tgz` command path
|
|
39
|
+
|
|
40
|
+
Implemented in:
|
|
41
|
+
|
|
42
|
+
- `src/api/app.js`
|
|
43
|
+
- `src/api/maintenance.js`
|
|
44
|
+
- `src/core/billing-plans.js`
|
|
45
|
+
- `src/api/openapi.js`
|
|
46
|
+
- `scripts/ci/cli-pack-smoke.mjs`
|
|
47
|
+
- `scripts/ops/money-rails-chargeback-evidence.mjs`
|
|
48
|
+
- `scripts/ops/hosted-baseline-evidence.mjs`
|
|
49
|
+
- `scripts/ops/design-partner-run-packet.mjs`
|
|
50
|
+
- `test/api-e2e-ops-money-rails.test.js`
|
|
51
|
+
- `test/api-e2e-billing-plan-enforcement.test.js`
|
|
52
|
+
- `test/api-e2e-ops-maintenance-money-rails-reconcile.test.js`
|
|
53
|
+
- `test/pg-maintenance-money-rails-reconcile-lock.test.js`
|
|
54
|
+
|
|
55
|
+
## API behavior now enforced
|
|
56
|
+
|
|
57
|
+
- `POST /ops/payouts/{partyId}/{period}/enqueue`
|
|
58
|
+
- Rejects with `REAL_MONEY_DISABLED` when provider is production and tenant real-money is not enabled.
|
|
59
|
+
- Rejects with `PAYOUT_KILL_SWITCH_ACTIVE` when kill switch is on.
|
|
60
|
+
- Rejects with `PAYOUT_AMOUNT_LIMIT_EXCEEDED` when single payout exceeds tenant cap.
|
|
61
|
+
- Rejects with `PAYOUT_DAILY_LIMIT_EXCEEDED` when projected daily exposure exceeds tenant cap.
|
|
62
|
+
- Rejects with `MONEY_RAIL_PROVIDER_NOT_ALLOWED` when provider is outside tenant allowlist.
|
|
63
|
+
|
|
64
|
+
- `POST /ops/money-rails/{providerId}/events/ingest`
|
|
65
|
+
- Supports optional signed-ingest verification when provider config requires it.
|
|
66
|
+
- Validates `x-proxy-provider-signature` (`t=<unix>,v1=<hmac_sha256_hex>`) against configured provider webhook secret.
|
|
67
|
+
|
|
68
|
+
- `POST /ops/money-rails/{providerId}/operations/{operationId}/submit`
|
|
69
|
+
- Submits initiated payout operations to the provider.
|
|
70
|
+
- For production Stripe providers, calls Stripe `/v1/transfers` and transitions operation to `submitted` with `providerRef=transfer_id`.
|
|
71
|
+
- Enforces Connect destination shape (`stripe_connect:<acct_...>`) and returns `STRIPE_CONNECT_COUNTERPARTY_REQUIRED` when invalid.
|
|
72
|
+
- Returns `MONEY_RAIL_SUBMIT_INVALID_STATE` when operation is no longer submit-eligible.
|
|
73
|
+
|
|
74
|
+
- `GET /ops/finance/money-rails/chargebacks`
|
|
75
|
+
- Returns deterministic per-party chargeback exposure (`outstanding`, `recovered`, counts) with optional `providerId|partyId|period` filters.
|
|
76
|
+
|
|
77
|
+
- `POST /ops/finance/money-rails/stripe-connect/accounts/sync`
|
|
78
|
+
- Pulls Stripe Account state (`/v1/accounts/{accountId}`) and syncs Connect account capability/KYB fields.
|
|
79
|
+
- Updates `payoutsEnabled`/`transfersEnabled` + KYB status and requirement sets.
|
|
80
|
+
- Supports deterministic idempotency replay and records `STRIPE_CONNECT_ACCOUNTS_SYNC` ops audit.
|
|
81
|
+
|
|
82
|
+
- `POST /ops/maintenance/money-rails-reconcile/run`
|
|
83
|
+
- Runs periodic-grade money-rail reconciliation on demand with advisory lock safety.
|
|
84
|
+
- Persists `MoneyRailReconcileReport.v1` artifacts with deterministic report hashes.
|
|
85
|
+
- Writes `MAINTENANCE_MONEY_RAIL_RECONCILE_RUN` audit records with outcome/runtime/summary.
|
|
86
|
+
|
|
87
|
+
- `GET /ops/status`
|
|
88
|
+
- Exposes `maintenance.moneyRailReconciliation` (enabled/interval/limits/last run/result/audit refs).
|
|
89
|
+
|
|
90
|
+
- `GET/PUT /ops/finance/billing/plan`
|
|
91
|
+
- Returns and persists `billing.moneyRails` controls.
|
|
92
|
+
|
|
93
|
+
## Validation evidence
|
|
94
|
+
|
|
95
|
+
Executed and passing:
|
|
96
|
+
|
|
97
|
+
- `node --test test/api-e2e-ops-money-rails.test.js`
|
|
98
|
+
- `node --test test/api-e2e-ops-maintenance-money-rails-reconcile.test.js`
|
|
99
|
+
- `node --test test/api-e2e-billing-plan-enforcement.test.js`
|
|
100
|
+
- `node scripts/ci/cli-pack-smoke.mjs`
|
|
101
|
+
- `node scripts/ops/money-rails-chargeback-evidence.mjs --help`
|
|
102
|
+
- `node scripts/ops/hosted-baseline-evidence.mjs --help`
|
|
103
|
+
- `node scripts/ops/design-partner-run-packet.mjs --help`
|
|
104
|
+
|
|
105
|
+
## Current hosted evidence snapshot (2026-02-13)
|
|
106
|
+
|
|
107
|
+
- [x] `ops:hosted-baseline:evidence` passes against `https://api.settld.work` for:
|
|
108
|
+
- health/status
|
|
109
|
+
- required metrics presence
|
|
110
|
+
- billing catalog/quotas validation
|
|
111
|
+
- [x] Production hosted-baseline backup/restore evidence is now passing.
|
|
112
|
+
- Captured at: `2026-02-13T02:19:48.251Z`
|
|
113
|
+
- Artifact: `artifacts/ops/hosted-baseline-prod.json`
|
|
114
|
+
- `artifactHash`: `2a5833fd44e6b904ed87763e2d1212e02ffcd9583c4d50fdd5b2cffa3d99a597`
|
|
115
|
+
- Backup/restore: `checks.backupRestore.ok=true`
|
|
116
|
+
- External archive path: `/home/aiden/ops-evidence/settld/hosted-baseline/2026-02-13`
|
|
117
|
+
- [x] Staging hosted-baseline backup/restore evidence is now passing.
|
|
118
|
+
- Captured at: `2026-02-13T02:26:37.785Z`
|
|
119
|
+
- Artifact: `artifacts/ops/hosted-baseline-staging.json`
|
|
120
|
+
- `artifactHash`: `354f339d1c668eccb000416a231309ed6f3a5614539d43448aad9f6f3ca0dc28`
|
|
121
|
+
- Backup/restore: `checks.backupRestore.ok=true`
|
|
122
|
+
- External archive path: `/home/aiden/ops-evidence/settld/hosted-baseline/2026-02-13`
|
|
123
|
+
|
|
124
|
+
### Money-Rail Chargeback + Design-Partner Packet (2026-02-13)
|
|
125
|
+
|
|
126
|
+
- [x] Chargeback/refund simulation evidence run captured and signed.
|
|
127
|
+
- Tenant: `tenant_p0_evidence_20260213_v9`
|
|
128
|
+
- Period: `2026-02`
|
|
129
|
+
- Artifact: `artifacts/ops/chargeback-evidence-tenant_p0_evidence_20260213_v9.json`
|
|
130
|
+
- `artifactHash`: `a7df81308cfed250ecc93a2997758f09d91a807beb74f3a8cd8aaee3f181fbe7`
|
|
131
|
+
|
|
132
|
+
- [x] Design-partner run packet captured and signed (reconcile is expected to fail when a chargeback reversal is present).
|
|
133
|
+
- Tenant: `tenant_p0_evidence_20260213_v9`
|
|
134
|
+
- Period: `2026-02`
|
|
135
|
+
- Artifact: `artifacts/ops/design-partner-run-packet-tenant_p0_evidence_20260213_v9.json`
|
|
136
|
+
- `artifactHash`: `c6eaa09b8ee4f662cb95403800d87cf89ace865bd6e7c29bfe09b5ab5a2b7e62`
|
|
137
|
+
- Reconcile report hash: `36e8e5fb2ed0af3574aa41c8d72e66020fe19130bb185daa67af079983354cac`
|
|
138
|
+
- External archive path: `/home/aiden/ops-evidence/settld/p0/2026-02-13/tenant_p0_evidence_20260213_v9`
|
|
139
|
+
|
|
140
|
+
## Remaining P0 work (outside this code drop)
|
|
141
|
+
|
|
142
|
+
- [x] Execute hosted baseline evidence runs in staging/prod with `--run-backup-restore true` and archive signed artifacts
|
|
143
|
+
- [x] Execute chargeback/refund simulation runs and archive signed artifacts
|
|
144
|
+
- [x] Execute design-partner run packets against live partner tenants (repeatable, no manual DB edits)
|
|
145
|
+
|
|
146
|
+
References:
|
|
147
|
+
|
|
148
|
+
- `docs/ops/HOSTED_BASELINE_R2.md`
|
|
149
|
+
- `docs/ops/PAYMENTS_ALPHA_R5.md`
|
|
150
|
+
- `planning/kernel-v0-truth-audit.md`
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
# Payments Alpha (R5) - Design Partner Scope
|
|
2
|
+
|
|
3
|
+
This runbook defines the private real-money alpha while Kernel v0 remains public with ledger/test-fund flows.
|
|
4
|
+
|
|
5
|
+
## Objective
|
|
6
|
+
|
|
7
|
+
Validate mapping from kernel settlement artifacts to real payment rails with 3-5 design partners, without opening public GA risk surface.
|
|
8
|
+
|
|
9
|
+
## Non-Goals (Alpha)
|
|
10
|
+
|
|
11
|
+
- No public self-serve real-money onboarding.
|
|
12
|
+
- No generalized multi-rail support.
|
|
13
|
+
- No claim of universal chargeback protection.
|
|
14
|
+
|
|
15
|
+
## Required Design Decisions
|
|
16
|
+
|
|
17
|
+
- Merchant-of-record model is explicitly documented.
|
|
18
|
+
- Holdback/challenge window mapping to payout timing is explicit and testable.
|
|
19
|
+
- Refund and chargeback policy defines behavior when reversals exceed retained holdback.
|
|
20
|
+
|
|
21
|
+
## Required Implementation Surfaces
|
|
22
|
+
|
|
23
|
+
- Feature flag gate per tenant for real-money flows.
|
|
24
|
+
- Rail adapter integration (for example Stripe Connect) with webhook ingestion and signed webhook verification.
|
|
25
|
+
- Reconciliation tables keyed by settlement/receipt/adjustment IDs.
|
|
26
|
+
- Periodic reconciliation job that produces mismatch reports.
|
|
27
|
+
- Ops view for mismatch triage with reason codes.
|
|
28
|
+
|
|
29
|
+
### Implementation status snapshot (2026-02-12)
|
|
30
|
+
|
|
31
|
+
- Implemented in API runtime:
|
|
32
|
+
- Tenant-level real-money payout gate
|
|
33
|
+
- Tenant-level payout kill switch
|
|
34
|
+
- Tenant-level single-payout cap
|
|
35
|
+
- Tenant-level daily payout cap
|
|
36
|
+
- Tenant-level provider allowlist
|
|
37
|
+
- Optional signed provider-event ingestion enforcement for money rails
|
|
38
|
+
- Stripe Connect account mapping endpoints + payout counterparty enforcement
|
|
39
|
+
- Stripe Connect KYB/capability sync endpoint (`POST /ops/finance/money-rails/stripe-connect/accounts/sync`) pulling `/v1/accounts/{accountId}`
|
|
40
|
+
- Stripe production payout submit endpoint (`POST /ops/money-rails/{providerId}/operations/{operationId}/submit`) calling `/v1/transfers`
|
|
41
|
+
- Chargeback negative-balance policy automation (`hold|net`) + exposure API
|
|
42
|
+
- Scheduled money-rail reconciliation maintenance with advisory locks + audit trail
|
|
43
|
+
- Runtime billing catalog alignment for `free|builder|growth|enterprise` (Growth `$0.007/run` preserved with milli-cent accounting)
|
|
44
|
+
- Source: `src/api/app.js`, `test/api-e2e-ops-money-rails.test.js`
|
|
45
|
+
- Source (maintenance scheduler): `src/api/maintenance.js`, `test/api-e2e-ops-maintenance-money-rails-reconcile.test.js`
|
|
46
|
+
- Source (billing alignment): `src/core/billing-plans.js`, `test/api-e2e-billing-plan-enforcement.test.js`
|
|
47
|
+
- Source (chargeback evidence automation): `scripts/ops/money-rails-chargeback-evidence.mjs`
|
|
48
|
+
- Source (design-partner run packet automation): `scripts/ops/design-partner-run-packet.mjs`
|
|
49
|
+
- Tracker: `docs/ops/P0_BACKEND_PROGRESS.md`
|
|
50
|
+
|
|
51
|
+
## Chargeback Evidence Command
|
|
52
|
+
|
|
53
|
+
Use this command to capture a deterministic chargeback drill artifact that includes API call traces, computed checks, and a stable `artifactHash`:
|
|
54
|
+
|
|
55
|
+
```bash
|
|
56
|
+
npm run ops:money-rails:chargeback:evidence -- \
|
|
57
|
+
--base-url https://staging.api.settld.work \
|
|
58
|
+
--tenant-id tenant_design_partner_1 \
|
|
59
|
+
--ops-token "$SETTLD_STAGING_OPS_TOKEN" \
|
|
60
|
+
--provider-id stripe_prod_us \
|
|
61
|
+
--operation-id op_example_123 \
|
|
62
|
+
--period 2026-02 \
|
|
63
|
+
--expect-outstanding-cents 2000 \
|
|
64
|
+
--out ./artifacts/chargeback-evidence-2026-02.json
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
Optional signature fields:
|
|
68
|
+
|
|
69
|
+
- `--signing-key-file <pkcs8_ed25519_pem>`
|
|
70
|
+
- `--signature-key-id <key_id>`
|
|
71
|
+
|
|
72
|
+
## Design-partner run packet command
|
|
73
|
+
|
|
74
|
+
Use this command to generate one signed/hashable packet that chains:
|
|
75
|
+
|
|
76
|
+
1. money-rail reconciliation evidence
|
|
77
|
+
2. chargeback evidence
|
|
78
|
+
|
|
79
|
+
```bash
|
|
80
|
+
npm run ops:design-partner:run-packet -- \
|
|
81
|
+
--base-url https://staging.api.settld.work \
|
|
82
|
+
--tenant-id tenant_design_partner_1 \
|
|
83
|
+
--ops-token "$SETTLD_STAGING_OPS_TOKEN" \
|
|
84
|
+
--provider-id stripe_prod_us \
|
|
85
|
+
--period 2026-02 \
|
|
86
|
+
--chargeback-operation-id op_example_123 \
|
|
87
|
+
--chargeback-party-id pty_example_123 \
|
|
88
|
+
--chargeback-payout-period 2026-03 \
|
|
89
|
+
--expect-chargeback-payout-code NEGATIVE_BALANCE_PAYOUT_HOLD \
|
|
90
|
+
--out ./artifacts/ops/design-partner-run-packet-2026-02.json
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
## Risk Controls
|
|
94
|
+
|
|
95
|
+
- Tenant-level transaction/payout limits.
|
|
96
|
+
- Daily mismatch alert threshold.
|
|
97
|
+
- Kill switch to disable payouts by tenant.
|
|
98
|
+
- Manual override workflow for reconciliation exceptions.
|
|
99
|
+
|
|
100
|
+
## Acceptance Criteria
|
|
101
|
+
|
|
102
|
+
- Every external money movement maps to a kernel receipt or adjustment reference.
|
|
103
|
+
- Reconciliation report is zero-drift in normal flows and explainable for induced failure scenarios.
|
|
104
|
+
- Chargeback/refund simulation runbook is executed and recorded.
|
|
105
|
+
- Design partner tenants can complete the same flow repeatedly without manual DB edits.
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
# Pilot Onboarding Runbook (x402 Gateway)
|
|
2
|
+
|
|
3
|
+
Goal: install a design partner in one afternoon and prove a known-good `402 -> authorize -> verify -> settled` flow.
|
|
4
|
+
|
|
5
|
+
## 1. Prerequisites
|
|
6
|
+
|
|
7
|
+
- Runtime: Node 20+, Docker available for hosted acceptance checks.
|
|
8
|
+
- Access:
|
|
9
|
+
- Settld API base URL (`SETTLD_BASE_URL`)
|
|
10
|
+
- tenant id (`SETTLD_TENANT_ID`)
|
|
11
|
+
- ops token (`PROXY_OPS_TOKEN`) to mint scoped API keys
|
|
12
|
+
- Pilot safety defaults:
|
|
13
|
+
- `X402_PILOT_KILL_SWITCH=0`
|
|
14
|
+
- `X402_PILOT_MAX_AMOUNT_CENTS=100`
|
|
15
|
+
- `X402_PILOT_DAILY_LIMIT_CENTS=1000`
|
|
16
|
+
|
|
17
|
+
## 2. Environment Setup (15-20m)
|
|
18
|
+
|
|
19
|
+
```bash
|
|
20
|
+
export SETTLD_BASE_URL='https://api.settld.work'
|
|
21
|
+
export SETTLD_TENANT_ID='tenant_default'
|
|
22
|
+
export PROXY_OPS_TOKEN='tok_ops'
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
Mint a scoped API key:
|
|
26
|
+
|
|
27
|
+
```bash
|
|
28
|
+
curl -sS -X POST "$SETTLD_BASE_URL/ops/api-keys" \
|
|
29
|
+
-H "x-proxy-tenant-id: $SETTLD_TENANT_ID" \
|
|
30
|
+
-H "x-proxy-ops-token: $PROXY_OPS_TOKEN" \
|
|
31
|
+
-H 'x-settld-protocol: 1.0' \
|
|
32
|
+
-H 'content-type: application/json' \
|
|
33
|
+
-d '{"scopes":["ops_read","ops_write","audit_read","finance_read","finance_write"]}' | jq .
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
## 3. Gateway Deploy (10-15m)
|
|
37
|
+
|
|
38
|
+
Use the local smoke stack as the deployment sanity baseline:
|
|
39
|
+
|
|
40
|
+
```bash
|
|
41
|
+
scripts/dev/smoke-x402-gateway.sh
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
For hosted deployment, configure gateway env:
|
|
45
|
+
|
|
46
|
+
- `SETTLD_API_URL=<api base>`
|
|
47
|
+
- `SETTLD_API_KEY=<keyId.secret>`
|
|
48
|
+
- `UPSTREAM_URL=<paid upstream base>`
|
|
49
|
+
- `X402_AUTOFUND=1` for pilot/demo rails only
|
|
50
|
+
|
|
51
|
+
## 4. Sandbox vs Production Mode
|
|
52
|
+
|
|
53
|
+
| Mode | Required vars | Notes |
|
|
54
|
+
|---|---|---|
|
|
55
|
+
| `sandbox` | `SETTLD_DEMO_CIRCLE_MODE=sandbox`, `X402_REQUIRE_EXTERNAL_RESERVE=1` | Safe pilot proving reserve path without live funds |
|
|
56
|
+
| `production` | `SETTLD_DEMO_CIRCLE_MODE=production`, live Circle vars (`CIRCLE_API_KEY`, wallet ids, token id) | Keep strict caps and provider allowlist on |
|
|
57
|
+
|
|
58
|
+
## 5. Known-Good Health Check Flow (10m)
|
|
59
|
+
|
|
60
|
+
1. Gateway health:
|
|
61
|
+
|
|
62
|
+
```bash
|
|
63
|
+
curl -sS http://127.0.0.1:8402/healthz | jq .
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
2. First request returns `402` + `x-settld-gate-id`:
|
|
67
|
+
|
|
68
|
+
```bash
|
|
69
|
+
FIRST_HEADERS=$(mktemp)
|
|
70
|
+
curl -sS -D "$FIRST_HEADERS" 'http://127.0.0.1:8402/exa/search?q=pilot+health' -o /tmp/pilot-first-body.json
|
|
71
|
+
GATE_ID=$(awk 'tolower($1)=="x-settld-gate-id:" {print $2}' "$FIRST_HEADERS" | tr -d '\r')
|
|
72
|
+
echo "$GATE_ID"
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
3. Retry with gate id returns `200` and settlement headers:
|
|
76
|
+
|
|
77
|
+
```bash
|
|
78
|
+
curl -sS -D /tmp/pilot-second-headers.txt \
|
|
79
|
+
-H "x-settld-gate-id: $GATE_ID" \
|
|
80
|
+
'http://127.0.0.1:8402/exa/search?q=pilot+health' -o /tmp/pilot-second-body.json
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
4. Confirm gate resolved in API:
|
|
84
|
+
|
|
85
|
+
```bash
|
|
86
|
+
curl -sS "$SETTLD_BASE_URL/x402/gate/$GATE_ID" \
|
|
87
|
+
-H "x-proxy-tenant-id: $SETTLD_TENANT_ID" \
|
|
88
|
+
-H "authorization: Bearer $SETTLD_API_KEY" \
|
|
89
|
+
-H 'x-settld-protocol: 1.0' | jq '{gateId:.gate.gateId,status:.gate.status,settlement:.settlement.status}'
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
Expected: `status=resolved` and non-locked settlement.
|
|
93
|
+
|
|
94
|
+
## 6. Rollback Procedure (Fail-Closed)
|
|
95
|
+
|
|
96
|
+
1. Activate kill switch:
|
|
97
|
+
|
|
98
|
+
```bash
|
|
99
|
+
export X402_PILOT_KILL_SWITCH=1
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
2. Restart API/gateway with kill switch active.
|
|
103
|
+
3. Verify authorize rejects with `X402_PILOT_KILL_SWITCH_ACTIVE`.
|
|
104
|
+
4. Drain in-flight checks; stop new pilot traffic.
|
|
105
|
+
5. Revert risky config (prod reserve mode, provider allowlist overrides).
|
|
106
|
+
6. Run health checks again in sandbox mode before re-opening traffic.
|
|
107
|
+
|
|
108
|
+
## 7. Pilot Exit Criteria
|
|
109
|
+
|
|
110
|
+
- Health check flow passes end-to-end.
|
|
111
|
+
- Reliability report generated (`X402PilotReliabilityReport.v1`) and within thresholds.
|
|
112
|
+
- Rollback drill executed once and documented.
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
# Production Deployment Checklist
|
|
2
|
+
|
|
3
|
+
Use this checklist to launch and verify a real hosted Settld environment.
|
|
4
|
+
|
|
5
|
+
## Phase 0: Preflight
|
|
6
|
+
|
|
7
|
+
1. Confirm branch protection includes `tests / kernel_v0_ship_gate`.
|
|
8
|
+
2. Confirm release workflow is blocked unless ship gate is green.
|
|
9
|
+
3. Confirm staging and production have separate domains, databases, secrets, and signer keys.
|
|
10
|
+
4. Confirm required services are deployable: `npm run start:prod`, `npm run start:maintenance`, `npm run start:x402-gateway`.
|
|
11
|
+
|
|
12
|
+
## Phase 1: Environment + secrets
|
|
13
|
+
|
|
14
|
+
1. Provision Postgres and store `DATABASE_URL`.
|
|
15
|
+
2. Set `STORE=pg`, `NODE_ENV=production`, `PROXY_MIGRATE_ON_STARTUP=1`.
|
|
16
|
+
3. Set scoped `PROXY_OPS_TOKENS`.
|
|
17
|
+
4. Configure rate limits and quotas from `docs/CONFIG.md`.
|
|
18
|
+
5. Configure gateway secrets: `SETTLD_API_URL`, `SETTLD_API_KEY`, `UPSTREAM_URL`.
|
|
19
|
+
|
|
20
|
+
## Phase 2: Deploy services
|
|
21
|
+
|
|
22
|
+
1. Deploy `settld-api`.
|
|
23
|
+
2. Deploy `settld-maintenance`.
|
|
24
|
+
3. Deploy `x402-gateway`.
|
|
25
|
+
4. Verify service health:
|
|
26
|
+
|
|
27
|
+
```bash
|
|
28
|
+
curl -fsS https://api.settld.work/healthz
|
|
29
|
+
curl -fsS https://gateway.settld.work/healthz
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
## Phase 3: Baseline ops verification
|
|
33
|
+
|
|
34
|
+
1. Run hosted baseline evidence command:
|
|
35
|
+
|
|
36
|
+
```bash
|
|
37
|
+
npm run ops:hosted-baseline:evidence -- \
|
|
38
|
+
--base-url https://api.settld.work \
|
|
39
|
+
--tenant-id tenant_default \
|
|
40
|
+
--ops-token "$SETTLD_OPS_TOKEN" \
|
|
41
|
+
--environment production \
|
|
42
|
+
--out ./artifacts/ops/hosted-baseline-evidence-production.json
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
2. Confirm alert metric presence and health signals.
|
|
46
|
+
3. Run backup/restore drill evidence path at least once before opening customer traffic.
|
|
47
|
+
|
|
48
|
+
## Phase 4: MCP compatibility verification
|
|
49
|
+
|
|
50
|
+
1. Run core MCP automated tests:
|
|
51
|
+
|
|
52
|
+
```bash
|
|
53
|
+
node --test \
|
|
54
|
+
test/mcp-stdio-spike.test.js \
|
|
55
|
+
test/mcp-http-gateway.test.js \
|
|
56
|
+
test/mcp-paid-exa-tool.test.js \
|
|
57
|
+
test/mcp-paid-weather-tool.test.js \
|
|
58
|
+
test/mcp-paid-llm-tool.test.js \
|
|
59
|
+
test/demo-mcp-paid-exa.test.js
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
2. Run the hosted-style MCP smoke gate (API + magic-link bootstrap + MCP probe):
|
|
63
|
+
|
|
64
|
+
```bash
|
|
65
|
+
npm run test:ci:mcp-host-smoke
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
This emits a machine-readable report at:
|
|
69
|
+
|
|
70
|
+
`artifacts/ops/mcp-host-smoke.json`
|
|
71
|
+
|
|
72
|
+
3. Run host quickstart validation from `docs/QUICKSTART_MCP_HOSTS.md` for:
|
|
73
|
+
Claude, Cursor, Codex, and OpenClaw.
|
|
74
|
+
|
|
75
|
+
4. Update `docs/ops/MCP_COMPATIBILITY_MATRIX.md` with pass/fail + date.
|
|
76
|
+
|
|
77
|
+
## Phase 5: Paid call + receipt proof
|
|
78
|
+
|
|
79
|
+
1. Run a paid demo flow:
|
|
80
|
+
|
|
81
|
+
```bash
|
|
82
|
+
npm run demo:mcp-paid-exa
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
2. Confirm artifacts exist:
|
|
86
|
+
`artifacts/mcp-paid-exa/.../summary.json` and gate/settlement evidence files in the same run directory.
|
|
87
|
+
3. Verify receipt path using existing verifier tooling.
|
|
88
|
+
|
|
89
|
+
## Phase 6: Go-live decision gate
|
|
90
|
+
|
|
91
|
+
Ship only when all are true:
|
|
92
|
+
|
|
93
|
+
1. Kernel v0 ship gate is green.
|
|
94
|
+
2. Hosted baseline evidence is green.
|
|
95
|
+
3. MCP compatibility matrix is green for supported hosts.
|
|
96
|
+
4. Paid MCP run artifacts verify cleanly.
|
|
97
|
+
5. Rollback runbook has been rehearsed.
|
|
98
|
+
|
|
99
|
+
## Phase 7: Post-release
|
|
100
|
+
|
|
101
|
+
1. Monitor `/metrics` + SLO dashboards.
|
|
102
|
+
2. Track weekly reliability report (`docs/ops/X402_PILOT_WEEKLY_METRICS.md`).
|
|
103
|
+
3. Re-run compatibility checks on every major host release.
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
# Release 1 SLOs and Error Budgets
|
|
2
|
+
|
|
3
|
+
Date baseline: February 7, 2026
|
|
4
|
+
Release target: `Settld Verified Transactions v1` (end of Sprint 4)
|
|
5
|
+
|
|
6
|
+
## Scope
|
|
7
|
+
|
|
8
|
+
These SLOs govern the Release 1 production path:
|
|
9
|
+
|
|
10
|
+
- Agent identity registration and wallet funding.
|
|
11
|
+
- Marketplace RFQ, bid, accept, and run execution flows.
|
|
12
|
+
- Settlement, dispute, and policy replay endpoints.
|
|
13
|
+
- Ops payout enqueue and money rail operation status/cancel flows.
|
|
14
|
+
|
|
15
|
+
## SLO-1: API availability
|
|
16
|
+
|
|
17
|
+
- SLI: successful request ratio for R1 endpoints.
|
|
18
|
+
- Objective: 99.9% monthly availability.
|
|
19
|
+
- Error budget: 43m 49s/month.
|
|
20
|
+
- Burn alert thresholds:
|
|
21
|
+
- Fast burn: >10% budget consumed in 1 hour.
|
|
22
|
+
- Slow burn: >25% budget consumed in 7 days.
|
|
23
|
+
|
|
24
|
+
## SLO-2: Settlement latency
|
|
25
|
+
|
|
26
|
+
- SLI: p95 latency for terminal settlement transitions (auto or manual resolve).
|
|
27
|
+
- Objective: p95 < 2.5s.
|
|
28
|
+
- Error budget: 5% of settlement requests may exceed p95 threshold.
|
|
29
|
+
|
|
30
|
+
## SLO-3: Verification latency
|
|
31
|
+
|
|
32
|
+
- SLI: p95 latency for verification status computation on run terminal events.
|
|
33
|
+
- Objective: p95 < 3.0s.
|
|
34
|
+
- Error budget: 5% monthly.
|
|
35
|
+
|
|
36
|
+
## SLO-4: Money rail operation freshness
|
|
37
|
+
|
|
38
|
+
- SLI: age of operations remaining in `initiated` or `submitted` without progress.
|
|
39
|
+
- Objective: 99% of operations progress or close within 30 minutes.
|
|
40
|
+
- Error budget: 1% monthly.
|
|
41
|
+
|
|
42
|
+
## SLO-5: Reconciliation backlog age
|
|
43
|
+
|
|
44
|
+
- SLI: age of unresolved reconciliation mismatches.
|
|
45
|
+
- Objective: 95% resolved within 48 hours.
|
|
46
|
+
- Error budget: 5% monthly.
|
|
47
|
+
|
|
48
|
+
## SLO-6: Determinism drift
|
|
49
|
+
|
|
50
|
+
- SLI: count of deterministic replay mismatches in CI release-gate suites.
|
|
51
|
+
- Objective: 0 per release candidate.
|
|
52
|
+
- Error budget: none; any drift is release-blocking.
|
|
53
|
+
|
|
54
|
+
## Release-blocking conditions
|
|
55
|
+
|
|
56
|
+
- Any failing deterministic replay/conformance suite.
|
|
57
|
+
- Any unacknowledged Sev1 or Sev2 incident on settlement or verification path.
|
|
58
|
+
- Missing rollback plan for money rails, escrow/netting, or arbitration changes.
|
|
59
|
+
|
|
60
|
+
## Dashboard requirements
|
|
61
|
+
|
|
62
|
+
- Endpoint latency and availability by route family.
|
|
63
|
+
- Settlement states over time and stuck-state counts.
|
|
64
|
+
- Money rail lifecycle state histogram by provider.
|
|
65
|
+
- Reconciliation mismatch count and age buckets.
|
|
66
|
+
- Determinism gate pass/fail trend by commit.
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
# Release signing incident runbook
|
|
2
|
+
|
|
3
|
+
This runbook covers the “release signing key compromised” scenario for Settld distribution artifacts.
|
|
4
|
+
|
|
5
|
+
## Immediate goals
|
|
6
|
+
|
|
7
|
+
- Prevent future malicious releases from verifying.
|
|
8
|
+
- Preserve a clear audit trail of what happened and what was rotated.
|
|
9
|
+
|
|
10
|
+
## Assumptions
|
|
11
|
+
|
|
12
|
+
- Release authenticity is verified via `ReleaseIndex.v1` + `ReleaseTrust.v2` (see `docs/spec/SUPPLY_CHAIN.md`).
|
|
13
|
+
- Release trust roots are pinned in `trust/release-trust.json`.
|
|
14
|
+
- Release signing private keys are stored as CI secrets (e.g., `SETTLD_RELEASE_SIGNING_PRIVATE_KEY_PEM`).
|
|
15
|
+
|
|
16
|
+
## Procedure (high-level)
|
|
17
|
+
|
|
18
|
+
1) **Revoke compromised key**
|
|
19
|
+
|
|
20
|
+
- Edit `trust/release-trust.json`:
|
|
21
|
+
- Keep the key entry (do not delete immediately).
|
|
22
|
+
- Set `revokedAtEpochSeconds` to the intended cutoff time.
|
|
23
|
+
- Add/update `comment` with incident reference.
|
|
24
|
+
|
|
25
|
+
2) **Add replacement key**
|
|
26
|
+
|
|
27
|
+
- Generate a new Ed25519 keypair (private key never committed).
|
|
28
|
+
- Add its public key + `keyId` into `trust/release-trust.json`.
|
|
29
|
+
- If you require quorum, ensure policy still holds (`policy.minSignatures`).
|
|
30
|
+
|
|
31
|
+
3) **Rotate CI secrets**
|
|
32
|
+
|
|
33
|
+
- Update the release workflow secret(s) to use the new private key(s).
|
|
34
|
+
- If quorum is required, ensure CI has all required signing keys/secrets.
|
|
35
|
+
|
|
36
|
+
4) **Cut a release candidate and verify**
|
|
37
|
+
|
|
38
|
+
- Produce release artifacts.
|
|
39
|
+
- Verify via:
|
|
40
|
+
- `settld-release verify --dir <release-assets-dir> --trust-file trust/release-trust.json --format json --explain`
|
|
41
|
+
|
|
42
|
+
5) **Validate the block**
|
|
43
|
+
|
|
44
|
+
- A release signed with the revoked key at/after `revokedAtEpochSeconds` must fail verification with `RELEASE_SIGNER_REVOKED`.
|
|
45
|
+
|
|
46
|
+
## Automated drill
|
|
47
|
+
|
|
48
|
+
CI includes a compromise drill test:
|
|
49
|
+
|
|
50
|
+
- `test/release-signing-compromise-drill.test.js`
|
|
51
|
+
|
|
52
|
+
This test simulates:
|
|
53
|
+
|
|
54
|
+
- old key revoked
|
|
55
|
+
- new key added
|
|
56
|
+
- release signed with old key after revocation fails
|
|
57
|
+
- release signed with new key passes
|
|
58
|
+
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
# Self-Serve Launch Automation (S197/S198)
|
|
2
|
+
|
|
3
|
+
This runbook covers the self-serve launch automation surfaces:
|
|
4
|
+
|
|
5
|
+
- onboarding email sequence automation,
|
|
6
|
+
- referral funnel instrumentation,
|
|
7
|
+
- benchmark artifact generation for launch reporting.
|
|
8
|
+
|
|
9
|
+
## 1) Onboarding email sequence
|
|
10
|
+
|
|
11
|
+
Magic Link now emits a milestone-based onboarding email sequence per tenant:
|
|
12
|
+
|
|
13
|
+
- `welcome`
|
|
14
|
+
- `sample_verified_nudge`
|
|
15
|
+
- `first_settlement_completed`
|
|
16
|
+
|
|
17
|
+
Implementation:
|
|
18
|
+
|
|
19
|
+
- `services/magic-link/src/onboarding-email-sequence.js`
|
|
20
|
+
- wired from `services/magic-link/src/server.js` on tenant create, onboarding events, and upload progress.
|
|
21
|
+
|
|
22
|
+
Environment controls:
|
|
23
|
+
|
|
24
|
+
```bash
|
|
25
|
+
MAGIC_LINK_ONBOARDING_EMAIL_SEQUENCE_ENABLED=1
|
|
26
|
+
MAGIC_LINK_ONBOARDING_EMAIL_DELIVERY_MODE=record # record|log|smtp
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
Default behavior:
|
|
30
|
+
|
|
31
|
+
- uses `smtp` when SMTP is configured,
|
|
32
|
+
- falls back to `record` otherwise.
|
|
33
|
+
|
|
34
|
+
Record mode writes deterministic outbox files:
|
|
35
|
+
|
|
36
|
+
- `onboarding-email-outbox/<tenantId>/<stepKey>/*.json`
|
|
37
|
+
- per-tenant state: `tenants/<tenantId>/onboarding_email_sequence.json`
|
|
38
|
+
|
|
39
|
+
## 2) Referral loop instrumentation
|
|
40
|
+
|
|
41
|
+
Referral loop signals are ingested through onboarding events:
|
|
42
|
+
|
|
43
|
+
- `referral_link_shared`
|
|
44
|
+
- `referral_signup`
|
|
45
|
+
|
|
46
|
+
Endpoint:
|
|
47
|
+
|
|
48
|
+
```bash
|
|
49
|
+
POST /v1/tenants/{tenantId}/onboarding/events
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
Example payloads:
|
|
53
|
+
|
|
54
|
+
```json
|
|
55
|
+
{ "eventType": "referral_link_shared", "metadata": { "channel": "email", "campaign": "launch_v1" } }
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
```json
|
|
59
|
+
{ "eventType": "referral_signup", "metadata": { "sourceTenantId": "tenant_a", "referredTenantId": "tenant_b" } }
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
Metrics exposure:
|
|
63
|
+
|
|
64
|
+
- `GET /v1/tenants/{tenantId}/onboarding-metrics`
|
|
65
|
+
- includes `referral.linkSharedCount`, `referral.signupCount`, `referral.conversionRatePct`.
|
|
66
|
+
|
|
67
|
+
## 3) Launch benchmark artifact
|
|
68
|
+
|
|
69
|
+
Build benchmark report from launch gate + throughput + incident rehearsal artifacts:
|
|
70
|
+
|
|
71
|
+
```bash
|
|
72
|
+
node scripts/ci/build-self-serve-benchmark-report.mjs
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
Output:
|
|
76
|
+
|
|
77
|
+
- `artifacts/launch/self-serve-benchmark-report.json`
|
|
78
|
+
|
|
79
|
+
Inputs (defaults):
|
|
80
|
+
|
|
81
|
+
- `artifacts/gates/self-serve-launch-gate.json`
|
|
82
|
+
- `artifacts/throughput/10x-drill-summary.json`
|
|
83
|
+
- `artifacts/throughput/10x-incident-rehearsal-summary.json`
|
|
84
|
+
|
|
85
|
+
NPM shortcut:
|
|
86
|
+
|
|
87
|
+
```bash
|
|
88
|
+
npm run test:ops:self-serve-benchmark
|
|
89
|
+
```
|