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,140 @@
|
|
|
1
|
+
# Circle Sandbox E2E (Reserve Adapter)
|
|
2
|
+
|
|
3
|
+
This guide is for validating the x402 reserve path against Circle sandbox before enabling production mode.
|
|
4
|
+
|
|
5
|
+
## Goal
|
|
6
|
+
|
|
7
|
+
Prove the reserve contract used by `POST /x402/gate/authorize-payment`:
|
|
8
|
+
|
|
9
|
+
1. Reserve succeeds before token mint.
|
|
10
|
+
2. Reserve failure does not mint a token.
|
|
11
|
+
3. Reserve rollback path restores internal wallet state.
|
|
12
|
+
|
|
13
|
+
## Production safety defaults
|
|
14
|
+
|
|
15
|
+
The API is configured to fail closed in production-like environments:
|
|
16
|
+
|
|
17
|
+
- `X402_REQUIRE_EXTERNAL_RESERVE` defaults to `true` when `SETTLD_ENV=production|prod`, `NODE_ENV=production`, or `RAILWAY_ENVIRONMENT_NAME=production|prod`.
|
|
18
|
+
- `X402_CIRCLE_RESERVE_MODE` defaults to `production` in production-like environments.
|
|
19
|
+
- In local/test environments, defaults remain:
|
|
20
|
+
- `X402_REQUIRE_EXTERNAL_RESERVE=false`
|
|
21
|
+
- `X402_CIRCLE_RESERVE_MODE=stub`
|
|
22
|
+
|
|
23
|
+
To force explicit behavior in any environment, set both env vars directly.
|
|
24
|
+
|
|
25
|
+
## Required env
|
|
26
|
+
|
|
27
|
+
Set these for sandbox runs:
|
|
28
|
+
|
|
29
|
+
- `CIRCLE_E2E=1` (enables sandbox e2e tests)
|
|
30
|
+
- `CIRCLE_API_KEY` (sandbox key)
|
|
31
|
+
- `CIRCLE_BASE_URL=https://api-sandbox.circle.com`
|
|
32
|
+
- `CIRCLE_BLOCKCHAIN` (for example `BASE-SEPOLIA`)
|
|
33
|
+
- `CIRCLE_WALLET_ID_SPEND`
|
|
34
|
+
- `CIRCLE_WALLET_ID_ESCROW`
|
|
35
|
+
- `CIRCLE_TOKEN_ID_USDC`
|
|
36
|
+
|
|
37
|
+
If your environment uses a different naming convention, map these into the adapter config before running tests.
|
|
38
|
+
|
|
39
|
+
## Suggested test flow
|
|
40
|
+
|
|
41
|
+
1. Verify spend wallet has sufficient USDC.
|
|
42
|
+
2. Call reserve (`spend -> escrow`) with idempotency key = gate id.
|
|
43
|
+
3. Poll transaction status until terminal/safe state.
|
|
44
|
+
4. Attempt rollback:
|
|
45
|
+
- cancel when still cancellable, or
|
|
46
|
+
- compensating transfer (`escrow -> spend`) when already confirmed.
|
|
47
|
+
5. Verify resulting balances + persisted reserve status.
|
|
48
|
+
|
|
49
|
+
## Run command
|
|
50
|
+
|
|
51
|
+
After adapter wiring is complete:
|
|
52
|
+
|
|
53
|
+
```bash
|
|
54
|
+
CIRCLE_E2E=1 node --test test/circle-sandbox-reserve-e2e.test.js
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
## Run full paid MCP demo in Circle mode
|
|
58
|
+
|
|
59
|
+
The demo now supports explicit reserve rail mode:
|
|
60
|
+
|
|
61
|
+
```bash
|
|
62
|
+
SETTLD_DEMO_CIRCLE_MODE=sandbox \
|
|
63
|
+
X402_REQUIRE_EXTERNAL_RESERVE=1 \
|
|
64
|
+
node scripts/demo/mcp-paid-exa.mjs --circle=sandbox
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
Artifacts include:
|
|
68
|
+
|
|
69
|
+
- `summary.json` with `circleMode`, `circleReserveId`, `reserveTransitions`, and `payoutDestination`.
|
|
70
|
+
- `reserve-state.json` with reserve details, transition timeline, and configured Circle rail metadata.
|
|
71
|
+
|
|
72
|
+
## Run paid MCP demo + batch settlement in Circle mode
|
|
73
|
+
|
|
74
|
+
This runs the same demo flow and then executes the batch payout worker against the generated artifact root:
|
|
75
|
+
|
|
76
|
+
```bash
|
|
77
|
+
SETTLD_DEMO_CIRCLE_MODE=sandbox \
|
|
78
|
+
SETTLD_DEMO_RUN_BATCH_SETTLEMENT=1 \
|
|
79
|
+
SETTLD_DEMO_BATCH_PROVIDER_WALLET_ID="$CIRCLE_WALLET_ID_ESCROW" \
|
|
80
|
+
X402_REQUIRE_EXTERNAL_RESERVE=1 \
|
|
81
|
+
node scripts/demo/mcp-paid-exa.mjs --circle=sandbox
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
Additional artifacts:
|
|
85
|
+
|
|
86
|
+
- `batch-payout-registry.json`
|
|
87
|
+
- `batch-worker-state.json`
|
|
88
|
+
- `batch-settlement.json`
|
|
89
|
+
|
|
90
|
+
## Run sandbox-gated batch settlement E2E test
|
|
91
|
+
|
|
92
|
+
```bash
|
|
93
|
+
CIRCLE_E2E=1 CIRCLE_BATCH_E2E=1 node --test test/circle-sandbox-batch-settlement-e2e.test.js
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
This test:
|
|
97
|
+
|
|
98
|
+
1. Runs the paid MCP demo in sandbox mode with batch settlement enabled.
|
|
99
|
+
2. Confirms payout submission state is recorded.
|
|
100
|
+
3. Reruns the worker and verifies payout idempotency (no duplicate submit).
|
|
101
|
+
|
|
102
|
+
## Run the full Circle sandbox smoke gate
|
|
103
|
+
|
|
104
|
+
This command is the recommended "no-regression" check. It runs:
|
|
105
|
+
|
|
106
|
+
1. Optional faucet top-ups for spend/escrow wallets (can be disabled with `CIRCLE_SKIP_TOPUP=1`).
|
|
107
|
+
2. `test/circle-sandbox-reserve-e2e.test.js`
|
|
108
|
+
3. `test/circle-sandbox-batch-settlement-e2e.test.js`
|
|
109
|
+
|
|
110
|
+
```bash
|
|
111
|
+
npm run test:x402:circle:sandbox:smoke
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
Smoke output artifact:
|
|
115
|
+
|
|
116
|
+
- `artifacts/gates/x402-circle-sandbox-smoke.json`
|
|
117
|
+
|
|
118
|
+
## GitHub Actions smoke workflow
|
|
119
|
+
|
|
120
|
+
The repo includes `.github/workflows/x402-circle-sandbox-smoke.yml` for manual/nightly runs.
|
|
121
|
+
|
|
122
|
+
Required repo secrets:
|
|
123
|
+
|
|
124
|
+
- `CIRCLE_SANDBOX_API_KEY`
|
|
125
|
+
- `CIRCLE_SANDBOX_WALLET_ID_SPEND`
|
|
126
|
+
- `CIRCLE_SANDBOX_WALLET_ID_ESCROW`
|
|
127
|
+
- `CIRCLE_SANDBOX_TOKEN_ID_USDC`
|
|
128
|
+
- `CIRCLE_SANDBOX_ENTITY_SECRET_HEX`
|
|
129
|
+
|
|
130
|
+
Optional repo secrets:
|
|
131
|
+
|
|
132
|
+
- `CIRCLE_SANDBOX_BASE_URL` (defaults to `https://api.circle.com`)
|
|
133
|
+
- `CIRCLE_SANDBOX_BLOCKCHAIN` (defaults to `BASE-SEPOLIA`)
|
|
134
|
+
|
|
135
|
+
## Pass criteria
|
|
136
|
+
|
|
137
|
+
- Reserve call returns a stable `reserveId`.
|
|
138
|
+
- Repeated reserve calls with same gate id are idempotent.
|
|
139
|
+
- Failed reserves return `X402_RESERVE_FAILED` and leave no stranded internal escrow lock.
|
|
140
|
+
- Rollback returns funds to spend wallet (cancel or compensation).
|
package/docs/CONFIG.md
ADDED
|
@@ -0,0 +1,297 @@
|
|
|
1
|
+
# Settld Configuration (Runtime)
|
|
2
|
+
|
|
3
|
+
This repo is intentionally “ops-first”: **safe defaults**, explicit hardening toggles, and predictable failure modes.
|
|
4
|
+
|
|
5
|
+
## Store / durability
|
|
6
|
+
|
|
7
|
+
- `STORE` (`memory` | `pg`, default: `memory`)
|
|
8
|
+
- `DATABASE_URL` (required when `STORE=pg`)
|
|
9
|
+
- `PROXY_PG_SCHEMA` (default: `public`)
|
|
10
|
+
- `PROXY_PG_LOG_SLOW_MS` (default: `0` = disabled)
|
|
11
|
+
When nonzero, logs slow queries as `pg.query.slow` with duration + a best-effort query label (never logs query args).
|
|
12
|
+
- `PROXY_MIGRATE_ON_STARTUP` (`1` | `0`, default: `1`)
|
|
13
|
+
When `1`, Settld runs SQL migrations on startup (PG advisory-lock protected so concurrent instances are safe). Set `0` if you run migrations out-of-band.
|
|
14
|
+
- `PROXY_DATA_DIR` (memory mode durability via file tx-log; default: unset = purely in-memory)
|
|
15
|
+
|
|
16
|
+
## HTTP limits
|
|
17
|
+
|
|
18
|
+
- `PROXY_MAX_BODY_BYTES` (default: `1000000`)
|
|
19
|
+
- `PROXY_INGEST_MAX_EVENTS` (default: `200`)
|
|
20
|
+
|
|
21
|
+
## Protocol / versioning
|
|
22
|
+
|
|
23
|
+
Settld exposes a protocol version contract via `x-settld-protocol` and enforces compatibility windows.
|
|
24
|
+
|
|
25
|
+
- `PROXY_PROTOCOL_MIN` (default: current, e.g. `1.0`)
|
|
26
|
+
Requests below this return `426` with `code: PROTOCOL_TOO_OLD`.
|
|
27
|
+
|
|
28
|
+
- `PROXY_PROTOCOL_MAX` (default: current, e.g. `1.0`)
|
|
29
|
+
Requests above this return `400` with `code: PROTOCOL_TOO_NEW`.
|
|
30
|
+
|
|
31
|
+
- `PROXY_PROTOCOL_DEPRECATIONS` (optional file path)
|
|
32
|
+
JSON map of protocol version -> cutoff date; requests past cutoff return `426` with `code: PROTOCOL_DEPRECATED`.
|
|
33
|
+
Example:
|
|
34
|
+
|
|
35
|
+
```json
|
|
36
|
+
{ "1.0": { "cutoff": "2026-12-31T00:00:00.000Z" } }
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
Production enforcement:
|
|
40
|
+
|
|
41
|
+
- When `NODE_ENV=production`, `/ingest/proxy` and `POST /{jobs|robots|operators}/:id/events` require the request header `x-settld-protocol` (else `400` with `code: PROTOCOL_VERSION_REQUIRED`).
|
|
42
|
+
|
|
43
|
+
## Rate limiting
|
|
44
|
+
|
|
45
|
+
- `PROXY_RATE_LIMIT_RPM` (default: `0` = disabled)
|
|
46
|
+
- `PROXY_RATE_LIMIT_BURST` (default: `PROXY_RATE_LIMIT_RPM`)
|
|
47
|
+
- `PROXY_RATE_LIMIT_PER_KEY_RPM` (default: `0` = disabled)
|
|
48
|
+
Applies an additional token bucket per authenticated API key (`auth.keyId`) after tenant-level limiting.
|
|
49
|
+
- `PROXY_RATE_LIMIT_PER_KEY_BURST` (default: `PROXY_RATE_LIMIT_PER_KEY_RPM`)
|
|
50
|
+
|
|
51
|
+
## Outbox reclaim / worker loop
|
|
52
|
+
|
|
53
|
+
- `PROXY_RECLAIM_AFTER_SECONDS` (default: `60`)
|
|
54
|
+
Reclaim “claimed but not processed” outbox rows after this window.
|
|
55
|
+
|
|
56
|
+
- `PROXY_PG_WORKER_STATEMENT_TIMEOUT_MS` (default: `0` = disabled; PG only)
|
|
57
|
+
Sets `statement_timeout` for worker-transaction queries (outbox claims + delivery claims + outbox processors) to prevent “hung query” pileups.
|
|
58
|
+
|
|
59
|
+
- `PROXY_AUTOTICK` (`1` enables a default loop)
|
|
60
|
+
- `PROXY_AUTOTICK_INTERVAL_MS` (default: `0`, or `250` when `PROXY_AUTOTICK=1`)
|
|
61
|
+
- `PROXY_AUTOTICK_MAX_MESSAGES` (default: `100`)
|
|
62
|
+
|
|
63
|
+
Delivery/worker tuning:
|
|
64
|
+
|
|
65
|
+
- `PROXY_WORKER_CONCURRENCY_ARTIFACTS` (default: `1`)
|
|
66
|
+
Max concurrent artifact build groups (grouped by `tenantId + jobId`).
|
|
67
|
+
|
|
68
|
+
- `PROXY_WORKER_CONCURRENCY_DELIVERIES` (default: `1`)
|
|
69
|
+
Max concurrent delivery scope groups (grouped by `scopeKey`; preserves ordering within each scope).
|
|
70
|
+
|
|
71
|
+
- `PROXY_DELIVERY_HTTP_TIMEOUT_MS` (default: `0` = disabled)
|
|
72
|
+
Abort outbound delivery HTTP requests after this timeout and retry with backoff.
|
|
73
|
+
|
|
74
|
+
## Ops / API auth
|
|
75
|
+
|
|
76
|
+
- `PROXY_OPS_TOKENS`
|
|
77
|
+
Format: `token:scope1,scope2;token2:scopeA` (scopes include `ops_read`, `ops_write`, `audit_read`, `finance_write`, …)
|
|
78
|
+
|
|
79
|
+
- `PROXY_OPS_TOKEN` (legacy)
|
|
80
|
+
If `PROXY_OPS_TOKENS` is empty, this single token grants full ops access.
|
|
81
|
+
|
|
82
|
+
- `PROXY_AUTH_KEY_TOUCH_MIN_SECONDS` (default: `60`)
|
|
83
|
+
Throttle how often `last_used_at` is updated for API keys (reduces DB write amplification).
|
|
84
|
+
|
|
85
|
+
## Ingest auth
|
|
86
|
+
|
|
87
|
+
- `PROXY_INGEST_TOKEN` (optional)
|
|
88
|
+
When set, `/ingest/proxy` requires header `x-proxy-ingest-token` to match.
|
|
89
|
+
|
|
90
|
+
## Export destinations (deliveries)
|
|
91
|
+
|
|
92
|
+
- `PROXY_EXPORT_DESTINATIONS` (JSON)
|
|
93
|
+
Maps `tenantId -> destinations[]`.
|
|
94
|
+
|
|
95
|
+
Webhook destination (preferred, secrets via ref):
|
|
96
|
+
|
|
97
|
+
```json
|
|
98
|
+
{
|
|
99
|
+
"tenant_default": [
|
|
100
|
+
{ "destinationId": "dst_webhook", "kind": "webhook", "url": "https://example.com/hook", "secretRef": "file:/var/run/secrets/webhook_secret" }
|
|
101
|
+
]
|
|
102
|
+
}
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
S3 destination (preferred, credentials via ref):
|
|
106
|
+
|
|
107
|
+
```json
|
|
108
|
+
{
|
|
109
|
+
"tenant_default": [
|
|
110
|
+
{
|
|
111
|
+
"destinationId": "dst_s3",
|
|
112
|
+
"kind": "s3",
|
|
113
|
+
"endpoint": "https://s3.amazonaws.com",
|
|
114
|
+
"bucket": "my-bucket",
|
|
115
|
+
"region": "us-east-1",
|
|
116
|
+
"accessKeyIdRef": "file:/var/run/secrets/aws_access_key_id",
|
|
117
|
+
"secretAccessKeyRef": "file:/var/run/secrets/aws_secret_access_key"
|
|
118
|
+
}
|
|
119
|
+
]
|
|
120
|
+
}
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
Hardening note:
|
|
124
|
+
|
|
125
|
+
- Inline secrets (`secret`, `accessKeyId`, `secretAccessKey`) are rejected when `NODE_ENV=production` unless `PROXY_ALLOW_INLINE_SECRETS=1`.
|
|
126
|
+
|
|
127
|
+
## Evidence store
|
|
128
|
+
|
|
129
|
+
- `PROXY_EVIDENCE_STORE` (`fs` | `memory` | `s3` | `minio`, default: `fs`)
|
|
130
|
+
- `PROXY_EVIDENCE_DIR` (fs store root; default: tmp dir when not using `PROXY_DATA_DIR`)
|
|
131
|
+
|
|
132
|
+
S3/minio evidence store config:
|
|
133
|
+
|
|
134
|
+
- `PROXY_EVIDENCE_S3_ENDPOINT`
|
|
135
|
+
- `PROXY_EVIDENCE_S3_REGION` (default: `us-east-1`)
|
|
136
|
+
- `PROXY_EVIDENCE_S3_BUCKET`
|
|
137
|
+
- `PROXY_EVIDENCE_S3_ACCESS_KEY_ID` (or `AWS_ACCESS_KEY_ID`)
|
|
138
|
+
- `PROXY_EVIDENCE_S3_SECRET_ACCESS_KEY` (or `AWS_SECRET_ACCESS_KEY`)
|
|
139
|
+
- `PROXY_EVIDENCE_S3_FORCE_PATH_STYLE` (default: `1`)
|
|
140
|
+
|
|
141
|
+
Evidence download security:
|
|
142
|
+
|
|
143
|
+
- `PROXY_EVIDENCE_SIGNING_SECRET` (optional; default derived from server signer)
|
|
144
|
+
- `PROXY_EVIDENCE_PRESIGN_MAX_SECONDS` (default: `300`, max: `3600`)
|
|
145
|
+
- `PROXY_EVIDENCE_RETENTION_MAX_DAYS` (default: `365`)
|
|
146
|
+
Tenant cap for `contract.policies.evidencePolicy.retentionDays`.
|
|
147
|
+
- `PROXY_EVIDENCE_RETENTION_MAX_DAYS_BY_TENANT` (JSON map, optional)
|
|
148
|
+
Per-tenant override for `PROXY_EVIDENCE_RETENTION_MAX_DAYS`.
|
|
149
|
+
|
|
150
|
+
## Secrets provider
|
|
151
|
+
|
|
152
|
+
- `PROXY_ENABLE_ENV_SECRETS` (`1` enables `env:NAME` refs; default: disabled unless `NODE_ENV=development`)
|
|
153
|
+
- `PROXY_SECRETS_CACHE_TTL_SECONDS` (default: `30`)
|
|
154
|
+
|
|
155
|
+
Supported refs:
|
|
156
|
+
|
|
157
|
+
- `env:NAME` (dev-only unless explicitly enabled)
|
|
158
|
+
- `file:/absolute/path` (k8s secret mounts)
|
|
159
|
+
|
|
160
|
+
## URL safety overrides (dev only)
|
|
161
|
+
|
|
162
|
+
These exist to make local development possible (e.g. MinIO on `localhost`). Do not enable in production.
|
|
163
|
+
|
|
164
|
+
- `PROXY_ALLOW_HTTP_URLS` (`1` allows `http://` where URL safety checks apply)
|
|
165
|
+
- `PROXY_ALLOW_PRIVATE_URLS` (`1` allows private IP ranges)
|
|
166
|
+
- `PROXY_ALLOW_LOOPBACK_URLS` (`1` allows `localhost` / loopback)
|
|
167
|
+
|
|
168
|
+
## Retention / cleanup
|
|
169
|
+
|
|
170
|
+
Retention is tenant-configurable via in-memory config and capped by these runtime env vars.
|
|
171
|
+
|
|
172
|
+
- `PROXY_RETENTION_INGEST_RECORDS_DAYS` (default: `0` = no expiry)
|
|
173
|
+
Sets `expires_at` for `ingest_records`.
|
|
174
|
+
|
|
175
|
+
- `PROXY_RETENTION_INGEST_RECORDS_MAX_DAYS` (default: `0` = no platform cap)
|
|
176
|
+
When set, tenant `0` means “use the cap”.
|
|
177
|
+
|
|
178
|
+
- `PROXY_RETENTION_DELIVERIES_DAYS` (default: `0` = no expiry)
|
|
179
|
+
Expiration for delivered deliveries.
|
|
180
|
+
|
|
181
|
+
- `PROXY_RETENTION_DELIVERIES_MAX_DAYS` (default: `0` = no platform cap)
|
|
182
|
+
|
|
183
|
+
- `PROXY_RETENTION_DELIVERY_DLQ_DAYS` (default: `PROXY_RETENTION_DELIVERIES_DAYS`)
|
|
184
|
+
Expiration for failed (DLQ) deliveries.
|
|
185
|
+
|
|
186
|
+
- `PROXY_RETENTION_DELIVERY_DLQ_MAX_DAYS` (default: `PROXY_RETENTION_DELIVERIES_MAX_DAYS`)
|
|
187
|
+
|
|
188
|
+
Cleanup execution (PG mode):
|
|
189
|
+
|
|
190
|
+
- `PROXY_RETENTION_CLEANUP_BATCH_SIZE` (default: `500`)
|
|
191
|
+
Max rows per table per cleanup run.
|
|
192
|
+
|
|
193
|
+
- `PROXY_RETENTION_CLEANUP_MAX_MILLIS` (default: `1500`)
|
|
194
|
+
Wall-clock budget for a single cleanup run (enforced via PG `statement_timeout`).
|
|
195
|
+
|
|
196
|
+
- `PROXY_RETENTION_CLEANUP_DRY_RUN` (`1` prints would-delete counts; no deletes)
|
|
197
|
+
|
|
198
|
+
Finance reconciliation scheduling:
|
|
199
|
+
|
|
200
|
+
- `PROXY_FINANCE_RECONCILE_ENABLED` (default: `1`)
|
|
201
|
+
Enables periodic finance reconciliation maintenance ticks.
|
|
202
|
+
|
|
203
|
+
- `PROXY_FINANCE_RECONCILE_INTERVAL_SECONDS` (default: `300`)
|
|
204
|
+
Minimum interval between automatic reconciliation runs.
|
|
205
|
+
|
|
206
|
+
- `PROXY_FINANCE_RECONCILE_MAX_TENANTS` (default: `50`)
|
|
207
|
+
Max tenants scanned per automatic run.
|
|
208
|
+
|
|
209
|
+
- `PROXY_FINANCE_RECONCILE_MAX_PERIODS_PER_TENANT` (default: `2`)
|
|
210
|
+
Max GL periods reconciled per tenant in one run.
|
|
211
|
+
|
|
212
|
+
Money-rail reconciliation scheduling:
|
|
213
|
+
|
|
214
|
+
- `PROXY_MONEY_RAIL_RECONCILE_ENABLED` (default: `1`)
|
|
215
|
+
Enables periodic money-rail reconciliation maintenance ticks.
|
|
216
|
+
|
|
217
|
+
- `PROXY_MONEY_RAIL_RECONCILE_INTERVAL_SECONDS` (default: `300`)
|
|
218
|
+
Minimum interval between automatic money-rail reconciliation runs.
|
|
219
|
+
|
|
220
|
+
- `PROXY_MONEY_RAIL_RECONCILE_MAX_TENANTS` (default: `50`)
|
|
221
|
+
Max tenants scanned per automatic run.
|
|
222
|
+
|
|
223
|
+
- `PROXY_MONEY_RAIL_RECONCILE_MAX_PERIODS_PER_TENANT` (default: `2`)
|
|
224
|
+
Max payout periods reconciled per tenant in one run.
|
|
225
|
+
|
|
226
|
+
- `PROXY_MONEY_RAIL_RECONCILE_MAX_PROVIDERS_PER_TENANT` (default: `10`)
|
|
227
|
+
Max money-rail providers reconciled per tenant in one run.
|
|
228
|
+
|
|
229
|
+
Maintenance runner (recommended in prod):
|
|
230
|
+
|
|
231
|
+
- `PROXY_MAINTENANCE_INTERVAL_SECONDS` (default: `300`)
|
|
232
|
+
Sleep between cleanup runs in `src/api/maintenance.js`.
|
|
233
|
+
|
|
234
|
+
## Quotas / backpressure
|
|
235
|
+
|
|
236
|
+
On quota breach, requests return `429` with `code: TENANT_QUOTA_EXCEEDED`.
|
|
237
|
+
|
|
238
|
+
- `PROXY_QUOTA_MAX_OPEN_JOBS` (default: `0` = unlimited)
|
|
239
|
+
- `PROXY_QUOTA_PLATFORM_MAX_OPEN_JOBS` (default: `0` = no platform cap)
|
|
240
|
+
|
|
241
|
+
- `PROXY_QUOTA_MAX_PENDING_DELIVERIES` (default: `0` = unlimited)
|
|
242
|
+
- `PROXY_QUOTA_PLATFORM_MAX_PENDING_DELIVERIES` (default: `0` = no platform cap)
|
|
243
|
+
|
|
244
|
+
- `PROXY_QUOTA_MAX_INGEST_DLQ_DEPTH` (default: `0` = unlimited)
|
|
245
|
+
- `PROXY_QUOTA_PLATFORM_MAX_INGEST_DLQ_DEPTH` (default: `0` = no platform cap)
|
|
246
|
+
|
|
247
|
+
- `PROXY_QUOTA_MAX_EVIDENCE_REFS_PER_JOB` (default: `0` = unlimited)
|
|
248
|
+
- `PROXY_QUOTA_PLATFORM_MAX_EVIDENCE_REFS_PER_JOB` (default: `0` = no platform cap)
|
|
249
|
+
|
|
250
|
+
- `PROXY_QUOTA_MAX_ARTIFACTS_PER_JOB_TYPE` (default: `0` = unlimited)
|
|
251
|
+
- `PROXY_QUOTA_PLATFORM_MAX_ARTIFACTS_PER_JOB_TYPE` (default: `0` = no platform cap)
|
|
252
|
+
|
|
253
|
+
## Outbox poison-pill
|
|
254
|
+
|
|
255
|
+
- `PROXY_OUTBOX_MAX_ATTEMPTS` (default: `25`)
|
|
256
|
+
After this many attempts, outbox work is marked done with a DLQ error marker.
|
|
257
|
+
|
|
258
|
+
## Evidence ingest constraints (optional hardening)
|
|
259
|
+
|
|
260
|
+
- `PROXY_EVIDENCE_CONTENT_TYPE_ALLOWLIST` (comma-separated)
|
|
261
|
+
If set, `EVIDENCE_CAPTURED.payload.contentType` must be in the allowlist.
|
|
262
|
+
|
|
263
|
+
- `PROXY_EVIDENCE_REQUIRE_SIZE_BYTES` (`1` requires `EVIDENCE_CAPTURED.payload.sizeBytes`)
|
|
264
|
+
- `PROXY_EVIDENCE_MAX_SIZE_BYTES` (default: `0` = unlimited)
|
|
265
|
+
|
|
266
|
+
## Backups / restore (Postgres)
|
|
267
|
+
|
|
268
|
+
These helper scripts assume you have Postgres client tools installed (`pg_dump`, `pg_restore`, `psql`).
|
|
269
|
+
|
|
270
|
+
- Backup:
|
|
271
|
+
|
|
272
|
+
```sh
|
|
273
|
+
DATABASE_URL=postgres://... PROXY_PG_SCHEMA=public OUT_DIR=./backups bash scripts/backup-pg.sh
|
|
274
|
+
```
|
|
275
|
+
|
|
276
|
+
- Restore (to a fresh DB is recommended):
|
|
277
|
+
|
|
278
|
+
```sh
|
|
279
|
+
DATABASE_URL=postgres://... PROXY_PG_SCHEMA=public bash scripts/restore-pg.sh ./backups/backup_*/db.dump
|
|
280
|
+
```
|
|
281
|
+
|
|
282
|
+
- Verify a restored DB:
|
|
283
|
+
|
|
284
|
+
```sh
|
|
285
|
+
DATABASE_URL=postgres://... PROXY_PG_SCHEMA=public node scripts/verify-pg.js
|
|
286
|
+
```
|
|
287
|
+
|
|
288
|
+
Verification knobs:
|
|
289
|
+
|
|
290
|
+
- `VERIFY_MAX_STREAMS` (default: `100`)
|
|
291
|
+
- `VERIFY_MAX_ARTIFACTS` (default: `100`)
|
|
292
|
+
- `VERIFY_MAX_LEDGER_ENTRIES` (default: `0` = all)
|
|
293
|
+
|
|
294
|
+
RPO/RTO (practical):
|
|
295
|
+
|
|
296
|
+
- RPO is the time between successful backups.
|
|
297
|
+
- RTO is `restore time + verification time` and scales with DB size.
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
# Contracts APIs (Legacy vs Contracts-as-Code)
|
|
2
|
+
|
|
3
|
+
Settld exposes two separate “contracts” API families on purpose.
|
|
4
|
+
|
|
5
|
+
## Legacy: `/ops/contracts` (policy upsert)
|
|
6
|
+
|
|
7
|
+
- Semantics: mutable upsert of “policy templates” (JSON `policies.*` blobs).
|
|
8
|
+
- Compatibility: kept for existing integrations and tests.
|
|
9
|
+
- Output: legacy `contract` records with `contractVersion` incrementing per upsert.
|
|
10
|
+
|
|
11
|
+
Use this when you want to keep the existing quoting/booking contract behavior.
|
|
12
|
+
|
|
13
|
+
## Contracts-as-Code: `/ops/contracts-v2` (hash-addressed documents)
|
|
14
|
+
|
|
15
|
+
- Semantics: immutable, hash-addressed `ContractDocument.v1` documents with optional signatures and an activation step.
|
|
16
|
+
- Output: v2 contract records that carry `contractHash`, `policyHash`, and `compilerId`.
|
|
17
|
+
- Jobs pin hashes at booking-time (so later edits cannot retroactively change what governed the job).
|
|
18
|
+
|
|
19
|
+
Use this when you need audit-grade pinning (hashes), signing, and deterministic compilation.
|
|
20
|
+
|
|
21
|
+
## Capabilities
|
|
22
|
+
|
|
23
|
+
`GET /capabilities` advertises which contract APIs and schema/compiler versions the server supports.
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
# Deprecation Policy
|
|
2
|
+
|
|
3
|
+
Settld is infrastructure. We don’t break integrators casually.
|
|
4
|
+
|
|
5
|
+
## Protocol versions (`x-settld-protocol`)
|
|
6
|
+
|
|
7
|
+
- Format: `major.minor` (example: `1.0`)
|
|
8
|
+
- Server advertises:
|
|
9
|
+
- `x-settld-protocol` (current)
|
|
10
|
+
- `x-settld-supported-protocols` (comma-separated)
|
|
11
|
+
|
|
12
|
+
### Minimum windows
|
|
13
|
+
|
|
14
|
+
- Breaking change requires a protocol bump.
|
|
15
|
+
- Deprecated protocol versions remain supported for **at least 6 months**, except for urgent security fixes.
|
|
16
|
+
|
|
17
|
+
### Enforcing deprecation cutoffs
|
|
18
|
+
|
|
19
|
+
If configured, the server rejects deprecated versions past cutoff via `PROXY_PROTOCOL_DEPRECATIONS` and reason code `PROTOCOL_DEPRECATED`.
|
|
20
|
+
|
|
21
|
+
## APIs
|
|
22
|
+
|
|
23
|
+
When an API family is deprecated:
|
|
24
|
+
- it will be called out in `CHANGELOG.md`
|
|
25
|
+
- it may emit a warning header in non-test mode
|
|
26
|
+
- it will have a published replacement
|
|
27
|
+
|
|
28
|
+
Current split:
|
|
29
|
+
- Legacy contracts: `/ops/contracts` (mutable policy upsert; back-compat)
|
|
30
|
+
- Contracts v2: `/ops/contracts-v2` (contracts-as-code; hash-addressed + compiled)
|
|
31
|
+
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
# Settld Domain Model (v0)
|
|
2
|
+
|
|
3
|
+
## Actors
|
|
4
|
+
|
|
5
|
+
- **Requester**: Household or Business that pays and grants scoped access.
|
|
6
|
+
- **Owner**: supplies executors and receives payouts.
|
|
7
|
+
- **Executor**: endpoint with capabilities, health, and safety profile.
|
|
8
|
+
- **Operator**: remote assist + exception handling; actions are audited.
|
|
9
|
+
- **Developer**: publishes skills.
|
|
10
|
+
- **Trust Counterparty**: insurance/guarantee/claims partner.
|
|
11
|
+
|
|
12
|
+
## First-class entities
|
|
13
|
+
|
|
14
|
+
### Job
|
|
15
|
+
|
|
16
|
+
Purchasable outcome with SLA and constraints.
|
|
17
|
+
|
|
18
|
+
Key fields:
|
|
19
|
+
|
|
20
|
+
- `templateId` (e.g., `reset_lite`)
|
|
21
|
+
- constraints (rooms allowed, privacy mode, fragile items, pets, etc.)
|
|
22
|
+
- scheduling window
|
|
23
|
+
- price quote + risk premium
|
|
24
|
+
- selected executor + operator coverage (optional)
|
|
25
|
+
- state machine status
|
|
26
|
+
|
|
27
|
+
### Task Template
|
|
28
|
+
|
|
29
|
+
Defines:
|
|
30
|
+
|
|
31
|
+
- required skills
|
|
32
|
+
- environment requirements (managed vs home)
|
|
33
|
+
- SLA expectations
|
|
34
|
+
- pricing inputs and guardrails
|
|
35
|
+
|
|
36
|
+
### Skill
|
|
37
|
+
|
|
38
|
+
Signed bundle:
|
|
39
|
+
|
|
40
|
+
- metadata (name, version, developer, description)
|
|
41
|
+
- required capabilities + safety constraints
|
|
42
|
+
- deterministic policy graph (BT/SM) and tests
|
|
43
|
+
- optional model artifacts
|
|
44
|
+
- certification tier
|
|
45
|
+
|
|
46
|
+
### Capability
|
|
47
|
+
|
|
48
|
+
Runtime-agnostic API surface (e.g., `ExecuteWorkflow`, `CallTool`, `CollectEvidence`, `ObserveROI`).
|
|
49
|
+
|
|
50
|
+
Executors advertise:
|
|
51
|
+
|
|
52
|
+
- mobility/manipulation properties
|
|
53
|
+
- allowed speed/force envelopes
|
|
54
|
+
- autonomy/teleop allowed flags
|
|
55
|
+
- sensor modes (privacy implications)
|
|
56
|
+
|
|
57
|
+
### Access Plan
|
|
58
|
+
|
|
59
|
+
Time-bounded, revocable credential set and instructions to access the space:
|
|
60
|
+
|
|
61
|
+
- credential scope + expiry
|
|
62
|
+
- revocation path
|
|
63
|
+
- entry/exit safe behaviors
|
|
64
|
+
|
|
65
|
+
### Incident / Claim
|
|
66
|
+
|
|
67
|
+
Incident: operationally detected anomaly or requester-reported issue.
|
|
68
|
+
|
|
69
|
+
Claim: workflow for remediation/payout:
|
|
70
|
+
|
|
71
|
+
- triage, classify, evidence bundle attach
|
|
72
|
+
- approve small payouts quickly, escalate large claims
|
|
73
|
+
- ledger adjustments (refunds, owner clawbacks, reserve draws)
|
|
74
|
+
|
|
75
|
+
### Ledger
|
|
76
|
+
|
|
77
|
+
Double-entry system of record for money movement:
|
|
78
|
+
|
|
79
|
+
- escrow/holds
|
|
80
|
+
- payout splits (owner, Settld fee, operator fee, developer royalty, reserve)
|
|
81
|
+
- refunds, chargebacks, tips
|
|
82
|
+
|
|
83
|
+
Invariant: every journal entry balances to zero.
|
|
84
|
+
|
|
85
|
+
## Trust scores (initially naive)
|
|
86
|
+
|
|
87
|
+
Used for dispatch, pricing, and environment gating:
|
|
88
|
+
|
|
89
|
+
- executor trust score
|
|
90
|
+
- owner trust score
|
|
91
|
+
- building trust score
|
|
92
|
+
- skill trust score / certification tier
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
# Event Envelope & Black Box Rules (v0.2)
|
|
2
|
+
|
|
3
|
+
Settld’s “black box” is an append-only, hash-chained event stream. The API rejects events that fail envelope, causality, or signer-policy validation.
|
|
4
|
+
|
|
5
|
+
## Envelope
|
|
6
|
+
|
|
7
|
+
Each stored event uses this shape:
|
|
8
|
+
|
|
9
|
+
- `v`: envelope version (currently `1`)
|
|
10
|
+
- `id`: event id (`evt_...`)
|
|
11
|
+
- `at`: ISO-8601 timestamp
|
|
12
|
+
- `streamId`: aggregate stream id (e.g. a job id)
|
|
13
|
+
- `type`: event type (e.g. `BOOKED`, `EN_ROUTE`)
|
|
14
|
+
- `actor`: `{ type, id }` (who initiated the action)
|
|
15
|
+
- `payload`: JSON payload (nullable)
|
|
16
|
+
- `payloadHash`: `sha256(canonical(eventPayload))`
|
|
17
|
+
- `prevChainHash`: previous event’s `chainHash` (or `null` for genesis)
|
|
18
|
+
- `chainHash`: `sha256(canonical(chainLink))`
|
|
19
|
+
- `signature`: base64 Ed25519 signature (nullable)
|
|
20
|
+
- `signerKeyId`: key id of the signer (nullable)
|
|
21
|
+
|
|
22
|
+
## Canonical hashing
|
|
23
|
+
|
|
24
|
+
Canonical JSON rules (implemented in `src/core/canonical-json.js`):
|
|
25
|
+
|
|
26
|
+
- Object keys are sorted deterministically.
|
|
27
|
+
- No `undefined`, non-finite numbers, or `-0`.
|
|
28
|
+
- Only JSON values (plain objects/arrays/strings/numbers/booleans/null).
|
|
29
|
+
|
|
30
|
+
Hashes:
|
|
31
|
+
|
|
32
|
+
- `payloadHash = sha256( canonicalJson({ v, id, at, streamId, type, actor, payload }) )`
|
|
33
|
+
- `chainHash = sha256( canonicalJson({ v, prevChainHash, payloadHash }) )`
|
|
34
|
+
|
|
35
|
+
Signatures:
|
|
36
|
+
|
|
37
|
+
- `signature = Ed25519.sign(payloadHash)`
|
|
38
|
+
- Verification uses the signer’s public key looked up by `signerKeyId`.
|
|
39
|
+
|
|
40
|
+
## Append-time acceptance rules
|
|
41
|
+
|
|
42
|
+
The server rejects an append if any of the following are true:
|
|
43
|
+
|
|
44
|
+
- The envelope is missing required fields for the append mode (draft vs finalized).
|
|
45
|
+
- `prevChainHash` does not match the current stream head (optimistic concurrency).
|
|
46
|
+
- The hash chain or signature verification fails.
|
|
47
|
+
- The event violates signature policy (who must sign what).
|
|
48
|
+
- The event would cause an illegal job state transition.
|
|
49
|
+
|
|
50
|
+
## Concurrency & idempotency
|
|
51
|
+
|
|
52
|
+
- **Optimistic concurrency**: draft events must include `x-proxy-expected-prev-chain-hash`, and the server returns `409` on mismatch.
|
|
53
|
+
- **Idempotency**: mutation endpoints accept `x-idempotency-key`; replays return the original response (and don’t append twice).
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
# FinancePackBundle.v1 Format (Finance-Grade)
|
|
2
|
+
|
|
3
|
+
This document defines the on-disk format for `FinancePackBundle.v1` and its strict-verification invariants.
|
|
4
|
+
|
|
5
|
+
## Directory Layout
|
|
6
|
+
|
|
7
|
+
```
|
|
8
|
+
settld.json
|
|
9
|
+
manifest.json
|
|
10
|
+
attestation/bundle_head_attestation.json
|
|
11
|
+
month/...
|
|
12
|
+
finance/...
|
|
13
|
+
verify/verification_report.json
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
Notes:
|
|
17
|
+
- `month/` is a full embedded `MonthProofBundle.v1` directory tree.
|
|
18
|
+
- `attestation/bundle_head_attestation.json` is a signed `BundleHeadAttestation.v1` committing to the FinancePack manifestHash and MonthProof anchor.
|
|
19
|
+
- `verify/verification_report.json` is a signed, machine-ingestible `VerificationReport.v1`.
|
|
20
|
+
|
|
21
|
+
## `manifest.json` (FinancePackBundleManifest.v1)
|
|
22
|
+
|
|
23
|
+
`manifest.json` includes:
|
|
24
|
+
- `files[]`: sha256 hashes for the **non-verify** bundle files
|
|
25
|
+
- `manifestHash`: sha256 over canonical JSON of the manifest object **excluding** `manifestHash`
|
|
26
|
+
|
|
27
|
+
### Hashing Contract (`hashing.schemaVersion = FinancePackBundleManifestHash.v1`)
|
|
28
|
+
|
|
29
|
+
- `fileOrder = path_asc`
|
|
30
|
+
- `excludes = ["verify/**"]` (all `verify/*` derived outputs are intentionally excluded)
|
|
31
|
+
|
|
32
|
+
Rationale: `VerificationReport.v1` needs to refer to `manifestHash`, so including `verify/*` in the manifest would create circular hashing.
|
|
33
|
+
|
|
34
|
+
## `verify/verification_report.json` (VerificationReport.v1)
|
|
35
|
+
|
|
36
|
+
`VerificationReport.v1` is canonical JSON with:
|
|
37
|
+
- `tool`: identifies the generator/verifier version for auditability
|
|
38
|
+
- `signer`: provenance for the report signer (including governance event ref when available)
|
|
39
|
+
- `subject.manifestHash`: must equal the bundle `manifestHash`
|
|
40
|
+
- `reportHash`: sha256 over canonical JSON of the report core (excluding signature fields)
|
|
41
|
+
- `signature`: Ed25519 signature over `reportHash`
|
|
42
|
+
|
|
43
|
+
Strict verification requires the report to be present **and signed**.
|
|
44
|
+
|
|
45
|
+
If the tool version cannot be determined, the report will include a warning code `TOOL_VERSION_UNKNOWN`.
|
|
46
|
+
|
|
47
|
+
## Strict Verification Invariants
|
|
48
|
+
|
|
49
|
+
In strict mode (`settld-verify --strict --finance-pack ...`):
|
|
50
|
+
- The embedded `MonthProofBundle.v1` must strictly verify.
|
|
51
|
+
- `attestation/bundle_head_attestation.json` must exist and have a valid signature.
|
|
52
|
+
- `verify/verification_report.json` must exist, have a valid `reportHash`, and have a valid signature.
|
|
53
|
+
- `VerificationReport.v1.subject.manifestHash` must match the computed bundle `manifestHash`.
|