Repository navigation
Release 0.20
xsyetopz edited this page Oct 11, 2026
·
1 revision
Released 2026-10-04 to 2026-10-05.
A full reset on Claude Code 2.1.289 that cut runtime JavaScript from 18,935 lines to 2,118 lines.
It adds a new status line, the dotclaude-jev plugin, the Terms of Use, and the CodeGraph augment.
A version in parentheses marks a later patch of this line, and an entry with no version comes from 0.20.0.
0.20.0 keeps the parts that serve a need that Claude Code does not cover, and it removes the rest.
Runtime JavaScript goes from 18,935 lines in 0.19.1 to 2,118 lines, and tests/budget.test.mjs bounds it at 3,000.
Run /dotclaude:setup again after you update.
-
docs/parts.md, a page that lists each part, its event, its bound, and the need that it serves. - The rule that runtime JavaScript (
hooks/,status-line/,skills/,plugins/) stays withinRUNTIME_JS_LINES(3,000) inhooks/lib/_budget.mjs. 0.19.1 had no bound on it, and its runtime JavaScript grew to 18,935 lines, much of it a copy of what Claude Code 2.1.287 to 2.1.289 does itself. 0.20.8 removed this bound (see Changed, 0.20.8). - The plugin options
guard_agentsandcompaction_handoff.guard_agentsturns off the spawn rules, andcompaction_handoffturns off the handoff fork. - A Stop verify gate.
It sends Claude back once when a turn edited files and no check ran after the last edit, because the usage evidence shows that a rule in a prompt does not hold and a hook does.
It finds the check from the
justfile,package.json, orMakefileof the project. - A compaction instruction. The summary says that an unapproved plan or an open question stays open, because the default summary text tells Claude to continue without asking, and a model then acted on a plan that the user had not approved.
- A handoff fork on compaction.
Before a compaction of the main conversation, a fork writes a handoff note to
.claude/handoffs/and adds it to the compacted conversation, because users report that a handoff note beats a compaction. If the fork gives no note in 60 seconds, the compaction runs without it. - Cold-cache notes. A resumed session with an expired prompt cache, and a prompt that comes more than 1 hour after the last turn, give Claude the cost advice, because 1.6% of the turns, those after more than 1 hour idle, caused 80% of the cache writes.
- Plan detection from the account in
.claude.json, inhooks/lib/_plan.mjs. The cold-cache note uses a 5 minute cache time on theapiplan and 1 hour on other plans. A new or cleared session on theapiplan gets a plan note.skills/setup/scripts/settings.mjsshows the plan, takes--plan <id>, and applies the profile's per-planplansoverrides. - The
backendoption ofdotclaude-browser, which defaults toagent-browser. The valuecloakbrowserrunsagent-browserwith the CloakBrowser binary through--executable-path, for sites with bot detection.
- A status line with every 0.19 part, in less code, where each part has one shape: icon, bar, number.
- One bar renderer, one icon set, and one color scale (
USAGE_LEVELS) serve every percentage. - The rows are
core(model, context, cache, limits),place(folder, branch, worktree, PR, loop), anddetail(cache hit ratio and misses, limit pace, cost). - A
⚠blinks for a handoff due (context at 90% of the compaction point), a cache that expires in two minutes or less, and a limit at 90%. -
⚠also marks an effort that the rules do not allow for the model. - A second script shows the model and context of each running agent.
-
/dotclaude:setupwrites two stubs in the config directory and setsstatusLineandsubagentStatusLineto run them, because a status line command gets an empty${CLAUDE_PLUGIN_ROOT}.
- One bar renderer, one icon set, and one color scale (
- Limit resets (0.20.1): the status line shows the limit resets that you can use, as
⟳2 by Oct 12 at 4am: the count and the earliest expiry.- It reads them from the
cedar_emberblock of the/usagecopy that Claude Code keeps in.claude.json, so it makes no network call. - A grant counts when it is not paused, has resets left, and is in its start to end span, as in Claude Code and CodexBar.
- While a usage window is at its limit, the reset part outranks the other parts.
- It reads them from the
- Extra usage (0.20.1): the status line shows the extra usage spend while extra usage is on, as
extra █░░░░ $12.50/$50, orextra $12.50with no monthly limit. It readsextra_usagefrom the same copy.
- The profile sets
cleanupPeriodDaysto 14,enableArtifacttofalse,disableBundledSkillstotrue, andCLAUDE_CODE_DISABLE_EXPLORE_PLAN_AGENTSto1. -
/dotclaude:setupkeeps the newest 3 backups of each file and deletes the older ones. It lists the memory files to review and the LSP plugins for the language servers onPATH. - The setup integrations reference covers the LSP plugins and the
ctx7CLI for library docs, with no MCP server. Theweb-researcheragent usesctx7when it is onPATH, because it uses less context than a web search. Whenctx7is rate-limited, the agent checks the limit with one call and usesWebSearchandWebFetchuntil the reset. -
/dotclaude:setupgives the command that adds a Context7 API key to the shell profile. The user runs it outside Claude Code, and setup then checks that the key gives a tier other thananonymous. - The README has a "Save weekly usage" section, and the dossier ranks the community claims about usage.
- Each compaction note marks the earlier compaction note of the same session as
superseded, because the new note carries its open items. Before, each compaction left one morein-progressnote. - The CodeGraph augment: when a
Grepcall or a Bashrgorgrepsearch looks for one symbol name in a project with.codegraph/, the hooks module adds the callers and callees of that symbol to the search result.- Claude ignored rules that told it to run
codegraph, so the graph now comes with the search that Claude already runs. - The design follows the GitNexus hooks.
- Before a lookup, the hook runs
codegraph syncif files changed since the last index, because without the MCP server the index does not update itself. - It never builds an index.
- The plugin option
codegraphturns it off.
- Claude ignored rules that told it to run
- The minimal-code rules: session start tells Claude to build the minimum, with the idea of Ponytail.
The plugin option
ponytailturns them off. - Usage habits in the working rules: a handoff note and
/clearat a task boundary,/btwfor a side question, a lower effort in place of a model change, and a model change only after/clear. - Line breaks in the working rules: in Markdown, comments, commits, and PRs, Claude starts each sentence on a new line and does not break lines at a column, as in Semantic Line Breaks.
- Claude hard-wrapped prose at about 80 columns, which breaks reflow in editors and terminals and makes diffs larger.
- A project style takes precedence.
- Shorter wording of the other rules keeps the file within its 2,000-byte bound.
- Claude Code 2.1.289 has no
CLAUDE_NO_WRAPvariable or--no-word-wrapflag, and a plugin cannot change how the terminal wraps output.
- The optional
dotclaude-jevplugin (0.20.4): itssecond-opinionskill asks TypeSafe Jev, a decision model, for a yes or no check, a pick from options, or a rating, with a probability for each answer.- Claude uses it for its own close calls, and still asks the user the questions that only the user can answer.
- It also checks a technical decision of the user: when Jev finds that facts decide it and that it causes defects, Claude tells the user the facts once and asks for a confirmation, and the answer of the user is final.
- It needs
TYPESAFE_API_KEY.
- The
dotclaude-jevplugin (0.20.8) adds a session note that sends each decision through thesecond-opinionskill.- The decisions are the close calls of Claude, the questions of the user that ask for a decision, a pick, or a rating, the technical decisions of the user, and each request for a second opinion.
- Claude asks each question with options through
AskUserQuestion, so that the hooks module can add the pick of Jev. - Goals, preferences, and approvals stay with the user.
-
Model and effort rules.
Opus 5.5 takes
low,medium, andhigh, Sonnet 5.5 takeslowandmedium, and Haiku 4.5 takes no effort.agent.spawndenies a spawn that breaks the table, andtests/agents.test.mjskeeps the agent files in step with it. The status line warns about the main session, because no hook event fires when its effort changes. -
revieweranddebuggerrun atmedium, fromhigh. In the 0.17.1 eval rerun, Sonnet 5.5 atmediumpassed 109 of 110 at $0.10 for each pass, and athighit passed 107 of 110 at $0.12. - The settings profile sets
maxEffortLeveltohigh, fromxhigh, because the rules above allow no effort overhigh. - The Bash, Edit, and secret guards are small. They are 3 files with 367 lines in place of 14 files with 4,428 lines, and they keep the asks for hard-to-undo commands, test deletion, generated files, and settings files, and the Betterleaks redaction. The large rule sets (infrastructure, search, TLS, dependencies, proof escapes, and AI policy) go, because the auto-mode classifier and the permission rules of Claude Code cover them.
- The working rules in
hooks/session-start/rules.mdare 1,442 bytes, from 4,300 bytes in 0.19.1, and a test bounds them at 2,000. A standing prompt costs on every turn. -
/dotclaude:setupapplies one profile (recommended.json) with one script,settings.mjs, in place of the 0.19 profiles and scripts. The preview shows each setting that differs, and a second run changes nothing. - The only output style is
Concise, because Claude Code has the other styles built in. -
drive-web-browserusesagent-browserby default, because it needs no extra binary, and CloakBrowser is an opt-in for sites with bot detection. - The status line bounds live only in
hooks/lib/_budget.mjs, andstatus-line/shared.mjsimports them. -
refreshIntervalisSTATUS_REFRESH_SECONDS(1) inhooks/lib/_budget.mjs. Slow reads (git status, the compaction count, the/usagecopy) run once perSTATUS_CACHE_MS(5 s) and not on each run, where 0.19 ran them on each run. -
scripts/usage-report.mjsruns again with its own helpers inscripts/_usage-lib.mjs. - Each agent file has
maxTurns(20 to 80), in place of the 0.19 budget hooks, because the setting bounds an agent with no hook.implementertakes the bulk changes ofmechanical-worker.
- The status line has one row for each topic (0.20.2).
- The first row is the session: model, context, and cache expiry.
- The second row is the usage: each window, limit resets, and extra usage.
- The third row is the place, and then the detail: cache hit ratio, cost, lines, and time.
- Each usage window shows its deficit or reserve in its own part (0.20.2), as
7d █████ 99% ▲16%→3:41am ↻Oct 5 at 7am. A pace thus never shows without its window, and it drops only with its window. - The cache hit ratio reads as
hit 96%(0.20.2). Before, it had the◷icon of the cache expiry. - A blinking
⚠shows dim in its off frame (0.20.2). Before, a blank space showed, and it looked like a gap after the separator. - A status line group of one part shares its row with the next group (0.20.3). Thus the model does not stand alone on the first row when the context and the cache are not known yet.
- The status line code is in modules with one job each (0.20.3):
paint.mjs(icons, colors, bars),format.mjs(model names, times, money),parts.mjs(one function for each part),layout.mjs(rows), andrender.mjs(both status lines).shared.mjsis gone. - The status line reads the
/usagecopy on each run (0.20.1), not only when the status JSON has no usage windows. The windows of the status JSON still have priority.
- The documentation moved to the GitHub wiki (0.20.6).
The page source is in
wiki/, andjust wikipublishes it.docs/README.mdnow only links to the wiki pages. - The release archive of 0.1 to 0.19 is now one consolidated wiki page for each release line (0.20.6), with Release History as its index.
- The external sources of the old
docs/external/are now inexternal/, which git ignores (0.20.6). - The
/dotclaude:setupprofile sets the claude.ai skillsdocs,docx,pdf,pptx, andxlsxtooffinskillOverrides(0.20.6).disableBundledSkillsdoes not remove them, because they come from the claude.ai account. The claude.ai connectors, such as Claude Docs and alphaXiv, stay on. - Plugin, agent, and skill descriptions and hook messages put code items in backticks (0.20.4).
- Each note that dotclaude or one of its plugins gives to an agent is a clause of the dotclaude Terms of Use.
The session start gives the
dotclaude_terms_of_useblock, and each note comes in adotclaude_termstag with its clause number and title. The tag names the hook that enforces the clause. The wiki pageTerms-of-Uselists the 10 clauses. - The Jev note is clause 10, and the
dotclaude-jevhooks module enforces it.- When
TYPESAFE_API_KEYis set, the module runs onejev.mjs askcall for eachAskUserQuestion. - Jev sorts each question into preference or facts, and picks from its options.
- A question that facts decide shows the pick of Jev and its confidence to the user.
- A question about a goal, a preference, or an approval stays as it is.
- The module does not deny
AskUserQuestion, because a deny also blocked the questions that only the user can answer, and Claude could then ask in plain text. - When Jev fails, the question passes unchanged.
- When
-
just sandboxloads each plugin inplugins/, so a sandbox test also coversdotclaude-jev. TheSandboxwiki page tells why a headless run denies a tool that--allowedToolsdoes not list, and how to giveghthe login of the user. - The 3,000-line bound on runtime JavaScript (
RUNTIME_JS_LINESandtests/budget.test.mjs) is removed. The new rule is that runtime JavaScript does only the work that the latest Claude Code does not do, and uses the settings and extension points of Claude Code when they exist.
- The delegation gate and note, because users report cost blow-ups from subagents and
maxTurnsbounds an agent without it. - The agent budget hooks (
enforce-agent-budget,hand-off-capped-agents, and the report caps), because themaxTurnsof an agent file does the same job. - The model-switch,
ConfigChange,StopFailure, andTaskCompletedhooks, becauseavailableModelsandCLAUDE_CODE_DISABLE_FAST_MODEdo the same job. - The options
model_lock,model_plan,model_allowed, andusage_notes, and the other 0.19 options except the guard options, because the hooks that they controlled are gone. - Fable 5.1 from
availableModelsand from theAgent(model:fable*)deny rule, because the user chose to remove it, and a subagent never runs on it. - Nested instructions (
load-nested-instructions), because Claude Code 2.1.288 loads rules on Write and Edit. A Bash read of a directory does not load itsCLAUDE.mdyet. - The restore after a compaction, the check for line breaks, and the scratchpad pruning, because the 0.20.0 review found no need for them that Claude Code does not cover.
-
warn-instruction-size, because/doctoraudits the instruction files. - The skills
slices,explain, andpolish, because/goalcovers a large change, and the 0.20.0 review found no need for the other two. - The agent
mechanical-worker, becauseimplementerdoes its work. - The output styles
Explanatory,Learning, andProactive, because Claude Code has built-in styles of those names. - The
recognize-captchaskill and the CloakBrowser launcher, because CloakBrowser keeps most CAPTCHAs away andagent-browser --executable-pathruns its binary. - The AI policy catalog and its update script
scripts/update-ai-policies.mjs, andscripts/count-tokens.mjs, which served features that 0.20.0 removed. Thecontributeskill still reads the policy of the project. - The eval case
t4-slices, because it tests the removedslicesskill. - The 0.19 profile
optional.json, the setup scripts for migration and the managed lock, and the public docs pages for the removed parts.
- A model strip defect:
prefer-dotclaude-agentsremoved themodelthat a spawn call gave, so the agent ran on another model than the call asked for.agent.spawnnow denies amodelthat is not the one that the agent file fixes, and the reason names the fixed model. -
scripts/usage-report.mjsruns again. -
just sandboxapplies the setup profile and the status line again. It ran the deletedapply-statusline.mjsand hid the error.
- The status line stubs that
/dotclaude:setupwrites run the newest plugin version in the plugin cache (0.20.3). Before, they ran the version that was current at setup, so a plugin update did not change the status line until setup ran again. - A date and time in the status line read as
Oct 12 at 4amon all systems (0.20.2). Some ICU versions, as on Linux and Windows, joined them asOct 12, 4am, and the test failed there. - The 7d deficit or reserve did not show in a narrow terminal, also while the 7d window was past the first usage level (0.20.2). The 5h pace could also show without its window.
- The Stop verify gate sends its reason as
additionalContext(0.20.7), so Claude Code shows "Stop hook feedback", not "Stop hook error". 0.20.0 useddecision: "block"again, which Claude Code shows as an error. - The verify gate no longer asks for a check after an edit to a file outside the project, such as a plan file in
~/.claude/plans/(0.20.4). - The verify gate no longer counts an edit that failed, such as a
Writethat a permission denied (0.20.4). Before, a deniedWritesent Claude back for a check of a change that did not occur. - Setup keeps a status line of another tool, and tells you how to replace it with
--status-line(0.20.4). Before, it replaced the status line without a question. - A resumed session with an expired cache and less than 100k tokens of context no longer gets the cold cache notice, as in 0.19 (0.20.4). The cache write of a small context costs little.
- The handoff pointer and the compaction note tell Claude to set a note to
doneonly when each item in its Open section is done (0.20.4). Before, the pointer said to close a note when "the work" was complete, and an agent closed a note whose Open list still had items. - The Context7 rate-limit check in
/dotclaude:setupreads the status and the tier correctly (0.20.5).- Context7 refuses a key that is not valid with
HTTP/2 401, and it can showcontext7-quota-tier: anonymousfor a valid key. - Before, setup told the user that the key was not valid when the tier was
anonymous. - Setup also asks for a key only when
CONTEXT7_API_KEYis not set.
- Context7 refuses a key that is not valid with
-
/dotclaude:setupsuggests each curated LSP plugin of theclaude-plugins-officialmarketplace whose language server is onPATH(0.20.5).- It reads the plugins from the marketplace manifest, so a new curated plugin shows with no dotclaude release.
- Before, a fixed table of 6 plugins left out
csharp-lsp,jdtls-lsp,kotlin-lsp,lua-lsp,php-lsp, andruby-lsp. - For an installed plugin that is disabled, setup gives
/plugin enable. - Before, setup counted an installed plugin as done, also when it was disabled.
- Commits and pull requests of Claude get the git attribution again.
- The
includeGitInstructions: falsesetting of the profile removes theCo-Authored-Bytrailer and the pull request footer of Claude Code. - The 0.8 session note gave them back, but the 0.20.0 reset removed it.
- The session note reads the
attributionandincludeCoAuthoredBysettings, as Claude Code does. - Claude Code 2.1.289 gives no
modelto a SessionStart command hook, so the note tells Claude to write the name of its model in the trailer, such asClaude Sonnet 5.5. - The name then also follows a
/modelchange.
- The
- A repository with a remote of another owner gets no Claude attribution lines.
- A repository is the user's own when it has no remote, or when each remote is on GitHub under the
ghlogin or under an organization where that login has the owner role. - GitHub records no organization creator, so the owner role (
admin) stands for it. - A fork with an
upstreamof another owner is not the user's own. - In such a repository, the session note tells Claude to follow the AI policy of the project and to use
/dotclaude:contribute.
- A repository is the user's own when it has no remote, or when each remote is on GitHub under the
- The Bash guard checks the Claude attribution lines of
git commitagain, as it did before the 0.20.0 reset.- In a repository of the user, it denies a Claude
Co-Authored-Byline when the settings leave the trailer out, because Claude adds the line from habit. - In a repository of another owner, it asks before a commit with a Claude attribution line.
- In a repository of the user, it denies a Claude
Previous: Release 0.19 · Next: Release 0.21
- Overview
- Quickstart
- Install
- Plugins
- Settings
- Hooks
- Troubleshooting
- Undocumented reads
- Development
- Design
- Decisions
- Changelog
- Other