{
  "protocolVersion": "2025-06-18",
  "serverInfo": {
    "name": "playnet gateway",
    "title": "playnet gateway doors",
    "version": "1"
  },
  "tools": [
    {
      "name": "lobby.signup",
      "title": "identity: signup",
      "description": "Registers a seat for an AID whose OOBI is hosted elsewhere: resolves it through KERIA, persists the member, and replies ok or (error reason). Use signup-with-icp when the browser holds its own KEL. [identity; callable by anyone]",
      "inputSchema": {
        "type": "object",
        "properties": {
          "username": {
            "type": "string",
            "description": "the seat's login handle, a plain string chosen at signup",
            "x-playnet-shape": "string"
          },
          "email": {
            "type": "string",
            "description": "the seat's contact email, display-only on the member record",
            "x-playnet-shape": "string"
          },
          "aid-prefix": {
            "type": "string",
            "pattern": "^[A-Z][A-Za-z0-9_-]{43}$",
            "description": "a KERI AID prefix",
            "x-playnet-shape": "aid"
          },
          "oobi-url": {
            "type": "string",
            "description": "the KERIA-hosted OOBI URL where this AID's key state can be resolved",
            "x-playnet-shape": "string"
          }
        },
        "required": [
          "username",
          "email",
          "aid-prefix",
          "oobi-url"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "openWorldHint": false
      },
      "x-playnet-auth": "anonymous",
      "x-playnet-topic": "identity",
      "x-playnet-http": "/api/lobby/signup"
    },
    {
      "name": "lobby.signup-with-icp",
      "title": "identity: signup-with-icp",
      "description": "Takes a seat for a browser-made AID from its inception event and signatures, verified offline (AID = k[0], SAID, sig) and witnessed into ^oobi-host; replies ok or (error reason). [identity; callable by anyone]",
      "inputSchema": {
        "type": "object",
        "properties": {
          "username": {
            "type": "string",
            "description": "the seat's login handle, a plain string chosen at signup",
            "x-playnet-shape": "string"
          },
          "email": {
            "type": "string",
            "description": "the seat's contact email, display-only on the member record",
            "x-playnet-shape": "string"
          },
          "aid-prefix": {
            "type": "string",
            "pattern": "^[A-Z][A-Za-z0-9_-]{43}$",
            "description": "a KERI AID prefix",
            "x-playnet-shape": "aid"
          },
          "icp-alist": {
            "type": "object",
            "additionalProperties": true,
            "description": "the AID's inception event as a JSON object (KERI icp fields, serialized)",
            "x-playnet-shape": "alist"
          },
          "sigs": {
            "type": "array",
            "description": "a JSON array of CESR qb64 signatures over the event, one per signing key",
            "x-playnet-shape": "list"
          }
        },
        "required": [
          "username",
          "email",
          "aid-prefix",
          "icp-alist",
          "sigs"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "openWorldHint": false
      },
      "x-playnet-auth": "anonymous",
      "x-playnet-topic": "identity",
      "x-playnet-http": "/api/lobby/signup-with-icp"
    },
    {
      "name": "lobby.signup-with-kel",
      "title": "identity: signup-with-kel",
      "description": "Takes a seat under an AID's whole KEL (inception, sigs, rotations in sn order), verified end to end and witnessed into ^oobi-host; replies ok or (error reason). No rotations: use signup-with-icp. [identity; callable by anyone]",
      "inputSchema": {
        "type": "object",
        "properties": {
          "username": {
            "type": "string",
            "description": "the seat's login handle, a plain string chosen at signup",
            "x-playnet-shape": "string"
          },
          "email": {
            "type": "string",
            "description": "the seat's contact email, display-only on the member record",
            "x-playnet-shape": "string"
          },
          "aid-prefix": {
            "type": "string",
            "pattern": "^[A-Z][A-Za-z0-9_-]{43}$",
            "description": "a KERI AID prefix",
            "x-playnet-shape": "aid"
          },
          "icp-alist": {
            "type": "object",
            "additionalProperties": true,
            "description": "the AID's inception event as a JSON object (KERI icp fields, serialized)",
            "x-playnet-shape": "alist"
          },
          "sigs": {
            "type": "array",
            "description": "a JSON array of CESR qb64 signatures over the event, one per signing key",
            "x-playnet-shape": "list"
          },
          "rotations": {
            "type": "array",
            "description": "a JSON array of the AID's rotation events after inception, each a KERI rot object",
            "x-playnet-shape": "list"
          }
        },
        "required": [
          "username",
          "email",
          "aid-prefix",
          "icp-alist",
          "sigs",
          "rotations"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "openWorldHint": false
      },
      "x-playnet-auth": "anonymous",
      "x-playnet-topic": "identity",
      "x-playnet-http": "/api/lobby/signup-with-kel"
    },
    {
      "name": "lobby.extend-kel",
      "title": "identity: extend-kel",
      "description": "Appends rotations continuing from this gateway's last held event for a witnessed AID, each verified against stored state; replies ok or (error reason). Public: a rotation proves its own authorship. [identity; callable by anyone]",
      "inputSchema": {
        "type": "object",
        "properties": {
          "aid-prefix": {
            "type": "string",
            "pattern": "^[A-Z][A-Za-z0-9_-]{43}$",
            "description": "a KERI AID prefix",
            "x-playnet-shape": "aid"
          },
          "rotations": {
            "type": "array",
            "description": "a JSON array of the AID's rotation events after inception, each a KERI rot object",
            "x-playnet-shape": "list"
          }
        },
        "required": [
          "aid-prefix",
          "rotations"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "openWorldHint": false
      },
      "x-playnet-auth": "anonymous",
      "x-playnet-topic": "identity",
      "x-playnet-http": "/api/lobby/extend-kel"
    },
    {
      "name": "lobby.witness-kel",
      "title": "identity: witness-kel",
      "description": "Records a verifiable KEL into ^oobi-host without a seat, levelling a known AID up and refusing a different history under one AID; replies ok or (error reason). Call join afterwards for a seat. [identity; callable by anyone]",
      "inputSchema": {
        "type": "object",
        "properties": {
          "aid-prefix": {
            "type": "string",
            "pattern": "^[A-Z][A-Za-z0-9_-]{43}$",
            "description": "a KERI AID prefix",
            "x-playnet-shape": "aid"
          },
          "icp-alist": {
            "type": "object",
            "additionalProperties": true,
            "description": "the AID's inception event as a JSON object (KERI icp fields, serialized)",
            "x-playnet-shape": "alist"
          },
          "sigs": {
            "type": "array",
            "description": "a JSON array of CESR qb64 signatures over the event, one per signing key",
            "x-playnet-shape": "list"
          },
          "rotations": {
            "type": "array",
            "description": "a JSON array of the AID's rotation events after inception, each a KERI rot object",
            "x-playnet-shape": "list"
          }
        },
        "required": [
          "aid-prefix",
          "icp-alist",
          "sigs",
          "rotations"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "openWorldHint": false
      },
      "x-playnet-auth": "anonymous",
      "x-playnet-topic": "identity",
      "x-playnet-http": "/api/lobby/witness-kel"
    },
    {
      "name": "lobby.join",
      "title": "identity: join",
      "description": "Grants a seat in this gateway's universal commune to an AID already witnessed in ^oobi-host (empty username mints a handle); replies ok or (error reason). The seat is what keri-authenticate checks. [identity; callable by anyone]",
      "inputSchema": {
        "type": "object",
        "properties": {
          "username": {
            "type": "string",
            "description": "the seat's login handle, a plain string chosen at signup",
            "x-playnet-shape": "string"
          },
          "email": {
            "type": "string",
            "description": "the seat's contact email, display-only on the member record",
            "x-playnet-shape": "string"
          },
          "aid-prefix": {
            "type": "string",
            "pattern": "^[A-Z][A-Za-z0-9_-]{43}$",
            "description": "a KERI AID prefix",
            "x-playnet-shape": "aid"
          }
        },
        "required": [
          "username",
          "email",
          "aid-prefix"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "openWorldHint": false
      },
      "x-playnet-auth": "anonymous",
      "x-playnet-topic": "identity",
      "x-playnet-http": "/api/lobby/join"
    },
    {
      "name": "lobby.declare-age",
      "title": "identity: declare-age",
      "description": "Declares, before a seat is taken, which age bracket the person falls in: \"child\" (under the hard floor — refused, and nothing is kept), \"teen\" (above it, below the terms' age, with a guardian's agreement) or \"adult\" (at or above the terms' age). Only the bracket is sent, never a birth date. The gateway requires a declaration by default (PLAYNET_AGE_DECLARATION=optional lifts it): signup, signup-with-icp, signup-with-kel and join refuse an AID with none; the declaration stands for an hour. Replies ok or (error reason). [identity; callable by anyone]",
      "inputSchema": {
        "type": "object",
        "properties": {
          "aid-prefix": {
            "type": "string",
            "pattern": "^[A-Z][A-Za-z0-9_-]{43}$",
            "description": "a KERI AID prefix",
            "x-playnet-shape": "aid"
          },
          "bracket": {
            "type": "string",
            "description": "the age bracket the person falls in: child (refused), teen (guardian agrees) or adult",
            "x-playnet-shape": "string"
          }
        },
        "required": [
          "aid-prefix",
          "bracket"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "openWorldHint": false
      },
      "x-playnet-auth": "anonymous",
      "x-playnet-topic": "identity",
      "x-playnet-http": "/api/lobby/declare-age"
    },
    {
      "name": "lobby.has-seat",
      "title": "identity: has-seat",
      "description": "Replies #t when the AID holds a seat on this gateway and #f otherwise, so a client can tell whether to join before authenticating. [identity; callable by anyone]",
      "inputSchema": {
        "type": "object",
        "properties": {
          "aid-prefix": {
            "type": "string",
            "pattern": "^[A-Z][A-Za-z0-9_-]{43}$",
            "description": "a KERI AID prefix",
            "x-playnet-shape": "aid"
          }
        },
        "required": [
          "aid-prefix"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "openWorldHint": false
      },
      "x-playnet-auth": "anonymous",
      "x-playnet-topic": "identity",
      "x-playnet-http": "/api/lobby/has-seat"
    },
    {
      "name": "lobby.register-oobi-replies",
      "title": "identity: register-oobi-replies",
      "description": "Attaches the AID's self-endorsed OKEA endpoint replies (/end/role/add, /loc/scheme) to its served OOBI after each frame verifies under its current key; replies ok or (error reason). [identity; callable by anyone]",
      "inputSchema": {
        "type": "object",
        "properties": {
          "aid-prefix": {
            "type": "string",
            "pattern": "^[A-Z][A-Za-z0-9_-]{43}$",
            "description": "a KERI AID prefix",
            "x-playnet-shape": "aid"
          },
          "replies": {
            "type": "array",
            "description": "a JSON array of CESR-framed OKEA endpoint reply events (/end/role/add, /loc/scheme)",
            "x-playnet-shape": "list"
          }
        },
        "required": [
          "aid-prefix",
          "replies"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "openWorldHint": false
      },
      "x-playnet-auth": "anonymous",
      "x-playnet-topic": "identity",
      "x-playnet-http": "/api/lobby/register-oobi-replies"
    },
    {
      "name": "lobby.fetch-icp",
      "title": "identity: fetch-icp",
      "description": "Replies the stored ^oobi-host entry (ICP plus rotations) for an AID, or #f when unknown, so a new browser can import the AID and unlock it with its bran, which is the only proof asked. [identity; callable by anyone]",
      "inputSchema": {
        "type": "object",
        "properties": {
          "aid-prefix": {
            "type": "string",
            "pattern": "^[A-Z][A-Za-z0-9_-]{43}$",
            "description": "a KERI AID prefix",
            "x-playnet-shape": "aid"
          }
        },
        "required": [
          "aid-prefix"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "openWorldHint": false
      },
      "x-playnet-auth": "anonymous",
      "x-playnet-topic": "identity",
      "x-playnet-http": "/api/lobby/fetch-icp"
    },
    {
      "name": "lobby.find-icp",
      "title": "identity: find-icp",
      "description": "Replies the stored ^oobi-host entry (ICP plus rotations) one of whose events carries the given qb64 key as its signing key, the earliest registered when several, or #f when none, so a browser holding only a passcode finds the log by the passcode's first key, verifies it and checks the passcode opens it. [identity; callable by anyone]",
      "inputSchema": {
        "type": "object",
        "properties": {
          "event-key": {
            "type": "string",
            "description": "a qb64 public key an identity's log carries as a signing key, in an event's k[0] — the first key a passcode derives is one",
            "x-playnet-shape": "string"
          }
        },
        "required": [
          "event-key"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "openWorldHint": false
      },
      "x-playnet-auth": "anonymous",
      "x-playnet-topic": "identity",
      "x-playnet-http": "/api/lobby/find-icp"
    },
    {
      "name": "lobby.keri-challenge",
      "title": "identity: keri-challenge",
      "description": "Auth step 1: mints a 32-byte random nonce bound to the AID prefix and replies it as hex; the nonce expires after 120 seconds and is spent on first use. [identity; callable by anyone]",
      "inputSchema": {
        "type": "object",
        "properties": {
          "aid-prefix": {
            "type": "string",
            "pattern": "^[A-Z][A-Za-z0-9_-]{43}$",
            "description": "a KERI AID prefix",
            "x-playnet-shape": "aid"
          }
        },
        "required": [
          "aid-prefix"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "openWorldHint": false
      },
      "x-playnet-auth": "anonymous",
      "x-playnet-topic": "identity",
      "x-playnet-http": "/api/lobby/keri-challenge"
    },
    {
      "name": "lobby.keri-authenticate",
      "title": "identity: keri-authenticate",
      "description": "Auth step 2: verifies the signed nonce under the AID's current key, checks the AID holds a seat, and replies (ok session) with a root-tier ^lobby-session bound to that AID, or (error reason). [identity; callable by anyone]",
      "inputSchema": {
        "type": "object",
        "properties": {
          "aid-prefix": {
            "type": "string",
            "pattern": "^[A-Z][A-Za-z0-9_-]{43}$",
            "description": "a KERI AID prefix",
            "x-playnet-shape": "aid"
          },
          "signature-qb64": {
            "type": "string",
            "description": "a CESR qb64 signature",
            "x-playnet-shape": "qb64"
          },
          "nonce": {
            "type": "string",
            "pattern": "^[0-9a-f]*$",
            "description": "the 32-byte challenge from keri-challenge as lowercase hex; expires 120 s after issue",
            "x-playnet-shape": "hex"
          }
        },
        "required": [
          "aid-prefix",
          "signature-qb64",
          "nonce"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "openWorldHint": false
      },
      "x-playnet-auth": "anonymous",
      "x-playnet-topic": "identity",
      "x-playnet-http": "/api/lobby/keri-authenticate"
    },
    {
      "name": "lobby.keri-authenticate-device",
      "title": "identity: keri-authenticate-device",
      "description": "Auth step 2 for an enrolled device: verifies the root-signed device credential, its live enrollment and the nonce signature; replies (ok session) at tier device within its doors, or an error. [identity; callable by anyone]",
      "inputSchema": {
        "type": "object",
        "properties": {
          "aid-prefix": {
            "type": "string",
            "pattern": "^[A-Z][A-Za-z0-9_-]{43}$",
            "description": "a KERI AID prefix",
            "x-playnet-shape": "aid"
          },
          "wire-json": {
            "type": "string",
            "contentMediaType": "application/json",
            "description": "a JSON document, as a string",
            "x-playnet-shape": "json"
          },
          "signature-qb64": {
            "type": "string",
            "description": "a CESR qb64 signature",
            "x-playnet-shape": "qb64"
          },
          "nonce": {
            "type": "string",
            "pattern": "^[0-9a-f]*$",
            "description": "the 32-byte challenge from keri-challenge as lowercase hex; expires 120 s after issue",
            "x-playnet-shape": "hex"
          }
        },
        "required": [
          "aid-prefix",
          "wire-json",
          "signature-qb64",
          "nonce"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "openWorldHint": false
      },
      "x-playnet-auth": "anonymous",
      "x-playnet-topic": "identity",
      "x-playnet-http": "/api/lobby/keri-authenticate-device"
    },
    {
      "name": "lobby.corpus-search",
      "title": "knowledge: corpus-search",
      "description": "Searches one corpus domain, or every built domain when domain is #f, by embedding similarity; replies ((hits . rows)) ranked by score up to limit, or ((error . reason)) when corpus search is off here. [knowledge; callable by anyone]",
      "inputSchema": {
        "type": "object",
        "properties": {
          "domain": {
            "type": "string",
            "description": "on corpus-search a corpus domain name or #f for all; on open the ballot domain (policy, recomposition, …)",
            "x-playnet-shape": "string"
          },
          "query": {
            "type": "string",
            "description": "free-text search terms",
            "x-playnet-shape": "string"
          },
          "limit": {
            "type": "integer",
            "description": "the maximum number of results to reply",
            "x-playnet-shape": "integer"
          }
        },
        "required": [
          "domain",
          "query",
          "limit"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": true,
        "openWorldHint": false
      },
      "x-playnet-auth": "anonymous",
      "x-playnet-topic": "knowledge",
      "x-playnet-http": "/api/lobby/corpus-search"
    },
    {
      "name": "lobby.corpus-domains",
      "title": "knowledge: corpus-domains",
      "description": "Replies ((domains . names)) listing the corpus domains built on this gateway, or ((error . reason)) when corpus search is off, so the corpus tab lists them without hardcoding. [knowledge; callable by anyone]",
      "inputSchema": {
        "type": "object",
        "properties": {},
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": true,
        "openWorldHint": false
      },
      "x-playnet-auth": "anonymous",
      "x-playnet-topic": "knowledge",
      "x-playnet-http": "/api/lobby/corpus-domains"
    },
    {
      "name": "lobby.leave",
      "title": "chat: leave",
      "description": "Marks a display name offline, drops it from every meeting room it was in, broadcasts the change, and replies the list of names still online. [chat; callable by anyone]",
      "inputSchema": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "description": "on announce/leave the caller's display name; on declare-place the human name of the new place; on declare-need/declare-means the row's own display name, default SPEC (need) or \"AGENT's SPEC\" (means)",
            "x-playnet-shape": "string"
          }
        },
        "required": [
          "name"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "openWorldHint": false
      },
      "x-playnet-auth": "anonymous",
      "x-playnet-topic": "chat",
      "x-playnet-http": "/api/lobby/leave"
    },
    {
      "name": "lobby.who",
      "title": "chat: who",
      "description": "Replies the display names currently announced as online on this gateway; the same read as online-users. [chat; callable by anyone]",
      "inputSchema": {
        "type": "object",
        "properties": {},
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "openWorldHint": false
      },
      "x-playnet-auth": "anonymous",
      "x-playnet-topic": "chat",
      "x-playnet-http": "/api/lobby/who"
    },
    {
      "name": "lobby.signal",
      "title": "chat: signal",
      "description": "Relays a WebRTC signalling message (offer, answer, ICE candidate) from one display name to another's inbox and replies sent, or peer-not-found when the target is offline. [chat; callable by anyone]",
      "inputSchema": {
        "type": "object",
        "properties": {
          "target-name": {
            "type": "string",
            "description": "the display name of the peer the signal or introduction is addressed to",
            "x-playnet-shape": "string"
          },
          "from-name": {
            "type": "string",
            "description": "the display name of the peer sending the signal",
            "x-playnet-shape": "string"
          },
          "signal-type": {
            "type": "string",
            "description": "the WebRTC signal kind, one of walkie-offer, walkie-answer, walkie-ice, walkie-cam (on or off: whether the sender is sending video) or invite, room-suffixed",
            "x-playnet-shape": "string"
          },
          "signal-data": {
            "type": "string",
            "contentMediaType": "application/json",
            "description": "a JSON document, as a string",
            "x-playnet-shape": "json"
          }
        },
        "required": [
          "target-name",
          "from-name",
          "signal-type",
          "signal-data"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "openWorldHint": false
      },
      "x-playnet-auth": "anonymous",
      "x-playnet-topic": "chat",
      "x-playnet-http": "/api/lobby/signal"
    },
    {
      "name": "lobby.room-roster",
      "title": "chat: room-roster",
      "description": "Replies the display names currently in a meeting room (a topic string); joining a room is an act done through the authenticated session, this door only reads. [chat; callable by anyone]",
      "inputSchema": {
        "type": "object",
        "properties": {
          "room": {
            "type": "string",
            "description": "a meeting-room topic string; its roster is who the walkie meshes over",
            "x-playnet-shape": "string"
          }
        },
        "required": [
          "room"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "openWorldHint": false
      },
      "x-playnet-auth": "anonymous",
      "x-playnet-topic": "chat",
      "x-playnet-http": "/api/lobby/room-roster"
    },
    {
      "name": "lobby.live-rooms",
      "title": "chat: live-rooms",
      "description": "Replies every meeting room with anyone in it as ((room . names) ...), the always-on index the meeting wake reads. [chat; callable by anyone]",
      "inputSchema": {
        "type": "object",
        "properties": {},
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "openWorldHint": false
      },
      "x-playnet-auth": "anonymous",
      "x-playnet-topic": "chat",
      "x-playnet-http": "/api/lobby/live-rooms"
    },
    {
      "name": "lobby.ice-servers",
      "title": "chat: ice-servers",
      "description": "Replies the ICE servers WebRTC peers find each other through, as a list of alists: \"urls\" always, \"username\" and \"credential\" when a relay wants them. The gateway's configuration decides the list; a client carries none of its own. [chat; callable by anyone]",
      "inputSchema": {
        "type": "object",
        "properties": {},
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "openWorldHint": false
      },
      "x-playnet-auth": "anonymous",
      "x-playnet-topic": "chat",
      "x-playnet-http": "/api/lobby/ice-servers"
    },
    {
      "name": "lobby.vapid-public-key",
      "title": "chat: vapid-public-key",
      "description": "Replies the web-push VAPID public key in base64, or \"\" when push is off on this gateway, so the browser knows whether to subscribe. [chat; callable by anyone]",
      "inputSchema": {
        "type": "object",
        "properties": {},
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "openWorldHint": false
      },
      "x-playnet-auth": "anonymous",
      "x-playnet-topic": "chat",
      "x-playnet-http": "/api/lobby/vapid-public-key"
    },
    {
      "name": "lobby.register-push",
      "title": "chat: register-push",
      "description": "Stores a device's web-push subscription JSON under its device id in the push store when one is configured and replies ok either way. [chat; callable by anyone]",
      "inputSchema": {
        "type": "object",
        "properties": {
          "device-id": {
            "type": "string",
            "description": "the push subscription's device identifier chosen by the browser",
            "x-playnet-shape": "id"
          },
          "subscription-json": {
            "type": "string",
            "contentMediaType": "application/json",
            "description": "a JSON document, as a string",
            "x-playnet-shape": "json"
          }
        },
        "required": [
          "device-id",
          "subscription-json"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "openWorldHint": false
      },
      "x-playnet-auth": "anonymous",
      "x-playnet-topic": "chat",
      "x-playnet-http": "/api/lobby/register-push"
    },
    {
      "name": "lobby.unregister-push",
      "title": "chat: unregister-push",
      "description": "Removes a device's web-push subscription from the push store when one is configured and replies ok either way. [chat; callable by anyone]",
      "inputSchema": {
        "type": "object",
        "properties": {
          "device-id": {
            "type": "string",
            "description": "the push subscription's device identifier chosen by the browser",
            "x-playnet-shape": "id"
          }
        },
        "required": [
          "device-id"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "openWorldHint": false
      },
      "x-playnet-auth": "anonymous",
      "x-playnet-topic": "chat",
      "x-playnet-http": "/api/lobby/unregister-push"
    },
    {
      "name": "lobby.get-mailbox",
      "title": "operations: get-mailbox",
      "description": "Answers the removed-role-gate error so an old client hears why mailbox access has no wiring; the authenticated session's mesh mailbox doors serve deliveries. [operations; callable by anyone]",
      "inputSchema": {
        "type": "object",
        "properties": {
          "identity-key": {
            "type": "string",
            "description": "a KERI AID prefix or legacy org pubkey naming the caller; the gate is removed, always errors",
            "x-playnet-shape": "string"
          }
        },
        "required": [
          "identity-key"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "openWorldHint": false
      },
      "x-playnet-auth": "anonymous",
      "x-playnet-topic": "operations",
      "x-playnet-http": "/api/lobby/get-mailbox"
    },
    {
      "name": "lobby.online-users",
      "title": "chat: online-users",
      "description": "Replies the display names connected to this gateway right now, which the contact book joins onto its online dot; presence is gateway-local. [chat; callable by anyone]",
      "inputSchema": {
        "type": "object",
        "properties": {},
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "openWorldHint": false
      },
      "x-playnet-auth": "anonymous",
      "x-playnet-topic": "chat",
      "x-playnet-http": "/api/lobby/online-users"
    },
    {
      "name": "lobby.donation-address",
      "title": "operations: donation-address",
      "description": "Replies the Monero address of the wallet this gateway is wired to, so anyone can donate toward hosting, or #f when no wallet is configured or the read fails. [operations; callable by anyone]",
      "inputSchema": {
        "type": "object",
        "properties": {},
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "openWorldHint": false
      },
      "x-playnet-auth": "anonymous",
      "x-playnet-topic": "operations",
      "x-playnet-http": "/api/lobby/donation-address"
    },
    {
      "name": "lobby.has-role?",
      "title": "governance: has-role?",
      "description": "Replies #f for every AID and role: the role-credential ceremony it read is gone, and the reply shape stays so an old client keeps working. [governance; callable by anyone]",
      "inputSchema": {
        "type": "object",
        "properties": {
          "aid-prefix": {
            "type": "string",
            "pattern": "^[A-Z][A-Za-z0-9_-]{43}$",
            "description": "a KERI AID prefix",
            "x-playnet-shape": "aid"
          },
          "role": {
            "type": "string",
            "description": "a role name; the role ceremony is removed, so has-role? always replies #f",
            "x-playnet-shape": "string"
          }
        },
        "required": [
          "aid-prefix",
          "role"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "openWorldHint": false
      },
      "x-playnet-auth": "anonymous",
      "x-playnet-topic": "governance",
      "x-playnet-http": "/api/lobby/has-role?"
    },
    {
      "name": "lobby.get-result",
      "title": "governance: get-result",
      "description": "Replies a proposal's public tally: (closed . tally-record) for a recorded ballot, (open . live-result) for one still open, or (error ...) for an unknown id. [governance; callable by anyone]",
      "inputSchema": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "on open/cast/close/get-result a proposal id; on retire-payout/settle-payout a payout intent id; on add-scope! a scope id",
            "x-playnet-shape": "id"
          }
        },
        "required": [
          "id"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "openWorldHint": false
      },
      "x-playnet-auth": "anonymous",
      "x-playnet-topic": "governance",
      "x-playnet-http": "/api/lobby/get-result"
    },
    {
      "name": "lobby.list-proposals",
      "title": "governance: list-proposals",
      "description": "Replies ((proposal-id . status) ...) for every governance proposal, status open or closed, readable without a seat. [governance; callable by anyone]",
      "inputSchema": {
        "type": "object",
        "properties": {},
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "openWorldHint": false
      },
      "x-playnet-auth": "anonymous",
      "x-playnet-topic": "governance",
      "x-playnet-http": "/api/lobby/list-proposals"
    },
    {
      "name": "session.whoami",
      "title": "identity: whoami",
      "description": "Replies the AID prefix this session cap is bound to, so the browser can check the cap it holds is the identity it expects. [identity; callable by an enrolled device]",
      "inputSchema": {
        "type": "object",
        "properties": {},
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "openWorldHint": false
      },
      "x-playnet-auth": "device",
      "x-playnet-topic": "identity",
      "x-playnet-http": "/api/session/whoami"
    },
    {
      "name": "session.leave",
      "title": "chat: leave",
      "description": "Unbinds this AID's `browser` channel from the recipient registry and tells presence NAME has left; replies presence's answer. [chat; callable by an enrolled device]",
      "inputSchema": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "description": "on announce/leave the caller's display name; on declare-place the human name of the new place; on declare-need/declare-means the row's own display name, default SPEC (need) or \"AGENT's SPEC\" (means)",
            "x-playnet-shape": "string"
          }
        },
        "required": [
          "name"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "openWorldHint": false
      },
      "x-playnet-auth": "device",
      "x-playnet-topic": "chat",
      "x-playnet-http": "/api/session/leave"
    },
    {
      "name": "session.join-room",
      "title": "chat: join-room",
      "description": "Puts this AID itself on the roster of meeting ROOM (a non-empty string) via presence, so the walkie offers it mic connections; replies presence's answer or () when nothing was joined. [chat; callable by an enrolled device]",
      "inputSchema": {
        "type": "object",
        "properties": {
          "room": {
            "type": "string",
            "description": "a meeting-room topic string; its roster is who the walkie meshes over",
            "x-playnet-shape": "string"
          }
        },
        "required": [
          "room"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "openWorldHint": false
      },
      "x-playnet-auth": "device",
      "x-playnet-topic": "chat",
      "x-playnet-http": "/api/session/join-room"
    },
    {
      "name": "session.leave-room",
      "title": "chat: leave-room",
      "description": "Takes this AID itself off the roster of meeting ROOM via presence; replies presence's answer or () when no presence or room was named. [chat; callable by an enrolled device]",
      "inputSchema": {
        "type": "object",
        "properties": {
          "room": {
            "type": "string",
            "description": "a meeting-room topic string; its roster is who the walkie meshes over",
            "x-playnet-shape": "string"
          }
        },
        "required": [
          "room"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "openWorldHint": false
      },
      "x-playnet-auth": "device",
      "x-playnet-topic": "chat",
      "x-playnet-http": "/api/session/leave-room"
    },
    {
      "name": "session.register-push",
      "title": "chat: register-push",
      "description": "Binds a `push` channel for DEVICE-ID under this AID and stores SUBSCRIPTION-JSON in the push store, so the notification router can reach this device; replies ok. [chat; callable by an enrolled device]",
      "inputSchema": {
        "type": "object",
        "properties": {
          "device-id": {
            "type": "string",
            "description": "the push subscription's device identifier chosen by the browser",
            "x-playnet-shape": "id"
          },
          "subscription-json": {
            "type": "string",
            "contentMediaType": "application/json",
            "description": "a JSON document, as a string",
            "x-playnet-shape": "json"
          }
        },
        "required": [
          "device-id",
          "subscription-json"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "openWorldHint": false
      },
      "x-playnet-auth": "device",
      "x-playnet-topic": "chat",
      "x-playnet-http": "/api/session/register-push"
    },
    {
      "name": "session.unregister-push",
      "title": "chat: unregister-push",
      "description": "Unbinds DEVICE-ID's `push` channel from this AID and drops its subscription from the push store; replies ok. [chat; callable by an enrolled device]",
      "inputSchema": {
        "type": "object",
        "properties": {
          "device-id": {
            "type": "string",
            "description": "the push subscription's device identifier chosen by the browser",
            "x-playnet-shape": "id"
          }
        },
        "required": [
          "device-id"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "openWorldHint": false
      },
      "x-playnet-auth": "device",
      "x-playnet-topic": "chat",
      "x-playnet-http": "/api/session/unregister-push"
    },
    {
      "name": "session.present-contact-point",
      "title": "identity: present-contact-point",
      "description": "Presents this AID's own contact-point credential WIRE (self-issued, blinded, signed): the commune checks it is the presenter's, of a kind it delivers on, and sends a code to the address itself. Replies (ok . pending), or an error. The channel binds on confirm-contact-point. [identity; callable by an enrolled device]",
      "inputSchema": {
        "type": "object",
        "properties": {
          "wire": {
            "type": "string",
            "contentMediaType": "application/json",
            "description": "a JSON document, as a string",
            "x-playnet-shape": "json"
          }
        },
        "required": [
          "wire"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "openWorldHint": false
      },
      "x-playnet-auth": "device",
      "x-playnet-topic": "identity",
      "x-playnet-http": "/api/session/present-contact-point"
    },
    {
      "name": "session.confirm-contact-point",
      "title": "identity: confirm-contact-point",
      "description": "Binds the presented (KIND CTX) channel under this AID when CODE is the code the commune sent to that address; replies (ok . #t), or an error for a wrong or lapsed code. [identity; callable by an enrolled device]",
      "inputSchema": {
        "type": "object",
        "properties": {
          "kind": {
            "type": "string",
            "description": "a symbol, sent as its name",
            "x-playnet-shape": "symbol"
          },
          "ctx": {
            "type": "string",
            "description": "the notification channel's destination address for KIND (an email, a push endpoint, …)",
            "x-playnet-shape": "string"
          },
          "code": {
            "type": "string",
            "description": "a label's code: the six characters a resource is known by in its scope",
            "x-playnet-shape": "string"
          }
        },
        "required": [
          "kind",
          "ctx",
          "code"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "openWorldHint": false
      },
      "x-playnet-auth": "device",
      "x-playnet-topic": "identity",
      "x-playnet-http": "/api/session/confirm-contact-point"
    },
    {
      "name": "session.withdraw-contact-point",
      "title": "identity: withdraw-contact-point",
      "description": "Erases the (KIND CTX) channel bound under this AID and puts down one still waiting for its code — the deletion path for a contact point; replies (ok . #t). [identity; callable by an enrolled device]",
      "inputSchema": {
        "type": "object",
        "properties": {
          "kind": {
            "type": "string",
            "description": "a symbol, sent as its name",
            "x-playnet-shape": "symbol"
          },
          "ctx": {
            "type": "string",
            "description": "the notification channel's destination address for KIND (an email, a push endpoint, …)",
            "x-playnet-shape": "string"
          }
        },
        "required": [
          "kind",
          "ctx"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "openWorldHint": false
      },
      "x-playnet-auth": "device",
      "x-playnet-topic": "identity",
      "x-playnet-http": "/api/session/withdraw-contact-point"
    },
    {
      "name": "session.present-acceptance",
      "title": "identity: present-acceptance",
      "description": "Presents this AID's own acceptance credential WIRE (self-issued, blinded, signed): that on a date it accepted a version of the terms and privacy notice (kind terms), or consented to a political opinion being recorded against it (kind vote-opinion). The operator checks it is the presenter's own and holds the latest of each kind as the evidence Art 7(1) asks the controller to be able to produce; replies (ok . version), or an error. [identity; callable by an enrolled device]",
      "inputSchema": {
        "type": "object",
        "properties": {
          "wire": {
            "type": "string",
            "contentMediaType": "application/json",
            "description": "a JSON document, as a string",
            "x-playnet-shape": "json"
          }
        },
        "required": [
          "wire"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "openWorldHint": false
      },
      "x-playnet-auth": "device",
      "x-playnet-topic": "identity",
      "x-playnet-http": "/api/session/present-acceptance"
    },
    {
      "name": "session.withdraw-acceptance",
      "title": "identity: withdraw-acceptance",
      "description": "Withdraws this AID's acceptance of KIND (terms or vote-opinion): the operator's record of it is erased, as easily as it was given (Art 7(3)); replies (ok . #t) when one stood, (ok . #f) when none did. [identity; callable by an enrolled device]",
      "inputSchema": {
        "type": "object",
        "properties": {
          "kind": {
            "type": "string",
            "description": "a symbol, sent as its name",
            "x-playnet-shape": "symbol"
          }
        },
        "required": [
          "kind"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "openWorldHint": false
      },
      "x-playnet-auth": "device",
      "x-playnet-topic": "identity",
      "x-playnet-http": "/api/session/withdraw-acceptance"
    },
    {
      "name": "session.my-acceptance",
      "title": "identity: my-acceptance",
      "description": "The acceptances the operator holds for this AID, one per kind: (kind version accepted-at said). The signed credential itself stays with the operator; this is the reading. [identity; callable by an enrolled device]",
      "inputSchema": {
        "type": "object",
        "properties": {},
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "openWorldHint": false
      },
      "x-playnet-auth": "device",
      "x-playnet-topic": "identity",
      "x-playnet-http": "/api/session/my-acceptance"
    },
    {
      "name": "session.my-contact-points",
      "title": "identity: my-contact-points",
      "description": "Replies ((delivers . kinds) (points . rows)): the kinds this commune delivers on, and this AID's durable channels as (kind ctx state) with state bound or pending. Live browser and push bindings, which reconnects rebuild, stay out. [identity; callable by an enrolled device]",
      "inputSchema": {
        "type": "object",
        "properties": {},
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "openWorldHint": false
      },
      "x-playnet-auth": "device",
      "x-playnet-topic": "identity",
      "x-playnet-http": "/api/session/my-contact-points"
    },
    {
      "name": "session.sync-contacts",
      "title": "chat: sync-contacts",
      "description": "Stores DATA as the server-side backup of this AID's browser-held contact book (512 KiB cap); replies ok or an error with the failure. [chat; callable by an enrolled device]",
      "inputSchema": {
        "type": "object",
        "properties": {
          "data": {
            "type": "string",
            "contentMediaType": "application/json",
            "description": "a JSON document, as a string",
            "x-playnet-shape": "json"
          }
        },
        "required": [
          "data"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "openWorldHint": false
      },
      "x-playnet-auth": "device",
      "x-playnet-topic": "chat",
      "x-playnet-http": "/api/session/sync-contacts"
    },
    {
      "name": "session.list-contacts",
      "title": "chat: list-contacts",
      "description": "Replies the server-side backup of this AID's contact book as stored by sync-contacts, or () when none is held. [chat; callable by an enrolled device]",
      "inputSchema": {
        "type": "object",
        "properties": {},
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "openWorldHint": false
      },
      "x-playnet-auth": "device",
      "x-playnet-topic": "chat",
      "x-playnet-http": "/api/session/list-contacts"
    },
    {
      "name": "session.sync-log",
      "title": "commitments: sync-log",
      "description": "Stores DATA, the browser's opaque JSON captain's log, as this AID's server-side backup; replies ok or an error with the failure. [commitments; callable by an enrolled device]",
      "inputSchema": {
        "type": "object",
        "properties": {
          "data": {
            "type": "string",
            "contentMediaType": "application/json",
            "description": "a JSON document, as a string",
            "x-playnet-shape": "json"
          }
        },
        "required": [
          "data"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "openWorldHint": false
      },
      "x-playnet-auth": "device",
      "x-playnet-topic": "commitments",
      "x-playnet-http": "/api/session/sync-log"
    },
    {
      "name": "session.list-log",
      "title": "commitments: list-log",
      "description": "Replies this AID's captain's log backup as the opaque JSON string sync-log stored, or \"\" when none is held. [commitments; callable by an enrolled device]",
      "inputSchema": {
        "type": "object",
        "properties": {},
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "openWorldHint": false
      },
      "x-playnet-auth": "device",
      "x-playnet-topic": "commitments",
      "x-playnet-http": "/api/session/list-log"
    },
    {
      "name": "session.sync-pins",
      "title": "slots: sync-pins",
      "description": "Stores DATA as this AID's pin book backup and folds the lists marked shared into the scope's `^pins` aggregator; replies ok or an error with the failure. [slots; callable by an enrolled device]",
      "inputSchema": {
        "type": "object",
        "properties": {
          "data": {
            "type": "string",
            "contentMediaType": "application/json",
            "description": "a JSON document, as a string",
            "x-playnet-shape": "json"
          }
        },
        "required": [
          "data"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "openWorldHint": false
      },
      "x-playnet-auth": "device",
      "x-playnet-topic": "slots",
      "x-playnet-http": "/api/session/sync-pins"
    },
    {
      "name": "session.list-pins",
      "title": "slots: list-pins",
      "description": "Replies this AID's pin book as the JSON string sync-pins stored, or \"\" when none is held. [slots; callable by an enrolled device]",
      "inputSchema": {
        "type": "object",
        "properties": {},
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "openWorldHint": false
      },
      "x-playnet-auth": "device",
      "x-playnet-topic": "slots",
      "x-playnet-http": "/api/session/list-pins"
    },
    {
      "name": "session.our-pin-lists",
      "title": "slots: our-pin-lists",
      "description": "Lists the commune's shared pin lists read off the `^pins` fold, or () when no pin fold is wired. [slots; callable by an enrolled device]",
      "inputSchema": {
        "type": "object",
        "properties": {},
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "openWorldHint": false
      },
      "x-playnet-auth": "device",
      "x-playnet-topic": "slots",
      "x-playnet-http": "/api/session/our-pin-lists"
    },
    {
      "name": "session.our-pins",
      "title": "slots: our-pins",
      "description": "Replies the members of one shared pin list LIST-ID read off the `^pins` fold, or () when no pin fold is wired. [slots; callable by an enrolled device]",
      "inputSchema": {
        "type": "object",
        "properties": {
          "list-id": {
            "type": "string",
            "description": "the id of one shared pin list off the ^pins fold",
            "x-playnet-shape": "id"
          }
        },
        "required": [
          "list-id"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "openWorldHint": false
      },
      "x-playnet-auth": "device",
      "x-playnet-topic": "slots",
      "x-playnet-http": "/api/session/our-pins"
    },
    {
      "name": "session.sync-taxonomy",
      "title": "knowledge: sync-taxonomy",
      "description": "Stores DATA as this AID's taxonomy cut and contributes it to the scope's folksonomy aggregator, since publishing a cut is voting; replies ok or an error. [knowledge; callable by an enrolled device]",
      "inputSchema": {
        "type": "object",
        "properties": {
          "data": {
            "type": "string",
            "contentMediaType": "application/json",
            "description": "a JSON document, as a string",
            "x-playnet-shape": "json"
          }
        },
        "required": [
          "data"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": true,
        "openWorldHint": false
      },
      "x-playnet-auth": "device",
      "x-playnet-topic": "knowledge",
      "x-playnet-http": "/api/session/sync-taxonomy"
    },
    {
      "name": "session.list-taxonomy",
      "title": "knowledge: list-taxonomy",
      "description": "Replies this AID's published taxonomy cut as stored by sync-taxonomy, or () when none is held. [knowledge; callable by an enrolled device]",
      "inputSchema": {
        "type": "object",
        "properties": {},
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": true,
        "openWorldHint": false
      },
      "x-playnet-auth": "device",
      "x-playnet-topic": "knowledge",
      "x-playnet-http": "/api/session/list-taxonomy"
    },
    {
      "name": "session.folksonomy-template",
      "title": "knowledge: folksonomy-template",
      "description": "Replies the commune's aggregated taxonomy cut as a {id,label,children,count} template, weighted toward LENS (a name resolved against this AID's own contact book) when given, or the global cut. [knowledge; callable by an enrolled device]",
      "inputSchema": {
        "type": "object",
        "properties": {
          "lens": {
            "type": "string",
            "description": "a named cut of the taxonomy, resolved against this AID's own contact book; absent = the global cut",
            "x-playnet-shape": "string"
          }
        },
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": true,
        "openWorldHint": false
      },
      "x-playnet-auth": "device",
      "x-playnet-topic": "knowledge",
      "x-playnet-http": "/api/session/folksonomy-template"
    },
    {
      "name": "session.adopt-lens",
      "title": "knowledge: adopt-lens",
      "description": "Resolves LENS's (or, absent, the global) aggregated cut server-side, flattens it to structure edges and publishes it as this AID's own taxonomy cut; replies ok, or () when no folksonomy is wired. [knowledge; callable by an enrolled device]",
      "inputSchema": {
        "type": "object",
        "properties": {
          "lens": {
            "type": "string",
            "description": "a named cut of the taxonomy, resolved against this AID's own contact book; absent = the global cut",
            "x-playnet-shape": "string"
          }
        },
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": true,
        "openWorldHint": false
      },
      "x-playnet-auth": "device",
      "x-playnet-topic": "knowledge",
      "x-playnet-http": "/api/session/adopt-lens"
    },
    {
      "name": "session.profile",
      "title": "identity: profile",
      "description": "Replies this AID's member record as an alist of username, display-name and email, or #f when the AID holds no seat. [identity; callable by an enrolled device]",
      "inputSchema": {
        "type": "object",
        "properties": {},
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "openWorldHint": false
      },
      "x-playnet-auth": "device",
      "x-playnet-topic": "identity",
      "x-playnet-http": "/api/session/profile"
    },
    {
      "name": "session.update-profile",
      "title": "identity: update-profile",
      "description": "Sets this AID's own DISPLAY-NAME and EMAIL on its member record, validating a non-empty email; replies ok or an error. [identity; callable by an enrolled device]",
      "inputSchema": {
        "type": "object",
        "properties": {
          "display-name": {
            "type": "string",
            "description": "the profile's display name shown to others",
            "x-playnet-shape": "string"
          },
          "email": {
            "type": "string",
            "description": "the seat's contact email, display-only on the member record",
            "x-playnet-shape": "string"
          }
        },
        "required": [
          "display-name",
          "email"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "openWorldHint": false
      },
      "x-playnet-auth": "device",
      "x-playnet-topic": "identity",
      "x-playnet-http": "/api/session/update-profile"
    },
    {
      "name": "session.fp-status",
      "title": "identity: fp-status",
      "description": "Replies (ok . alist) with this AID's personhood standing in SCOPE-ID: person, governor, whether personhood is bootstrapped, and the verified count. [identity; callable by an enrolled device]",
      "inputSchema": {
        "type": "object",
        "properties": {
          "scope-id": {
            "type": "string",
            "description": "a scope (commune) id",
            "x-playnet-shape": "scope-id"
          }
        },
        "required": [
          "scope-id"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "openWorldHint": false
      },
      "x-playnet-auth": "device",
      "x-playnet-topic": "identity",
      "x-playnet-http": "/api/session/fp-status"
    },
    {
      "name": "session.fp-vouch",
      "title": "identity: fp-vouch",
      "description": "Issues an unsigned relationship credential from this AID for SUBJECT-AID with relation REL, ending prior vouches; replies (ok . #t) or an error. Prefer fp-vouch-signed when the browser can sign. [identity; callable by an enrolled device]",
      "inputSchema": {
        "type": "object",
        "properties": {
          "scope-id": {
            "type": "string",
            "description": "a scope (commune) id",
            "x-playnet-shape": "scope-id"
          },
          "subject-aid": {
            "type": "string",
            "pattern": "^[A-Z][A-Za-z0-9_-]{43}$",
            "description": "a KERI AID prefix",
            "x-playnet-shape": "aid"
          },
          "rel": {
            "type": "string",
            "description": "a symbol, sent as its name",
            "x-playnet-shape": "symbol"
          }
        },
        "required": [
          "scope-id",
          "subject-aid",
          "rel"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "openWorldHint": false
      },
      "x-playnet-auth": "device",
      "x-playnet-topic": "identity",
      "x-playnet-http": "/api/session/fp-vouch"
    },
    {
      "name": "session.fp-vouch-preimage",
      "title": "identity: fp-vouch-preimage",
      "description": "Replies (ok fields), the SAID-relevant fields of the relationship credential this AID would issue for SUBJECT-AID at AT, so the browser re-derives the SAID and signs it for fp-vouch-signed. [identity; callable by an enrolled device]",
      "inputSchema": {
        "type": "object",
        "properties": {
          "scope-id": {
            "type": "string",
            "description": "a scope (commune) id",
            "x-playnet-shape": "scope-id"
          },
          "subject-aid": {
            "type": "string",
            "pattern": "^[A-Z][A-Za-z0-9_-]{43}$",
            "description": "a KERI AID prefix",
            "x-playnet-shape": "aid"
          },
          "rel": {
            "type": "string",
            "description": "a symbol, sent as its name",
            "x-playnet-shape": "symbol"
          },
          "at": {
            "type": "string",
            "format": "date-time",
            "description": "civil ISO 8601 at the boundary",
            "x-playnet-shape": "instant"
          }
        },
        "required": [
          "scope-id",
          "subject-aid",
          "rel",
          "at"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "openWorldHint": false
      },
      "x-playnet-auth": "device",
      "x-playnet-topic": "identity",
      "x-playnet-http": "/api/session/fp-vouch-preimage"
    },
    {
      "name": "session.fp-vouch-signed",
      "title": "identity: fp-vouch-signed",
      "description": "Rebuilds the vouch from the same wire args, verifies SIGNATURE is this AID's own, ends prior vouches for SUBJECT-AID and issues it; replies (ok said) or an error. [identity; callable by an enrolled device]",
      "inputSchema": {
        "type": "object",
        "properties": {
          "scope-id": {
            "type": "string",
            "description": "a scope (commune) id",
            "x-playnet-shape": "scope-id"
          },
          "subject-aid": {
            "type": "string",
            "pattern": "^[A-Z][A-Za-z0-9_-]{43}$",
            "description": "a KERI AID prefix",
            "x-playnet-shape": "aid"
          },
          "rel": {
            "type": "string",
            "description": "a symbol, sent as its name",
            "x-playnet-shape": "symbol"
          },
          "at": {
            "type": "string",
            "format": "date-time",
            "description": "civil ISO 8601 at the boundary",
            "x-playnet-shape": "instant"
          },
          "signature": {
            "type": "string",
            "description": "a CESR qb64 signature",
            "x-playnet-shape": "qb64"
          }
        },
        "required": [
          "scope-id",
          "subject-aid",
          "rel",
          "at",
          "signature"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "openWorldHint": false
      },
      "x-playnet-auth": "device",
      "x-playnet-topic": "identity",
      "x-playnet-http": "/api/session/fp-vouch-signed"
    },
    {
      "name": "session.fp-withdraw-vouch",
      "title": "identity: fp-withdraw-vouch",
      "description": "Ends every standing vouch from this AID for SUBJECT-AID; the vouch is the voucher's own to end. Replies (ok . #t), also when none stood. [identity; callable by an enrolled device]",
      "inputSchema": {
        "type": "object",
        "properties": {
          "scope-id": {
            "type": "string",
            "description": "a scope (commune) id",
            "x-playnet-shape": "scope-id"
          },
          "subject-aid": {
            "type": "string",
            "pattern": "^[A-Z][A-Za-z0-9_-]{43}$",
            "description": "a KERI AID prefix",
            "x-playnet-shape": "aid"
          }
        },
        "required": [
          "scope-id",
          "subject-aid"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "openWorldHint": false
      },
      "x-playnet-auth": "device",
      "x-playnet-topic": "identity",
      "x-playnet-http": "/api/session/fp-withdraw-vouch"
    },
    {
      "name": "session.relationships",
      "title": "identity: relationships",
      "description": "Replies (ok . rows), one row per person in this AID's contact book: whether they are recognised, the kind this AID's standing vouch for them states (mine), the kind theirs for this AID states (theirs), and their open ask to be recognised in SCOPE-ID. A row names only what stands between the two. [identity; callable by an enrolled device]",
      "inputSchema": {
        "type": "object",
        "properties": {
          "scope-id": {
            "type": "string",
            "description": "a scope (commune) id",
            "x-playnet-shape": "scope-id"
          }
        },
        "required": [
          "scope-id"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "openWorldHint": false
      },
      "x-playnet-auth": "device",
      "x-playnet-topic": "identity",
      "x-playnet-http": "/api/session/relationships"
    },
    {
      "name": "session.give-card",
      "title": "identity: give-card",
      "description": "Keeps this AID's card for SUBJECT-AID, someone in its contacts: WIRE is {from,to,at,sealed,said,sig}, its content sealed to the receiver and its identifier signed by the giver. The commune checks the signature and keeps the ciphertext, in place of any earlier card to that person. Replies (ok . #t) or an error. [identity; callable by an enrolled device]",
      "inputSchema": {
        "type": "object",
        "properties": {
          "subject-aid": {
            "type": "string",
            "pattern": "^[A-Z][A-Za-z0-9_-]{43}$",
            "description": "a KERI AID prefix",
            "x-playnet-shape": "aid"
          },
          "wire": {
            "type": "string",
            "contentMediaType": "application/json",
            "description": "a JSON document, as a string",
            "x-playnet-shape": "json"
          }
        },
        "required": [
          "subject-aid",
          "wire"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "openWorldHint": false
      },
      "x-playnet-auth": "device",
      "x-playnet-topic": "identity",
      "x-playnet-http": "/api/session/give-card"
    },
    {
      "name": "session.withdraw-card",
      "title": "identity: withdraw-card",
      "description": "Erases this AID's card for SUBJECT-AID; replies (ok . #t), also when none stood. [identity; callable by an enrolled device]",
      "inputSchema": {
        "type": "object",
        "properties": {
          "subject-aid": {
            "type": "string",
            "pattern": "^[A-Z][A-Za-z0-9_-]{43}$",
            "description": "a KERI AID prefix",
            "x-playnet-shape": "aid"
          }
        },
        "required": [
          "subject-aid"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "openWorldHint": false
      },
      "x-playnet-auth": "device",
      "x-playnet-topic": "identity",
      "x-playnet-http": "/api/session/withdraw-card"
    },
    {
      "name": "session.cards",
      "title": "identity: cards",
      "description": "Replies (ok . rows), one row per person in this AID's contact book with a card either way: the card they gave (its wire, sealed to this AID) and when this AID's own card to them was made. [identity; callable by an enrolled device]",
      "inputSchema": {
        "type": "object",
        "properties": {},
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "openWorldHint": false
      },
      "x-playnet-auth": "device",
      "x-playnet-topic": "identity",
      "x-playnet-http": "/api/session/cards"
    },
    {
      "name": "session.fp-request-enroll",
      "title": "identity: fp-request-enroll",
      "description": "Opens this AID's own enrollment ceremony in SCOPE-ID's ecosystem at the policy's quorum, durable on every witness rail; replies (ok . #t) or an error when already recognised. [identity; callable by an enrolled device]",
      "inputSchema": {
        "type": "object",
        "properties": {
          "scope-id": {
            "type": "string",
            "description": "a scope (commune) id",
            "x-playnet-shape": "scope-id"
          }
        },
        "required": [
          "scope-id"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "openWorldHint": false
      },
      "x-playnet-auth": "device",
      "x-playnet-topic": "identity",
      "x-playnet-http": "/api/session/fp-request-enroll"
    },
    {
      "name": "session.fp-pending",
      "title": "identity: fp-pending",
      "description": "Replies (ok . rows), the standing enrollment asks in SCOPE-ID's ecosystem with each candidate's progress and vouchers, after expiring stale ones. [identity; callable by an enrolled device]",
      "inputSchema": {
        "type": "object",
        "properties": {
          "scope-id": {
            "type": "string",
            "description": "a scope (commune) id",
            "x-playnet-shape": "scope-id"
          }
        },
        "required": [
          "scope-id"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "openWorldHint": false
      },
      "x-playnet-auth": "device",
      "x-playnet-topic": "identity",
      "x-playnet-http": "/api/session/fp-pending"
    },
    {
      "name": "session.fp-my-ceremony",
      "title": "identity: fp-my-ceremony",
      "description": "Replies (ok . alist) with this AID's own ask: state none, collecting (count, quorum, witnesses, vouchers) or finalized. [identity; callable by an enrolled device]",
      "inputSchema": {
        "type": "object",
        "properties": {
          "scope-id": {
            "type": "string",
            "description": "a scope (commune) id",
            "x-playnet-shape": "scope-id"
          }
        },
        "required": [
          "scope-id"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "openWorldHint": false
      },
      "x-playnet-auth": "device",
      "x-playnet-topic": "identity",
      "x-playnet-http": "/api/session/fp-my-ceremony"
    },
    {
      "name": "session.fp-grant",
      "title": "identity: fp-grant",
      "description": "The genesis act: a governor issues personhood to CANDIDATE-AID in an ecosystem where nobody is recognised yet; replies (ok . #t) or an error once personhood is bootstrapped. [identity; callable by an enrolled device]",
      "inputSchema": {
        "type": "object",
        "properties": {
          "scope-id": {
            "type": "string",
            "description": "a scope (commune) id",
            "x-playnet-shape": "scope-id"
          },
          "candidate-aid": {
            "type": "string",
            "pattern": "^[A-Z][A-Za-z0-9_-]{43}$",
            "description": "a KERI AID prefix",
            "x-playnet-shape": "aid"
          }
        },
        "required": [
          "scope-id",
          "candidate-aid"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "openWorldHint": false
      },
      "x-playnet-auth": "device",
      "x-playnet-topic": "identity",
      "x-playnet-http": "/api/session/fp-grant"
    },
    {
      "name": "session.fp-open-ceremony",
      "title": "identity: fp-open-ceremony",
      "description": "A recognised person introduces CANDIDATE-AID by opening their enrollment ceremony at the ecosystem's quorum with this AID as sponsor (K is ignored); replies (ok . #t) or an error. [identity; callable by an enrolled device]",
      "inputSchema": {
        "type": "object",
        "properties": {
          "scope-id": {
            "type": "string",
            "description": "a scope (commune) id",
            "x-playnet-shape": "scope-id"
          },
          "candidate-aid": {
            "type": "string",
            "pattern": "^[A-Z][A-Za-z0-9_-]{43}$",
            "description": "a KERI AID prefix",
            "x-playnet-shape": "aid"
          },
          "k": {
            "type": "integer",
            "description": "a requested quorum count; ignored, the ecosystem's own personhood quorum applies",
            "x-playnet-shape": "integer"
          }
        },
        "required": [
          "scope-id",
          "candidate-aid",
          "k"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "openWorldHint": false
      },
      "x-playnet-auth": "device",
      "x-playnet-topic": "identity",
      "x-playnet-http": "/api/session/fp-open-ceremony"
    },
    {
      "name": "session.my-phc",
      "title": "identity: my-phc",
      "description": "Replies (ok . wire), this AID's live personhood credential as a portable card with the issuer's signature, or (ok . #f) when the AID holds none. [identity; callable by an enrolled device]",
      "inputSchema": {
        "type": "object",
        "properties": {},
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "openWorldHint": false
      },
      "x-playnet-auth": "device",
      "x-playnet-topic": "identity",
      "x-playnet-http": "/api/session/my-phc"
    },
    {
      "name": "session.present-phc",
      "title": "identity: present-phc",
      "description": "Verifies a personhood credential WIRE from another gateway (holder is this AID, issuer signature, trusted issuer) and imports it; replies (ok . #t) or an error. present-bundle takes a whole bundle. [identity; callable by an enrolled device]",
      "inputSchema": {
        "type": "object",
        "properties": {
          "wire": {
            "type": "string",
            "contentMediaType": "application/json",
            "description": "a JSON document, as a string",
            "x-playnet-shape": "json"
          }
        },
        "required": [
          "wire"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "openWorldHint": false
      },
      "x-playnet-auth": "device",
      "x-playnet-topic": "identity",
      "x-playnet-http": "/api/session/present-phc"
    },
    {
      "name": "session.my-vouches",
      "title": "identity: my-vouches",
      "description": "Replies (ok . json), the portable bundle this AID carries to another gateway: personhoods, vouches, issuer blessings and key logs, or \"\" when there is nothing to carry. [identity; callable by an enrolled device]",
      "inputSchema": {
        "type": "object",
        "properties": {},
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "openWorldHint": false
      },
      "x-playnet-auth": "device",
      "x-playnet-topic": "identity",
      "x-playnet-http": "/api/session/my-vouches"
    },
    {
      "name": "session.present-bundle",
      "title": "identity: present-bundle",
      "description": "Verifies a bundle WIRE from elsewhere in dependency order and imports it only when every card stands; replies (ok . newly-imported) or an error. [identity; callable by an enrolled device]",
      "inputSchema": {
        "type": "object",
        "properties": {
          "wire": {
            "type": "string",
            "contentMediaType": "application/json",
            "description": "a JSON document, as a string",
            "x-playnet-shape": "json"
          }
        },
        "required": [
          "wire"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "openWorldHint": false
      },
      "x-playnet-auth": "device",
      "x-playnet-topic": "identity",
      "x-playnet-http": "/api/session/present-bundle"
    },
    {
      "name": "session.sync-credentials",
      "title": "identity: sync-credentials",
      "description": "Stores DATA, the browser's bran-sealed credential blob the gateway cannot read, as this AID's zero-knowledge backup; replies ok or an error. [identity; callable by an enrolled device]",
      "inputSchema": {
        "type": "object",
        "properties": {
          "data": {
            "type": "string",
            "contentMediaType": "application/json",
            "description": "a JSON document, as a string",
            "x-playnet-shape": "json"
          }
        },
        "required": [
          "data"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "openWorldHint": false
      },
      "x-playnet-auth": "device",
      "x-playnet-topic": "identity",
      "x-playnet-http": "/api/session/sync-credentials"
    },
    {
      "name": "session.list-credential-backups",
      "title": "identity: list-credential-backups",
      "description": "Replies the sealed credential backup blob sync-credentials stored for this AID, which the browser decrypts client-side on a fresh device, or () when none is held. [identity; callable by an enrolled device]",
      "inputSchema": {
        "type": "object",
        "properties": {},
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "openWorldHint": false
      },
      "x-playnet-auth": "device",
      "x-playnet-topic": "identity",
      "x-playnet-http": "/api/session/list-credential-backups"
    },
    {
      "name": "session.tier",
      "title": "identity: tier",
      "description": "Replies root or device: whether the passcode key or an enrolled device key proved this session. [identity; callable by an enrolled device]",
      "inputSchema": {
        "type": "object",
        "properties": {},
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "openWorldHint": false
      },
      "x-playnet-auth": "device",
      "x-playnet-topic": "identity",
      "x-playnet-http": "/api/session/tier"
    },
    {
      "name": "session.my-devices",
      "title": "identity: my-devices",
      "description": "Lists the devices this AID's root has authorized, each as a wire alist. [identity; callable by an enrolled device]",
      "inputSchema": {
        "type": "object",
        "properties": {},
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "openWorldHint": false
      },
      "x-playnet-auth": "device",
      "x-playnet-topic": "identity",
      "x-playnet-http": "/api/session/my-devices"
    },
    {
      "name": "session.revoke-device",
      "title": "identity: revoke-device",
      "description": "Retires the device credential SAID from this AID's registry from either tier, so a lost phone is revoked from the laptop; replies ok or an error when no such device exists. [identity; callable by an enrolled device]",
      "inputSchema": {
        "type": "object",
        "properties": {
          "said": {
            "type": "string",
            "pattern": "^[A-Z][A-Za-z0-9_-]{43}$",
            "description": "a SAID",
            "x-playnet-shape": "said"
          }
        },
        "required": [
          "said"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "openWorldHint": false
      },
      "x-playnet-auth": "device",
      "x-playnet-topic": "identity",
      "x-playnet-http": "/api/session/revoke-device"
    },
    {
      "name": "session.relay-announce!",
      "title": "chat: relay-announce!",
      "description": "Verifies a browser-signed Reticulum announce PACKET-HEX against this AID's KEL-anchored mesh pubkey, registers its destination and forwards it under a 30-per-60 s budget; replies ok or an error. [chat; callable by an enrolled device]",
      "inputSchema": {
        "type": "object",
        "properties": {
          "packet-hex": {
            "type": "string",
            "pattern": "^[0-9a-f]*$",
            "description": "a signed Reticulum announce or DATA packet as lowercase hex bytes",
            "x-playnet-shape": "hex"
          }
        },
        "required": [
          "packet-hex"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "openWorldHint": false
      },
      "x-playnet-auth": "device",
      "x-playnet-topic": "chat",
      "x-playnet-http": "/api/session/relay-announce!"
    },
    {
      "name": "session.send-mesh-packet!",
      "title": "chat: send-mesh-packet!",
      "description": "Transmits a browser-composed mesh DATA packet PACKET-HEX through the bridge under the same 30-per-60 s budget, refusing any other packet type; replies ok or an error. [chat; callable by an enrolled device]",
      "inputSchema": {
        "type": "object",
        "properties": {
          "packet-hex": {
            "type": "string",
            "pattern": "^[0-9a-f]*$",
            "description": "a signed Reticulum announce or DATA packet as lowercase hex bytes",
            "x-playnet-shape": "hex"
          }
        },
        "required": [
          "packet-hex"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "openWorldHint": false
      },
      "x-playnet-auth": "device",
      "x-playnet-topic": "chat",
      "x-playnet-http": "/api/session/send-mesh-packet!"
    },
    {
      "name": "session.drain-mesh-mailbox",
      "title": "chat: drain-mesh-mailbox",
      "description": "Drains the ciphertext held for every destination derived from this AID's KEL-anchored mesh pubkey; replies ((dest-hex . #(payload-hex ...)) ...) with only non-empty mailboxes. [chat; callable by an enrolled device]",
      "inputSchema": {
        "type": "object",
        "properties": {},
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "openWorldHint": false
      },
      "x-playnet-auth": "device",
      "x-playnet-topic": "chat",
      "x-playnet-http": "/api/session/drain-mesh-mailbox"
    },
    {
      "name": "session.list-credentials",
      "title": "identity: list-credentials",
      "description": "Lists the credentials in this gateway's own store whose holder is this AID, or () when no store is wired. [identity; callable by an enrolled device]",
      "inputSchema": {
        "type": "object",
        "properties": {},
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "openWorldHint": false
      },
      "x-playnet-auth": "device",
      "x-playnet-topic": "identity",
      "x-playnet-http": "/api/session/list-credentials"
    },
    {
      "name": "session.issue-credential",
      "title": "identity: issue-credential",
      "description": "Issues an ACDC this AID authored (issuer must match the caller) into this gateway's store; refuses unless the caller holds governor standing. Replies the credential's SAID, or an error. [identity; callable by an enrolled device]",
      "inputSchema": {
        "type": "object",
        "properties": {
          "cred-alist-raw": {
            "type": "object",
            "additionalProperties": true,
            "description": "a browser-built, browser-signed ACDC as a JSON object; issuance gate is removed, always errors",
            "x-playnet-shape": "alist"
          }
        },
        "required": [
          "cred-alist-raw"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "openWorldHint": false
      },
      "x-playnet-auth": "device",
      "x-playnet-topic": "identity",
      "x-playnet-http": "/api/session/issue-credential"
    },
    {
      "name": "session.revoke-credential",
      "title": "identity: revoke-credential",
      "description": "Revokes the credential named by SAID; refuses unless the caller holds governor standing. Governance may revoke any credential by policy, not only ones it issued itself. [identity; callable by an enrolled device]",
      "inputSchema": {
        "type": "object",
        "properties": {
          "said": {
            "type": "string",
            "pattern": "^[A-Z][A-Za-z0-9_-]{43}$",
            "description": "a SAID",
            "x-playnet-shape": "said"
          }
        },
        "required": [
          "said"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "openWorldHint": false
      },
      "x-playnet-auth": "device",
      "x-playnet-topic": "identity",
      "x-playnet-http": "/api/session/revoke-credential"
    },
    {
      "name": "session.open",
      "title": "governance: open",
      "description": "Opens a ballot or expression proposal ID in DOMAIN under FRANCHISE as this governor AID, snapshotting voice weights; TARGET-IDS is required when KIND is expression (the distribution's own targets), ignored for a ballot; SUBJECT is an optional \"kind:id\" the forum resolves against. Replies (ok id) or an error when the id is already open or closed. [governance; callable by an enrolled device]",
      "inputSchema": {
        "type": "object",
        "properties": {
          "kind": {
            "type": "string",
            "description": "a symbol, sent as its name",
            "x-playnet-shape": "symbol"
          },
          "domain": {
            "type": "string",
            "description": "on corpus-search a corpus domain name or #f for all; on open the ballot domain (policy, recomposition, …)",
            "x-playnet-shape": "string"
          },
          "id": {
            "type": "string",
            "description": "on open/cast/close/get-result a proposal id; on retire-payout/settle-payout a payout intent id; on add-scope! a scope id",
            "x-playnet-shape": "id"
          },
          "description": {
            "type": "string",
            "description": "the proposal's human-readable description",
            "x-playnet-shape": "string"
          },
          "franchise": {
            "type": "string",
            "description": "who votes: the symbol federation, or the list (scope SCOPE-ID)",
            "x-playnet-shape": "string"
          },
          "target-ids": {
            "type": "string",
            "contentMediaType": "application/json",
            "description": "a JSON document, as a string",
            "x-playnet-shape": "json"
          },
          "subject": {
            "type": "string",
            "description": "a \"kind:id\" string the forum resolves an open proposal against, e.g. \"recipe:bread\"",
            "x-playnet-shape": "string"
          }
        },
        "required": [
          "kind",
          "domain",
          "id",
          "description",
          "franchise"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "openWorldHint": false
      },
      "x-playnet-auth": "device",
      "x-playnet-topic": "governance",
      "x-playnet-http": "/api/session/open"
    },
    {
      "name": "session.cast",
      "title": "governance: cast",
      "description": "Casts this AID's unsigned stance ARG on proposal ID and issues a stance credential; replies ok or an error. Use cast-signed when the client can sign. [governance; callable by an enrolled device]",
      "inputSchema": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "on open/cast/close/get-result a proposal id; on retire-payout/settle-payout a payout intent id; on add-scope! a scope id",
            "x-playnet-shape": "id"
          },
          "arg": {
            "type": "string",
            "description": "the legacy stance: a position symbol (yes, no, …) for a ballot, a distribution map for an expression",
            "x-playnet-shape": "string"
          }
        },
        "required": [
          "id",
          "arg"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "openWorldHint": false
      },
      "x-playnet-auth": "device",
      "x-playnet-topic": "governance",
      "x-playnet-http": "/api/session/cast"
    },
    {
      "name": "session.stance-preimage",
      "title": "governance: stance-preimage",
      "description": "Replies (ok fields), the SAID fields of the stance credential this AID would cast on ID with POSITION, so the client re-derives the SAID and signs it for cast-signed. [governance; callable by an enrolled device]",
      "inputSchema": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "on open/cast/close/get-result a proposal id; on retire-payout/settle-payout a payout intent id; on add-scope! a scope id",
            "x-playnet-shape": "id"
          },
          "position": {
            "type": "string",
            "description": "the ballot position the caller takes, sent as a symbol name such as yes or no",
            "x-playnet-shape": "string"
          }
        },
        "required": [
          "id",
          "position"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "openWorldHint": false
      },
      "x-playnet-auth": "device",
      "x-playnet-topic": "governance",
      "x-playnet-http": "/api/session/stance-preimage"
    },
    {
      "name": "session.cast-signed",
      "title": "governance: cast-signed",
      "description": "Casts POSITION on ID under the client's own signature over the stance-preimage fields, U echoed back from stance-preimage's own claims, verified against this AID's current KEL key (resolved server-side, never a caller argument); replies ok or an error, including when U is missing. [governance; callable by an enrolled device]",
      "inputSchema": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "on open/cast/close/get-result a proposal id; on retire-payout/settle-payout a payout intent id; on add-scope! a scope id",
            "x-playnet-shape": "id"
          },
          "position": {
            "type": "string",
            "description": "the ballot position the caller takes, sent as a symbol name such as yes or no",
            "x-playnet-shape": "string"
          },
          "timestamp": {
            "type": "string",
            "format": "date-time",
            "description": "civil ISO 8601 at the boundary",
            "x-playnet-shape": "instant"
          },
          "signature": {
            "type": "string",
            "description": "a CESR qb64 signature",
            "x-playnet-shape": "qb64"
          },
          "u": {
            "type": "string",
            "description": "a CESR qb64 signature",
            "x-playnet-shape": "qb64"
          }
        },
        "required": [
          "id",
          "position",
          "timestamp",
          "signature",
          "u"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "openWorldHint": false
      },
      "x-playnet-auth": "device",
      "x-playnet-topic": "governance",
      "x-playnet-http": "/api/session/cast-signed"
    },
    {
      "name": "session.part-stance-preimage",
      "title": "governance: part-stance-preimage",
      "description": "Replies (ok fields), the SAID fields of the plan-part stance credential this AID would cast on SCOPE-ID with HAND-JSON, a JSON object of part-string (parts.scm grammar, e.g. \"process=bake;place=town\") to a signed portion in [-1, 1]; the client re-derives the SAID and signs it for cast-part-signed. [governance; callable by an enrolled device]",
      "inputSchema": {
        "type": "object",
        "properties": {
          "scope-id": {
            "type": "string",
            "description": "a scope (commune) id",
            "x-playnet-shape": "scope-id"
          },
          "hand-json": {
            "type": "string",
            "contentMediaType": "application/json",
            "description": "a JSON document, as a string",
            "x-playnet-shape": "json"
          }
        },
        "required": [
          "scope-id",
          "hand-json"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "openWorldHint": false
      },
      "x-playnet-auth": "device",
      "x-playnet-topic": "governance",
      "x-playnet-http": "/api/session/part-stance-preimage"
    },
    {
      "name": "session.cast-part-signed",
      "title": "governance: cast-part-signed",
      "description": "Casts this AID's HAND of stances on parts of SCOPE-ID's plan under the client's own signature over the part-stance-preimage fields (U echoed back), revokes the AID's previous hand there, and hands the scope's standing hands to the planner's voice fold; replies ok or an error. docs/planning/voice/voice-follows-work.md. [governance; callable by an enrolled device]",
      "inputSchema": {
        "type": "object",
        "properties": {
          "scope-id": {
            "type": "string",
            "description": "a scope (commune) id",
            "x-playnet-shape": "scope-id"
          },
          "hand-json": {
            "type": "string",
            "contentMediaType": "application/json",
            "description": "a JSON document, as a string",
            "x-playnet-shape": "json"
          },
          "timestamp": {
            "type": "string",
            "format": "date-time",
            "description": "civil ISO 8601 at the boundary",
            "x-playnet-shape": "instant"
          },
          "signature": {
            "type": "string",
            "description": "a CESR qb64 signature",
            "x-playnet-shape": "qb64"
          },
          "u": {
            "type": "string",
            "description": "a CESR qb64 signature",
            "x-playnet-shape": "qb64"
          }
        },
        "required": [
          "scope-id",
          "hand-json",
          "timestamp",
          "signature",
          "u"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "openWorldHint": false
      },
      "x-playnet-auth": "device",
      "x-playnet-topic": "governance",
      "x-playnet-http": "/api/session/cast-part-signed"
    },
    {
      "name": "session.declare-span",
      "title": "custody: declare-span",
      "description": "Declares, for SCOPE-AID and as one of its governors, that RESOURCE-ID's service pool stands at PLACE (a span declaration, issuer = holder = the scope, live until UNTIL when given); a solve reads the standing declarations through the consent gate (a foreign place needs the host's hosting willingness). Replies (ok said) or an error. [custody; callable by an enrolled device]",
      "inputSchema": {
        "type": "object",
        "properties": {
          "scope-aid": {
            "type": "string",
            "pattern": "^[A-Z][A-Za-z0-9_-]{43}$",
            "description": "a KERI AID prefix",
            "x-playnet-shape": "aid"
          },
          "resource-id": {
            "type": "string",
            "description": "an economic-resource id in the scope (own-means: the titled thing; claim/resource-detail: the good)",
            "x-playnet-shape": "id"
          },
          "place": {
            "type": "string",
            "description": "a place id or name",
            "x-playnet-shape": "place"
          },
          "until": {
            "type": "string",
            "format": "date-time",
            "description": "civil ISO 8601 at the boundary",
            "x-playnet-shape": "instant"
          }
        },
        "required": [
          "scope-aid",
          "resource-id",
          "place"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "openWorldHint": false
      },
      "x-playnet-auth": "device",
      "x-playnet-topic": "custody",
      "x-playnet-http": "/api/session/declare-span"
    },
    {
      "name": "session.admit-commune",
      "title": "governance: admit-commune",
      "description": "Admits the commune COMMUNE-AID into the federation FEDERATION-AID this gateway holds, at the sturdyref its peer answers at, as one of the federation's governors (the federation's own ladder decides whether it recognises the caller, and its governance policy may require the commune's consent as RATIFICATION, a SAID). The goods that cross are not named: the commune tells the federation what it deals in. Replies ok or an error. [governance; callable by an enrolled device]",
      "inputSchema": {
        "type": "object",
        "properties": {
          "federation-aid": {
            "type": "string",
            "pattern": "^[A-Z][A-Za-z0-9_-]{43}$",
            "description": "a KERI AID prefix",
            "x-playnet-shape": "aid"
          },
          "commune-aid": {
            "type": "string",
            "pattern": "^[A-Z][A-Za-z0-9_-]{43}$",
            "description": "a KERI AID prefix",
            "x-playnet-shape": "aid"
          },
          "sturdyref-uri": {
            "type": "string",
            "description": "the sturdyref the commune's peer answers at, an ocapn:// URI",
            "x-playnet-shape": "string"
          },
          "ratification": {
            "type": "string",
            "pattern": "^[A-Z][A-Za-z0-9_-]{43}$",
            "description": "a SAID",
            "x-playnet-shape": "said"
          }
        },
        "required": [
          "federation-aid",
          "commune-aid",
          "sturdyref-uri"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "openWorldHint": false
      },
      "x-playnet-auth": "device",
      "x-playnet-topic": "governance",
      "x-playnet-http": "/api/session/admit-commune"
    },
    {
      "name": "session.remove-commune",
      "title": "governance: remove-commune",
      "description": "Removes the commune COMMUNE-AID from the federation FEDERATION-AID this gateway holds, as one of the federation's governors and under its governance policy (RATIFICATION, a SAID a close of type remove-commune naming the commune minted, when the policy requires one): every credential the federation granted the commune and the censuses it told are revoked, and the departure is written as one credential the commune holds — REASON, the removal ballot's own question, and what the commune's subtree summed to in the federation's folds at that instant. Replies (ok departure-said) or an error. [governance; callable by an enrolled device]",
      "inputSchema": {
        "type": "object",
        "properties": {
          "federation-aid": {
            "type": "string",
            "pattern": "^[A-Z][A-Za-z0-9_-]{43}$",
            "description": "a KERI AID prefix",
            "x-playnet-shape": "aid"
          },
          "commune-aid": {
            "type": "string",
            "pattern": "^[A-Z][A-Za-z0-9_-]{43}$",
            "description": "a KERI AID prefix",
            "x-playnet-shape": "aid"
          },
          "reason": {
            "type": "string",
            "x-playnet-shape": "string"
          },
          "ratification": {
            "type": "string",
            "pattern": "^[A-Z][A-Za-z0-9_-]{43}$",
            "description": "a SAID",
            "x-playnet-shape": "said"
          }
        },
        "required": [
          "federation-aid",
          "commune-aid"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "openWorldHint": false
      },
      "x-playnet-auth": "device",
      "x-playnet-topic": "governance",
      "x-playnet-http": "/api/session/remove-commune"
    },
    {
      "name": "session.rejoin-federation",
      "title": "governance: rejoin-federation",
      "description": "Moves the commune COMMUNE-AID from OLD-FEDERATION-AID to NEW-FEDERATION-AID, both held here, in one act: the overlap with the new federation's members is checked first, then the old federation releases the commune (remove-commune, with REASON and RELEASE-RATIFICATION), the new admits it at STURDYREF-URI (with ADMIT-RATIFICATION), and the commune attests the move (with REJOIN-RATIFICATION). Replies (ok departure-said), or an error naming the half that did not happen. [governance; callable by an enrolled device]",
      "inputSchema": {
        "type": "object",
        "properties": {
          "commune-aid": {
            "type": "string",
            "pattern": "^[A-Z][A-Za-z0-9_-]{43}$",
            "description": "a KERI AID prefix",
            "x-playnet-shape": "aid"
          },
          "old-federation-aid": {
            "type": "string",
            "pattern": "^[A-Z][A-Za-z0-9_-]{43}$",
            "description": "a KERI AID prefix",
            "x-playnet-shape": "aid"
          },
          "new-federation-aid": {
            "type": "string",
            "pattern": "^[A-Z][A-Za-z0-9_-]{43}$",
            "description": "a KERI AID prefix",
            "x-playnet-shape": "aid"
          },
          "sturdyref-uri": {
            "type": "string",
            "description": "the sturdyref the commune's peer answers at, an ocapn:// URI",
            "x-playnet-shape": "string"
          },
          "reason": {
            "type": "string",
            "x-playnet-shape": "string"
          },
          "release-ratification": {
            "type": "string",
            "pattern": "^[A-Z][A-Za-z0-9_-]{43}$",
            "description": "a SAID",
            "x-playnet-shape": "said"
          },
          "admit-ratification": {
            "type": "string",
            "pattern": "^[A-Z][A-Za-z0-9_-]{43}$",
            "description": "a SAID",
            "x-playnet-shape": "said"
          },
          "rejoin-ratification": {
            "type": "string",
            "pattern": "^[A-Z][A-Za-z0-9_-]{43}$",
            "description": "a SAID",
            "x-playnet-shape": "said"
          }
        },
        "required": [
          "commune-aid",
          "old-federation-aid",
          "new-federation-aid",
          "sturdyref-uri"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "openWorldHint": false
      },
      "x-playnet-auth": "device",
      "x-playnet-topic": "governance",
      "x-playnet-http": "/api/session/rejoin-federation"
    },
    {
      "name": "session.declare-hosting",
      "title": "custody: declare-hosting",
      "description": "Declares, for SCOPE-AID and as one of its governors, its willingness to host pools of RESOURCE-SPEC up to CEILING unit-hours a day (hosting willingness, live until UNTIL when given): the consent a foreign span into this scope's places needs, and the ceiling the means consensus binds. Replies (ok said) or an error. [custody; callable by an enrolled device]",
      "inputSchema": {
        "type": "object",
        "properties": {
          "scope-aid": {
            "type": "string",
            "pattern": "^[A-Z][A-Za-z0-9_-]{43}$",
            "description": "a KERI AID prefix",
            "x-playnet-shape": "aid"
          },
          "resource-spec": {
            "type": "string",
            "description": "a resource-specification id",
            "x-playnet-shape": "spec"
          },
          "ceiling": {
            "type": "number",
            "description": "the most unit-hours a day this scope will host of RESOURCE-SPEC, a positive number",
            "x-playnet-shape": "number"
          },
          "until": {
            "type": "string",
            "format": "date-time",
            "description": "civil ISO 8601 at the boundary",
            "x-playnet-shape": "instant"
          }
        },
        "required": [
          "scope-aid",
          "resource-spec",
          "ceiling"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "openWorldHint": false
      },
      "x-playnet-auth": "device",
      "x-playnet-topic": "custody",
      "x-playnet-http": "/api/session/declare-hosting"
    },
    {
      "name": "session.claim-regime",
      "title": "planning: claim-regime",
      "description": "Claims, for SCOPE-AID and as one of its governors, the regime of DOMAIN-SPEC (a recipe id): TAILS thin|fat|unknown and PROCESS stable|shifting|unknown. Thin and stable together license statistics in that domain's standing (recipe-standing live-regime-of); anything else reads probability-free. Replies (ok said) or an error. [planning; callable by an enrolled device]",
      "inputSchema": {
        "type": "object",
        "properties": {
          "scope-aid": {
            "type": "string",
            "pattern": "^[A-Z][A-Za-z0-9_-]{43}$",
            "description": "a KERI AID prefix",
            "x-playnet-shape": "aid"
          },
          "domain-spec": {
            "type": "string",
            "description": "a resource-specification id",
            "x-playnet-shape": "spec"
          },
          "tails": {
            "type": "string",
            "description": "a symbol, sent as its name",
            "x-playnet-shape": "symbol"
          },
          "process": {
            "type": "string",
            "x-playnet-shape": "id"
          },
          "until": {
            "type": "string",
            "format": "date-time",
            "description": "civil ISO 8601 at the boundary",
            "x-playnet-shape": "instant"
          }
        },
        "required": [
          "scope-aid",
          "domain-spec",
          "tails",
          "process"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "openWorldHint": false
      },
      "x-playnet-auth": "device",
      "x-playnet-topic": "planning",
      "x-playnet-http": "/api/session/claim-regime"
    },
    {
      "name": "session.declare-means",
      "title": "slots: declare-means",
      "description": "Seeds or edits this AID's owned resource `means:AID:SPEC` in SCOPE-ID with qty, unit, location and the optionals; replies (ok . resource-id). [slots; callable by an enrolled device]",
      "inputSchema": {
        "type": "object",
        "properties": {
          "scope-id": {
            "type": "string",
            "description": "a scope (commune) id",
            "x-playnet-shape": "scope-id"
          },
          "spec": {
            "type": "string",
            "description": "a resource-specification id",
            "x-playnet-shape": "spec"
          },
          "qty": {
            "type": "number",
            "description": "the quantity of SPEC in UNIT, a positive number",
            "x-playnet-shape": "number"
          },
          "unit": {
            "type": "string",
            "description": "a unit symbol, e.g. kg, h, each",
            "x-playnet-shape": "unit"
          },
          "location": {
            "type": "string",
            "description": "a place id or name",
            "x-playnet-shape": "place"
          },
          "arcs-json": {
            "type": "string",
            "contentMediaType": "application/json",
            "description": "a JSON document, as a string",
            "x-playnet-shape": "json"
          },
          "note": {
            "type": "string",
            "description": "a free-text note recorded on the row or event",
            "x-playnet-shape": "string"
          },
          "emoji": {
            "type": "string",
            "description": "an emoji string shown on the need slot",
            "x-playnet-shape": "string"
          },
          "name": {
            "type": "string",
            "description": "on announce/leave the caller's display name; on declare-place the human name of the new place; on declare-need/declare-means the row's own display name, default SPEC (need) or \"AGENT's SPEC\" (means)",
            "x-playnet-shape": "string"
          },
          "cats-json": {
            "type": "string",
            "contentMediaType": "application/json",
            "description": "a JSON document, as a string",
            "x-playnet-shape": "json"
          },
          "criteria-json": {
            "type": "string",
            "contentMediaType": "application/json",
            "description": "a JSON document, as a string",
            "x-playnet-shape": "json"
          }
        },
        "required": [
          "scope-id",
          "spec",
          "qty",
          "unit",
          "location"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "openWorldHint": false
      },
      "x-playnet-auth": "device",
      "x-playnet-topic": "slots",
      "x-playnet-http": "/api/session/declare-means"
    },
    {
      "name": "session.declare-need",
      "title": "slots: declare-need",
      "description": "Declares or edits this AID's standing need intent `need:AID:SPEC` in SCOPE-ID with window, note, emoji, bounds and the optionals; replies (ok (id . intent-id)) or an error. [slots; callable by an enrolled device]",
      "inputSchema": {
        "type": "object",
        "properties": {
          "scope-id": {
            "type": "string",
            "description": "a scope (commune) id",
            "x-playnet-shape": "scope-id"
          },
          "spec": {
            "type": "string",
            "description": "a resource-specification id",
            "x-playnet-shape": "spec"
          },
          "qty": {
            "type": "number",
            "description": "the quantity of SPEC in UNIT, a positive number",
            "x-playnet-shape": "number"
          },
          "unit": {
            "type": "string",
            "description": "a unit symbol, e.g. kg, h, each",
            "x-playnet-shape": "unit"
          },
          "location": {
            "type": "string",
            "description": "a place id or name",
            "x-playnet-shape": "place"
          },
          "arcs-json": {
            "type": "string",
            "contentMediaType": "application/json",
            "description": "a JSON document, as a string",
            "x-playnet-shape": "json"
          },
          "note": {
            "type": "string",
            "description": "a free-text note recorded on the row or event",
            "x-playnet-shape": "string"
          },
          "emoji": {
            "type": "string",
            "description": "an emoji string shown on the need slot",
            "x-playnet-shape": "string"
          },
          "from": {
            "type": "string",
            "format": "date-time",
            "description": "civil ISO 8601 at the boundary",
            "x-playnet-shape": "instant"
          },
          "until": {
            "type": "string",
            "format": "date-time",
            "description": "civil ISO 8601 at the boundary",
            "x-playnet-shape": "instant"
          },
          "name": {
            "type": "string",
            "description": "on announce/leave the caller's display name; on declare-place the human name of the new place; on declare-need/declare-means the row's own display name, default SPEC (need) or \"AGENT's SPEC\" (means)",
            "x-playnet-shape": "string"
          },
          "cats-json": {
            "type": "string",
            "contentMediaType": "application/json",
            "description": "a JSON document, as a string",
            "x-playnet-shape": "json"
          },
          "criteria-json": {
            "type": "string",
            "contentMediaType": "application/json",
            "description": "a JSON document, as a string",
            "x-playnet-shape": "json"
          },
          "need-kind": {
            "type": "string",
            "description": "under the reserved prefix, the need's own reproduction kind: floor, held or des (default des); called tension in older clients",
            "x-playnet-shape": "string"
          },
          "voice": {
            "type": "number",
            "description": "the attached voice mass on a need's own kind claim, a number; default 0",
            "x-playnet-shape": "number"
          }
        },
        "required": [
          "scope-id",
          "spec",
          "qty",
          "unit",
          "location",
          "arcs-json",
          "note",
          "emoji",
          "from",
          "until"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "openWorldHint": false
      },
      "x-playnet-auth": "device",
      "x-playnet-topic": "slots",
      "x-playnet-http": "/api/session/declare-need"
    },
    {
      "name": "session.need-displacement",
      "title": "planning: need-displacement",
      "description": "Replies what QTY of SPEC currently displaces elsewhere in SCOPE-ID's plan, read off the last solve's duals with the honesty radius; nothing re-solves and an unsolved scope reads nothing. [planning; callable by an enrolled device]",
      "inputSchema": {
        "type": "object",
        "properties": {
          "scope-id": {
            "type": "string",
            "description": "a scope (commune) id",
            "x-playnet-shape": "scope-id"
          },
          "spec": {
            "type": "string",
            "description": "a resource-specification id",
            "x-playnet-shape": "spec"
          },
          "qty": {
            "type": "number",
            "description": "the quantity of SPEC in UNIT, a positive number",
            "x-playnet-shape": "number"
          }
        },
        "required": [
          "scope-id",
          "spec",
          "qty"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "openWorldHint": false
      },
      "x-playnet-auth": "device",
      "x-playnet-topic": "planning",
      "x-playnet-http": "/api/session/need-displacement"
    },
    {
      "name": "session.externality-history",
      "title": "planning: externality-history",
      "description": "Replies SCOPE-ID's burn meter: the externality display accumulated one snapshot per solve, summarized as its moved-distribution. [planning; callable by an enrolled device]",
      "inputSchema": {
        "type": "object",
        "properties": {
          "scope-id": {
            "type": "string",
            "description": "a scope (commune) id",
            "x-playnet-shape": "scope-id"
          }
        },
        "required": [
          "scope-id"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "openWorldHint": false
      },
      "x-playnet-auth": "device",
      "x-playnet-topic": "planning",
      "x-playnet-http": "/api/session/externality-history"
    },
    {
      "name": "session.ratify-kind",
      "title": "planning: ratify-kind",
      "description": "Records that SCOPE-ID ratifies SPEC as KIND (floor or held) under this AID's name, or withdraws the grant with des; replies (ok (spec kind)). [planning; callable by an enrolled device]",
      "inputSchema": {
        "type": "object",
        "properties": {
          "scope-id": {
            "type": "string",
            "description": "a scope (commune) id",
            "x-playnet-shape": "scope-id"
          },
          "spec": {
            "type": "string",
            "description": "a resource-specification id",
            "x-playnet-shape": "spec"
          },
          "kind": {
            "type": "string",
            "description": "a symbol, sent as its name",
            "x-playnet-shape": "symbol"
          }
        },
        "required": [
          "scope-id",
          "spec",
          "kind"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "openWorldHint": false
      },
      "x-playnet-auth": "device",
      "x-playnet-topic": "planning",
      "x-playnet-http": "/api/session/ratify-kind"
    },
    {
      "name": "session.ratified-kinds",
      "title": "planning: ratified-kinds",
      "description": "Replies SCOPE-ID's ratification grants as rows of spec, kind, by and at. [planning; callable by an enrolled device]",
      "inputSchema": {
        "type": "object",
        "properties": {
          "scope-id": {
            "type": "string",
            "description": "a scope (commune) id",
            "x-playnet-shape": "scope-id"
          }
        },
        "required": [
          "scope-id"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "openWorldHint": false
      },
      "x-playnet-auth": "device",
      "x-playnet-topic": "planning",
      "x-playnet-http": "/api/session/ratified-kinds"
    },
    {
      "name": "session.audit-kinds",
      "title": "planning: audit-kinds",
      "description": "Audits SCOPE-ID's held and floor need rows against what their citizens actually took, withdrawing padded grants and recording every verdict under this AID; OPTIONS may carry consequence-factor and tolerance overrides. Replies examined, padded and findings. [planning; callable by an enrolled device]",
      "inputSchema": {
        "type": "object",
        "properties": {
          "scope-id": {
            "type": "string",
            "description": "a scope (commune) id",
            "x-playnet-shape": "scope-id"
          },
          "options": {
            "type": "object",
            "additionalProperties": true,
            "description": "an audit's overrides for this one run as a JSON object: consequence-factor and tolerance; absent, the scope's governed audit-consequence-factor and audit-tolerance",
            "x-playnet-shape": "alist"
          }
        },
        "required": [
          "scope-id"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "openWorldHint": false
      },
      "x-playnet-auth": "device",
      "x-playnet-topic": "planning",
      "x-playnet-http": "/api/session/audit-kinds"
    },
    {
      "name": "session.audits",
      "title": "planning: audits",
      "description": "Replies SCOPE-ID's recorded audit findings from the plan-store's audits meta. [planning; callable by an enrolled device]",
      "inputSchema": {
        "type": "object",
        "properties": {
          "scope-id": {
            "type": "string",
            "description": "a scope (commune) id",
            "x-playnet-shape": "scope-id"
          }
        },
        "required": [
          "scope-id"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "openWorldHint": false
      },
      "x-playnet-auth": "device",
      "x-playnet-topic": "planning",
      "x-playnet-http": "/api/session/audits"
    },
    {
      "name": "session.my-slots",
      "title": "slots: my-slots",
      "description": "Replies this AID's own standing needs and non-retired means in SCOPE-ID as (needs means) rows with qty, unit, place, note, emoji and window arcs. [slots; callable by an enrolled device]",
      "inputSchema": {
        "type": "object",
        "properties": {
          "scope-id": {
            "type": "string",
            "description": "a scope (commune) id",
            "x-playnet-shape": "scope-id"
          }
        },
        "required": [
          "scope-id"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "openWorldHint": false
      },
      "x-playnet-auth": "device",
      "x-playnet-topic": "slots",
      "x-playnet-http": "/api/session/my-slots"
    },
    {
      "name": "session.our-slots",
      "title": "slots: our-slots",
      "description": "Replies the fold's reading at SCOPE-ID, needs and means summed per cell with nobody named, each carrying `mine`, this AID's own share joined from HOME-SCOPE-ID. [slots; callable by an enrolled device]",
      "inputSchema": {
        "type": "object",
        "properties": {
          "scope-id": {
            "type": "string",
            "description": "a scope (commune) id",
            "x-playnet-shape": "scope-id"
          },
          "home-scope-id": {
            "type": "string",
            "description": "a scope (commune) id",
            "x-playnet-shape": "scope-id"
          }
        },
        "required": [
          "scope-id",
          "home-scope-id"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "openWorldHint": false
      },
      "x-playnet-auth": "device",
      "x-playnet-topic": "slots",
      "x-playnet-http": "/api/session/our-slots"
    },
    {
      "name": "session.my-agenda",
      "title": "slots: my-agenda",
      "description": "Replies this AID's planned work rows over every scope on the roster, by the clock, as (rows): scope, id, proc, spec, label, at, when, until, effort and the day-grid clock. [slots; callable by an enrolled device]",
      "inputSchema": {
        "type": "object",
        "properties": {
          "scope-id": {
            "type": "string",
            "description": "a scope (commune) id",
            "x-playnet-shape": "scope-id"
          }
        },
        "required": [
          "scope-id"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "openWorldHint": false
      },
      "x-playnet-auth": "device",
      "x-playnet-topic": "slots",
      "x-playnet-http": "/api/session/my-agenda"
    },
    {
      "name": "session.my-agenda-ics",
      "title": "slots: my-agenda-ics",
      "description": "Replies the same rows as one iCalendar feed, (ics . text): a VEVENT per row, the projection of the agenda R17 names. [slots; callable by an enrolled device]",
      "inputSchema": {
        "type": "object",
        "properties": {
          "scope-id": {
            "type": "string",
            "description": "a scope (commune) id",
            "x-playnet-shape": "scope-id"
          }
        },
        "required": [
          "scope-id"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "openWorldHint": false
      },
      "x-playnet-auth": "device",
      "x-playnet-topic": "slots",
      "x-playnet-http": "/api/session/my-agenda-ics"
    },
    {
      "name": "session.retire-need",
      "title": "slots: retire-need",
      "description": "Withdraws this AID's standing need for SPEC in SCOPE-ID by removing the intent entirely; replies (ok . intent-id). [slots; callable by an enrolled device]",
      "inputSchema": {
        "type": "object",
        "properties": {
          "scope-id": {
            "type": "string",
            "description": "a scope (commune) id",
            "x-playnet-shape": "scope-id"
          },
          "spec": {
            "type": "string",
            "description": "a resource-specification id",
            "x-playnet-shape": "spec"
          }
        },
        "required": [
          "scope-id",
          "spec"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "openWorldHint": false
      },
      "x-playnet-auth": "device",
      "x-playnet-topic": "slots",
      "x-playnet-http": "/api/session/retire-need"
    },
    {
      "name": "session.retire-means",
      "title": "slots: retire-means",
      "description": "Withdraws this AID's offer of SPEC in SCOPE-ID by lowering the means to zero, keeping the record and its history; replies (ok . resource-id). [slots; callable by an enrolled device]",
      "inputSchema": {
        "type": "object",
        "properties": {
          "scope-id": {
            "type": "string",
            "description": "a scope (commune) id",
            "x-playnet-shape": "scope-id"
          },
          "spec": {
            "type": "string",
            "description": "a resource-specification id",
            "x-playnet-shape": "spec"
          }
        },
        "required": [
          "scope-id",
          "spec"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "openWorldHint": false
      },
      "x-playnet-auth": "device",
      "x-playnet-topic": "slots",
      "x-playnet-http": "/api/session/retire-means"
    },
    {
      "name": "session.request-payout",
      "title": "stock: request-payout",
      "description": "Records this AID's standing intent to have the commons send XMR of its claim to ADDRESS by DUE, checked against what is available; replies (ok (id available)) or an error. [stock; callable by an enrolled device]",
      "inputSchema": {
        "type": "object",
        "properties": {
          "scope-id": {
            "type": "string",
            "description": "a scope (commune) id",
            "x-playnet-shape": "scope-id"
          },
          "address": {
            "type": "string",
            "description": "the external Monero address the payout is sent to",
            "x-playnet-shape": "string"
          },
          "xmr": {
            "type": "number",
            "description": "the amount of XMR to send, a number in whole monero",
            "x-playnet-shape": "number"
          },
          "due": {
            "type": "string",
            "format": "date-time",
            "description": "civil ISO 8601 at the boundary",
            "x-playnet-shape": "instant"
          },
          "note": {
            "type": "string",
            "description": "a free-text note recorded on the row or event",
            "x-playnet-shape": "string"
          }
        },
        "required": [
          "scope-id",
          "address",
          "xmr",
          "due",
          "note"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "openWorldHint": false
      },
      "x-playnet-auth": "device",
      "x-playnet-topic": "stock",
      "x-playnet-http": "/api/session/request-payout"
    },
    {
      "name": "session.my-payouts",
      "title": "stock: my-payouts",
      "description": "Replies this AID's payout standing in SCOPE-ID: available claim, what the commons owes it, and its payout intents with state. [stock; callable by an enrolled device]",
      "inputSchema": {
        "type": "object",
        "properties": {
          "scope-id": {
            "type": "string",
            "description": "a scope (commune) id",
            "x-playnet-shape": "scope-id"
          }
        },
        "required": [
          "scope-id"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "openWorldHint": false
      },
      "x-playnet-auth": "device",
      "x-playnet-topic": "stock",
      "x-playnet-http": "/api/session/my-payouts"
    },
    {
      "name": "session.scope-readings",
      "title": "stock: scope-readings",
      "description": "What every source says of SPEC in SCOPE-ID: the reading fold's rows, drift and freshest reading (planner scope-readings), for the inventory face. [stock; callable by an enrolled device]",
      "inputSchema": {
        "type": "object",
        "properties": {
          "scope-id": {
            "type": "string",
            "description": "a scope (commune) id",
            "x-playnet-shape": "scope-id"
          },
          "spec": {
            "type": "string",
            "description": "a resource-specification id",
            "x-playnet-shape": "spec"
          }
        },
        "required": [
          "scope-id",
          "spec"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "openWorldHint": false
      },
      "x-playnet-auth": "device",
      "x-playnet-topic": "stock",
      "x-playnet-http": "/api/session/scope-readings"
    },
    {
      "name": "session.readings-between",
      "title": "stock: readings-between",
      "description": "What every source reported of SPEC in SCOPE-ID between FROM and UNTIL (ISO-8601, an empty string leaves an end open): one row per reading in time order, and their fold (planner readings-between), for the inventory face's history line. [stock; callable by an enrolled device]",
      "inputSchema": {
        "type": "object",
        "properties": {
          "scope-id": {
            "type": "string",
            "description": "a scope (commune) id",
            "x-playnet-shape": "scope-id"
          },
          "spec": {
            "type": "string",
            "description": "a resource-specification id",
            "x-playnet-shape": "spec"
          },
          "from": {
            "type": "string",
            "format": "date-time",
            "description": "civil ISO 8601 at the boundary",
            "x-playnet-shape": "instant"
          },
          "until": {
            "type": "string",
            "format": "date-time",
            "description": "civil ISO 8601 at the boundary",
            "x-playnet-shape": "instant"
          }
        },
        "required": [
          "scope-id",
          "spec",
          "from",
          "until"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "openWorldHint": false
      },
      "x-playnet-auth": "device",
      "x-playnet-topic": "stock",
      "x-playnet-http": "/api/session/readings-between"
    },
    {
      "name": "session.my-claims",
      "title": "stock: my-claims",
      "description": "Replies this AID's order book in SCOPE-ID: each want as asked (no row yet), held (the plan's claim commitment, with what remains) or taken, priced at the good's crystallized SNLT. [stock; callable by an enrolled device]",
      "inputSchema": {
        "type": "object",
        "properties": {
          "scope-id": {
            "type": "string",
            "description": "a scope (commune) id",
            "x-playnet-shape": "scope-id"
          }
        },
        "required": [
          "scope-id"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "openWorldHint": false
      },
      "x-playnet-auth": "device",
      "x-playnet-topic": "stock",
      "x-playnet-http": "/api/session/my-claims"
    },
    {
      "name": "session.my-credit-history",
      "title": "stock: my-credit-history",
      "description": "Replies this AID's credit as a dated account in SCOPE-ID, newest first: work earned, work waiting out its validation window, hours drawn by claims, and acts the log backed out — each with its hours, so earned less drawn is the certificate's balance. [stock; callable by an enrolled device]",
      "inputSchema": {
        "type": "object",
        "properties": {
          "scope-id": {
            "type": "string",
            "description": "a scope (commune) id",
            "x-playnet-shape": "scope-id"
          }
        },
        "required": [
          "scope-id"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "openWorldHint": false
      },
      "x-playnet-auth": "device",
      "x-playnet-topic": "stock",
      "x-playnet-http": "/api/session/my-credit-history"
    },
    {
      "name": "session.retire-payout",
      "title": "stock: retire-payout",
      "description": "Cancels this AID's own pending payout intent ID in SCOPE-ID; replies (ok (id)) or an error when it is settled or belongs to someone else. [stock; callable by an enrolled device]",
      "inputSchema": {
        "type": "object",
        "properties": {
          "scope-id": {
            "type": "string",
            "description": "a scope (commune) id",
            "x-playnet-shape": "scope-id"
          },
          "id": {
            "type": "string",
            "description": "on open/cast/close/get-result a proposal id; on retire-payout/settle-payout a payout intent id; on add-scope! a scope id",
            "x-playnet-shape": "id"
          }
        },
        "required": [
          "scope-id",
          "id"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "openWorldHint": false
      },
      "x-playnet-auth": "device",
      "x-playnet-topic": "stock",
      "x-playnet-http": "/api/session/retire-payout"
    },
    {
      "name": "session.record-purchase",
      "title": "stock: record-purchase",
      "description": "Raises QTY of SPEC bought or donated by this AID for the commons, linked to any planned commitment it fulfils; replies resource and event ids plus cost, money-spec and planned? unless it was a gift. [stock; callable by an enrolled device]",
      "inputSchema": {
        "type": "object",
        "properties": {
          "scope-id": {
            "type": "string",
            "description": "a scope (commune) id",
            "x-playnet-shape": "scope-id"
          },
          "spec": {
            "type": "string",
            "description": "a resource-specification id",
            "x-playnet-shape": "spec"
          },
          "qty": {
            "type": "number",
            "description": "the quantity of SPEC in UNIT, a positive number",
            "x-playnet-shape": "number"
          },
          "unit": {
            "type": "string",
            "description": "a unit symbol, e.g. kg, h, each",
            "x-playnet-shape": "unit"
          },
          "money-spec": {
            "type": "string",
            "description": "a resource-specification id",
            "x-playnet-shape": "spec"
          },
          "cost": {
            "type": "number",
            "description": "what the purchase cost in MONEY-SPEC units, a number; 0 only when donated",
            "x-playnet-shape": "number"
          },
          "where": {
            "type": "string",
            "description": "a place id or name",
            "x-playnet-shape": "place"
          },
          "note": {
            "type": "string",
            "description": "a free-text note recorded on the row or event",
            "x-playnet-shape": "string"
          },
          "receipt": {
            "type": "string",
            "description": "a receipt reference string for the purchase, \"\" when none",
            "x-playnet-shape": "string"
          },
          "donation?": {
            "type": "boolean",
            "description": "#t when the purchase was donated to the commons and nothing is owed back",
            "x-playnet-shape": "boolean"
          }
        },
        "required": [
          "scope-id",
          "spec",
          "qty",
          "unit",
          "money-spec",
          "cost",
          "where",
          "note",
          "receipt",
          "donation?"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "openWorldHint": false
      },
      "x-playnet-auth": "device",
      "x-playnet-topic": "stock",
      "x-playnet-http": "/api/session/record-purchase"
    },
    {
      "name": "session.declare-skill",
      "title": "slots: declare-skill",
      "description": "Self-declares this AID's labour-power SKILL-SPEC-ID in SCOPE-ID as a held skill resource, re-raising a revoked one, and refolds the labour pool; replies (ok . resource-id). [slots; callable by an enrolled device]",
      "inputSchema": {
        "type": "object",
        "properties": {
          "scope-id": {
            "type": "string",
            "description": "a scope (commune) id",
            "x-playnet-shape": "scope-id"
          },
          "skill-spec-id": {
            "type": "string",
            "description": "a resource-specification id",
            "x-playnet-shape": "spec"
          }
        },
        "required": [
          "scope-id",
          "skill-spec-id"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "openWorldHint": false
      },
      "x-playnet-auth": "device",
      "x-playnet-topic": "slots",
      "x-playnet-http": "/api/session/declare-skill"
    },
    {
      "name": "session.revoke-skill",
      "title": "slots: revoke-skill",
      "description": "Withdraws this AID's self-declared SKILL-SPEC-ID in SCOPE-ID by lowering it to zero, keeping the record; replies (ok . resource-id). [slots; callable by an enrolled device]",
      "inputSchema": {
        "type": "object",
        "properties": {
          "scope-id": {
            "type": "string",
            "description": "a scope (commune) id",
            "x-playnet-shape": "scope-id"
          },
          "skill-spec-id": {
            "type": "string",
            "description": "a resource-specification id",
            "x-playnet-shape": "spec"
          }
        },
        "required": [
          "scope-id",
          "skill-spec-id"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "openWorldHint": false
      },
      "x-playnet-auth": "device",
      "x-playnet-topic": "slots",
      "x-playnet-http": "/api/session/revoke-skill"
    },
    {
      "name": "session.my-skills",
      "title": "slots: my-skills",
      "description": "Replies (ok (skills . ids)), the skills this AID currently holds in SCOPE-ID. [slots; callable by an enrolled device]",
      "inputSchema": {
        "type": "object",
        "properties": {
          "scope-id": {
            "type": "string",
            "description": "a scope (commune) id",
            "x-playnet-shape": "scope-id"
          }
        },
        "required": [
          "scope-id"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "openWorldHint": false
      },
      "x-playnet-auth": "device",
      "x-playnet-topic": "slots",
      "x-playnet-http": "/api/session/my-skills"
    },
    {
      "name": "session.my-skill-standing",
      "title": "slots: my-skill-standing",
      "description": "Replies (ok (standing . rows)), one row per skill this AID holds or has practiced in SCOPE-ID, in hours: validated hours, where the skill's competence stands today under its own law, work events, how many reached a witness quorum, distinct co-signers, witnessed hours, and ceremonies still collecting. [slots; callable by an enrolled device]",
      "inputSchema": {
        "type": "object",
        "properties": {
          "scope-id": {
            "type": "string",
            "description": "a scope (commune) id",
            "x-playnet-shape": "scope-id"
          }
        },
        "required": [
          "scope-id"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "openWorldHint": false
      },
      "x-playnet-auth": "device",
      "x-playnet-topic": "slots",
      "x-playnet-http": "/api/session/my-skill-standing"
    },
    {
      "name": "session.observe-contrary-preimage",
      "title": "slots: observe-contrary-preimage",
      "description": "The SAID-relevant fields of this AID's contrary observation on SCOPE-ID's map — PROCESS's ACTION on SPEC read READING where the map states NOMINAL, on the WITNESS of a work event of this AID's on that process, AT — for the client to re-derive and sign with its own key; refused unless the witness is this AID's own run of that process. docs/planning/voice/feasibility-follows-the-map.md. [slots; callable by an enrolled device]",
      "inputSchema": {
        "type": "object",
        "properties": {
          "scope-id": {
            "type": "string",
            "description": "a scope (commune) id",
            "x-playnet-shape": "scope-id"
          },
          "process": {
            "type": "string",
            "x-playnet-shape": "id"
          },
          "action": {
            "type": "string",
            "description": "a symbol, sent as its name",
            "x-playnet-shape": "symbol"
          },
          "spec": {
            "type": "string",
            "description": "a resource-specification id",
            "x-playnet-shape": "spec"
          },
          "nominal": {
            "type": "number",
            "x-playnet-shape": "number"
          },
          "reading": {
            "type": "number",
            "x-playnet-shape": "number"
          },
          "witness": {
            "type": "string",
            "x-playnet-shape": "id"
          },
          "at": {
            "type": "string",
            "format": "date-time",
            "description": "civil ISO 8601 at the boundary",
            "x-playnet-shape": "instant"
          }
        },
        "required": [
          "scope-id",
          "process",
          "action",
          "spec",
          "nominal",
          "reading",
          "witness",
          "at"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "openWorldHint": false
      },
      "x-playnet-auth": "device",
      "x-playnet-topic": "slots",
      "x-playnet-http": "/api/session/observe-contrary-preimage"
    },
    {
      "name": "session.observe-contrary-signed",
      "title": "slots: observe-contrary-signed",
      "description": "Lands the observation whose preimage observe-contrary-preimage gave, SIGNATURE this AID's own over its SAID, superseding this AID's earlier observation on the same process and action; the scope's next solve reads it in every future, in the cautious direction only; replies (ok said). [slots; callable by an enrolled device]",
      "inputSchema": {
        "type": "object",
        "properties": {
          "scope-id": {
            "type": "string",
            "description": "a scope (commune) id",
            "x-playnet-shape": "scope-id"
          },
          "process": {
            "type": "string",
            "x-playnet-shape": "id"
          },
          "action": {
            "type": "string",
            "description": "a symbol, sent as its name",
            "x-playnet-shape": "symbol"
          },
          "spec": {
            "type": "string",
            "description": "a resource-specification id",
            "x-playnet-shape": "spec"
          },
          "nominal": {
            "type": "number",
            "x-playnet-shape": "number"
          },
          "reading": {
            "type": "number",
            "x-playnet-shape": "number"
          },
          "witness": {
            "type": "string",
            "x-playnet-shape": "id"
          },
          "at": {
            "type": "string",
            "format": "date-time",
            "description": "civil ISO 8601 at the boundary",
            "x-playnet-shape": "instant"
          },
          "signature": {
            "type": "string",
            "description": "a CESR qb64 signature",
            "x-playnet-shape": "qb64"
          }
        },
        "required": [
          "scope-id",
          "process",
          "action",
          "spec",
          "nominal",
          "reading",
          "witness",
          "at",
          "signature"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "openWorldHint": false
      },
      "x-playnet-auth": "device",
      "x-playnet-topic": "slots",
      "x-playnet-http": "/api/session/observe-contrary-signed"
    },
    {
      "name": "session.observe-contrary",
      "title": "slots: observe-contrary",
      "description": "The unsigned fallback of observe-contrary-signed for a session with no resident key; replies (ok said). [slots; callable by an enrolled device]",
      "inputSchema": {
        "type": "object",
        "properties": {
          "scope-id": {
            "type": "string",
            "description": "a scope (commune) id",
            "x-playnet-shape": "scope-id"
          },
          "process": {
            "type": "string",
            "x-playnet-shape": "id"
          },
          "action": {
            "type": "string",
            "description": "a symbol, sent as its name",
            "x-playnet-shape": "symbol"
          },
          "spec": {
            "type": "string",
            "description": "a resource-specification id",
            "x-playnet-shape": "spec"
          },
          "nominal": {
            "type": "number",
            "x-playnet-shape": "number"
          },
          "reading": {
            "type": "number",
            "x-playnet-shape": "number"
          },
          "witness": {
            "type": "string",
            "x-playnet-shape": "id"
          }
        },
        "required": [
          "scope-id",
          "process",
          "action",
          "spec",
          "nominal",
          "reading",
          "witness"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "openWorldHint": false
      },
      "x-playnet-auth": "device",
      "x-playnet-topic": "slots",
      "x-playnet-http": "/api/session/observe-contrary"
    },
    {
      "name": "session.contrary-observations",
      "title": "slots: contrary-observations",
      "description": "Replies (ok . rows), every standing contrary observation on SCOPE-ID's map: (observer process action spec nominal reading witness observed-at). [slots; callable by an enrolled device]",
      "inputSchema": {
        "type": "object",
        "properties": {
          "scope-id": {
            "type": "string",
            "description": "a scope (commune) id",
            "x-playnet-shape": "scope-id"
          }
        },
        "required": [
          "scope-id"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "openWorldHint": false
      },
      "x-playnet-auth": "device",
      "x-playnet-topic": "slots",
      "x-playnet-http": "/api/session/contrary-observations"
    },
    {
      "name": "session.slots-at",
      "title": "slots: slots-at",
      "description": "Replies SCOPE-ID's whole live slot pool: every citizen's standing needs and the means held by grant, each with `drawn` from the last solve; a merely declared private means stays out. [slots; callable by an enrolled device]",
      "inputSchema": {
        "type": "object",
        "properties": {
          "scope-id": {
            "type": "string",
            "description": "a scope (commune) id",
            "x-playnet-shape": "scope-id"
          }
        },
        "required": [
          "scope-id"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "openWorldHint": false
      },
      "x-playnet-auth": "device",
      "x-playnet-topic": "slots",
      "x-playnet-http": "/api/session/slots-at"
    },
    {
      "name": "session.family-split",
      "title": "planning: family-split",
      "description": "Splits a household purse across NEEDS-JSON by harmony, with optional member voice and per-citizen hours, writing nothing; replies the per-member rows. [planning; callable by an enrolled device]",
      "inputSchema": {
        "type": "object",
        "properties": {
          "needs-json": {
            "type": "string",
            "contentMediaType": "application/json",
            "description": "a JSON document, as a string",
            "x-playnet-shape": "json"
          },
          "purse": {
            "type": "number",
            "description": "the household's weekly money on hand, a number in euros",
            "x-playnet-shape": "number"
          },
          "labour-h": {
            "type": "number",
            "description": "the household's labour hours on hand this week",
            "x-playnet-shape": "number"
          },
          "weighted?": {
            "type": "boolean",
            "description": "#t to weight the split by each member's contributed hours rather than equally",
            "x-playnet-shape": "boolean"
          },
          "members-json": {
            "type": "string",
            "contentMediaType": "application/json",
            "description": "a JSON document, as a string",
            "x-playnet-shape": "json"
          },
          "per-citizen-hours": {
            "type": "number",
            "description": "the weekly hours one citizen's full labour counts as (default 40)",
            "x-playnet-shape": "number"
          }
        },
        "required": [
          "needs-json",
          "purse",
          "labour-h",
          "weighted?"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "openWorldHint": false
      },
      "x-playnet-auth": "device",
      "x-playnet-topic": "planning",
      "x-playnet-http": "/api/session/family-split"
    },
    {
      "name": "session.family-bills",
      "title": "planning: family-bills",
      "description": "Replies the week's three bills for NEEDS-JSON: the euros and hours beyond the purse for rights, then needs, then wants held as walls, at EUR-PER-HOUR; nothing is written. [planning; callable by an enrolled device]",
      "inputSchema": {
        "type": "object",
        "properties": {
          "needs-json": {
            "type": "string",
            "contentMediaType": "application/json",
            "description": "a JSON document, as a string",
            "x-playnet-shape": "json"
          },
          "purse": {
            "type": "number",
            "description": "the household's weekly money on hand, a number in euros",
            "x-playnet-shape": "number"
          },
          "labour-h": {
            "type": "number",
            "description": "the household's labour hours on hand this week",
            "x-playnet-shape": "number"
          },
          "weighted?": {
            "type": "boolean",
            "description": "#t to weight the split by each member's contributed hours rather than equally",
            "x-playnet-shape": "boolean"
          },
          "eur-per-hour": {
            "type": "number",
            "description": "the euro value of one labour hour, used to price the bills",
            "x-playnet-shape": "number"
          },
          "members-json": {
            "type": "string",
            "contentMediaType": "application/json",
            "description": "a JSON document, as a string",
            "x-playnet-shape": "json"
          },
          "per-citizen-hours": {
            "type": "number",
            "description": "the weekly hours one citizen's full labour counts as (default 40)",
            "x-playnet-shape": "number"
          }
        },
        "required": [
          "needs-json",
          "purse",
          "labour-h",
          "weighted?",
          "eur-per-hour"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "openWorldHint": false
      },
      "x-playnet-auth": "device",
      "x-playnet-topic": "planning",
      "x-playnet-http": "/api/session/family-bills"
    },
    {
      "name": "session.family-externalities",
      "title": "planning: family-externalities",
      "description": "Replies, beside each held or wanted row of NEEDS-JSON, the euros the other members would have received had it stayed unasked; nothing is written. [planning; callable by an enrolled device]",
      "inputSchema": {
        "type": "object",
        "properties": {
          "needs-json": {
            "type": "string",
            "contentMediaType": "application/json",
            "description": "a JSON document, as a string",
            "x-playnet-shape": "json"
          },
          "purse": {
            "type": "number",
            "description": "the household's weekly money on hand, a number in euros",
            "x-playnet-shape": "number"
          },
          "labour-h": {
            "type": "number",
            "description": "the household's labour hours on hand this week",
            "x-playnet-shape": "number"
          },
          "weighted?": {
            "type": "boolean",
            "description": "#t to weight the split by each member's contributed hours rather than equally",
            "x-playnet-shape": "boolean"
          }
        },
        "required": [
          "needs-json",
          "purse",
          "labour-h",
          "weighted?"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "openWorldHint": false
      },
      "x-playnet-auth": "device",
      "x-playnet-topic": "planning",
      "x-playnet-http": "/api/session/family-externalities"
    },
    {
      "name": "session.match-slots",
      "title": "slots: match-slots",
      "description": "Replies the ring for SCOPE-ID: every standing need scored against every declared means by classification affinity and time, through LENS when given; replies needs, means and matches. [slots; callable by an enrolled device]",
      "inputSchema": {
        "type": "object",
        "properties": {
          "scope-id": {
            "type": "string",
            "description": "a scope (commune) id",
            "x-playnet-shape": "scope-id"
          },
          "lens": {
            "type": "string",
            "description": "a named cut of the taxonomy, resolved against this AID's own contact book; absent = the global cut",
            "x-playnet-shape": "string"
          }
        },
        "required": [
          "scope-id"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "openWorldHint": false
      },
      "x-playnet-auth": "device",
      "x-playnet-topic": "slots",
      "x-playnet-http": "/api/session/match-slots"
    },
    {
      "name": "session.set-position",
      "title": "places: set-position",
      "description": "Records where this AID is at PERIOD (0 = now, later = expected) as known place id PLACE, the planner's commute origin; #f clears; replies (ok . place) or (ok . cleared). [places; callable by an enrolled device]",
      "inputSchema": {
        "type": "object",
        "properties": {
          "scope-id": {
            "type": "string",
            "description": "a scope (commune) id",
            "x-playnet-shape": "scope-id"
          },
          "period": {
            "type": "integer",
            "description": "a period index into the plan horizon; 0 is now, later integers are future periods",
            "x-playnet-shape": "integer"
          },
          "place": {
            "type": "string",
            "description": "a place id or name",
            "x-playnet-shape": "place"
          }
        },
        "required": [
          "scope-id",
          "period",
          "place"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "openWorldHint": false
      },
      "x-playnet-auth": "device",
      "x-playnet-topic": "places",
      "x-playnet-http": "/api/session/set-position"
    },
    {
      "name": "session.set-position-latlon",
      "title": "places: set-position-latlon",
      "description": "Snaps LAT/LON to SCOPE-ID's nearest known place server-side and records that place as this AID's position at PERIOD, so a shared position is a place rather than a trace; replies (ok . place). [places; callable by an enrolled device]",
      "inputSchema": {
        "type": "object",
        "properties": {
          "scope-id": {
            "type": "string",
            "description": "a scope (commune) id",
            "x-playnet-shape": "scope-id"
          },
          "period": {
            "type": "integer",
            "description": "a period index into the plan horizon; 0 is now, later integers are future periods",
            "x-playnet-shape": "integer"
          },
          "lat": {
            "type": "number",
            "description": "latitude in decimal degrees; 0 with lon 0 means no coordinates",
            "x-playnet-shape": "number"
          },
          "lon": {
            "type": "number",
            "description": "longitude in decimal degrees; 0 with lat 0 means no coordinates",
            "x-playnet-shape": "number"
          }
        },
        "required": [
          "scope-id",
          "period",
          "lat",
          "lon"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "openWorldHint": false
      },
      "x-playnet-auth": "device",
      "x-playnet-topic": "places",
      "x-playnet-http": "/api/session/set-position-latlon"
    },
    {
      "name": "session.set-location-sharing",
      "title": "places: set-location-sharing",
      "description": "Declares whether this AID shares where they are: MODE live (a watched fix), here (one fix) or off, stated once at their home so every device reads the same; off ends the fix that stands and refuses the next; replies (ok . mode). [places; callable by an enrolled device]",
      "inputSchema": {
        "type": "object",
        "properties": {
          "scope-id": {
            "type": "string",
            "description": "a scope (commune) id",
            "x-playnet-shape": "scope-id"
          },
          "mode": {
            "type": "string",
            "description": "a symbol, sent as its name",
            "x-playnet-shape": "symbol"
          }
        },
        "required": [
          "scope-id",
          "mode"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "openWorldHint": false
      },
      "x-playnet-auth": "device",
      "x-playnet-topic": "places",
      "x-playnet-http": "/api/session/set-location-sharing"
    },
    {
      "name": "session.location-sharing",
      "title": "places: location-sharing",
      "description": "Replies the mode this AID declared for sharing where they are (live, here or off), or undeclared; nothing is written. [places; callable by an enrolled device]",
      "inputSchema": {
        "type": "object",
        "properties": {
          "scope-id": {
            "type": "string",
            "description": "a scope (commune) id",
            "x-playnet-shape": "scope-id"
          }
        },
        "required": [
          "scope-id"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "openWorldHint": false
      },
      "x-playnet-auth": "device",
      "x-playnet-topic": "places",
      "x-playnet-http": "/api/session/location-sharing"
    },
    {
      "name": "session.set-home",
      "title": "places: set-home",
      "description": "Registers this AID's home in SCOPE-ID, the place every position rule falls back to: a known place id, or \"\" with LAT/LON to declare the AID's own `place:AID:home`; replies (ok (place . id)). [places; callable by an enrolled device]",
      "inputSchema": {
        "type": "object",
        "properties": {
          "scope-id": {
            "type": "string",
            "description": "a scope (commune) id",
            "x-playnet-shape": "scope-id"
          },
          "place": {
            "type": "string",
            "description": "a place id or name",
            "x-playnet-shape": "place"
          },
          "lat": {
            "type": "number",
            "description": "latitude in decimal degrees; 0 with lon 0 means no coordinates",
            "x-playnet-shape": "number"
          },
          "lon": {
            "type": "number",
            "description": "longitude in decimal degrees; 0 with lat 0 means no coordinates",
            "x-playnet-shape": "number"
          }
        },
        "required": [
          "scope-id",
          "place",
          "lat",
          "lon"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "openWorldHint": false
      },
      "x-playnet-auth": "device",
      "x-playnet-topic": "places",
      "x-playnet-http": "/api/session/set-home"
    },
    {
      "name": "session.declare-dwelling",
      "title": "places: declare-dwelling",
      "description": "Declares the dwelling this AID lives in, at PLACE (\"\" = the registered home): its floor area in m² and its rooms, shared by the beds it houses a night, the warmth it is kept at in winter and in summer in °C, the gates an inspection would attest, whether that certificate stands, its own rent per night where a landlord is paid, and the tenure; replies (ok (resource . id) (place . id) (tags …)). [places; callable by an enrolled device]",
      "inputSchema": {
        "type": "object",
        "properties": {
          "scope-id": {
            "type": "string",
            "description": "a scope (commune) id",
            "x-playnet-shape": "scope-id"
          },
          "place": {
            "type": "string",
            "description": "a place id or name",
            "x-playnet-shape": "place"
          },
          "area": {
            "type": "number",
            "description": "the dwelling's whole floor area in m², a positive number — shared by the beds it houses",
            "x-playnet-shape": "number"
          },
          "rooms": {
            "type": "number",
            "description": "the dwelling's rooms, kitchen and bathroom aside, a positive number — shared by the beds it houses",
            "x-playnet-shape": "number"
          },
          "warmth-winter": {
            "type": "number",
            "description": "the indoor temperature the dwelling is kept at in winter, in °C",
            "x-playnet-shape": "number"
          },
          "warmth-summer": {
            "type": "number",
            "description": "the indoor temperature the dwelling reaches in summer, in °C",
            "x-playnet-shape": "number"
          },
          "beds": {
            "type": "number",
            "description": "how many people the dwelling houses a night, a positive number",
            "x-playnet-shape": "number"
          },
          "attests-json": {
            "type": "string",
            "contentMediaType": "application/json",
            "description": "a JSON document, as a string",
            "x-playnet-shape": "json"
          },
          "certified": {
            "type": "boolean",
            "description": "#t when the dwelling's certificate stands today",
            "x-playnet-shape": "boolean"
          },
          "rent": {
            "type": "number",
            "description": "the dwelling's own rent in EUR per person-night, 0 when no landlord is paid",
            "x-playnet-shape": "number"
          },
          "tenure": {
            "type": "string",
            "description": "own, rent or lodged — custody, never a row of the housing vector",
            "x-playnet-shape": "string"
          }
        },
        "required": [
          "scope-id",
          "place",
          "area",
          "rooms",
          "warmth-winter",
          "warmth-summer",
          "beds",
          "attests-json",
          "certified",
          "rent",
          "tenure"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "openWorldHint": false
      },
      "x-playnet-auth": "device",
      "x-playnet-topic": "places",
      "x-playnet-http": "/api/session/declare-dwelling"
    },
    {
      "name": "session.declare-place",
      "title": "places: declare-place",
      "description": "Names a new spatial thing in SCOPE-ID with id `place:AID:slug`, optional coordinates and ADDRESS, re-placing it when named again. PARENT names the place it is inside (a room in a site, a shelf in a room): its id is then `PARENT/slug`, and it stands at its parent's position when it states none. Replies (ok (id)) or an error. [places; callable by an enrolled device]",
      "inputSchema": {
        "type": "object",
        "properties": {
          "scope-id": {
            "type": "string",
            "description": "a scope (commune) id",
            "x-playnet-shape": "scope-id"
          },
          "name": {
            "type": "string",
            "description": "on announce/leave the caller's display name; on declare-place the human name of the new place; on declare-need/declare-means the row's own display name, default SPEC (need) or \"AGENT's SPEC\" (means)",
            "x-playnet-shape": "string"
          },
          "lat": {
            "type": "number",
            "description": "latitude in decimal degrees; 0 with lon 0 means no coordinates",
            "x-playnet-shape": "number"
          },
          "lon": {
            "type": "number",
            "description": "longitude in decimal degrees; 0 with lat 0 means no coordinates",
            "x-playnet-shape": "number"
          },
          "address": {
            "type": "string",
            "description": "the external Monero address the payout is sent to",
            "x-playnet-shape": "string"
          },
          "parent": {
            "type": "string",
            "description": "a place id or name",
            "x-playnet-shape": "place"
          }
        },
        "required": [
          "scope-id",
          "name",
          "lat",
          "lon"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "openWorldHint": false
      },
      "x-playnet-auth": "device",
      "x-playnet-topic": "places",
      "x-playnet-http": "/api/session/declare-place"
    },
    {
      "name": "session.count-schedule",
      "title": "stock: count-schedule",
      "description": "The schedule of counts in SCOPE-ID: a row for each thing the inventory shows that sits in no other, soonest due first, with the lines one visit counts, the counter's hours, the interval between counts (from what the plan stakes on the figure and how far counts have found the ledger off), its class (A, B or C), when it was last counted and when it is due. REGIME (announced, undisclosed, random) sets how the next window falls; absent, announced. Replies (ok (rows)). [stock; callable by an enrolled device]",
      "inputSchema": {
        "type": "object",
        "properties": {
          "scope-id": {
            "type": "string",
            "description": "a scope (commune) id",
            "x-playnet-shape": "scope-id"
          },
          "regime": {
            "type": "string",
            "description": "how a planned count is disclosed: announced, undisclosed or random; absent, announced",
            "x-playnet-shape": "string"
          }
        },
        "required": [
          "scope-id"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "openWorldHint": false
      },
      "x-playnet-auth": "device",
      "x-playnet-topic": "stock",
      "x-playnet-http": "/api/session/count-schedule"
    },
    {
      "name": "session.plan-counts",
      "title": "commitments: plan-counts",
      "description": "Lays the counts due in SCOPE-ID, those whose window is open and asked of nobody yet, as directed work offers through the offer loop (so held to its bound on open offers), AT-MOST of them a call (3 when absent), each to COUNTER where one is named and else to the member whose turn it is, the stock's owner passed over while another can count it. A count due later is announced by count-schedule and offered when its window opens. Under REGIME undisclosed or random the commitment is read by its counter alone until its window opens, and the count is blind. Replies (ok (laid due)), with (refused kind) when the offer loop stopped the walk. [commitments; callable by an enrolled device]",
      "inputSchema": {
        "type": "object",
        "properties": {
          "scope-id": {
            "type": "string",
            "description": "a scope (commune) id",
            "x-playnet-shape": "scope-id"
          },
          "regime": {
            "type": "string",
            "description": "how a planned count is disclosed: announced, undisclosed or random; absent, announced",
            "x-playnet-shape": "string"
          },
          "counter": {
            "type": "string",
            "pattern": "^[A-Z][A-Za-z0-9_-]{43}$",
            "description": "a KERI AID prefix",
            "x-playnet-shape": "aid"
          },
          "at-most": {
            "type": "integer",
            "description": "the most offers one call lays; absent, 3",
            "x-playnet-shape": "integer"
          }
        },
        "required": [
          "scope-id"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "openWorldHint": false
      },
      "x-playnet-auth": "device",
      "x-playnet-topic": "commitments",
      "x-playnet-http": "/api/session/plan-counts"
    },
    {
      "name": "session.scope-replica",
      "title": "stock: scope-replica",
      "description": "Replies SCOPE-ID as this AID's device holds a copy of it: one text carrying the scope's goods, places, people, the needs standing in it and the observer's books (its stock and the events behind it), each serialized as its own store keeps it. A device seeds its copy from it on taking a seat and after it flushes what it queued, so the same doors answer there with no gateway in reach. [stock; callable by an enrolled device]",
      "inputSchema": {
        "type": "object",
        "properties": {
          "scope-id": {
            "type": "string",
            "description": "a scope (commune) id",
            "x-playnet-shape": "scope-id"
          }
        },
        "required": [
          "scope-id"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "openWorldHint": false
      },
      "x-playnet-auth": "device",
      "x-playnet-topic": "stock",
      "x-playnet-http": "/api/session/scope-replica"
    },
    {
      "name": "session.count-history",
      "title": "stock: count-history",
      "description": "Replies the counts of RESOURCE-ID in SCOPE-ID, newest first, LIMIT of them (5 when absent): each count that found the ledger off, as (id at delta unit counter technique evidence mine), DELTA signed as the adjustment landed and EVIDENCE the hash of the picture the count names, \"\" when none. A count voided by a contest is gone from it. What a member reads to contest a count. [stock; callable by an enrolled device]",
      "inputSchema": {
        "type": "object",
        "properties": {
          "scope-id": {
            "type": "string",
            "description": "a scope (commune) id",
            "x-playnet-shape": "scope-id"
          },
          "resource-id": {
            "type": "string",
            "description": "an economic-resource id in the scope (own-means: the titled thing; claim/resource-detail: the good)",
            "x-playnet-shape": "id"
          },
          "limit": {
            "type": "integer",
            "description": "the maximum number of results to reply",
            "x-playnet-shape": "integer"
          }
        },
        "required": [
          "scope-id",
          "resource-id"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "openWorldHint": false
      },
      "x-playnet-auth": "device",
      "x-playnet-topic": "stock",
      "x-playnet-http": "/api/session/count-history"
    },
    {
      "name": "session.contests",
      "title": "governance: contests",
      "description": "Replies the contests open in SCOPE-ID as they stand to this AID: each as (id event-id kind resource worker by reason role), KIND work or count, RESOURCE the stock a count is of (empty for work), ROLE attach when the act is this AID's own (a count's counter attaches the picture), vote when this AID is in the franchise, none otherwise. [governance; callable by an enrolled device]",
      "inputSchema": {
        "type": "object",
        "properties": {
          "scope-id": {
            "type": "string",
            "description": "a scope (commune) id",
            "x-playnet-shape": "scope-id"
          }
        },
        "required": [
          "scope-id"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "openWorldHint": false
      },
      "x-playnet-auth": "device",
      "x-playnet-topic": "governance",
      "x-playnet-http": "/api/session/contests"
    },
    {
      "name": "session.evidence-part",
      "title": "governance: evidence-part",
      "description": "Attaches the counter's picture to the contest BALLOT-ID, one part of PARTS (26 at the most), PART a run of its base64 sixteen kilobytes at the most, PART-NO from 0 and in order, HASH the sha256 the count names. Only the counter whose act is contested may attach, and only the picture the count names. The last part joins them, checks the bytes hash to HASH and holds the picture until the ballot settles. Replies (ok . characters-held) or (ok . held), or an error. [governance; callable by an enrolled device]",
      "inputSchema": {
        "type": "object",
        "properties": {
          "ballot-id": {
            "type": "string",
            "description": "the id of a contest ballot, contest: and the contested count's adjustment id",
            "x-playnet-shape": "id"
          },
          "hash": {
            "type": "string",
            "description": "a picture's hash as a count names it, sha256: and sixty-four hex digits",
            "x-playnet-shape": "string"
          },
          "part-no": {
            "type": "integer",
            "description": "which part of a picture this is, from 0",
            "x-playnet-shape": "integer"
          },
          "parts": {
            "type": "integer",
            "description": "how many parts the picture is sent in, 26 at the most",
            "x-playnet-shape": "integer"
          },
          "part": {
            "type": "string",
            "contentEncoding": "base64",
            "description": "a run of a picture's base64, sixteen kilobytes at the most",
            "x-playnet-shape": "base64"
          }
        },
        "required": [
          "ballot-id",
          "hash",
          "part-no",
          "parts",
          "part"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "openWorldHint": false
      },
      "x-playnet-auth": "device",
      "x-playnet-topic": "governance",
      "x-playnet-http": "/api/session/evidence-part"
    },
    {
      "name": "session.evidence-chunk",
      "title": "governance: evidence-chunk",
      "description": "Replies part PART-NO of the picture held for the contest BALLOT-ID, to the counter and the franchise: (ok (part total hash)), PART a run of its base64. An error when no picture is held, or the caller is neither. [governance; callable by an enrolled device]",
      "inputSchema": {
        "type": "object",
        "properties": {
          "ballot-id": {
            "type": "string",
            "description": "the id of a contest ballot, contest: and the contested count's adjustment id",
            "x-playnet-shape": "id"
          },
          "part-no": {
            "type": "integer",
            "description": "which part of a picture this is, from 0",
            "x-playnet-shape": "integer"
          }
        },
        "required": [
          "ballot-id",
          "part-no"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "openWorldHint": false
      },
      "x-playnet-auth": "device",
      "x-playnet-topic": "governance",
      "x-playnet-http": "/api/session/evidence-chunk"
    },
    {
      "name": "session.label-stock",
      "title": "stock: label-stock",
      "description": "Replies the code RESOURCE-ID is known by in SCOPE-ID, for its label: six characters, unique in the scope, silent about owner and contents; given on the first asking and the same on every asking after. Replies (ok (code id name minted)) with MINTED true when this asking gave the code, or a failure. [stock; callable by an enrolled device]",
      "inputSchema": {
        "type": "object",
        "properties": {
          "scope-id": {
            "type": "string",
            "description": "a scope (commune) id",
            "x-playnet-shape": "scope-id"
          },
          "resource-id": {
            "type": "string",
            "description": "an economic-resource id in the scope (own-means: the titled thing; claim/resource-detail: the good)",
            "x-playnet-shape": "id"
          }
        },
        "required": [
          "scope-id",
          "resource-id"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "openWorldHint": false
      },
      "x-playnet-auth": "device",
      "x-playnet-topic": "stock",
      "x-playnet-http": "/api/session/label-stock"
    },
    {
      "name": "session.read-label",
      "title": "stock: read-label",
      "description": "What the label CODE names in SCOPE-ID: the resource, where it is, and the resources it contains. A typed I, L or O reads as the digit it resembles. Replies (ok (resource contents)) or a failure. [stock; callable by an enrolled device]",
      "inputSchema": {
        "type": "object",
        "properties": {
          "scope-id": {
            "type": "string",
            "description": "a scope (commune) id",
            "x-playnet-shape": "scope-id"
          },
          "code": {
            "type": "string",
            "description": "a label's code: the six characters a resource is known by in its scope",
            "x-playnet-shape": "string"
          }
        },
        "required": [
          "scope-id",
          "code"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "openWorldHint": false
      },
      "x-playnet-auth": "device",
      "x-playnet-topic": "stock",
      "x-playnet-http": "/api/session/read-label"
    },
    {
      "name": "session.socialize-preimage",
      "title": "custody: socialize-preimage",
      "description": "Replies (ok fields), the SAID fields of the custody grant this AID would issue to COMMUNE-AID over SPEC, with ELIGIBLE carrying the owner's steward rule as JSON, for the client to sign for socialize-signed. [custody; callable by an enrolled device]",
      "inputSchema": {
        "type": "object",
        "properties": {
          "commune-aid": {
            "type": "string",
            "pattern": "^[A-Z][A-Za-z0-9_-]{43}$",
            "description": "a KERI AID prefix",
            "x-playnet-shape": "aid"
          },
          "spec": {
            "type": "string",
            "description": "a resource-specification id",
            "x-playnet-shape": "spec"
          },
          "qty": {
            "type": "number",
            "description": "the quantity of SPEC in UNIT, a positive number",
            "x-playnet-shape": "number"
          },
          "until": {
            "type": "string",
            "format": "date-time",
            "description": "civil ISO 8601 at the boundary",
            "x-playnet-shape": "instant"
          },
          "movable": {
            "type": "boolean",
            "description": "#t when the socialized resource may leave the owner's place",
            "x-playnet-shape": "boolean"
          },
          "rt": {
            "type": "string",
            "description": "the return-to place for a socialized resource, \"\" when unset",
            "x-playnet-shape": "string"
          },
          "cf": {
            "type": "string",
            "description": "the condition floor the resource must be returned in, \"\" when unset",
            "x-playnet-shape": "string"
          },
          "res": {
            "type": "string",
            "description": "the exact resource id the grant or claim names, \"\" when unnamed",
            "x-playnet-shape": "id"
          },
          "kind": {
            "type": "string",
            "description": "a symbol, sent as its name",
            "x-playnet-shape": "symbol"
          },
          "ref": {
            "type": "string",
            "description": "on the signing legs a caller nonce folded into the SAID (\"\" = none); on slots-watch a CapTP watcher reference",
            "x-playnet-shape": "string"
          },
          "eligible": {
            "type": "string",
            "contentMediaType": "application/json",
            "description": "a JSON document, as a string",
            "x-playnet-shape": "json"
          }
        },
        "required": [
          "commune-aid",
          "spec",
          "qty",
          "until",
          "movable",
          "rt",
          "cf",
          "res",
          "kind",
          "ref"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "openWorldHint": false
      },
      "x-playnet-auth": "device",
      "x-playnet-topic": "custody",
      "x-playnet-http": "/api/session/socialize-preimage"
    },
    {
      "name": "session.socialize-signed",
      "title": "custody: socialize-signed",
      "description": "Issues the custody grant under this AID's own SIGNATURE after checking no standing title names another owner, then tells the planner the commune's pool moved; replies (ok said) or an error. [custody; callable by an enrolled device]",
      "inputSchema": {
        "type": "object",
        "properties": {
          "commune-aid": {
            "type": "string",
            "pattern": "^[A-Z][A-Za-z0-9_-]{43}$",
            "description": "a KERI AID prefix",
            "x-playnet-shape": "aid"
          },
          "spec": {
            "type": "string",
            "description": "a resource-specification id",
            "x-playnet-shape": "spec"
          },
          "qty": {
            "type": "number",
            "description": "the quantity of SPEC in UNIT, a positive number",
            "x-playnet-shape": "number"
          },
          "until": {
            "type": "string",
            "format": "date-time",
            "description": "civil ISO 8601 at the boundary",
            "x-playnet-shape": "instant"
          },
          "movable": {
            "type": "boolean",
            "description": "#t when the socialized resource may leave the owner's place",
            "x-playnet-shape": "boolean"
          },
          "rt": {
            "type": "string",
            "description": "the return-to place for a socialized resource, \"\" when unset",
            "x-playnet-shape": "string"
          },
          "cf": {
            "type": "string",
            "description": "the condition floor the resource must be returned in, \"\" when unset",
            "x-playnet-shape": "string"
          },
          "res": {
            "type": "string",
            "description": "the exact resource id the grant or claim names, \"\" when unnamed",
            "x-playnet-shape": "id"
          },
          "kind": {
            "type": "string",
            "description": "a symbol, sent as its name",
            "x-playnet-shape": "symbol"
          },
          "ref": {
            "type": "string",
            "description": "on the signing legs a caller nonce folded into the SAID (\"\" = none); on slots-watch a CapTP watcher reference",
            "x-playnet-shape": "string"
          },
          "signature": {
            "type": "string",
            "description": "a CESR qb64 signature",
            "x-playnet-shape": "qb64"
          },
          "eligible": {
            "type": "string",
            "contentMediaType": "application/json",
            "description": "a JSON document, as a string",
            "x-playnet-shape": "json"
          }
        },
        "required": [
          "commune-aid",
          "spec",
          "qty",
          "until",
          "movable",
          "rt",
          "cf",
          "res",
          "kind",
          "ref",
          "signature"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "openWorldHint": false
      },
      "x-playnet-auth": "device",
      "x-playnet-topic": "custody",
      "x-playnet-http": "/api/session/socialize-signed"
    },
    {
      "name": "session.my-grants",
      "title": "custody: my-grants",
      "description": "Replies (ok rows), the live custody grants this AID holds out: said, spec, commune, until, qty, consume or use, and steward rule. [custody; callable by an enrolled device]",
      "inputSchema": {
        "type": "object",
        "properties": {},
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "openWorldHint": false
      },
      "x-playnet-auth": "device",
      "x-playnet-topic": "custody",
      "x-playnet-http": "/api/session/my-grants"
    },
    {
      "name": "session.desocialize",
      "title": "custody: desocialize",
      "description": "Recalls this AID's custody grant SAID, revoking it and telling the planner the commune's pool moved; replies (ok . result) or an error. [custody; callable by an enrolled device]",
      "inputSchema": {
        "type": "object",
        "properties": {
          "said": {
            "type": "string",
            "pattern": "^[A-Z][A-Za-z0-9_-]{43}$",
            "description": "a SAID",
            "x-playnet-shape": "said"
          }
        },
        "required": [
          "said"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "openWorldHint": false
      },
      "x-playnet-auth": "device",
      "x-playnet-topic": "custody",
      "x-playnet-http": "/api/session/desocialize"
    },
    {
      "name": "session.purchase-claim-preimage",
      "title": "stock: purchase-claim-preimage",
      "description": "Replies (ok fields), the SAID fields of the reimbursement claim this AID would raise on COMMUNE-AID for a purchase (triggered by event TRIG), for the client to sign for purchase-claim-signed. [stock; callable by an enrolled device]",
      "inputSchema": {
        "type": "object",
        "properties": {
          "commune-aid": {
            "type": "string",
            "pattern": "^[A-Z][A-Za-z0-9_-]{43}$",
            "description": "a KERI AID prefix",
            "x-playnet-shape": "aid"
          },
          "spec": {
            "type": "string",
            "description": "a resource-specification id",
            "x-playnet-shape": "spec"
          },
          "qty": {
            "type": "number",
            "description": "the quantity of SPEC in UNIT, a positive number",
            "x-playnet-shape": "number"
          },
          "unit": {
            "type": "string",
            "description": "a unit symbol, e.g. kg, h, each",
            "x-playnet-shape": "unit"
          },
          "due": {
            "type": "string",
            "format": "date-time",
            "description": "civil ISO 8601 at the boundary",
            "x-playnet-shape": "instant"
          },
          "res": {
            "type": "string",
            "description": "the exact resource id the grant or claim names, \"\" when unnamed",
            "x-playnet-shape": "id"
          },
          "ref": {
            "type": "string",
            "description": "on the signing legs a caller nonce folded into the SAID (\"\" = none); on slots-watch a CapTP watcher reference",
            "x-playnet-shape": "string"
          },
          "trig": {
            "type": "string",
            "description": "the record-purchase event id the claim is triggered by, \"\" when none",
            "x-playnet-shape": "string"
          }
        },
        "required": [
          "commune-aid",
          "spec",
          "qty",
          "unit",
          "due",
          "res",
          "ref",
          "trig"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "openWorldHint": false
      },
      "x-playnet-auth": "device",
      "x-playnet-topic": "stock",
      "x-playnet-http": "/api/session/purchase-claim-preimage"
    },
    {
      "name": "session.purchase-claim-signed",
      "title": "stock: purchase-claim-signed",
      "description": "Issues the reimbursement claim under this AID's own SIGNATURE over the purchase-claim-preimage fields; replies (ok said) or an error. [stock; callable by an enrolled device]",
      "inputSchema": {
        "type": "object",
        "properties": {
          "commune-aid": {
            "type": "string",
            "pattern": "^[A-Z][A-Za-z0-9_-]{43}$",
            "description": "a KERI AID prefix",
            "x-playnet-shape": "aid"
          },
          "spec": {
            "type": "string",
            "description": "a resource-specification id",
            "x-playnet-shape": "spec"
          },
          "qty": {
            "type": "number",
            "description": "the quantity of SPEC in UNIT, a positive number",
            "x-playnet-shape": "number"
          },
          "unit": {
            "type": "string",
            "description": "a unit symbol, e.g. kg, h, each",
            "x-playnet-shape": "unit"
          },
          "due": {
            "type": "string",
            "format": "date-time",
            "description": "civil ISO 8601 at the boundary",
            "x-playnet-shape": "instant"
          },
          "res": {
            "type": "string",
            "description": "the exact resource id the grant or claim names, \"\" when unnamed",
            "x-playnet-shape": "id"
          },
          "ref": {
            "type": "string",
            "description": "on the signing legs a caller nonce folded into the SAID (\"\" = none); on slots-watch a CapTP watcher reference",
            "x-playnet-shape": "string"
          },
          "trig": {
            "type": "string",
            "description": "the record-purchase event id the claim is triggered by, \"\" when none",
            "x-playnet-shape": "string"
          },
          "signature": {
            "type": "string",
            "description": "a CESR qb64 signature",
            "x-playnet-shape": "qb64"
          }
        },
        "required": [
          "commune-aid",
          "spec",
          "qty",
          "unit",
          "due",
          "res",
          "ref",
          "trig",
          "signature"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "openWorldHint": false
      },
      "x-playnet-auth": "device",
      "x-playnet-topic": "stock",
      "x-playnet-http": "/api/session/purchase-claim-signed"
    },
    {
      "name": "session.lapsed-lends",
      "title": "custody: lapsed-lends",
      "description": "Replies (ok rows), this AID's lends whose window closed and that the books presumed returned: said, spec, commune, due, qty, whether the owner has reported it unreturned or worn, and the condition floor they set (\"\" when none). [custody; callable by an enrolled device]",
      "inputSchema": {
        "type": "object",
        "properties": {},
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "openWorldHint": false
      },
      "x-playnet-auth": "device",
      "x-playnet-topic": "custody",
      "x-playnet-http": "/api/session/lapsed-lends"
    },
    {
      "name": "session.report-unreturned-preimage",
      "title": "custody: report-unreturned-preimage",
      "description": "Replies (ok fields), the SAID fields of the claim this AID would raise on COMMUNE-AID that the lapsed lend GRANT-SAID did not come back (REASON not-returned, or below-floor), for the client to sign for report-unreturned-signed. [custody; callable by an enrolled device]",
      "inputSchema": {
        "type": "object",
        "properties": {
          "commune-aid": {
            "type": "string",
            "pattern": "^[A-Z][A-Za-z0-9_-]{43}$",
            "description": "a KERI AID prefix",
            "x-playnet-shape": "aid"
          },
          "grant-said": {
            "type": "string",
            "pattern": "^[A-Z][A-Za-z0-9_-]{43}$",
            "description": "a SAID",
            "x-playnet-shape": "said"
          },
          "reason": {
            "type": "string",
            "x-playnet-shape": "string"
          }
        },
        "required": [
          "commune-aid",
          "grant-said",
          "reason"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "openWorldHint": false
      },
      "x-playnet-auth": "device",
      "x-playnet-topic": "custody",
      "x-playnet-http": "/api/session/report-unreturned-preimage"
    },
    {
      "name": "session.report-unreturned-signed",
      "title": "custody: report-unreturned-signed",
      "description": "Issues the unreturned-lend claim under this AID's own SIGNATURE over the report-unreturned-preimage fields and states it on COMMUNE-AID's books, where it stands in what the commune owes until a recorded return settles it; replies (ok said) or an error. [custody; callable by an enrolled device]",
      "inputSchema": {
        "type": "object",
        "properties": {
          "commune-aid": {
            "type": "string",
            "pattern": "^[A-Z][A-Za-z0-9_-]{43}$",
            "description": "a KERI AID prefix",
            "x-playnet-shape": "aid"
          },
          "grant-said": {
            "type": "string",
            "pattern": "^[A-Z][A-Za-z0-9_-]{43}$",
            "description": "a SAID",
            "x-playnet-shape": "said"
          },
          "reason": {
            "type": "string",
            "x-playnet-shape": "string"
          },
          "signature": {
            "type": "string",
            "description": "a CESR qb64 signature",
            "x-playnet-shape": "qb64"
          }
        },
        "required": [
          "commune-aid",
          "grant-said",
          "reason",
          "signature"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "openWorldHint": false
      },
      "x-playnet-auth": "device",
      "x-playnet-topic": "custody",
      "x-playnet-http": "/api/session/report-unreturned-signed"
    },
    {
      "name": "session.accept-socialization",
      "title": "custody: accept-socialization",
      "description": "Accepts custody grant GRANT-SAID into COMMUNE-AID's scope as this AID and tells the planner the pool moved; any authenticated member may accept today; replies (ok result) or an error. [custody; callable by an enrolled device]",
      "inputSchema": {
        "type": "object",
        "properties": {
          "commune-aid": {
            "type": "string",
            "pattern": "^[A-Z][A-Za-z0-9_-]{43}$",
            "description": "a KERI AID prefix",
            "x-playnet-shape": "aid"
          },
          "grant-said": {
            "type": "string",
            "pattern": "^[A-Z][A-Za-z0-9_-]{43}$",
            "description": "a SAID",
            "x-playnet-shape": "said"
          }
        },
        "required": [
          "commune-aid",
          "grant-said"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "openWorldHint": false
      },
      "x-playnet-auth": "device",
      "x-playnet-topic": "custody",
      "x-playnet-http": "/api/session/accept-socialization"
    },
    {
      "name": "session.accept-reimbursement",
      "title": "stock: accept-reimbursement",
      "description": "Accepts reimbursement claim CLAIM-SAID for COMMUNE-AID as this AID, minting the commons' debt, refusing the claimant's own claim; replies (ok debt-said amount) or an error. [stock; callable by an enrolled device]",
      "inputSchema": {
        "type": "object",
        "properties": {
          "commune-aid": {
            "type": "string",
            "pattern": "^[A-Z][A-Za-z0-9_-]{43}$",
            "description": "a KERI AID prefix",
            "x-playnet-shape": "aid"
          },
          "claim-said": {
            "type": "string",
            "pattern": "^[A-Z][A-Za-z0-9_-]{43}$",
            "description": "a SAID",
            "x-playnet-shape": "said"
          }
        },
        "required": [
          "commune-aid",
          "claim-said"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "openWorldHint": false
      },
      "x-playnet-auth": "device",
      "x-playnet-topic": "stock",
      "x-playnet-http": "/api/session/accept-reimbursement"
    },
    {
      "name": "session.own-means-preimage",
      "title": "custody: own-means-preimage",
      "description": "Replies (ok fields), the SAID fields of the ownership title this AID would issue itself over RESOURCE-ID, for the client to sign for own-means-signed. [custody; callable by an enrolled device]",
      "inputSchema": {
        "type": "object",
        "properties": {
          "resource-id": {
            "type": "string",
            "description": "an economic-resource id in the scope (own-means: the titled thing; claim/resource-detail: the good)",
            "x-playnet-shape": "id"
          },
          "spec": {
            "type": "string",
            "description": "a resource-specification id",
            "x-playnet-shape": "spec"
          },
          "qty": {
            "type": "number",
            "description": "the quantity of SPEC in UNIT, a positive number",
            "x-playnet-shape": "number"
          },
          "qty-unit": {
            "type": "string",
            "description": "a unit symbol, e.g. kg, h, each",
            "x-playnet-shape": "unit"
          },
          "ref": {
            "type": "string",
            "description": "on the signing legs a caller nonce folded into the SAID (\"\" = none); on slots-watch a CapTP watcher reference",
            "x-playnet-shape": "string"
          }
        },
        "required": [
          "resource-id",
          "spec",
          "qty",
          "qty-unit",
          "ref"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "openWorldHint": false
      },
      "x-playnet-auth": "device",
      "x-playnet-topic": "custody",
      "x-playnet-http": "/api/session/own-means-preimage"
    },
    {
      "name": "session.own-means-signed",
      "title": "custody: own-means-signed",
      "description": "Issues the ownership title over RESOURCE-ID under this AID's own SIGNATURE over the own-means-preimage fields; replies (ok said) or an error. [custody; callable by an enrolled device]",
      "inputSchema": {
        "type": "object",
        "properties": {
          "resource-id": {
            "type": "string",
            "description": "an economic-resource id in the scope (own-means: the titled thing; claim/resource-detail: the good)",
            "x-playnet-shape": "id"
          },
          "spec": {
            "type": "string",
            "description": "a resource-specification id",
            "x-playnet-shape": "spec"
          },
          "qty": {
            "type": "number",
            "description": "the quantity of SPEC in UNIT, a positive number",
            "x-playnet-shape": "number"
          },
          "qty-unit": {
            "type": "string",
            "description": "a unit symbol, e.g. kg, h, each",
            "x-playnet-shape": "unit"
          },
          "ref": {
            "type": "string",
            "description": "on the signing legs a caller nonce folded into the SAID (\"\" = none); on slots-watch a CapTP watcher reference",
            "x-playnet-shape": "string"
          },
          "signature": {
            "type": "string",
            "description": "a CESR qb64 signature",
            "x-playnet-shape": "qb64"
          }
        },
        "required": [
          "resource-id",
          "spec",
          "qty",
          "qty-unit",
          "ref",
          "signature"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "openWorldHint": false
      },
      "x-playnet-auth": "device",
      "x-playnet-topic": "custody",
      "x-playnet-http": "/api/session/own-means-signed"
    },
    {
      "name": "session.my-titles",
      "title": "custody: my-titles",
      "description": "Replies (ok rows), the live ownership titles this AID holds: said, resource id, spec and kind. [custody; callable by an enrolled device]",
      "inputSchema": {
        "type": "object",
        "properties": {},
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "openWorldHint": false
      },
      "x-playnet-auth": "device",
      "x-playnet-topic": "custody",
      "x-playnet-http": "/api/session/my-titles"
    },
    {
      "name": "session.disown-means",
      "title": "custody: disown-means",
      "description": "Withdraws this AID's ownership title SAID by revoking it; replies (ok . result) or an error. [custody; callable by an enrolled device]",
      "inputSchema": {
        "type": "object",
        "properties": {
          "said": {
            "type": "string",
            "pattern": "^[A-Z][A-Za-z0-9_-]{43}$",
            "description": "a SAID",
            "x-playnet-shape": "said"
          }
        },
        "required": [
          "said"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "openWorldHint": false
      },
      "x-playnet-auth": "device",
      "x-playnet-topic": "custody",
      "x-playnet-http": "/api/session/disown-means"
    },
    {
      "name": "session.delegation-preimage",
      "title": "governance: delegation-preimage",
      "description": "Replies (ok fields), the SAID fields of the liquid delegation of FRACTION to DELEGATE-AID — federation-wide, or scoped to SCOPE-ID when given — for the client to sign for set-delegation-signed. Pass the SAME SCOPE-ID there: it is baked into this SAID. [governance; callable by an enrolled device]",
      "inputSchema": {
        "type": "object",
        "properties": {
          "delegate-aid": {
            "type": "string",
            "pattern": "^[A-Z][A-Za-z0-9_-]{43}$",
            "description": "a KERI AID prefix",
            "x-playnet-shape": "aid"
          },
          "fraction": {
            "type": "number",
            "description": "the share of the caller's voice delegated, a number in (0, 1]",
            "x-playnet-shape": "number"
          },
          "scope-id": {
            "type": "string",
            "description": "a scope (commune) id",
            "x-playnet-shape": "scope-id"
          }
        },
        "required": [
          "delegate-aid",
          "fraction"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "openWorldHint": false
      },
      "x-playnet-auth": "device",
      "x-playnet-topic": "governance",
      "x-playnet-http": "/api/session/delegation-preimage"
    },
    {
      "name": "session.set-delegation-signed",
      "title": "governance: set-delegation-signed",
      "description": "Records the delegation of FRACTION to DELEGATE-AID under this AID's own SIGNATURE over the delegation-preimage fields; SCOPE-ID must match the one that preimage was asked for. Replies ok or an error. [governance; callable by an enrolled device]",
      "inputSchema": {
        "type": "object",
        "properties": {
          "delegate-aid": {
            "type": "string",
            "pattern": "^[A-Z][A-Za-z0-9_-]{43}$",
            "description": "a KERI AID prefix",
            "x-playnet-shape": "aid"
          },
          "fraction": {
            "type": "number",
            "description": "the share of the caller's voice delegated, a number in (0, 1]",
            "x-playnet-shape": "number"
          },
          "signature": {
            "type": "string",
            "description": "a CESR qb64 signature",
            "x-playnet-shape": "qb64"
          },
          "scope-id": {
            "type": "string",
            "description": "a scope (commune) id",
            "x-playnet-shape": "scope-id"
          }
        },
        "required": [
          "delegate-aid",
          "fraction",
          "signature"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "openWorldHint": false
      },
      "x-playnet-auth": "device",
      "x-playnet-topic": "governance",
      "x-playnet-http": "/api/session/set-delegation-signed"
    },
    {
      "name": "session.close",
      "title": "governance: close",
      "description": "Closes proposal ID as this governor AID, recording the tally and issuing a signed tally-result credential for a ballot; with RATIFY-TYPE and RATIFY-SPEC (promote-rule, repeal-rule, admit-commune, … and what it names) it also mints the ratification the act takes when RATIFY-POSITION — the winner, when none is named — carries the scope's carries-threshold. Replies (ok id), (ok id ratification-said) or an error. [governance; callable by an enrolled device]",
      "inputSchema": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "on open/cast/close/get-result a proposal id; on retire-payout/settle-payout a payout intent id; on add-scope! a scope id",
            "x-playnet-shape": "id"
          },
          "ratify-type": {
            "type": "string",
            "description": "the type of the ratification a carried close mints, naming the act that takes it: promote-rule, repeal-rule, admit-commune, …; absent, no ratification",
            "x-playnet-shape": "string"
          },
          "ratify-spec": {
            "type": "string",
            "description": "what the ratified act names — a rule's label, a commune's AID — the spec the act is later checked against",
            "x-playnet-shape": "string"
          },
          "ratify-position": {
            "type": "string",
            "description": "the position whose carrying is the consent, in the ballot's own words (yes, accept, …); absent, the winner",
            "x-playnet-shape": "string"
          }
        },
        "required": [
          "id"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "openWorldHint": false
      },
      "x-playnet-auth": "device",
      "x-playnet-topic": "governance",
      "x-playnet-http": "/api/session/close"
    },
    {
      "name": "session.contest-rule",
      "title": "law: contest-rule",
      "description": "Contests the reading of the law LABEL in SCOPE-ID as this AID, a member of the scope: opens the ballot contest:rule:LABEL under the scope's producer voice, positions doubt and stands, REASON as its question; at the close, doubt at the scope's carries-threshold or more holds the rule at uncertain in the scope's own registry, where it prices and warns and no longer prunes or cancels. Replies (ok id), or an error when no such rule stands, it is already in doubt, the caller is no member, or it is already contested. [law; callable by an enrolled device]",
      "inputSchema": {
        "type": "object",
        "properties": {
          "scope-id": {
            "type": "string",
            "description": "a scope (commune) id",
            "x-playnet-shape": "scope-id"
          },
          "label": {
            "type": "string",
            "description": "the human name of the social invite, stored as the intent's name",
            "x-playnet-shape": "string"
          },
          "reason": {
            "type": "string",
            "x-playnet-shape": "string"
          }
        },
        "required": [
          "scope-id",
          "label",
          "reason"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "openWorldHint": false
      },
      "x-playnet-auth": "device",
      "x-playnet-topic": "law",
      "x-playnet-http": "/api/session/contest-rule"
    },
    {
      "name": "session.rules",
      "title": "law: rules",
      "description": "Replies the readings SCOPE-ID stands under: each rule's label, source, confidence, steward, as-of and until, and how many demands and derogations it carries. [law; callable by an enrolled device]",
      "inputSchema": {
        "type": "object",
        "properties": {
          "scope-id": {
            "type": "string",
            "description": "a scope (commune) id",
            "x-playnet-shape": "scope-id"
          }
        },
        "required": [
          "scope-id"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "openWorldHint": false
      },
      "x-playnet-auth": "device",
      "x-playnet-topic": "law",
      "x-playnet-http": "/api/session/rules"
    },
    {
      "name": "session.propose-rule",
      "title": "law: propose-rule",
      "description": "Proposes a reading of the law into SCOPE-ID's registry as this governor AID: RULE-SEXP is the rule in the pack's spelling, read as data; it lands at reported under this AID's name whatever it said of itself, and a rule carrying a derogation is refused (it enters verified by promote-rule). Replies (ok label) or an error. [law; callable by an enrolled device]",
      "inputSchema": {
        "type": "object",
        "properties": {
          "scope-id": {
            "type": "string",
            "description": "a scope (commune) id",
            "x-playnet-shape": "scope-id"
          },
          "rule-sexp": {
            "type": "string",
            "description": "a rule of law in the pack's one spelling, as text: (guard demands label source as-of confidence steward [until cancels]); read as data, never evaluated",
            "x-playnet-shape": "string"
          }
        },
        "required": [
          "scope-id",
          "rule-sexp"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "openWorldHint": false
      },
      "x-playnet-auth": "device",
      "x-playnet-topic": "law",
      "x-playnet-http": "/api/session/propose-rule"
    },
    {
      "name": "session.promote-rule",
      "title": "law: promote-rule",
      "description": "Lifts the reading LABEL in SCOPE-ID to verified as this governor AID, so what it names prunes and cancels; RATIFICATION is the SAID a close of type promote-rule naming LABEL minted, required when the scope's governance-policy asks for one. Replies (ok label) or an error. [law; callable by an enrolled device]",
      "inputSchema": {
        "type": "object",
        "properties": {
          "scope-id": {
            "type": "string",
            "description": "a scope (commune) id",
            "x-playnet-shape": "scope-id"
          },
          "label": {
            "type": "string",
            "description": "the human name of the social invite, stored as the intent's name",
            "x-playnet-shape": "string"
          },
          "ratification": {
            "type": "string",
            "pattern": "^[A-Z][A-Za-z0-9_-]{43}$",
            "description": "a SAID",
            "x-playnet-shape": "said"
          }
        },
        "required": [
          "scope-id",
          "label"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "openWorldHint": false
      },
      "x-playnet-auth": "device",
      "x-playnet-topic": "law",
      "x-playnet-http": "/api/session/promote-rule"
    },
    {
      "name": "session.repeal-rule",
      "title": "law: repeal-rule",
      "description": "Repeals the reading LABEL from SCOPE-ID's registry as this governor AID; RATIFICATION is the SAID a close of type repeal-rule naming LABEL minted, required when the scope's governance-policy asks for one. Replies (ok label) or an error. [law; callable by an enrolled device]",
      "inputSchema": {
        "type": "object",
        "properties": {
          "scope-id": {
            "type": "string",
            "description": "a scope (commune) id",
            "x-playnet-shape": "scope-id"
          },
          "label": {
            "type": "string",
            "description": "the human name of the social invite, stored as the intent's name",
            "x-playnet-shape": "string"
          },
          "ratification": {
            "type": "string",
            "pattern": "^[A-Z][A-Za-z0-9_-]{43}$",
            "description": "a SAID",
            "x-playnet-shape": "said"
          }
        },
        "required": [
          "scope-id",
          "label"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "openWorldHint": false
      },
      "x-playnet-auth": "device",
      "x-playnet-topic": "law",
      "x-playnet-http": "/api/session/repeal-rule"
    },
    {
      "name": "session.present-reading",
      "title": "law: present-reading",
      "description": "Presents a reading of the law another scope wrote, CARD its credential as a JSON object, into SCOPE-ID's registry: sound, its steward a scope this gateway knows, it joins the registry in doubt — pricing and warning, never pruning — until this scope stands behind it by promote-rule. Replies (ok label) or an error. [law; callable by an enrolled device]",
      "inputSchema": {
        "type": "object",
        "properties": {
          "scope-id": {
            "type": "string",
            "description": "a scope (commune) id",
            "x-playnet-shape": "scope-id"
          },
          "card": {
            "type": "object",
            "additionalProperties": true,
            "description": "a credential as a JSON object — said, schema, issuer, holder, claims, edges, signature — as a bundle carries it",
            "x-playnet-shape": "alist"
          }
        },
        "required": [
          "scope-id",
          "card"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "openWorldHint": false
      },
      "x-playnet-auth": "device",
      "x-playnet-topic": "law",
      "x-playnet-http": "/api/session/present-reading"
    },
    {
      "name": "session.present-recipe",
      "title": "knowledge: present-recipe",
      "description": "Presents a recipe a body or a scope stands behind, CARD its credential as a JSON object, into SCOPE-ID's recipe store: sound, its issuer a body admitted here or a scope this gateway knows, its records land in the store's one spelling at the issuer's standing. Replies (ok recipe-id) or an error. [knowledge; callable by an enrolled device]",
      "inputSchema": {
        "type": "object",
        "properties": {
          "scope-id": {
            "type": "string",
            "description": "a scope (commune) id",
            "x-playnet-shape": "scope-id"
          },
          "card": {
            "type": "object",
            "additionalProperties": true,
            "description": "a credential as a JSON object — said, schema, issuer, holder, claims, edges, signature — as a bundle carries it",
            "x-playnet-shape": "alist"
          }
        },
        "required": [
          "scope-id",
          "card"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": true,
        "openWorldHint": false
      },
      "x-playnet-auth": "device",
      "x-playnet-topic": "knowledge",
      "x-playnet-http": "/api/session/present-recipe"
    },
    {
      "name": "session.set-policy",
      "title": "governance: set-policy",
      "description": "Sets one governed number of the scope SCOPE-AID as this governor AID: ROW is governance-policy or legal-policy, KEY one the row's defaults name, VALUE of the default's own shape (a boolean, a number, or a list of numbers); written through the scope's own gov-cap setter and read fresh by the next act. Replies (ok row key) or an error. [governance; callable by an enrolled device]",
      "inputSchema": {
        "type": "object",
        "properties": {
          "scope-aid": {
            "type": "string",
            "pattern": "^[A-Z][A-Za-z0-9_-]{43}$",
            "description": "a KERI AID prefix",
            "x-playnet-shape": "aid"
          },
          "row": {
            "type": "string",
            "description": "the governed row: governance-policy or legal-policy",
            "x-playnet-shape": "string"
          },
          "key": {
            "type": "string",
            "description": "a key the row's defaults name, e.g. carries-threshold, require-ratification, uncertain-forbid",
            "x-playnet-shape": "string"
          },
          "value": {
            "description": "the key's new value, of its default's own shape: a boolean, a number, or a list of numbers",
            "x-playnet-shape": "any"
          }
        },
        "required": [
          "scope-aid",
          "row",
          "key",
          "value"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "openWorldHint": false
      },
      "x-playnet-auth": "device",
      "x-playnet-topic": "governance",
      "x-playnet-http": "/api/session/set-policy"
    },
    {
      "name": "session.contest-work",
      "title": "governance: contest-work",
      "description": "Contests work EVENT-ID in SCOPE-ID as this AID, a member of the scope other than the worker: opens the ballot contest:EVENT-ID under the scope's producer voice with the worker's voice left out, positions void and stands, REASON as its question; at the close, void at half the voice or more corrects the work to nothing. A count's adjustment, its record or its hours may be named: the contest is the count's, one per count, and at the close every part of the count is corrected to nothing. Replies (ok id), or an error when the event is no standing work or count, the caller is the worker or no member, or the work is already contested. [governance; callable by an enrolled device]",
      "inputSchema": {
        "type": "object",
        "properties": {
          "scope-id": {
            "type": "string",
            "description": "a scope (commune) id",
            "x-playnet-shape": "scope-id"
          },
          "event-id": {
            "type": "string",
            "description": "the id of a recorded economic event the witness ceremony opens over",
            "x-playnet-shape": "id"
          },
          "reason": {
            "type": "string",
            "x-playnet-shape": "string"
          }
        },
        "required": [
          "scope-id",
          "event-id",
          "reason"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "openWorldHint": false
      },
      "x-playnet-auth": "device",
      "x-playnet-topic": "governance",
      "x-playnet-http": "/api/session/contest-work"
    },
    {
      "name": "session.list-proposals",
      "title": "governance: list-proposals",
      "description": "Lists every proposal known to the ballot store as (id . status) pairs, status open or closed. [governance; callable by an enrolled device]",
      "inputSchema": {
        "type": "object",
        "properties": {},
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "openWorldHint": false
      },
      "x-playnet-auth": "device",
      "x-playnet-topic": "governance",
      "x-playnet-http": "/api/session/list-proposals"
    },
    {
      "name": "session.get-result",
      "title": "governance: get-result",
      "description": "Replies proposal ID's result with its meta: (closed . tally) once closed, (open . live-tally) while open, or an error for an unknown id. [governance; callable by an enrolled device]",
      "inputSchema": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "on open/cast/close/get-result a proposal id; on retire-payout/settle-payout a payout intent id; on add-scope! a scope id",
            "x-playnet-shape": "id"
          }
        },
        "required": [
          "id"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "openWorldHint": false
      },
      "x-playnet-auth": "device",
      "x-playnet-topic": "governance",
      "x-playnet-http": "/api/session/get-result"
    },
    {
      "name": "session.list-delegations",
      "title": "governance: list-delegations",
      "description": "Lists this AID's federation-default delegations as (delegate-aid fraction mandated?) rows. [governance; callable by an enrolled device]",
      "inputSchema": {
        "type": "object",
        "properties": {},
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "openWorldHint": false
      },
      "x-playnet-auth": "device",
      "x-playnet-topic": "governance",
      "x-playnet-http": "/api/session/list-delegations"
    },
    {
      "name": "session.my-voice",
      "title": "governance: my-voice",
      "description": "Replies this AID's producer voice (labour share) and consumer voice (share of the claimable pool, -1 when the pool is empty) across the scope roots. [governance; callable by an enrolled device]",
      "inputSchema": {
        "type": "object",
        "properties": {},
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "openWorldHint": false
      },
      "x-playnet-auth": "device",
      "x-playnet-topic": "governance",
      "x-playnet-http": "/api/session/my-voice"
    },
    {
      "name": "session.voice-in",
      "title": "governance: voice-in",
      "description": "Replies this AID's producer voice in the one commune SCOPE-ID, the ballot weight its franchise gives; a commune the gateway cannot name answers 0. [governance; callable by an enrolled device]",
      "inputSchema": {
        "type": "object",
        "properties": {
          "scope-id": {
            "type": "string",
            "description": "a scope (commune) id",
            "x-playnet-shape": "scope-id"
          }
        },
        "required": [
          "scope-id"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "openWorldHint": false
      },
      "x-playnet-auth": "device",
      "x-playnet-topic": "governance",
      "x-playnet-http": "/api/session/voice-in"
    },
    {
      "name": "session.list-uc-proposals",
      "title": "governance: list-uc-proposals",
      "description": "Lists the universal commune's pending cross-gateway merge proposals as (id proposal) pairs, or () when no registry is set. [governance; callable by an enrolled device]",
      "inputSchema": {
        "type": "object",
        "properties": {},
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "openWorldHint": false
      },
      "x-playnet-auth": "device",
      "x-playnet-topic": "governance",
      "x-playnet-http": "/api/session/list-uc-proposals"
    },
    {
      "name": "session.set-delegation",
      "title": "governance: set-delegation",
      "description": "Records an unsigned delegation of FRACTION to DELEGATE-AID, federation-wide or scoped to SCOPE-ID when given; replies ok. Use set-delegation-signed when the client can sign. [governance; callable by an enrolled device]",
      "inputSchema": {
        "type": "object",
        "properties": {
          "delegate-aid": {
            "type": "string",
            "pattern": "^[A-Z][A-Za-z0-9_-]{43}$",
            "description": "a KERI AID prefix",
            "x-playnet-shape": "aid"
          },
          "fraction": {
            "type": "number",
            "description": "the share of the caller's voice delegated, a number in (0, 1]",
            "x-playnet-shape": "number"
          },
          "scope-id": {
            "type": "string",
            "description": "a scope (commune) id",
            "x-playnet-shape": "scope-id"
          }
        },
        "required": [
          "delegate-aid",
          "fraction"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "openWorldHint": false
      },
      "x-playnet-auth": "device",
      "x-playnet-topic": "governance",
      "x-playnet-http": "/api/session/set-delegation"
    },
    {
      "name": "session.delegation-mandated-preimage",
      "title": "governance: delegation-mandated-preimage",
      "description": "Replies (ok fields), the SAID fields of a delegation to DELEGATE-AID carrying the data MANDATE-SPEC — federation-wide, or scoped to SCOPE-ID when given — for the client to sign for set-delegation-mandated-signed. [governance; callable by an enrolled device]",
      "inputSchema": {
        "type": "object",
        "properties": {
          "delegate-aid": {
            "type": "string",
            "pattern": "^[A-Z][A-Za-z0-9_-]{43}$",
            "description": "a KERI AID prefix",
            "x-playnet-shape": "aid"
          },
          "fraction": {
            "type": "number",
            "description": "the share of the caller's voice delegated, a number in (0, 1]",
            "x-playnet-shape": "number"
          },
          "mandate-spec": {
            "type": "string",
            "contentMediaType": "application/json",
            "description": "a JSON document, as a string",
            "x-playnet-shape": "json"
          },
          "scope-id": {
            "type": "string",
            "description": "a scope (commune) id",
            "x-playnet-shape": "scope-id"
          }
        },
        "required": [
          "delegate-aid",
          "fraction",
          "mandate-spec"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "openWorldHint": false
      },
      "x-playnet-auth": "device",
      "x-playnet-topic": "governance",
      "x-playnet-http": "/api/session/delegation-mandated-preimage"
    },
    {
      "name": "session.set-delegation-mandated-signed",
      "title": "governance: set-delegation-mandated-signed",
      "description": "Compiles MANDATE-SPEC into its predicate and records the mandated delegation under this AID's own SIGNATURE; SCOPE-ID must match the preimage's. Replies ok or an error for an unrecognized spec or bad signature. [governance; callable by an enrolled device]",
      "inputSchema": {
        "type": "object",
        "properties": {
          "delegate-aid": {
            "type": "string",
            "pattern": "^[A-Z][A-Za-z0-9_-]{43}$",
            "description": "a KERI AID prefix",
            "x-playnet-shape": "aid"
          },
          "fraction": {
            "type": "number",
            "description": "the share of the caller's voice delegated, a number in (0, 1]",
            "x-playnet-shape": "number"
          },
          "mandate-spec": {
            "type": "string",
            "contentMediaType": "application/json",
            "description": "a JSON document, as a string",
            "x-playnet-shape": "json"
          },
          "signature": {
            "type": "string",
            "description": "a CESR qb64 signature",
            "x-playnet-shape": "qb64"
          },
          "scope-id": {
            "type": "string",
            "description": "a scope (commune) id",
            "x-playnet-shape": "scope-id"
          }
        },
        "required": [
          "delegate-aid",
          "fraction",
          "mandate-spec",
          "signature"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "openWorldHint": false
      },
      "x-playnet-auth": "device",
      "x-playnet-topic": "governance",
      "x-playnet-http": "/api/session/set-delegation-mandated-signed"
    },
    {
      "name": "session.revoke-delegation",
      "title": "governance: revoke-delegation",
      "description": "Revokes this AID's delegation to DELEGATE-AID, federation-wide or for SCOPE-ID when given; replies ok. [governance; callable by an enrolled device]",
      "inputSchema": {
        "type": "object",
        "properties": {
          "delegate-aid": {
            "type": "string",
            "pattern": "^[A-Z][A-Za-z0-9_-]{43}$",
            "description": "a KERI AID prefix",
            "x-playnet-shape": "aid"
          },
          "scope-id": {
            "type": "string",
            "description": "a scope (commune) id",
            "x-playnet-shape": "scope-id"
          }
        },
        "required": [
          "delegate-aid"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "openWorldHint": false
      },
      "x-playnet-auth": "device",
      "x-playnet-topic": "governance",
      "x-playnet-http": "/api/session/revoke-delegation"
    },
    {
      "name": "session.witness-open",
      "title": "commitments: witness-open",
      "description": "Opens the witness ceremony over recorded event EVENT-ID in SCOPE-ID as this AID with the scope's agents as roster; replies (ok (said)) or a failure such as needs-personhood. [commitments; callable by an enrolled device]",
      "inputSchema": {
        "type": "object",
        "properties": {
          "scope-id": {
            "type": "string",
            "description": "a scope (commune) id",
            "x-playnet-shape": "scope-id"
          },
          "event-id": {
            "type": "string",
            "description": "the id of a recorded economic event the witness ceremony opens over",
            "x-playnet-shape": "id"
          }
        },
        "required": [
          "scope-id",
          "event-id"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "openWorldHint": false
      },
      "x-playnet-auth": "device",
      "x-playnet-topic": "commitments",
      "x-playnet-http": "/api/session/witness-open"
    },
    {
      "name": "session.witness-inbox",
      "title": "commitments: witness-inbox",
      "description": "Replies (ok (requests)), the ceremony statements in SCOPE-ID this AID may co-sign, or a failure when witnessing is unwired. [commitments; callable by an enrolled device]",
      "inputSchema": {
        "type": "object",
        "properties": {
          "scope-id": {
            "type": "string",
            "description": "a scope (commune) id",
            "x-playnet-shape": "scope-id"
          }
        },
        "required": [
          "scope-id"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "openWorldHint": false
      },
      "x-playnet-auth": "device",
      "x-playnet-topic": "commitments",
      "x-playnet-http": "/api/session/witness-inbox"
    },
    {
      "name": "session.witness-attest",
      "title": "commitments: witness-attest",
      "description": "Lands this AID's co-signature SIG on ceremony statement SAID; replies (ok (status)) as attested or finalized, or a failure. [commitments; callable by an enrolled device]",
      "inputSchema": {
        "type": "object",
        "properties": {
          "scope-id": {
            "type": "string",
            "description": "a scope (commune) id",
            "x-playnet-shape": "scope-id"
          },
          "said": {
            "type": "string",
            "pattern": "^[A-Z][A-Za-z0-9_-]{43}$",
            "description": "a SAID",
            "x-playnet-shape": "said"
          },
          "sig": {
            "type": "string",
            "description": "a CESR qb64 signature",
            "x-playnet-shape": "qb64"
          }
        },
        "required": [
          "scope-id",
          "said",
          "sig"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "openWorldHint": false
      },
      "x-playnet-auth": "device",
      "x-playnet-topic": "commitments",
      "x-playnet-http": "/api/session/witness-attest"
    },
    {
      "name": "session.journey-begin",
      "title": "commitments: journey-begin",
      "description": "Records this AID's ride commitment by MODE from FROM-PLACE to TO-PLACE and its pickup event at departure; replies (ok (commitment . id)) or needs-personhood. [commitments; callable by an enrolled device]",
      "inputSchema": {
        "type": "object",
        "properties": {
          "scope-id": {
            "type": "string",
            "description": "a scope (commune) id",
            "x-playnet-shape": "scope-id"
          },
          "from-place": {
            "type": "string",
            "description": "a place id or name",
            "x-playnet-shape": "place"
          },
          "to-place": {
            "type": "string",
            "description": "a place id or name",
            "x-playnet-shape": "place"
          },
          "mode": {
            "type": "string",
            "description": "a symbol, sent as its name",
            "x-playnet-shape": "symbol"
          }
        },
        "required": [
          "scope-id",
          "from-place",
          "to-place",
          "mode"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "openWorldHint": false
      },
      "x-playnet-auth": "device",
      "x-playnet-topic": "commitments",
      "x-playnet-http": "/api/session/journey-begin"
    },
    {
      "name": "session.journey-end",
      "title": "commitments: journey-end",
      "description": "Records the dropoff event that fulfils this AID's ride COMMITMENT-ID at arrival; replies (ok (commitment . id)). [commitments; callable by an enrolled device]",
      "inputSchema": {
        "type": "object",
        "properties": {
          "scope-id": {
            "type": "string",
            "description": "a scope (commune) id",
            "x-playnet-shape": "scope-id"
          },
          "commitment-id": {
            "type": "string",
            "description": "the id of a commitment being fulfilled, effort-recorded or ended",
            "x-playnet-shape": "id"
          },
          "from-place": {
            "type": "string",
            "description": "a place id or name",
            "x-playnet-shape": "place"
          },
          "to-place": {
            "type": "string",
            "description": "a place id or name",
            "x-playnet-shape": "place"
          },
          "mode": {
            "type": "string",
            "description": "a symbol, sent as its name",
            "x-playnet-shape": "symbol"
          }
        },
        "required": [
          "scope-id",
          "commitment-id",
          "from-place",
          "to-place",
          "mode"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "openWorldHint": false
      },
      "x-playnet-auth": "device",
      "x-playnet-topic": "commitments",
      "x-playnet-http": "/api/session/journey-end"
    },
    {
      "name": "session.chat-post",
      "title": "chat: chat-post",
      "description": "Posts BODY of MESSAGE-KIND (default \"text\") to SCOPE-ID/TOPIC as this AID, stamping its plan-resolved stratum; replies (ok . stored-row). [chat; callable by an enrolled device]",
      "inputSchema": {
        "type": "object",
        "properties": {
          "scope-id": {
            "type": "string",
            "description": "a scope (commune) id",
            "x-playnet-shape": "scope-id"
          },
          "topic": {
            "type": "string",
            "description": "a chat topic string under the scope: an intent/commitment id, a place, a walkie room, …",
            "x-playnet-shape": "string"
          },
          "body": {
            "type": "string",
            "contentMediaType": "application/json",
            "description": "a JSON document, as a string",
            "x-playnet-shape": "json"
          },
          "message-kind": {
            "type": "string",
            "description": "a chat message's kind, e.g. text or system; default text",
            "x-playnet-shape": "string"
          }
        },
        "required": [
          "scope-id",
          "topic",
          "body"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "openWorldHint": false
      },
      "x-playnet-auth": "device",
      "x-playnet-topic": "chat",
      "x-playnet-http": "/api/session/chat-post"
    },
    {
      "name": "session.accept-assignment",
      "title": "commitments: accept-assignment",
      "description": "Accepts suggested INTENT-ID in SCOPE-ID as this AID, promoting it to a commitment under the steward gate, then re-plans the scope; replies (ok . cid) or a failure. [commitments; callable by an enrolled device]",
      "inputSchema": {
        "type": "object",
        "properties": {
          "scope-id": {
            "type": "string",
            "description": "a scope (commune) id",
            "x-playnet-shape": "scope-id"
          },
          "intent-id": {
            "type": "string",
            "description": "the id of a suggested intent from materialize, accepted or declined by the worker",
            "x-playnet-shape": "id"
          }
        },
        "required": [
          "scope-id",
          "intent-id"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "openWorldHint": false
      },
      "x-playnet-auth": "device",
      "x-playnet-topic": "commitments",
      "x-playnet-http": "/api/session/accept-assignment"
    },
    {
      "name": "session.decline-assignment",
      "title": "commitments: decline-assignment",
      "description": "Declines suggested INTENT-ID as this AID in SCOPE-ID, rematching it when possible; replies (ok . new-provider) or (ok . cleared). [commitments; callable by an enrolled device]",
      "inputSchema": {
        "type": "object",
        "properties": {
          "scope-id": {
            "type": "string",
            "description": "a scope (commune) id",
            "x-playnet-shape": "scope-id"
          },
          "intent-id": {
            "type": "string",
            "description": "the id of a suggested intent from materialize, accepted or declined by the worker",
            "x-playnet-shape": "id"
          }
        },
        "required": [
          "scope-id",
          "intent-id"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "openWorldHint": false
      },
      "x-playnet-auth": "device",
      "x-playnet-topic": "commitments",
      "x-playnet-http": "/api/session/decline-assignment"
    },
    {
      "name": "session.transcribe",
      "title": "knowledge: transcribe",
      "description": "Sends base64 WAV audio to the AI service's transcription endpoint and replies the transcript string, or \"\" when keys are absent, the session's AI budget for the minute is spent, or the call fails, so the browser falls back to on-device transcription. [knowledge; callable by an enrolled device]",
      "inputSchema": {
        "type": "object",
        "properties": {
          "audio-b64": {
            "type": "string",
            "contentEncoding": "base64",
            "description": "a base64-encoded audio recording to transcribe",
            "x-playnet-shape": "base64"
          }
        },
        "required": [
          "audio-b64"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": true,
        "openWorldHint": false
      },
      "x-playnet-auth": "device",
      "x-playnet-topic": "knowledge",
      "x-playnet-http": "/api/session/transcribe"
    },
    {
      "name": "session.express",
      "title": "knowledge: express",
      "description": "Turns a natural-language sentence into Scheme through the AI service's express prompt and replies the completion string, or \"\" when no API keys are configured or the session's AI budget for the minute is spent. [knowledge; callable by an enrolled device]",
      "inputSchema": {
        "type": "object",
        "properties": {
          "nl-text": {
            "type": "string",
            "description": "a natural-language sentence to express as Scheme",
            "x-playnet-shape": "string"
          }
        },
        "required": [
          "nl-text"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": true,
        "openWorldHint": false
      },
      "x-playnet-auth": "device",
      "x-playnet-topic": "knowledge",
      "x-playnet-http": "/api/session/express"
    },
    {
      "name": "session.ai-complete",
      "title": "knowledge: ai-complete",
      "description": "Runs a chat completion with the given system and user prompts on MODEL when it is an enclave (TEE/…) slug, else on the service default, and replies the completion string, or \"\" when no API keys are configured or the session's AI budget for the minute is spent. [knowledge; callable by an enrolled device]",
      "inputSchema": {
        "type": "object",
        "properties": {
          "system-prompt": {
            "type": "string",
            "description": "the completion's system instruction, a plain string",
            "x-playnet-shape": "string"
          },
          "user-prompt": {
            "type": "string",
            "description": "the completion's user turn, a plain string",
            "x-playnet-shape": "string"
          },
          "model": {
            "type": "string",
            "description": "an AI model name, or #f for the service's default",
            "x-playnet-shape": "string"
          }
        },
        "required": [
          "system-prompt",
          "user-prompt",
          "model"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": true,
        "openWorldHint": false
      },
      "x-playnet-auth": "device",
      "x-playnet-topic": "knowledge",
      "x-playnet-http": "/api/session/ai-complete"
    },
    {
      "name": "session.see-part",
      "title": "knowledge: see-part",
      "description": "Sends one part of one picture to be read: UPLOAD names the sending, INDEX which of its pictures (0 to 3; several pictures of one thing are one read), PART a run of the picture's base64, sixteen kilobytes at the most. The session joins the parts and holds them until `see` reads them. Replies (ok . characters-held) or an error when a part or the whole is over its bound. [knowledge; callable by an enrolled device]",
      "inputSchema": {
        "type": "object",
        "properties": {
          "upload": {
            "type": "string",
            "description": "the browser's own name for one sending of pictures to be read",
            "x-playnet-shape": "string"
          },
          "index": {
            "type": "integer",
            "description": "which picture of an upload a part belongs to, 0 to 3",
            "x-playnet-shape": "integer"
          },
          "part": {
            "type": "string",
            "contentEncoding": "base64",
            "description": "a run of a picture's base64, sixteen kilobytes at the most",
            "x-playnet-shape": "base64"
          }
        },
        "required": [
          "upload",
          "index",
          "part"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": true,
        "openWorldHint": false
      },
      "x-playnet-auth": "device",
      "x-playnet-topic": "knowledge",
      "x-playnet-http": "/api/session/see-part"
    },
    {
      "name": "session.see",
      "title": "knowledge: see",
      "description": "Reads the pictures sent under UPLOAD with the enclave vision model, SYSTEM-PROMPT saying what to look for and in what shape to answer and USER-PROMPT what the asker knows of the scene, and replies the model's text. A read that fulfils a count the plan asked of this AID (SCOPE-ID, FULFILLS) draws on the plan; any other spends one of the week's unplanned photo reads, given back when the model gives no answer. Replies \"\" when no picture can be read here or the session's AI budget for the minute is spent, and \"err:…\" when no picture arrived or the week's reads are spent. The pictures are held nowhere once read. [knowledge; callable by an enrolled device]",
      "inputSchema": {
        "type": "object",
        "properties": {
          "upload": {
            "type": "string",
            "description": "the browser's own name for one sending of pictures to be read",
            "x-playnet-shape": "string"
          },
          "system-prompt": {
            "type": "string",
            "description": "the completion's system instruction, a plain string",
            "x-playnet-shape": "string"
          },
          "user-prompt": {
            "type": "string",
            "description": "the completion's user turn, a plain string",
            "x-playnet-shape": "string"
          },
          "scope-id": {
            "type": "string",
            "description": "a scope (commune) id",
            "x-playnet-shape": "scope-id"
          },
          "fulfills": {
            "type": "string",
            "description": "the id of the counter's commitment when a plan asked for the count, \"\" when none",
            "x-playnet-shape": "id"
          }
        },
        "required": [
          "upload",
          "system-prompt",
          "user-prompt"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": true,
        "openWorldHint": false
      },
      "x-playnet-auth": "device",
      "x-playnet-topic": "knowledge",
      "x-playnet-http": "/api/session/see"
    },
    {
      "name": "session.allotment",
      "title": "knowledge: allotment",
      "description": "Replies this AID's unplanned photo reads for the week: (ok (remaining per-week opens sees?)), OPENS the epoch second the next week opens (Monday 00:00 UTC), SEES? whether a picture can be read here at all. [knowledge; callable by an enrolled device]",
      "inputSchema": {
        "type": "object",
        "properties": {},
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": true,
        "openWorldHint": false
      },
      "x-playnet-auth": "device",
      "x-playnet-topic": "knowledge",
      "x-playnet-http": "/api/session/allotment"
    },
    {
      "name": "session.express-willingness",
      "title": "commitments: express-willingness",
      "description": "Marks this AID willing, or withdraws it, for SKILL at CELL in SCOPE-ID with an optional HOURS budget, binding nothing; replies (ok . willing) or (ok . declined). [commitments; callable by an enrolled device]",
      "inputSchema": {
        "type": "object",
        "properties": {
          "scope-id": {
            "type": "string",
            "description": "a scope (commune) id",
            "x-playnet-shape": "scope-id"
          },
          "skill": {
            "type": "string",
            "description": "a resource-specification id",
            "x-playnet-shape": "spec"
          },
          "cell": {
            "type": "string",
            "description": "a time-space cell key of the form place@period, paired with SKILL as skill@cell",
            "x-playnet-shape": "string"
          },
          "willing?": {
            "type": "boolean",
            "description": "#t to opt in to being materialized for skill@cell, #f to withdraw",
            "x-playnet-shape": "boolean"
          },
          "hours": {
            "type": "number",
            "description": "on express-willingness an optional hours budget; on offer-work the effort hours offered",
            "x-playnet-shape": "number"
          }
        },
        "required": [
          "scope-id",
          "skill",
          "cell",
          "willing?"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "openWorldHint": false
      },
      "x-playnet-auth": "device",
      "x-playnet-topic": "commitments",
      "x-playnet-http": "/api/session/express-willingness"
    },
    {
      "name": "session.claim",
      "title": "stock: claim",
      "description": "Draws this AID's credit to claim QTY of RESOURCE-ID at LABOR-COST (derived from crystallized SNLT when #f), checked against on-hand and any live wallet reading; WHERE/DELIVER-AT record the claim's own place and time. Replies claimed, balance and credit. [stock; callable by an enrolled device]",
      "inputSchema": {
        "type": "object",
        "properties": {
          "scope-id": {
            "type": "string",
            "description": "a scope (commune) id",
            "x-playnet-shape": "scope-id"
          },
          "resource-id": {
            "type": "string",
            "description": "an economic-resource id in the scope (own-means: the titled thing; claim/resource-detail: the good)",
            "x-playnet-shape": "id"
          },
          "qty": {
            "type": "number",
            "description": "the quantity of SPEC in UNIT, a positive number",
            "x-playnet-shape": "number"
          },
          "labor-cost": {
            "type": "number",
            "description": "the credit drawn for the claim in hours, or #f to derive qty × the good's crystallized SNLT",
            "x-playnet-shape": "number"
          },
          "where": {
            "type": "string",
            "description": "a place id or name",
            "x-playnet-shape": "place"
          },
          "deliver-at": {
            "type": "string",
            "format": "date-time",
            "description": "civil ISO 8601 at the boundary",
            "x-playnet-shape": "instant"
          }
        },
        "required": [
          "scope-id",
          "resource-id",
          "qty",
          "labor-cost"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "openWorldHint": false
      },
      "x-playnet-auth": "device",
      "x-playnet-topic": "stock",
      "x-playnet-http": "/api/session/claim"
    },
    {
      "name": "session.record-effort",
      "title": "commitments: record-effort",
      "description": "Records QTY UNIT of this AID's effort against COMMITMENT-ID in SCOPE-ID; replies (ok . event-id) or a failure when the commitment is unknown. TAP is one press's own token: the same token on the same commitment is the same act, answered with the event it recorded and recording nothing more. [commitments; callable by an enrolled device]",
      "inputSchema": {
        "type": "object",
        "properties": {
          "scope-id": {
            "type": "string",
            "description": "a scope (commune) id",
            "x-playnet-shape": "scope-id"
          },
          "commitment-id": {
            "type": "string",
            "description": "the id of a commitment being fulfilled, effort-recorded or ended",
            "x-playnet-shape": "id"
          },
          "qty": {
            "type": "number",
            "description": "the quantity of SPEC in UNIT, a positive number",
            "x-playnet-shape": "number"
          },
          "unit": {
            "type": "string",
            "description": "a unit symbol, e.g. kg, h, each",
            "x-playnet-shape": "unit"
          },
          "tap": {
            "type": "string",
            "description": "the token a caller minted for ONE act of a keyed door (doors/protocol.scm #:keyed): the same token on the same subject is the same act, answered with what it recorded and recording nothing more; 1 to 64 letters, digits, _ or -",
            "x-playnet-shape": "id"
          }
        },
        "required": [
          "scope-id",
          "commitment-id",
          "qty",
          "unit"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "openWorldHint": false
      },
      "x-playnet-auth": "device",
      "x-playnet-topic": "commitments",
      "x-playnet-http": "/api/session/record-effort"
    },
    {
      "name": "session.log-observe",
      "title": "commitments: log-observe",
      "description": "Records this AID's spoken log entry as a self-scoped event of ACTION on SPEC with NOTE and narrated WHEN-ISO; replies (ok (event resource)) or a failure. [commitments; callable by an enrolled device]",
      "inputSchema": {
        "type": "object",
        "properties": {
          "scope-id": {
            "type": "string",
            "description": "a scope (commune) id",
            "x-playnet-shape": "scope-id"
          },
          "action": {
            "type": "string",
            "description": "a symbol, sent as its name",
            "x-playnet-shape": "symbol"
          },
          "spec": {
            "type": "string",
            "description": "a resource-specification id",
            "x-playnet-shape": "spec"
          },
          "qty": {
            "type": "number",
            "description": "the quantity of SPEC in UNIT, a positive number",
            "x-playnet-shape": "number"
          },
          "unit": {
            "type": "string",
            "description": "a unit symbol, e.g. kg, h, each",
            "x-playnet-shape": "unit"
          },
          "note": {
            "type": "string",
            "description": "a free-text note recorded on the row or event",
            "x-playnet-shape": "string"
          },
          "when-iso": {
            "type": "string",
            "format": "date-time",
            "description": "civil ISO 8601 at the boundary",
            "x-playnet-shape": "instant"
          }
        },
        "required": [
          "scope-id",
          "action",
          "spec",
          "qty",
          "unit",
          "note",
          "when-iso"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "openWorldHint": false
      },
      "x-playnet-auth": "device",
      "x-playnet-topic": "commitments",
      "x-playnet-http": "/api/session/log-observe"
    },
    {
      "name": "session.count-stock",
      "title": "stock: count-stock",
      "description": "Records this AID's count of RESOURCE-ID in SCOPE-ID as COUNTED UNIT: a count that finds the ledger off lands a raise or lower of the difference on that stock, one that agrees lands none. TECHNIQUE (stated, label, photo), PLACE, WHEN-ISO and the EVIDENCE hash ride the event; FULFILLS names the counter's commitment of a planned count, whose record lands as a produce. Replies (ok (event record delta onhand)) or a failure. [stock; callable by an enrolled device]",
      "inputSchema": {
        "type": "object",
        "properties": {
          "scope-id": {
            "type": "string",
            "description": "a scope (commune) id",
            "x-playnet-shape": "scope-id"
          },
          "resource-id": {
            "type": "string",
            "description": "an economic-resource id in the scope (own-means: the titled thing; claim/resource-detail: the good)",
            "x-playnet-shape": "id"
          },
          "counted": {
            "type": "number",
            "description": "how much of the stock the counter found, zero or more, in the stock's own unit",
            "x-playnet-shape": "number"
          },
          "unit": {
            "type": "string",
            "description": "a unit symbol, e.g. kg, h, each",
            "x-playnet-shape": "unit"
          },
          "technique": {
            "type": "string",
            "description": "the counting technique: stated, label or photo; absent, stated",
            "x-playnet-shape": "string"
          },
          "place": {
            "type": "string",
            "description": "a place id or name",
            "x-playnet-shape": "place"
          },
          "when-iso": {
            "type": "string",
            "format": "date-time",
            "description": "civil ISO 8601 at the boundary",
            "x-playnet-shape": "instant"
          },
          "fulfills": {
            "type": "string",
            "description": "the id of the counter's commitment when a plan asked for the count, \"\" when none",
            "x-playnet-shape": "id"
          },
          "evidence": {
            "type": "string",
            "description": "the hash of the picture a count was read from, sha256: and sixty-four hex digits, \"\" when none; the picture stays with the counter, the hash rides the count's events as evidence:<hash> and the observation credential as its evidence claim",
            "x-playnet-shape": "string"
          },
          "note": {
            "type": "string",
            "description": "a free-text note recorded on the row or event",
            "x-playnet-shape": "string"
          }
        },
        "required": [
          "scope-id",
          "resource-id",
          "counted",
          "unit"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "openWorldHint": false
      },
      "x-playnet-auth": "device",
      "x-playnet-topic": "stock",
      "x-playnet-http": "/api/session/count-stock"
    },
    {
      "name": "session.read-condition",
      "title": "stock: read-condition",
      "description": "Records this AID's reading of RESOURCE-ID's condition as READING UNIT, an intensive unit (°C), against AMBIENT (°C, the catalogue's when absent): the reading names the form the stock is in among the forms its base has declared, so the stock the books held under another form is counted as nothing and the same quantity lands on the stock of the form named. Replies (ok (form was reading ambient moved unit from-stock to-stock gone event word)) or a failure, among them a form the scope has not declared. [stock; callable by an enrolled device]",
      "inputSchema": {
        "type": "object",
        "properties": {
          "scope-id": {
            "type": "string",
            "description": "a scope (commune) id",
            "x-playnet-shape": "scope-id"
          },
          "resource-id": {
            "type": "string",
            "description": "an economic-resource id in the scope (own-means: the titled thing; claim/resource-detail: the good)",
            "x-playnet-shape": "id"
          },
          "reading": {
            "type": "number",
            "x-playnet-shape": "number"
          },
          "unit": {
            "type": "string",
            "description": "a unit symbol, e.g. kg, h, each",
            "x-playnet-shape": "unit"
          },
          "when-iso": {
            "type": "string",
            "format": "date-time",
            "description": "civil ISO 8601 at the boundary",
            "x-playnet-shape": "instant"
          },
          "ambient": {
            "type": "number",
            "description": "the ambient temperature a condition is read against, °C; the catalogue's when absent",
            "x-playnet-shape": "number"
          },
          "note": {
            "type": "string",
            "description": "a free-text note recorded on the row or event",
            "x-playnet-shape": "string"
          }
        },
        "required": [
          "scope-id",
          "resource-id",
          "reading",
          "unit"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "openWorldHint": false
      },
      "x-playnet-auth": "device",
      "x-playnet-topic": "stock",
      "x-playnet-http": "/api/session/read-condition"
    },
    {
      "name": "session.set-profile",
      "title": "identity: set-profile",
      "description": "Upserts this AID's profile tags in SCOPE-ID from a JSON array, replacing prior profile tags and keeping other classifications; replies (ok . tags). [identity; callable by an enrolled device]",
      "inputSchema": {
        "type": "object",
        "properties": {
          "scope-id": {
            "type": "string",
            "description": "a scope (commune) id",
            "x-playnet-shape": "scope-id"
          },
          "json": {
            "type": "string",
            "contentMediaType": "application/json",
            "description": "a JSON document, as a string",
            "x-playnet-shape": "json"
          }
        },
        "required": [
          "scope-id",
          "json"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "openWorldHint": false
      },
      "x-playnet-auth": "device",
      "x-playnet-topic": "identity",
      "x-playnet-http": "/api/session/set-profile"
    },
    {
      "name": "session.declare-body",
      "title": "law: declare-body",
      "description": "Declares a legal body in SCOPE-ID from JSON {name, kind, role, jurisdiction, assetLock, register}: the caller, a recognised person (live PHC), is its first steward; the id is provisional until the stewards sign its inception. Replies (ok . {id, name, tags}). [law; callable by an enrolled device]",
      "inputSchema": {
        "type": "object",
        "properties": {
          "scope-id": {
            "type": "string",
            "description": "a scope (commune) id",
            "x-playnet-shape": "scope-id"
          },
          "json": {
            "type": "string",
            "contentMediaType": "application/json",
            "description": "a JSON document, as a string",
            "x-playnet-shape": "json"
          }
        },
        "required": [
          "scope-id",
          "json"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "openWorldHint": false
      },
      "x-playnet-auth": "device",
      "x-playnet-topic": "law",
      "x-playnet-http": "/api/session/declare-body"
    },
    {
      "name": "session.body-add-steward",
      "title": "law: body-add-steward",
      "description": "A steward of body ID names AID a steward too; replies (ok . #t), or refuses a caller who is no steward. [law; callable by an enrolled device]",
      "inputSchema": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "on open/cast/close/get-result a proposal id; on retire-payout/settle-payout a payout intent id; on add-scope! a scope id",
            "x-playnet-shape": "id"
          },
          "aid": {
            "type": "string",
            "pattern": "^[A-Z][A-Za-z0-9_-]{43}$",
            "description": "a KERI AID prefix",
            "x-playnet-shape": "aid"
          }
        },
        "required": [
          "id",
          "aid"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "openWorldHint": false
      },
      "x-playnet-auth": "device",
      "x-playnet-topic": "law",
      "x-playnet-http": "/api/session/body-add-steward"
    },
    {
      "name": "session.body-open-ceremony",
      "title": "law: body-open-ceremony",
      "description": "A steward opens body ID's inception ceremony: K of its stewards must sign the group inception from their own browsers. Replies (ok . {have, need, published, what}). [law; callable by an enrolled device]",
      "inputSchema": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "on open/cast/close/get-result a proposal id; on retire-payout/settle-payout a payout intent id; on add-scope! a scope id",
            "x-playnet-shape": "id"
          },
          "k": {
            "type": "integer",
            "description": "a requested quorum count; ignored, the ecosystem's own personhood quorum applies",
            "x-playnet-shape": "integer"
          }
        },
        "required": [
          "id",
          "k"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "openWorldHint": false
      },
      "x-playnet-auth": "device",
      "x-playnet-topic": "law",
      "x-playnet-http": "/api/session/body-open-ceremony"
    },
    {
      "name": "session.body-sign-preimage",
      "title": "law: body-sign-preimage",
      "description": "The statement a steward signs for body ID — KIND is inception, rotation or role — as (ok . {what, said}); refused while no ceremony is open or it is at another step. [law; callable by an enrolled device]",
      "inputSchema": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "on open/cast/close/get-result a proposal id; on retire-payout/settle-payout a payout intent id; on add-scope! a scope id",
            "x-playnet-shape": "id"
          },
          "kind": {
            "type": "string",
            "description": "a symbol, sent as its name",
            "x-playnet-shape": "symbol"
          }
        },
        "required": [
          "id",
          "kind"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "openWorldHint": false
      },
      "x-playnet-auth": "device",
      "x-playnet-topic": "law",
      "x-playnet-http": "/api/session/body-sign-preimage"
    },
    {
      "name": "session.body-sign-signed",
      "title": "law: body-sign-signed",
      "description": "The steward's SIGNATURE over SAID (the statement body-sign-preimage gave), verified under this session's own AID and counted by the ceremony; at k the inception publishes. Replies (ok . {have, need, published}). [law; callable by an enrolled device]",
      "inputSchema": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "on open/cast/close/get-result a proposal id; on retire-payout/settle-payout a payout intent id; on add-scope! a scope id",
            "x-playnet-shape": "id"
          },
          "kind": {
            "type": "string",
            "description": "a symbol, sent as its name",
            "x-playnet-shape": "symbol"
          },
          "said": {
            "type": "string",
            "pattern": "^[A-Z][A-Za-z0-9_-]{43}$",
            "description": "a SAID",
            "x-playnet-shape": "said"
          },
          "signature": {
            "type": "string",
            "description": "a CESR qb64 signature",
            "x-playnet-shape": "qb64"
          }
        },
        "required": [
          "id",
          "kind",
          "said",
          "signature"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "openWorldHint": false
      },
      "x-playnet-auth": "device",
      "x-playnet-topic": "law",
      "x-playnet-http": "/api/session/body-sign-signed"
    },
    {
      "name": "session.my-bodies",
      "title": "law: my-bodies",
      "description": "The bodies this AID stewards or belongs to, each {id, name, tags, steward, ceremony}; replies (ok . rows). [law; callable by an enrolled device]",
      "inputSchema": {
        "type": "object",
        "properties": {
          "scope-id": {
            "type": "string",
            "description": "a scope (commune) id",
            "x-playnet-shape": "scope-id"
          }
        },
        "required": [
          "scope-id"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "openWorldHint": false
      },
      "x-playnet-auth": "device",
      "x-playnet-topic": "law",
      "x-playnet-http": "/api/session/my-bodies"
    },
    {
      "name": "session.body",
      "title": "law: body",
      "description": "Body ID, read by a steward or member: {id, name, tags, stewards, members, crossings, holdings (each with the law's status), findings (the scope's admission tests), exposure, ceremony}; replies (ok . body). [law; callable by an enrolled device]",
      "inputSchema": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "on open/cast/close/get-result a proposal id; on retire-payout/settle-payout a payout intent id; on add-scope! a scope id",
            "x-playnet-shape": "id"
          }
        },
        "required": [
          "id"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "openWorldHint": false
      },
      "x-playnet-auth": "device",
      "x-playnet-topic": "law",
      "x-playnet-http": "/api/session/body"
    },
    {
      "name": "session.body-present-holding",
      "title": "law: body-present-holding",
      "description": "A steward presents what body ID holds from JSON {kind, name, issuer, validUntil, ref} — a permit, a policy, a registration — as a resource the law reads against the bill; replies (ok . resource-id). [law; callable by an enrolled device]",
      "inputSchema": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "on open/cast/close/get-result a proposal id; on retire-payout/settle-payout a payout intent id; on add-scope! a scope id",
            "x-playnet-shape": "id"
          },
          "json": {
            "type": "string",
            "contentMediaType": "application/json",
            "description": "a JSON document, as a string",
            "x-playnet-shape": "json"
          }
        },
        "required": [
          "id",
          "json"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "openWorldHint": false
      },
      "x-playnet-auth": "device",
      "x-playnet-topic": "law",
      "x-playnet-http": "/api/session/body-present-holding"
    },
    {
      "name": "session.body-admit",
      "title": "law: body-admit",
      "description": "A governor admits body ID to SCOPE-ID; replies (ok . findings), the eight admission tests as findings, or refuses a caller without governor standing. [law; callable by an enrolled device]",
      "inputSchema": {
        "type": "object",
        "properties": {
          "scope-id": {
            "type": "string",
            "description": "a scope (commune) id",
            "x-playnet-shape": "scope-id"
          },
          "id": {
            "type": "string",
            "description": "on open/cast/close/get-result a proposal id; on retire-payout/settle-payout a payout intent id; on add-scope! a scope id",
            "x-playnet-shape": "id"
          }
        },
        "required": [
          "scope-id",
          "id"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "openWorldHint": false
      },
      "x-playnet-auth": "device",
      "x-playnet-topic": "law",
      "x-playnet-http": "/api/session/body-admit"
    },
    {
      "name": "session.korg-create",
      "title": "governance: korg-create",
      "description": "A new korg under NAME, the caller its first member; replies (ok . aid). [governance; callable by an enrolled device]",
      "inputSchema": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "description": "on announce/leave the caller's display name; on declare-place the human name of the new place; on declare-need/declare-means the row's own display name, default SPEC (need) or \"AGENT's SPEC\" (means)",
            "x-playnet-shape": "string"
          }
        },
        "required": [
          "name"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "openWorldHint": false
      },
      "x-playnet-auth": "device",
      "x-playnet-topic": "governance",
      "x-playnet-http": "/api/session/korg-create"
    },
    {
      "name": "session.korg-list",
      "title": "governance: korg-list",
      "description": "The korgs the caller is a member of, each {aid, name, head, version}; replies (ok . rows). [governance; callable by an enrolled device]",
      "inputSchema": {
        "type": "object",
        "properties": {},
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "openWorldHint": false
      },
      "x-playnet-auth": "device",
      "x-playnet-topic": "governance",
      "x-playnet-http": "/api/session/korg-list"
    },
    {
      "name": "session.korg-preimage",
      "title": "governance: korg-preimage",
      "description": "What the caller signs to have KORG evaluate EXPR (an expression as text) at its head; replies (ok . {said, asked}). [governance; callable by an enrolled device]",
      "inputSchema": {
        "type": "object",
        "properties": {
          "korg": {
            "type": "string",
            "pattern": "^[A-Z][A-Za-z0-9_-]{43}$",
            "description": "a KERI AID prefix",
            "x-playnet-shape": "aid"
          },
          "expr": {
            "type": "string",
            "description": "one Scheme expression of the korg's language, as text",
            "x-playnet-shape": "string"
          }
        },
        "required": [
          "korg",
          "expr"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "openWorldHint": false
      },
      "x-playnet-auth": "device",
      "x-playnet-topic": "governance",
      "x-playnet-http": "/api/session/korg-preimage"
    },
    {
      "name": "session.korg-eval-signed",
      "title": "governance: korg-eval-signed",
      "description": "The caller's SIGNATURE over SAID (what korg-preimage gave for EXPR at ASKED): KORG verifies the author, evaluates EXPR as the caller under its validator and commits; replies (ok . {result, head, version}) when the evaluation answers. [governance; callable by an enrolled device]",
      "inputSchema": {
        "type": "object",
        "properties": {
          "korg": {
            "type": "string",
            "pattern": "^[A-Z][A-Za-z0-9_-]{43}$",
            "description": "a KERI AID prefix",
            "x-playnet-shape": "aid"
          },
          "expr": {
            "type": "string",
            "description": "one Scheme expression of the korg's language, as text",
            "x-playnet-shape": "string"
          },
          "asked": {
            "type": "string",
            "pattern": "^[A-Z][A-Za-z0-9_-]{43}$",
            "description": "a SAID",
            "x-playnet-shape": "said"
          },
          "said": {
            "type": "string",
            "pattern": "^[A-Z][A-Za-z0-9_-]{43}$",
            "description": "a SAID",
            "x-playnet-shape": "said"
          },
          "signature": {
            "type": "string",
            "description": "a CESR qb64 signature",
            "x-playnet-shape": "qb64"
          }
        },
        "required": [
          "korg",
          "expr",
          "asked",
          "said",
          "signature"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "openWorldHint": false
      },
      "x-playnet-auth": "device",
      "x-playnet-topic": "governance",
      "x-playnet-http": "/api/session/korg-eval-signed"
    },
    {
      "name": "session.korg-history",
      "title": "governance: korg-history",
      "description": "KORG's history, read by a member: every entry with its SAID, version, org, author, expression, parent, request, and the author's and the korg's signatures; replies (ok . entries). [governance; callable by an enrolled device]",
      "inputSchema": {
        "type": "object",
        "properties": {
          "korg": {
            "type": "string",
            "pattern": "^[A-Z][A-Za-z0-9_-]{43}$",
            "description": "a KERI AID prefix",
            "x-playnet-shape": "aid"
          }
        },
        "required": [
          "korg"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "openWorldHint": false
      },
      "x-playnet-auth": "device",
      "x-playnet-topic": "governance",
      "x-playnet-http": "/api/session/korg-history"
    },
    {
      "name": "session.korg-verify",
      "title": "governance: korg-verify",
      "description": "Does every entry of KORG's history verify — SAIDs recomputed, signatures checked, parents present? Replies (ok . #t) or the failing entry. [governance; callable by an enrolled device]",
      "inputSchema": {
        "type": "object",
        "properties": {
          "korg": {
            "type": "string",
            "pattern": "^[A-Z][A-Za-z0-9_-]{43}$",
            "description": "a KERI AID prefix",
            "x-playnet-shape": "aid"
          }
        },
        "required": [
          "korg"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "openWorldHint": false
      },
      "x-playnet-auth": "device",
      "x-playnet-topic": "governance",
      "x-playnet-http": "/api/session/korg-verify"
    },
    {
      "name": "session.korg-join",
      "title": "governance: korg-join",
      "description": "The caller asks to join KORG: a message in its inbox for a member to (approve id 'name); replies (ok . message-id). [governance; callable by an enrolled device]",
      "inputSchema": {
        "type": "object",
        "properties": {
          "korg": {
            "type": "string",
            "pattern": "^[A-Z][A-Za-z0-9_-]{43}$",
            "description": "a KERI AID prefix",
            "x-playnet-shape": "aid"
          }
        },
        "required": [
          "korg"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "openWorldHint": false
      },
      "x-playnet-auth": "device",
      "x-playnet-topic": "governance",
      "x-playnet-http": "/api/session/korg-join"
    },
    {
      "name": "session.korg-pending",
      "title": "governance: korg-pending",
      "description": "The requests waiting in KORG's inbox, read by a member, each {id, sender, expr, status}; replies (ok . rows). [governance; callable by an enrolled device]",
      "inputSchema": {
        "type": "object",
        "properties": {
          "korg": {
            "type": "string",
            "pattern": "^[A-Z][A-Za-z0-9_-]{43}$",
            "description": "a KERI AID prefix",
            "x-playnet-shape": "aid"
          }
        },
        "required": [
          "korg"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "openWorldHint": false
      },
      "x-playnet-auth": "device",
      "x-playnet-topic": "governance",
      "x-playnet-http": "/api/session/korg-pending"
    },
    {
      "name": "session.korg-join-as",
      "title": "governance: korg-join-as",
      "description": "KORG, the caller a member, asks to join PEER as itself — a message in PEER's inbox; replies (ok . message-id). [governance; callable by an enrolled device]",
      "inputSchema": {
        "type": "object",
        "properties": {
          "korg": {
            "type": "string",
            "pattern": "^[A-Z][A-Za-z0-9_-]{43}$",
            "description": "a KERI AID prefix",
            "x-playnet-shape": "aid"
          },
          "peer": {
            "type": "string",
            "pattern": "^[A-Z][A-Za-z0-9_-]{43}$",
            "description": "a KERI AID prefix",
            "x-playnet-shape": "aid"
          }
        },
        "required": [
          "korg",
          "peer"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "openWorldHint": false
      },
      "x-playnet-auth": "device",
      "x-playnet-topic": "governance",
      "x-playnet-http": "/api/session/korg-join-as"
    },
    {
      "name": "session.korg-link",
      "title": "governance: korg-link",
      "description": "PEER having admitted KORG, KORG holds a controller in PEER and (peer PEER) answers in its programs; replies (ok . peer). [governance; callable by an enrolled device]",
      "inputSchema": {
        "type": "object",
        "properties": {
          "korg": {
            "type": "string",
            "pattern": "^[A-Z][A-Za-z0-9_-]{43}$",
            "description": "a KERI AID prefix",
            "x-playnet-shape": "aid"
          },
          "peer": {
            "type": "string",
            "pattern": "^[A-Z][A-Za-z0-9_-]{43}$",
            "description": "a KERI AID prefix",
            "x-playnet-shape": "aid"
          }
        },
        "required": [
          "korg",
          "peer"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "openWorldHint": false
      },
      "x-playnet-auth": "device",
      "x-playnet-topic": "governance",
      "x-playnet-http": "/api/session/korg-link"
    },
    {
      "name": "session.korg-merge",
      "title": "governance: korg-merge",
      "description": "KORG and PEER, each having consented by (define *merge-with* <the other>) under its own validator, become one new korg under NAME: both heads' bindings (PEER's shadow KORG's), both histories imported and verified, every live member admitted; each predecessor's last entry is (define *successor* <new>). Replies (ok . aid). [governance; callable by an enrolled device]",
      "inputSchema": {
        "type": "object",
        "properties": {
          "korg": {
            "type": "string",
            "pattern": "^[A-Z][A-Za-z0-9_-]{43}$",
            "description": "a KERI AID prefix",
            "x-playnet-shape": "aid"
          },
          "peer": {
            "type": "string",
            "pattern": "^[A-Z][A-Za-z0-9_-]{43}$",
            "description": "a KERI AID prefix",
            "x-playnet-shape": "aid"
          },
          "name": {
            "type": "string",
            "description": "on announce/leave the caller's display name; on declare-place the human name of the new place; on declare-need/declare-means the row's own display name, default SPEC (need) or \"AGENT's SPEC\" (means)",
            "x-playnet-shape": "string"
          }
        },
        "required": [
          "korg",
          "peer",
          "name"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "openWorldHint": false
      },
      "x-playnet-auth": "device",
      "x-playnet-topic": "governance",
      "x-playnet-http": "/api/session/korg-merge"
    },
    {
      "name": "session.korg-split",
      "title": "governance: korg-split",
      "description": "KORG becomes several, as its *split-into* binding planned — ((name aid …) …), a define its validator judged: each child is born from (split parent head name) with all the parent's bindings, its history imported, its members admitted; the parent's last entry is (define *successor* (children)). Replies (ok . aids). [governance; callable by an enrolled device]",
      "inputSchema": {
        "type": "object",
        "properties": {
          "korg": {
            "type": "string",
            "pattern": "^[A-Z][A-Za-z0-9_-]{43}$",
            "description": "a KERI AID prefix",
            "x-playnet-shape": "aid"
          }
        },
        "required": [
          "korg"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "openWorldHint": false
      },
      "x-playnet-auth": "device",
      "x-playnet-topic": "governance",
      "x-playnet-http": "/api/session/korg-split"
    },
    {
      "name": "session.korg-rejoin",
      "title": "governance: korg-rejoin",
      "description": "KORG, the caller a member, leaves its peer OLD for NEW: it revokes itself in OLD as itself — judged by OLD's validator, whose refusal ends the rejoin with its words — drops the peer, and asks to join NEW, here when DESK is \"\" or at the far DESK; replies (ok . message-id). NEW's member approves; korg-link or korg-far-link completes it. [governance; callable by an enrolled device]",
      "inputSchema": {
        "type": "object",
        "properties": {
          "korg": {
            "type": "string",
            "pattern": "^[A-Z][A-Za-z0-9_-]{43}$",
            "description": "a KERI AID prefix",
            "x-playnet-shape": "aid"
          },
          "old": {
            "type": "string",
            "pattern": "^[A-Z][A-Za-z0-9_-]{43}$",
            "description": "a KERI AID prefix",
            "x-playnet-shape": "aid"
          },
          "new": {
            "type": "string",
            "pattern": "^[A-Z][A-Za-z0-9_-]{43}$",
            "description": "a KERI AID prefix",
            "x-playnet-shape": "aid"
          },
          "desk": {
            "type": "string",
            "description": "a gateway's korg desk, as the sturdyref string korg-desk gives; \"\" for this gateway",
            "x-playnet-shape": "string"
          }
        },
        "required": [
          "korg",
          "old",
          "new",
          "desk"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "openWorldHint": false
      },
      "x-playnet-auth": "device",
      "x-playnet-topic": "governance",
      "x-playnet-http": "/api/session/korg-rejoin"
    },
    {
      "name": "session.korg-desk",
      "title": "governance: korg-desk",
      "description": "This gateway's korg desk on the wire — the sturdyref a korg on another gateway joins through; replies (ok . sturdyref), null when the gateway is not on the wire. [governance; callable by an enrolled device]",
      "inputSchema": {
        "type": "object",
        "properties": {},
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "openWorldHint": false
      },
      "x-playnet-auth": "device",
      "x-playnet-topic": "governance",
      "x-playnet-http": "/api/session/korg-desk"
    },
    {
      "name": "session.korg-far-join",
      "title": "governance: korg-far-join",
      "description": "KORG, the caller a member, asks at the far gateway's DESK (a sturdyref) to join PEER there, the word signed under KORG's AID over the desk's nonce; replies (ok . message-id) once the desk answers. [governance; callable by an enrolled device]",
      "inputSchema": {
        "type": "object",
        "properties": {
          "korg": {
            "type": "string",
            "pattern": "^[A-Z][A-Za-z0-9_-]{43}$",
            "description": "a KERI AID prefix",
            "x-playnet-shape": "aid"
          },
          "desk": {
            "type": "string",
            "description": "a gateway's korg desk, as the sturdyref string korg-desk gives; \"\" for this gateway",
            "x-playnet-shape": "string"
          },
          "peer": {
            "type": "string",
            "pattern": "^[A-Z][A-Za-z0-9_-]{43}$",
            "description": "a KERI AID prefix",
            "x-playnet-shape": "aid"
          }
        },
        "required": [
          "korg",
          "desk",
          "peer"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "openWorldHint": false
      },
      "x-playnet-auth": "device",
      "x-playnet-topic": "governance",
      "x-playnet-http": "/api/session/korg-far-join"
    },
    {
      "name": "session.korg-far-link",
      "title": "governance: korg-far-link",
      "description": "PEER at DESK having admitted KORG, KORG takes a controller there through the desk and holds it: (peer PEER) answers in its programs across the wire; replies (ok . peer). [governance; callable by an enrolled device]",
      "inputSchema": {
        "type": "object",
        "properties": {
          "korg": {
            "type": "string",
            "pattern": "^[A-Z][A-Za-z0-9_-]{43}$",
            "description": "a KERI AID prefix",
            "x-playnet-shape": "aid"
          },
          "desk": {
            "type": "string",
            "description": "a gateway's korg desk, as the sturdyref string korg-desk gives; \"\" for this gateway",
            "x-playnet-shape": "string"
          },
          "peer": {
            "type": "string",
            "pattern": "^[A-Z][A-Za-z0-9_-]{43}$",
            "description": "a KERI AID prefix",
            "x-playnet-shape": "aid"
          }
        },
        "required": [
          "korg",
          "desk",
          "peer"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "openWorldHint": false
      },
      "x-playnet-auth": "device",
      "x-playnet-topic": "governance",
      "x-playnet-http": "/api/session/korg-far-link"
    },
    {
      "name": "session.set-availability-ranges",
      "title": "commitments: set-availability-ranges",
      "description": "Upserts this AID's availability window in SCOPE-ID from the clock's arcs JSON, creating the agent record with generic labour on first offer; replies the agent-store's answer. [commitments; callable by an enrolled device]",
      "inputSchema": {
        "type": "object",
        "properties": {
          "scope-id": {
            "type": "string",
            "description": "a scope (commune) id",
            "x-playnet-shape": "scope-id"
          },
          "json": {
            "type": "string",
            "contentMediaType": "application/json",
            "description": "a JSON document, as a string",
            "x-playnet-shape": "json"
          }
        },
        "required": [
          "scope-id",
          "json"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "openWorldHint": false
      },
      "x-playnet-auth": "device",
      "x-playnet-topic": "commitments",
      "x-playnet-http": "/api/session/set-availability-ranges"
    },
    {
      "name": "session.invite-contact",
      "title": "commitments: invite-contact",
      "description": "Creates a social use-intent labelled LABEL over T0..T1 and a proposal directed from this AID to INVITEE; replies (ok (proposal invitee)) or needs-personhood. [commitments; callable by an enrolled device]",
      "inputSchema": {
        "type": "object",
        "properties": {
          "scope-id": {
            "type": "string",
            "description": "a scope (commune) id",
            "x-playnet-shape": "scope-id"
          },
          "invitee": {
            "type": "string",
            "pattern": "^[A-Z][A-Za-z0-9_-]{43}$",
            "description": "a KERI AID prefix",
            "x-playnet-shape": "aid"
          },
          "label": {
            "type": "string",
            "description": "the human name of the social invite, stored as the intent's name",
            "x-playnet-shape": "string"
          },
          "t0-iso": {
            "type": "string",
            "format": "date-time",
            "description": "civil ISO 8601 at the boundary",
            "x-playnet-shape": "instant"
          },
          "t1-iso": {
            "type": "string",
            "format": "date-time",
            "description": "civil ISO 8601 at the boundary",
            "x-playnet-shape": "instant"
          }
        },
        "required": [
          "scope-id",
          "invitee",
          "label",
          "t0-iso",
          "t1-iso"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "openWorldHint": false
      },
      "x-playnet-auth": "device",
      "x-playnet-topic": "commitments",
      "x-playnet-http": "/api/session/invite-contact"
    },
    {
      "name": "session.accept-invite",
      "title": "commitments: accept-invite",
      "description": "Accepts directed social invite PROPOSAL-ID as this AID, filling the receiver slot so the intent becomes a commitment for both; replies (ok (accepted . id)). [commitments; callable by an enrolled device]",
      "inputSchema": {
        "type": "object",
        "properties": {
          "scope-id": {
            "type": "string",
            "description": "a scope (commune) id",
            "x-playnet-shape": "scope-id"
          },
          "proposal-id": {
            "type": "string",
            "description": "the id of a directed proposal (social invite or work offer) in the invitee's snapshot",
            "x-playnet-shape": "id"
          }
        },
        "required": [
          "scope-id",
          "proposal-id"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "openWorldHint": false
      },
      "x-playnet-auth": "device",
      "x-playnet-topic": "commitments",
      "x-playnet-http": "/api/session/accept-invite"
    },
    {
      "name": "session.accept-work-offer",
      "title": "commitments: accept-work-offer",
      "description": "Accepts work offer PROPOSAL-ID with this AID as provider and SCOPE-ID as receiver, then re-plans the scope; replies ((accepted . id)). [commitments; callable by an enrolled device]",
      "inputSchema": {
        "type": "object",
        "properties": {
          "scope-id": {
            "type": "string",
            "description": "a scope (commune) id",
            "x-playnet-shape": "scope-id"
          },
          "proposal-id": {
            "type": "string",
            "description": "the id of a directed proposal (social invite or work offer) in the invitee's snapshot",
            "x-playnet-shape": "id"
          }
        },
        "required": [
          "scope-id",
          "proposal-id"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "openWorldHint": false
      },
      "x-playnet-auth": "device",
      "x-playnet-topic": "commitments",
      "x-playnet-http": "/api/session/accept-work-offer"
    },
    {
      "name": "planner.scope-list",
      "title": "scopes: scope-list",
      "description": "Lists every registered scope as an alist of id, name and geographic path. [scopes; callable by anyone]",
      "inputSchema": {
        "type": "object",
        "properties": {},
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "openWorldHint": false
      },
      "x-playnet-auth": "anonymous",
      "x-playnet-topic": "scopes",
      "x-playnet-http": "/api/planner/scope-list"
    },
    {
      "name": "planner.scope-snapshot",
      "title": "planning: scope-snapshot",
      "description": "Builds a scope's full snapshot for PLAN-ID, unioned with federation siblings' locations and, when ACTING-AID is given, the social invites directed at it; replies the snapshot wire. [planning; callable by anyone]",
      "inputSchema": {
        "type": "object",
        "properties": {
          "scope-id": {
            "type": "string",
            "description": "a scope (commune) id",
            "x-playnet-shape": "scope-id"
          },
          "plan-id": {
            "type": "string",
            "description": "the plan identifier the snapshot is built for",
            "x-playnet-shape": "id"
          },
          "acting-aid": {
            "type": "string",
            "pattern": "^[A-Z][A-Za-z0-9_-]{43}$",
            "description": "a KERI AID prefix",
            "x-playnet-shape": "aid"
          }
        },
        "required": [
          "scope-id",
          "plan-id"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "openWorldHint": false
      },
      "x-playnet-auth": "anonymous",
      "x-playnet-topic": "planning",
      "x-playnet-http": "/api/planner/scope-snapshot"
    },
    {
      "name": "planner.lint-records",
      "title": "knowledge: lint-records",
      "description": "Judges RECORDS-JSON (an array of ValueFlows records: kind, action, spec, qty, unit, arcs) against what SCOPE-ID knows — its specs and their units — and replies a JSON array of findings (severity, kind, subject, detail); an empty array means well formed. [knowledge; callable by anyone]",
      "inputSchema": {
        "type": "object",
        "properties": {
          "scope-id": {
            "type": "string",
            "description": "a scope (commune) id",
            "x-playnet-shape": "scope-id"
          },
          "records-json": {
            "type": "string",
            "contentMediaType": "application/json",
            "description": "a JSON document, as a string",
            "x-playnet-shape": "json"
          }
        },
        "required": [
          "scope-id",
          "records-json"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": true,
        "openWorldHint": false
      },
      "x-playnet-auth": "anonymous",
      "x-playnet-topic": "knowledge",
      "x-playnet-http": "/api/planner/lint-records"
    },
    {
      "name": "planner.minizinc",
      "title": "knowledge: minizinc",
      "description": "Solves the MiniZinc model MZN (source text) over DATA-JSON (MiniZinc's own JSON data: an object of parameter values; an array is an array, nested for 2-D, {\"set\":[…]} a set) with SOLVER (gecode, chuffed or cbc) within TIME-LIMIT-MS (at most 30000); replies a JSON object: status (optimal|satisfied|unsatisfiable|unbounded|unsat-or-unbounded|unknown) and solution (the decision variables, or null). A variable defined by an expression is fixed at flattening and absent from the solution: declare it and pin it with a constraint to read it. A model MiniZinc cannot read is an error envelope. [knowledge; callable by anyone]",
      "inputSchema": {
        "type": "object",
        "properties": {
          "mzn": {
            "type": "string",
            "description": "a MiniZinc model, as its .mzn source text",
            "x-playnet-shape": "string"
          },
          "data-json": {
            "type": "string",
            "contentMediaType": "application/json",
            "description": "a JSON document, as a string",
            "x-playnet-shape": "json"
          },
          "solver": {
            "type": "string",
            "description": "a MiniZinc solver tag the `minizinc-solvers` door lists",
            "x-playnet-shape": "string"
          },
          "time-limit-ms": {
            "type": "integer",
            "description": "the solve's time limit in milliseconds",
            "x-playnet-shape": "integer"
          }
        },
        "required": [
          "mzn"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": true,
        "openWorldHint": false
      },
      "x-playnet-auth": "anonymous",
      "x-playnet-topic": "knowledge",
      "x-playnet-http": "/api/planner/minizinc"
    },
    {
      "name": "planner.minizinc-solvers",
      "title": "knowledge: minizinc-solvers",
      "description": "Lists the MiniZinc solver tags this gateway can run (gecode, chuffed, cbc), empty where MiniZinc is not installed. [knowledge; callable by anyone]",
      "inputSchema": {
        "type": "object",
        "properties": {},
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": true,
        "openWorldHint": false
      },
      "x-playnet-auth": "anonymous",
      "x-playnet-topic": "knowledge",
      "x-playnet-http": "/api/planner/minizinc-solvers"
    },
    {
      "name": "planner.presets",
      "title": "knowledge: presets",
      "description": "Lists the worlds a scope can start from — the economies the tree ships as data (module/playnet/knowledge/worlds/presets.scm): id, name and doc per preset. [knowledge; callable by anyone]",
      "inputSchema": {
        "type": "object",
        "properties": {},
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": true,
        "openWorldHint": false
      },
      "x-playnet-auth": "anonymous",
      "x-playnet-topic": "knowledge",
      "x-playnet-http": "/api/planner/presets"
    },
    {
      "name": "planner.chat-history",
      "title": "chat: chat-history",
      "description": "Replies a topic's lines since SINCE (an epoch second; 0 = every line) as a vector. [chat; callable by anyone]",
      "inputSchema": {
        "type": "object",
        "properties": {
          "scope-id": {
            "type": "string",
            "description": "a scope (commune) id",
            "x-playnet-shape": "scope-id"
          },
          "topic": {
            "type": "string",
            "description": "a chat topic string under the scope: an intent/commitment id, a place, a walkie room, …",
            "x-playnet-shape": "string"
          },
          "since": {
            "type": "integer",
            "x-playnet-shape": "integer"
          }
        },
        "required": [
          "scope-id",
          "topic"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "openWorldHint": false
      },
      "x-playnet-auth": "anonymous",
      "x-playnet-topic": "chat",
      "x-playnet-http": "/api/planner/chat-history"
    },
    {
      "name": "planner.chat-last",
      "title": "chat: chat-last",
      "description": "Replies the last line of many topics in one call as topic → (author body kind t); silent topics are absent, so the wake needs one round trip. [chat; callable by anyone]",
      "inputSchema": {
        "type": "object",
        "properties": {
          "scope-id": {
            "type": "string",
            "description": "a scope (commune) id",
            "x-playnet-shape": "scope-id"
          },
          "topics": {
            "type": "array",
            "description": "a JSON array of topic strings to read the last line of at once",
            "x-playnet-shape": "list"
          }
        },
        "required": [
          "scope-id",
          "topics"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "openWorldHint": false
      },
      "x-playnet-auth": "anonymous",
      "x-playnet-topic": "chat",
      "x-playnet-http": "/api/planner/chat-last"
    },
    {
      "name": "planner.solve-brief",
      "title": "planning: solve-brief",
      "description": "Runs the solve with JSON or alist overrides and replies a compact stringified summary — satisfaction, social ledger, duals, certificate; caches only the current-plan case. [planning; callable by anyone]",
      "inputSchema": {
        "type": "object",
        "properties": {
          "scope-id": {
            "type": "string",
            "description": "a scope (commune) id",
            "x-playnet-shape": "scope-id"
          },
          "overrides": {
            "type": "string",
            "contentMediaType": "application/json",
            "description": "a JSON document, as a string",
            "x-playnet-shape": "json"
          }
        },
        "required": [
          "scope-id",
          "overrides"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "openWorldHint": false
      },
      "x-playnet-auth": "anonymous",
      "x-playnet-topic": "planning",
      "x-playnet-http": "/api/planner/solve-brief"
    },
    {
      "name": "planner.record-flow",
      "title": "stock: record-flow",
      "description": "Confirms one material produce/consume/pickup/dropoff/use row the scope's last plan states, named by ROW-ID (the id the schedule carries) or, for a caller with none, by its coordinates; QTY is spread over the matching plan rows' remainders (each row is a commitment under the plan's own id) and TOTAL decides nothing. The flow is dated at the row's planned slot, or at its confirmation when the slot is still ahead. The two rows of a relocation chain through their run: a dropoff is refused until its pickup has taken the cargo. Replies the first numbered event id, or `already` once the rows are finished. TAP is one press's own token: the same token on the same rows is the same act, answered with what it recorded (`again`) and recording nothing more. [stock; callable by anyone]",
      "inputSchema": {
        "type": "object",
        "properties": {
          "scope-id": {
            "type": "string",
            "description": "a scope (commune) id",
            "x-playnet-shape": "scope-id"
          },
          "action": {
            "type": "string",
            "description": "a symbol, sent as its name",
            "x-playnet-shape": "symbol"
          },
          "spec": {
            "type": "string",
            "description": "a resource-specification id",
            "x-playnet-shape": "spec"
          },
          "qty": {
            "type": "number",
            "description": "the quantity of SPEC in UNIT, a positive number",
            "x-playnet-shape": "number"
          },
          "total": {
            "type": "number",
            "description": "on record-flow the row's planned total that sizes its commitment; on means-plan the federation bar for SPEC",
            "x-playnet-shape": "number"
          },
          "place": {
            "type": "string",
            "description": "a place id or name",
            "x-playnet-shape": "place"
          },
          "when-iso": {
            "type": "string",
            "format": "date-time",
            "description": "civil ISO 8601 at the boundary",
            "x-playnet-shape": "instant"
          },
          "proc": {
            "type": "string",
            "description": "a process id: the row's process on record-flow, the process the work is input-of on offer-work",
            "x-playnet-shape": "string"
          },
          "note": {
            "type": "string",
            "description": "a free-text note recorded on the row or event",
            "x-playnet-shape": "string"
          },
          "row-id": {
            "type": "string",
            "description": "on record-flow the plan's own id for the schedule row being confirmed, as the schedule carries it; absent, the row is found by its coordinates",
            "x-playnet-shape": "id"
          },
          "tap": {
            "type": "string",
            "description": "the token a caller minted for ONE act of a keyed door (doors/protocol.scm #:keyed): the same token on the same subject is the same act, answered with what it recorded and recording nothing more; 1 to 64 letters, digits, _ or -",
            "x-playnet-shape": "id"
          }
        },
        "required": [
          "scope-id",
          "action",
          "spec",
          "qty",
          "total",
          "place",
          "when-iso",
          "proc",
          "note"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "openWorldHint": false
      },
      "x-playnet-auth": "anonymous",
      "x-playnet-topic": "stock",
      "x-playnet-http": "/api/planner/record-flow"
    },
    {
      "name": "planner.inventory-snapshot",
      "title": "stock: inventory-snapshot",
      "description": "Builds and replies the scope's inventory snapshot for PLAN-ID. [stock; callable by anyone]",
      "inputSchema": {
        "type": "object",
        "properties": {
          "scope-id": {
            "type": "string",
            "description": "a scope (commune) id",
            "x-playnet-shape": "scope-id"
          },
          "plan-id": {
            "type": "string",
            "description": "the plan identifier the snapshot is built for",
            "x-playnet-shape": "id"
          }
        },
        "required": [
          "scope-id",
          "plan-id"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "openWorldHint": false
      },
      "x-playnet-auth": "anonymous",
      "x-playnet-topic": "stock",
      "x-playnet-http": "/api/planner/inventory-snapshot"
    },
    {
      "name": "planner.resource-detail",
      "title": "stock: resource-detail",
      "description": "Builds and replies the detail view for one resource in the scope. [stock; callable by anyone]",
      "inputSchema": {
        "type": "object",
        "properties": {
          "scope-id": {
            "type": "string",
            "description": "a scope (commune) id",
            "x-playnet-shape": "scope-id"
          },
          "resource-id": {
            "type": "string",
            "description": "an economic-resource id in the scope (own-means: the titled thing; claim/resource-detail: the good)",
            "x-playnet-shape": "id"
          }
        },
        "required": [
          "scope-id",
          "resource-id"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "openWorldHint": false
      },
      "x-playnet-auth": "anonymous",
      "x-playnet-topic": "stock",
      "x-playnet-http": "/api/planner/resource-detail"
    },
    {
      "name": "planner.process-context",
      "title": "planning: process-context",
      "description": "Builds and replies the context view for one process in the scope. [planning; callable by anyone]",
      "inputSchema": {
        "type": "object",
        "properties": {
          "scope-id": {
            "type": "string",
            "description": "a scope (commune) id",
            "x-playnet-shape": "scope-id"
          },
          "process-id": {
            "type": "string",
            "description": "the id of a process in the scope's plan",
            "x-playnet-shape": "id"
          }
        },
        "required": [
          "scope-id",
          "process-id"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "openWorldHint": false
      },
      "x-playnet-auth": "anonymous",
      "x-playnet-topic": "planning",
      "x-playnet-http": "/api/planner/process-context"
    },
    {
      "name": "planner.materialize-willing",
      "title": "commitments: materialize-willing",
      "description": "Assigns willing workers to the scope's open needs so they surface as awaiting acceptance; replies (materialized . N). [commitments; callable by anyone]",
      "inputSchema": {
        "type": "object",
        "properties": {
          "scope-id": {
            "type": "string",
            "description": "a scope (commune) id",
            "x-playnet-shape": "scope-id"
          }
        },
        "required": [
          "scope-id"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "openWorldHint": false
      },
      "x-playnet-auth": "anonymous",
      "x-playnet-topic": "commitments",
      "x-playnet-http": "/api/planner/materialize-willing"
    },
    {
      "name": "planner.drop-event",
      "title": "stock: drop-event",
      "description": "Records a dropoff or pickup in a shared container for the agent (personhood-gated), moving RESOURCE-ID (naming nothing introduces one) with rights and rail intact; replies the ledger's answer. [stock; callable by anyone]",
      "inputSchema": {
        "type": "object",
        "properties": {
          "scope-id": {
            "type": "string",
            "description": "a scope (commune) id",
            "x-playnet-shape": "scope-id"
          },
          "action": {
            "type": "string",
            "description": "a symbol, sent as its name",
            "x-playnet-shape": "symbol"
          },
          "container-id": {
            "type": "string",
            "description": "the id of the shared container the drop-off or pickup happens in",
            "x-playnet-shape": "id"
          },
          "agent": {
            "type": "string",
            "pattern": "^[A-Z][A-Za-z0-9_-]{43}$",
            "description": "a KERI AID prefix",
            "x-playnet-shape": "aid"
          },
          "spec": {
            "type": "string",
            "description": "a resource-specification id",
            "x-playnet-shape": "spec"
          },
          "qty": {
            "type": "number",
            "description": "the quantity of SPEC in UNIT, a positive number",
            "x-playnet-shape": "number"
          },
          "unit": {
            "type": "string",
            "description": "a unit symbol, e.g. kg, h, each",
            "x-playnet-shape": "unit"
          },
          "resource-id": {
            "type": "string",
            "description": "an economic-resource id in the scope (own-means: the titled thing; claim/resource-detail: the good)",
            "x-playnet-shape": "id"
          },
          "note": {
            "type": "string",
            "description": "a free-text note recorded on the row or event",
            "x-playnet-shape": "string"
          },
          "accountable": {
            "type": "string",
            "pattern": "^[A-Z][A-Za-z0-9_-]{43}$",
            "description": "a KERI AID prefix",
            "x-playnet-shape": "aid"
          }
        },
        "required": [
          "scope-id",
          "action",
          "container-id",
          "agent",
          "spec",
          "qty",
          "unit"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "openWorldHint": false
      },
      "x-playnet-auth": "anonymous",
      "x-playnet-topic": "stock",
      "x-playnet-http": "/api/planner/drop-event"
    }
  ]
}
