Parent
Refs #912 (audit umbrella; finding F2 residual). Follow-up to #916 / PR #928.
What to build
source_control_enabled() in guardrails' flag-commit-pr-skill-bypass.sh resolves plugin enablement across user-global → project → local settings, but counts a settings.local.json value only when the project settings.json already declares the same key. Per the official settings scopes (https://code.claude.com/docs/en/settings — precedence Local > Project > User; claude plugin install --scope local is a first-class scope), a plugin enabled ONLY at local scope is active, yet the probe reads it as disabled and the gh pr create advisory never fires (silent false-negative, same class as #916).
Make a local-scope value participate in per-key resolution unconditionally: effective = local when present, else project when present, else user-global. Keep the existing per-exact-key iteration and uncertain→silent posture.
Acceptance criteria
Blocked by
None — can start immediately
Parent
Refs #912 (audit umbrella; finding F2 residual). Follow-up to #916 / PR #928.
What to build
source_control_enabled()in guardrails'flag-commit-pr-skill-bypass.shresolves plugin enablement across user-global → project → local settings, but counts asettings.local.jsonvalue only when the projectsettings.jsonalready declares the same key. Per the official settings scopes (https://code.claude.com/docs/en/settings — precedence Local > Project > User;claude plugin install --scope localis a first-class scope), a plugin enabled ONLY at local scope is active, yet the probe reads it as disabled and thegh pr createadvisory never fires (silent false-negative, same class as #916).Make a local-scope value participate in per-key resolution unconditionally: effective = local when present, else project when present, else user-global. Keep the existing per-exact-key iteration and uncertain→silent posture.
Acceptance criteria
<repo>/.claude/settings.local.jsonresolves as enabled (advisory fires)falseoverrides project/usertrue; localtrueoverrides projectfalseBlocked by
None — can start immediately