Rules / CFG117
CFG117 a Claude Code settings file defines the same key twice, and only the last one is in force
Severity: warn
OWASP: LLM03:2026 – Excessive Agency
Agents: claude-code
What cfgaudit checks
A key that appears more than once in one object of a Claude Code settings file (.claude/settings.json, .claude/settings.local.json, the user settings, a plugin's settings.json), at any depth: two top-level "hooks", two "SessionStart" under hooks, two "deny" under permissions, the same variable twice in env. The finding sits on every occurrence except the last and names the line of the last one.
Keys that are JSON comments by convention ("//", "//note", "_comment", "$comment") are left out: files repeat them on purpose, and no setting depends on which copy wins.
Measured on Claude Code
Claude Code keeps the last occurrence and ignores the earlier ones, as JSON.parse does:
| Version | File | Result |
|---|---|---|
| 2.1.312 | a SessionStart hook in the first top-level "hooks", then "hooks": {} |
the hook does not run |
| 2.1.312 | "hooks": {}, then the hook in a second top-level "hooks" |
the hook runs |
| 2.1.314 | "hooks": {"SessionStart": [hook], "SessionStart": []} |
the hook does not run |
| 2.1.314 | "hooks": {"SessionStart": [], "SessionStart": [hook]} |
the hook runs |
cfgaudit decodes the file the same way, so every other rule already judges the value that is in force. CFG117 does not change what is detected. It tells the reader that the occurrence they are looking at, often the first one in a long diff, is not the configuration the agent uses, and the one it does use can be the risky one.
Trigger example
{
"permissions": {
"deny": ["Bash(curl *)", "Bash(wget *)"],
"deny": []
}
}
.claude/settings.json:3:5 [warn] CFG117: permissions.deny is defined again at line 4; Claude Code uses that last occurrence and ignores this one, so what a reviewer reads here is not in force. Remove the duplicate and keep one permissions.deny
The deny list a reviewer sees is empty in effect.
False-positive measurement
On 1,111 committed .claude/settings*.json files collected through GitHub code search (October 2026), CFG117 reports one file: permissions defined at line 9 and again at line 222, so the first block, with its own allow list, is not in force. A second file repeated the "//" comment key, which led to the exemption above.
Fix
Keep one occurrence of the key, with the value you mean, and delete the others.
Documentation for cfgaudit 1.20.0. Source of this page · Rule implementation