.aspect/workflows/config.yaml, rosetta run <task>) to Aspect CLI AXL tasks (aspect <task>).
New to Aspect CLI tasks? See Aspect CLI tasks.
What’s changing
The tasks that run your Aspect Workflows CI (build, test, lint, gazelle, delivery, and the rest) are rebuilt as Aspect CLI tasks written in AXL (the Aspect Extension Language). They replace the Rosetta task runner and are generally available.
Rosetta task behavior is built into the Workflows CI runners, so a fix or feature arrives with an infrastructure upgrade. AXL tasks ship inside the Aspect CLI, pinned per repository in .aspect/version.axl, so a fix or feature arrives with a one-line version() bump in your repository, on every developer machine and CI runner at once.
What else you get
- New status checks. Per-task status checks on the commit, including a lint status check with the lint findings and a delivery status check with the delivery results. The PR/MR task-summary comment (
GithubStatusComments/GitlabStatusComments) replaces the legacy comment. - Clearer CLI output. Named phases for multi-phase tasks like
lintanddelivery, and a timing summary at the end of each run. - Faster selective delivery. Change detection reads each target’s action digest from the remote cache instead of downloading its artifacts to hash them locally.
- Extension points in AXL:
- Custom tasks: define your own
aspect <task>commands alongside the built-ins. - Listen for build events: subscribe your AXL code to Bazel’s Build Event Stream and act on events as they arrive.
- Customizable tips: surface your own tips in the terminal, status checks, and PR comments.
- Customizable repro & fix suggestions: accept, reject, or rewrite the repro/fix commands tasks emit (e.g. point them at your team’s wrapper).
- Customizable delivery manifest: enrich, render, and act on the per-target delivery manifest.
- Custom tasks: define your own
- Less CI YAML. The Workflows Environment setup and Agent Health Check steps fold into each
aspect <task>invocation.
What the migration looks like
- It’s repository-side. In most cases no infrastructure changes are needed, only configuration files in your repo.
- It goes one task at a time. Flip
linttoaspect lintwhilebuildandteststay onrosetta run. Many teams start withgazelleordelivery(see the recommended migration path). - It’s testable first. Run the new task as a non-blocking step and compare it with your current setup before switching over.
- An AI coding assistant can do most of it. Point one at these migration docs and let it make the bulk of the changes.
Per-task guides
Each task has a dedicated migration guide covering the flag mapping,config.axl configuration, and CI YAML.
Breaking changes
.aspect/workflows/bazelrc isn’t loaded by AXL tasks
Move those flags into your workspace .bazelrc under a named config group:
.bazelrc
--bazelrc= applied to every invocation; build:ci is inherited by test, run, coverage, info, cquery, aquery and fetch, but not by bazel query — and tasks run sidecar queries to resolve targets. A build-only flag like --remote_download_minimal belongs in build:ci; anything a query also needs (--keep_going, --repository_cache, --registry, --repo_env) belongs in common:ci, or it is silently lost on the query.
Then activate --config=ci automatically on CI runners via .aspect/config.axl:
.aspect/config.axl
--config=ci for all AXL tasks on any runner where the CI environment variable is set (all major CI providers set it by default). Because .aspect/config.axl is evaluated for both CI and local invocations, CI-only flags stay isolated from developer machines without needing a separate file.
checkout task
The legacy Rosetta checkout task ran a branch-freshness check after CI’s source checkout: it fetched the target branch, computed the merge base, and posted a build annotation telling the developer how to rebase or merge when their branch was stale (update_strategy: rebase or merge).
There’s no Aspect CLI equivalent and we don’t plan to add one. Source checkout (fetch depth, ref selection, submodules) is owned by your CI platform’s checkout action, and the rebase/merge behavior the legacy task provided is either built in or a few lines of CI YAML:
- GitHub Actions:
actions/checkout@v6already checks out the synthetic merge ref for PR events (refs/pull/<n>/merge), which is the PR head pre-rebased onto the target.update_strategy: rebasewas a no-op here. - Other CI hosts (Buildkite, GitLab, CircleCI): customize your checkout step to fetch the target branch and rebase (or merge) before the rest of the build runs.
Requirements
Aspect CLI v2026.41.24 or newer, running on Aspect Workflows 5.17.31 or later. The CLI has feature parity with the legacy Rosetta task runner: every Rosetta task has anaspect <task> equivalent except checkout.
Pin the CLI version in your repo’s .aspect/version.axl:
Authentication
Features that post to GitHub (GithubStatusChecks, GithubLintComments) authenticate via the Aspect Workflows GitHub App. If your migration enables either, authenticate the CLI once before the first task migrates. It’s a per-repo setup, not per-task. ArtifactUpload, where used, authenticates against your CI platform’s native artifact API; see the per-task migration guide for setup.
Recommended migration path
Aspect Workflows ships with Setup Aspect Workflows, an integration that generates the CI configuration and invokes Rosetta tasks for you. We recommend a two-step migration:- Eject from Setup Aspect Workflows. Invoke
rosetta run <task>directly from your own CI config. Task behavior is identical to what the generated config did, so this step decouples the “where CI lives” change from the “what CI runs” change and de-risks the migration. - Swap
rosettaforaspect. Replace eachrosetta run <task>call with the correspondingaspect <task>command. Per-task migration guides above cover the flag mapping. While you’re there, you can also drop the boilerplate that previously wrapped eachrosetta run <task>call: the Workflows Environment setup and Agent Health Check steps are now self-contained inside theaspect <task>invocation and no longer need to be declared in your CI config.
rosetta directly today, skip straight to step 2.
Top-level workspaces
Skip this section unless your legacy
.aspect/workflows/config.yaml had a top-level workspaces: list.workspaces: list ran every task once per directory it named, supporting both single-workspace and multi-workspace repos. There is no equivalent in the Aspect CLI: aspect <task> runs from the current working directory, so the choice of workspace moves into your CI config. To run a task in a sub-directory, cd first; to cover multiple workspaces, declare a separate CI step per directory.
Before: .aspect/workflows/config.yaml:
cd-ing first. Example with aspect test on Buildkite:
--task:name per workspace isn’t strictly required, but it’s recommended: features like GithubStatusChecks surface the task name in their output, so distinct names make it easy to tell which run came from which workspace.
Migration support
Aspect Workflows customers with a shared customer Slack channel get direct support for the migration there; the team is already in the loop on your environment. Join the Aspect Community Slack, Aspect’s free community support. Ask in#help for general support. Join the discussion and see what others are building with the Aspect CLI and Aspect Extension Language (AXL) in the #cli and #axl channels.
For Bazel and the Bazel rulesets, Bazel Slack is the best place for support and discussion. Ask about Aspect’s rules_js in #javascript and rules_py in #python.
We can pair-debug a stuck step, review your CI YAML before you flip a task over, or check a config.axl.
