Repository navigation
Undocumented Reads
Claude Code documents most data that dotclaude uses. A few reads use data that Claude Code does not document. Claude Code can change or remove such data in any release, and it gives no notice. Read this page if a status line segment or a setup line is missing after an update.
This page lists each read that the code of 1.0.0 makes.
For each read, it gives the code path, the fact in the Claude Code 2.1.296 binary, and what breaks when a later version changes the data.
The binary facts come from the bundle of 2.1.296, which the extract in the git-ignored external/cc-2.1.296/ folder holds.
The method searches that extract for each name and counts the hits.
A hit shows that the name is in the bundle.
It does not show how the name is used, so a name with hits can still be unused.
Each read fails closed.
A parser that does not know the shape returns null, or undefined, and the part that needs the data does not show.
Most breaks are silent: a line of the drift note is missing, or a figure is less exact.
Only the drift check is visible, and then only for a change that it knows how to detect.
No read here blocks a tool call or changes a file.
The drift check changes no setting.
| Read | Code | Break |
|---|---|---|
| Drift section ids |
slices/setup/domain/facts.ts and domain/drift.ts
|
A new id gives a line in the drift note at each session start. |
| Built-in plugin names | slices/setup/domain/facts.ts |
A renamed plugin gives a line for the old name, or no line. |
| Tested version | slices/setup/domain/facts.ts |
Another version gives a line at each session start. |
| Tool descriptions | slices/surface/ |
A longer description from Claude Code is replaced by the dotclaude text. |
| Model ids | src/kernel/model.ts |
A new id shape gives a raw label in the status line. |
| Synced skills in the usage payload | slices/setup/domain/drift.ts |
A renamed field gives no synced-skill line. |
| Override variables | slices/setup/adapters/mod.ts |
A renamed variable gives no line about the agent files. |
| Mythos catalog file | slices/setup/adapters/files.ts |
A new file name or shape gives false. |
Account file .claude.json
|
slices/setup/adapters/settings-cmd.ts |
A renamed key gives no organization id. |
auth status output and rate limit tier |
slices/setup/adapters/account.ts |
Missing output leaves the account tier unknown. |
| Transcript records | dotclaude-sessions |
A renamed record type or field counts as zero. |
Plugin file installed_plugins.json
|
slices/setup/adapters/settings-cmd.ts |
A renamed file hides the docs add-on line. |
| Sandbox token file |
dotclaude-lab sandbox login |
A renamed file starts the sandbox with no login. |
These reads were in earlier versions. The code of 1.0.0 does not read them, so no break can reach them.
- The credits segment, which read the cache key of the account file.
- The
/contextscrape, which read the table that/contextwrites into the transcript. - The exact-text cut of the sentence about parallel agents.
- The
Recent commits:block of thesession_contextattachment. - The context block margin,
CONTEXT_BLOCK_MARGINinsrc/kernel/budget.ts. The constant is defined, but no code reads it.
The drift check reports a section of the system prompt that dotclaude does not know.
- Code:
ENGINE_SECTIONSinsrc/plugins/dotclaude/slices/setup/domain/facts.tslists the known ids.unknownSectionsindomain/drift.tscompares the ids of theprompt.composecall with that list. Thesetupadapter inadapters/mod.tsmakes the call with thebaretrait. An id with a colon belongs to a plugin, so it does not count. - Binary: five of the six ids that this run checked appear in the bundle.
Those are
tengu_silent_harbor,willow_tern,bg-session,autonomy_append, andendconv_deferred_hint. The sixth id,heron_brook, is found only inside longer names such astengu_heron_brook. So it is not proven to be a section id. The search matches a substring, so a hit does not prove that the id is a section id. This run did not check the other ids of the list. - Break: a new id gives a line in the drift note at each session start, until a maintainer adds the id.
An id that is removed or renamed gives no line for the old name.
If
prompt.composegives no sections,unknownSectionsgives an empty list, so no line appears. The line is a hint and not an error. dotclaude keeps an unknown section as Claude Code made it.
- Code:
OFF_PLUGINSinsrc/plugins/dotclaude/slices/setup/domain/facts.tslists nine internal names of the formcc-plugin-*@builtin.pluginsOnindomain/drift.tsreports each name that the settings do not set tofalse. Thepromptslice writes the same names into the settings snippet, inslices/prompt/slice.ts. - Binary: four of the nine names that this run checked appear in the bundle.
Those are
cc-plugin-agents-md,cc-plugin-responsive-mode,cc-plugin-tips, andcc-plugin-you-should-know. - Break: a renamed plugin gives a line for the old name until the list changes.
- Code:
TESTED_VERSIONinsrc/plugins/dotclaude/slices/setup/domain/facts.tsis2.1.296.driftLinesindomain/drift.tsgives one line when the running version differs. A test intests/tools/claude-code-release.test.tspins the value to the version that the CI workflow installs. - Binary: the extract is the
2.1.296bundle. This run did not search the bundle for the version string itself. - Break: another version gives one line at each session start. Each Claude Code release needs a code change to stop that line.
- Code:
slices/surface/transforms/Agent.ts,Bash.ts, andRead.tsgive the dotclaude text of each tool. The rule is inslices/surface/domain/tools.ts. The dotclaude text replaces the engine text only when the dotclaude text is shorter. The texts are inslices/surface/texts.ts/. - Binary: this run did not check the tool descriptions in the bundle.
- Break: a longer description from Claude Code is replaced by the dotclaude text.
So new guidance in it does not reach the model.
A shorter description from Claude Code stays.
The lab test in
slices/surface/lab/surface.test.tsuses stubbed engine texts. So it cannot see a change in the real text.
- Code:
parseModelinsrc/kernel/model.tsreads the family, major version, and minor version from an id. The status line uses it inslices/statusline/segments.tsandslices/statusline/adapters/subagents.ts. - Binary: the id
claude-haiku-5-5appears 11 times in the bundle. - Break: an id of another shape is not parsed. The subagent label then keeps the id as it is.
- Code: the
setupadapter calls$.session.usage({ breakdown: "summary" })inadapters/mod.ts.driftLinesreads the skill entries fromcontext.breakdown.skills.skillFrontmatter. It counts the entries whosesourceisSYNCED_SOURCE, which issyncedSkillsinfacts.ts. - Binary:
skillFrontmatterappears 10 times in the bundle, andsyncedSkillsappears 25 times. - Break: a renamed field or source gives no synced-skill line.
- Code: the
setupadapter readsCLAUDE_CODE_EFFORT_LEVELandCLAUDE_CODE_SUBAGENT_MODEL_FORCEwith$.env.getinadapters/mod.ts.OVERRIDE_ENVinfacts.tslists them, anddriftLinesgives a line when you set either one. - Binary: the two names appear 15 and 14 times in the bundle. This run did not check whether the Claude Code documentation names them.
- Break: a renamed variable gives no line about the
modelandeffortof the agent files.
- Code:
mythosInCataloginslices/setup/adapters/files.tsreads the file, andmythosOfferedinslices/setup/domain/settings.tschecks it. The path is<config dir>/cache/model-catalog/<organizationUuid>-<hash>-<surface>.json. Thesetupadapter inadapters/settings-cmd.tspasses the result to the settings plan asmythos. - Binary:
model-catalogappears 22 times in the bundle, andisMythosAvailableappears 2 times. The shape of the file is inference from the bundle name. - Break: another file name or another shape gives
mythosasfalse. The plan then treats the Mythos model as not offered.
- Code:
settings-cmd.tsreads.claude.jsoninCLAUDE_CONFIG_DIR, or in the home folder when the variable is not set. It takes theorganizationUuidof theoauthAccountkey. - Binary:
oauthAccountappears 22 times in the bundle, andorganizationUuidappears 73 times. - Break: a renamed key gives no organization id.
The path of the Mythos file then does not exist, so the check gives
false.
- Code:
slices/setup/adapters/account.tsrunsclaude auth status --jsonand readssubscriptionTypeandloggedInfrom its output. It reads the tier from the environment variableCLAUDE_CODE_RATE_LIMIT_TIER. It never reads the credentials file.accountOfinslices/setup/domain/tiers.tsbuilds the account from both. - Binary:
auth statusappears 18 times,subscriptionType28 times, andCLAUDE_CODE_RATE_LIMIT_TIER7 times. The variable is also in the table of names that the bundle maps to its settings. - Break: missing output, or a renamed field, leaves the subscription type unknown.
The tier picks of
setupthen have no account data. The rate limit tier comes only from the variable, so a renamed variable removes it.
The add-on dotclaude-sessions reads the transcripts in <config dir>/projects/<folder>/<session>.jsonl.
The readers are in slices/start-cost/domain/ and slices/usage/domain/.
- Code: the
start-costslice reads theattachment.typeof each record indomain/sources.ts. It reads these types:prompt_snapshot,skill_listing,agent_listing_delta,deferred_tools_delta,instructions, and the output style. Theprompt_snapshotrecord holdssystemBlocksand the tool schemas, whichdomain/first.tsreads. Theusageslice readsmessage.usageindomain/runs.ts. Thestart-costslice reads it indomain/transcript.ts. The fields areinput_tokens,cache_read_input_tokens, andcache_creation_input_tokens. - Binary:
prompt_snapshotappears 19 times,skill_listing11 times,agent_listing_delta9 times,deferred_tools_delta17 times, andsystemBlocks4 times.cache_read_input_tokensappears 70 times. - Break: a renamed record type gives no item for that source.
A renamed usage field counts as zero, so the usage report shows less than the request sent.
The
agent_listing_deltatype is a transcript record. It is a different read from the sentence of theAgenttool that the core plugin no longer uses.
- Code:
settings-cmd.tsreads<config dir>/plugins/installed_plugins.jsoninhasDocsAddon. When the add-on is present, the setup output adds its lines. - Binary:
installed_pluginsappears 60 times in the bundle. - Break: a renamed file hides the lines of the docs add-on in the setup output.
- Code:
dotclaude-labreads the token of the account inloginTokeninslices/sandbox/adapters/login.ts. It tries three sources in this order:- The variable
CLAUDE_CODE_OAUTH_TOKEN. - On macOS, the Keychain entry
Claude Code-credentials. - The file
.credentials.jsonin the.claudefolder of the home directory. The file path comes from the home directory, not from the config dir. The sandbox run receives the token.
- The variable
- Binary:
.credentials.jsonappears 11 times in the2.1.296strings. The count comes fromgrep -oonexternal/cc-2.1.296/strings.txt. The Keychain entry name does not appear in those strings. - Break: a renamed file or a renamed Keychain entry starts the sandbox run with no login. This read is in the lab add-on, and it runs only in the lab sandbox command.
- Read the drift note in the first answer of a new session.
The note goes to the model.
It tells the model to report the differences to you and to change no setting.
It names:
- a Claude Code version that is not the tested version,
- the built-in plugins that are on,
- the synced skills,
- the settings that stop the agent files,
- the ids of the sections that dotclaude does not know.
- If the setup output lost the Mythos line or the docs add-on line, read the matching section above.
- Report a break that you cannot fix in the issues of the repository, with the Claude Code version.
- Start
- How dotclaude Works
- Add-On Plugins
- How Claude Code Works
- Reference
- Rationale
- Evidence
- Development
- Archive