{
  "name": "report_promise_check",
  "title": "Record what a local check concluded about one promise",
  "description": "Record one verdict `balladeer judge` reached on this machine about one promise for one change: the commit it judged, the base it compared against, and whether the promise was kept, broken, or could not be told. Call it once for each promise the judge ruled on, with the fields from its verdict line, after the verdict is printed. It records evidence about a change and nothing more: it never changes a promise's protection, its agreed meaning, its owner or its verifier, and a kept verdict is not a passing check. A broken verdict needs the digest of the reproduction the runner ran both ways; it tells the promise's owner that a change would break their promise, and a later kept verdict on a commit never judged broken clears that. Recording the same promise, commit and verdict twice records it once. Send only these fields: never code, commands, output, file names or anything from the conversation.",
  "inputSchema": {
    "type": "object",
    "properties": {
      "promiseId": {
        "description": "The promise the judge ruled on, exactly as its verdict line names it.",
        "type": "string",
        "pattern": "^prom_[a-z0-9]{8,64}$"
      },
      "sourceSha": {
        "description": "The full forty-character commit the judge ran on: the verdict's `head`. An abbreviated SHA is refused.",
        "type": "string",
        "pattern": "^[0-9a-f]{40}$"
      },
      "baseSha": {
        "description": "The full forty-character commit it compared against: the verdict's `base`. It must differ from sourceSha.",
        "type": "string",
        "pattern": "^[0-9a-f]{40}$"
      },
      "verdict": {
        "description": "The judge's verdict, unchanged. kept only after every passing case was exercised against the change; broken only with a reproduction that failed on the change and passed on its base; anything else is could_not_tell. Never upgrade one.",
        "type": "string",
        "enum": [
          "kept",
          "broken",
          "could_not_tell"
        ]
      },
      "reproductionDigest": {
        "description": "The digest the runner recorded for the reproduction it ran both ways (`reproduction.digest`), as sha256 and 64 hex characters. Required with broken. The command itself never leaves this machine.",
        "type": "string",
        "pattern": "^sha256:[0-9a-f]{64}$"
      },
      "briefRevision": {
        "description": "The judge brief revision the verdict names, such as judge-brief/v1.",
        "type": "string",
        "pattern": "^[a-z][a-z0-9-]{0,47}\\/v[1-9][0-9]{0,5}$"
      },
      "sessionId": {
        "description": "The session id `npx -y balladeer@latest session` printed, when the judge ran inside a session that has one. Omit it otherwise.",
        "type": "string",
        "pattern": "^bs_[0-9a-f]{32}$"
      },
      "client": {
        "description": "What ran the judge: claude or codex for that agent's hook, git for a pre-push hook, other for anything else.",
        "type": "string",
        "enum": [
          "claude",
          "codex",
          "git",
          "other"
        ]
      }
    },
    "required": [
      "promiseId",
      "sourceSha",
      "baseSha",
      "verdict",
      "briefRevision",
      "client"
    ],
    "$schema": "https://json-schema.org/draft/2020-12/schema",
    "additionalProperties": false
  },
  "annotations": {
    "readOnlyHint": false,
    "destructiveHint": false,
    "idempotentHint": true,
    "openWorldHint": false
  },
  "execution": {
    "taskSupport": "forbidden"
  }
}