Quartet / Quintet

Everything in Claude Code that is configured correctly and does nothing

The expensive part of .claude/ configuration is that a mistake does not appear on screen.

The JSON is valid. The keys are spelled right. Startup prints no warning and --debug says nothing.

It just doesn't work.

Below is everything the official documentation states outright — as ignored, as skipped, or as having no effect — counted and collected. Nothing is inferred.

The counts

Where How many What happens
Hook matcher 10 of 33 events The matcher is silently ignored, so the hook runs every time
Hook if Evaluated on 5 events Written anywhere else, that handler never runs at all
Settings key scope 71 of 223 keys Depending on which file, the key does nothing
Deprecated settings keys 4 One of them inverts the boolean
Permission rules 5 forms They load, and then do nothing
Subagent files 5 conditions The file is skipped and the session says nothing
.mcp.json 2 places A url with no type is read as stdio and skipped; timeout: 500 becomes about 28 hours

What they share is that the failure never comes back to you. With nothing returned, no amount of local experimenting reaches the answer.

Hooks

Ten events silently discard a matcher. Not an error. You narrowed it, and it runs every time anyway.

CwdChanged      UserPromptSubmit   PostToolBatch   Stop         TeammateIdle
TaskCreated     TaskCompleted      WorktreeCreate  WorktreeRemove  MessageDisplay

if fails the other way. It is evaluated on the five tool-related events only.

PreToolUse  PostToolUse  PostToolUseFailure  PermissionRequest  PermissionDenied

On any other event, a handler with an if never runs. matcher errs toward too wide, if toward not at all. Both quietly.

The table of all 33 events is here.

https://quintetkit.github.io/en/reference/claude-code-hooks.html

Settings keys

A settings key applies only from certain files.

Scope Count Applies from
Managed 39 Managed settings an organisation deploys
User or managed 23 ~/.claude/settings.json, or managed
User, local, or managed 3 Applies from settings.local.json, not from settings.json
Global config 6 ~/.claude.json only
Total 71
Any file 152 Anywhere

The third row is the awkward one. It works for whoever wrote it in settings.local.json and stops working when it moves into the shared settings.json. That is a good way to produce "works on my machine" with no visible cause.

Nested keys are scoped by their full dotted name. What is restricted is sandbox.network.strictAllowlist, not sandbox. Inspect only the top level and you miss all 20 dotted keys, 12 of them sandbox.*.

The full list of 71 is here.

https://quintetkit.github.io/en/reference/claude-code-settings-scope.html

Four deprecated keys

Written Replacement
ignorePatterns permissions.deny
includeCoAuthoredBy attribution
disableArtifact enableArtifact
voiceEnabled voice.enabled

disableArtifact inverts. disableArtifact: false and enableArtifact: false mean opposite things, so swapping the name alone flips the setting.

Permission rules

Five ways to write a permissions rule that is not an error and does nothing.

What you write What happens
"*" / "B*" / "mcp__*" in allow Skipped; auto-approves nothing
A path rule on Write / NotebookEdit / Glob / MultiEdit Accepted but never consulted
A parameter rule on a tool's own content field, e.g. Bash(command:...) Ignored (nine tools have one)
An mcp__ rule with parentheses Skipped when the file loads
An allow rule with a * before the rest of the command Applies, but allows more than it looks like

The last one is the dangerous one.

Bash(git log *)    → commands starting with git log
Bash(git * main)   → every git subcommand. git push origin main, and git -c
Bash(* --version)  → every program

git -c makes git run a program you name. One line meant to allow a single command opens that far.

Details here.

https://quintetkit.github.io/en/reference/claude-code-permission-rules.html

Subagent files

A file in .claude/agents/ with a frontmatter problem is skipped, and nothing appears in the session. The reason goes to the debug log only.

The 18 fields, and where cacheTtl belongs (inside experimental), are here.

https://quintetkit.github.io/en/reference/claude-code-subagent-frontmatter.html

.mcp.json

A url with no type does not default to http — it is read as a stdio server. stdio requires command, so that server is skipped.

And timeout ignores any value below 1000. Once ignored it falls through to MCP_TOOL_TIMEOUT, and if that is unset, to its default of about 28 hours.

"timeout": 500      // not 500ms. about 28 hours

An attempt to shorten it becomes effectively unlimited.

Required fields per transport, why sse is deprecated, and why approvals committed to a repository are ignored in an untrusted folder:

https://quintetkit.github.io/en/reference/claude-code-mcp-json.html

Checking all of it

Everything above is mechanically detectable.

npx @quintetkit/ccheck
warn  .claude/settings.json:63
      `autoMode` applies from user or managed settings only. It has no effect from this file.
      why: https://code.claude.com/docs/en/settings-reference

Every finding cites its source. A rule that cannot be cited is not written.

Some things are deliberately not checked.

One false finding is enough to make the whole output stop being read. What cannot be distinguished is passed in silence, and said to be.

Sources

Every count comes from a snapshot taken 2026-09-04.

The workflow itself is available

Quartet, the four-persona version, is published free under MIT. Quintet adds a UI Designer persona, review criteria, a per-Issue parallel execution script, and a 10-chapter guide.

See the free version Product page