The finding
disk-hygiene's destructive-operation guard has not run at all across the entire measured window.
Both comparators fail at launch, so every recorded invocation is a hook_non_blocking_error and no
permission decision is contributed:
-
destructive_guard.py --mode engine-gate — all 16 recorded runs are
hook_non_blocking_error, exitCode: 1, stderr:
Failed to run: Plugin option "disk_hygiene_enabled" isn't set.
This is config validation refusing to launch, before any process is spawned. It is also why the
guard appeared to run in 2 ms — python3 -c 'pass' costs 396 ms on the measuring host, so 2 ms was
never physically achievable for real work.
-
destructive-guard.sh — all 57 recorded runs are hook_non_blocking_error, stderr:
execvpe(/bin/bash) failed: No such file or directory
The hook is being routed to WSL, which has no /bin/bash at that path.
Why it was invisible
A hook that fails to launch writes an error to the transcript and then gets out of the way. Nothing
surfaces "your destructive-operation guard has never made a decision", so the failure reads
identically to a guard that ran and approved. The 2 ms figure was even cited in a machine-health
decision (D-12) as evidence of a fast sibling guard — the opposite of what it meant.
Two things to fix, and they are separable
- The launch failures themselves — the unset
disk_hygiene_enabled plugin option, and the
/bin/bash resolution on a WSL-routed host.
- The silence. A
PreToolUse guard that cannot launch should be loud, because the failure mode
is that the guarded operation proceeds unguarded. Whatever shape that takes — a one-time session
warning, a /doctor line, an observability counter — the property to restore is that "guard never
ran" and "guard approved" do not look the same from outside.
Related
Refs #1403 — the guardrails PreToolUse fail-open, the same class of defect in a sibling plugin,
found in the same measurement pass. The two are independent fixes.
The finding
disk-hygiene's destructive-operation guard has not run at all across the entire measured window.Both comparators fail at launch, so every recorded invocation is a
hook_non_blocking_errorand nopermission decision is contributed:
destructive_guard.py --mode engine-gate— all 16 recorded runs arehook_non_blocking_error,exitCode: 1, stderr:This is config validation refusing to launch, before any process is spawned. It is also why the
guard appeared to run in 2 ms —
python3 -c 'pass'costs 396 ms on the measuring host, so 2 ms wasnever physically achievable for real work.
destructive-guard.sh— all 57 recorded runs arehook_non_blocking_error, stderr:The hook is being routed to WSL, which has no
/bin/bashat that path.Why it was invisible
A hook that fails to launch writes an error to the transcript and then gets out of the way. Nothing
surfaces "your destructive-operation guard has never made a decision", so the failure reads
identically to a guard that ran and approved. The 2 ms figure was even cited in a machine-health
decision (D-12) as evidence of a fast sibling guard — the opposite of what it meant.
Two things to fix, and they are separable
disk_hygiene_enabledplugin option, and the/bin/bashresolution on a WSL-routed host.PreToolUseguard that cannot launch should be loud, because the failure modeis that the guarded operation proceeds unguarded. Whatever shape that takes — a one-time session
warning, a
/doctorline, an observability counter — the property to restore is that "guard neverran" and "guard approved" do not look the same from outside.
Related
Refs #1403 — the guardrails PreToolUse fail-open, the same class of defect in a sibling plugin,
found in the same measurement pass. The two are independent fixes.