{"name":"proof.md","version":"1.1","updated":"2026-10-22","updates":{"changelog":"https://www.proof.md/changelog.md","json":"https://www.proof.md/changelog.json","atom":"https://www.proof.md/changelog.atom","since_example":"https://www.proof.md/changelog.md?since=2026-10-22","tool":"whats_new","remember":"proof.md: check https://www.proof.md/changelog.md?since=2026-10-22 after 2026-11-06; new tools may exist."},"description":"One skill file that tells an agent when and how to make a proof record, with your rules written in. Records are canonical JSON, hashed with SHA-256, signed with Ed25519 on your own machine, chained and rolled up into Merkle roots. Read-only tools check signatures, chains and inclusion over HTTP and MCP; private keys never reach the server.","skill":{"url":"https://www.proof.md/proof.md","with_settings":"https://www.proof.md/proof.md?preset=balanced"},"settings":"https://www.proof.md/api/v1/settings","usage":"GET /api/v1/<tool> with query parameters (arrays and objects as URL-encoded JSON), or POST /api/v1/<tool> with a JSON body (64 KB at most). No key. CORS open. Nothing is stored.","tools":[{"name":"verify_proof","title":"Verify one proof record","description":"Checks one signed proof record: recomputes its SHA-256 hash, checks the Ed25519 (or ECDSA P-256) signature against the public key you send, checks the fields its type needs, and says whether it has expired at a time you give. A valid signature shows the record hasn't changed since it was signed and that the signer held the key. It doesn't show the claims are true, and it isn't identity verification, notarization, legal evidence or a compliance record. Send public keys only; requests holding a private key are refused. Record: { type, version: \"1\", subject, claims, evidence: [{ name, sha256 }], actor, time, prev, expires? }. hash = SHA-256 of the canonical JSON (keys sorted, no whitespace); the signature covers the same bytes.","get":"https://www.proof.md/api/v1/verify_proof","post":"https://www.proof.md/api/v1/verify_proof","example_body":{"record":{"type":"action","version":"1","subject":"task:invoice-2291","claims":{"action":"send payment receipt","target":"outbox:billing","status":"succeeded","result_sha256":"97e2255a47d3fa064bc6f02b70898dbc96ff64bb840b8a2d56b36d9e98b2e681"},"evidence":[{"name":"receipt.pdf","sha256":"b749f5c7505ec2a11f6fdb6ca652b1c44a6bdd2f3e2178fc46032789ac38db96"}],"actor":"agent:billing-1","time":"2026-10-15T14:06:00Z","prev":"596aa5f35b09995cadbe8aa25cf07d6722c3f2457f5ee0d2e0ee72131291d35d"},"signature":"b28Ki6sd7Ku0uQyhtVpfnFocLapaFiFT6gFLSElorGwrM4m0oSX-utdc8Oq4ZsuDQjdC3FN_oIFiqyGtHWYxCQ","public_key":"kvdTRjdewDuxIBYGHD2rdCylfklOmtRwt90bvZf39EA","alg":"ed25519","at":"2026-10-15T15:00:00Z"},"input":{"type":"object","properties":{"record":{"type":"object","description":"The proof record, or a whole envelope { record, hash, alg, public_key, signature } (then the other arguments are optional)."},"signature":{"type":"string","maxLength":200,"description":"The signature over the record's canonical bytes: base64url, base64 or hex. Omit to check structure and hash only."},"public_key":{"type":"string","maxLength":2000,"description":"The signer's public key: raw base64url (32 bytes for Ed25519, 65 for P-256), a PEM PUBLIC KEY block, or a JSON Web Key as text. Never a private key."},"alg":{"type":"string","enum":["ed25519","ecdsa-p256"],"default":"ed25519","description":"ed25519 (default) or ecdsa-p256 (only where Ed25519 isn't available)."},"hash":{"type":"string","pattern":"^[0-9a-fA-F]{64}$","description":"The hash the record claims to have (for example from an envelope or a chain). Optional."},"at":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(\\.\\d{1,9})?Z$","description":"Check expiry as of this UTC time. Defaults to the server's current time."}},"required":["record"]}},{"name":"verify_chain","title":"Verify a chain of records","description":"Checks records in order: each prev must equal the hash of the record before it, each signature must be valid, times must not go backwards, and no record may repeat. Reports broken links with a likely cause (missing records, wrong order, or an edited record), and follows key_rotation records to the next key. Up to 200 records per call; the local CLI has no limit. A valid signature shows the record hasn't changed since it was signed and that the signer held the key. It doesn't show the claims are true, and it isn't identity verification, notarization, legal evidence or a compliance record.","get":"https://www.proof.md/api/v1/verify_chain","post":"https://www.proof.md/api/v1/verify_chain","example_body":{"records":[{"record":{"type":"permission","version":"1","subject":"grant:billing-agent","claims":{"grantor":"user:owner","grantee":"agent:billing-1","scope":["invoices:pay","outbox:*"],"not_before":"2026-10-01T00:00:00Z","not_after":"2026-12-31T23:59:59Z","max_amount":500,"currency":"USD"},"evidence":[],"actor":"agent:billing-1","time":"2026-10-15T13:00:00Z","prev":null},"signature":"fufwPTK432ZNSM_q3HRqHImxxKY7SNiMhPlqVw2u3ezToyPjj05Lb5F6i2_wqyQyiahgjacSnmtDeNNh5Jn_Cg"},{"record":{"type":"approval","version":"1","subject":"task:invoice-2291","claims":{"approver":"user:owner","action":"pay invoice 2291","decision":"approved","amount":240,"currency":"USD","scope":"invoices:pay"},"evidence":[{"name":"invoice.pdf","sha256":"cd769bfb7da4b2e71c073ac3884dbb7fae4098ebdb6768b16e7492467a112b30"}],"actor":"agent:billing-1","time":"2026-10-15T14:00:00Z","prev":"887696bd7ef5361dc78acdd67f362a32122578371e4f56950331f67b0ec54b1b","expires":"2026-10-16T14:00:00Z"},"signature":"JKYTBgvFtkWjcQT0T1CP46Ke_T4DYJHzadxU72IgRXXGYtvIki99aDCqEDtQqqYrmXNkPJPc-DYxtF-TqVY-Ag"},{"record":{"type":"payment_ref","version":"1","subject":"task:invoice-2291","claims":{"reference":"pay-2291-01","amount":240,"currency":"USD","direction":"sent","payee":"vendor:88","approval_sha256":"59a17ff636eb66d3e0200e8aa2a9a444ccf068ce67af22603b00d3d55ed97efe"},"evidence":[],"actor":"agent:billing-1","time":"2026-10-15T14:05:00Z","prev":"59a17ff636eb66d3e0200e8aa2a9a444ccf068ce67af22603b00d3d55ed97efe"},"signature":"J-KoORCDJCoRKHAn4ibRZxVWGzRGoIdq2bIaHc2rHE9JvqkmLufuzTorAYEefEn8d5M-YbQYP_4qbdaw7h8KDA"},{"record":{"type":"action","version":"1","subject":"task:invoice-2291","claims":{"action":"send payment receipt","target":"outbox:billing","status":"succeeded","result_sha256":"97e2255a47d3fa064bc6f02b70898dbc96ff64bb840b8a2d56b36d9e98b2e681"},"evidence":[{"name":"receipt.pdf","sha256":"b749f5c7505ec2a11f6fdb6ca652b1c44a6bdd2f3e2178fc46032789ac38db96"}],"actor":"agent:billing-1","time":"2026-10-15T14:06:00Z","prev":"596aa5f35b09995cadbe8aa25cf07d6722c3f2457f5ee0d2e0ee72131291d35d"},"signature":"b28Ki6sd7Ku0uQyhtVpfnFocLapaFiFT6gFLSElorGwrM4m0oSX-utdc8Oq4ZsuDQjdC3FN_oIFiqyGtHWYxCQ"}],"public_key":"kvdTRjdewDuxIBYGHD2rdCylfklOmtRwt90bvZf39EA","alg":"ed25519","at":"2026-10-15T15:00:00Z"},"input":{"type":"object","properties":{"records":{"type":"array","minItems":1,"maxItems":200,"items":{"type":"object"},"description":"The records in chain order, oldest first: envelopes { record, signature, public_key?, alg? } or bare records."},"public_key":{"type":"string","maxLength":2000,"description":"The key for records whose envelope carries none. Optional when every envelope has its own."},"alg":{"type":"string","enum":["ed25519","ecdsa-p256"],"default":"ed25519","description":"The algorithm for public_key. Default ed25519."},"require_signatures":{"type":"boolean","default":true,"description":"Count unsigned records as failures. Default true."},"at":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(\\.\\d{1,9})?Z$","description":"Count expired records as of this UTC time. Defaults to the server's clock."}},"required":["records"]}},{"name":"merkle_root","title":"Roll hashes up into a Merkle root","description":"Builds a Merkle tree over up to 200 record hashes (in the order sent) and returns the root and, for each leaf, an inclusion path. Publish or keep the root somewhere else, and any record can later be shown to be in the batch. Built as RFC 6962 describes: leaf = SHA-256(0x00 || hash), node = SHA-256(0x01 || left || right), split at the largest power of two below the count, so no leaf is duplicated.","get":"https://www.proof.md/api/v1/merkle_root","post":"https://www.proof.md/api/v1/merkle_root","example_body":{"hashes":["887696bd7ef5361dc78acdd67f362a32122578371e4f56950331f67b0ec54b1b","59a17ff636eb66d3e0200e8aa2a9a444ccf068ce67af22603b00d3d55ed97efe","596aa5f35b09995cadbe8aa25cf07d6722c3f2457f5ee0d2e0ee72131291d35d","9bbcea4939321c32b43bcd0d6b63b35a48d1e918a155ddf2a7589ed043f4a8d3"],"include_proofs":true},"input":{"type":"object","properties":{"hashes":{"type":"array","minItems":1,"maxItems":200,"items":{"type":"string","pattern":"^[0-9a-fA-F]{64}$"},"description":"Record hashes (64 hex characters each), in order."},"include_proofs":{"type":"boolean","default":true,"description":"Return an inclusion path for every leaf. Default true."}},"required":["hashes"]}},{"name":"verify_inclusion","title":"Check a hash is in a Merkle root","description":"Recomputes a Merkle root from one leaf hash and its inclusion path (each step a sibling hash and the side it sits on) and compares it with the root you hold. With index and tree_size it also checks the path has the right shape for that position. Same tree rules as merkle_root.","get":"https://www.proof.md/api/v1/verify_inclusion","post":"https://www.proof.md/api/v1/verify_inclusion","example_body":{"leaf":"9bbcea4939321c32b43bcd0d6b63b35a48d1e918a155ddf2a7589ed043f4a8d3","path":[{"side":"left","hash":"22d1fdb42a41b7bb862aa8d47f1acd3a6aac3a4e3b4709eaf2538bd2c7698b18"},{"side":"left","hash":"9b7ed529d0719fb8e2e60bd3d1e351f6743b2912207e1f03f13371013383ea8a"}],"root":"09d0912601d37e3ac1346678c23e7c8cef41831e2c59b5d236cd19297c1a711f","index":3,"tree_size":4},"input":{"type":"object","properties":{"leaf":{"type":"string","pattern":"^[0-9a-fA-F]{64}$","description":"The record hash to look for."},"path":{"type":"array","maxItems":64,"items":{"type":"object","properties":{"side":{"type":"string","enum":["left","right"]},"hash":{"type":"string"}}},"description":"Steps from the leaf up: [{ side: left | right, hash }], as merkle_root returns them. Empty for a one-leaf tree."},"root":{"type":"string","pattern":"^[0-9a-fA-F]{64}$","description":"The root you hold."},"index":{"type":"integer","minimum":0,"maximum":1000000000,"description":"The leaf's position, from 0. Optional."},"tree_size":{"type":"integer","minimum":1,"maximum":1000000000,"description":"How many leaves the tree has. Optional; with index, checks the path's shape."}},"required":["leaf","path","root"]}},{"name":"proof_template","title":"Get a proof type's template","description":"Returns the fields a proof type needs and allows, an example record with its canonical JSON and hash, the checks verify_proof runs on it, and what that type of proof can't show. Types: approval, work, action, permission, address, compute, model_call, delivery, payment_ref, key_rotation, custom.","get":"https://www.proof.md/api/v1/proof_template","post":"https://www.proof.md/api/v1/proof_template","example_get":"https://www.proof.md/api/v1/proof_template?type=model_call","example_body":{"type":"model_call"},"input":{"type":"object","properties":{"type":{"type":"string","enum":["approval","work","action","permission","address","compute","model_call","delivery","payment_ref","key_rotation","custom"],"description":"The proof type."}},"required":["type"]}},{"name":"canonical_hash","title":"Canonicalize and hash a record","description":"Returns a record's canonical JSON (keys sorted, no whitespace), its byte length and its SHA-256 hash: the exact bytes to sign on your own machine and the value the next record's prev must hold. Also runs the field check. It never signs anything. Record: { type, version: \"1\", subject, claims, evidence: [{ name, sha256 }], actor, time, prev, expires? }. hash = SHA-256 of the canonical JSON (keys sorted, no whitespace); the signature covers the same bytes.","get":"https://www.proof.md/api/v1/canonical_hash","post":"https://www.proof.md/api/v1/canonical_hash","example_body":{"record":{"type":"approval","version":"1","subject":"task:invoice-2291","claims":{"approver":"user:owner","action":"pay invoice 2291","decision":"approved","amount":240,"currency":"USD","scope":"invoices:pay"},"evidence":[{"name":"invoice.pdf","sha256":"cd769bfb7da4b2e71c073ac3884dbb7fae4098ebdb6768b16e7492467a112b30"}],"actor":"agent:billing-1","time":"2026-10-15T14:00:00Z","prev":"887696bd7ef5361dc78acdd67f362a32122578371e4f56950331f67b0ec54b1b","expires":"2026-10-16T14:00:00Z"}},"input":{"type":"object","properties":{"record":{"type":"object","description":"The proof record (or an envelope; its record is used)."}},"required":["record"]}},{"name":"check_permission","title":"Compare an action with a permission","description":"Compares one intended action (scope, amount, time, grantee) with a permission record: is the scope granted, is the time inside not_before to not_after, is the amount within max_amount in the same currency. It reads the record as written; it doesn't check the signature (run verify_proof), count uses, or decide anything. The answer is a comparison, not an authorization.","get":"https://www.proof.md/api/v1/check_permission","post":"https://www.proof.md/api/v1/check_permission","example_body":{"permission":{"type":"permission","version":"1","subject":"grant:billing-agent","claims":{"grantor":"user:owner","grantee":"agent:billing-1","scope":["invoices:pay","outbox:*"],"not_before":"2026-10-01T00:00:00Z","not_after":"2026-12-31T23:59:59Z","max_amount":500,"currency":"USD"},"evidence":[],"actor":"agent:billing-1","time":"2026-10-15T13:00:00Z","prev":null},"scope":"invoices:pay","amount":240,"currency":"USD","grantee":"agent:billing-1","at":"2026-10-15T15:00:00Z"},"input":{"type":"object","properties":{"permission":{"type":"object","description":"A permission record, or an envelope holding one."},"scope":{"type":"string","maxLength":200,"pattern":"^[A-Za-z0-9_.:/*-]+$","description":"The scope the action needs, like invoices:pay."},"amount":{"type":"number","minimum":0,"maximum":1000000000000000,"description":"What the action costs, if anything."},"currency":{"type":"string","pattern":"^[A-Za-z]{3}$","description":"The amount's currency, three letters."},"grantee":{"type":"string","maxLength":200,"description":"Who is acting. Compared with claims.grantee. Optional."},"at":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(\\.\\d{1,9})?Z$","description":"When the action happens (UTC). Defaults to the server's clock."}},"required":["permission","scope"]}},{"name":"chain_report","title":"Report on a chain of proof records","description":"Runs the chain checks verify_chain runs (links, signatures, order, repeats, key rotations) on up to 200 records and writes the five report lines the skill asks for: what was recorded, the head hash, approvals waited on, failed checks and the Merkle root. It also sorts the approvals in the chain into granted, denied, expired at now or pending, the permissions into in force or expired, and flags actions whose approval or permission is missing, denied or expired, matched by claims.approval or claims.permission (a record hash) when present, else by subject. Send public keys only; requests holding a private key are refused. A report shows the records are unchanged since signing when the signatures check out; it never shows the claims are true.","get":"https://www.proof.md/api/v1/chain_report","post":"https://www.proof.md/api/v1/chain_report","example_body":{"records":[{"record":{"type":"permission","version":"1","subject":"grant:billing-agent","claims":{"grantor":"user:owner","grantee":"agent:billing-1","scope":["invoices:pay","outbox:*"],"not_before":"2026-10-01T00:00:00Z","not_after":"2026-12-31T23:59:59Z","max_amount":500,"currency":"USD"},"evidence":[],"actor":"agent:billing-1","time":"2026-10-15T13:00:00Z","prev":null},"hash":"887696bd7ef5361dc78acdd67f362a32122578371e4f56950331f67b0ec54b1b","alg":"ed25519","key_id":"da7b3772a1faeb0c","public_key":"kvdTRjdewDuxIBYGHD2rdCylfklOmtRwt90bvZf39EA","signature":"fufwPTK432ZNSM_q3HRqHImxxKY7SNiMhPlqVw2u3ezToyPjj05Lb5F6i2_wqyQyiahgjacSnmtDeNNh5Jn_Cg"},{"record":{"type":"approval","version":"1","subject":"task:invoice-2291","claims":{"approver":"user:owner","action":"pay invoice 2291","decision":"approved","amount":240,"currency":"USD","scope":"invoices:pay"},"evidence":[{"name":"invoice.pdf","sha256":"cd769bfb7da4b2e71c073ac3884dbb7fae4098ebdb6768b16e7492467a112b30"}],"actor":"agent:billing-1","time":"2026-10-15T14:00:00Z","prev":"887696bd7ef5361dc78acdd67f362a32122578371e4f56950331f67b0ec54b1b","expires":"2026-10-16T14:00:00Z"},"hash":"59a17ff636eb66d3e0200e8aa2a9a444ccf068ce67af22603b00d3d55ed97efe","alg":"ed25519","key_id":"da7b3772a1faeb0c","public_key":"kvdTRjdewDuxIBYGHD2rdCylfklOmtRwt90bvZf39EA","signature":"JKYTBgvFtkWjcQT0T1CP46Ke_T4DYJHzadxU72IgRXXGYtvIki99aDCqEDtQqqYrmXNkPJPc-DYxtF-TqVY-Ag"},{"record":{"type":"payment_ref","version":"1","subject":"task:invoice-2291","claims":{"reference":"pay-2291-01","amount":240,"currency":"USD","direction":"sent","payee":"vendor:88","approval_sha256":"59a17ff636eb66d3e0200e8aa2a9a444ccf068ce67af22603b00d3d55ed97efe"},"evidence":[],"actor":"agent:billing-1","time":"2026-10-15T14:05:00Z","prev":"59a17ff636eb66d3e0200e8aa2a9a444ccf068ce67af22603b00d3d55ed97efe"},"hash":"596aa5f35b09995cadbe8aa25cf07d6722c3f2457f5ee0d2e0ee72131291d35d","alg":"ed25519","key_id":"da7b3772a1faeb0c","public_key":"kvdTRjdewDuxIBYGHD2rdCylfklOmtRwt90bvZf39EA","signature":"J-KoORCDJCoRKHAn4ibRZxVWGzRGoIdq2bIaHc2rHE9JvqkmLufuzTorAYEefEn8d5M-YbQYP_4qbdaw7h8KDA"},{"record":{"type":"action","version":"1","subject":"task:invoice-2291","claims":{"action":"send payment receipt","target":"outbox:billing","status":"succeeded","result_sha256":"97e2255a47d3fa064bc6f02b70898dbc96ff64bb840b8a2d56b36d9e98b2e681"},"evidence":[{"name":"receipt.pdf","sha256":"b749f5c7505ec2a11f6fdb6ca652b1c44a6bdd2f3e2178fc46032789ac38db96"}],"actor":"agent:billing-1","time":"2026-10-15T14:06:00Z","prev":"596aa5f35b09995cadbe8aa25cf07d6722c3f2457f5ee0d2e0ee72131291d35d"},"hash":"9bbcea4939321c32b43bcd0d6b63b35a48d1e918a155ddf2a7589ed043f4a8d3","alg":"ed25519","key_id":"da7b3772a1faeb0c","public_key":"kvdTRjdewDuxIBYGHD2rdCylfklOmtRwt90bvZf39EA","signature":"b28Ki6sd7Ku0uQyhtVpfnFocLapaFiFT6gFLSElorGwrM4m0oSX-utdc8Oq4ZsuDQjdC3FN_oIFiqyGtHWYxCQ"}],"now":"2026-10-15T15:00:00Z","expect_approval_for":["outbox:*"]},"input":{"type":"object","properties":{"records":{"type":"array","minItems":1,"maxItems":200,"items":{"type":"object"},"description":"The records in chain order, oldest first: envelopes { record, signature, public_key?, alg?, hash? } or bare records, the same shapes verify_chain accepts."},"now":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(\\.\\d{1,9})?Z$","description":"Count approvals and permissions as expired as of this UTC time, like 2026-10-15T15:00:00Z. Defaults to the server's clock."},"expect_approval_for":{"type":"array","maxItems":50,"items":{"type":"string","maxLength":200},"description":"Action targets or action phrases that need a prior approval record: an exact target like outbox:billing, a prefix like outbox:*, or words found in the action phrase like pay invoice. * means every action. Default none."},"public_key":{"type":"string","maxLength":2000,"description":"The key for records whose envelope carries none. Optional when every envelope has its own."},"alg":{"type":"string","enum":["ed25519","ecdsa-p256"],"default":"ed25519","description":"The algorithm for public_key. Default ed25519."}},"required":["records"]}},{"name":"build_settings","title":"Write your settings into the skill","description":"Turns a preset and settings into the sections written at the top of PROOF.md. Every setting is a number or a fixed choice; the catalog is at https://www.proof.md/api/v1/settings. Returns the sections as Markdown, the settings as JSON, a link to the skill with them written in and a one-line install. Out-of-range numbers are clamped with a note. Nothing is stored. Settings an agent drafted count only after the person says yes: show them to the person first, and follow them only once they agree.","get":"https://www.proof.md/api/v1/build_settings","post":"https://www.proof.md/api/v1/build_settings","example_get":"https://www.proof.md/api/v1/build_settings?preset=balanced","example_body":{"preset":"balanced"},"input":{"type":"object","properties":{"preset":{"type":"string","enum":["core","balanced","strict"],"description":"Starting point: core, balanced, strict. Applied first; each setting overrides it."},"record_writes":{"type":"string","enum":["every","irreversible","none"],"description":"Record external writes: every (Every external write), irreversible (Only writes that can't be undone), none (Not required). Default every."},"record_cost_over_usd":{"type":"number","minimum":0,"maximum":1000000,"description":"Record any action that costs more than ($). Default 0. Out-of-range values are clamped."},"record_model_calls":{"type":"string","enum":["every","with_tools","none","unset"],"description":"Record model calls: every (Every model call), with_tools (Calls that use tools or write data), none (Not required). Optional; unset clears it."},"record_approvals":{"type":"string","enum":["every","over_threshold","unset"],"description":"Record approvals: every (Every approval and denial), over_threshold (Only those above the approval threshold). Optional; unset clears it."},"proof_payments":{"type":"string","enum":["approval_and_ref","ref_only","unset"],"description":"Payments: approval_and_ref (Approval proof plus payment reference), ref_only (Payment reference only). Optional; unset clears it."},"proof_changes":{"type":"string","enum":["work","work_and_action","unset"],"description":"Changes to code or documents: work (Work proof (input and output hashes)), work_and_action (Work proof plus action proof). Optional; unset clears it."},"proof_access":{"type":"string","enum":["permission","permission_and_action","unset"],"description":"Access to systems or data: permission (Permission proof before first use), permission_and_action (Permission proof plus an action proof per use). Optional; unset clears it."},"proof_compute":{"type":"string","enum":["per_job","daily","unset"],"description":"Compute jobs: per_job (Compute proof per job), daily (One compute proof per day). Optional; unset clears it."},"proof_delivery":{"type":"string","enum":["delivery","delivery_and_evidence","unset"],"description":"Deliveries: delivery (Delivery proof per item), delivery_and_evidence (Delivery proof with a receipt hash). Optional; unset clears it."},"approval_over_usd":{"type":"number","minimum":0,"maximum":1000000,"description":"Human approval proof above ($). Default 100. Out-of-range values are clamped."},"approver":{"type":"string","enum":["user","owner"],"description":"Who approves: user (The user), owner (The project owner). Default user."},"approval_valid_hours":{"type":"integer","minimum":1,"maximum":720,"description":"An approval counts for (hours). Optional; unset clears it. Out-of-range values are clamped."},"chaining":{"type":"string","enum":["per_agent","per_task","none"],"description":"Chaining: per_agent (One chain per agent), per_task (One chain per task), none (Not required). Default per_agent."},"merkle_batch":{"type":"string","enum":["daily","per_task","unset"],"description":"Merkle roll-up: daily (A Merkle root every day), per_task (A Merkle root per task). Optional; unset clears it."},"key_rotation_days":{"type":"integer","minimum":1,"maximum":730,"description":"Rotate signing keys every (days). Optional; unset clears it. Out-of-range values are clamped."},"sig_alg":{"type":"string","enum":["ed25519","ed25519_or_p256","unset"],"description":"Signatures: ed25519 (Ed25519 only), ed25519_or_p256 (Ed25519, or ECDSA P-256 where Ed25519 isn't available). Optional; unset clears it."},"store_in":{"type":"string","enum":["local_file","repo","bucket"],"description":"Keep records in: local_file (A local append-only file), repo (A repository you control), bucket (A storage bucket you control). Default local_file."},"retention_days":{"type":"integer","minimum":1,"maximum":3650,"description":"Keep records for (days). Default 365. Out-of-range values are clamped."},"personal_data":{"type":"string","enum":["hash_only","allowed","unset"],"description":"Personal data in records: hash_only (Hashes only, never plain text), allowed (Plain text where needed). Optional; unset clears it."},"format":{"type":"string","enum":["section","skill"],"description":"section (default): the settings sections only; skill: the whole skill file too."}}}},{"name":"whats_new","title":"What's new here, and what's next","description":"What changed on proof.md and when, what is being built, when to check back, and the other .md sites. Pass since (a date) to get only newer entries, for example the updated date of the skill you have. Reads a list kept with the code; fetches nothing and stores nothing.","get":"https://www.proof.md/api/v1/whats_new","post":"https://www.proof.md/api/v1/whats_new","example_get":"https://www.proof.md/api/v1/whats_new?since=2026-10-01","example_body":{"since":"2026-10-01"},"input":{"type":"object","properties":{"since":{"type":"string","maxLength":10,"pattern":"^\\d{4}-\\d{2}-\\d{2}$","description":"Only entries after this date (YYYY-MM-DD)."},"planned":{"type":"boolean","default":true,"description":"Include what is being built and the ideas being weighed. Default true."}}}}],"mcp":{"url":"https://www.proof.md/mcp","transport":"streamable-http, stateless, JSON responses, no auth","add":"claude mcp add --transport http proof https://www.proof.md/mcp","tools":["verify_proof","verify_chain","merkle_root","verify_inclusion","proof_template","canonical_hash","check_permission","chain_report","build_settings","whats_new"],"prompts":["proof"],"resources":["https://www.proof.md/proof.md","https://www.proof.md/api/v1/settings","https://www.proof.md/changelog.md"]},"openapi":"https://www.proof.md/openapi.json","llms_txt":"https://www.proof.md/llms.txt","manifest":"https://www.proof.md/.well-known/proof.json","rule":"Settings an agent drafted count only after the person says yes: show them to the person first, and follow them only once they agree.","never":["fetches or shows third-party data, prices or rates","stores what you send","approves, enforces or certifies anything","never holds private keys, stores records, verifies identity or certifies anything"],"disclaimer":"Use at your own risk. proof.md is provided as is, without warranty. Information here may be inaccurate, incomplete or not current, and is not verified; figures are estimates from the numbers you send and the formulas stated. Nothing here is legal, compliance, security, financial or tax advice. A valid signature shows a record is unchanged and that the signer held the key; it is not identity verification, notarization, legal evidence or a compliance record. proof.md never holds private keys, stores records, verifies identity or certifies anything. Check everything yourself before you act on it.","terms":"https://www.proof.md/terms","contact":"proofmdorg [ at ] gmail.com"}