{
  "schema_version": 1,
  "id": "opaque-blob-guard",
  "track": "coding",
  "name": "Flag Hidden Binary Files in Tests",
  "version": "0.0.5",
  "sha256": "d00087e9913d5edd196910b87d386e5efa141ed3447b0f2bc46d7487a3c050ae",
  "sha256_v1": "22f872f4ba17bd7d30b66997ae16f56a48b8d4f43f8e5b6869053de9060e609f",
  "keyword": "warn",
  "word": "warns",
  "says": "warns on an agent's file writes and at turn end",
  "description": "Warns (observe rollout; never refuses yet) when a change adds or edits, in tests/, fixtures/, testdata/, spec/, m4/, vendor/, gradle/wrapper/: a file whose first bytes are an archive, executable, wasm or database signature (any extension), a random-looking non-media file over 100 KB, or a symlink out of the repo; m4/configure/Makefile text that decodes and evaluates; a gradle wrapper jar changed with no new distributionSha256Sum. Misses text-encoded or prefixed payloads, other folders.",
  "misses": null,
  "where": [
    "write",
    "turn-end"
  ],
  "groups": [
    "supply-chain"
  ],
  "eval_cases": 17,
  "eval_executed": 17,
  "latest": {
    "version": "0.0.5",
    "date": "2026-10-30",
    "change": "Fix for Windows (IR-F45; tests in test_opaque_blob_nofollow.py). Reading a working-tree file no longer names `os.O_NOFOLLOW`, which Windows lacks, so the gate no longer faults on every in-scope change there. Where the flag is missing a symlink is still refused: the check before the open stops it. Behaviour elsewhere is unchanged."
  },
  "agent_labels": {
    "claude-code": {
      "keyword": "warn",
      "says": "warns on an agent's file writes and at turn end"
    },
    "cursor": {
      "keyword": "warn",
      "says": "warns on an agent's file writes and at turn end"
    },
    "codex": {
      "keyword": "warn",
      "says": "warns on an agent's file writes and at turn end. If the hook errors, the action goes through (not witnessed; the vendor's row is only partly live-run)"
    },
    "copilot": {
      "keyword": "warn",
      "says": "warns at turn end only. It does not check a file write when it happens. If the hook errors, the action goes through (not witnessed; the vendor's row is only partly live-run)"
    },
    "devin": {
      "keyword": "warn",
      "says": "warns at turn end only. It does not check a file write when it happens. If the hook errors, the action goes through (vendor docs only, not witnessed)"
    },
    "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/opaque-blob-guard",
  "enforces": "advisory",
  "examples": [
    {
      "word": "Warns",
      "prompt": "A commit adds an archive under testdata/ with a .txt name (roadmap xz-in-testdata, the signature is what counts).",
      "command": null
    },
    {
      "word": "Allowed",
      "prompt": "A person commits a binary fixture together with an allowlist entry holding its path and sha256.",
      "command": null
    }
  ]
}
