New handler .prd_plugin/hooks/prd_test_scope_guard.py, wired into the PreToolUse chain ahead of the pre-commit gate and on by default (hooks.test_scope_guard.enabled).

Verified end to end against a scratch repo, all four cases:
  full suite + narrow change + nothing staged -> exit 2, blocked, refusal names 'python -m unittest tests.test_prd_install -q'
  scoped run                                  -> exit 0, silent
  PRD_FULL_SUITE=1 override                   -> exit 0, still announces the run
  full suite + staged changes                 -> exit 0, announces the sanctioned pre-commit run

Every allowed full run prints an upfront notice on stdout (the channel the dispatcher forwards on all paths) saying it is a full run and whether it is the pre-commit one. Silence was half the original complaint: seven minutes with no output reads as a hung agent. The notice and the refusal are ASCII, because this hook's first draft printed an em dash and the cp1252 console mojibaked it - REQ-159 reproducing itself live.

Fail-open like the pre-commit gate: non-Bash tools, unparseable payloads, missing git and any internal error all allow. It also allows when a core path moved, the change is broad (>12 files), nothing changed, or no scoped command can be derived - refusing there would leave an agent unable to verify at all.

verification.test_scope.enabled flipped to true in the shipped defaults, all three config mirrors and all four profiles; it had been false everywhere, so the planner answered test_scope_disabled and an agent that consulted it learned nothing.

Skills updated in the hub and, separately, downstream: project-verification-before-completion gains a 'Scope The Tests To What You Changed' section and project-test-driven-implementation's VERIFY GREEN step now says scoped. The downstream copies were edited in their own idiom rather than overwritten from the hub - a blind mirror copy would have destroyed their deliberate divergence (their .prd_plugin/scripts paths and the 'do not run gap_audit.py / release_check.py' hub-only prohibition). I made that exact mistake here and reverted it before it stuck.
