v16.26.0
What's Changed
A maintenance release that closes a backlog of upstream-drift issues. Five targets learn configuration surfaces their tools have documented but rulesync could not author, three adapters stop writing output the tool never reads, and fetch gains one more way to tell a skill name from the one it is drawn as.
Roo Code / Zoo Code: the global root rule now lands where the tools read it
In --global mode RooRule declared no root path, so the shared default applied and the root overview was written to ~/AGENTS.md. Neither tool reads that file: agent-rules discovery (AGENTS.md, AGENT.md, AGENTS.local.md) runs against the workspace only — the current directory, plus subdirectories holding a .roo folder when enableSubfolderRules is on — with no home-directory branch. The only home root either tool loads as a rules directory is ~/.roo/rules/.
The global root rule now goes to ~/.roo/rules/AGENTS.md, alongside the non-root files, following the same pattern Kiro's global steering already uses. The basename is kept so the file still reads as the root overview, and it is what import --global uses to recover the root/non-root distinction now that the two share a directory. zoocode inherits the fix through the shared adapters.
Project scope is unchanged — the workspace-root AGENTS.md is exactly what the loader reads from cwd. If you generated Roo or Zoo Code rules in global mode before, the old ~/AGENTS.md is left where it is; delete it once you have regenerated.
CodeBuddy Code: the rules frontmatter now follows the documented contract
Three defects in the codebuddy rules adapter, all against the current Memory documentation:
pathsaccepts the scalar form. It is documented asstring/string[]and every example in the Rule Control Fields section uses the bare string, but the schema only took an array — so a rule file copied straight out of CodeBuddy's own docs failed to import. The scalar is now normalized to a single-element list.enabledis modeled. It was stripped on import, so a rule someone had deliberately switched off came back on after a regenerate.alwaysApplydefaults totrueupstream — the opposite of Cursor, which this adapter was modeled on. Per the Rule Type Determination table,pathsonly scopes a rule whenalwaysApply: falsesits alongside it. Rulesync emittedpathsalone, which CodeBuddy loaded as ALWAYS and injected into every context. Path-scoped rules now carry an explicitalwaysApply: false.
Generated CodeBuddy rule files therefore gain an alwaysApply: false line wherever a rule is path-scoped. That is the shape the tool actually honors.
Rovo Dev: enable_instructions: false survives a round trip
Atlassian inverted the default of Rovo Dev's enable_instructions on 2026-09-02: a server's initialization instructions now join the agent's system prompt when the key is absent or true, and false is what suppresses them. The adapter had been written against the earlier opt-in wording, so it collapsed the flag to a boolean and only ever wrote it when true — a suppression could not be authored, and an existing one was erased on import. The flag is now tri-state end to end.
Crush: CRUSH.local.md for localRoot rules
Crush's defaultContextPaths lists CRUSH.local.md beside its committed sibling, the way Claude Code reads CLAUDE.local.md. The crush target declared no local-root mode, so a localRoot: true rule had nowhere to go and its body was folded into the committed CRUSH.md — the one outcome the separate file exists to avoid. It now writes CRUSH.local.md (project scope only; Crush's global context paths have no .local variant), and the file is added to the hand-maintained gitignore entries because Crush does not ignore it itself.
The same latent bug is fixed for codebuddy, which had been declaring the separate-local-file mode and silently emitting nothing.
ZCode: the documented optional skill fields
ZCode's SKILL.md field reference allowlists five frontmatter keys — the required name/description plus optional when_to_use, license and metadata. Rulesync emitted only the first pair, so a canonical skill carrying license or metadata had both silently dropped for zcode while every other Agent Skills target received them, and when_to_use could not be authored at all. All three are now generated from the shared packaging defaults (overridable through a zcode: block) and carried back on import.
Factory Droid: five more settings keys
mcpAutonomyOverrides was carried but not mcpAutonomyUrlOverrides; enabledPlugins and extraKnownMarketplaces but not their strict counterparts; hooksDisabled but not allowManagedHooksOnly. Half of each documented pair was dropped on import and unauthorable on generate. builtInToolAutonomyOverrides, mcpAutonomyUrlOverrides, allowManagedHooksOnly, strictEnabledPlugins and strictKnownMarketplaces join the override keys, each verified against the enterprise hierarchical-settings page.
deepagents-cli: the [extensions] trust gate is authorable
dcode's [extensions] table decides whether a checked-out project's .deepagents/extensions/*.py is imported into the agent process, and a .rulesync/permissions.jsonc could not pin it. A deepagents.extensions override block now carries enabled and trust (ask/always/never), merged into [extensions] on generate and lifted back on import, with trust read the way upstream's parse_trust_policy reads it and a warning when the override relaxes the machine's global config — the same treatment [startup] already had.
fetch: the blanks drawn as a plain space
A skill name that joins two words with U+00A0, U+1680, one of the U+2000–U+200A quads and spaces, U+202F or U+205F reads on screen as exactly the plain spelling: all of them are one column wide and drawn indistinguishably from the space. Beside the plain name the pair was already reported, but alone on a list such a name carried no note at all. It now carries a seventh reason, "carries a character drawn as a plain space", written ahead of the comparison reasons because it says what the row itself is drawn as whatever else is on the list. U+3000 IDEOGRAPHIC SPACE stays unmarked — it is two columns wide, so the row tells it apart, and marking it would put a warning on an ordinary Japanese name.
Documentation
The documentation site is now discoverable by search engines (sitemap, canonical URLs, og:url, per-page lastmod), the ZCode hook matcher semantics are described correctly — a value of only letters, digits, underscores and | is an exact name list, anything else a case-sensitive regex — and the AugmentCode and Factory Droid research reference maps have been corrected against their current upstream docs.