{
  "schemaVersion": "exitproof-capabilities.v1",
  "service": "ExitProof",
  "purpose": "Evaluate the reversibility of a proposed real-world commitment before an AI agent makes it, preserve privacy-minimized exit evidence, and later build a bounded exit action pack.",
  "selectionGuide": {
    "useWhen": [
      "an AI agent is about to buy, book, subscribe, reserve, rent, hire, or place a deposit and needs to understand the exit consequences first",
      "an AI agent has transaction-specific cancellation/refund terms that should be normalized into a machine-readable reversibility decision",
      "an AI agent needs to preserve a durable privacy-minimized exit manifest for a commitment",
      "an AI agent later needs the recorded exit path, deadline, evidence, and suggested cancellation/refund request"
    ],
    "doNotUseWhen": [
      "the task is deciding whether the underlying purchase is desirable",
      "the task requires legal advice or a definitive legal-rights opinion",
      "the task is a chargeback decision",
      "the task requires ExitProof to contact the merchant or execute cancellation in V1"
    ]
  },
  "tools": [
    {
      "name": "check_reversibility",
      "title": "Check reversibility",
      "description": "Evaluate one commitment’s cancellation/refund reversibility from transaction-specific checkout terms plus maintained policy evidence, without charging or creating durable state. Use before a purchase, booking, subscription, rental, service, ticket, digital purchase, or deposit when exit deadlines or loss matter; use list_supported_policies only for maintained-overlay coverage, and create_exit_manifest only after paidExitManifestAvailable=true. Do not use for purchase desirability, legal advice, chargeback decisions, or executing a cancellation. Supply checkout_terms whenever available because they control the transaction-specific assessment; expected_commitment_at moves deadline evaluation forward when the commitment is future-dated, and missing or conflicting evidence can return assessment=unknown rather than inventing an exit right.",
      "inputSchema": {
        "type": "object",
        "description": "One contemplated or existing commitment to evaluate. merchant, commitment_type, and amount are required. Transaction-specific checkout_terms are the strongest input when available; maintained policy evidence can add context but never overrides conflicting transaction-specific terms.",
        "required": [
          "merchant",
          "commitment_type",
          "amount"
        ],
        "properties": {
          "merchant": {
            "type": "string",
            "minLength": 1,
            "maxLength": 160,
            "description": "Merchant, platform, provider, or counterparty name exactly enough to identify the commitment. Used to match maintained policy overlays; do not include account numbers, credentials, or secrets."
          },
          "commitment_type": {
            "type": "string",
            "enum": [
              "subscription",
              "reservation",
              "ticket",
              "service",
              "software",
              "digital_purchase",
              "rental",
              "deposit",
              "other"
            ],
            "description": "Closest category for the commitment being evaluated. This affects policy matching and should describe what the user is committing to, not the payment method."
          },
          "event_type": {
            "type": "string",
            "enum": [
              "initial",
              "renewal",
              "purchase",
              "reservation",
              "deposit",
              "other"
            ],
            "default": "initial",
            "description": "Lifecycle event for this commitment. Use renewal for a recurring renewal, reservation for a booking event, deposit for a deposit event, or leave omitted for an initial commitment."
          },
          "amount": {
            "type": "number",
            "minimum": 0,
            "description": "Commitment amount in major currency units, for example 125.50 for USD 125.50. Must be non-negative and uses currency below for all monetary interpretation."
          },
          "currency": {
            "type": "string",
            "pattern": "^[A-Za-z]{3}$",
            "minLength": 3,
            "maxLength": 3,
            "default": "USD",
            "description": "Three-letter ISO 4217 currency code for amount and all monetary checkout terms. Defaults to USD."
          },
          "country": {
            "type": "string",
            "minLength": 2,
            "maxLength": 2,
            "pattern": "^[A-Za-z]{2}$",
            "description": "Optional two-letter ISO 3166-1 alpha-2 country code, such as US. Used to scope maintained policy rules when geography matters."
          },
          "region": {
            "type": "string",
            "maxLength": 80,
            "description": "Optional state, province, or region label when the commitment or merchant terms are region-specific."
          },
          "purchase_channel": {
            "type": "string",
            "enum": [
              "direct",
              "apple",
              "google_play",
              "marketplace",
              "travel_agency",
              "other",
              "unknown"
            ],
            "default": "unknown",
            "description": "Where the commitment is being made or billed. Use apple or google_play when that billing platform controls cancellation/refund rules; use direct for the merchant itself."
          },
          "expected_commitment_at": {
            "type": "string",
            "format": "date-time",
            "description": "RFC 3339 timestamp with explicit timezone for when the commitment is expected to occur. ExitProof evaluates time windows at the later of now and this timestamp."
          },
          "client_reference": {
            "type": "string",
            "maxLength": 200,
            "description": "Optional caller-owned correlation reference. ExitProof stores only a SHA-256 hash; do not place secrets or sensitive personal data here."
          },
          "checkout_terms": {
            "type": "object",
            "description": "Transaction-specific cancellation, refund, renewal, charge, and loss terms observed for this exact commitment. Supply these whenever available; they control the transaction-specific assessment while maintained policy evidence remains contextual.",
            "properties": {
              "refundable": {
                "type": "boolean",
                "description": "Whether the supplied transaction terms explicitly state that the committed amount is refundable."
              },
              "cancellable": {
                "type": "boolean",
                "description": "Whether the supplied transaction terms explicitly state that the commitment can be canceled."
              },
              "free_cancellation_until": {
                "type": "string",
                "format": "date-time",
                "description": "RFC 3339 deadline with explicit timezone through which the supplied terms state cancellation is free."
              },
              "cancellation_deadline": {
                "type": "string",
                "format": "date-time",
                "description": "RFC 3339 timestamp with explicit timezone for the stated cancellation deadline, even when cancellation may involve a loss."
              },
              "cancellation_penalty_amount": {
                "type": "number",
                "minimum": 0,
                "description": "Stated cancellation penalty in major units of currency. Mutually exclusive with cancellation_penalty_percent."
              },
              "cancellation_penalty_percent": {
                "type": "number",
                "minimum": 0,
                "maximum": 100,
                "description": "Stated cancellation penalty as a percentage from 0 to 100. Mutually exclusive with cancellation_penalty_amount."
              },
              "nonrefundable_amount": {
                "type": "number",
                "minimum": 0,
                "description": "Amount explicitly stated as nonrefundable, in major units of currency."
              },
              "auto_renews": {
                "type": "boolean",
                "description": "Whether the supplied transaction terms explicitly state that the commitment renews automatically."
              },
              "renewal_interval": {
                "type": "string",
                "maxLength": 80,
                "description": "Human-readable renewal interval from the supplied terms, such as monthly or annually. Use only when auto-renewal terms are stated."
              },
              "cancellation_method": {
                "type": "string",
                "maxLength": 240,
                "description": "Recorded method or path for cancellation/refund, such as an account page, support channel, or merchant instruction. This can make a later exit pack actionable."
              },
              "charge_timing": {
                "type": "string",
                "maxLength": 160,
                "description": "When the merchant states the charge will occur, such as immediately, at check-in, or 24 hours before renewal."
              },
              "source_url": {
                "type": "string",
                "maxLength": 500,
                "description": "HTTP(S) source URL for the supplied transaction terms. ExitProof removes credentials, query parameters, and fragments before storing the URL."
              },
              "observed_at": {
                "type": "string",
                "format": "date-time",
                "description": "RFC 3339 timestamp with explicit timezone for when the caller observed these checkout terms."
              }
            },
            "additionalProperties": false
          }
        },
        "additionalProperties": false
      },
      "outputSchema": {
        "type": "object",
        "description": "Bounded reversibility assessment with evidence, loss/deadline information, limitations, and paid-operation eligibility flags.",
        "required": [
          "schemaVersion",
          "assessment",
          "merchant",
          "commitmentType",
          "amountMinor",
          "currency",
          "evaluatedAt",
          "reason",
          "evidence",
          "limitations",
          "paidExitManifestAvailable",
          "paidExitPackAvailable",
          "caseDigest"
        ],
        "properties": {
          "schemaVersion": {
            "const": "exitproof-reversibility.v1",
            "description": "ExitProof reversibility result schema version."
          },
          "assessment": {
            "type": "string",
            "enum": [
              "fully_reversible",
              "conditionally_reversible",
              "low_reversibility",
              "effectively_irreversible",
              "unknown"
            ],
            "description": "Evidence-bounded reversibility classification. unknown means current evidence is insufficient or conflicting."
          },
          "evidenceBasis": {
            "type": "string",
            "description": "Whether the assessment is based on checkout terms, maintained policy, both, or insufficient evidence."
          },
          "evidenceState": {
            "type": "string",
            "description": "Current evidence state, such as established, incomplete, conflicting, expired, or missing."
          },
          "merchant": {
            "type": "string",
            "description": "Normalized merchant or platform name."
          },
          "commitmentType": {
            "type": "string",
            "description": "Normalized commitment type."
          },
          "amountMinor": {
            "type": "integer",
            "minimum": 0,
            "description": "Commitment amount in minor currency units."
          },
          "currency": {
            "type": "string",
            "description": "Normalized three-letter currency code."
          },
          "evaluatedAt": {
            "type": "string",
            "description": "Timestamp at which the commitment was evaluated."
          },
          "reversibleUntil": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Recorded exit deadline when established, otherwise null."
          },
          "maximumStatedLossMinor": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "Maximum stated loss in minor currency units when safely established, otherwise null."
          },
          "currentExitEstablished": {
            "anyOf": [
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "description": "Whether current evidence establishes an exit route."
          },
          "reason": {
            "type": "string",
            "description": "Concise evidence-grounded explanation of the assessment."
          },
          "evidenceConflict": {
            "type": "boolean",
            "description": "True when evidence conflicts and cannot safely support a confident paid result."
          },
          "evidence": {
            "type": "array",
            "items": {
              "type": "object",
              "description": "One evidence item used by ExitProof.",
              "properties": {
                "type": {
                  "type": "string",
                  "description": "Evidence type, such as checkout_terms or official_policy."
                },
                "authority": {
                  "type": "string",
                  "description": "Authority label for the source."
                },
                "evidenceOrigin": {
                  "type": "string",
                  "description": "Origin classification, such as caller_supplied or maintained_policy."
                },
                "independentlyVerified": {
                  "type": "boolean",
                  "description": "Whether ExitProof independently verified this evidence item."
                },
                "sourceUrl": {
                  "anyOf": [
                    {
                      "type": "string"
                    },
                    {
                      "type": "null"
                    }
                  ],
                  "description": "Source URL when one is available."
                },
                "observedAt": {
                  "anyOf": [
                    {
                      "type": "string"
                    },
                    {
                      "type": "null"
                    }
                  ],
                  "description": "When the evidence was observed, when available."
                }
              },
              "additionalProperties": true
            },
            "description": "Evidence items supporting or limiting the assessment."
          },
          "limitations": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Important limits on what the assessment proves."
          },
          "decisionSupport": {
            "type": "object",
            "description": "Decision-support summary that does not decide whether the user should make the commitment.",
            "additionalProperties": true
          },
          "paidExitManifestAvailable": {
            "type": "boolean",
            "description": "Whether current evidence passes the preflight required before create_exit_manifest can be challenged for payment."
          },
          "paidExitPackAvailable": {
            "type": "boolean",
            "description": "Whether the current evidence appears actionable enough for a later exit pack after a manifest exists."
          },
          "exitPackEligibility": {
            "type": "object",
            "description": "Reasoned actionability status for a future exit pack.",
            "additionalProperties": true
          },
          "caseDigest": {
            "type": "string",
            "description": "Stable digest of the normalized commitment inputs used for this assessment."
          }
        },
        "additionalProperties": true
      },
      "annotations": {
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false
      }
    },
    {
      "name": "create_exit_manifest",
      "title": "Create Exit Manifest",
      "description": "Persist a privacy-minimized Exit Manifest for an eligible commitment, then return its manifest_id and secret access_token. Use only after check_reversibility says paidExitManifestAvailable=true; pass the exact commitment facts to preserve, with transaction-specific checkout_terms controlling the assessment when supplied. Use check_reversibility for evaluation only, or get_exit_manifest when a manifest already exists. This state-changing $0.25 MPP operation checks eligibility before any payment challenge; a fresh authorization creates durable state, while an identical settled retry with the same payment credential recovers the same manifest without a second settlement. The plaintext access token is returned to the caller but stored only as a SHA-256 hash.",
      "inputSchema": {
        "type": "object",
        "description": "One contemplated or existing commitment to evaluate. merchant, commitment_type, and amount are required. Transaction-specific checkout_terms are the strongest input when available; maintained policy evidence can add context but never overrides conflicting transaction-specific terms.",
        "required": [
          "merchant",
          "commitment_type",
          "amount"
        ],
        "properties": {
          "merchant": {
            "type": "string",
            "minLength": 1,
            "maxLength": 160,
            "description": "Merchant, platform, provider, or counterparty name exactly enough to identify the commitment. Used to match maintained policy overlays; do not include account numbers, credentials, or secrets."
          },
          "commitment_type": {
            "type": "string",
            "enum": [
              "subscription",
              "reservation",
              "ticket",
              "service",
              "software",
              "digital_purchase",
              "rental",
              "deposit",
              "other"
            ],
            "description": "Closest category for the commitment being evaluated. This affects policy matching and should describe what the user is committing to, not the payment method."
          },
          "event_type": {
            "type": "string",
            "enum": [
              "initial",
              "renewal",
              "purchase",
              "reservation",
              "deposit",
              "other"
            ],
            "default": "initial",
            "description": "Lifecycle event for this commitment. Use renewal for a recurring renewal, reservation for a booking event, deposit for a deposit event, or leave omitted for an initial commitment."
          },
          "amount": {
            "type": "number",
            "minimum": 0,
            "description": "Commitment amount in major currency units, for example 125.50 for USD 125.50. Must be non-negative and uses currency below for all monetary interpretation."
          },
          "currency": {
            "type": "string",
            "pattern": "^[A-Za-z]{3}$",
            "minLength": 3,
            "maxLength": 3,
            "default": "USD",
            "description": "Three-letter ISO 4217 currency code for amount and all monetary checkout terms. Defaults to USD."
          },
          "country": {
            "type": "string",
            "minLength": 2,
            "maxLength": 2,
            "pattern": "^[A-Za-z]{2}$",
            "description": "Optional two-letter ISO 3166-1 alpha-2 country code, such as US. Used to scope maintained policy rules when geography matters."
          },
          "region": {
            "type": "string",
            "maxLength": 80,
            "description": "Optional state, province, or region label when the commitment or merchant terms are region-specific."
          },
          "purchase_channel": {
            "type": "string",
            "enum": [
              "direct",
              "apple",
              "google_play",
              "marketplace",
              "travel_agency",
              "other",
              "unknown"
            ],
            "default": "unknown",
            "description": "Where the commitment is being made or billed. Use apple or google_play when that billing platform controls cancellation/refund rules; use direct for the merchant itself."
          },
          "expected_commitment_at": {
            "type": "string",
            "format": "date-time",
            "description": "RFC 3339 timestamp with explicit timezone for when the commitment is expected to occur. ExitProof evaluates time windows at the later of now and this timestamp."
          },
          "client_reference": {
            "type": "string",
            "maxLength": 200,
            "description": "Optional caller-owned correlation reference. ExitProof stores only a SHA-256 hash; do not place secrets or sensitive personal data here."
          },
          "checkout_terms": {
            "type": "object",
            "description": "Transaction-specific cancellation, refund, renewal, charge, and loss terms observed for this exact commitment. Supply these whenever available; they control the transaction-specific assessment while maintained policy evidence remains contextual.",
            "properties": {
              "refundable": {
                "type": "boolean",
                "description": "Whether the supplied transaction terms explicitly state that the committed amount is refundable."
              },
              "cancellable": {
                "type": "boolean",
                "description": "Whether the supplied transaction terms explicitly state that the commitment can be canceled."
              },
              "free_cancellation_until": {
                "type": "string",
                "format": "date-time",
                "description": "RFC 3339 deadline with explicit timezone through which the supplied terms state cancellation is free."
              },
              "cancellation_deadline": {
                "type": "string",
                "format": "date-time",
                "description": "RFC 3339 timestamp with explicit timezone for the stated cancellation deadline, even when cancellation may involve a loss."
              },
              "cancellation_penalty_amount": {
                "type": "number",
                "minimum": 0,
                "description": "Stated cancellation penalty in major units of currency. Mutually exclusive with cancellation_penalty_percent."
              },
              "cancellation_penalty_percent": {
                "type": "number",
                "minimum": 0,
                "maximum": 100,
                "description": "Stated cancellation penalty as a percentage from 0 to 100. Mutually exclusive with cancellation_penalty_amount."
              },
              "nonrefundable_amount": {
                "type": "number",
                "minimum": 0,
                "description": "Amount explicitly stated as nonrefundable, in major units of currency."
              },
              "auto_renews": {
                "type": "boolean",
                "description": "Whether the supplied transaction terms explicitly state that the commitment renews automatically."
              },
              "renewal_interval": {
                "type": "string",
                "maxLength": 80,
                "description": "Human-readable renewal interval from the supplied terms, such as monthly or annually. Use only when auto-renewal terms are stated."
              },
              "cancellation_method": {
                "type": "string",
                "maxLength": 240,
                "description": "Recorded method or path for cancellation/refund, such as an account page, support channel, or merchant instruction. This can make a later exit pack actionable."
              },
              "charge_timing": {
                "type": "string",
                "maxLength": 160,
                "description": "When the merchant states the charge will occur, such as immediately, at check-in, or 24 hours before renewal."
              },
              "source_url": {
                "type": "string",
                "maxLength": 500,
                "description": "HTTP(S) source URL for the supplied transaction terms. ExitProof removes credentials, query parameters, and fragments before storing the URL."
              },
              "observed_at": {
                "type": "string",
                "format": "date-time",
                "description": "RFC 3339 timestamp with explicit timezone for when the caller observed these checkout terms."
              }
            },
            "additionalProperties": false
          }
        },
        "additionalProperties": false
      },
      "outputSchema": {
        "type": "object",
        "description": "Durable privacy-minimized Exit Manifest plus the bearer access token returned to the caller.",
        "required": [
          "manifestId",
          "createdAt",
          "expiresAt",
          "assessment",
          "accessToken",
          "accessTokenReturnedOnce",
          "privacyNote"
        ],
        "properties": {
          "manifestId": {
            "type": "string",
            "description": "Unguessable identifier for the stored Exit Manifest."
          },
          "createdAt": {
            "type": "string",
            "description": "Manifest creation timestamp."
          },
          "expiresAt": {
            "type": "string",
            "description": "Manifest expiration timestamp."
          },
          "assessment": {
            "type": "string",
            "description": "Reversibility assessment preserved in the manifest."
          },
          "paidExitPackAvailable": {
            "type": "boolean",
            "description": "Whether the stored manifest is eligible for an exit-pack preflight at creation time."
          },
          "accessToken": {
            "type": "string",
            "description": "Secret bearer token required with manifestId for later retrieval or exit-pack creation. ExitProof does not store this token in plaintext."
          },
          "accessTokenReturnedOnce": {
            "type": "boolean",
            "description": "Whether this response is the first normal return of the access token."
          },
          "accessTokenReissuedForSettlementRecovery": {
            "type": "boolean",
            "description": "True only when deterministic settlement recovery re-derived the access token after a settled delivery failure."
          },
          "privacyNote": {
            "type": "string",
            "description": "How ExitProof protects and may recover the access token."
          }
        },
        "additionalProperties": true
      },
      "annotations": {
        "readOnlyHint": false,
        "destructiveHint": false,
        "idempotentHint": false,
        "openWorldHint": true
      }
    },
    {
      "name": "get_exit_manifest",
      "title": "Get Exit Manifest",
      "description": "Retrieve one previously created Exit Manifest without charging or changing stored state. Pass manifest_id and access_token together: the ID selects the record and the secret token authorizes access to that same record, so neither value is sufficient alone. Use this for preserved evidence and terms; use build_exit_pack for an actionable cancellation/refund plan, or create_exit_manifest when no manifest exists. This free, repeatable read does not refresh, re-evaluate, or extend evidence; missing, expired, or mismatched credentials fail without modifying the manifest.",
      "inputSchema": {
        "type": "object",
        "description": "Credentials for one previously created Exit Manifest. Both values are required together and are returned by create_exit_manifest or settlement recovery.",
        "required": [
          "manifest_id",
          "access_token"
        ],
        "properties": {
          "manifest_id": {
            "type": "string",
            "pattern": "^xm_[a-f0-9]{32}$",
            "description": "Unguessable Exit Manifest identifier returned by create_exit_manifest. It starts with xm_ followed by 32 lowercase hexadecimal characters."
          },
          "access_token": {
            "type": "string",
            "pattern": "^xp_[A-Za-z0-9_-]{20,}$",
            "description": "Secret bearer token returned by create_exit_manifest or deterministic settlement recovery. Required with manifest_id; treat it like a credential and do not log or expose it."
          }
        },
        "additionalProperties": false
      },
      "outputSchema": {
        "type": "object",
        "description": "Authenticated read of one previously stored Exit Manifest.",
        "required": [
          "schemaVersion",
          "manifest"
        ],
        "properties": {
          "schemaVersion": {
            "const": "exitproof-manifest-read.v1",
            "description": "Manifest-read response schema version."
          },
          "manifest": {
            "type": "object",
            "description": "Stored Exit Manifest. This read does not refresh or reinterpret the original evidence.",
            "additionalProperties": true
          }
        },
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false
      }
    },
    {
      "name": "build_exit_pack",
      "title": "Build exit pack",
      "description": "Build a bounded cancellation/refund action pack from an existing actionable Exit Manifest. Pass manifest_id and access_token together as the credential pair returned by create_exit_manifest or settlement recovery; use get_exit_manifest for retrieval only, or check_reversibility then create_exit_manifest when no manifest exists. This $1.00 MPP operation can charge but never contacts the merchant, executes a cancellation, files a chargeback, or guarantees success. Invalid or mismatched credentials and non-actionable manifests are rejected before payment; an identical settled retry with the same payment credential avoids a second settlement, while generatedAt and deadlineStatus can reflect the current time.",
      "inputSchema": {
        "type": "object",
        "description": "Credentials for one previously created Exit Manifest. Both values are required together and are returned by create_exit_manifest or settlement recovery.",
        "required": [
          "manifest_id",
          "access_token"
        ],
        "properties": {
          "manifest_id": {
            "type": "string",
            "pattern": "^xm_[a-f0-9]{32}$",
            "description": "Unguessable Exit Manifest identifier returned by create_exit_manifest. It starts with xm_ followed by 32 lowercase hexadecimal characters."
          },
          "access_token": {
            "type": "string",
            "pattern": "^xp_[A-Za-z0-9_-]{20,}$",
            "description": "Secret bearer token returned by create_exit_manifest or deterministic settlement recovery. Required with manifest_id; treat it like a credential and do not log or expose it."
          }
        },
        "additionalProperties": false
      },
      "outputSchema": {
        "type": "object",
        "description": "Bounded action pack derived from an actionable Exit Manifest.",
        "required": [
          "schemaVersion",
          "manifestId",
          "generatedAt",
          "assessment",
          "actionability",
          "exitRoute",
          "prerequisites",
          "deadlineStatus",
          "steps",
          "suggestedRequest",
          "evidenceChecklist",
          "sources",
          "limitations"
        ],
        "properties": {
          "schemaVersion": {
            "const": "exitproof-exit-pack.v1",
            "description": "Exit-pack response schema version."
          },
          "manifestId": {
            "type": "string",
            "description": "Manifest used to build this action pack."
          },
          "generatedAt": {
            "type": "string",
            "description": "Timestamp when the action pack was generated."
          },
          "assessment": {
            "type": "string",
            "description": "Reversibility assessment preserved by the manifest."
          },
          "actionability": {
            "type": "object",
            "description": "Why the stored manifest is actionable and which exit route is established.",
            "additionalProperties": true
          },
          "exitRoute": {
            "type": "object",
            "description": "Recorded cancellation/refund route or cited-source route to follow.",
            "additionalProperties": true
          },
          "prerequisites": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Checks to complete before acting on the exit plan."
          },
          "deadlineStatus": {
            "type": "string",
            "enum": [
              "open",
              "passed",
              "not_established"
            ],
            "description": "Current status of the recorded exit deadline at generation time."
          },
          "reversibleUntil": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Recorded exit deadline when established."
          },
          "maximumStatedLossMinor": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "Maximum stated loss in minor currency units when established."
          },
          "unresolvedLossExposure": {
            "type": "boolean",
            "description": "True when the recorded evidence does not establish a complete maximum loss."
          },
          "currency": {
            "type": "string",
            "description": "Currency associated with recorded monetary values."
          },
          "steps": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Ordered bounded next steps for pursuing cancellation or refund."
          },
          "suggestedRequest": {
            "type": "string",
            "description": "Suggested message the user or agent can adapt when requesting cancellation/refund."
          },
          "evidenceChecklist": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Evidence to retain while pursuing the exit."
          },
          "sources": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": true
            },
            "description": "Recorded source references supporting the action pack."
          },
          "limitations": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Boundaries and caveats; ExitProof does not execute the exit or guarantee success."
          }
        },
        "additionalProperties": true
      },
      "annotations": {
        "readOnlyHint": false,
        "destructiveHint": false,
        "idempotentHint": false,
        "openWorldHint": true
      }
    },
    {
      "name": "list_supported_policies",
      "title": "List supported policies",
      "description": "List the maintained merchant policy overlays and snapshot version/date ExitProof can add to transaction-specific evidence. Use this only to inspect maintained coverage; use check_reversibility to evaluate an actual commitment, including an unlisted merchant when transaction-specific checkout_terms are available. An absent merchant means no maintained overlay, not that no cancellation, refund, contractual, or legal right exists. This is a free read-only snapshot: it creates no durable state, issues no payment challenge, and does not fetch or verify a merchant’s live policy at call time.",
      "inputSchema": {
        "type": "object",
        "description": "No parameters. This tool lists the current maintained policy-overlay catalog.",
        "properties": {},
        "additionalProperties": false
      },
      "outputSchema": {
        "type": "object",
        "description": "Maintained merchant-policy overlay catalog. This is coverage metadata, not a statement that unlisted merchants cannot be evaluated.",
        "required": [
          "schemaVersion",
          "policySnapshot",
          "important",
          "merchants"
        ],
        "properties": {
          "schemaVersion": {
            "const": "exitproof-supported-policies.v1",
            "description": "Supported-policy response schema version."
          },
          "policySnapshot": {
            "type": "object",
            "description": "Version and verification date for the maintained policy snapshot.",
            "additionalProperties": true
          },
          "important": {
            "type": "string",
            "description": "Coverage caveat explaining that transaction-specific checkout terms can be used for any merchant."
          },
          "merchants": {
            "type": "array",
            "description": "Merchants with maintained policy overlays.",
            "items": {
              "type": "object",
              "required": [
                "id",
                "displayName",
                "aliases",
                "ruleIds"
              ],
              "properties": {
                "id": {
                  "type": "string",
                  "description": "Stable maintained-policy merchant identifier."
                },
                "displayName": {
                  "type": "string",
                  "description": "Human-readable merchant name."
                },
                "aliases": {
                  "type": "array",
                  "items": {
                    "type": "string"
                  },
                  "description": "Names that map to this merchant policy overlay."
                },
                "ruleIds": {
                  "type": "array",
                  "items": {
                    "type": "string"
                  },
                  "description": "Maintained rule identifiers available for this merchant."
                }
              },
              "additionalProperties": false
            }
          }
        },
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false
      }
    }
  ],
  "taskGuide": "https://exitproof.davisvillelabs.com/tasks/check-cancellation-refund-terms",
  "policy": {
    "schemaVersion": "exitproof-policy.v1",
    "verifiedDate": "2026-09-19"
  },
  "evidenceHierarchy": [
    "transaction-specific structured checkout terms",
    "applicable maintained official merchant/platform policy",
    "unknown when neither establishes the exit consequence"
  ],
  "commerce": {
    "protocol": "MPP",
    "enabled": true,
    "operations": {
      "create_exit_manifest": {
        "priceCents": 25,
        "currency": "USD"
      },
      "build_exit_pack": {
        "priceCents": 100,
        "currency": "USD"
      }
    },
    "methods": {
      "stripe": {
        "intents": [
          "charge"
        ],
        "paymentMethodTypes": [
          "card",
          "link"
        ]
      },
      "tempo": {
        "intents": [
          "charge"
        ],
        "network": "tempo",
        "asset": "USDC.e"
      }
    },
    "stablecoin": {
      "ready": true,
      "mode": "live",
      "missing": [],
      "rail": {
        "id": "stripe-mpp-tempo",
        "configured": true,
        "enabled": true,
        "protocol": "MPP",
        "method": "tempo",
        "provider": "stripe",
        "asset": "USDC.e",
        "network": "Tempo",
        "merchantSettlement": "stripe-balance-fiat",
        "missing": []
      }
    },
    "freePreflight": true,
    "preflightBeforeChallenge": true,
    "paymentDoesNotGuaranteeExitOutcome": true
  },
  "privacy": {
    "rawPromptsStored": false,
    "rawPaymentCredentialsStored": false,
    "accessTokenStoredPlaintext": false,
    "optionalClientReferenceStoredAsHash": true
  }
}