Repository navigation
Decisions Settings
This page holds the settings decisions that 1.0.0 keeps: D1, D2, D5, D10, and D14. Read it to learn why dotclaude sets some keys, writes no managed settings, and leaves other switches alone. D35 is reversed by 1.0.0, and it moved to Decisions-Reversed. The index is Decisions.
Each decision has the problem, the choice, the alternatives, and the evidence.
Claims about the Claude Code binary cite the version 2.1.296, unless the text says otherwise.
Problem: A need of dotclaude can be met in many ways in Claude Code. A way that needs more code breaks more often when Claude Code updates.
Choice: Each need takes the first way that works, in this order:
- No key, because the Claude Code default gives the result.
- A settings key or an env var in the generated schema (Settings Schema).
- A built-in part that the settings turn off (Off Switches).
- A mod handler.
- A script. This is the last choice.
Settings Snippet Keys gives the reason and the Claude Code default for each key that the snippet sets.
The snippet is plain JSON.
The setup command merges it into a settings file only with --apply.
The code is in src/plugins/dotclaude/slices/setup/adapters/settings-cmd.ts.
Alternatives: A script or a mod handler first. Inference: a script or a mod handler has more code that Claude Code can break. So the order keeps the code small.
Evidence:
-
.claude/rules/extension-points.mdsays that runtime code is not written for a feature that the latest Claude Code has. -
tests/dotclaude/settings-pin.test.tschecks each JSON block of Settings Snippet againstschemas/claude-code-settings.json. The test fails on a key that the schema lacks, and on a never-set key. The never-set lists are intests/support/settings-pin.ts.
Problem: A managed settings file seats the guard of Claude Code.
A seated guard skips two dotclaude parts.
These parts are the shared sections and the model variants of the system prompt (prompt.compose), and the context_management text (prompt.section).
Choice: dotclaude writes no managed settings file, and it runs no sudo.
- It writes no
managed-settings.jsonand nomanaged-settings.d/drop-in. - It runs at tier
user, so it getsprompt.section,prompt.compose, andprompt.context. The guard is not seated on a machine with no managed settings and no Team or Enterprise login.
Alternatives: Write a managed drop-in that seats the guard.
That skips the prompt.section handlers at tier user.
So the prompt text of dotclaude does not reach the request.
Trade-off, accepted by the user: With no guard, an installed mod with a tool.check hook can turn a content deny rule into an allow.
A path deny and a whole-tool deny stay enforced.
The guard of dotclaude never weakens a deny.
See Off Switches.
Evidence:
-
src/plugins/dotclaude/slices/setup/domain/drift.tshasisSeated. It says that the guard is seated when the managed source has a key. The drift lines at about line 163 report it. -
src/plugins/dotclaude/slices/setup/domain/facts.tshasGUARD_SKIPS, which lists the two skipped parts. -
src/plugins/dotclaude/slices/setup/adapters/mod.tsruns the drift check atsession.start. -
.dotclaude/spec/changes/1.0.0/packages/01b2-prompt-slice.mdkeeps theprompt.sectionhandler oncontext_managementin 1.0.0. So the trade-off still applies. - The probe reports for tier
userare not in the repository. The tier claim is not re-run on2.1.296. - Not re-checked on
2.1.296: a managedenabledPluginskey also locks the plugin name. The built-in plugincc-plugin-sec-defaultis in the 2.1.296 bundle. The extractexternal/cc-2.1.296/strings.txtshows it. - Inference:
maxEffortLevelandavailableModelsare read from user settings, so the snippet holds them. Settings Resolution says that managedavailableModelsreplaces the user list.
Problem: A skill that the model can invoke adds a line to the skill listing of each request. A skill that the user runs by hand has no reason to be in that listing.
Choice: The core skills are user-invoked only.
Each SKILL.md sets disable-model-invocation: true.
These skills are setup, handoff, spec, ship, hotfix, and rules-creator.
Evidence: src/plugins/dotclaude/slices/setup/skills/setup/SKILL.md and the other skills of src/plugins/dotclaude/slices/.
The docs skill of the dotclaude-docs add-on is model-invocable, because a task needs its docs.
Its description has 155 characters.
The file is src/plugins/dotclaude-docs/slices/docs/skills/docs/SKILL.md.
This run did not measure its token cost.
The drift check runs at session.start.
It reports the settings and skill problems of each session.
Evidence: src/plugins/dotclaude/slices/setup/adapters/mod.ts.
Cost of a plugin skill: skillOverrides did not remove the listing line of a plugin skill.
This is the result of the probe of Claude Code 2.1.293.
The probe report is not in the repository.
The cost is not re-measured on 2.1.296.
Measure it with /context in just sandbox.
See Off Switches.
Alternatives: Model-invocable skills for all of them. Inference: each model-invocable skill costs a listing line in each request. So the core skills stay user-invoked.
See Architecture.
Problem: The settings schema must match the installed Claude Code version. A schema that is typed by hand goes stale when Claude Code updates.
Choice: dotclaude-schema reads the settings schema out of the installed bundle.
It is the CLI of the dotclaude-lab add-on.
It writes two files:
-
schemas/claude-code-settings.json, the keys ofsettings.json. -
schemas/claude-code-managed-settings.json, the keys ofmanaged-settings.json. This file is a reference only, because dotclaude writes no managed settings (see D2).
Code: src/plugins/dotclaude-lab/slices/schema/domain/build.ts builds the schema from the bundle text.
The file names are at lines 30 to 33.
The version title is at line 79.
The CLI is in src/plugins/dotclaude-lab/slices/schema/adapters/cli.ts.
Evidence: The $comment of schemas/claude-code-settings.json says that the file was extracted from 2.1.296.
The bundle extract external/cc-2.1.296/strings.txt is git-ignored.
See Settings Schema.
Problem: Some built-in parts of Claude Code add tokens or noise that dotclaude does not use. Some switches also cost quality, so each switch needs a test.
Choice: Three lists hold the switches. Each key is in one list.
- Forced off, with no quality cost:
- The built-in plugins of
OFF_PLUGINSinsrc/plugins/dotclaude/slices/setup/domain/facts.ts. These are all built-in plugins, exceptcc-plugin-plugin-authoringandcc-plugin-sec-default. - The claude.ai skill and plugin sync and the connectors.
These keys are
disableClaudeAiConnectors,syncClaudeAiSkills, andsyncClaudeAiPlugins. They are insrc/plugins/dotclaude/slices/trim/slice.ts. - The feedback and tips switches, fast mode, and the built-in agents. See Off Switches.
- The built-in plugins of
- Not in the snippet, because the eval of
2026-10-08showed a loss or no saving:-
DISABLE_TELEMETRYandCLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC. Both showed a loss on the second run. -
subagentPromptCacheTtlset to"1h". It showed no saving. The plan-mode denies, the task-tool denies, andincludeGitInstructions: falseare in the snippet. The eval showed no loss for them. 1.0.0 did not measure these lists again. The figures of the eval are in the archive. See Eval of 2026-10-08.
-
- Never set: keys that disable hooks, that defeat the
modelandeffortof the agent files, or that remove context that Claude needs. The lists areNEVER_SET_KEYSandNEVER_SET_ENVintests/support/settings-pin.ts.
A key of the global config (~/.claude.json) is not in settings.json.
The snippet sets the env var for it, such as CLAUDE_CODE_AUTO_CONNECT_IDE.
See Settings Snippet Keys.
No off switch for the computer-use MCP server is known.
The snippet holds a deny rule for it, mcp__computer-use.
See Off Switches.
Alternatives: Turn off all telemetry and all non-essential traffic. The eval rejected that choice for the two keys in list 2.
The setup command has no --with flag.
- Start
- How dotclaude Works
- Add-On Plugins
- How Claude Code Works
- Reference
- Rationale
- Evidence
- Development
- Archive