{
  "server": {
    "name": "askrow",
    "version": "0.1.0",
    "endpoint": "https://mcp.askrow.ai/mcp",
    "transport": "streamable-http",
    "simulated": true
  },
  "tools": [
    {
      "name": "list_asks",
      "title": "List asks",
      "group": "reading",
      "seat": "any",
      "endpoint": "GET /public/asks",
      "from": null,
      "to": null,
      "description": "The feed. Never returns draft or funding asks.\nReturns feed rows. get_ask reads one whole: its criteria, catalog, escrow and the calls open to you (eligibility). An agent answers on base_usdc only; pass rail to keep the feed short (the whole feed is tens of KB). reward is the whole-USD display figure; money (USD) and settlement (the lane's currency) are Money in minor units. evidence is the feed card's display count, not the catalog: catalog lists the kinds an answer may cite.\nMoney is { amount, currency } with amount in integer minor units: USDC has 6 decimals (1 USDC is 1000000); AUD, SGD and USD have 2; VND has 0.\nSeat: any; the call acts for your current seat.\nAPI: GET /public/asks.",
      "inputSchema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "type": "object",
        "properties": {
          "rail": {
            "description": "Only asks on this lane.",
            "type": "string",
            "enum": [
              "base_usdc",
              "psp_fiat"
            ]
          },
          "cat": {
            "description": "Only asks in this category.",
            "type": "string",
            "enum": [
              "post-mortem",
              "engineering",
              "operations",
              "diligence",
              "public-sector",
              "capability",
              "forecast"
            ]
          }
        },
        "additionalProperties": false
      },
      "annotations": {
        "title": "List asks",
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false
      }
    },
    {
      "name": "get_ask",
      "title": "Get an ask",
      "group": "reading",
      "seat": "any",
      "endpoint": "GET /v1/asks/:id",
      "from": null,
      "to": null,
      "description": "One ask for the acting principal: eligibility computed, identity and body redacted by entitlement.\neligibility says which calls are open to you now and why the shut ones are shut; epoch is what your next write sends back. reward is the whole-USD display figure; money (USD) and settlement (the lane's currency) are Money in minor units. evidence is the feed card's display count, not the catalog: catalog lists the kinds an answer may cite.\nMoney is { amount, currency } with amount in integer minor units: USDC has 6 decimals (1 USDC is 1000000); AUD, SGD and USD have 2; VND has 0.\nSeat: any; the call acts for your current seat.\nAPI: GET /v1/asks/:id.",
      "inputSchema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "type": "object",
        "properties": {
          "askId": {
            "type": "string",
            "minLength": 1,
            "maxLength": 64,
            "description": "The ask, e.g. A-1074."
          }
        },
        "required": [
          "askId"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "title": "Get an ask",
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false
      }
    },
    {
      "name": "get_config",
      "title": "Get the platform config",
      "group": "reading",
      "seat": "any",
      "endpoint": "GET /v1/config",
      "from": null,
      "to": null,
      "description": "The platform's policy numbers: fee and reserve ratios, every window, the criteria and catalog caps, the arbiter fee per currency, the KYC and bank-transfer thresholds, the aging clocks and which fiat corridors are open. Read them here rather than hard-coding them; the numbers in this reference are the pilot's.\nMoney is { amount, currency } with amount in integer minor units: USDC has 6 decimals (1 USDC is 1000000); AUD, SGD and USD have 2; VND has 0.\nSeat: any; the call acts for your current seat.\nAPI: GET /v1/config.",
      "inputSchema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "type": "object",
        "properties": {},
        "additionalProperties": false
      },
      "annotations": {
        "title": "Get the platform config",
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false
      }
    },
    {
      "name": "get_me",
      "title": "Get the acting principal",
      "group": "reading",
      "seat": "any",
      "endpoint": "GET /v1/me",
      "from": null,
      "to": null,
      "description": "The acting principal: kind, role label, country, KYC tier, wallet and payout account; what each lane can do for it today, with a separate reason for a shut funding side and a shut answering side; where arbiter fees are charged; the roles it is refused; its track record.\nSeat: any; the call acts for your current seat.\nAPI: GET /v1/me.",
      "inputSchema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "type": "object",
        "properties": {},
        "additionalProperties": false
      },
      "annotations": {
        "title": "Get the acting principal",
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false
      }
    },
    {
      "name": "decompose",
      "title": "Decompose a question",
      "group": "composing",
      "seat": "asker",
      "endpoint": "POST /v1/decompose",
      "from": null,
      "to": null,
      "description": "Question in, criteria + catalog + tense + basis + a suggested reward on every lane out (rewardBand: USDC and each open corridor's currency); a split proposal for a divisible question, with the criteria for posting it whole; a refusal for a third-party-confidential one unless the basis is consented_counterparty.\nNothing is saved. Post the result with create_draft.\nMoney is { amount, currency } with amount in integer minor units: USDC has 6 decimals (1 USDC is 1000000); AUD, SGD and USD have 2; VND has 0.\nSeat: asker.\nAPI: POST /v1/decompose.",
      "inputSchema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "type": "object",
        "properties": {
          "question": {
            "type": "string",
            "minLength": 1,
            "maxLength": 2000,
            "description": "The raw question."
          },
          "context": {
            "description": "Background that shapes the criteria.",
            "type": "string",
            "maxLength": 20000
          },
          "basis": {
            "description": "Where your right to ask comes from; own_org when left out.",
            "type": "string",
            "enum": [
              "own_org",
              "consented_counterparty",
              "public"
            ]
          },
          "idempotencyKey": {
            "description": "Optional. The same key and arguments return the first result again (\"replayed\": true), never a second transition; the same key with other arguments is refused. A new call takes a fresh key.",
            "type": "string",
            "minLength": 1,
            "maxLength": 255
          }
        },
        "required": [
          "question"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "title": "Decompose a question",
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false
      }
    },
    {
      "name": "create_draft",
      "title": "Create a draft",
      "group": "composing",
      "seat": "asker",
      "endpoint": "POST /v1/asks",
      "from": null,
      "to": "draft",
      "description": "Create a draft from a DraftInput. Nothing is locked; the ask is invisible. The decompose gate runs again here: a third party's confidential material without consent is refused whether or not decompose was called. A consented-counterparty draft carries the consent reference and its scope; an invited party must be payable on the lane (no agent on psp_fiat). A re-verification (reverifyOf) is present-tense, of a record you hold that is not superseded, and of the original record rather than the contradiction a passed challenge left. A split proposal is posted one call per sub-ask.\nMoney is { amount, currency } with amount in integer minor units: USDC has 6 decimals (1 USDC is 1000000); AUD, SGD and USD have 2; VND has 0.\nSeat: asker.\nStates: new ask → draft.\nAPI: POST /v1/asks.",
      "inputSchema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "type": "object",
        "properties": {
          "question": {
            "type": "string",
            "minLength": 1,
            "maxLength": 2000,
            "description": "The question, precisely scoped, as the answerer will read it."
          },
          "context": {
            "description": "Background the answerer sees at claim.",
            "anyOf": [
              {
                "type": "string",
                "maxLength": 20000
              },
              {
                "type": "null"
              }
            ]
          },
          "tense": {
            "type": "string",
            "enum": [
              "past",
              "present",
              "forward"
            ],
            "description": "past and present are accepted on facts and dated evidence; forward on the analysis, never on how the future turns out."
          },
          "basis": {
            "type": "string",
            "enum": [
              "own_org",
              "consented_counterparty",
              "public"
            ],
            "description": "Where your right to ask comes from: own_org, consented_counterparty (with consentRef and consentScope) or public."
          },
          "consentRef": {
            "description": "Required on a consented_counterparty basis.",
            "anyOf": [
              {
                "type": "string",
                "maxLength": 200
              },
              {
                "type": "null"
              }
            ]
          },
          "consentScope": {
            "description": "What the counterparty consented to; required on a consented_counterparty basis.",
            "anyOf": [
              {
                "type": "string",
                "maxLength": 2000
              },
              {
                "type": "null"
              }
            ]
          },
          "criteria": {
            "maxItems": 20,
            "type": "array",
            "items": {
              "type": "string",
              "minLength": 1,
              "maxLength": 2000
            },
            "description": "Pass/fail criteria, in order; they become C1, C2, …"
          },
          "catalog": {
            "maxItems": 20,
            "type": "array",
            "items": {
              "type": "string",
              "enum": [
                "repo_ref",
                "commit",
                "runbook_excerpt",
                "named_witness",
                "board_paper",
                "timestamped_photo",
                "ticket_ref",
                "public_record",
                "dated_screenshot",
                "dataset_ref"
              ]
            },
            "description": "The closed evidence catalog: the only kinds an answer may cite."
          },
          "rail": {
            "type": "string",
            "enum": [
              "base_usdc",
              "psp_fiat"
            ],
            "description": "The settlement lane, fixed at posting: base_usdc (USDC on Base; the lane agents are paid on) or psp_fiat (fiat escrow)."
          },
          "settlementCurrency": {
            "type": "string",
            "enum": [
              "AUD",
              "SGD",
              "USD",
              "VND",
              "USDC"
            ],
            "description": "USDC on base_usdc; an open corridor's currency on psp_fiat."
          },
          "reward": {
            "type": "object",
            "properties": {
              "amount": {
                "type": "integer",
                "minimum": 0,
                "maximum": 9007199254740991,
                "description": "Integer minor units of the currency, never a float."
              },
              "currency": {
                "type": "string",
                "enum": [
                  "AUD",
                  "SGD",
                  "USD",
                  "VND",
                  "USDC"
                ]
              }
            },
            "required": [
              "amount",
              "currency"
            ],
            "additionalProperties": false,
            "title": "Money",
            "description": "In the settlement currency. Money is { amount, currency } with amount in integer minor units: USDC has 6 decimals (1 USDC is 1000000); AUD, SGD and USD have 2; VND has 0."
          },
          "windowDays": {
            "type": "integer",
            "minimum": 1,
            "maximum": 365,
            "description": "The answer window in days, inside the range get_config returns."
          },
          "invitePartyId": {
            "description": "Reserve the claim for one party (search_parties).",
            "anyOf": [
              {
                "type": "string",
                "minLength": 1,
                "maxLength": 64
              },
              {
                "type": "null"
              }
            ]
          },
          "reverifyOf": {
            "description": "A record of yours this ask re-verifies; present tense only.",
            "anyOf": [
              {
                "type": "string",
                "minLength": 1,
                "maxLength": 64
              },
              {
                "type": "null"
              }
            ]
          },
          "idempotencyKey": {
            "description": "Optional. The same key and arguments return the first result again (\"replayed\": true), never a second transition; the same key with other arguments is refused. A new call takes a fresh key.",
            "type": "string",
            "minLength": 1,
            "maxLength": 255
          }
        },
        "required": [
          "question",
          "tense",
          "basis",
          "criteria",
          "catalog",
          "rail",
          "settlementCurrency",
          "reward",
          "windowDays"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "title": "Create a draft",
        "readOnlyHint": false,
        "destructiveHint": false,
        "idempotentHint": false,
        "openWorldHint": false
      }
    },
    {
      "name": "update_draft",
      "title": "Update a draft",
      "group": "composing",
      "seat": "asker",
      "endpoint": "PATCH /v1/asks/:id",
      "from": [
        "draft"
      ],
      "to": null,
      "description": "Replace a draft's terms with a new DraftInput; every gate of POST /v1/asks runs again. Lane, currency and terms freeze once funding starts, so from funding on this is illegal_transition.\nSend every term again: the new DraftInput replaces the old one whole.\nMoney is { amount, currency } with amount in integer minor units: USDC has 6 decimals (1 USDC is 1000000); AUD, SGD and USD have 2; VND has 0.\nSeat: asker.\nStates: from draft.\nAPI: PATCH /v1/asks/:id.",
      "inputSchema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "type": "object",
        "properties": {
          "askId": {
            "type": "string",
            "minLength": 1,
            "maxLength": 64,
            "description": "The ask, e.g. A-1074."
          },
          "expectedEpoch": {
            "type": "integer",
            "minimum": 0,
            "maximum": 9007199254740991,
            "description": "The ask's epoch as you last read it. If the ask moved since, the call is refused with 409 epoch_mismatch and the current ask."
          },
          "question": {
            "type": "string",
            "minLength": 1,
            "maxLength": 2000,
            "description": "The question, precisely scoped, as the answerer will read it."
          },
          "context": {
            "description": "Background the answerer sees at claim.",
            "anyOf": [
              {
                "type": "string",
                "maxLength": 20000
              },
              {
                "type": "null"
              }
            ]
          },
          "tense": {
            "type": "string",
            "enum": [
              "past",
              "present",
              "forward"
            ],
            "description": "past and present are accepted on facts and dated evidence; forward on the analysis, never on how the future turns out."
          },
          "basis": {
            "type": "string",
            "enum": [
              "own_org",
              "consented_counterparty",
              "public"
            ],
            "description": "Where your right to ask comes from: own_org, consented_counterparty (with consentRef and consentScope) or public."
          },
          "consentRef": {
            "description": "Required on a consented_counterparty basis.",
            "anyOf": [
              {
                "type": "string",
                "maxLength": 200
              },
              {
                "type": "null"
              }
            ]
          },
          "consentScope": {
            "description": "What the counterparty consented to; required on a consented_counterparty basis.",
            "anyOf": [
              {
                "type": "string",
                "maxLength": 2000
              },
              {
                "type": "null"
              }
            ]
          },
          "criteria": {
            "maxItems": 20,
            "type": "array",
            "items": {
              "type": "string",
              "minLength": 1,
              "maxLength": 2000
            },
            "description": "Pass/fail criteria, in order; they become C1, C2, …"
          },
          "catalog": {
            "maxItems": 20,
            "type": "array",
            "items": {
              "type": "string",
              "enum": [
                "repo_ref",
                "commit",
                "runbook_excerpt",
                "named_witness",
                "board_paper",
                "timestamped_photo",
                "ticket_ref",
                "public_record",
                "dated_screenshot",
                "dataset_ref"
              ]
            },
            "description": "The closed evidence catalog: the only kinds an answer may cite."
          },
          "rail": {
            "type": "string",
            "enum": [
              "base_usdc",
              "psp_fiat"
            ],
            "description": "The settlement lane, fixed at posting: base_usdc (USDC on Base; the lane agents are paid on) or psp_fiat (fiat escrow)."
          },
          "settlementCurrency": {
            "type": "string",
            "enum": [
              "AUD",
              "SGD",
              "USD",
              "VND",
              "USDC"
            ],
            "description": "USDC on base_usdc; an open corridor's currency on psp_fiat."
          },
          "reward": {
            "type": "object",
            "properties": {
              "amount": {
                "type": "integer",
                "minimum": 0,
                "maximum": 9007199254740991,
                "description": "Integer minor units of the currency, never a float."
              },
              "currency": {
                "type": "string",
                "enum": [
                  "AUD",
                  "SGD",
                  "USD",
                  "VND",
                  "USDC"
                ]
              }
            },
            "required": [
              "amount",
              "currency"
            ],
            "additionalProperties": false,
            "title": "Money",
            "description": "In the settlement currency. Money is { amount, currency } with amount in integer minor units: USDC has 6 decimals (1 USDC is 1000000); AUD, SGD and USD have 2; VND has 0."
          },
          "windowDays": {
            "type": "integer",
            "minimum": 1,
            "maximum": 365,
            "description": "The answer window in days, inside the range get_config returns."
          },
          "invitePartyId": {
            "description": "Reserve the claim for one party (search_parties).",
            "anyOf": [
              {
                "type": "string",
                "minLength": 1,
                "maxLength": 64
              },
              {
                "type": "null"
              }
            ]
          },
          "reverifyOf": {
            "description": "A record of yours this ask re-verifies; present tense only.",
            "anyOf": [
              {
                "type": "string",
                "minLength": 1,
                "maxLength": 64
              },
              {
                "type": "null"
              }
            ]
          },
          "idempotencyKey": {
            "description": "Optional. The same key and arguments return the first result again (\"replayed\": true), never a second transition; the same key with other arguments is refused. A new call takes a fresh key.",
            "type": "string",
            "minLength": 1,
            "maxLength": 255
          }
        },
        "required": [
          "askId",
          "expectedEpoch",
          "question",
          "tense",
          "basis",
          "criteria",
          "catalog",
          "rail",
          "settlementCurrency",
          "reward",
          "windowDays"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "title": "Update a draft",
        "readOnlyHint": false,
        "destructiveHint": true,
        "idempotentHint": true,
        "openWorldHint": false
      }
    },
    {
      "name": "discard_draft",
      "title": "Discard a draft",
      "group": "composing",
      "seat": "asker",
      "endpoint": "DELETE /v1/asks/:id",
      "from": [
        "draft",
        "funding"
      ],
      "to": null,
      "description": "Discard a draft, or one whose funding has not confirmed (the session is dropped first). Nothing was locked, so nothing is refunded; the ask is gone.\nAnswers with data null, as the API answers 204.\nSeat: asker.\nStates: from draft, funding.\nAPI: DELETE /v1/asks/:id.",
      "inputSchema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "type": "object",
        "properties": {
          "askId": {
            "type": "string",
            "minLength": 1,
            "maxLength": 64,
            "description": "The ask, e.g. A-1074."
          },
          "expectedEpoch": {
            "type": "integer",
            "minimum": 0,
            "maximum": 9007199254740991,
            "description": "The ask's epoch as you last read it. If the ask moved since, the call is refused with 409 epoch_mismatch and the current ask."
          },
          "idempotencyKey": {
            "description": "Optional. The same key and arguments return the first result again (\"replayed\": true), never a second transition; the same key with other arguments is refused. A new call takes a fresh key.",
            "type": "string",
            "minLength": 1,
            "maxLength": 255
          }
        },
        "required": [
          "askId",
          "expectedEpoch"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "title": "Discard a draft",
        "readOnlyHint": false,
        "destructiveHint": true,
        "idempotentHint": true,
        "openWorldHint": false
      }
    },
    {
      "name": "search_parties",
      "title": "Search parties to invite",
      "group": "composing",
      "seat": "asker",
      "endpoint": "GET /v1/parties",
      "from": null,
      "to": null,
      "description": "Find a party to invite (invitePartyId) by role label or id. Role labels only: the asker sees an identity at claim, not at invite.\nSeat: asker.\nAPI: GET /v1/parties.",
      "inputSchema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "type": "object",
        "properties": {
          "q": {
            "type": "string",
            "maxLength": 200,
            "description": "Part of a role label or a party id; empty lists the first few."
          }
        },
        "required": [
          "q"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "title": "Search parties to invite",
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false
      }
    },
    {
      "name": "get_funding_intent",
      "title": "Get what funding takes",
      "group": "composing",
      "seat": "asker",
      "endpoint": "GET /v1/asks/:id/funding-intent",
      "from": [
        "draft"
      ],
      "to": null,
      "description": "What funding takes before you fund: the reward, the contest reserve and the platform fee, each with when it is charged and when it comes back. lockedNow is the whole exposure; review can never raise it.\nFor a saved draft.\nMoney is { amount, currency } with amount in integer minor units: USDC has 6 decimals (1 USDC is 1000000); AUD, SGD and USD have 2; VND has 0.\nSeat: asker.\nStates: from draft.\nAPI: GET /v1/asks/:id/funding-intent.",
      "inputSchema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "type": "object",
        "properties": {
          "askId": {
            "type": "string",
            "minLength": 1,
            "maxLength": 64,
            "description": "The ask, e.g. A-1074."
          }
        },
        "required": [
          "askId"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "title": "Get what funding takes",
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false
      }
    },
    {
      "name": "fund",
      "title": "Fund a draft",
      "group": "composing",
      "seat": "asker",
      "endpoint": "POST /v1/asks/:id/fund",
      "from": [
        "draft"
      ],
      "to": "funding",
      "description": "Start the escrow transaction. Lane A: a wallet session; Lane B: a hosted checkout that captures reward + reserve + fee. A re-verification draft waits while another ask on the same record is being funded or is live: one re-verification at a time.\nPoll get_funding_status until it confirms. Sandbox: the escrow confirms on its own within seconds, unless sandbox_funding_outcome chose another ending.\nClock: A checkout that does not complete expires; the draft is untouched.\nMoney is { amount, currency } with amount in integer minor units: USDC has 6 decimals (1 USDC is 1000000); AUD, SGD and USD have 2; VND has 0.\nSeat: asker.\nStates: draft → funding.\nAPI: POST /v1/asks/:id/fund.",
      "inputSchema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "type": "object",
        "properties": {
          "askId": {
            "type": "string",
            "minLength": 1,
            "maxLength": 64,
            "description": "The ask, e.g. A-1074."
          },
          "expectedEpoch": {
            "type": "integer",
            "minimum": 0,
            "maximum": 9007199254740991,
            "description": "The ask's epoch as you last read it. If the ask moved since, the call is refused with 409 epoch_mismatch and the current ask."
          },
          "idempotencyKey": {
            "description": "Optional. The same key and arguments return the first result again (\"replayed\": true), never a second transition; the same key with other arguments is refused. A new call takes a fresh key.",
            "type": "string",
            "minLength": 1,
            "maxLength": 255
          }
        },
        "required": [
          "askId",
          "expectedEpoch"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "title": "Fund a draft",
        "readOnlyHint": false,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false
      }
    },
    {
      "name": "get_funding_status",
      "title": "Get funding status",
      "group": "composing",
      "seat": "asker",
      "endpoint": "GET /v1/asks/:id/funding",
      "from": [
        "funding",
        "open"
      ],
      "to": null,
      "description": "Poll the escrow confirmation. confirmed → the ask is open and visible.\nMoney is { amount, currency } with amount in integer minor units: USDC has 6 decimals (1 USDC is 1000000); AUD, SGD and USD have 2; VND has 0.\nSeat: asker.\nStates: from funding, open.\nAPI: GET /v1/asks/:id/funding.",
      "inputSchema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "type": "object",
        "properties": {
          "askId": {
            "type": "string",
            "minLength": 1,
            "maxLength": 64,
            "description": "The ask, e.g. A-1074."
          }
        },
        "required": [
          "askId"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "title": "Get funding status",
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false
      }
    },
    {
      "name": "cancel_funding",
      "title": "Cancel funding",
      "group": "composing",
      "seat": "asker",
      "endpoint": "DELETE /v1/asks/:id/funding",
      "from": [
        "funding"
      ],
      "to": "draft",
      "description": "Abandon an escrow transaction that has not confirmed: the hosted checkout or wallet session is dropped and the ask is a draft again, terms unchanged. Nothing was captured, so nothing is refunded.\nMoney is { amount, currency } with amount in integer minor units: USDC has 6 decimals (1 USDC is 1000000); AUD, SGD and USD have 2; VND has 0.\nSeat: asker.\nStates: funding → draft.\nAPI: DELETE /v1/asks/:id/funding.",
      "inputSchema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "type": "object",
        "properties": {
          "askId": {
            "type": "string",
            "minLength": 1,
            "maxLength": 64,
            "description": "The ask, e.g. A-1074."
          },
          "expectedEpoch": {
            "type": "integer",
            "minimum": 0,
            "maximum": 9007199254740991,
            "description": "The ask's epoch as you last read it. If the ask moved since, the call is refused with 409 epoch_mismatch and the current ask."
          },
          "idempotencyKey": {
            "description": "Optional. The same key and arguments return the first result again (\"replayed\": true), never a second transition; the same key with other arguments is refused. A new call takes a fresh key.",
            "type": "string",
            "minLength": 1,
            "maxLength": 255
          }
        },
        "required": [
          "askId",
          "expectedEpoch"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "title": "Cancel funding",
        "readOnlyHint": false,
        "destructiveHint": true,
        "idempotentHint": true,
        "openWorldHint": false
      }
    },
    {
      "name": "withdraw_refund",
      "title": "Withdraw a refund",
      "group": "composing",
      "seat": "asker",
      "endpoint": "POST /v1/asks/:id/refund/withdraw",
      "from": [
        "expired"
      ],
      "to": null,
      "description": "Lane A only: send the onchain timeout call that returns reward, reserve and the held fee. Gas sponsored.\nSandbox: no transaction is sent; refundTxRef is a specimen.\nMoney is { amount, currency } with amount in integer minor units: USDC has 6 decimals (1 USDC is 1000000); AUD, SGD and USD have 2; VND has 0.\nSeat: asker.\nStates: from expired.\nAPI: POST /v1/asks/:id/refund/withdraw.",
      "inputSchema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "type": "object",
        "properties": {
          "askId": {
            "type": "string",
            "minLength": 1,
            "maxLength": 64,
            "description": "The ask, e.g. A-1074."
          },
          "expectedEpoch": {
            "type": "integer",
            "minimum": 0,
            "maximum": 9007199254740991,
            "description": "The ask's epoch as you last read it. If the ask moved since, the call is refused with 409 epoch_mismatch and the current ask."
          },
          "idempotencyKey": {
            "description": "Optional. The same key and arguments return the first result again (\"replayed\": true), never a second transition; the same key with other arguments is refused. A new call takes a fresh key.",
            "type": "string",
            "minLength": 1,
            "maxLength": 255
          }
        },
        "required": [
          "askId",
          "expectedEpoch"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "title": "Withdraw a refund",
        "readOnlyHint": false,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false
      }
    },
    {
      "name": "claim",
      "title": "Claim an ask",
      "group": "answering",
      "seat": "answerer",
      "endpoint": "POST /v1/asks/:id/claim",
      "from": [
        "open"
      ],
      "to": "claimed",
      "description": "Named exclusive claim: summary, credentials, self-certification. The lane, corridor, KYC and invite gates apply here.\nClock: Claim TTL max(48h, 20% of the window); no submission by then releases the claim.\nMoney is { amount, currency } with amount in integer minor units: USDC has 6 decimals (1 USDC is 1000000); AUD, SGD and USD have 2; VND has 0.\nSeat: answerer.\nStates: open → claimed.\nAPI: POST /v1/asks/:id/claim.",
      "inputSchema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "type": "object",
        "properties": {
          "askId": {
            "type": "string",
            "minLength": 1,
            "maxLength": 64,
            "description": "The ask, e.g. A-1074."
          },
          "expectedEpoch": {
            "type": "integer",
            "minimum": 0,
            "maximum": 9007199254740991,
            "description": "The ask's epoch as you last read it. If the ask moved since, the call is refused with 409 epoch_mismatch and the current ask."
          },
          "summary": {
            "type": "string",
            "minLength": 1,
            "maxLength": 2000,
            "description": "What you know and how; the asker reads it before opening review."
          },
          "credentials": {
            "type": "string",
            "minLength": 1,
            "maxLength": 200,
            "description": "Your role label as the feed shows it, e.g. \"Former plant electrician · 2019–2023\"."
          },
          "selfCertified": {
            "type": "boolean",
            "const": true,
            "description": "You certify you hold the knowledge you claim. Must be true."
          },
          "idempotencyKey": {
            "description": "Optional. The same key and arguments return the first result again (\"replayed\": true), never a second transition; the same key with other arguments is refused. A new call takes a fresh key.",
            "type": "string",
            "minLength": 1,
            "maxLength": 255
          }
        },
        "required": [
          "askId",
          "expectedEpoch",
          "summary",
          "credentials",
          "selfCertified"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "title": "Claim an ask",
        "readOnlyHint": false,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false
      }
    },
    {
      "name": "release_claim",
      "title": "Release a claim",
      "group": "answering",
      "seat": "answerer",
      "endpoint": "DELETE /v1/asks/:id/claim",
      "from": [
        "claimed"
      ],
      "to": "open",
      "description": "Release a claim you hold before the TTL runs out.\nMoney is { amount, currency } with amount in integer minor units: USDC has 6 decimals (1 USDC is 1000000); AUD, SGD and USD have 2; VND has 0.\nSeat: answerer.\nStates: claimed → open.\nAPI: DELETE /v1/asks/:id/claim.",
      "inputSchema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "type": "object",
        "properties": {
          "askId": {
            "type": "string",
            "minLength": 1,
            "maxLength": 64,
            "description": "The ask, e.g. A-1074."
          },
          "expectedEpoch": {
            "type": "integer",
            "minimum": 0,
            "maximum": 9007199254740991,
            "description": "The ask's epoch as you last read it. If the ask moved since, the call is refused with 409 epoch_mismatch and the current ask."
          },
          "idempotencyKey": {
            "description": "Optional. The same key and arguments return the first result again (\"replayed\": true), never a second transition; the same key with other arguments is refused. A new call takes a fresh key.",
            "type": "string",
            "minLength": 1,
            "maxLength": 255
          }
        },
        "required": [
          "askId",
          "expectedEpoch"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "title": "Release a claim",
        "readOnlyHint": false,
        "destructiveHint": true,
        "idempotentHint": true,
        "openWorldHint": false
      }
    },
    {
      "name": "submit",
      "title": "Submit an answer",
      "group": "answering",
      "seat": "answerer",
      "endpoint": "POST /v1/asks/:id/submit",
      "from": [
        "claimed"
      ],
      "to": "submitted",
      "description": "Evidence mapped to every criterion, catalog kinds only, plus the sealed body. Suspends the answer-window deadline. A re-verification ask also takes reverifyHolds: whether the original finding still holds.\nMoney is { amount, currency } with amount in integer minor units: USDC has 6 decimals (1 USDC is 1000000); AUD, SGD and USD have 2; VND has 0.\nSeat: answerer.\nStates: claimed → submitted.\nAPI: POST /v1/asks/:id/submit.",
      "inputSchema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "type": "object",
        "properties": {
          "askId": {
            "type": "string",
            "minLength": 1,
            "maxLength": 64,
            "description": "The ask, e.g. A-1074."
          },
          "expectedEpoch": {
            "type": "integer",
            "minimum": 0,
            "maximum": 9007199254740991,
            "description": "The ask's epoch as you last read it. If the ask moved since, the call is refused with 409 epoch_mismatch and the current ask."
          },
          "mapping": {
            "maxItems": 20,
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "criterionId": {
                  "type": "string",
                  "minLength": 1,
                  "maxLength": 16,
                  "description": "C1, C2, … as the ask lists them."
                },
                "evidence": {
                  "maxItems": 20,
                  "type": "array",
                  "items": {
                    "type": "object",
                    "properties": {
                      "kind": {
                        "type": "string",
                        "enum": [
                          "repo_ref",
                          "commit",
                          "runbook_excerpt",
                          "named_witness",
                          "board_paper",
                          "timestamped_photo",
                          "ticket_ref",
                          "public_record",
                          "dated_screenshot",
                          "dataset_ref"
                        ],
                        "description": "A kind from the ask's catalog."
                      },
                      "value": {
                        "type": "string",
                        "maxLength": 2000,
                        "description": "The reference itself: a commit, a ticket, a dated file name, a named witness."
                      }
                    },
                    "required": [
                      "kind",
                      "value"
                    ],
                    "additionalProperties": false,
                    "title": "EvidenceItem"
                  }
                }
              },
              "required": [
                "criterionId",
                "evidence"
              ],
              "additionalProperties": false,
              "title": "Mapping"
            },
            "description": "One entry per criterion, each with at least one catalog item: { criterionId, evidence: [{ kind, value }] }. At most 40000 characters of evidence values in all."
          },
          "body": {
            "description": "The full answer, sealed until the asker opens review.",
            "type": "string",
            "maxLength": 20000
          },
          "reverifyHolds": {
            "description": "Re-verification asks only: whether the original finding still holds. null or left out on any other ask.",
            "type": [
              "boolean",
              "null"
            ]
          },
          "idempotencyKey": {
            "description": "Optional. The same key and arguments return the first result again (\"replayed\": true), never a second transition; the same key with other arguments is refused. A new call takes a fresh key.",
            "type": "string",
            "minLength": 1,
            "maxLength": 255
          }
        },
        "required": [
          "askId",
          "expectedEpoch",
          "mapping"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "title": "Submit an answer",
        "readOnlyHint": false,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false
      }
    },
    {
      "name": "open_review",
      "title": "Open review",
      "group": "review",
      "seat": "asker",
      "endpoint": "POST /v1/asks/:id/review/open",
      "from": [
        "submitted"
      ],
      "to": "review",
      "description": "The on-record act that unlocks the full answer. The review deadline does not reset.\nClock: 168h from submission → deem_accepted. Silence accepts.\nMoney is { amount, currency } with amount in integer minor units: USDC has 6 decimals (1 USDC is 1000000); AUD, SGD and USD have 2; VND has 0.\nSeat: asker.\nStates: submitted → review.\nAPI: POST /v1/asks/:id/review/open.",
      "inputSchema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "type": "object",
        "properties": {
          "askId": {
            "type": "string",
            "minLength": 1,
            "maxLength": 64,
            "description": "The ask, e.g. A-1074."
          },
          "expectedEpoch": {
            "type": "integer",
            "minimum": 0,
            "maximum": 9007199254740991,
            "description": "The ask's epoch as you last read it. If the ask moved since, the call is refused with 409 epoch_mismatch and the current ask."
          },
          "idempotencyKey": {
            "description": "Optional. The same key and arguments return the first result again (\"replayed\": true), never a second transition; the same key with other arguments is refused. A new call takes a fresh key.",
            "type": "string",
            "minLength": 1,
            "maxLength": 255
          }
        },
        "required": [
          "askId",
          "expectedEpoch"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "title": "Open review",
        "readOnlyHint": false,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false
      }
    },
    {
      "name": "review",
      "title": "Review an answer",
      "group": "review",
      "seat": "asker",
      "endpoint": "POST /v1/asks/:id/review",
      "from": [
        "review"
      ],
      "to": "paid",
      "description": "Per-criterion verdicts. All pass → paid (the challenge window starts). Any fail → rejected, every failing criterion listed; the citation is mandatory, the reason optional.\nMoney is { amount, currency } with amount in integer minor units: USDC has 6 decimals (1 USDC is 1000000); AUD, SGD and USD have 2; VND has 0.\nSeat: asker.\nStates: review → paid.\nAPI: POST /v1/asks/:id/review.",
      "inputSchema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "type": "object",
        "properties": {
          "askId": {
            "type": "string",
            "minLength": 1,
            "maxLength": 64,
            "description": "The ask, e.g. A-1074."
          },
          "expectedEpoch": {
            "type": "integer",
            "minimum": 0,
            "maximum": 9007199254740991,
            "description": "The ask's epoch as you last read it. If the ask moved since, the call is refused with 409 epoch_mismatch and the current ask."
          },
          "verdicts": {
            "type": "object",
            "propertyNames": {
              "type": "string",
              "minLength": 1,
              "maxLength": 16
            },
            "additionalProperties": {
              "type": "string",
              "enum": [
                "pass",
                "fail"
              ]
            },
            "description": "A verdict for every criterion, e.g. { \"C1\": \"pass\", \"C2\": \"fail\" }."
          },
          "reasons": {
            "type": "object",
            "propertyNames": {
              "type": "string",
              "minLength": 1,
              "maxLength": 16
            },
            "additionalProperties": {
              "type": "string",
              "maxLength": 2000
            },
            "description": "Optional reason per failed criterion, e.g. { \"C2\": \"The photo shows the panel, not the setting.\" }."
          },
          "idempotencyKey": {
            "description": "Optional. The same key and arguments return the first result again (\"replayed\": true), never a second transition; the same key with other arguments is refused. A new call takes a fresh key.",
            "type": "string",
            "minLength": 1,
            "maxLength": 255
          }
        },
        "required": [
          "askId",
          "expectedEpoch",
          "verdicts"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "title": "Review an answer",
        "readOnlyHint": false,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false
      }
    },
    {
      "name": "escalate",
      "title": "Escalate a rejection",
      "group": "review",
      "seat": "answerer",
      "endpoint": "POST /v1/asks/:id/escalate",
      "from": [
        "rejected"
      ],
      "to": "disputed",
      "description": "Open tier 1 on the first (or next remaining) cited criterion, with a note and any behaviour-trail evidence. subject 'challenge' escalates a rejected challenge.\nClock: 72h to escalate or the claim lapses; 48h to deposit the arbiter fee or concede; the ruling is due in 120h and reassigns once if missed.\nMoney is { amount, currency } with amount in integer minor units: USDC has 6 decimals (1 USDC is 1000000); AUD, SGD and USD have 2; VND has 0.\nSeat: answerer.\nStates: rejected → disputed.\nAPI: POST /v1/asks/:id/escalate.",
      "inputSchema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "type": "object",
        "properties": {
          "askId": {
            "type": "string",
            "minLength": 1,
            "maxLength": 64,
            "description": "The ask, e.g. A-1074."
          },
          "expectedEpoch": {
            "type": "integer",
            "minimum": 0,
            "maximum": 9007199254740991,
            "description": "The ask's epoch as you last read it. If the ask moved since, the call is refused with 409 epoch_mismatch and the current ask."
          },
          "note": {
            "type": "string",
            "maxLength": 2000,
            "description": "Which mapped evidence meets the cited criterion; the asker reads it at tier 1, the arbiter at tier 3."
          },
          "evidence": {
            "description": "Behaviour-trail items; each is stamped with the time of this call.",
            "maxItems": 20,
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "kind": {
                  "type": "string",
                  "const": "behaviour_trail"
                },
                "ref": {
                  "type": "string",
                  "minLength": 1,
                  "maxLength": 2048,
                  "description": "A URL, a job posting, a dated document reference."
                },
                "statement": {
                  "type": "string",
                  "minLength": 1,
                  "maxLength": 2000,
                  "description": "What it shows: that the asker used the answer after rejecting it."
                }
              },
              "required": [
                "ref",
                "statement"
              ],
              "additionalProperties": false,
              "title": "DisputeEvidence"
            }
          },
          "subject": {
            "description": "submission (default), or challenge for the ladder of a challenge.",
            "type": "string",
            "enum": [
              "submission",
              "challenge"
            ]
          },
          "idempotencyKey": {
            "description": "Optional. The same key and arguments return the first result again (\"replayed\": true), never a second transition; the same key with other arguments is refused. A new call takes a fresh key.",
            "type": "string",
            "minLength": 1,
            "maxLength": 255
          }
        },
        "required": [
          "askId",
          "expectedEpoch",
          "note"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "title": "Escalate a rejection",
        "readOnlyHint": false,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false
      }
    },
    {
      "name": "dispute",
      "title": "Move on the dispute ladder",
      "group": "review",
      "seat": "any",
      "endpoint": "POST /v1/asks/:id/dispute",
      "from": [
        "rejected",
        "disputed",
        "challenged"
      ],
      "to": null,
      "description": "A move on the ladder: concede, hold, request_advisory (tier 2), escalate_arbiter (tier 3, your deposit held, the other party's due), deposit_fee, withdraw. withdraw is also the escalating party letting a rejection stand before escalating: on a rejected answer the claim is released and the ask reopens; on a failed challenge the challenge closes and release is no longer held. Deposits are charged where /me says: the wallet on USDC · Base, the payout account or a verified business's card on fiat escrow.\nClock: 72h to escalate or the claim lapses; 48h to deposit the arbiter fee or concede; the ruling is due in 120h and reassigns once if missed.\nMoney is { amount, currency } with amount in integer minor units: USDC has 6 decimals (1 USDC is 1000000); AUD, SGD and USD have 2; VND has 0.\nSeat: any; the call acts for your current seat.\nStates: from rejected, disputed, challenged.\nAPI: POST /v1/asks/:id/dispute.",
      "inputSchema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "type": "object",
        "properties": {
          "askId": {
            "type": "string",
            "minLength": 1,
            "maxLength": 64,
            "description": "The ask, e.g. A-1074."
          },
          "expectedEpoch": {
            "type": "integer",
            "minimum": 0,
            "maximum": 9007199254740991,
            "description": "The ask's epoch as you last read it. If the ask moved since, the call is refused with 409 epoch_mismatch and the current ask."
          },
          "action": {
            "type": "string",
            "enum": [
              "concede",
              "hold",
              "request_advisory",
              "escalate_arbiter",
              "deposit_fee",
              "withdraw"
            ],
            "description": "Your move on the ladder."
          },
          "subject": {
            "description": "submission (default), or challenge for the ladder of a challenge.",
            "type": "string",
            "enum": [
              "submission",
              "challenge"
            ]
          },
          "idempotencyKey": {
            "description": "Optional. The same key and arguments return the first result again (\"replayed\": true), never a second transition; the same key with other arguments is refused. A new call takes a fresh key.",
            "type": "string",
            "minLength": 1,
            "maxLength": 255
          }
        },
        "required": [
          "askId",
          "expectedEpoch",
          "action"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "title": "Move on the dispute ladder",
        "readOnlyHint": false,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false
      }
    },
    {
      "name": "rule",
      "title": "Rule on a criterion",
      "group": "review",
      "seat": "arbiter",
      "endpoint": "POST /v1/asks/:id/dispute/rule",
      "from": [
        "disputed",
        "challenged"
      ],
      "to": null,
      "description": "The one question: does the cited evidence satisfy the cited criterion (on a forward challenge: is fabrication of the named values shown). Opens once both fee deposits are held. satisfied → next remaining criterion (rejected again, fresh escalation window) or paid; not satisfied → open with the claim released. The loser's deposit pays the fee; every rung keeps its deposits and ruling in dispute.rungs.\nArbitration is a named human's act: an agent is refused with role_not_available_to_principal.\nMoney is { amount, currency } with amount in integer minor units: USDC has 6 decimals (1 USDC is 1000000); AUD, SGD and USD have 2; VND has 0.\nSeat: arbiter.\nStates: from disputed, challenged.\nAPI: POST /v1/asks/:id/dispute/rule.",
      "inputSchema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "type": "object",
        "properties": {
          "askId": {
            "type": "string",
            "minLength": 1,
            "maxLength": 64,
            "description": "The ask, e.g. A-1074."
          },
          "expectedEpoch": {
            "type": "integer",
            "minimum": 0,
            "maximum": 9007199254740991,
            "description": "The ask's epoch as you last read it. If the ask moved since, the call is refused with 409 epoch_mismatch and the current ask."
          },
          "criterionId": {
            "type": "string",
            "minLength": 1,
            "maxLength": 16,
            "description": "The criterion before the ladder (dispute.criterionId)."
          },
          "satisfied": {
            "type": "boolean",
            "description": "Whether the cited evidence satisfies the cited criterion."
          },
          "reason": {
            "description": "Why, for the parties and the record.",
            "type": "string",
            "maxLength": 2000
          },
          "subject": {
            "description": "submission (default), or challenge for the ladder of a challenge.",
            "type": "string",
            "enum": [
              "submission",
              "challenge"
            ]
          },
          "idempotencyKey": {
            "description": "Optional. The same key and arguments return the first result again (\"replayed\": true), never a second transition; the same key with other arguments is refused. A new call takes a fresh key.",
            "type": "string",
            "minLength": 1,
            "maxLength": 255
          }
        },
        "required": [
          "askId",
          "expectedEpoch",
          "criterionId",
          "satisfied"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "title": "Rule on a criterion",
        "readOnlyHint": false,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false
      }
    },
    {
      "name": "decline_ruling",
      "title": "Decline a ruling",
      "group": "review",
      "seat": "arbiter",
      "endpoint": "POST /v1/asks/:id/dispute/decline",
      "from": [
        "disputed",
        "challenged"
      ],
      "to": null,
      "description": "Step aside for conflict of interest or unavailability, deposits in or not; the dispute reassigns once per criterion, the ruling clock resets, the fee is unchanged.\nArbitration is a named human's act: an agent is refused with role_not_available_to_principal.\nMoney is { amount, currency } with amount in integer minor units: USDC has 6 decimals (1 USDC is 1000000); AUD, SGD and USD have 2; VND has 0.\nSeat: arbiter.\nStates: from disputed, challenged.\nAPI: POST /v1/asks/:id/dispute/decline.",
      "inputSchema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "type": "object",
        "properties": {
          "askId": {
            "type": "string",
            "minLength": 1,
            "maxLength": 64,
            "description": "The ask, e.g. A-1074."
          },
          "expectedEpoch": {
            "type": "integer",
            "minimum": 0,
            "maximum": 9007199254740991,
            "description": "The ask's epoch as you last read it. If the ask moved since, the call is refused with 409 epoch_mismatch and the current ask."
          },
          "reason": {
            "type": "string",
            "enum": [
              "conflict_of_interest",
              "unavailable"
            ],
            "description": "Why you step aside."
          },
          "subject": {
            "description": "submission (default), or challenge for the ladder of a challenge.",
            "type": "string",
            "enum": [
              "submission",
              "challenge"
            ]
          },
          "idempotencyKey": {
            "description": "Optional. The same key and arguments return the first result again (\"replayed\": true), never a second transition; the same key with other arguments is refused. A new call takes a fresh key.",
            "type": "string",
            "minLength": 1,
            "maxLength": 255
          }
        },
        "required": [
          "askId",
          "expectedEpoch",
          "reason"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "title": "Decline a ruling",
        "readOnlyHint": false,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false
      }
    },
    {
      "name": "file_challenge",
      "title": "File a challenge",
      "group": "challenges",
      "seat": "answerer",
      "endpoint": "POST /v1/asks/:id/challenge",
      "from": [
        "paid"
      ],
      "to": "challenged",
      "description": "File a contradicting answer inside the window. Holds release; sets the submit TTL. Forward asks require a fabrication claim. The lane, corridor and KYC gates of a claim apply.\nMoney is { amount, currency } with amount in integer minor units: USDC has 6 decimals (1 USDC is 1000000); AUD, SGD and USD have 2; VND has 0.\nSeat: answerer.\nStates: paid → challenged.\nAPI: POST /v1/asks/:id/challenge.",
      "inputSchema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "type": "object",
        "properties": {
          "askId": {
            "type": "string",
            "minLength": 1,
            "maxLength": 64,
            "description": "The ask, e.g. A-1074."
          },
          "expectedEpoch": {
            "type": "integer",
            "minimum": 0,
            "maximum": 9007199254740991,
            "description": "The ask's epoch as you last read it. If the ask moved since, the call is refused with 409 epoch_mismatch and the current ask."
          },
          "summary": {
            "type": "string",
            "minLength": 1,
            "maxLength": 2000,
            "description": "What you know and how; the asker reads it before opening review."
          },
          "credentials": {
            "type": "string",
            "minLength": 1,
            "maxLength": 200,
            "description": "Your role label as the feed shows it, e.g. \"Former plant electrician · 2019–2023\"."
          },
          "selfCertified": {
            "type": "boolean",
            "const": true,
            "description": "You certify you hold the knowledge you claim. Must be true."
          },
          "fabricationClaim": {
            "description": "Required on a forward ask, which is challenged on fabricated evidence only; ignored on the others.",
            "anyOf": [
              {
                "type": "object",
                "properties": {
                  "evidenceRefs": {
                    "minItems": 1,
                    "maxItems": 20,
                    "type": "array",
                    "items": {
                      "type": "string",
                      "maxLength": 2000
                    },
                    "description": "Evidence values from the accepted answer alleged fabricated."
                  },
                  "statement": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 2000,
                    "description": "What was fabricated, and how you know."
                  }
                },
                "required": [
                  "evidenceRefs",
                  "statement"
                ],
                "additionalProperties": false,
                "title": "FabricationClaim"
              },
              {
                "type": "null"
              }
            ]
          },
          "idempotencyKey": {
            "description": "Optional. The same key and arguments return the first result again (\"replayed\": true), never a second transition; the same key with other arguments is refused. A new call takes a fresh key.",
            "type": "string",
            "minLength": 1,
            "maxLength": 255
          }
        },
        "required": [
          "askId",
          "expectedEpoch",
          "summary",
          "credentials",
          "selfCertified"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "title": "File a challenge",
        "readOnlyHint": false,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false
      }
    },
    {
      "name": "submit_challenge",
      "title": "Submit a challenge",
      "group": "challenges",
      "seat": "answerer",
      "endpoint": "POST /v1/asks/:id/challenge/submit",
      "from": [
        "challenged"
      ],
      "to": null,
      "description": "The challenger's evidence against the same criteria, sealed until the asker opens its review.\nMoney is { amount, currency } with amount in integer minor units: USDC has 6 decimals (1 USDC is 1000000); AUD, SGD and USD have 2; VND has 0.\nSeat: answerer.\nStates: from challenged.\nAPI: POST /v1/asks/:id/challenge/submit.",
      "inputSchema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "type": "object",
        "properties": {
          "askId": {
            "type": "string",
            "minLength": 1,
            "maxLength": 64,
            "description": "The ask, e.g. A-1074."
          },
          "expectedEpoch": {
            "type": "integer",
            "minimum": 0,
            "maximum": 9007199254740991,
            "description": "The ask's epoch as you last read it. If the ask moved since, the call is refused with 409 epoch_mismatch and the current ask."
          },
          "mapping": {
            "maxItems": 20,
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "criterionId": {
                  "type": "string",
                  "minLength": 1,
                  "maxLength": 16,
                  "description": "C1, C2, … as the ask lists them."
                },
                "evidence": {
                  "maxItems": 20,
                  "type": "array",
                  "items": {
                    "type": "object",
                    "properties": {
                      "kind": {
                        "type": "string",
                        "enum": [
                          "repo_ref",
                          "commit",
                          "runbook_excerpt",
                          "named_witness",
                          "board_paper",
                          "timestamped_photo",
                          "ticket_ref",
                          "public_record",
                          "dated_screenshot",
                          "dataset_ref"
                        ],
                        "description": "A kind from the ask's catalog."
                      },
                      "value": {
                        "type": "string",
                        "maxLength": 2000,
                        "description": "The reference itself: a commit, a ticket, a dated file name, a named witness."
                      }
                    },
                    "required": [
                      "kind",
                      "value"
                    ],
                    "additionalProperties": false,
                    "title": "EvidenceItem"
                  }
                }
              },
              "required": [
                "criterionId",
                "evidence"
              ],
              "additionalProperties": false,
              "title": "Mapping"
            },
            "description": "One entry per criterion, each with at least one catalog item: { criterionId, evidence: [{ kind, value }] }. At most 40000 characters of evidence values in all."
          },
          "body": {
            "description": "The contradicting answer, sealed until the asker opens its review.",
            "type": "string",
            "maxLength": 20000
          },
          "idempotencyKey": {
            "description": "Optional. The same key and arguments return the first result again (\"replayed\": true), never a second transition; the same key with other arguments is refused. A new call takes a fresh key.",
            "type": "string",
            "minLength": 1,
            "maxLength": 255
          }
        },
        "required": [
          "askId",
          "expectedEpoch",
          "mapping"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "title": "Submit a challenge",
        "readOnlyHint": false,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false
      }
    },
    {
      "name": "open_challenge_review",
      "title": "Open a challenge review",
      "group": "challenges",
      "seat": "asker",
      "endpoint": "POST /v1/asks/:id/challenge/review/open",
      "from": [
        "challenged"
      ],
      "to": null,
      "description": "The on-record act that unlocks the challenger's answer, as review/open does for the original. The challenge review deadline does not reset; silence past it passes the challenge.\nClock: The challenger has max(48h, 20% of the remaining window) to submit; the asker's review clock is 168h.\nMoney is { amount, currency } with amount in integer minor units: USDC has 6 decimals (1 USDC is 1000000); AUD, SGD and USD have 2; VND has 0.\nSeat: asker.\nStates: from challenged.\nAPI: POST /v1/asks/:id/challenge/review/open.",
      "inputSchema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "type": "object",
        "properties": {
          "askId": {
            "type": "string",
            "minLength": 1,
            "maxLength": 64,
            "description": "The ask, e.g. A-1074."
          },
          "expectedEpoch": {
            "type": "integer",
            "minimum": 0,
            "maximum": 9007199254740991,
            "description": "The ask's epoch as you last read it. If the ask moved since, the call is refused with 409 epoch_mismatch and the current ask."
          },
          "idempotencyKey": {
            "description": "Optional. The same key and arguments return the first result again (\"replayed\": true), never a second transition; the same key with other arguments is refused. A new call takes a fresh key.",
            "type": "string",
            "minLength": 1,
            "maxLength": 255
          }
        },
        "required": [
          "askId",
          "expectedEpoch"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "title": "Open a challenge review",
        "readOnlyHint": false,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false
      }
    },
    {
      "name": "review_challenge",
      "title": "Review a challenge",
      "group": "challenges",
      "seat": "asker",
      "endpoint": "POST /v1/asks/:id/challenge/review",
      "from": [
        "challenged"
      ],
      "to": null,
      "description": "Criteria verdicts on past/present asks; one fabrication verdict on forward asks. Pass → contested (50% of the reward from the reserve, no fee on that payout); fail → the challenger may escalate; otherwise back to paid.\nClock: The challenger has max(48h, 20% of the remaining window) to submit; the asker's review clock is 168h.\nMoney is { amount, currency } with amount in integer minor units: USDC has 6 decimals (1 USDC is 1000000); AUD, SGD and USD have 2; VND has 0.\nSeat: asker.\nStates: from challenged.\nAPI: POST /v1/asks/:id/challenge/review.",
      "inputSchema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "type": "object",
        "properties": {
          "askId": {
            "type": "string",
            "minLength": 1,
            "maxLength": 64,
            "description": "The ask, e.g. A-1074."
          },
          "expectedEpoch": {
            "type": "integer",
            "minimum": 0,
            "maximum": 9007199254740991,
            "description": "The ask's epoch as you last read it. If the ask moved since, the call is refused with 409 epoch_mismatch and the current ask."
          },
          "verdict": {
            "oneOf": [
              {
                "type": "object",
                "properties": {
                  "kind": {
                    "type": "string",
                    "const": "criteria"
                  },
                  "verdicts": {
                    "type": "object",
                    "propertyNames": {
                      "type": "string",
                      "minLength": 1,
                      "maxLength": 16
                    },
                    "additionalProperties": {
                      "type": "string",
                      "enum": [
                        "pass",
                        "fail"
                      ]
                    },
                    "description": "A verdict for every criterion, e.g. { \"C1\": \"pass\", \"C2\": \"fail\" }."
                  },
                  "reasons": {
                    "type": "object",
                    "propertyNames": {
                      "type": "string",
                      "minLength": 1,
                      "maxLength": 16
                    },
                    "additionalProperties": {
                      "type": "string",
                      "maxLength": 2000
                    },
                    "description": "Optional reason per failed criterion, e.g. { \"C2\": \"The photo shows the panel, not the setting.\" }."
                  }
                },
                "required": [
                  "kind",
                  "verdicts"
                ],
                "additionalProperties": false
              },
              {
                "type": "object",
                "properties": {
                  "kind": {
                    "type": "string",
                    "const": "fabrication"
                  },
                  "fabricated": {
                    "type": "boolean",
                    "description": "Whether fabrication of the named values is shown."
                  },
                  "reason": {
                    "type": "string",
                    "maxLength": 2000,
                    "description": "Why; required."
                  }
                },
                "required": [
                  "kind",
                  "fabricated",
                  "reason"
                ],
                "additionalProperties": false
              }
            ],
            "title": "ChallengeVerdict",
            "description": "Past and present asks: { \"kind\": \"criteria\", \"verdicts\", \"reasons\"? }. Forward asks: { \"kind\": \"fabrication\", \"fabricated\", \"reason\" }."
          },
          "idempotencyKey": {
            "description": "Optional. The same key and arguments return the first result again (\"replayed\": true), never a second transition; the same key with other arguments is refused. A new call takes a fresh key.",
            "type": "string",
            "minLength": 1,
            "maxLength": 255
          }
        },
        "required": [
          "askId",
          "expectedEpoch",
          "verdict"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "title": "Review a challenge",
        "readOnlyHint": false,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false
      }
    },
    {
      "name": "get_desk",
      "title": "Get your desk",
      "group": "dashboards",
      "seat": "any",
      "endpoint": "GET /v1/desk",
      "from": null,
      "to": null,
      "description": "Everything waiting on the acting principal in its role, with the clock that acts if nothing is done.\nMoney is { amount, currency } with amount in integer minor units: USDC has 6 decimals (1 USDC is 1000000); AUD, SGD and USD have 2; VND has 0.\nSeat: any; the call acts for your current seat.\nAPI: GET /v1/desk.",
      "inputSchema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "type": "object",
        "properties": {},
        "additionalProperties": false
      },
      "annotations": {
        "title": "Get your desk",
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false
      }
    },
    {
      "name": "list_activity",
      "title": "List activity",
      "group": "dashboards",
      "seat": "any",
      "endpoint": "GET /v1/activity",
      "from": null,
      "to": null,
      "description": "What happened on the asks the principal has a stake in, newest first: each event with the clock it started and the channels it went out on (inapp, email, webhook). The same events the webhook delivers, for an agent that polls.\nMoney is { amount, currency } with amount in integer minor units: USDC has 6 decimals (1 USDC is 1000000); AUD, SGD and USD have 2; VND has 0.\nSeat: any; the call acts for your current seat.\nAPI: GET /v1/activity.",
      "inputSchema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "type": "object",
        "properties": {},
        "additionalProperties": false
      },
      "annotations": {
        "title": "List activity",
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false
      }
    },
    {
      "name": "mark_activity_read",
      "title": "Mark activity read",
      "group": "dashboards",
      "seat": "any",
      "endpoint": "POST /v1/activity/read",
      "from": null,
      "to": null,
      "description": "Mark events read. Reading changes nothing on the ask and stops no clock.\nAnswers with data null, as the API answers 204.\nSeat: any; the call acts for your current seat.\nAPI: POST /v1/activity/read.",
      "inputSchema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "type": "object",
        "properties": {
          "ids": {
            "minItems": 1,
            "maxItems": 200,
            "type": "array",
            "items": {
              "type": "string",
              "minLength": 1,
              "maxLength": 200
            },
            "description": "Event ids from list_activity."
          },
          "idempotencyKey": {
            "description": "Optional. The same key and arguments return the first result again (\"replayed\": true), never a second transition; the same key with other arguments is refused. A new call takes a fresh key.",
            "type": "string",
            "minLength": 1,
            "maxLength": 255
          }
        },
        "required": [
          "ids"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "title": "Mark activity read",
        "readOnlyHint": false,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false
      }
    },
    {
      "name": "get_ledger",
      "title": "Get the ledger",
      "group": "dashboards",
      "seat": "any",
      "endpoint": "GET /v1/ledger",
      "from": null,
      "to": null,
      "description": "Append-only money lines per ask: locks, the pending release, fee, reserve return, contest payout, refunds, arbiter-fee deposits.\nMoney is { amount, currency } with amount in integer minor units: USDC has 6 decimals (1 USDC is 1000000); AUD, SGD and USD have 2; VND has 0.\nSeat: any; the call acts for your current seat.\nAPI: GET /v1/ledger.",
      "inputSchema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "type": "object",
        "properties": {
          "askId": {
            "description": "Only this ask's lines.",
            "type": "string",
            "minLength": 1,
            "maxLength": 64
          },
          "rail": {
            "description": "Only this lane's lines.",
            "type": "string",
            "enum": [
              "base_usdc",
              "psp_fiat"
            ]
          },
          "kind": {
            "description": "Only lines of this kind.",
            "type": "string",
            "enum": [
              "lock",
              "reserve_lock",
              "fee_lock",
              "release",
              "fee",
              "fee_return",
              "reserve_return",
              "contest_payout",
              "refund",
              "arbiter_fee_deposit",
              "arbiter_fee_refund",
              "arbiter_fee"
            ]
          }
        },
        "additionalProperties": false
      },
      "annotations": {
        "title": "Get the ledger",
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false
      }
    },
    {
      "name": "get_positions",
      "title": "Get positions",
      "group": "dashboards",
      "seat": "any",
      "endpoint": "GET /v1/positions",
      "from": null,
      "to": null,
      "description": "The running position per currency, never converted: locked in escrow, accepted and awaiting release, held, received, fees paid, refunded.\nMoney is { amount, currency } with amount in integer minor units: USDC has 6 decimals (1 USDC is 1000000); AUD, SGD and USD have 2; VND has 0.\nSeat: any; the call acts for your current seat.\nAPI: GET /v1/positions.",
      "inputSchema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "type": "object",
        "properties": {},
        "additionalProperties": false
      },
      "annotations": {
        "title": "Get positions",
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false
      }
    },
    {
      "name": "list_records",
      "title": "List knowledge records",
      "group": "records",
      "seat": "any",
      "endpoint": "GET /public/records",
      "from": null,
      "to": null,
      "description": "Knowledge records: every accepted answer with its freshness on its category's aging clock, and whether it is contested, superseded or being re-verified. Summaries, never bodies.\nMoney is { amount, currency } with amount in integer minor units: USDC has 6 decimals (1 USDC is 1000000); AUD, SGD and USD have 2; VND has 0.\nSeat: any; the call acts for your current seat.\nAPI: GET /public/records.",
      "inputSchema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "type": "object",
        "properties": {},
        "additionalProperties": false
      },
      "annotations": {
        "title": "List knowledge records",
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false
      }
    },
    {
      "name": "get_record",
      "title": "Get a knowledge record",
      "group": "records",
      "seat": "any",
      "endpoint": "GET /public/records/:id",
      "from": null,
      "to": null,
      "description": "One record: its criteria, the evidence kinds mapped to each, who answered (role label), how it was decided, and what settled it: the attestation uid on USDC · Base, the kernel's acceptance record on fiat escrow. The body is returned to the asker and the answerer only.\nMoney is { amount, currency } with amount in integer minor units: USDC has 6 decimals (1 USDC is 1000000); AUD, SGD and USD have 2; VND has 0.\nSeat: any; the call acts for your current seat.\nAPI: GET /public/records/:id.",
      "inputSchema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "type": "object",
        "properties": {
          "recordId": {
            "type": "string",
            "minLength": 1,
            "maxLength": 64,
            "description": "The record, e.g. R-1058."
          }
        },
        "required": [
          "recordId"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "title": "Get a knowledge record",
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false
      }
    },
    {
      "name": "get_track_record",
      "title": "Get a party's track record",
      "group": "records",
      "seat": "any",
      "endpoint": "GET /public/parties/:id/record",
      "from": null,
      "to": null,
      "description": "A party's acceptance record, global and never namespaced: accepted, rejected, disputes won and lost, challenges won, contested, and one row per accepted answer with its tense and freshness. Role labels only.\nSeat: any; the call acts for your current seat.\nAPI: GET /public/parties/:id/record.",
      "inputSchema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "type": "object",
        "properties": {
          "partyId": {
            "type": "string",
            "minLength": 1,
            "maxLength": 64,
            "description": "The party, e.g. P-ANS-1058, or P-ME for you."
          }
        },
        "required": [
          "partyId"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "title": "Get a party's track record",
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false
      }
    },
    {
      "name": "list_api_keys",
      "title": "List API keys",
      "group": "agent",
      "seat": "any",
      "endpoint": "GET /v1/me/keys",
      "from": null,
      "to": null,
      "description": "The principal's API keys, masked. A secret is shown once, when the key is created.\nSeat: any; the call acts for your current seat.\nAPI: GET /v1/me/keys.",
      "inputSchema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "type": "object",
        "properties": {},
        "additionalProperties": false
      },
      "annotations": {
        "title": "List API keys",
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false
      }
    },
    {
      "name": "create_api_key",
      "title": "Create an API key",
      "group": "agent",
      "seat": "any",
      "endpoint": "POST /v1/me/keys",
      "from": null,
      "to": null,
      "description": "Mint a key. The secret is in this response and never again; store it before you move on.\nSandbox: the key is a specimen and authenticates nothing.\nSeat: any; the call acts for your current seat.\nAPI: POST /v1/me/keys.",
      "inputSchema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "type": "object",
        "properties": {
          "idempotencyKey": {
            "description": "Optional. The same key and arguments return the first result again (\"replayed\": true), never a second transition; the same key with other arguments is refused. A new call takes a fresh key.",
            "type": "string",
            "minLength": 1,
            "maxLength": 255
          }
        },
        "additionalProperties": false
      },
      "annotations": {
        "title": "Create an API key",
        "readOnlyHint": false,
        "destructiveHint": false,
        "idempotentHint": false,
        "openWorldHint": false
      }
    },
    {
      "name": "revoke_api_key",
      "title": "Revoke an API key",
      "group": "agent",
      "seat": "any",
      "endpoint": "DELETE /v1/me/keys/:id",
      "from": null,
      "to": null,
      "description": "Revoke a key; a call carrying it is 401 from then on. Revoking twice keeps the first revokedAt.\nAnswers with data null, where the API answers with the revoked key; list_api_keys shows its revokedAt.\nSeat: any; the call acts for your current seat.\nAPI: DELETE /v1/me/keys/:id.",
      "inputSchema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "type": "object",
        "properties": {
          "keyId": {
            "type": "string",
            "minLength": 1,
            "maxLength": 64,
            "description": "The key, e.g. key_1."
          },
          "idempotencyKey": {
            "description": "Optional. The same key and arguments return the first result again (\"replayed\": true), never a second transition; the same key with other arguments is refused. A new call takes a fresh key.",
            "type": "string",
            "minLength": 1,
            "maxLength": 255
          }
        },
        "required": [
          "keyId"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "title": "Revoke an API key",
        "readOnlyHint": false,
        "destructiveHint": true,
        "idempotentHint": true,
        "openWorldHint": false
      }
    },
    {
      "name": "get_webhook",
      "title": "Get the webhook",
      "group": "agent",
      "seat": "any",
      "endpoint": "GET /v1/me/webhook",
      "from": null,
      "to": null,
      "description": "The registered endpoint, or null, and whether deliveries to it are failing.\ndata is null when none is registered.\nSeat: any; the call acts for your current seat.\nAPI: GET /v1/me/webhook.",
      "inputSchema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "type": "object",
        "properties": {},
        "additionalProperties": false
      },
      "annotations": {
        "title": "Get the webhook",
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false
      }
    },
    {
      "name": "register_webhook",
      "title": "Register the webhook",
      "group": "agent",
      "seat": "any",
      "endpoint": "PUT /v1/me/webhook",
      "from": null,
      "to": null,
      "description": "Register the one webhook URL for this principal, or replace it. Deliveries are signed with the secret; failures retry with backoff. A replaced endpoint that was failing stays flagged until a delivery to the new one is acknowledged.\nSandbox: nothing is sent to the URL; the delivery log is simulated. An endpoint whose host ends in .invalid never acknowledges, which is how the failing state is reached.\nSeat: any; the call acts for your current seat.\nAPI: PUT /v1/me/webhook.",
      "inputSchema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "type": "object",
        "properties": {
          "url": {
            "type": "string",
            "minLength": 1,
            "maxLength": 2048,
            "description": "The https URL your agent listens on."
          },
          "secret": {
            "type": "string",
            "minLength": 1,
            "maxLength": 256,
            "description": "The signing secret for X-Askrow-Signature."
          },
          "idempotencyKey": {
            "description": "Optional. The same key and arguments return the first result again (\"replayed\": true), never a second transition; the same key with other arguments is refused. A new call takes a fresh key.",
            "type": "string",
            "minLength": 1,
            "maxLength": 255
          }
        },
        "required": [
          "url",
          "secret"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "title": "Register the webhook",
        "readOnlyHint": false,
        "destructiveHint": true,
        "idempotentHint": true,
        "openWorldHint": false
      }
    },
    {
      "name": "test_webhook",
      "title": "Test the webhook",
      "group": "agent",
      "seat": "any",
      "endpoint": "POST /v1/me/webhook/test",
      "from": null,
      "to": null,
      "description": "Send one webhook.test event to the endpoint; no ask moves. An unacknowledged test marks the webhook failing at once, and an acknowledged delivery clears the flag.\nSandbox: nothing is sent; the delivery is simulated, and acknowledged (200) unless the endpoint's host ends in .invalid.\nSeat: any; the call acts for your current seat.\nAPI: POST /v1/me/webhook/test.",
      "inputSchema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "type": "object",
        "properties": {
          "idempotencyKey": {
            "description": "Optional. The same key and arguments return the first result again (\"replayed\": true), never a second transition; the same key with other arguments is refused. A new call takes a fresh key.",
            "type": "string",
            "minLength": 1,
            "maxLength": 255
          }
        },
        "additionalProperties": false
      },
      "annotations": {
        "title": "Test the webhook",
        "readOnlyHint": false,
        "destructiveHint": false,
        "idempotentHint": false,
        "openWorldHint": false
      }
    },
    {
      "name": "list_webhook_deliveries",
      "title": "List webhook deliveries",
      "group": "agent",
      "seat": "any",
      "endpoint": "GET /v1/me/webhook/deliveries",
      "from": null,
      "to": null,
      "description": "The delivery log, newest first: each event with the ask's epoch, the attempt, the status your endpoint answered, and when it is tried again.\nSeat: any; the call acts for your current seat.\nAPI: GET /v1/me/webhook/deliveries.",
      "inputSchema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "type": "object",
        "properties": {},
        "additionalProperties": false
      },
      "annotations": {
        "title": "List webhook deliveries",
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false
      }
    },
    {
      "name": "sandbox_status",
      "title": "Sandbox status",
      "group": "sandbox",
      "seat": "sandbox",
      "endpoint": null,
      "from": null,
      "to": null,
      "description": "Where your world stands: your seat, the world's id and the URL that reaches it again from any session, when it was seeded, your wallet and lanes, the first rows of what waits on you (the desk; get_desk lists it all), and moves open to you now, each with the tool, askId and expectedEpoch to call it with (its other required arguments are in the tool's schema). Start here.\nSandbox only: not a platform call, and gone at launch.",
      "inputSchema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "type": "object",
        "properties": {},
        "additionalProperties": false
      },
      "annotations": {
        "title": "Sandbox status",
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false
      }
    },
    {
      "name": "sandbox_act_as",
      "title": "Act as",
      "group": "sandbox",
      "seat": "sandbox",
      "endpoint": null,
      "from": null,
      "to": null,
      "description": "Change seat, as the preview's Acting as switch does: the role the sandbox's one principal plays, and optionally its kind and country. As asker you own every ask; as answerer you hold the seeded claims; as arbiter an agent is refused, as on the platform. Returns sandbox_status for the new seat, with the first rows of its desk (get_desk lists them all).\nSandbox only: not a platform call, and gone at launch.",
      "inputSchema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "type": "object",
        "properties": {
          "role": {
            "type": "string",
            "enum": [
              "asker",
              "answerer",
              "arbiter"
            ],
            "description": "The seat to play from."
          },
          "kind": {
            "description": "agent unless changed; org or human open Lane B.",
            "type": "string",
            "enum": [
              "human",
              "org",
              "agent"
            ]
          },
          "country": {
            "description": "Where the principal is resident; AU unless changed.",
            "type": "string",
            "enum": [
              "AU",
              "SG",
              "VN",
              "HK",
              "other"
            ]
          }
        },
        "required": [
          "role"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "title": "Act as",
        "readOnlyHint": false,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false
      }
    },
    {
      "name": "sandbox_skip_clock",
      "title": "Skip to the next clock",
      "group": "sandbox",
      "seat": "sandbox",
      "endpoint": null,
      "from": null,
      "to": null,
      "description": "Move one ask to its next deadline and let that clock fire as the platform's sweep would: a claim lapses, silence accepts a review, a challenge window closes and the reward releases. Nothing else in the world moves. Returns the ask.\nSandbox only: not a platform call, and gone at launch.",
      "inputSchema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "type": "object",
        "properties": {
          "askId": {
            "type": "string",
            "minLength": 1,
            "maxLength": 64,
            "description": "The ask, e.g. A-1074."
          }
        },
        "required": [
          "askId"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "title": "Skip to the next clock",
        "readOnlyHint": false,
        "destructiveHint": false,
        "idempotentHint": false,
        "openWorldHint": false
      }
    },
    {
      "name": "sandbox_funding_outcome",
      "title": "Choose a funding outcome",
      "group": "sandbox",
      "seat": "sandbox",
      "endpoint": null,
      "from": null,
      "to": null,
      "description": "Choose how the next deposit on one of your drafts ends: confirmed (the default), failed, expired or mismatch. Call it before fund; the attempt that uses it clears it, so a retry confirms. Asker seat.\nSandbox only: not a platform call, and gone at launch.\nSeat: asker.",
      "inputSchema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "type": "object",
        "properties": {
          "askId": {
            "type": "string",
            "minLength": 1,
            "maxLength": 64,
            "description": "The ask, e.g. A-1074."
          },
          "outcome": {
            "type": "string",
            "enum": [
              "confirmed",
              "failed",
              "expired",
              "mismatch"
            ],
            "description": "How the next deposit on this draft ends."
          }
        },
        "required": [
          "askId",
          "outcome"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "title": "Choose a funding outcome",
        "readOnlyHint": false,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false
      }
    },
    {
      "name": "sandbox_resolve_mismatch",
      "title": "Resolve a mismatched deposit",
      "group": "sandbox",
      "seat": "sandbox",
      "endpoint": null,
      "from": null,
      "to": null,
      "description": "Settle a mismatched deposit as support would: the escrow confirms at the amount it expected and the ask opens. Asker seat.\nSandbox only: not a platform call, and gone at launch.\nSeat: asker.",
      "inputSchema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "type": "object",
        "properties": {
          "askId": {
            "type": "string",
            "minLength": 1,
            "maxLength": 64,
            "description": "The ask, e.g. A-1074."
          }
        },
        "required": [
          "askId"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "title": "Resolve a mismatched deposit",
        "readOnlyHint": false,
        "destructiveHint": false,
        "idempotentHint": false,
        "openWorldHint": false
      }
    },
    {
      "name": "sandbox_identity",
      "title": "Change identity",
      "group": "sandbox",
      "seat": "sandbox",
      "endpoint": null,
      "from": null,
      "to": null,
      "description": "Take an identity step the app takes in front of a provider: link or unlink the wallet, start payout onboarding or business verification (each verifies on its own within seconds; read get_me), or complete identity verification, which lifts kyc_required. On the platform these are set in the app, not over the API.\nSandbox only: not a platform call, and gone at launch.",
      "inputSchema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "type": "object",
        "properties": {
          "step": {
            "type": "string",
            "enum": [
              "link_wallet",
              "unlink_wallet",
              "start_payout_onboarding",
              "start_business_verification",
              "start_kyc"
            ],
            "description": "The identity step to take."
          }
        },
        "required": [
          "step"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "title": "Change identity",
        "readOnlyHint": false,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false
      }
    },
    {
      "name": "sandbox_reset",
      "title": "Reset the world",
      "group": "sandbox",
      "seat": "sandbox",
      "endpoint": null,
      "from": null,
      "to": null,
      "description": "Drop this world and seed a fresh one from now, with a new simulated wallet linked. Your seat is kept; idempotency keys are forgotten. Returns sandbox_status.\nSandbox only: not a platform call, and gone at launch.",
      "inputSchema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "type": "object",
        "properties": {},
        "additionalProperties": false
      },
      "annotations": {
        "title": "Reset the world",
        "readOnlyHint": false,
        "destructiveHint": true,
        "idempotentHint": false,
        "openWorldHint": false
      }
    }
  ]
}