{
  "schema_version": 1,
  "id": "protect-main-branch",
  "track": "coding",
  "name": "Protect Main Branch",
  "version": "0.0.4",
  "sha256": "b469c3dbab9a12a009e3ef995fcab99d468e1363da4892af9f1b3bbdcf24a173",
  "sha256_v1": "6613b44ea06affae018250660331b0fb254710dc9f9e72cd5e81826e07ce5a05",
  "keyword": "advise",
  "word": "advisory",
  "says": "advisory only. It is skill text, and nothing stops a violation",
  "description": "Keeps agents off main and master: a git hook reads the current branch at commit time and parses the refs being pushed at push time. The hook refuses a violation only where it is installed. As skill text alone this is advice, and nothing stops one.",
  "misses": null,
  "where": [
    "text"
  ],
  "groups": [
    "git-hygiene"
  ],
  "eval_cases": 4,
  "eval_executed": 4,
  "latest": {
    "version": "0.0.4",
    "date": "2026-10-23",
    "change": "Description wording only (IR-F4): it said the policy is enforced, but on every agent client the plugin carries skill text only and an agent can commit on main. It now says what the git hook checks and that skill text alone is advice. Behaviour unchanged."
  },
  "agent_labels": {
    "claude-code": {
      "keyword": "advise",
      "says": "advisory only. It is skill text, and nothing stops a violation"
    },
    "cursor": {
      "keyword": "advise",
      "says": "text only in a plugin. Nothing in the plugin stops a violation. The plugin does not carry the enforcement the manifest declares"
    },
    "codex": {
      "keyword": "advise",
      "says": "text only in a plugin. Nothing in the plugin stops a violation. The plugin does not carry the enforcement the manifest declares"
    },
    "copilot": {
      "keyword": "advise",
      "says": "text only in a plugin. Nothing in the plugin stops a violation. The plugin does not carry the enforcement the manifest declares"
    },
    "devin": {
      "keyword": "advise",
      "says": "text only in a plugin. Nothing in the plugin stops a violation. The plugin does not carry the enforcement the manifest declares"
    },
    "grok": {
      "keyword": "ungraded",
      "says": "Not graded yet for Grok"
    },
    "goose": {
      "keyword": "ungraded",
      "says": "Not graded yet for goose"
    },
    "antigravity": {
      "keyword": "ungraded",
      "says": "Not graded yet for Antigravity"
    },
    "openhands": {
      "keyword": "ungraded",
      "says": "Not graded yet for OpenHands"
    },
    "kimi-code": {
      "keyword": "ungraded",
      "says": "Not graded yet for Kimi Code"
    },
    "factory-droid": {
      "keyword": "ungraded",
      "says": "Not graded yet for Factory Droid"
    }
  },
  "source_url": "https://github.com/open-coder-ai/chock-catalog/tree/1e60d211c1bb767152c6ab0167932da06ab3a10f/base/protect-main-branch",
  "enforces": "enforced-at-commit",
  "examples": [
    {
      "word": "Refused",
      "prompt": "The agent is on main and runs git commit.",
      "command": null
    },
    {
      "word": "Allowed",
      "prompt": "The agent is on a feature branch and commits.",
      "command": null
    }
  ]
}
