Symptom: Hook decisions still go through the legacy CLI path.
Check:
- Verify
HOL_GUARD_HOOK_FAST_PATH=1is set in the daemon's environment. - Check that the daemon is running:
hol-guard status. - Look for
reason_code: "daemon_worker_exception"in responses — this indicates the worker crashed and returned a fail-safe deny.
Resolution: The fast path is behind a feature flag. Set HOL_GUARD_HOOK_FAST_PATH=1 and restart the daemon.
Symptom: Safe source-file reads still get replace_with_reviewed_excerpt instead of allow_original.
Check:
- Verify the Pi extension is generating
guard_source_ref(checkHOL_GUARD_HOOK_SOURCE_REF=1). - Check the
reason_codein the response:output_mismatch: The adapter's hash doesn't match the file contentsensitive_path: The file is.env,.npmrc, etc.symlink_in_path: A path component is a symlinkbinary_file: The file contains null bytesinvalid_utf8: The file is not valid UTF-8source_file_too_large: Exceeds 5MBscanner_budget_exhausted: Scanner deadline expiredsource_stat_changed: TOCTOU detection (file changed during read)
Resolution: Fix the underlying issue. For output_mismatch, ensure the extension hashes the exact same text the model sees. For scanner_budget_exhausted, the file may be too large or the system too slow.
Symptom: Source reads that were previously fast are now slow (no source_cache_hit).
Check:
- The file content changed (different
content_sha256). - The file stat changed (different
stat_mtime_nsorstat_size). - The policy changed (different
policy_fingerprint). - The config changed (different
config_fingerprint). - The scanner rules changed (different
scanner_version).
Resolution: Cache misses are expected when any of these change. The next read will re-scan and cache the result.
Symptom: Response has reason_code: "daemon_worker_exception".
Check: The worker encountered an unexpected exception. This is a fail-safe deny/block — no raw output reaches the model.
Resolution: Check the daemon logs. The legacy CLI path is not used as a fallback for worker exceptions on source-ref requests (to avoid passing unreviewed output through).
Symptom: CLI fallback returns an error or doesn't handle guard_source_ref.
Check: Ensure you're running a recent version of HOL Guard whose CLI routes
complete PreToolUse and PostToolUse envelopes through native hook authority.
Python source-ref review is retained only as an explicitly injected
differential-test oracle. Production off is fail-safe, while shadow
comparison requires a declared non-production diagnostic surface. Supported
file, package, MCP, network, process, browser, config, prompt, and harness
PreToolUse actions receive a native review or block floor; an unrepresentable
review is rendered as a conservative deny.
Resolution: Update HOL Guard: hol-guard update.
Symptom: Local protection repair reports App hooks failed, and Cursor or other app shells return HOL Guard could not complete the native PreToolUse decision safely.
Check:
- Desktop-managed Core sidecars must include
hol-guard-runtimenext toruntime-manifest.jsoninside the signed Core executable. reason_code: "native_pre_tool_unavailable"orreason_code: "native_post_tool_unavailable"means the daemon could not complete the native hook decision. Auto/force still fail closed; they do not fall back to the Python engine.- Stale app hook scripts are missing
HOL_GUARD_NATIVEinherit keys or still pin an older CLI identity.
Resolution: Update HOL Guard so Desktop Core is rebuilt from the attested platform wheel, then re-run hol-guard install cursor (or the matching harness install) and retry repair. The attested CLI retries only when the daemon reports native unavailability, and that CLI path still requires the bundled runtime.