Skip to main content
This guide is for Aspect Workflows customers moving from Rosetta, the Workflows 5.x task runner (.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 lint and delivery, 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:
  • Less CI YAML. The Workflows Environment setup and Agent Health Check steps fold into each aspect <task> invocation.
Status check and PR-summary templates, and Bazel output filtering, can be customized.
Rosetta YAML-configured tasks get no new features, and support is being removed:
  • Workflows 6.0.0: the legacy PR comments that the Aspect Workflows GitHub App posted for Rosetta tasks are removed. Rosetta tasks themselves are still supported.
  • Workflows 7.0.0: Rosetta tasks are removed.

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 lint to aspect lint while build and test stay on rosetta run. Many teams start with gazelle or delivery (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

Rosetta automatically passed —bazelrc=.aspect/workflows/bazelrc to every Bazel invocation when that file existed. AXL tasks don’t do this. If you have CI-only Bazel flags in .aspect/workflows/bazelrc, they will be silently ignored after you migrate.
Move those flags into your workspace .bazelrc under a named config group:
.bazelrc
Mind which section a flag goes in. Rosetta’s --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
This activates --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@v6 already 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: rebase was 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 an aspect <task> equivalent except checkout. Pin the CLI version in your repo’s .aspect/version.axl:
See version pinning for the full set of source options (local builds, custom registries, etc.).

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. 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:
  1. 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.
  2. Swap rosetta for aspect. Replace each rosetta run <task> call with the corresponding aspect <task> command. Per-task migration guides above cover the flag mapping. While you’re there, you can also drop the boilerplate that previously wrapped each rosetta run <task> call: the Workflows Environment setup and Agent Health Check steps are now self-contained inside the aspect <task> invocation and no longer need to be declared in your CI config.
If you already invoke 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.
Rosetta’s top-level 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:
After: write one CI step per workspace, cd-ing first. Example with aspect test on Buildkite:
The pattern applies to every task and CI provider. A unique --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.