Observed on v6.0.5.
Setup: the SessionStart maintenance hook merges settings via MergeSettings.ts --system <root>/settings.system.json --user <root>/LIFEOS/USER/CONFIG/settings.user.json --output <root>/settings.json.
Footgun: a settings.user.json placed at the CONFIG ROOT (~/.claude/settings.user.json) is never read by the merge. Because MergeSettings no-ops cleanly when its --user input is absent (the fresh-install guard), the merged settings.json silently stays pure system half with no warning. In our case an entire overlay (7 permission deny rules, 100 allow entries, 14 hook registrations) was inert for days: sessions ran with none of the user's deny rules or hooks, and nothing surfaced it. The root location is a natural-but-wrong guess since settings.system.json and the generated settings.json both live at the root.
Suggestions:
- If
<configRoot>/settings.user.json exists and differs from the canonical LIFEOS/USER/CONFIG/settings.user.json, print a loud warning at merge time (or refuse).
- Document in ConfigSystem.md that plain arrays in the user overlay REPLACE system arrays, and that additive intent requires the
{"__merge": "append", "values": [...]} annotation. A user hand-porting deny rules will otherwise either lose their rules (wrong path) or clobber the system's (right path, plain array).
Observed on v6.0.5.
Setup: the SessionStart maintenance hook merges settings via
MergeSettings.ts --system <root>/settings.system.json --user <root>/LIFEOS/USER/CONFIG/settings.user.json --output <root>/settings.json.Footgun: a
settings.user.jsonplaced at the CONFIG ROOT (~/.claude/settings.user.json) is never read by the merge. Because MergeSettings no-ops cleanly when its--userinput is absent (the fresh-install guard), the mergedsettings.jsonsilently stays pure system half with no warning. In our case an entire overlay (7 permission deny rules, 100 allow entries, 14 hook registrations) was inert for days: sessions ran with none of the user's deny rules or hooks, and nothing surfaced it. The root location is a natural-but-wrong guess sincesettings.system.jsonand the generatedsettings.jsonboth live at the root.Suggestions:
<configRoot>/settings.user.jsonexists and differs from the canonicalLIFEOS/USER/CONFIG/settings.user.json, print a loud warning at merge time (or refuse).{"__merge": "append", "values": [...]}annotation. A user hand-porting deny rules will otherwise either lose their rules (wrong path) or clobber the system's (right path, plain array).