{
  "name": "get_promise",
  "title": "Expand one approved behavior",
  "description": "Return one current owner-approved promise by ID, with its full meaning, the name of the person who owns it, and its page. It carries every fact the index row for the same promise carries and never fewer: what protects it and why in one sentence, whether a verifier is bound, where its sealed files stand (`seal`: intact, broken, unknown when evidence is inconclusive, or none where nothing is sealed), the directory those files live in, and `lastCheckedAt`, the latest applicable recorded Balladeer check timestamp available in this read, or `unknown` when no such timestamp is available. Unprotected or no bound verifier describes Balladeer's evidence state; it does not establish that independent tests or CI checks are absent. The meaning states a commitment, not proof that the current implementation keeps it. Its owner has authority over this meaning; that does not establish required approvers for separate work. When implementing it, check every applicable guarantee against delivered behavior; success and failure cases illustrate the meaning rather than exhaust it. A case passing does not establish other guarantees in the same promise. Do not silently narrow agreed behavior to existing callers or cases; report unmet or unverified guarantees. Report what those checks exercised and what remains unverified; do not infer universal coverage or absence of tests. A broken seal is never reported as protected, whatever the last run claimed. This is the read to make whenever you have an ID: from a person, who can copy one off any promise page, from a failing check, or from the code you are working on. Ask a person for the id rather than searching for the promise they meant. A promise that is not currently holding also carries `threat`: the commit the failing run checked, the bounded reason it could not report green, and the failing cases in the agreed meaning that run was checking. Read it before you change anything, and repair the behavior rather than the test. Proposed, retired, and superseded meaning is unavailable.",
  "inputSchema": {
    "type": "object",
    "properties": {
      "promiseId": {
        "type": "string",
        "pattern": "^prom_[a-z0-9]{8,64}$"
      },
      "session": {
        "description": "The session id `npx -y balladeer@latest session` prints, which stays the same for the whole of this piece of work. Pass it on every read, and write `Balladeer-Session: <it>` into the commit or pull-request body you produce, so a check that goes red can be read back against what you were told before you started.",
        "type": "string",
        "pattern": "^bs_[0-9a-f]{32}$"
      },
      "signal": {
        "description": "Why you are reading this promise: `named` when a person or a failing check gave you the id, `path` when an index row's paths matched your change, `touch` when `npx -y balladeer@latest affected` named it out of what its verifier actually executed, `keyword` when a text match found it. Absent reads as `named`. It is what lets somebody find out later which of these signals was worth keeping.",
        "type": "string",
        "enum": [
          "named",
          "path",
          "touch",
          "keyword"
        ]
      },
      "unattended": {
        "description": "True only when a program is reading on your behalf and no person is looking, such as a judge run before a push or a behavior map being built. An unattended read is not the person having seen the promise, so it never clears what they are still to be told about it, and it is left out of the retrieval bookkeeping. Leave it out for every read you make while working with a person.",
        "type": "boolean"
      }
    },
    "required": [
      "promiseId"
    ],
    "$schema": "https://json-schema.org/draft/2020-12/schema",
    "additionalProperties": false
  },
  "annotations": {
    "readOnlyHint": true,
    "destructiveHint": false,
    "idempotentHint": true,
    "openWorldHint": false
  },
  "execution": {
    "taskSupport": "forbidden"
  }
}