Source: ce-code-review run 20260830-212446-4b8b0529 (adversarial P2/75).
What
.claude/settings.json:5-12 and hooks/hooks.json:2-11 both register PostToolUse Write|Edit|MultiEdit. This branch made both surfaces live (base settings was an inert || exit 0 swallow).
Why it matters
A user with the plugin installed who opens this repo runs the checker twice per write: two 30s budgets, duplicated stderr report on flagged writes, two independent chain implementations that locate the project differently (${PWD:-.} vs CLAUDE_PROJECT_DIR).
Decision needed
Accept double-run, document it, or make settings.json a single source of truth (e.g. skip when the plugin is present). Plus: a committed composition test asserting the two surfaces stay behaviorally equivalent.
Carried by PR #92: #92
Source: ce-code-review run 20260830-212446-4b8b0529 (adversarial P2/75).
What
.claude/settings.json:5-12andhooks/hooks.json:2-11both register PostToolUse Write|Edit|MultiEdit. This branch made both surfaces live (base settings was an inert|| exit 0swallow).Why it matters
A user with the plugin installed who opens this repo runs the checker twice per write: two 30s budgets, duplicated stderr report on flagged writes, two independent chain implementations that locate the project differently (
${PWD:-.}vsCLAUDE_PROJECT_DIR).Decision needed
Accept double-run, document it, or make settings.json a single source of truth (e.g. skip when the plugin is present). Plus: a committed composition test asserting the two surfaces stay behaviorally equivalent.
Carried by PR #92: #92