Repository navigation
Release 0.28
xsyetopz edited this page Oct 13, 2026
·
2 revisions
This page lists the parts that 0.28 adds and removes, for users and contributors.
The changed behavior and the fixes are on Release 0.28 Changes and Fixes.
Released 2026-10-09.
-
just typecheckrunstsc --noEmiton the lab tests and on the core hooks module, andjust checkruns it after the lint. The lab tests use the types of the mods API in place ofany. - The
WebSearchhook ofdotclaude-browserrunsagent-browserwith the newest CloakBrowser binary in~/.cloakbrowser/when one is present. It does so because plain headlessagent-browsergot a bot check from DuckDuckGo. Thebackendoptioncloakbrowsernow needs that binary and no longer denies each search. - The status line has 3 columns when the terminal has about 130 columns.
The left column shows the session, the middle column shows the context, and the right column shows the 5-hour, 7-day, and Fable windows.
A narrower terminal keeps the row packing.
After the user runs
/context, the middle column shows the exact rows of the newest table. The messages are the total minus them. Before that, it shows only the free tokens. The Fable window comes from the usage cache of Claude Code, and it is hidden when that cache is older than 1 hour. - The status line has segments for the context, the cache, and each usage limit with its pace and reset credits.
- The add-on plugin
dotclaude-codegraphgives Claude the code graph of a project from the CodeGraph CLIcodegraph. It works without the core plugin, and it runs only in a project that has a.codegraph/index. At session start, it syncs the index and adds one line that namesimpactandcallers. At aGreporGlobcall for a name, it adds the definition and the callers of that name. After an edit, a write, or a git command that changes the tree, it syncs the index in the background. Install it withclaude plugin install dotclaude-codegraph@dotclaude, and install the CLI and runcodegraph inityourself. - The add-on plugin
dotclaude-docsgets current library docs with the Context7 CLIctx7. It works without the core plugin and with no key. - The add-on plugin
dotclaude-sessionsmeasures your sessions, for each user of Claude Code.dotclaude-startgives the start of a session by source: the built-in parts, each plugin, each MCP server,CLAUDE.mdand memory, the output style, and the system prompt.dotclaude-start --compare BASE OTHERgives the difference between a start without a plugin and a start with it.dotclaude-usagegives the model calls of each run, the context that each call reads again, and the skills that the period did not use. Its header saysAPI-equivalent at list prices, not a subscription bill. The skillsstart-costandusagetell Claude to run them. - The add-on plugin
dotclaude-labis for plugin authors.dotclaude-sandboxruns Claude Code in a config apart from yours, and--check-frontmatterfails when the debug log names an unknown frontmatter field.dotclaude-capturelogs the requests of Claude Code through a local proxy and sizes the first one.dotclaude-schemawrites the JSON Schema ofsettings.json.dotclaude-eval-comparerunsclaude plugin evalon two plugin folders. The skilleval-comparetells Claude how to compare the plugin arms. -
dotclaude-browseranswers eachWebSearchcall with a search in the headless browser. -
dotclaude-jevadds a second-opinion tool that asks TypeSafe Jev about a decision. With noTYPESAFE_API_KEY, the plugin registers no tool, so it costs no tokens. The retries of the client end before the 45 s kill of the hooks module, and each bound is infeatures/jev/limits.mjs. The question gives each option at least one fact for it and one fact against it. It has no lean of the user, the notes, or the team. The question ofAskUserQuestionalways goes to you with the pick of Jev, also when Jev is sure, and Claude never skips it. The fallback result tells Claude to answer from its own check and to tell you that no second opinion was available. The error text of the API that goes to Claude is cut to 200 characters (ERROR_BODY_MAX). - The core plugin has one route for the system prompt.
The rules that every model shares are system prompt sections in
features/prompt/shared.mjs, andprompt.composeputs them before the model notes. The output style holds only the role, the tone, and the format. The reason is that Claude Code sends an output style as a message in the conversation and not in the system prompt. A kept eval trace showed the style as anoutput_style_instructionsattachment. With the rules in it, the plugin arm scored like the no-plugin baseline onfacts-release-scopeandreport-count. The prompt variants hold only the text of one model. Examples are the step line of Haiku 5.5 and the block that a subagent gets at spawn. The Sonnet and Haiku variants no longer repeat the verification rule, and the Fable variant no longer repeats the extras rule. The shared sections hold both. Mythos 5.1 gets the Fable variant, because one prompting guide covers both models. The evidence line tells Claude to run a new check before it undoes finished work because of a claim of fault. This applies also when the user tells Claude to remove the work. Thedoing_taskssection tells Claude that a manifest version with no tag is the release in progress. Its changelog entries go in the section of that version. Thecountssection tells Claude to copy each count from a tool output and to look first for a project command that prints it. TheBashtool text tells Claude to end commit messages and pull request text with the attribution text of the session. - The source of the wiki in
wiki/is grouped in folders. The page names and the page URLs are unchanged, because a GitHub wiki addresses a page by its bare name. - The hooks module cuts the prompt surface with the handlers
prompt.attachmentandtool.describe. They shorten thesandbox_instructionsandauto_modetexts and the descriptions of large tools, and they deferAskUserQuestionandListAgents. Withsandbox.allowUnsandboxedCommandsset totrue, the short sandbox text keeps the rule that a run outside the sandbox needs an approval. The shortAgenttool text does not nameSendMessage, because the output style tells Claude to start a new subagent for more work. - A subagent that reaches its context bound gets a message to report now.
- A subagent with 2 turns left before its
maxTurnsgets a message to report now. The message is in the same note as the context message when both apply. - Hooks check the rules of a project that code can check.
They ask before
git stash,git reset, and agit checkoutorgit restoreof a path. They ask before a change to an existing line of a test file or a limits file. They deny a Markdown write or a commit message with a code item outside a code span. They deny text that claims an approval of the user when no prompt of the user gives one. They also ask before an edit of a lint or type-check config, a check runner config, a CI file, or a hook file. The hook files arehooks/hooks.json,hooks/register.mjs, ahooks/*.txttext,.claude/hooks/, a script that ahooks.jsoncommand names, the inlinehooksofplugin.json,.husky/, and.pre-commit-config.yaml. They also ask before an edit of the keyshooks,permissions,disableAllHooks,enabledPlugins, andsandboxof.claude/settings*.json. They ask before the linter sections ofpyproject.tomlandsetup.cfg, a check script ofpackage.json, and a check recipe of ajustfileorMakefile. They also ask before an added skipped or focused test (.skip,.only, and.todo) or an added inline lint suppression. ABashwrite to such a file also asks. ABashwrite to a test file, a limits file, a settings file, or a recipe file also asks. The write commands aresed -i,perl -i,>,>>,tee,cp,mv,install,rm,unlink,truncate,ln -f,git checkout --,git restore,git rm,git mv, andfindwith-deleteor-exec rm. ABashwrite that only adds to a test file or a limits file gets no ask, the same as aWriteof a new file. A path under/devor under a variable other thanCLAUDE_PROJECT_DIRorHOMEgets no ask. A path under~or outside the project root gets the ask. The ask covers a lint config, a runner config, a CI file, a hook file, a settings file, or a recipe file. It gets no ask for a test file or a limits file. ABashwrite topyproject.toml,setup.cfg, orpackage.jsongets no ask. Each ask reason is written for you and says why the change can hide a defect. - A
Readrule hook denies aBashcommand that only prints a file (cat,sed,head) and gives theReadcall instead. - Semantic line breaks: a written Markdown file and the quoted heredoc of
git commitandgh pr createget one sentence on each line. - A prompt hook on
Stopblocks one time a message that calls a part done when no passing check shows it. It also blocks one time a message that starts with agreement, praise, thanks, or an apology in place of the state, in any language. It also blocks one time a message that changes an earlier answer with no evidence. It also blocks one time a message that says the agent raised a bound so that a check passes. It also blocks one time a message that says the agent weakened or skipped a test so that a check passes. It also blocks one time a message that says the agent edited a check or a config so that a check passes. It blocks that message only when you did not ask for the change. It never runs onSubagentStop. Sonnet 5.5 judges the message. The prompt asks for the JSON answer first. The reason is that an evaluator that wrote prose made Claude Code return the hook prompt to the session as feedback. The prompt also tells the session agent to send its report again when the prompt returns to it asStop hook feedback. - A drift check at
SessionStarttells Claude about these differences:- a built-in plugin that is on again,
- a synced claude.ai skill,
- a Claude Code version other than the tested one,
- a system prompt section that dotclaude does not know,
- an env var that overrides the
modelandeffortof the agents, - managed settings that seat the guard of Claude Code.
-
schemas/claude-code-settings.jsonandschemas/claude-code-managed-settings.jsonhold the settings schemas of Claude Code 2.1.296, anddotclaude-schemaof the plugindotclaude-labbuilds them. The version is in the standard$commentkeyword at the root of each file, such asExtracted from Claude Code 2.1.296. It is in no file name and in no made-up key, so the$schemalink stays the same after an update. The generator puts the code items of each description in single backticks, so an editor shows them as code. The generator takes the last definition before the schema for a reused short name, sohooksandsandbox.credentials.sigv4carry no wrong shape. - The core plugin has a
settings.jsonat its root, which holds only keys that Claude Code reads from a plugin. Today it sets no key. A test checks it against the generated schema and fails on a key that a plugin must not set. - The
setupskill merges the settings snippet into the settings file that you pick, after you see each change and agree. Without it, 0.28.0 applied none of the snippet. Compaction stayed on, the full system prompt stayed, and the status line, the permission rules, and the sandbox were not set. The snippet ships inlib/snippet.mjs, which setup and the drift check share, and a test keeps it equal to the wiki pageSettings-Snippet. The status line commands get the absolute path of the installed plugin folder, so run setup again after each plugin update. Whendotclaude-docsis installed, the merge adds its allow rule and domain. When the cached model catalog of the account offers it,availableModelsgetsclaude-mythos-5-1in place ofclaude-fable-5-1. Then setup checks theopenspecCLI, offers the install, and runsopenspec init --tools claude,openspec config set delivery skills, andopenspec updateafter you agree. Last, setup checks the tools of each installed add-on (codegraphand its index,agent-browser,npx,TYPESAFE_API_KEY, and Node.js). It offers each missing global install, and it runscodegraph init -yafter you agree. It never asks for the Jev key or writes it. - The drift note at session start reports the values of the snippet that the settings lack.
It also reports a status line command that runs another plugin folder or a 0.27.0 stub.
The fix is
/dotclaude:setup. - The format of the evals is the suite format of
claude plugin eval, which Claude Code owns. The 14 cases are inplugins/dotclaude/evals/, because the command reads cases only from a folder inside the plugin.just evalruns them with no published report and a cost limit. The first run on 2026-10-09 scored 1 on the plugin arm in 13 of 14 cases (wiki/evals/Evals-0.28.0.md). The graders onEditandWritenow match the protected path only afterfile_path, and theBashgraders match whole words only. - The output style and the agents
debugger,implementer,reviewer, andtest-runnertell Claude to read a tool, a command, or a convention from the project. Claude reads that before it chooses one. The files to read are the build and task files of the project, the config files of its tools, andCLAUDE.md. Claude reads these files in any language and names the file that it read. A subagent sawbiome.jsonand chose Prettier, although the project runsbiome ci. - The output style tells Claude that background work of a stopped subagent still runs. Claude waits for its notification, and it does not start the same work again. It also tells Claude that a check that fails shows nothing about the state that it checks. An example is a process list that the sandbox stops.
- For contributors: the
descriptionand theStopprompt ofhooks.jsoncome fromdescription.txtandStop.prompt.txtnext to it, with one sentence on each line.just hook-textwrites them intohooks.json, and a test fails when the two differ. -
just evalandjust eval-variantrun under a lock (tools/lock.ts), so a second eval run cannot start while one is in progress. - The output style tells Claude to copy each count in a report from a tool output, and the eval case
report-countchecks it. A count of lines or items in a file or an output is a computed count. Claude runs a command of the project orgrep -cto get it. It adds no count of its own next to a copied count. - The output style tells Claude to read the scope of the work from the state of the project.
The state is the branch, the tags, the version, and the open plans.
For example, a changelog entry for a version that is bumped and not tagged goes in the section of that version.
The eval case
facts-release-scopechecks it. - The output style and the
implementeragent tell Claude that a test checks what the code does. Examples are a decision, an exit status, a file, or a value that a message carries. A test does not check the words of a message, a doc, or a comment. When the user gives a rule about text, Claude follows it when it writes, and does not make a test of it. Therevieweragent looks for tests of prose, a raised bound, a skipped test, and an edited lint or CI config. - The output style has a
<blocks>section, and the block of each subagent has a short form of it. A failing check, a lint rule, a test, a bound, a hook, and a permission rule each stop the work for a reason. Claude changes the work to fit the block or asks you. It does not raise a bound, weaken or skip a test, or edit a check, a config, or a hook so that a check passes. It does so only when you ask. - The agents
debuggerandimplementersay what to do when a check fails: fix the code, or report the failure with the evidence. Thedebuggeragent no longer changes a test, and it reports a test that it thinks is wrong to the parent. -
dotclaude-browsertells Claude to ask you before it passes a blocked page and before--auto-connect. With thecloakbrowserbackend and no binary, Claude tells you and does not switch to plainagent-browser. - The skills
docsandeval-comparetell Claude to stop and tell you when it reaches a bound. The bounds are 3ctx7calls or the cost bound of a run. Claude does not raise the bound or fill the gap from memory.
- The
dotclaude-modderplugin left the marketplace, because dotclaude is a set of general software-engineering roles. Uninstall it withclaude plugin uninstall dotclaude-modder@dotclaude. - dotclaude uses no proprietary format. A format is proprietary when dotclaude defines it and no surface of Claude Code reads or defines it. dotclaude takes only what Claude Code provides: settings, env vars, hooks and the other documented extension points, and the files that Claude Code owns. A feature that must write its own file, so that a later call reads that file, is not built. The next entries list what this rule removed against 0.27.0. There is no migration, no compatibility shim, and no reader for an old file.
- The settings profile file
templates/settings.json, the diff, and--with <item>with its eval-gated items are gone. Setup also lost the backup of each written file. It lost the migration of 0.26 keys, the CVP gate, and the--move-managedoption. It lost the managed drop-intemplates/managed-settings.jsonand itssudo cpcommand. It lost the language server hints and the launcher stub of the status line.lib/never-set.mjsis gone, and a test holds the list of keys that must stay unset. The settings snippet in the wiki (wiki/settings/Settings-Snippet.md) replaces the profile, and setup applies it. - The file of project rules for the Tier 2 checks is gone.
So are the router with its table of models and efforts, and the router
PreToolUsehook. Themodelandeffortof each agent are in its frontmatter. - The status line no longer shows a burn rate, the slow-read cache, or the estimates of the memory, skills, and agents parts. Each one needed a state file.
- The usage state file and the notes at a usage limit are gone.
- The context markers, the handoff carry after
/clear, and the stop records are gone, and the next session start no longer names a stop. - The
handoffskill and the notes in.claude/handoffs/are gone. - The main-session context note is removed, because compaction is off and the output style covers it.
- The guard keeps no per-session state file. The classic hook for auto mode is gone, and the hooks module asks for a GitHub repository of another owner.
- The
rmask is nowaskpermission rules for a recursivermin the settings snippet, with the sandbox. Thermparser and its classic hook are gone. Thegitask now also readstimeout,env -i,nice, andxargsbeforegit. Thegitask and the file-print deny share one shell reader,lib/shell.mjs. - Auto-fix at
Stop,DOTCLAUDE_AUTOFIX, and theautofixitem are gone. - The
sembr-chat.jsonllog of chat lines is gone. -
sembrruns only in the hooks module:tool.callhandlers onWrite,Edit, andBashreplace the classicPreToolUsehookfeatures/sembr/cli.mjs. The classic hooksreads,adherence, andcontextshare one stdin reader and onehookSpecificOutputbuilder inlib/hook-io.mjs. -
tools/baseline.jsonis gone, andjust measurewrites no file. - The eval harness is gone:
tools/eval/,evals/, andjust eval. Theadherencesuite and the other cases go with it. - The copies of the schemas of Claude Code 2.1.293 and 2.1.294 are gone, and the
x-claude-code-versionkey is gone from the schema files. - Files from earlier versions stay on your machine, and no code of dotclaude removes them.
You can remove each one.
-
<config dir>/settings.json.dotclaude-backup-<time>and the same name for<config dir>/CLAUDE.md,.claude/settings.json, and.claude/settings.local.json, where<config dir>is~/.claudeorCLAUDE_CONFIG_DIR. Setup 0.27.0 wrote them next to a file before it changed the file, and it kept the newest three for each file. -
<config dir>/dotclaude/statusline.mjs, the launcher stub of the status line. AstatusLinesetting that runs it prints nothing now, because the script it looks for is gone. Remove that setting or set the status line again. -
<config dir>/dotclaude/subagents.mjs, the launcher stub of 0.26 that setup 0.27.0 removed only when it ran. -
${CLAUDE_PLUGIN_DATA}/auto-mode-guard/<session id>.json, the guard state of the classic hook of 0.27.0. The hook wrote it into the system temp folder, inauto-mode-guard/, whenCLAUDE_PLUGIN_DATAwas not set. -
.claude/handoffs/<slug>.mdin a project, the notes of thehandoffskill of 0.27.0 and the hooks of 0.26. -
/Library/Application Support/ClaudeCode/managed-settings.jsonon macOS,/etc/claude-code/managed-settings.jsonon Linux, andC:\Program Files\ClaudeCode\managed-settings.jsonon Windows. Setup 0.27.0 only printed thesudo cpcommand for it, so the file exists only if you ran that command. Remove it withsudo rm, and the drift check stops reporting a seated guard. -
~/.universal-modder/(or the folder inUM_HOME) and%LOCALAPPDATA%\universal-modder, the backups, downloads, and knowledge cache of the removeddotclaude-modderplugin. - The keys that setup 0.27.0 merged into your settings stay in your settings files. Keep or remove each one yourself.
-
- Start
- How dotclaude Works
- Add-On Plugins
- How Claude Code Works
- Reference
- Rationale
- Evidence
- Development
- Archive