version history
Notable changes per ACE release, newest first. Canonical source: ace-rs/ace releases.
nextplanned
Candidate work past the v0.9.2 tag. Under design — not yet on a tagged release.
planned / under design
- ace connect A2A bridge — a local agent-to-agent bridge over unix sockets, to be folded into the ace binary; currently ships as a school skill.
- School-instructions catalog & tabular-output alignment — captured in design notes as candidate follow-ups.
v0.9.22026-08-03
- ace diff pages long output — school diffs go through $PAGER (default less -FRX, which passes short output straight through) when stdout is a terminal. Pipes and --porcelain keep the untouched plain stream, and quitting the pager mid-diff counts as done, not an error.
- ace explain shows what a skill is — the resolution trace said why a skill is active; the output now also carries the skill's frontmatter description, so you learn what it is without opening its SKILL.md.
v0.9.12026-08-03
- School authoring commands resolve from the working directory again — ace school pull, ace school skills, and ace import resolve the school from the current directory first, falling back (with an announcement) to the linked school only when the cwd holds no school.toml. A regression had made them resolve exclusively through ace.toml's school specifier, so running them inside a school repo operated on the wrong school — or failed outright in a school repo with no ace.toml.
- Unhonoured trust levels are announced — when a backend does not support the requested trust level (for example interactive opencode, which has no approval-mode flags), ACE says so instead of silently claiming the level was applied.
- Fixes — a malformed school.toml fails loudly with a parse error instead of being treated as absent; messages consistently say “linked school” / “authored school” — the retired “active school” wording is gone.
v0.9.02026-07-29
- ace learn and ace maverick removed — both commands are gone, along with the 0.8 tombstone for learn. Narrowing a skill set is a direct ace.toml edit; LLM-driven workflows belong to the school, not the binary.
- MCP surface tightened — bare ace mcp is now a read-only listing — ace mcp list is gone, and so is the automatic health check. New ace mcp unregister <name> removes a single server; ace mcp reset is mass-only and no longer accepts a name; ace mcp clear is gone.
- Any git URL as an import source — an import source may be a full git URL — SSH and self-hosted remotes included — not just owner/repo shorthand. The source cache is keyed by host and path, so same-named repos on different hosts no longer collide; existing caches migrate automatically.
- User-level config resolves a project — a repo needs no ace.toml of its own when the user layer names a school. Precedence is unchanged — local over project over user, replacement not merge — and bare ace announces a school resolved from the user or local layer rather than resolving it silently.
- Unattended runs — a global --yes / -y answers every checklist with its default instead of asking, and a set CI environment variable implies it. Prompts with no default — free-form and single-choice — fail rather than guess. With no terminal to answer on, ACE refuses with a stated cause instead of inventing an answer.
- Merging imports — ace import picks several skills at once and merges them into the existing skills declaration instead of appending a second [[imports]] block. It now errors when it has no picker to show, rather than exiting 0 having done nothing.
- Explicit link repair — ace link --force replaces symlinks left behind by a previous school; without it ACE refuses rather than guessing. ace pull points at ace link when a pull changes which skills resolve.
- Dated storage migrations — migrations are dated and stamped in index.toml under layout_version, and a migration aborts only when the stamp itself fails to write.
v0.8.12026-06-10
- Gitlink import fix — skill imports rooted at a repo's top level no longer leak .git into the school repo as an accidental submodule. Import copies skip VCS metadata; ace school pull warns and skips already-broken gitlink entries, and project-side ace pull warns on skill-tree integrity problems.
- Space-separated school specifiers — ace setup prod9 school now works — both as two CLI args and interactively — alongside the existing prod9/school form.
- ace.toml direct-edit hint — ace setup points out that small skill-set changes are quicker via a direct ace.toml edit than re-running the picker.
v0.8.02026-06-08
- Reworked skill engine — ground-up rearchitecture of the core skill model. A typestate lifecycle (discovered → validated → vetted) makes it impossible for an unvalidated skill to reach a backend, and a path-based Locator identity replaces stringly-typed skill IDs. The imports resolver keeps first-wins semantics with collision warnings. Foundation for the admission and validation changes below.
- Skill-name admission policy — skill names are admitted by a fail-closed Unicode-whitelist predicate at the discovery boundary, replacing emit-time sanitization. Admission is orthogonal to selection: a name outside the allowed set is rejected and warned, never mutated on disk — self-healing on the next setup/pull. Import hard-refuses the offending skill and exits non-zero.
- Validation surfaced as warnings — invalid glob patterns in skill selection and structural discovery prunes now warn-and-skip instead of failing silently, so a malformed pattern or a bad skill directory is visible rather than swallowed.
- Capability-driven backend emit — nested-skill emit gated on a per-backend FEATURE_NESTED_SKILLS capability bit rather than backend name, with hardened flatten link names and a 2-stage skill-discovery cascade.
- Scriptable exit codes — a semantic ExitCode enum on CmdError replaces the blanket exit(1): Usage (1), Unavailable (2), Operational (3), Cancelled (130). Scripts wrapping ace can branch on $? to distinguish bad input from a failed operation.
- Toolchain pinned to stable 1.96 — a rust-toolchain.toml pins the build to stable 1.96 — affects contributors building from source; cargo fmt is now deterministic.
v0.7.12026-05-20
- MCP exclusion — bare ace honors exclude_mcp; added per-entry MCP prompts and ace mcp register <name> to register individual servers, with OAuth instructions printed for OAuth-only entries.
- School resolution hardened — schools resolve exclusively via the ace.toml specifier; ace school init dogfoods its own ace.toml and writes a backend-aware instructions file.
- Session prompt — excluded-skill names are appended to the session prompt; school-level session_prompt documented as an authoring affordance.
- Gitignore managed block — project and school gitignore flows unified into one managed block; refresh moved into the Prepare phase so pull is a pure fetch.
- Symlink correctness — link_skills now canonicalizes the predicate for symlinked school roots.
v0.7.02026-05-10
- OpenCode backend — added (PROD9-17), including a --opencode shortcut flag and {{ ... }} placeholder rendering in [[backends]] cmd and env.
- ace school validate — typo-checks backend placeholders, with an ace school check alias and a clean-validation success message.
- ace link — added to re-link school skill symlinks.
- ace upgrade — now reads the latest version from ace-rs.dev/latest; ace version subcommand added.
- ace-school externalized — imported from ace-rs/school instead of being bundled in the binary.
- Homebrew tap — formula added, with self-update guarded for brew installs.
- Fixes — import merge switched to last-wins; ace learn always includes the hardcoded ace/ace-* skills.
v0.6.02026-05-08
- ace learn — added — studies a project and narrows the skills filter.
- Custom backends — via [[backends]] documented and supported, including an exec_one_shot transport for non-interactive launches, split from the interactive Session intent.
- Org/domain migration — project migrated to the ace-rs org and the ace-rs.dev domain.
- School error variants split — Missing became NoSpecifier (run ace setup) and NotInitialized (run ace school init) for clearer guidance.
- Fix — overlapping import sources are now de-duplicated during pull-imports.