Problem
LLM coding agents (Claude Code, etc.) without hook scaffolding will still try --no-verify, paste secrets into commits, and skip formatting. The hook stack enforces the harness from the agent side.
Proposed solution
Port .claude/hooks/pretooluse_bash.py (forbidden-flag blocker for --no-verify/--no-hooks/--no-gpg-sign, secret scanner on git commit for AWS/sk-*/ghp_/PEM/Slack tokens, audit log to .claude/bash-log.txt). Port .claude/hooks/posttooluse_writeedit.py (formatter dispatch: ruff for .py, prettier for .ts/.tsx/.js/.json/.css/.html/.md). Port .claude/hooks/sessionstart.py (prints branch + git status --short as additionalContext). Port .claude/settings.local.json.example wiring all three.
Acceptance criteria
Priority rationale
High: this IS the LLM-coder-side enforcement. Without it, the harness only catches violations in CI, not at the keyboard.
Depends on
#1
Problem
LLM coding agents (Claude Code, etc.) without hook scaffolding will still try
--no-verify, paste secrets into commits, and skip formatting. The hook stack enforces the harness from the agent side.Proposed solution
Port
.claude/hooks/pretooluse_bash.py(forbidden-flag blocker for--no-verify/--no-hooks/--no-gpg-sign, secret scanner ongit commitfor AWS/sk-*/ghp_/PEM/Slack tokens, audit log to.claude/bash-log.txt). Port.claude/hooks/posttooluse_writeedit.py(formatter dispatch: ruff for.py, prettier for.ts/.tsx/.js/.json/.css/.html/.md). Port.claude/hooks/sessionstart.py(prints branch +git status --shortas additionalContext). Port.claude/settings.local.json.examplewiring all three.Acceptance criteria
mypy --strictandruff check.git commit --no-verifyis blocked by pretooluse_bash when invoked through the harness..pyfile triggers ruff format silently..claude/settings.local.json.exampledocuments how to copy tosettings.local.jsonto opt in..claude/bash-log.txtis in.gitignore(chore: .gitignore, .editorconfig, .dockerignore #5).Priority rationale
High: this IS the LLM-coder-side enforcement. Without it, the harness only catches violations in CI, not at the keyboard.
Depends on
#1