{
 "snapshot": "2026-11-06",
 "sample": "Same sample as /data/project-settings-2026-11.json: 5,864 public repos, >=5 stars, pushed since 2026-10-07, not fork, not archived. Every .claude/settings.json in them and the scripts their hooks name, read statically. Nothing from the repos was run. Repo names and hook contents left out.",
 "classification": "A PreToolUse command hook counts as blocking if its command or the in-repo script it calls can exit 2 or print permissionDecision deny, decision block, or continue false. Whole-line comments ignored. A hook that runs code we could not read (script outside the repo, delegation to other scripts, inline programs) counts as unclear.",
 "live_test": {
  "claude_code_version": "2.1.314",
  "setup": "claude -p with Haiku in an empty project, PreToolUse hook on Bash, asked to run: echo ran > ran.txt",
  "cases": {
   "hook prints BLOCK and exits 1": "command ran",
   "hook script missing, onFailure unset": "command ran",
   "hook script missing, onFailure block": "command blocked (failed; blocking because onFailure is \"block\")"
  },
  "hook_environment": "tool input arrived only as JSON on stdin; no CLAUDE_FILE_PATH or CLAUDE_TOOL_INPUT variable was set"
 },
 "repos": {
  "total": 5864,
  "with_pretooluse_command_hook": [1673, 28.5],
  "pretooluse_repos_by_class": {"block": [989, 59.1], "unclear": [376, 22.5], "no block": [290, 17.3], "ask only": [18, 1.1]},
  "blocking_repos_with_onFailure_on_a_pretooluse_hook": [18, 1.8],
  "blocking_repos_with_onFailure_block_on_a_blocking_hook": [17, 1.7],
  "pretooluse_repos_with_onFailure": [26, 1.6],
  "pretooluse_repos_with_timeout_set": [675, 40.3],
  "blockWritesOutsideWorkingDirectories_true": 0,
  "blockReadsOutsideWorkingDirectories_true": 1
 },
 "hooks": {
  "pretooluse_command_hooks": 3956,
  "by_class": {"block": 1986, "unclear": 1136, "no block": 789, "ask only": 45},
  "onFailure_values_all_hooks": {"block": 85, "continue": 2},
  "onFailure_values_pretooluse": {"block": 83, "continue": 2},
  "no_block_hooks_exit_1_next_to_block_message": {"hooks": 53, "repos": 42},
  "hooks_reading_unset_CLAUDE_tool_env_vars": {"hooks": 61, "repos": 41, "of_which_blocking_class": 25, "variables": ["CLAUDE_FILE_PATH", "CLAUDE_FILE_PATHS", "CLAUDE_TOOL_INPUT", "CLAUDE_TOOL_NAME", "CLAUDE_TOOL_ARGS", "CLAUDE_COMMAND"]},
  "blocking_hooks_that_also_exit_1": {"hooks": 110, "repos": 59}
 },
 "note": "Pairs are [count, percent]. Percent of the parent row: class shares and timeout share are of the 1,673 PreToolUse repos; onFailure shares among blocking repos are of 989."
}
