feat(bazelrc): config groups, deployment sections, and a flag catalog with opt-outs - #1442
Conversation
|
Important Review skippedAuto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the ⚙️ Run configurationConfiguration used: Organization UI Review profile: CHILL Plan: Advanced Run ID: You can disable this status message by setting the Use the checkbox below for a quick retry:
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
Aspect Workflows Tasks📅 Wed Sep 16 04:25:29 UTC 2026 Task Results
Reproduce❌ delivery (delivery-uncacheable · delivery-gha-debug · delivery-gha)Install ⏱ Last updated Wed Sep 16 04:31:47 UTC 2026 · 📊 GitHub API quota 419/7,700 (5% used, resets in 53m) |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 99b291a2d5
ℹ️ About Codex in GitHub
Codex has been enabled to automatically review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
When you sign up for Codex through ChatGPT, Codex can also answer questions or update the PR, like "@codex address that feedback".
5db53e2 to
ab240e4
Compare
3bd2c28 to
c32e00e
Compare
79b13fc to
b4b7a45
Compare
|
From Claude: bes_group always appends diagnostics_upload_flags(exec_log_path), and off a runner that path is $TMPDIR/aspect-bazel-/exec.log.zstd — created once during aspect setup bazelrc, written literally into ~/.aspect/bazelrc, which persists: common:aspect-bes --execution_log_compact_file=/var/folders/cx/…/T/aspect-bazel-65a987ac-…/exec.log.zstd Bazel does not create the parent directory. Verified against Bazel 9.2.0: ERROR: Error initializing execution log: /tmp/…/exec.log.zstd (No such file or directory) macOS clears /var/folders/**/T on reboot; systemd-tmpfiles clears /tmp after ~10 days. So bazel build --config=aspect-cloud starts failing some time after setup, with an error that points nowhere near the rc. Separately, the run_id namespacing in temp_exec_log_path's docstring ("concurrent jobs on one machine share that dir") doesn't hold in the rc: the id is the setup run's, so every later build on that machine writes the same file and concurrent builds clobber each other. |
|
Nice catch. Resolved in 4ee534c by making the rc the checkout's rather than the machine's: off a runner |
4ee534c to
51efa25
Compare
…1453) The GitHub-hosted jobs in `ci-workflows.yaml` have no remote cache — the comment on `install-prebuilt-aspect-cli` says as much ("These small runners have no remote-cache access"). They already authenticate to Aspect Cloud, since every job hands `ASPECT_API_TOKEN` to setup-aspect, which pipes it into `aspect auth login --with-api-token`. Only the wiring was missing. `.aspect/config.axl` now defaults `--remote=cache,bes` there, so no job has to pass it. The 11 self-hosted jobs are untouched and keep using the runner's own cache. **The gate.** Three conditions, each guarding a real failure: | Condition | Guards | |---|---| | `GITHUB_ACTIONS` | other CI hosts and dev machines stay untouched | | not `ASPECT_WORKFLOWS_RUNNER` | a Workflows runner injects its own cache/BES; Aspect Cloud would route builds off its own services | | `ASPECT_HAS_API_TOKEN` | a fork PR gets no secrets, and the credential helper exits non-zero for a host it cannot authenticate — every hosted job on every fork PR would go red | That last one reads a `"true"`/`"false"` the workflow computes with `secrets.ASPECT_API_TOKEN != ''`. The token itself stays out of the job env on purpose: setup-aspect keeps it out of `GITHUB_ENV` so only the short-lived JWT is visible downstream, and an `ASPECT_API_TOKEN` in the environment outranks that stored credential on every invocation. **Auth goes through the credential helper.** `--credential_helper=cache.aspect.build=aspect` resolves the CLI by name on `PATH`, where `install-prebuilt-aspect-cli` puts it. The deployment feature suppresses the `--remote_header` it would otherwise inject once a helper covers the host, so the stream never carries two `authorization` values. BES is streamed by the CLI rather than by Bazel, so it keeps resolving its own bearer — the helper covers the cache alone. **Why `.aspect/config.json` is committed.** The helper refuses to send a token to a host no configured deployment owns — a safety property that stops a global helper leaking credentials to a third party. The built-in Aspect Cloud entry ships with no hosts (`aspect_cloud_deployment()` seeds `hosts: Vec::new()`), and only a discovery probe records them. The browser login runs one; `auth login --with-api-token` — the CI path — deliberately skips it (`auth.axl:257`), on the grounds that CI declares its deployment in the repo's own `.aspect/config.json`. So this commits exactly that file, as `aspect auth configure api.aspect.build` generates it. `ASPECT_WORKSPACE` is how the CLI locates it. Without this, `aspect get` returns `{"headers":{}}` and Bazel talks to the cache unauthenticated. **Web UI metadata is set explicitly.** The Workflows feature sets the same flags but keys them on `ASPECT_WORKFLOWS_BES_BACKEND`, a runner-injected variable. A `--remote` build reaches a BES backend by a route that variable knows nothing about, so it arrives with no commit, branch, PR, or link back to the Actions run. `get_build_metadata_flags` is the same call the runner path makes. `--remote_build_event_upload=all` makes BEP-referenced outputs — test logs above all — resolvable as bytestream refs instead of `file://` paths on a runner that no longer exists. Deliberately excluded: `--execution_log_compact_file`, which stays off repo-wide until on-disk redaction lands. ## Relationship to #1442 #1442 does this properly: a generated, committed `.aspect/bazelrc` with `--config=aspect-cloud` sections, the same credential helper spelling, and — the root fix — flags keyed on *"is a BES backend wired"* rather than *"am I on a runner."* **When it lands, the `config.axl` block here should be deleted in favour of `--config=aspect-cloud`.** Its `config.axl` edits are confined to test registration, so this should merge cleanly. Two things #1442 does not address, both worth a look: - **The discovery gap is inherited.** Its committed rc tells Bazel which cache to use, but nothing tells the credential helper the cache is ours, and `profile_for_uri` / `aspect_cloud_deployment()` are unchanged on that branch. The clean fix is in the CLI: `ASPECT_CLOUD_HOSTS` already lists these hostnames as constants; they are just never consulted for host ownership. Seeding the built-in entry from it would need no probe, no committed JSON, and no `ASPECT_WORKSPACE` — here or anywhere else. - **`ASPECT_WORKSPACE` looks unwired.** It is read in exactly one place and set nowhere in the repo, so the repo-level config the CI path relies on is unreachable unless something exports it. This PR exports it from the workflow. ## Known consequences - **Build results split.** Hosted jobs report to `app.aspect.build`; self-hosted keep reporting to `app.silo-aws`. Accepted for now. - **`build-task-ephemeral` / `test-task-ephemeral`** keep their deliberate `--remote_cache=` (an explicit flag outranks the injected one), so their no-remote-cache path is preserved — but they will now stream BES, which they did not before. - Vanilla-`bazel` jobs such as `build_release_artifacts.yaml` are still uncovered; #1442 is the path to those. ## Test plan Verified against a CLI built from this branch, with `HOME` pointed at scratch dirs to simulate a fresh runner: - Gate matrix — local dev, fork PR (`ASPECT_HAS_API_TOKEN=false`), and Workflows runner all get no cache and no helper; GitHub-hosted + token gets `--remote_cache=grpcs://cache.aspect.build`, the helper, and no `--remote_header`. - Credential helper on a fresh `HOME` with the committed config and `ASPECT_WORKSPACE`: returns a bearer for `cache.aspect.build`, and `{"headers":{}}` for a third-party host. Without `ASPECT_WORKSPACE`, no headers — which is the failure this PR fixes. - Metadata: `COMMIT_SHA`, `BRANCH_NAME`, `BUILD_URL`, `REPO_OWNER/NAME/URL`, `CI_HOST`, `VCS`, `RUN_TYPE`, `USER` all present, up from `ASPECT_TASK_NAME`/`ASPECT_TASK_ID` alone. - Bazel accepts every new flag; `aspect format` clean. Not verifiable locally, and the first CI run will settle both: whether the org token's tenant is right (a 401 at token exchange) and whether the org has remote-cache entitlement (a 403 at the cache). Both fail loudly rather than degrading silently. ### Changes are visible to end-users: no 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
17a4453 to
e5ee959
Compare
cffc489 to
1c08f4f
Compare
Follows the pattern from aspect-build/aspect-cli#1442: the endpoints and the tuning they justify are declared once in .aspect/bazelrc, inert until a `--config=aspect-*` names them, and Bazel authenticates by running `aspect get` through a credential helper. Two routes reach it, because this repo builds two ways: - `aspect <task>` in the root workspace, via .aspect/config.axl, which also calls get_build_metadata_flags so the stream arrives with a repo, branch, PR and author instead of the runner's login. - plain `bazel`, via .github/actions/aspect-cloud. Each examples/* tree is its own workspace, so the repo's .bazelrc never reaches it and integration-test's bats fixtures have no command line to extend. The action writes the *user* bazelrc instead, which every bazel process on the runner reads, and emits the same metadata from git and the Actions environment. Both are gated on a token being present, so fork PRs — which get no secrets — build exactly as they did before. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Follows the pattern from aspect-build/aspect-cli#1442: the endpoints and the tuning they justify are declared once in .aspect/bazelrc, inert until a `--config=aspect-*` names them, and Bazel authenticates by running `aspect get` through a credential helper. Two routes reach it, because this repo builds two ways: - `aspect <task>` in the root workspace, via .aspect/config.axl, which also calls get_build_metadata_flags so the stream arrives with a repo, branch, PR and author instead of the runner's login. - plain `bazel`, via .github/actions/aspect-cloud. Each examples/* tree is its own workspace, so the repo's .bazelrc never reaches it and integration-test's bats fixtures have no command line to extend. The action writes the *user* bazelrc instead, which every bazel process on the runner reads, and emits the same metadata from git and the Actions environment. Both are gated on a token being present, so fork PRs — which get no secrets — build exactly as they did before. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Follows the pattern from aspect-build/aspect-cli#1442: the endpoints and the tuning they justify are declared once in .aspect/bazelrc, inert until a `--config=aspect-*` names them, and Bazel authenticates by running `aspect get` through a credential helper. Two routes reach it, because this repo builds two ways: - `aspect <task>` in the root workspace, via .aspect/config.axl, which also calls get_build_metadata_flags so the stream arrives with a repo, branch, PR and author instead of the runner's login. - plain `bazel`, via .github/actions/aspect-cloud. Each examples/* tree is its own workspace, so the repo's .bazelrc never reaches it and integration-test's bats fixtures have no command line to extend. The action writes the *user* bazelrc instead, which every bazel process on the runner reads, and emits the same metadata from git and the Actions environment. Both are gated on a token being present, so fork PRs — which get no secrets — build exactly as they did before. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Follows the pattern from aspect-build/aspect-cli#1442: the endpoints and the tuning they justify are declared once in .aspect/bazelrc, inert until a `--config=aspect-*` names them, and Bazel authenticates by running `aspect get` through a credential helper. Two routes reach it, because this repo builds two ways: - `aspect <task>` in the root workspace, via .aspect/config.axl, which also calls get_build_metadata_flags so the stream arrives with a repo, branch, PR and author instead of the runner's login. - plain `bazel`, via .github/actions/aspect-cloud. Each examples/* tree is its own workspace, so the repo's .bazelrc never reaches it and integration-test's bats fixtures have no command line to extend. The action writes the *user* bazelrc instead, which every bazel process on the runner reads, and emits the same metadata from git and the Actions environment. Both are gated on a token being present, so fork PRs — which get no secrets — build exactly as they did before. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Only the aspect-cli jobs report builds now; every job still reads the cache. The composite action that computed build metadata in bash for vanilla Bazel is gone, and with it ASPECT_HAS_API_TOKEN. Follows aspect-build/aspect-cli#1442 properly this time. `aspect setup bazelrc` generates .aspect/bazelrc, so it is no longer a hand-written imitation of that command's output, and `aspect <task> --remote` wires the cache, BES, credentials and the --build_metadata the Web UI reads from the deployment `aspect auth login` recorded. That is what the previous commit claimed config.axl was doing via get_build_metadata_flags; it was not, and on 2026.25.20 it could not — the public path for it landed in #1442. Hence the CLI bump, applied to every examples/* workspace too, since each pins its own version and the format/lint aspect-cli jobs run there. Two things the upgrade forced: - `--task-key` is now `--task:name`. The old spelling is not rejected, it is forwarded to Bazel, which fails on it. - --remote's BES half only reaches the sinks in `aspect build`/`test` (bazel/invocation.axl passes the trait's bes_backends to collect_bes_sinks; lint.axl and format.axl do not), so lint and format stream nothing. $ASPECT_BES names the backend explicitly, which goes through the path that does attach the login JWT, and is deduped against --remote. Drop it once the CLI wires those tasks. Vanilla Bazel has no --remote, and each examples/* tree is its own workspace the repo's .bazelrc never reaches, so those jobs still go through a ~/.bazelrc — now two try-imports and one gated line that setup-aspect writes, rather than a 94-line action. It names aspect-cloud-cache from .aspect/ci.bazelrc: Aspect Cloud's cache without its BES, borrowing the generated file's groups by name so the tuning stays in step. Kept out of .aspect/bazelrc so regenerating cannot clobber it, and preferred over --omit-bazel-flag because omitting the BES endpoints leaves the aspect-bes tuning group chained and the generated "remote cache + BES" comment contradicting the file. Fork PRs get no secret, so the activation line is withheld (an unauthenticated credential helper is fatal) and --remote resolves to none. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
aspect setup bazelrcwrites a Bazel rc that points vanillabazelcalls at Aspect's services: on an Aspect Workflows runner the runner's own, elsewhere the deploymentsaspect auth statusknows, as opt-in--config=aspect-*sections. Every Bazel flag Aspect sets on the user's behalf — into tasks and into that rc — is declared once, tied to the endpoint that justifies it, and individually opt-out-able.The flag catalog.
private/lib/aspect_flags.axllists every tuning flag Aspect injects, with what it does, why, and what it presumes: a cache, a BES backend, any gRPC channel, or nothing. The Workflows feature (tasks on a runner), the Deployment feature (aspect <task> --remote), andaspect setup bazelrcall select from it, so a flag appears the same way for the same reason wherever it is set, and a runner or deployment with no cache, no BES, or no executor gets none of the flags that presume the missing one.aspect build --remoteandbazel build --config=aspect-<name>therefore run with the same tuning, diagnostics upload, and--build_metadata.Opt-outs, per surface. Tasks:
--bazel-flags:omit=<flag>(repeatable), or once per repo viactx.features[BazelFlags].args.omitinconfig.axl; theBazelFlagsfeature registers it onBazelTrait.injected_flag_filters, which the spawn path applies to everything features inject and never to the user's own flags. The rc:aspect setup bazelrc --omit-bazel-flag=<flag>, orctx.tasks["bazelrc"].args.omit_bazel_flags. Both refuse the protected set — endpoints, credentials,--configchains, runner paths — with the reason. The BES pair is deliberately unprotected: a repository whose own rc routes vanilla builds to another backend keeps it with--omit-bazel-flag=--bes_backend, since Bazel reads the home rc after the workspace rc.The rc's
--configgroups (private/lib/rc_groups.axl). Bazel collects rc sections before expanding any--config, so the rc defines every group and enables the ones that apply withcommon --config=<group>lines at the top;bazel build --announce_rcnames the group each flag came from, and a host can borrow a group by name. Startup options have no--configand stay plain lines.aspect-common--heap_dump_on_oom,--experimental_repository_cache_hardlinksaspect-cacheASPECT_WORKFLOWS_REMOTE_CACHEnames one (with the Workflows cache's specifics on a runner), then the tuning any cache justifiesaspect-besASPECT_WORKFLOWS_BES_BACKENDnames one (with--profileunder the job tmpdir on a runner), then the enrichment and the diagnostics upload switchaspect-exec-log%workspace%/.aspect/generated/exec.log.zstdin a checkout's rc; its own group, besideaspect-bes, so a repository on a thin link can drop this one large upload by removing the lines naming itaspect-github-actions/aspect-circleci/aspect-gitlab--color=yeswhere Bazel's--color=automisdetects (Buildkite gives jobs a PTY and gets no group); only in a machine's own rc, never the checkout's shared oneaspect-runner--repository_cacheaspect-execASPECT_WORKFLOWS_REMOTE_EXECUTOR, chainingaspect-cachewhen there is no cache; never enabled,--config=aspect-execper callTwo shapes, one answer to "which deployment". Where the environment names the deployment — the runner marker, or any
ASPECT_WORKFLOWS_*endpoint — the groups that apply are enabled and no deployment sections are written: a--config=aspect-cloudin a runner's rc would route a vanilla build off the runner's own services. On a runner~/.bazelrcis written whole, and it carries the runner's BES backend so vanillabazelreaches the Web UI like a task does (tasks run with--nohome_rcand stream BES from the CLI, so nothing in the file reaches them). Where the environment is silent, the rc is the checkout's, meant to be committed:<workspace>/.aspect/bazelrc, imported by the workspace.bazelrcthroughtry-import %workspace%/.aspect/bazelrc, which the command adds once at the top of the file under a comment, so the repository's own lines come after and override the recommendations. The file is a starting point the repository then owns — its header says so — and rerunning the command restores the generated version. Nothing in it is one machine's: the credential helper is namedaspect, the CI host's group is left out, and the compact execution log is placed at%workspace%/.aspect/generated/exec.log.zstd— Bazel expands%workspace%in rc values — with.aspect/generated/created by the command as a self-ignoring directory (*and!.gitignore) to commit, so it exists in every checkout (Bazel does not create the log's parent). Nothing is enabled; each deployment section chainsaspect-commonand the tuning groups its endpoints justify. The file is inert until a section is named, so importing it into a developer's rc changes nothing.--config=aspect-cloud--config=aspect-<name>--config=aspect-<name>-execEach section sets
--remote_cache/--bes_backend/--bes_results_url, authenticates through theaspect getcredential helper scoped per distinct host (namedaspect, since a checkout's rc is shared; the command warns whenaspectis not onPATH), and chains its groups. Which actions are published as BEP events and--bes_upload_modeare left to the user. Two deployments landing on one config name is refused with the rename to make. No section names the default deployment: the file is committed and shared, andaspect auth useis one machine's setting. A flag omitted with--omit-bazel-flagis dropped inside its group; a group emptied that way disappears along with the lines that enabled or chained to it.Runner contract additions.
ASPECT_WORKFLOWS_REMOTE_EXECUTORnames an executor; nothing wires it until asked, since remote execution relocates every action:--workflows:remote-exec(orctx.features[Workflows].args.remote_exec) for tasks,--config=aspect-execfor vanillabazel.ASPECT_WORKFLOWS_REMOTE_CACHE_COMPRESSIONsays the cache accepts compressed blobs; unset, the runner forces--noremote_cache_compression(Bazel errors when a repository asks a cache that lacks compression for it), set, compression is left to the repository. A runner image flips it when its cache is upgraded, with no CLI release; the variable and the two flags go away once no Workflows deployment without compression is left.aspect setup bazelrc. The command is useful off CI too, so it lives in a newsetupgroup;aspect ci bazelrc, which the setup-aspect action, Buildkite plugin, CircleCI orb, and GitLab component call, stays as an alias: the same task registered under its old group, with config overrides underctx.tasks["ci/bazelrc"].Layout.
bazelrc.axlis the task flow only. The rc document (rendering, thetry-importplacement) isprivate/lib/bazelrc_file.axl, the groupsprivate/lib/rc_groups.axl, the deployment sections (naming, credential helpers, per-endpoint flags, aliases, collisions)private/lib/deployment_rc.axl, each with its own test suite.The same rule holds for tasks. Where the environment names the deployment — a runner, or
ASPECT_WORKFLOWS_REMOTE_CACHE/BES_BACKENDset by hand — tasks get the runner's flag set (minus its mounts off a runner) and--remoteis refused, since a configured deployment would route the build off the one the machine is on. A customer who wants that combination sees the refusal and can ask.Supporting changes:
ctx.std.process.which(name)resolves an executable alongPATHthe way a shell does (the rc warns when it does not findaspect). A task-injected flag may name its rc section,(flag, version, "build"), and the bazelrc runtime then withholds it fromqueryand its kin the way an rc file'sbuildline is; the execution log uses this, being an execution option (aspect cache diffqueries with the task's rc).ctx.aspect.auth.deployments()lists deployments from config alone, never the credential store, withbuiltin/default/api_token_envonDeploymentEndpoints.--build_metadatais set only where a BES backend reads it. The runner identity (ASPECT_WORKFLOWS_RUNNER_IDENTITY, thex-identityheaders) is removed; runners do not set it.--bes_results_urlis paired with Bazel's own backend only, so a task whose Bazel uploads to a third-party BES while the CLI streams to Aspect no longer gets Aspect's viewer injected into Bazel. Tasks no longer pass--build_event_publish_all_actions: the BEP consumers read only failed actions, which Bazel publishes by default, and per-action data comes from the compact execution log. The diagnostics upload (--remote_build_event_upload=all, the compact execution log) is on wherever a BES backend is wired; theASPECT_WORKFLOWS_RUNNER_UPLOAD_BUILD_DIAGNOSTICS/--workflows:upload-build-diagnosticsopt-in is removed, since no runner set the variable.Changes are visible to end-users: yes
Searched for relevant documentation and updated as needed: no
Breaking change (forces users to change their own code or config): no
Suggested release notes appear below: yes
aspect ci bazelrcis nowaspect setup bazelrc; the old name remains as an alias for the CI integrations. Config overrides targetctx.tasks["setup/bazelrc"].aspect setup bazelrcwrites--config=aspect-cloud,--config=aspect-<deployment>, and--config=aspect-<deployment>-execsections for every deploymentaspect auth statusknows, so vanillabazelcalls on any CI can use Aspect's remote cache and BES.Off an Aspect Workflows runner,
aspect setup bazelrcwrites the checkout's.aspect/bazelrcas a starting point to edit and commit (a rerun restores it), addstry-import %workspace%/.aspect/bazelrcat the top of the workspace.bazelrcso the repository's own lines override it, and creates a self-ignoring.aspect/generated/for build-time outputs; commit all three. The imported rc changes nothing until a--config=aspect-*is named.Every flag in the generated rc sits in a named
--configgroup (aspect-common,aspect-cache,aspect-bes,aspect-<ci host>,aspect-runner,aspect-exec), sobazel build --announce_rcnames the group each flag came from and a group can be borrowed by name.On a Workflows runner,
aspect setup bazelrcwrites the runner's BES backend into~/.bazelrcso vanillabazelcalls appear in the Web UI; a repository that routes vanilla builds elsewhere opts out with--omit-bazel-flag=--bes_backend.--bazel-flags:omit=<flag>(orctx.features[BazelFlags].args.omitinconfig.axl) drops a Bazel flag Aspect would otherwise set on a task's Bazel call;aspect setup bazelrc --omit-bazel-flag=<flag>(orctx.tasks["bazelrc"].args.omit_bazel_flags) does the same for the written rc. Endpoints, credentials, and runner paths cannot be dropped.aspect <task> --remotesets the same cache/BES tuning, diagnostics upload, and--build_metadataas the rc's--config=aspect-*sections. It is refused on an Aspect Workflows runner, or wherever theASPECT_WORKFLOWS_*endpoint variables are set, since the environment already names the deployment those builds use.Aspect's tuning flags are set only where the endpoint they tune is wired; the profile flags (
--noslim_profile,--experimental_profile_include_*,--legacy_important_outputs) join them wherever a BES backend is.A runner that sets
ASPECT_WORKFLOWS_REMOTE_EXECUTORoffers remote execution on request:--workflows:remote-execfor tasks,--config=aspect-execfor vanillabazel.A runner that sets
ASPECT_WORKFLOWS_REMOTE_CACHE_COMPRESSIONno longer has--noremote_cache_compressionforced on its builds; compression is left to the repository.The JSON profile and compact execution log are uploaded to the BES backend wherever one is wired; the
--workflows:upload-build-diagnosticsopt-in is removed.Tasks no longer pass
--build_event_publish_all_actionsto Bazel, shrinking the BES stream; failed actions are still published by Bazel's default.Test plan
aspect dev test-aspect-flags,test-bazelrc-file,test-rc-groups,test-deployment-rc; new cases intest-deployment-flagsand the BES sinks suite;deployment_endpoints_come_from_config_aloneinauth.rs.HOMEpointed at a scratch dir holding a copy of~/.aspect/config.json:ASPECT_WORKFLOWS_RUNNER=1plus the runner variables writes~/.bazelrcwhole with the groups enabled and no sections;GITHUB_ACTIONS=true aspect setup bazelrcin a checkout writes.aspect/bazelrcwith nothing enabled and the sections, addstry-import %workspace%/.aspect/bazelrcto the workspace.bazelrc, and reports it unchanged on a second run;bazel build --nobuild --config=aspect-besfrom a subdirectory writes the execution log into.aspect/generated/;--omit-bazel-flag=--heap_dump_on_oom --omit-bazel-flag=--experimental_repository_cache_hardlinksdrops theaspect-commongroup and its chains,--omit-bazel-flag=--remote_cacheis refused.bazel --nohome_rc --nosystem_rc version --announce_rcreads the import through%workspace%and applies nothing from the deployment-shaped rc alone; with--config=aspect-cloudit expands each chained group with no warnings; the runner-shaped rc shows every enabled group, and--config=aspect-execexpands cleanly.🤖 Generated with Claude Code