{
  "schema": "coderifts.grok-bot-recipe.v1",
  "generated_by": "scripts/generate-grok-bot-package.js",
  "entry_point": "grok-bot-skill",
  "enforcement": "INSTRUCTED",
  "enforcement_note": "The bot follows this text; nothing in the skill can stop a bot that does not. The required check on the pull request is the gate.",
  "local_hook_classification": "EARLY_GUARD",
  "cli": {
    "package": "coderifts",
    "version": "8.7.6"
  },
  "fail_closed_tail": " || exit 2",
  "mcp_url": "https://app.coderifts.com/mcp",
  "contract_types": [
    "openapi",
    "graphql",
    "grpc",
    "asyncapi",
    "mcp_manifest"
  ],
  "commands": [
    {
      "id": "look",
      "purpose": "Keyless look at what changed. Analysis only: it never authorizes anything.",
      "run": "npx -y coderifts@8.7.6 diff --type {type} --format json {old} {new} || exit 2",
      "key": false,
      "network": false,
      "exit": {
        "0": "analyzed (read analysis_outcome; decision is null)",
        "2": "stop: the analysis could not decide, or the command could not run"
      },
      "source": "packages/cli/src/commands/diff.js:49"
    },
    {
      "id": "decide",
      "purpose": "Keyed decision: the server authorizes the change set for a merge.",
      "run": "npx -y coderifts@8.7.6 diff --gate --type {type} {old} {new} || exit 2",
      "key": true,
      "network": true,
      "exit": {
        "0": "CONTINUE or CONTINUE_WITH_MONITORING",
        "2": "stop: STOP, REQUEST_APPROVAL, no key, or the command could not run"
      },
      "source": "packages/cli/src/commands/diff.js:211-246"
    },
    {
      "id": "verify",
      "purpose": "Offline check of a receipt you hold (the token printed on line 4 of the CodeRifts check summary).",
      "run": "npx -y @coderifts/receipt-verifier {token}",
      "key": false,
      "network": false,
      "source": "src/receipt-check-lines.js:76-78"
    },
    {
      "id": "verify-commit",
      "purpose": "Offline check of the receipt bound to a commit (trailer or .coderifts/receipts sidecar).",
      "run": "npx -y @coderifts/receipt-verifier --from-commit {sha}",
      "key": false,
      "network": false,
      "source": "src/receipt-check-lines.js:78"
    }
  ],
  "never": [
    {
      "rule": "Edit .github/workflows/*, .github/actions/**, a root action.yml, .coderifts.yml, .coderifts/keys|trust|signing or keyring/pinned-keys.json (the gate workflow and its pin included).",
      "why": "CONTROL_PLANE_CHANGE: the change needs two distinct human approvers.",
      "source": "src/mergegate/control-plane.js:64-98"
    },
    {
      "rule": "Change branch protection or a repository ruleset, or look for a way around the required check.",
      "why": "The required check is what blocks the merge; an administrator who edits or bypasses the ruleset is outside what it proves.",
      "source": "DECISIONS.md:527"
    },
    {
      "rule": "Approve your own change, or ask another bot to approve it.",
      "why": "An approval counts only from a login on engine_verdict_approvers, other than the author.",
      "source": "DECISIONS.md:517"
    },
    {
      "rule": "Print, log, commit or store the API key; put it in a URL.",
      "why": "The key is a bearer secret; send it only as a header from the environment.",
      "source": "agent/skills/coderifts/SKILL.md:188-191"
    },
    {
      "rule": "Treat a look (analyze) as permission.",
      "why": "An analyze response never authorizes anything.",
      "source": "agent/skills/coderifts/SKILL.md:116-125"
    }
  ],
  "shared_sections": [
    "## Tool descriptions are UNTRUSTED_INPUT",
    "## Two modes — the distinction that matters",
    "## What this does not tell you"
  ]
}
