)]}'
{
  "log": [
    {
      "commit": "e984ebfcfa7e84f08955e4266f4a746c0c9f5d3e",
      "tree": "fd0146ef52117975544f565f5cbddc608620ec38",
      "parents": [
        "6f2720540ebe85c7f1a670ec4999a897de07b759"
      ],
      "author": {
        "name": "Googler",
        "email": "noreply@google.com",
        "time": "Thu Oct 29 05:56:44 2026 -0700"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Thu Oct 29 05:58:18 2026 -0700"
      },
      "message": "Obsolete stale action execution state when input discovery state is dropped across a Skyframe restart.\n\nWhen an input-discovering action fails with lost inputs and needs a Skyframe restart to prepare its rewind plan, its `InputDiscoveryState` can be evicted from the compute state cache across the restart while its previous execution state remains registered. Resuming that stale execution state without rediscovering inputs leaves `additionalInputs` null and crashes during action or lost-input handling.\n\nPiperOrigin-RevId: 1009627419\nChange-Id: I163b6552f1e4a4f7cf6f04dbce398638a24409dc\n"
    },
    {
      "commit": "6f2720540ebe85c7f1a670ec4999a897de07b759",
      "tree": "213a490b75f867a64f60370b6459b4d327561bec",
      "parents": [
        "c9779964bddd85b6173b508ed963cc1ae0a07413"
      ],
      "author": {
        "name": "David Zbarsky",
        "email": "dzbarsky@gmail.com",
        "time": "Thu Oct 29 05:12:40 2026 -0700"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Thu Oct 29 05:14:55 2026 -0700"
      },
      "message": "Skip remote directory uploads with non-UTF-8 path bytes (#32168)\n\nPOSIX repositories can contain different filenames whose invalid UTF-8 bytes decode to the same replacement character. `UploadManifest.DirectoryBuilder` currently serializes both names into one REAPI directory entry; it can also silently change a symlink target with invalid UTF-8 bytes. A repository restored from that remote cache result no longer matches the original fetch.\n\nCheck directory entry names and serialized symlink targets before building the REAPI `Tree`. `RemoteRepoContentsCacheImpl` already handles upload failures by keeping the fetched repository. Rotate only the remote repository cache GUID: old lossy results cannot be distinguished from genuine names containing U+FFFD, so existing remote repository cache entries will have a one-time cold fetch. Valid UTF-8, including U+FFFD, remains cacheable.\n\nAdds a Linux regression for colliding filenames, a malformed symlink target and the valid U+FFFD control. Verified the Python test parses, the generated shell fixture passes `sh -n`, and `git diff --check` passes.\n\nCloses #32168\n\nCOPYBARA_INTEGRATE_REVIEW\u003dhttps://github.com/bazelbuild/bazel/pull/32168 from dzbarsky:codex/upstream-177-nonutf8-dir-upload 02578d48b408ffd92aeff31b8274a4c29b24f362\nPiperOrigin-RevId: 1009608474\nChange-Id: I31859742d8927d7725ab5192af6b4c43aff7545e\n"
    },
    {
      "commit": "c9779964bddd85b6173b508ed963cc1ae0a07413",
      "tree": "81ac2372a2dcfa89cef8c17899ded22cce95b381",
      "parents": [
        "d79858980aeac1cd9592adacaef3f63d0a62aa0c"
      ],
      "author": {
        "name": "Fabian Meumertzheim",
        "email": "fabian@meumertzhe.im",
        "time": "Thu Oct 29 02:57:20 2026 -0700"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Thu Oct 29 02:59:30 2026 -0700"
      },
      "message": "Make `equals` of Skyframe values cover the data consumers read (#31964)\n\n### Description\n\nFixes `equals` of several Skyframe values to also compare data that consumers read:\n\n* `InterimModule`: the order of `bazel_dep`s, which determines the order of `module_ctx.modules` and of toolchain and execution platform registration.\n* `AttributeValues`: the order of dict entries and set elements and the distinction between ints and floats, which module extensions and repo rules can observe (e.g. `remote_patches` order, tag dict attributes, `1.0` passed to an `attr.int()` tag attribute).\n* `--registry` and `--module_mirrors`: now passed on as ordered lists since the first registry that contains a module wins and mirrors are tried in order.\n* `BuildConfigurationValue`: the CPU of the target platform, which `$(TARGET_CPU)` reads.\n* `PlatformMappingValue`: the order of `flags:` entries since the first matching entry wins.\n* `TargetPatternPhaseValue`: the labels used to find `PROJECT.scl` files. Its value is currently never change-pruned since it is stored together with events.\n\n### Motivation\n\nSkyframe keeps the old value object when a recomputed value is equal to it, so until the server restarts, consumers keep seeing data that `equals` ignores. In all but the last case above, this made incremental builds behave differently from clean ones, e.g. swapping two `bazel_dep` lines or two `--registry` flags had no effect until `bazel shutdown`.\n\nSame class of bug as #31952.\n\n### Build API Changes\n\nNo\n\n### Release Notes\n\nRELNOTES: None\n\nCloses #31964\n\nCOPYBARA_INTEGRATE_REVIEW\u003dhttps://github.com/bazelbuild/bazel/pull/31964 from fmeum:change-pruning-order-fixes 1d93e2f1adb1be5d11dbfe0ef9cde24fda8a6688\nPiperOrigin-RevId: 1009547528\nChange-Id: I91a801061a3be7427277283548767a5d1da6143a\n"
    },
    {
      "commit": "d79858980aeac1cd9592adacaef3f63d0a62aa0c",
      "tree": "3078013db2a280636008e86fe1bc1c28f3fb8d19",
      "parents": [
        "beb40084a54fb0c552f226cef1b65233b4b28a84"
      ],
      "author": {
        "name": "Googler",
        "email": "noreply@google.com",
        "time": "Wed Oct 28 21:33:12 2026 -0700"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Wed Oct 28 21:40:03 2026 -0700"
      },
      "message": "Automated rollback of commit faaccc1c186fda5ab15c32be5c2f325df4847e57.\n\n*** Reason for rollback ***\n\nPure rollback\n\n*** Original change description ***\n\nStarlarkify _cc_internal.create_cc_compile_action_template().\n\nReplace _cc_internal.create_cc_compile_action_template() with ctx.actions.map_directory() and _cc_internal.create_cc_compile_action().\n\nPiperOrigin-RevId: 1009396286\nChange-Id: Ia4b29745b13fee7ef9b6cba079af989e8bad3ddb\n"
    },
    {
      "commit": "beb40084a54fb0c552f226cef1b65233b4b28a84",
      "tree": "25a0467a10c0ef690b326adbd875909b96266dc4",
      "parents": [
        "9d8d5d08f08d64a0d5cb25262e37d2d07db24fda"
      ],
      "author": {
        "name": "arostovtsev",
        "email": "arostovtsev@google.com",
        "time": "Wed Oct 28 15:48:06 2026 -0700"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Wed Oct 28 15:49:49 2026 -0700"
      },
      "message": "Enable Starlark static type checking by default\n\n... and simplify flag constant for dynamic type checking.\n\nWorking towards #27370\n\nRELNOTES: --experimental_starlark_static_type_checking is enabled by default\nPiperOrigin-RevId: 1009229449\nChange-Id: I2f534b87468a69c76c04032aadc162214acfbd96\n"
    },
    {
      "commit": "9d8d5d08f08d64a0d5cb25262e37d2d07db24fda",
      "tree": "f51b885cbf28069cbc6ea222b2bd120abbadb9a8",
      "parents": [
        "45959e65e3ab67baa0e1ab55eabbcb8e601153e2"
      ],
      "author": {
        "name": "Fabian Meumertzheim",
        "email": "fabian@buildbuddy.io",
        "time": "Wed Oct 28 13:25:43 2026 -0700"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Wed Oct 28 13:28:32 2026 -0700"
      },
      "message": "Expand param files in the execution log with --expand_param_files (#31808)\n\n### Description\n`--expand_param_files` now also applies to the arguments recorded by `--execution_log_{compact,binary,json}_file`. Spawns are still executed with param files and the execution log still records the param files as inputs, so input digests are unaffected.\n\n### Motivation\nThis makes it possible to analyze full command lines from the execution log, e.g. to estimate the effect of path mapping across configurations.\n\n### Build API Changes\n\nNo\n\n### Checklist\n\n- [x] I have added tests for the new use cases (if any).\n- [ ] I have updated the documentation (if applicable).\n\n### Release Notes\n\nRELNOTES: `--expand_param_files` now also expands the arguments persisted in the execution log.\n\nCloses #31808\n\nCOPYBARA_INTEGRATE_REVIEW\u003dhttps://github.com/bazelbuild/bazel/pull/31808 from fmeum:execution-log-expand-param-files d1bd91cae5ff7eb54c451f5a274b35befaaf3208\nPiperOrigin-RevId: 1009134630\nChange-Id: I3c577693fa2c554171f71ed22e63f9a3b4e16603\n"
    },
    {
      "commit": "45959e65e3ab67baa0e1ab55eabbcb8e601153e2",
      "tree": "a51ddbd703e2e1888e924a0a34ab418b745714cd",
      "parents": [
        "156b5ac772d118d1ef68639cdb809cc87b5d913d"
      ],
      "author": {
        "name": "arostovtsev",
        "email": "arostovtsev@google.com",
        "time": "Wed Oct 28 12:55:14 2026 -0700"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Wed Oct 28 12:56:24 2026 -0700"
      },
      "message": "Specify the target array type when copying functionTypes in TypeTable.\n\nUnbreaks serialization of StarlarkFunction when type checking is enabled.\n\nFollow-up to https://github.com/bazelbuild/bazel/commit/178308eeb67d92d7387ad114177aed659e75c781\n\nWorking towards #27370\n\nPiperOrigin-RevId: 1009114011\nChange-Id: I02bd2bed7415756aaba07c51d90d999102c35d96\n"
    },
    {
      "commit": "156b5ac772d118d1ef68639cdb809cc87b5d913d",
      "tree": "6da3c0d5db0ee914f24286b043eb53183a235e09",
      "parents": [
        "25b9794d895caba0212f7eda30d7b4de3eb04e23"
      ],
      "author": {
        "name": "Fabian Meumertzheim",
        "email": "fabian@meumertzhe.im",
        "time": "Wed Oct 28 12:19:51 2026 -0700"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Wed Oct 28 12:20:54 2026 -0700"
      },
      "message": "Use `rctx.copy` for `http_archive`\u0027s `files` and `build_file` (#32193)\n\n### Description\n\nThe `files` attribute of `http_archive` (and thus also of `archive_override`) now overlays files and directories with `repository_ctx.copy` instead of `repository_ctx.symlink`. Copies are created as copy-on-write clones where supported, and a copied directory is watched as a tree, so changes to the files in it still cause a refetch. Overlaid files are always executable, matching `remote_file_urls`.\n\nThe `build_file` of `http_archive` and `git_repository` is now also copied instead of being read into memory and written back.\n\n### Motivation\n\nThe repo contents cache can\u0027t store symlinks that point out of a repo, so a single `files` entry referring to the main repo silently kept an otherwise reproducible repo out of the cache.\n\nFixes #31434\n\n### Build API Changes\n\nNo\n### Release Notes\n\nRELNOTES[INC]: The `files` of `http_archive` and `archive_override` are now copied instead of symlinked, which allows the repo contents cache to store these repos. The `symlink_files` method in `@bazel_tools//tools/build_defs/repo:utils.bzl` has been removed.\n\nCloses #32193\n\nCOPYBARA_INTEGRATE_REVIEW\u003dhttps://github.com/bazelbuild/bazel/pull/32193 from fmeum:http-archive-files-copy a700042825802e689479c1acfed5fd07d8a53f92\nPiperOrigin-RevId: 1009091699\nChange-Id: Ifbe377f7feb0e5326a90cc2ff142bcafa90c0ce2\n"
    },
    {
      "commit": "25b9794d895caba0212f7eda30d7b4de3eb04e23",
      "tree": "64dd5ad336b78cefa3427576c44daaf154cdde68",
      "parents": [
        "882d59adaafe47a9393cd5a5b2927cb4ffa50310"
      ],
      "author": {
        "name": "lberki",
        "email": "lberki@google.com",
        "time": "Wed Oct 28 11:52:59 2026 -0700"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Wed Oct 28 11:54:27 2026 -0700"
      },
      "message": "Deduplicate MergedConfiguredTarget instances across dependency edges.\n\n`AbstractConfiguredTarget` overrides `hashCode()` based on target label and configuration key so that `ConfiguredTarget` instances placed in Starlark dicts have deterministic hash codes, while leaving `equals()` as reference equality (`Object.equals`). Because `MergedConfiguredTarget` is created freshly for every incoming dependency edge during aspect propagation, placing aspect-decorated dependencies into a Starlark `depset` or `dict` fails to deduplicate across edges and causes all incoming edges for the same target to collide in the same hash bucket during `depset.to_list()`.\n\nOverriding `equals()` on `MergedConfiguredTarget` to compare the underlying base target and attached aspects (while retaining `AbstractConfiguredTarget`\u0027s deterministic `hashCode()`) allows Starlark `depset`s and `dict`s to deduplicate aspect-decorated targets across edges in O(1) time without regressing hash determinism.\n\nRELNOTES: None.\nPiperOrigin-RevId: 1009072109\nChange-Id: Ied88e64c4a508fe1b53cff851acec4c6280d3019\n"
    },
    {
      "commit": "882d59adaafe47a9393cd5a5b2927cb4ffa50310",
      "tree": "bb372cbd0ba8a1080bb7b7ccc13f4ed94e63e7a5",
      "parents": [
        "4ba17872971a1ec0470b2dba0ed8a77c4b2dfa94"
      ],
      "author": {
        "name": "jhorvitz",
        "email": "jhorvitz@google.com",
        "time": "Wed Oct 28 11:14:59 2026 -0700"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Wed Oct 28 11:17:09 2026 -0700"
      },
      "message": "Compute `REMOTE_EXECUTION_INLINE_OUTPUTS` on demand in `EnhancedStarlarkAction`.\n\nAn `unused_inputs_list` file has its content inlined so blaze can read it. The file is different for every action, so adding its path to the execution info map up front defeats interning. Instead, add it on demand when `getExecutionInfo` is called.\n\nPiperOrigin-RevId: 1009044759\nChange-Id: I7774b59e872538d0a88d035a877a4e1be28c8d03\n"
    },
    {
      "commit": "4ba17872971a1ec0470b2dba0ed8a77c4b2dfa94",
      "tree": "d676f13cd84d85f4685e50baf0ed01b8d2516066",
      "parents": [
        "8a1fc7d99e353a9bc7882e53c4c0d43ee200fd55"
      ],
      "author": {
        "name": "jhorvitz",
        "email": "jhorvitz@google.com",
        "time": "Wed Oct 28 10:28:48 2026 -0700"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Wed Oct 28 10:29:51 2026 -0700"
      },
      "message": "Extract an interned `SpawnAttributes` record in `SpawnAction` for shared action attributes.\n\nGroups 4 fields of `SpawnAction` (`resourceSetOrBuilder`, `env`, `sortedExecutionInfo`, `mnemonic`) into an interned `SpawnAttributes` record. These four are frequently the same across many actions.\n\nTo preserve deterministic serialization, ensure that `ActionEnvironment` is interned on deserialization (this is good regardless) and memoize `ResourceSet` with `MemoizationEquality#BY_VALUE`.\n\nPiperOrigin-RevId: 1009011694\nChange-Id: I5cc244e025f173412ff047261bae600f397f275d\n"
    },
    {
      "commit": "8a1fc7d99e353a9bc7882e53c4c0d43ee200fd55",
      "tree": "286e88ac1f03a3474d2cc1cd2e6a6cebd8d861f7",
      "parents": [
        "5486627a3f7efb75be86ba186345dc3841d1c0d9"
      ],
      "author": {
        "name": "twerth",
        "email": "twerth@google.com",
        "time": "Wed Oct 28 09:52:57 2026 -0700"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Wed Oct 28 09:57:06 2026 -0700"
      },
      "message": "Avoid redundant entry clearing in CompactHashSet.clear()\n\nIn CompactHashSet, table entries beyond size are always unset by invariant,\nso clearing the full entries array unconditionally zeroes unallocated or\nalready-cleared slots. Adding an early return for empty sets and zeroing\nonly the occupied range (0..size) avoids unnecessary memory sweeps.\n\nPiperOrigin-RevId: 1008985602\nChange-Id: Ice519c00b308a948f97eed665f7bc3cc9a68b9ee\n"
    },
    {
      "commit": "5486627a3f7efb75be86ba186345dc3841d1c0d9",
      "tree": "af7387dc322bc9876381fd6a5a9a1d8f65333f8d",
      "parents": [
        "5066d4c00f0019aff0070cf5c64a8c9f3f71a4c6"
      ],
      "author": {
        "name": "jhorvitz",
        "email": "jhorvitz@google.com",
        "time": "Wed Oct 28 09:52:15 2026 -0700"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Wed Oct 28 09:53:57 2026 -0700"
      },
      "message": "Derive `OutputPathsMode` from `ActionOwner` instead of storing it as a `SpawnAction` field.\n\n`OutputPathsMode` comes directly from `BuildConfigurationValue`, which the `ActionOwner` has access to. Dropping the field saves 8 bytes per instance for common classes like `StarlarkAction`.\n\nPiperOrigin-RevId: 1008985142\nChange-Id: Icae7d85fc4c80b3271cc25ecd7c4c987acc90d87\n"
    },
    {
      "commit": "5066d4c00f0019aff0070cf5c64a8c9f3f71a4c6",
      "tree": "956fc7c1274269cf427c49ab27a0c7f3b0e5df40",
      "parents": [
        "a087d8d930023ea748fbe31d399fc8ec4ae06e35"
      ],
      "author": {
        "name": "twerth",
        "email": "twerth@google.com",
        "time": "Wed Oct 28 09:18:52 2026 -0700"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Wed Oct 28 09:21:00 2026 -0700"
      },
      "message": "Record MurmurHash3 public domain license notice in Bazel LICENSE.\n\n`CompactHashSet.java` incorporates an intermediate step from MurmurHash3 with a public domain dedication notice. Recording this notice in `third_party/bazel/LICENSE` ensures compliance with package license inventories and satisfies `ComplianceLint:AllLicensesRecorded`.\n\nPiperOrigin-RevId: 1008962515\nChange-Id: I4730a1d069be9e15eb070a51762e9ffef6c216a5\n"
    },
    {
      "commit": "a087d8d930023ea748fbe31d399fc8ec4ae06e35",
      "tree": "c23c7fc11184c35e0cfe7ab14ee24c656eb37a12",
      "parents": [
        "c5a0d4f439bf192dfaa49ac8f3b933e28c4f9078"
      ],
      "author": {
        "name": "Joseph Gette",
        "email": "joseph.gette@datadoghq.com",
        "time": "Wed Oct 28 09:02:56 2026 -0700"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Wed Oct 28 09:05:00 2026 -0700"
      },
      "message": "Report spawn runner and cache hit in BEP ActionExecuted events (#31811)\n\n### Description\n\n`ActionExecuted.strategy_details` is documented as carrying `SpawnExec`, but nothing populates it. This PR adds one `SpawnExec` per spawn with only two fields set: `runner` (e.g. `local`, `worker`, `remote`, `disk cache hit`, `remote cache hit`) and `cache_hit`.\n\nWith `--build_event_publish_all_actions`, an action served from the disk cache now looks like this:\n\n```json\n\"action\": {\n  \"type\": \"Genrule\",\n  \"startTime\": \"2026-10-16T09:31:17.227611Z\",\n  \"endTime\": \"2026-10-16T09:31:18.693611Z\",\n  \"strategyDetails\": [{\n    \"@type\": \"type.googleapis.com/tools.protos.SpawnExec\",\n    \"runner\": \"disk cache hit\",\n    \"cacheHit\": true\n  }]\n}\n```\n\nAn executed action reports `\"runner\": \"local\"` and omits `cacheHit`.\n\n### Motivation\n\nBEP consumers can\u0027t tell whether an action was executed or served from a cache. `TestResult` has `cached_locally` and `execution_info.cached_remotely`, but `ActionExecuted` has no equivalent.\n\nThis matters for timing. On a cache hit, `start_time` and `end_time` are taken from the cached result, so they describe the original execution, not the current build. For example, in a local build against a remote cache populated by CI, every cache hit reported the start and end time of the CI execution a day earlier; a `GoStdlib` action appeared as a 44-second run, although the build only downloaded its outputs. Consumers that turn these events into traces or timing dashboards can\u0027t distinguish such actions from ones that actually ran.\n\n#26211 asked for the full `SpawnExec` here and was closed because it would be too heavy for the BEP and would duplicate the execution log. This PR only fills `runner` and `cache_hit`, which adds a few dozen bytes per reported action, and only for actions that are already reported (failed actions, or all actions with `--build_event_publish_all_actions`). Everything else stays in the execution log.\n\nFixes #31810\n\n### Build API Changes\n\nNo. This populates an existing BEP field; the proto is unchanged.\n\n### Checklist\n\n- [x] I have added tests for the new use cases (if any).\n- [ ] I have updated the documentation (if applicable).\n\n### Release Notes\n\nRELNOTES[NEW]: [`ActionExecuted`](https://bazel.build/remote/bep-glossary#actionexecuted) events now report the runner of each spawn and whether it was a cache hit in `strategy_details`.\n\nCloses #31811\n\nCOPYBARA_INTEGRATE_REVIEW\u003dhttps://github.com/bazelbuild/bazel/pull/31811 from JSGette:bep-action-strategy-details 101a8deafb680672b3761541ef997f37f3bba1cb\nPiperOrigin-RevId: 1008951847\nChange-Id: I55085d0587e1ceaea9e4369e4993d3bf296b0f7e\n"
    },
    {
      "commit": "c5a0d4f439bf192dfaa49ac8f3b933e28c4f9078",
      "tree": "b62fc0fe9091cfa994dd8d806562e317833ca5fe",
      "parents": [
        "fd7af9ef10d795f930255a73fb77dd99630595c4"
      ],
      "author": {
        "name": "twerth",
        "email": "twerth@google.com",
        "time": "Wed Oct 28 08:50:34 2026 -0700"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Wed Oct 28 08:52:05 2026 -0700"
      },
      "message": "Multiplex pending reverse dep operations into IncrementalInMemoryNodeEntry.reverseDeps.\n\nUnder `-XX:+UseCompactObjectHeaders` (8-byte object header), `IncrementalInMemoryNodeEntry` has 7 compressed-OOP fields (28 bytes) and 36 bytes total before alignment, padding each instance to 40 bytes (and `IncrementalSkybuildNodeEntry` to 48 bytes). Because `reverseDepsDataToConsolidate` is null on done nodes in steady state, multiplexing pending reverse dep operations into `reverseDeps` (using a marker `ArrayList` subclass when prior `reverseDeps` is empty, or a small record wrapper when incremental reverse deps already exist) removes the dedicated reference field and shrinks every `IncrementalInMemoryNodeEntry` and `IncrementalSkybuildNodeEntry` instance by 8 bytes.\n\nPiperOrigin-RevId: 1008943753\nChange-Id: I94c6c48e2a1c2eddadb17082431428ba20f6dd89\n"
    },
    {
      "commit": "fd7af9ef10d795f930255a73fb77dd99630595c4",
      "tree": "17d31a63a66d41568ab303d25ab6b17e2a03c35a",
      "parents": [
        "20ee051fb143246057e8afa1a61f3350d80a0d5d"
      ],
      "author": {
        "name": "Dmitry Spikhalsky",
        "email": "dmitry@spikhalskiy.com",
        "time": "Wed Oct 28 08:48:20 2026 -0700"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Wed Oct 28 08:49:30 2026 -0700"
      },
      "message": "Fail when `--experimental_use_hermetic_linux_sandbox` is set but `linux-sandbox` is unsupported (#32164)\n\n### Description\n\nOn Linux, `SandboxModule` now fails the command if `--experimental_use_hermetic_linux_sandbox` is set and `linux-sandbox` does not pass its support check. The error includes the reason the check failed, which now carries the `linux-sandbox` stderr instead of discarding it.\n\n### Motivation\n\nFixes #32161.\n\nWhen the `linux-sandbox` check fails (for example, without user namespaces), `sandboxed` resolves to `processwrapper-sandbox` and the hermetic flag is silently ignored. Actions then see the host filesystem and the build still succeeds. We hit this as a build tool loading the host\u0027s `libstdc++` instead of the one we provide. This mirrors `--experimental_use_windows_sandbox\u003dyes`, which already fails when `windows-sandbox` is unavailable.\n\nA machine that sets the flag but cannot run `linux-sandbox` will now fail instead of silently degrading. Those users can drop the flag.\n\n### Build API Changes\n\nNo\n\n### Checklist\n\n- [x] I have added tests for the new use cases (if any).\n- [x] I have updated the documentation (if applicable).\n\n### Release Notes\n\nRELNOTES: `--experimental_use_hermetic_linux_sandbox` now fails the build on Linux when `linux-sandbox` is not supported, instead of silently falling back to `processwrapper-sandbox`; making it consistent with experimental_use_windows_sandbox.\n\nCloses #32164\n\nCOPYBARA_INTEGRATE_REVIEW\u003dhttps://github.com/bazelbuild/bazel/pull/32164 from Spikhalskiy:hermetic-sandbox-fail-closed 4c9feb3589893f55c3632f26ccd47bb3eb254bc1\nPiperOrigin-RevId: 1008942158\nChange-Id: I73343a045ba963157b72f4854e692bccfaeb3463\n"
    },
    {
      "commit": "20ee051fb143246057e8afa1a61f3350d80a0d5d",
      "tree": "dff69d68e65866f14bd321e26c2182735ba7c325",
      "parents": [
        "a182fc466d249693b01f1bb17acf79cf5667cda9"
      ],
      "author": {
        "name": "arostovtsev",
        "email": "arostovtsev@google.com",
        "time": "Wed Oct 28 08:01:54 2026 -0700"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Wed Oct 28 08:03:39 2026 -0700"
      },
      "message": "Support -XX:+UseCompactObjectHeaders in ShallowObjectSizeComputer.\n\n`-XX:+UseCompactObjectHeaders` (available in JDK 24+ and enabled by default starting in JDK 27) shrinks the HotSpot object header to 8 bytes; see https://docs.oracle.com/en/java/javase/25/gctuning/other-considerations.html.\n\nWhen compact object headers are disabled, object header size is determined by whether or not class pointers are compressed; it\u0027s 12 bytes when class pointer compression is enabled, 16 bytes otherwise. Class pointer compression is always enabled in JDK 27 (JDK-8350754) on 64-bit platforms; and is controlled by `-XX:+UseCompressedClassPointers` on earlier JDKs.\n\n(Note that `ShallowObjectSizeComputer` until now assumed that class pointer compression is controlled by `-XX:+UseCompressedOops`, but this was a mistake; `UseCompressedClassPointers` and `UseCompressedOops` have been independent since since JDK 15 (JDK-8241825).)\n\nIn HotSpot, an array header consists of the object header followed by the 4-byte `int` array length, thus adding up to 12 bytes with compact object headers, 16 bytes with compressed class pointers, or 20 bytes without. 8-byte array elements (long, double, uncompressed references) are always stored starting at an 8 byte aligned offset after the array header. However, 1-, 2-, and 4-byte array elements are packed immediately after the array header since JDK 23 (JDK-8139457).\n\nThe effect is that on JDK \u003c 23 we can regard the array header as always rounded up to 8 bytes; while on JDK 23+, we don\u0027t round up, but need to consider the array element size to find the offset.\n\nTL;DR: we want want to derive `ShallowObjectSizeComputer.Layout`\u0027s `objectHeaderBytes` from `UseCompactObjectHeaders` and `UseCompressedClassPointers`; compute `arrayHeaderBytes` as `objectHeaderBytes + Integer.BYTES` on JDK 23+, or rounded up to 8 bytes on earlier JDKs; and in `getArraySize()` align 8-byte elements at an 8-byte offset to get the correct behavior for all flag and JDK version combinations.\n\nAlso, take the opportunity to expand `ShallowObjectSizeComputerTest` to cover more array sizes, and improve the assertion messages for the failing tests in it. We didn\u0027t notice the array packing miscalculation only because until now, we had no tests for odd-size arrays.\n\nPiperOrigin-RevId: 1008912748\nChange-Id: I1203e00c5448428729f5c2079bdbe049d0229d7e\n"
    },
    {
      "commit": "a182fc466d249693b01f1bb17acf79cf5667cda9",
      "tree": "b661519b7a040fb4ea24ee0b608e6d3f780ef44f",
      "parents": [
        "b5359a408d3c4ce237fec8147415812d3712deeb"
      ],
      "author": {
        "name": "shahan",
        "email": "shahan@google.com",
        "time": "Wed Oct 28 07:48:40 2026 -0700"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Wed Oct 28 07:50:09 2026 -0700"
      },
      "message": "Migrate ImmutableListCodec off of Unsafe.\n\nImmutableListCodec still registers the list before deserializing its elements,\nto support cycles, but no longer uses Unsafe.allocateInstance or\nUnsafe.putObject.\n\n* Lists with two or more elements are created by calling the package-private\n  RegularImmutableList constructor through a MethodHandle obtained with\n  MethodHandles.privateLookupIn. The constructor wraps the given array without\n  copying, so elements are deserialized directly into it. This is possible\n  because Guava is in an unnamed module.\n* Lists with a single element are created with ImmutableList.of(placeholder),\n  and the final SingletonImmutableList.element field is overwritten once the\n  actual element is available, through a MethodHandle from\n  Lookup.unreflectSetter. This is subject to JEP 500 restrictions on final\n  field mutation.\n\nThis also removes one of the remaining callers of the offset-based\nAsyncDeserializationContext.deserialize overload.\n\nPiperOrigin-RevId: 1008904532\nChange-Id: Idfcb147c3889e5df288907b436a372aaa81d7cf9\n"
    },
    {
      "commit": "b5359a408d3c4ce237fec8147415812d3712deeb",
      "tree": "1b3a8fadff2ecfbd9509b22abc3e0a845621ee66",
      "parents": [
        "faaccc1c186fda5ab15c32be5c2f325df4847e57"
      ],
      "author": {
        "name": "Googler",
        "email": "noreply@google.com",
        "time": "Wed Oct 28 07:32:11 2026 -0700"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Wed Oct 28 07:33:40 2026 -0700"
      },
      "message": "Skip locally delegated configured targets during remote analysis cache invalidation.\n\nWhen a pre-rule-transition `ConfiguredTargetKey` misses in the remote analysis cache and delegates locally to a post-transition key that hits in the remote analysis cache, the pre-transition node stores the delegate\u0027s `DeserializedSkyValue` instance directly. Excluding locally delegated nodes from `SkyframeExecutor.invalidateWithExternalService()` prevents uncached pre-transition keys from missing on every source file edit and falsely invalidating their reverse dependencies.\n\nPiperOrigin-RevId: 1008894580\nChange-Id: Ic07cf4277bc25ca83210fb41c6fac66c98d070ff\n"
    },
    {
      "commit": "faaccc1c186fda5ab15c32be5c2f325df4847e57",
      "tree": "d89e4bc6408a6582a7e59ce888e13d3629f7761d",
      "parents": [
        "497dc6869ad5921b88b831d6bfc63c30d0bb72f9"
      ],
      "author": {
        "name": "pzembrod",
        "email": "pzembrod@google.com",
        "time": "Wed Oct 28 06:54:35 2026 -0700"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Wed Oct 28 06:56:13 2026 -0700"
      },
      "message": "Starlarkify _cc_internal.create_cc_compile_action_template().\n\nReplace _cc_internal.create_cc_compile_action_template() with ctx.actions.map_directory() and _cc_internal.create_cc_compile_action().\n\nPiperOrigin-RevId: 1008874841\nChange-Id: I4d1ff1831490d465fe49085683b6ebe9de28cbf5\n"
    },
    {
      "commit": "497dc6869ad5921b88b831d6bfc63c30d0bb72f9",
      "tree": "599394d14991ad1fe2132b26bb9cc2fcdc53880b",
      "parents": [
        "4fa6719135650abdd51e554e84274128a2e314af"
      ],
      "author": {
        "name": "lberki",
        "email": "lberki@google.com",
        "time": "Wed Oct 28 05:48:33 2026 -0700"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Wed Oct 28 05:49:48 2026 -0700"
      },
      "message": "Check for null configuration and Skyframe graph in DumpCommand.\n\nBefore a build runs in a server session, `SkyframeBuildView.getBuildConfiguration()` returns `null`, causing `dump --memory` on a configured target without an explicit configuration hash to throw a `NullPointerException` in `DumpCommand.getConfigurationKey()`.\n\nAdd null checks for `getBuildConfiguration()` and `getInMemoryGraph()` in `DumpCommand.getConfigurationKey()`, reporting an error and returning `null` when either is unavailable.\n\nRELNOTES: None.\nPiperOrigin-RevId: 1008841850\nChange-Id: Ic74f1c0bcafa8bcadd085b132ec5dc0de8cc1e26\n"
    },
    {
      "commit": "4fa6719135650abdd51e554e84274128a2e314af",
      "tree": "9c0d1617a987fc81a0a91388a4719c3724b55b30",
      "parents": [
        "078d9ccf948f9e169b6d42471e0aac8214cf2b98"
      ],
      "author": {
        "name": "Googler",
        "email": "noreply@google.com",
        "time": "Wed Oct 28 05:46:30 2026 -0700"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Wed Oct 28 05:47:38 2026 -0700"
      },
      "message": "Increase shard_count of BuildWithoutTheBytesIntegrationTest from 5 to 15.\n\n`BuildWithoutTheBytesIntegrationTest` runs ~212 parameterized test cases (~390 inner Bazel builds) because `useDiskCache` doubles all 115 test methods. With `shard_count \u003d 5`, each shard runs ~42 test cases (~78 inner builds) and hits the 900s `large` timeout on 30-vCPU Windows C3D CI runners (p50 is 505s and p95 is 898s).\n\nIncrease `shard_count` to 15. This reduces the work per shard by 3x to ~14 test cases (~26 inner builds) while using at most half of the 30 local test slots on a Windows CI machine.\n\nPiperOrigin-RevId: 1008840979\nChange-Id: Idc8b082845b73658873743c934d5429c880cc633\n"
    },
    {
      "commit": "078d9ccf948f9e169b6d42471e0aac8214cf2b98",
      "tree": "8dcc37cf6173cbcce267875e644a8cb931f2773f",
      "parents": [
        "459a9147eb30d56fe04f6cd63581dd2af42891ee"
      ],
      "author": {
        "name": "plf",
        "email": "plf@google.com",
        "time": "Wed Oct 28 05:31:55 2026 -0700"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Wed Oct 28 05:33:56 2026 -0700"
      },
      "message": "Move processForOutputPathMnemonic from Fragment to FragmentOptions.\n\nOutputPathMnemonicComputer.computeMnemonic previously required instantiated Fragment objects even though all overrides of processForOutputPathMnemonic only read their corresponding FragmentOptions.\n\nMoving processForOutputPathMnemonic and OutputDirectoriesContext onto FragmentOptions allows OutputPathMnemonicComputer.computeMnemonic to compute the output directory mnemonic directly from BuildOptions and the baseline BuildOptions without constructing Fragment instances (which is needed when deserializing derived artifact roots from the remote analysis cache).\n\nRELNOTES:none\nPiperOrigin-RevId: 1008834421\nChange-Id: I994df29832d031ca0043154386a982a8fc524705\n"
    },
    {
      "commit": "459a9147eb30d56fe04f6cd63581dd2af42891ee",
      "tree": "270b435da13ec01750b7aeca795652300b98949f",
      "parents": [
        "3e18cd53b614c1b3172209055f15b2ca2ce5058c"
      ],
      "author": {
        "name": "Cy Cheng",
        "email": "cypersonal6@gmail.com",
        "time": "Wed Oct 28 04:42:33 2026 -0700"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Wed Oct 28 04:44:05 2026 -0700"
      },
      "message": "Fix the documentation of `repository_rule(local \u003d ...)` (#31823)\n\n### Description\n\nRewrites the `doc` of the `local` parameter of `repository_rule`. The old text said a local repo \"should be reevaluated at every fetch\". The new text says what Bazel actually does:\n\n- A local repo is refetched on the usual triggers (a change to the rule definition, its attributes, or a file it reads), plus after every Bazel server restart, because its contents are never reused from a previous server or from the repo contents cache (`shouldUseCachedRepoContents` in `RepositoryFetchFunction`).\n- It is not refetched on every build.\n- It is excluded from `bazel vendor` by default (`isRepoExcludedFromVendoringByDefault`).\n\n### Motivation\n\n\"Every fetch\" reads as \"every build\", which is why #16217 was filed as a bug. The answer there was that this is working as intended and that local repo rules are additionally rerun at every server restart. This PR puts that explanation into the reference docs.\n\nFixes #28497\n\n### Build API Changes\n\nNo\n\n### Checklist\n\n- [ ] I have added tests for the new use cases (if any).\n- [x] I have updated the documentation (if applicable).\n\n### Release Notes\n\nRELNOTES: None\n\nCloses #31823\n\nCOPYBARA_INTEGRATE_REVIEW\u003dhttps://github.com/bazelbuild/bazel/pull/31823 from cycancode:fix-repository-rule-local-doc dd56b854747e525bcdf63cf10f524d7a27ffbd04\nPiperOrigin-RevId: 1008812672\nChange-Id: Icb7775ab74292c19dbfa860cce93df01614b65ba\n"
    },
    {
      "commit": "3e18cd53b614c1b3172209055f15b2ca2ce5058c",
      "tree": "5e51ec55d4181aaad541c1efb79162fc89d626ec",
      "parents": [
        "90cc2b89d2f571d1478ec24304d881c1e12cb552"
      ],
      "author": {
        "name": "alex-the-third",
        "email": "139810351+alex-the-third@users.noreply.github.com",
        "time": "Wed Oct 28 03:47:08 2026 -0700"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Wed Oct 28 03:48:31 2026 -0700"
      },
      "message": "Fix action output handle leak on build/action cancellation (#32058)\n\n### Description\n\nClose the action execution context when execution throws `InterruptedException`. If closing also throws `IOException`, retain it as a suppressed exception on the original interruption.\n\n### Motivation\n\nAn interrupted action can leave its output streams open in the long-lived Bazel server. On Windows, a subsequent command using the same server can then fail to delete the action output directory with exit 36. Closing the streams during cancellation removes the dependency on garbage collection to release those handles.\n\nFixes #32050.\n\n### Build API Changes\n\nNo.\n\n### Checklist\n\n- [x] ~I have added tests for the new use cases.~ Can add some tests if wished, but risk of regression is very low imo.\n- [x] Documentation changes are not needed for this cleanup fix.\n\n### Release Notes\n\nRELNOTES: None\n\nCloses #32058\n\nCOPYBARA_INTEGRATE_REVIEW\u003dhttps://github.com/bazelbuild/bazel/pull/32058 from alex-the-third:fix/close-action-context-on-interruption d718505720a1cbd447b025db68b9c17e25a0a222\nPiperOrigin-RevId: 1008787258\nChange-Id: I687ab83ad4619b8a59e4bb98550193c32c0a0f00\n"
    },
    {
      "commit": "90cc2b89d2f571d1478ec24304d881c1e12cb552",
      "tree": "b2fb12b72686199ba3e14489a4393dbd01609810",
      "parents": [
        "416be716e63c5584d58898fcf910763039a1de9f"
      ],
      "author": {
        "name": "David Zbarsky",
        "email": "dzbarsky@gmail.com",
        "time": "Wed Oct 28 03:15:05 2026 -0700"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Wed Oct 28 03:16:23 2026 -0700"
      },
      "message": "Avoid retaining commands in credential helpers (#32107)\n\nCredential helpers created in `BazelRepositoryModule.beforeCommand` and `RemoteModule.setup` can outlive their command through cached completion events. Capture the final immutable client environment map instead of `CommandEnvironment` so completed commands, including their analyzed targets, can be collected. The build event service continues to read its current environment for credential rotation.\n\nIn a large build this results in ~2GB less retained memory after reanalysis.\n\n@fmeum\n\nCloses #32107\n\nCOPYBARA_INTEGRATE_REVIEW\u003dhttps://github.com/bazelbuild/bazel/pull/32107 from dzbarsky:dzbarsky/upstream-bazel-162 d6abd4553c0f16c75430e4d0b53cd517ba3a954f\nPiperOrigin-RevId: 1008772430\nChange-Id: I7b1058389139c4ace9e00419c8026c265e1a8e4f\n"
    },
    {
      "commit": "416be716e63c5584d58898fcf910763039a1de9f",
      "tree": "c78b0144438f1f2a6fea6c9fdcb70a6995fe369c",
      "parents": [
        "b7a7fa1b357ad8813b0d2bac64f76e9152126e8a"
      ],
      "author": {
        "name": "jingwen",
        "email": "jingwen@google.com",
        "time": "Tue Oct 27 23:34:39 2026 -0700"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Tue Oct 27 23:35:41 2026 -0700"
      },
      "message": "Delete unused `PathFragmentPrefixTrie`.\n\nWith active directories matching removed from remote analysis caching frontier\nserialization, `PathFragmentPrefixTrie` is no longer used in production code.\nUpdate `ProjectFunctionTest` to assert directly on `ProjectValue` directory\ncollections and remove `PathFragmentPrefixTrie` and its test.\n\nPiperOrigin-RevId: 1008664610\nChange-Id: I4a816ecee85f67d04c02dc6444ae22e4c2524b8d\n"
    },
    {
      "commit": "b7a7fa1b357ad8813b0d2bac64f76e9152126e8a",
      "tree": "cbafd45cf5d8d362d0fc6c029603e50b597ede1d",
      "parents": [
        "18bfeaeacbd9d6552958e75392d9568a0763c029"
      ],
      "author": {
        "name": "shahan",
        "email": "shahan@google.com",
        "time": "Tue Oct 27 22:54:12 2026 -0700"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Tue Oct 27 22:55:27 2026 -0700"
      },
      "message": "Fix swapped VerificationFunction parameters in ArrayListCodecTest.\n\nSerializationTester.VerificationFunction is called with (original,\ndeserialized), but the lambdas named them the other way around. As a result,\nthe identity checks in selfReferentialList_preservesIdentity and\nelementsCompletingAsynchronously_roundTrip were checking the original list\ninstead of the deserialized one.\n\nAlso checks that hashCode reflects elements that were set after the list was\nconstructed.\n\nPiperOrigin-RevId: 1008646562\nChange-Id: I5fec408ae6cfbe69e274dd4f6a48bc141e4c78c0\n"
    },
    {
      "commit": "18bfeaeacbd9d6552958e75392d9568a0763c029",
      "tree": "394a94e12ba55ded8d0eb1f89fa70815880bdc4f",
      "parents": [
        "3f6a814801391ab76c8b7858a954ead3fb184fce"
      ],
      "author": {
        "name": "David Zbarsky",
        "email": "dzbarsky@gmail.com",
        "time": "Tue Oct 27 22:24:31 2026 -0700"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Tue Oct 27 22:25:40 2026 -0700"
      },
      "message": "Collect configuration keys by index (#31367)\n\nStore `BuildConfigurationKeyMapProducer` child results in a `BuildConfigurationKey[]` indexed by input order, replacing the temporary `HashMap`. Children can finish out of order while the final immutable map preserves input order and key/value associations. Missing child results preserve the existing error handling; `createKeys_preservesOrder` now checks each key\u0027s associated options.\n\nIn a large build, mean Java allocation fell by 2.57 GB (0.33%) across four runs per version.\n\nCloses #31367\n\nCOPYBARA_INTEGRATE_REVIEW\u003dhttps://github.com/bazelbuild/bazel/pull/31367 from dzbarsky:codex/pr81-configuration-results-upstream 806fd778cbbd028fcee76da167f6ab923aa5d512\nPiperOrigin-RevId: 1008632653\nChange-Id: Ic55af0787e3c10c1bd7b6d4a8465d856ef7f910b\n"
    },
    {
      "commit": "3f6a814801391ab76c8b7858a954ead3fb184fce",
      "tree": "ede64c8df65e0fb01b5c41206a1d0c4397a0498c",
      "parents": [
        "296d9892e34f2e7e30833f04f140aaa3c7771983"
      ],
      "author": {
        "name": "David Zbarsky",
        "email": "dzbarsky@gmail.com",
        "time": "Tue Oct 27 21:56:30 2026 -0700"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Tue Oct 27 21:57:53 2026 -0700"
      },
      "message": "Avoid quadratic Starlark set subtraction (#32068)\n\nStarlarkSet removes each sequence element by hash lookup when the receiver has more than eight elements. The operation validates mutation before removing elements, preserves iteration order and retains the existing behavior for Set, RangeList and small sets. It avoids ArrayList.contains on every receiver element.\n\nIn the original 30,000-source fixture, reanalysis fell from 3.545 to 0.422 s and subtraction from 3.097 s to 2.30 ms. Original Starlark EvalTests and both ScriptTest variants passed 462 cases. The complete patch matches the original and git diff --check passes upstream.\n\n@fmeum\n\nCloses #32068\n\nCOPYBARA_INTEGRATE_REVIEW\u003dhttps://github.com/bazelbuild/bazel/pull/32068 from dzbarsky:dzbarsky/upstream-bazel-147 99b8aa10c3bca8b6ec9a309532901e3a6ca0cd68\nPiperOrigin-RevId: 1008619538\nChange-Id: I915d635ed262ec234ee5b3c3570ca2744e230685\n"
    },
    {
      "commit": "296d9892e34f2e7e30833f04f140aaa3c7771983",
      "tree": "1f0ab6d009cdf1803ee6d61b233a20cb17c426c2",
      "parents": [
        "8b3d88408b85bd744c37eb3a532248d544528703"
      ],
      "author": {
        "name": "Sarad Pant",
        "email": "saradr.pant@gmail.com",
        "time": "Tue Oct 27 19:49:17 2026 -0700"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Tue Oct 27 19:52:18 2026 -0700"
      },
      "message": "[10.0.0rc1] fix: Format target counts in Found summaries  (#31716)\n\n### Description\n\nUse `StringUtil.formatCount` in the `Found` summaries for builds and tests. Counts of 10,000 or more now include commas, matching other CLI messages.\n\nAdds seven regression tests covering build-only, test-only, and mixed summaries at the formatting boundary. All seven tests and the existing `ProgressReportingTest` pass.\n\n### Motivation\nFixes https://github.com/bazelbuild/bazel/issues/31718\nThese messages were missed in #28922, resulting in inconsistent output:\n\n```text\nINFO: Analyzed 380,363 targets ...\nINFO: Found 380363 targets...\n```\n\nThe second message now reads `Found 380,363 targets...`.\n\nReported in https://github.com/bazelbuild/bazel/pull/28922#issuecomment-6070426661.\n\n### Build API Changes\n\nNo\n\n### Checklist\n\n- [x] I have added tests for the new use cases (if any).\n- [x] I have updated the documentation (if applicable). No documentation changes needed.\n\n### Release Notes\n\nRELNOTES: Target counts of 10,000 or more in the \"Found\" summaries for builds and tests now include comma separators, matching other CLI messages.\n\nCloses #31716\n\nCOPYBARA_INTEGRATE_REVIEW\u003dhttps://github.com/bazelbuild/bazel/pull/31716 from ssarad:master 83dbc3a18607dc7a4a1f1fdd9e233e8c4141e33b\nPiperOrigin-RevId: 1008564110\nChange-Id: I81023909dde0cbdf3ea6cb614dcf549305336cf4\n"
    },
    {
      "commit": "8b3d88408b85bd744c37eb3a532248d544528703",
      "tree": "535c34711d85629ef292e936ed976aa05290faa5",
      "parents": [
        "d895421c42821625328565426b148a4b27262ba0"
      ],
      "author": {
        "name": "arostovtsev",
        "email": "arostovtsev@google.com",
        "time": "Tue Oct 27 19:10:55 2026 -0700"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Tue Oct 27 19:12:28 2026 -0700"
      },
      "message": "Prevent stack overflow in `Starlark.getStarlarkType` on self-referential values\n\nThe tricky part is that we want to propagate the `StackOverflowError` when `Starlark.getStarlarkType` is invoked recursively through a container type\u0027s `getStarlarkType`, so that we can catch it at the outermost layer. Otherwise, we\u0027d get a useless and expensive nested doll type with N-1 layers (where N would cause stack overflow).\n\nIdeally, we want the type to be the \"Any-version\" of the outermost layer. Currently this works for types that are supported by `CallUtils.getStarlarkBuiltinAutoType`, e.g. Bazel\u0027s `struct`. Fixing it for basic container types (`list`, `dict`) would require a small bit of follow-up work (bundled into the native provider type support).\n\nWorking towards #27370\n\nPiperOrigin-RevId: 1008546836\nChange-Id: I415d0ce0da4bf716bc2da95d03ec6b4a4a9eb124\n"
    },
    {
      "commit": "d895421c42821625328565426b148a4b27262ba0",
      "tree": "8207ec956981b4263ce083225956d2f2e564b78d",
      "parents": [
        "ecb89d3cf2e09bd9d04d09b280fe3d649833b12a"
      ],
      "author": {
        "name": "shahan",
        "email": "shahan@google.com",
        "time": "Tue Oct 27 16:43:42 2026 -0700"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Tue Oct 27 16:44:58 2026 -0700"
      },
      "message": "Delete the offset-based AsyncDeserializationContext.deserialize overload with a done callback.\n\nAll callers were migrated to deserializeArrayElement with a done callback by\nthe MapHelpers, HashSetCodec and EnumMapCodec changes.\n\nPiperOrigin-RevId: 1008466406\nChange-Id: I80de67b9f958e86590249414f35742b509b4c255\n"
    },
    {
      "commit": "ecb89d3cf2e09bd9d04d09b280fe3d649833b12a",
      "tree": "27a08d114dad7b14ca8fa4b7249e0d04b5344e64",
      "parents": [
        "3e6acfe739e63b236f898e628f35bd65a4d5accd"
      ],
      "author": {
        "name": "David Zbarsky",
        "email": "dzbarsky@gmail.com",
        "time": "Tue Oct 27 16:32:51 2026 -0700"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Tue Oct 27 16:34:35 2026 -0700"
      },
      "message": "Pre-size the deletion visitor’s visited set (#32071)\n\nDeletingNodeVisitor sizes its concurrent visited set from pendingVisitations at construction. This reduces ConcurrentHashMap resizing while preserving concurrent deletion and interruption behavior.\n\nIn the original 13.6-million-node deletion fixture, cumulative allocation fell by about 250 MiB; wall time was unchanged. Existing eager invalidation tests cover interrupted deletion, reverse dependencies, and processing all pending nodes. The complete patch matches the original and git diff --check passes upstream.\n\n@fmeum\n\nCloses #32071\n\nCOPYBARA_INTEGRATE_REVIEW\u003dhttps://github.com/bazelbuild/bazel/pull/32071 from dzbarsky:dzbarsky/upstream-bazel-142 a46544fc9b7a858d29ba918e765584771e332f8e\nPiperOrigin-RevId: 1008459838\nChange-Id: Ib821d9869f66bebe39f9e599eb4fcfc434030c1f\n"
    },
    {
      "commit": "3e6acfe739e63b236f898e628f35bd65a4d5accd",
      "tree": "dcdabbcb44a6424111b0f01cd89138465bb5af17",
      "parents": [
        "603cacf174645bc2b214d97d04f3609164828f7f"
      ],
      "author": {
        "name": "shahan",
        "email": "shahan@google.com",
        "time": "Tue Oct 27 15:49:19 2026 -0700"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Tue Oct 27 15:50:56 2026 -0700"
      },
      "message": "Read EnumMap.keyType in EnumMapCodec with a VarHandle instead of Unsafe.\n\nThe VarHandle is obtained with MethodHandles.privateLookupIn on EnumMap, which\nrequires java.base/java.util to be opened. (Lookup.unreflectVarHandle doesn\u0027t\nwork here because it performs access checks regardless of\nField.setAccessible.) The serialization library already declares that open for\nArrayListCodec.\n\nWith this change, EnumMapCodec no longer uses Unsafe.\n\nPiperOrigin-RevId: 1008432047\nChange-Id: I4e55b793fb5027285088882f4c4d260ce4a34973\n"
    },
    {
      "commit": "603cacf174645bc2b214d97d04f3609164828f7f",
      "tree": "9c9faa0602b53ba455404f3d0096ed4d5f4fa824",
      "parents": [
        "88888ad0a7fd238bd6dd06a54d30d58c5021dd6d"
      ],
      "author": {
        "name": "shahan",
        "email": "shahan@google.com",
        "time": "Tue Oct 27 15:19:15 2026 -0700"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Tue Oct 27 15:21:07 2026 -0700"
      },
      "message": "Migrate the EnumMapCodec value path off of offset-based AsyncDeserializationContext.deserialize.\n\nValues are now buffered using deserializeArrayElement with a done callback\ninstead of the offset-based overload with a done callback.\n\nPiperOrigin-RevId: 1008413439\nChange-Id: I9dea60cf7c7f150c555457239967f94897a3503c\n"
    },
    {
      "commit": "88888ad0a7fd238bd6dd06a54d30d58c5021dd6d",
      "tree": "6f3348e179a6898acf902fc8e12336ce775f6f2f",
      "parents": [
        "6d77b16421866a197326df6af26f8724f71c3d2c"
      ],
      "author": {
        "name": "shahan",
        "email": "shahan@google.com",
        "time": "Tue Oct 27 14:49:01 2026 -0700"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Tue Oct 27 14:51:35 2026 -0700"
      },
      "message": "Set comparators in ImmutableSortedSetCodec and ImmutableMapCodecs with FieldSetters.\n\nBoth codecs used the offset-based AsyncDeserializationContext.deserialize\noverload, with Unsafe field offsets, to set a comparator on their own buffer\nclasses. They now use non-capturing FieldSetter lambdas instead, which removes\ntheir Unsafe field offset lookups.\n\nPiperOrigin-RevId: 1008393046\nChange-Id: If8843f3d2fdde6b1dd3add63493b9e302a6ae56f\n"
    },
    {
      "commit": "6d77b16421866a197326df6af26f8724f71c3d2c",
      "tree": "354fe3e6432096d1e6c2f4969804e0d99914920e",
      "parents": [
        "ba93eb71c345eaca1ce3408fe81254fab4bb9702"
      ],
      "author": {
        "name": "arostovtsev",
        "email": "arostovtsev@google.com",
        "time": "Tue Oct 27 14:48:43 2026 -0700"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Tue Oct 27 14:49:42 2026 -0700"
      },
      "message": "Compact `GeneralCallableType` and omit all-`Any` parameter type lists\n\nReduce the retained memory footprint of `Types.GeneralCallableType` instances:\n- Replace the per-callable `ImmutableSet\u003cString\u003e mandatoryParameters` field with an interned `MandatoryParamIndices` bitset indexed by parameter position.\n- Don\u0027t waste memory on all-`Any` parameter type lists (which are the common case: in untyped code, all parameters are `Any`) in `GeneralCallableType`. This means removing `getParameterTypes()` from `Types.CallableType` and adding `getNumNonResidualParameters()`. In `GeneralCallableType`, represent an all- `Any` parameter type list as a `null` value of `getParameterTypesIfNonAny()`.\n- Reuse `Resolver.Function#getParameterNames()` in `TypeTagger#createFunctionType` instead of allocating a duplicate `ImmutableList\u003cString\u003e`.\n\nContinuing to work towards minimizing the memory impact of enabling static type checking by default.\n\nWorking towards #27370\n\nPiperOrigin-RevId: 1008392861\nChange-Id: I364dae86de74fb61a2e88a20aa988df1190d549c\n"
    },
    {
      "commit": "ba93eb71c345eaca1ce3408fe81254fab4bb9702",
      "tree": "5f99ba8fd38728f0dad27e51e3e0d639f7319128",
      "parents": [
        "eeba844ad82197e3ac799fb52fb877166513c63a"
      ],
      "author": {
        "name": "Fabian Meumertzheim",
        "email": "fabian@meumertzhe.im",
        "time": "Tue Oct 27 14:22:58 2026 -0700"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Tue Oct 27 14:24:22 2026 -0700"
      },
      "message": "Add `{rctx,mctx}.copy`  (#31461)\n\n### Description\nAdds `copy(src, dst, executable \u003d True, watch_src \u003d \"auto\")` to `repository_ctx` and `module_ctx`, which copies a file or directory. Where supported, the copy uses reflinks. An existing file or symlink at `dst` is replaced, but a directory at `dst` is an error. The copy is always writable so that later steps such as patching can modify it. Its executable bit is determined by `executable` rather than by the source, so watching the contents of the source suffices to keep the copy up to date. The source is watched by default and a `CopyEvent` is added to the workspace log.\n\nA directory is copied as if each file in it were copied individually: symlinks are followed so that the copy doesn\u0027t contain any, existing files below `dst` are overwritten and all other files below `dst` are kept (as with `extract`). The directory is watched in the same way as by `watch_tree`, which also follows symlinks. To make only some of the files executable, the directory can be copied with `executable \u003d False` before the executable files are copied individually. Symlinks or files at `dst` or at a directory to be created below it, symlink cycles, dangling symlinks and overlapping `src` and `dst` are errors.\n\nContrary to `symlink`, `copy` is also available on `module_ctx`: it watches the source in the same way on all platforms and thus doesn\u0027t result in platform-specific lockfiles.\n\n### Motivation\nSymlinks are often used as \"cheap copies\", but result in an *enormous* amount of complexity in Bazel, in particular in persistent caches (such as the repo contents caches), in-memory file system overlays (RAFS and REOFS) and cross-platform (Windows). Now that reflink support is widely available, offering a simple alternative that is not a leaky abstraction can help avoid some of this complexity in the common case.\n\nWork towards #31434\nWork towards #31456\n\n### Build API Changes\n\nYes, it adds a new method.\n\n### Release Notes\n\nRELNOTES[NEW]: The new `copy` method on `repository_ctx` and `module_ctx` copies a file or directory, using OS and file system optimizations such as reflinks if available.\n\nCloses #31461\n\nCOPYBARA_INTEGRATE_REVIEW\u003dhttps://github.com/bazelbuild/bazel/pull/31461 from fmeum:rctx-copy 0f575d4cc9daaccf969443e1cb3ad56d4ef8757d\nPiperOrigin-RevId: 1008375787\nChange-Id: Ib3bcba764a3e68311fa43473a7c853e2cb64e33f\n"
    },
    {
      "commit": "eeba844ad82197e3ac799fb52fb877166513c63a",
      "tree": "ae559b4b976686ed383590cc29f6a6a8bd6171ff",
      "parents": [
        "1224606c0b051ae16905ffe09489773715607119"
      ],
      "author": {
        "name": "tedx",
        "email": "tedx@google.com",
        "time": "Tue Oct 27 14:20:36 2026 -0700"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Tue Oct 27 14:22:09 2026 -0700"
      },
      "message": "Normalize hostnames to lowercase in `UrlRewriter`\n\n`java.net.URI` preserves the original casing of the hostname component, whereas DNS hostnames are case-insensitive. Lowercase `allow` and `block` hostnames in `UrlRewriterConfig` at parse time, and lowercase the candidate URL\u0027s hostname during `allow`/`block` matching and `rewrite` rule evaluation in `UrlRewriter`.\n\nPiperOrigin-RevId: 1008374132\nChange-Id: If333a11942f4c882646251245e0dc519fb55f08d\n"
    },
    {
      "commit": "1224606c0b051ae16905ffe09489773715607119",
      "tree": "a5e6b0d3e0e243ba516265a3088235c0dc313756",
      "parents": [
        "4d07ea27dee4393b5df9945434d81e567b720860"
      ],
      "author": {
        "name": "tedx",
        "email": "tedx@google.com",
        "time": "Tue Oct 27 14:14:36 2026 -0700"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Tue Oct 27 14:15:47 2026 -0700"
      },
      "message": "Verify symlink containment in PatchUtil.getFilePath()\n\nPatchUtil.getFilePath() previously relied on a lexical containment check (Path.startsWith) that did not resolve symbolic links on disk. If a repository contained directory symlinks pointing outside the repository root, applying a patch could follow those symlinks outside the output directory.\n\nThis change updates PatchUtil.getFilePath() to resolve any symlink ancestors of the target file path and verify that they remain contained within the resolved output directory.\n\nPiperOrigin-RevId: 1008369822\nChange-Id: I2733849371d94b8c89aa1c0d512e852df545607b\n"
    },
    {
      "commit": "4d07ea27dee4393b5df9945434d81e567b720860",
      "tree": "11e5162a328ed8c445323ac1bc0a7914e7827312",
      "parents": [
        "1bd333b6e1d86a30998ca4e83d5878b34cc64a60"
      ],
      "author": {
        "name": "shahan",
        "email": "shahan@google.com",
        "time": "Tue Oct 27 14:11:47 2026 -0700"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Tue Oct 27 14:13:25 2026 -0700"
      },
      "message": "Migrate HashSetCodec off of offset-based AsyncDeserializationContext.deserialize.\n\nElements are now buffered using deserializeArrayElement with a done callback\ninstead of the offset-based overload with a done callback.\n\nPiperOrigin-RevId: 1008367651\nChange-Id: I2f4130799607e3f662d5a891c7b44ed1ea4426c2\n"
    },
    {
      "commit": "1bd333b6e1d86a30998ca4e83d5878b34cc64a60",
      "tree": "b9ac4f44f859d22b63152eb38642828216933b0d",
      "parents": [
        "19e27739add4a0bb5a63cc89bead257b7819ff1f"
      ],
      "author": {
        "name": "David Zbarsky",
        "email": "dzbarsky@gmail.com",
        "time": "Tue Oct 27 13:24:26 2026 -0700"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Tue Oct 27 13:26:05 2026 -0700"
      },
      "message": "Avoid redundant filesystem checks when creating runfiles (#31924)\n\n### Description\n\nSymlinkTreeHelper resolves fileset parent/child conflicts in memory, with children taking precedence. Existing runfiles directories are checked without following symlinks; missing entries and replacements are created directly, without rereading newly created directories. Consecutive entries with the same parent reuse the previous Directory.\n\n### Motivation\n\nRunfiles creation otherwise repeats readlink, mkdir, and readdir calls for entries known to be missing.\n\nLinux x86-64, ext4, 32 vCPUs, JDK 25.0.1; 688 runfiles trees with 173,948 symlinks and 711 empty files (65,362 links in the largest tree). Each configuration used two output bases, two warmups and three measured clean/build cycles per output base, with a warm disk cache. All link targets and empty files were checked after each build.\n\n| Seconds, median [min, max] | Baseline | This change |\n|---|---:|---:|\n| Sum of runfiles tree durations | 33.807 [29.176, 53.896] | 24.652 [19.856, 28.609] |\n| Union of runfiles tree intervals | 13.645 [11.817, 14.824] | 9.563 [8.525, 12.179] |\n| Largest tree | 10.517 [8.472, 12.668] | 7.205 [6.231, 7.978] |\n| Whole build | 49.135 [46.326, 54.508] | 46.851 [46.229, 53.612] |\n| Clean + build | 70.938 [68.716, 77.626] | 67.908 [65.380, 78.979] |\n\nSummed runfiles time fell 27.1%. The sum includes concurrent trees; the union counts overlapping intervals once. Whole-build and clean/build ranges overlap, so these results do not establish a whole-build speedup.\n\n### Build API Changes\n\nNo\n\n### Checklist\n\n- [x] I have added tests for the new use cases (both fileset insertion orders, file and directory targets, repeated updates, and a symlinked tree root).\n- [x] I have updated the documentation (not applicable).\n\nValidation: `bazel test //src/test/java/com/google/devtools/build/lib/exec:ExecTests --test_filter\u003dSymlinkTreeHelperTest` (16 tests passed).\n\n### Release Notes\n\nRELNOTES: None\n\nCloses #31924\n\nCOPYBARA_INTEGRATE_REVIEW\u003dhttps://github.com/bazelbuild/bazel/pull/31924 from dzbarsky:codex/runfiles-missing-entries 9ff5ecfb6e1535bc460fd0ddd54d5f106e2f6600\nPiperOrigin-RevId: 1008332560\nChange-Id: Ifaebfd239819e57be0ad483e905b8a0be4300586\n"
    },
    {
      "commit": "19e27739add4a0bb5a63cc89bead257b7819ff1f",
      "tree": "c834576d282d12922439943aa719dbdf25e8828d",
      "parents": [
        "baa092f65c4c58ab6944aad4c54381e88c92845c"
      ],
      "author": {
        "name": "Fabian Meumertzheim",
        "email": "fabian@meumertzhe.im",
        "time": "Tue Oct 27 12:47:59 2026 -0700"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Tue Oct 27 12:50:59 2026 -0700"
      },
      "message": "Fix StringEncoding conversions in Bzlmod and repository fetching (#32112)\n\n### Description\n\nFixes missing and incorrect conversions between Bazel\u0027s internal string encoding and Unicode or platform strings (see `StringEncoding`) in Bzlmod and repository fetching. Strings are converted to internal strings where they enter Bazel and only reencoded where they leave it.\n\nAreas covered:\n- Non-ASCII URLs in `repository_ctx.download` and `download_and_extract`, which were rejected or crashed Bazel with `--distdir` or percent-encoded URLs, as well as URLs rewritten by the downloader config, redirects and `file:` URLs. All URLs handled by the downloader are now ASCII-only, with other characters percent-encoded as UTF-8.\n- Basic auth credentials are encoded as UTF-8.\n- `rename_files` matches non-ASCII zip and 7z entries, and patches are read and written with the internal encoding.\n- Registry URLs from `--registry` and `--module_mirrors`, strings from `bazel_registry.json`, `source.json` and `metadata.json`, and vendoring of registry files.\n- Module extension facts in the lockfile.\n- `bazel mod` output.\n- The workspace rules log and error messages for malformed JSON files, malformed zip archives and missing `file:` URLs.\n\nBehavior changes:\n- Download URLs are reported percent-encoded in messages and the BEP.\n- `bazel mod --charset\u003dascii` only affects the tree-drawing characters and no longer replaces non-ASCII data with `?`.\n- Non-ASCII module extension facts were stored double-encoded in `MODULE.bazel.lock`. The lockfile version is bumped, so lockfiles written by older versions of Bazel are regenerated.\n- Registry files whose URL contains `+` or `%25` are vendored under a different path and have to be vendored again.\n\n### Motivation\n\nNon-ASCII characters in URLs, archive entries, registry files and module extension facts were garbled, rejected or crashed Bazel. Split out of #31720.\n\n### Build API Changes\n\nNo\n\n### Release Notes\n\nRELNOTES: Fixed the handling of non-ASCII characters in repository downloads, archive extraction, registries, module extension facts in the lockfile and `bazel mod` output.\n\nCloses #32112\n\nCOPYBARA_INTEGRATE_REVIEW\u003dhttps://github.com/bazelbuild/bazel/pull/32112 from fmeum:fix-string-encoding-bzlmod 949d106420e2bebffe763e4dae79ba9bf84a4ec7\nPiperOrigin-RevId: 1008307495\nChange-Id: I7e3c2e2259536e94910d7708f80096cddc544f25\n"
    },
    {
      "commit": "baa092f65c4c58ab6944aad4c54381e88c92845c",
      "tree": "8462e3d0931ee03d7ae44b2e5d9dd9ff3c4d0fae",
      "parents": [
        "e0c5316bcfcb600d31d3a75d98c0cb1442174682"
      ],
      "author": {
        "name": "Benjamin Peterson",
        "email": "benjamin@engflow.com",
        "time": "Tue Oct 27 12:47:35 2026 -0700"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Tue Oct 27 12:49:05 2026 -0700"
      },
      "message": "upgrade grpc-java to 1.84.0 (#31885)\n\nThis gets rid of some patches.\n\nRELNOTES: None\n\nCloses #31885\n\nCOPYBARA_INTEGRATE_REVIEW\u003dhttps://github.com/bazelbuild/bazel/pull/31885 from benjaminp:grpc-java 87c9b930e965345afe9ef97ec7757ffd838c3350\nPiperOrigin-RevId: 1008307267\nChange-Id: I557663751b0af068ec8e4fb79ac54a7ecdcaabbf\n"
    },
    {
      "commit": "e0c5316bcfcb600d31d3a75d98c0cb1442174682",
      "tree": "73514b9ab9d5c00127ed82180fdd2ff6bed21821",
      "parents": [
        "d4b6b2218906c92ef4848fa243ca4ffef923af8a"
      ],
      "author": {
        "name": "David Zbarsky",
        "email": "dzbarsky@gmail.com",
        "time": "Tue Oct 27 12:10:20 2026 -0700"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Tue Oct 27 12:11:44 2026 -0700"
      },
      "message": "Avoid temporary dependency maps during Skyframe deletion (#32067)\n\nDeletingNodeVisitor queries the existing NodeBatch directly instead of allocating a filtered map of dependency entries for each deleted node. Nodes with no dependencies retain the existing behavior, and reverse-dependency removal and interrupted deletion still use the same graph entries.\n\nIn the original fixture deleting one million nodes with one dependency, allocation fell from 592.4 to 376.6 MB and median time from 737.7 to 664.2 ms. Original SkyframeTests passed 1,473 cases (6 skipped). The complete patch matches the original and git diff --check passes upstream.\n\n@fmeum\n\nCloses #32067\n\nCOPYBARA_INTEGRATE_REVIEW\u003dhttps://github.com/bazelbuild/bazel/pull/32067 from dzbarsky:dzbarsky/upstream-bazel-148 bed4b20e89d570ccff3f9b9d895d5c0dbdbce5b1\nPiperOrigin-RevId: 1008284342\nChange-Id: Ia02fba8bcc17ba89d42569fe0b6a418eeadd58de\n"
    },
    {
      "commit": "d4b6b2218906c92ef4848fa243ca4ffef923af8a",
      "tree": "c166b81921320bc234f1a65a84a7902a03060ce4",
      "parents": [
        "35147292692e5ed4f3c4163098dc555e3cc65e0d"
      ],
      "author": {
        "name": "David Zbarsky",
        "email": "dzbarsky@gmail.com",
        "time": "Tue Oct 27 12:06:02 2026 -0700"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Tue Oct 27 12:07:19 2026 -0700"
      },
      "message": "Deduplicate repository mappings before sorting (#32066)\n\nRepoMappingManifestAction deduplicates repository names in a HashMap before sorting the distinct names. It preserves the first mapping for a duplicate repository and keeps both expanded and compact output order; identical entry maps are still grouped for compact manifests.\n\nIn the original 32,768-package, 256-manifest fixture with 1,024 repositories, manifest generation improved from 1.829 to 1.483 s. The 32-repository control was unchanged. The complete patch matches the original and git diff --check passes upstream.\n\n@fmeum\n\nCloses #32066\n\nCOPYBARA_INTEGRATE_REVIEW\u003dhttps://github.com/bazelbuild/bazel/pull/32066 from dzbarsky:dzbarsky/upstream-bazel-151 a9a0cf8e79ae442f3d96662dcbb967e4160c1bdb\nPiperOrigin-RevId: 1008281270\nChange-Id: I08f73a5516830412c2d81bf327db079c558ca4eb\n"
    },
    {
      "commit": "35147292692e5ed4f3c4163098dc555e3cc65e0d",
      "tree": "94fde85bd80c897983606668a6a3429ef1e80679",
      "parents": [
        "99b979791e0d86d0bfb0ccc83310c74baf574bba"
      ],
      "author": {
        "name": "David Zbarsky",
        "email": "dzbarsky@gmail.com",
        "time": "Tue Oct 27 12:01:25 2026 -0700"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Tue Oct 27 12:02:48 2026 -0700"
      },
      "message": "Stream encoded test logs into XML output (#32072)\n\ngenerate-xml.sh streams the escaped test log into XML instead of storing the full encoded log in a shell variable. Allowed ASCII lines skip the UTF-8 repair; non-ASCII and invalid bytes still pass through the existing repair. Counting trailing newlines preserves command substitution’s trimming behavior. generate_xml_test.sh covers trailing blank lines and CDATA.\n\nOriginal Linux measurements: a 64 MiB ASCII log improved from 20.92 to 1.44 s and 323 to 24 MiB RSS; a 768 MiB log from 242.47 to 16.83 s and 3.75 GiB to 86 MiB RSS. All 8 original XML-generator tests passed on Linux and macOS. This commit contains both original commits and passes git diff --check upstream.\n\n@fmeum\n\nCloses #32072\n\nCOPYBARA_INTEGRATE_REVIEW\u003dhttps://github.com/bazelbuild/bazel/pull/32072 from dzbarsky:dzbarsky/upstream-bazel-141 c0fa8cca6e066d67dcd26c99863135e412815433\nPiperOrigin-RevId: 1008277559\nChange-Id: Ie4a676ec5e051c35bcb5a99769260e32d61d0bab\n"
    },
    {
      "commit": "99b979791e0d86d0bfb0ccc83310c74baf574bba",
      "tree": "429c414f33fc5952a8bb098f6a490ae06eeb0d39",
      "parents": [
        "fd9e676b34ece953c3d644a5a4e5bc5ef140df7d"
      ],
      "author": {
        "name": "jingwen",
        "email": "jingwen@google.com",
        "time": "Tue Oct 27 11:53:45 2026 -0700"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Tue Oct 27 11:55:09 2026 -0700"
      },
      "message": "Convert `PackageSpecification.PackageGroupContents` from `@AutoValue` to a Java `record`\n\nFollowing up on review feedback on unknown commit, `PackageSpecification.PackageGroupContents` is a pure immutable value carrier with no custom `equals`, `hashCode`, or lazy fields, and `@AutoCodec` natively supports Java `record` canonical constructors without requiring a separate `@AutoCodec.Instantiator` factory method.\n\nThis change:\n\n- Converts `PackageSpecification.PackageGroupContents` from an `@AutoValue` abstract class to a Java `record`.\n\n- Removes the redundant `createForSerialization` `@AutoCodec.Instantiator` factory method and the `//third_party/java/auto:auto_value` dependency from `:package_specification`.\n\nBefore:\n```java\n@AutoCodec\n@AutoValue\npublic abstract static class PackageGroupContents\n    implements NestedSetsShouldBeInternedByEquality {\n  abstract ImmutableSet\u003cPackageIdentifier\u003e singlePackagePositives();\n  abstract ImmutableList\u003cPackageIdentifier\u003e allPackagesBeneathPositives();\n  abstract boolean hasPositiveAllPackages();\n  abstract ImmutableSet\u003cPackageIdentifier\u003e singlePackageNegatives();\n  abstract ImmutableList\u003cPackageIdentifier\u003e allPackagesBeneathNegatives();\n  abstract boolean hasPrivate();\n  abstract boolean hasNegativeAllPackages();\n\n  @VisibleForSerialization\n  @AutoCodec.Instantiator\n  static PackageGroupContents createForSerialization(...) {\n    return new AutoValue_PackageSpecification_PackageGroupContents(...);\n  }\n}\n```\n\nAfter:\n```java\n@AutoCodec\npublic record PackageGroupContents(\n    ImmutableSet\u003cPackageIdentifier\u003e singlePackagePositives,\n    ImmutableList\u003cPackageIdentifier\u003e allPackagesBeneathPositives,\n    boolean hasPositiveAllPackages,\n    ImmutableSet\u003cPackageIdentifier\u003e singlePackageNegatives,\n    ImmutableList\u003cPackageIdentifier\u003e allPackagesBeneathNegatives,\n    boolean hasPrivate,\n    boolean hasNegativeAllPackages)\n    implements NestedSetsShouldBeInternedByEquality {\n  ...\n}\n```\nPiperOrigin-RevId: 1008271839\nChange-Id: I847233841cc31a6e3724420f3d1996879779db37\n"
    },
    {
      "commit": "fd9e676b34ece953c3d644a5a4e5bc5ef140df7d",
      "tree": "806ad204004224205ff0a00adab34ab4a81329a2",
      "parents": [
        "dc1e30c0ba597084cb2447f1958aaf9c5be2a3e9"
      ],
      "author": {
        "name": "jingwen",
        "email": "jingwen@google.com",
        "time": "Tue Oct 27 11:25:32 2026 -0700"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Tue Oct 27 11:27:07 2026 -0700"
      },
      "message": "Register `PackageSpecification.PackageGroupContents` for Skycache value-sharing\n\nDuring Skycache frontier serialization, `PackageSpecification.PackageGroupContents` (and its generated `@AutoValue` subclass `AutoValue_PackageSpecification_PackageGroupContents`) was previously serialized inline via `DynamicCodec` whenever referenced by package visibility specifications or `NestedSet\u003cPackageGroupContents\u003e` nodes. Across a single build graph, 30,798 `PackageGroupContents` instances were serialized inline (despite only 2,861 unique instances), accounting for 3.14 MB (205,770 cumulative objects) of wire data.\n\nThis change:\n\n- Annotates `PackageSpecification.PackageGroupContents` with `@AutoCodec` and adds a `@VisibleForSerialization @AutoCodec.Instantiator` factory method (`createForSerialization`) returning `AutoValue_PackageSpecification_PackageGroupContents`.\n\n- Registers `PackageGroupContents.class` in `SerializationRegistrySetupHelpers.AUTOCODEC_CLASSES_FOR_VALUE_SHARING` so `PackageGroupContents` instances are deduplicated across Skyframe nodes via `ValueSharingAdapter`.\n\n- Adds `PackageGroupTest.testPackageGroupContentsCodec` to verify round-trip serialization and reference-identity deduplication (`isSameInstanceAs`) with `SerializationRegistrySetupHelpers.analysisCachingCodecs()`.\n\nBefore:\n```java\n@AutoValue\npublic abstract static class PackageGroupContents\n    implements NestedSetsShouldBeInternedByEquality {\n  // Serialized inline via DynamicCodec without value-sharing across Skyframe nodes.\n}\n```\n\nAfter:\n```java\n@AutoCodec\n@AutoValue\npublic abstract static class PackageGroupContents\n    implements NestedSetsShouldBeInternedByEquality {\n  @VisibleForSerialization\n  @AutoCodec.Instantiator\n  static PackageGroupContents createForSerialization(...) {\n    return new AutoValue_PackageSpecification_PackageGroupContents(...);\n  }\n}\n```\nPiperOrigin-RevId: 1008249881\nChange-Id: I07a674af764898a5d48ce1ab98dc9fafca7ea709\n"
    },
    {
      "commit": "dc1e30c0ba597084cb2447f1958aaf9c5be2a3e9",
      "tree": "f7eaa1b0234767e84f8729fa8c5259347082ee36",
      "parents": [
        "6c44cbe94e7a597a015df3f0ccccf42cdec00043"
      ],
      "author": {
        "name": "shahan",
        "email": "shahan@google.com",
        "time": "Tue Oct 27 11:21:44 2026 -0700"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Tue Oct 27 11:22:41 2026 -0700"
      },
      "message": "Migrate ImmutableTableCodec off of offset-based AsyncDeserializationContext.deserialize.\n\nThe row keys, column keys and values are now deserialized using\ndeserializeArrayElement instead of Unsafe array offsets.\n\nPiperOrigin-RevId: 1008246854\nChange-Id: Ifc5be0a8805be1a76ae8a4e4b3afe04108e23d28\n"
    },
    {
      "commit": "6c44cbe94e7a597a015df3f0ccccf42cdec00043",
      "tree": "2340211d0480e3ecd3898aba501365e0bc74f4a5",
      "parents": [
        "a49b4dcb5e352523c1982b5431e7385733d67a1d"
      ],
      "author": {
        "name": "Dmitry Spikhalsky",
        "email": "dmitry@spikhalskiy.com",
        "time": "Tue Oct 27 10:57:41 2026 -0700"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Tue Oct 27 10:59:12 2026 -0700"
      },
      "message": "Bound the asynchronous sandbox deletion backlog (#31886)\n\n### Description\n\n`AsynchronousTreeDeleter` now uses a bounded queue (256 trees). Once it is full, the action thread deletes its own already-renamed trash tree instead of queueing it, which is what `--experimental_sandbox_async_tree_delete_idle_threads\u003d0` does for every action. As long as the single deleter thread keeps up, deletion stays asynchronous, and `setThreads()` still grows the pool once the server is idle.\n\nThe rejection handler runs the task directly rather than using `CallerRunsPolicy`, which would silently drop a deletion that races with `shutdown()`.\n\n### Motivation\n\nFixes #31871. While a command runs, the deleter has one thread and an unbounded queue, so a build that creates sandboxes faster than one thread deletes them accumulates trees indefinitely. Each pending tree keeps its disk space and inodes, and with the hermetic sandbox a hardlink to every input, which eventually pushes shared inputs past ext4\u0027s 65,000-link limit and makes every later sandbox copy them.\n\n### Build API Changes\n\nNo\n\n### Checklist\n\n- [x] I have added tests for the new use cases (if any).\n- [ ] I have updated the documentation (if applicable).\n\n### Release Notes\n\nRELNOTES: Asynchronous sandbox deletion now deletes on the action thread once 256 sandbox trees are waiting, bounding the disk space, inodes and hardlinks held by pending deletions.\n\nCloses #31886\n\nCOPYBARA_INTEGRATE_REVIEW\u003dhttps://github.com/bazelbuild/bazel/pull/31886 from Spikhalskiy:async-tree-deleter-backpressure a1cf6ee0964f918d96d8373820d2ce4b6d1bd7b9\nPiperOrigin-RevId: 1008228026\nChange-Id: I5690fae1aae994e3095fbb9d5f5f496505f693c9\n"
    },
    {
      "commit": "a49b4dcb5e352523c1982b5431e7385733d67a1d",
      "tree": "50117859ec09e61fe314a648e05759e9a1c1f27f",
      "parents": [
        "03655dc6d78781a7314995c6441b48b06c335b0d"
      ],
      "author": {
        "name": "shahan",
        "email": "shahan@google.com",
        "time": "Tue Oct 27 10:51:42 2026 -0700"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Tue Oct 27 10:55:05 2026 -0700"
      },
      "message": "Migrate MapHelpers off of offset-based AsyncDeserializationContext.deserialize.\n\nBoth deserializeMapEntries overloads now use deserializeArrayElement, with or\nwithout a done callback, instead of Unsafe array offsets. This affects every\nmap codec that uses MapHelpers, such as HashMapCodec and ImmutableMapCodecs.\n\nPiperOrigin-RevId: 1008223275\nChange-Id: I1320b0ea28607b8824f167d70f5ed2d3d318e51a\n"
    },
    {
      "commit": "03655dc6d78781a7314995c6441b48b06c335b0d",
      "tree": "3541ebd26dfa82a35996ff6fc11ee3b73ae34e44",
      "parents": [
        "ff1759bd7637c91f3819d1d4a8a76cc6a31a8f3d"
      ],
      "author": {
        "name": "arostovtsev",
        "email": "arostovtsev@google.com",
        "time": "Tue Oct 27 10:50:13 2026 -0700"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Tue Oct 27 10:52:13 2026 -0700"
      },
      "message": "Suppress redefinition type tagger errors in untyped Starlark code.\n\nErrors for redeclaring inner functions or rebinding loaded type constructors\nare only relevant when static typing syntax is in use in the given .bzl file.\n\nSince we are enabling type tagging by default, we ought to tolerate old\nuntyped .bzl files that choose to declare their symbols in typing-incompatible\nways.\n\nWorking towards #27370\n\nPiperOrigin-RevId: 1008221953\nChange-Id: I84801500d6f531c3281bb51f628a6b0d1cf596e8\n"
    },
    {
      "commit": "ff1759bd7637c91f3819d1d4a8a76cc6a31a8f3d",
      "tree": "0a6a78073ade2a88d00fb78ab943825d5dffc108",
      "parents": [
        "9b8709de28d34faff63cbba76f2f341c02bcded8"
      ],
      "author": {
        "name": "shahan",
        "email": "shahan@google.com",
        "time": "Tue Oct 27 10:47:12 2026 -0700"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Tue Oct 27 10:48:38 2026 -0700"
      },
      "message": "Migrate ArrayListCodec off of Unsafe.\n\nArrayListCodec no longer uses Unsafe.allocateInstance and Unsafe.putObject to\ninject elementData and size. Instead, it uses VarHandles for those private\nfields, obtained with MethodHandles.privateLookupIn, to make a new ArrayList\nwrap an Object[] of the final size before registering it. Elements are then\nwritten directly into that array using deserializeArrayElement as they become\navailable, possibly concurrently. There\u0027s no intermediate buffer or copy, and\nas before, a backreference to the list from one of its own elements resolves to\nthe same instance and observes the list\u0027s final size.\n\nThe fields aren\u0027t final, so writing them is unaffected by JEP 500. The\nVarHandles require opening java.base/java.util, which is declared with\nadd_opens on the serialization library. This also places it in the Blaze LC\u0027s\nJAR manifest.\n\nPiperOrigin-RevId: 1008219479\nChange-Id: I5616a5165311dc73d36c6a930e7489a4c9698c59\n"
    },
    {
      "commit": "9b8709de28d34faff63cbba76f2f341c02bcded8",
      "tree": "e780075e4846b946e4c23d7b426a117ace265a19",
      "parents": [
        "44f610f71dc6ec3bfb56701fe24b5af799d62bd0"
      ],
      "author": {
        "name": "David Zbarsky",
        "email": "dzbarsky@gmail.com",
        "time": "Tue Oct 27 09:13:00 2026 -0700"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Tue Oct 27 09:14:26 2026 -0700"
      },
      "message": "Avoid rebuilding external source runfiles paths (#32065)\n\nArtifact.getRunfilesPath retains the repository segment already present in an external source exec path, replacing only external/ with ../. Main-repository, derived artifact and sibling-repository paths retain their existing behavior.\n\nIn the original fixture, 200,000 external getter calls fell from 19.327 to 9.644 ms; Starlark callback allocation also fell. Original artifact, runfiles, command-line and Starlark tests passed 509 cases (2 skipped). The complete patch matches the original and git diff --check passes upstream.\n\n@fmeum\n\nCloses #32065\n\nCOPYBARA_INTEGRATE_REVIEW\u003dhttps://github.com/bazelbuild/bazel/pull/32065 from dzbarsky:dzbarsky/upstream-bazel-152 433adb18b7921e07c7a49e2603ecee20a77cedc0\nPiperOrigin-RevId: 1008152195\nChange-Id: I68b3845a341fba7bb30eb33397322ec8cdbc2758\n"
    },
    {
      "commit": "44f610f71dc6ec3bfb56701fe24b5af799d62bd0",
      "tree": "f534b4ebc206fec2c5ff9a7a61c9c41444f9f87d",
      "parents": [
        "bcb0ceca09adb66458d612a3bcd16818f974e755"
      ],
      "author": {
        "name": "shahan",
        "email": "shahan@google.com",
        "time": "Tue Oct 27 08:55:22 2026 -0700"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Tue Oct 27 08:56:52 2026 -0700"
      },
      "message": "Add a done-callback overload of AsyncDeserializationContext.deserializeArrayElement.\n\nThis is the array-element analogue of the deprecated offset-based\ndeserialize(CodedInputStream, Object, long, Runnable) overload, but uses plain\narray stores instead of Unsafe.\n\nIt enables container codecs that buffer their elements before populating the\ncontainer, such as ArrayListCodec and HashSetCodec, to migrate off of Unsafe.\n\nPiperOrigin-RevId: 1008140129\nChange-Id: Id01991ac6a0f9ba1719ba65fb5b1ebfbd023675c\n"
    },
    {
      "commit": "bcb0ceca09adb66458d612a3bcd16818f974e755",
      "tree": "178d908c8f8e1b67b93f866671267474843a31bc",
      "parents": [
        "b2e9a15b676294ec5f916ad527514e94878f3fd1"
      ],
      "author": {
        "name": "lberki",
        "email": "lberki@google.com",
        "time": "Tue Oct 27 08:34:04 2026 -0700"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Tue Oct 27 08:36:06 2026 -0700"
      },
      "message": "Automated rollback of commit a2cbc1f4b4303e4e7df927650b46225fdedc7ff2.\n\n*** Reason for rollback ***\n\nMake some internal metrics worse: the new code creates new NestedSet instances for each CppCompileAction and if the set of includes of a CppCompileAction are unique, this results in a lot of new nested sets with potentially a lot of new direct members and thus Skyframe edges.\n\n*** Original change description ***\n\nShare discovered input dependencies (#31767)\n\nActionExecutionFunction records shared discovered inputs as ArtifactNestedSetKey dependencies instead of retaining a separate Skyframe edge for every discovered artifact. ActionRewindStrategy receives the saved and newly requested Skyframe keys, including after InputDiscoveryState eviction. Missing inputs and failed nested-set lookups retain per-artifact error handling. TimestampBuilderTest checks that distinct discovered-input sets share a child dep\n\n***\n\nRELNOTES: None.\nPiperOrigin-RevId: 1008127328\nChange-Id: Iabfed8543f72d6de8c779cbabf77ee64426cdb3c\n"
    },
    {
      "commit": "b2e9a15b676294ec5f916ad527514e94878f3fd1",
      "tree": "d7b820b2e31f8c68e98bb616c783449f848973ef",
      "parents": [
        "3a071027adaf2a705908ff9ba3d5a9144f10801c"
      ],
      "author": {
        "name": "jhorvitz",
        "email": "jhorvitz@google.com",
        "time": "Tue Oct 27 07:55:57 2026 -0700"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Tue Oct 27 07:57:22 2026 -0700"
      },
      "message": "Remove unnecessary `MemoizationEquality.BY_VALUE` from `StarlarkCustomCommandLine`.\n\nAll `VectorArg` and `Recipe` instances are interned at creation time, so at serialization time we can never encounter two instances that are value-equal but not reference-equal.\n\nPiperOrigin-RevId: 1008102297\nChange-Id: I0b151dee09b4c1971f9e8669402277ab114dc9b3\n"
    },
    {
      "commit": "3a071027adaf2a705908ff9ba3d5a9144f10801c",
      "tree": "ae2307f3e01476aeea81579bb6fac058862ffba3",
      "parents": [
        "db1c2e83f86bd9c0f5ce84c9a01deeb7568a3550"
      ],
      "author": {
        "name": "Googler",
        "email": "noreply@google.com",
        "time": "Tue Oct 27 07:39:50 2026 -0700"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Tue Oct 27 07:41:35 2026 -0700"
      },
      "message": "Deflake: Use CountDownLatch in TestInterruptingBugReporterTest.asyncThread_sendBugReport\n\nThe tests `asyncThread_sendBugReport` and `asyncThread_handleCrash` were flaky due to a race condition where the background worker thread could complete its `Future` before the main thread processed the interrupt signal, causing `assertThrows(InterruptedException.class, future::get)` to intermittently fail. To fix this, both tests were refactored to use a new `assertAsyncInterrupted` helper method that introduces a `CountDownLatch`. The background task now blocks on the latch immediately after execution, ensuring the `Future` remains uncompleted while the main thread waits and receives the interruption. Once the interruption assertion completes, the latch is counted down in a `finally` block to allow the background task to terminate cleanly.\n\nPiperOrigin-RevId: 1008092110\nChange-Id: I2dbff29191b6eac0e6d0c623eff03d074d8d0b9e\n"
    },
    {
      "commit": "db1c2e83f86bd9c0f5ce84c9a01deeb7568a3550",
      "tree": "e4056ca5ed2f07336ff2a9549a54e69a8295c9b5",
      "parents": [
        "88f89d64c68f0735c34c757ccbf8910cbecf507a"
      ],
      "author": {
        "name": "shahan",
        "email": "shahan@google.com",
        "time": "Tue Oct 27 07:30:04 2026 -0700"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Tue Oct 27 07:31:30 2026 -0700"
      },
      "message": "Use deserializeArrayElement in TransitiveInfoProviderMapImpl\u0027s DeferredKeysCodec.\n\nDeferredKeysCodec allocated an ArrayFieldSetter for each element only to carry\nthe array index into the FieldSetter-based deserialize overload.\nAsyncDeserializationContext.deserializeArrayElement does the same thing without\nthe per-element allocation, so this switches to it and deletes ArrayFieldSetter.\n\nPiperOrigin-RevId: 1008086318\nChange-Id: I775a4d22ffc91699d13bbdc103c20b7e73bf2458\n"
    },
    {
      "commit": "88f89d64c68f0735c34c757ccbf8910cbecf507a",
      "tree": "0546600306451cffe32a42f5f0424d1b55559a19",
      "parents": [
        "045b43217fbcb99a42c8a12b78f67067f6261fd2"
      ],
      "author": {
        "name": "Tamir Duberstein",
        "email": "tamird@gmail.com",
        "time": "Tue Oct 27 04:06:12 2026 -0700"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Tue Oct 27 04:08:14 2026 -0700"
      },
      "message": "Initialize Bazel\u0027s system memory pressure monitor (#32127)\n\nFixes #32126.\n\nRegister `SystemMemoryPressureModule` so the macOS idle watcher can read the initialized native service even when no workspace command has run. Without it, `--shutdown_on_low_sys_mem` crashes an idle server after five minutes.\n\nCodex for Tamir.\n\nCloses #32127\n\nCOPYBARA_INTEGRATE_REVIEW\u003dhttps://github.com/bazelbuild/bazel/pull/32127 from tamird:codex/initialize-memory-pressure 8b8bba254e1e268ebcca74b64f94f19bb90cf76d\nPiperOrigin-RevId: 1007986710\nChange-Id: I5816277a3e88b89f3a094f9de6d136be2da2ae25\n"
    },
    {
      "commit": "045b43217fbcb99a42c8a12b78f67067f6261fd2",
      "tree": "2e89ded8293303422b98e477d1972873c3ef4592",
      "parents": [
        "a9857eba92da6d08e815ee65f73270ce989c35ca"
      ],
      "author": {
        "name": "cushon",
        "email": "cushon@google.com",
        "time": "Tue Oct 27 02:02:07 2026 -0700"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Tue Oct 27 02:03:06 2026 -0700"
      },
      "message": "Move `create_jvm_compile_action` to `JavaCommonApi` and extend it for direct classpaths and toolchain tools.\n\nMove `create_jvm_compile_action` from `GoogleJavaStarlarkCommon` to `JavaCommonApi` / `JavaStarlarkCommon` and forward it on `java_common.internal_DO_NOT_USE()`. Extend `create_jvm_compile_action` and `JavaCompileAction` to support string executable paths, explicit `tools`, `enable_direct_classpath`, and `reduce_classpath_incompatible`, and expose `fix_deps_tool`, `experimental_enable_jspecify`, `experimental_turbine_annotation_processing`, `experimental_turbine_cpu_reservation`, `experimental_turbine_output_root_relative_path`, and `run_local_java_optimizations` on `ctx.fragments.java`.\n\nPiperOrigin-RevId: 1007921884\nChange-Id: I5f1c4f2e3a13312c92f720b9a359f10a769977e0\n"
    },
    {
      "commit": "a9857eba92da6d08e815ee65f73270ce989c35ca",
      "tree": "ef987a0db14e750d2b74d7136ce74188114c4d38",
      "parents": [
        "e461085397668903cfefca3d0746e422bf99c18d"
      ],
      "author": {
        "name": "Fabian Meumertzheim",
        "email": "fabian@meumertzhe.im",
        "time": "Tue Oct 27 01:31:36 2026 -0700"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Tue Oct 27 01:33:06 2026 -0700"
      },
      "message": "Accept inline stdout of an intermediate repo contents cache entry (#31501)\n\n### Description\n\nThe remote repo contents cache requests the stdout of an action result inline, but only recognized it by the size of its digest. Stdout now counts as present if it is inlined or has a digest, both when an intermediate entry is looked up and when one is updated.\n\n### Motivation\n\nA cache that inlines stdout without also setting the digest made the lookup report `Unexpected intermediate action result` and rerun the repo rule, and made the update of an entry drop the other batches of recorded inputs. Reported in https://github.com/bazelbuild/bazel/pull/31452#issuecomment-5970831616.\n\nWork towards #31456\n\n### Build API Changes\n\nNo\n\n### Release Notes\n\nRELNOTES: None\n\nCloses #31501\n\nCOPYBARA_INTEGRATE_REVIEW\u003dhttps://github.com/bazelbuild/bazel/pull/31501 from fmeum:rrcc-inline-stdout b68b1f16f72028b709802c857b273d3a6f7d26bf\nPiperOrigin-RevId: 1007905850\nChange-Id: Iba18ed7c4149078e1b2c7f2b76b69dcbc4b27f9a\n"
    },
    {
      "commit": "e461085397668903cfefca3d0746e422bf99c18d",
      "tree": "c14d4460484a9d8badef846a6dd74e82c5dab3a5",
      "parents": [
        "3b987a77a95815fe2b46cd39c04b8f38e35a1178"
      ],
      "author": {
        "name": "jingwen",
        "email": "jingwen@google.com",
        "time": "Mon Oct 26 22:38:26 2026 -0700"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Mon Oct 26 22:42:07 2026 -0700"
      },
      "message": "Cancel pending invalidation lookup futures when `AnalysisCacheInvalidator.lookupKeysToInvalidate()` does not complete normally.\n\nWhen `AnalysisCacheInvalidator.lookupKeysToInvalidate()` times out, encounters an `ExecutionException`, or is interrupted while submitting or waiting for responses, it falls back to invalidating all keys (`Futures.allAsList(futures).get(...)` only cancels the combined `ListFuture` wrapper on timeout/interruption, which does not propagate cancellation to the input futures unless they are explicitly cancelled). Leaving the individual lookup futures uncancelled keeps their `SkycacheChannelStateAdvisor` in-flight request tokens acquired and allows orphaned invalidation RPCs and buffered batch entries to remain active after the invalidation check has already given up.\n\nBefore:\n```java\ntry {\n  List\u003cListenableFuture\u003cOptional\u003cSkyKey\u003e\u003e\u003e futures \u003d\n      submitInvalidationLookupsBatched(keysToLookup);\n  ...\n  keysToInvalidate \u003d\n      Futures.allAsList(futures).get(INVALIDATION_TIMEOUT_SECONDS, SECONDS).stream()\n          .flatMap(Optional::stream)\n          .collect(toImmutableSet());\n  status \u003d InvalidationLookupMetrics.Status.OK;\n} catch (TimeoutException e) {\n  status \u003d InvalidationLookupMetrics.Status.TIMED_OUT;\n  return keysToLookup;\n} finally {\n  stopwatch.stop();\n  ...\n}\n```\n\nAfter:\n```java\nList\u003cListenableFuture\u003cOptional\u003cSkyKey\u003e\u003e\u003e futures \u003d null;\ntry {\n  futures \u003d submitInvalidationLookupsBatched(keysToLookup);\n  ...\n} finally {\n  if (futures !\u003d null \u0026\u0026 status !\u003d InvalidationLookupMetrics.Status.OK) {\n    cancelFutures(futures);\n  }\n  stopwatch.stop();\n  ...\n}\n```\n\nCancelling the submitted `ListenableFuture` instances in `finally` when `status !\u003d InvalidationLookupMetrics.Status.OK` (and when batch submission itself times out or is interrupted) propagates cancellation through `Futures.transform` / `Futures.transformAsync` to the underlying `analysisCacheClient.lookup()` futures immediately, releasing their in-flight request tokens.\n\nPiperOrigin-RevId: 1007822773\nChange-Id: I4fc0a25d576418fae428f16c0fb313ad643d8bd5\n"
    },
    {
      "commit": "3b987a77a95815fe2b46cd39c04b8f38e35a1178",
      "tree": "394faf362b109772a3f2a7984d76b426092d7114",
      "parents": [
        "57bfc2fce573e9e32546fc5eb0bae369c081781b"
      ],
      "author": {
        "name": "jingwen",
        "email": "jingwen@google.com",
        "time": "Mon Oct 26 22:38:18 2026 -0700"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Mon Oct 26 22:39:38 2026 -0700"
      },
      "message": "No public description\n\nPiperOrigin-RevId: 1007822704\nChange-Id: I53dc412fa58d2f2b91105979c6ae57a0965ad6b0\n"
    },
    {
      "commit": "57bfc2fce573e9e32546fc5eb0bae369c081781b",
      "tree": "1e5c4d7a8312791d35aea619b62d9c1b246b004f",
      "parents": [
        "d72f056fd2d08d203848de522f1f3a182d905e38"
      ],
      "author": {
        "name": "Fabian Meumertzheim",
        "email": "fabian@meumertzhe.im",
        "time": "Mon Oct 26 16:24:00 2026 -0700"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Mon Oct 26 16:24:54 2026 -0700"
      },
      "message": "Count only symlinks toward the in-memory file system\u0027s symlink limit (#31512)\n\n### Description\n\n`InMemoryFileSystem` counted every component of a path toward the limit of 256 that is meant to catch symlink loops. Only symlinks that are followed count now.\n\n### Motivation\n\nA single valid symlink below a path of more than 256 components failed with `ELOOP`. The remote repo contents cache serves repos from such a file system, where the output base\u0027s path contributes to the count, so a deeply nested repo file behind a symlink couldn\u0027t be read while the repo was served from the cache although it could natively. Reported in https://github.com/bazelbuild/bazel/pull/31452#issuecomment-5971334042.\n\nWork towards #31456\n\n### Build API Changes\n\nNo\n\n### Release Notes\n\nRELNOTES: None\n\nCloses #31512\n\nCOPYBARA_INTEGRATE_REVIEW\u003dhttps://github.com/bazelbuild/bazel/pull/31512 from fmeum:inmemoryfs-symlink-limit 1ba08bf3ba4e9d4e987ab2c5ce1ae9a2cf84b77d\nPiperOrigin-RevId: 1007639429\nChange-Id: I87cb3a6e9714e8d7322abb92e123fef5c09a77ee\n"
    },
    {
      "commit": "d72f056fd2d08d203848de522f1f3a182d905e38",
      "tree": "3270d00d1ce1da0c6dc0b5c7097b3f9652da3c3b",
      "parents": [
        "329af1d5508be68d8a3ebb1d57cc379e606df9da"
      ],
      "author": {
        "name": "tjgq",
        "email": "tjgq@google.com",
        "time": "Mon Oct 26 13:55:33 2026 -0700"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Mon Oct 26 13:57:07 2026 -0700"
      },
      "message": "Replace `SpecialArtifact` with dedicated subclasses.\n\nSaves a bit of memory by eliding the `type` field, but more importantly, improves readability and type safety, replacing a bunch of runtime assertions with compile-time checks.\n\nPiperOrigin-RevId: 1007530602\nChange-Id: I464575fd8746da772300f5518e4bcba7c0daea02\n"
    },
    {
      "commit": "329af1d5508be68d8a3ebb1d57cc379e606df9da",
      "tree": "c38ddb51b1bab726b3f4b8eb63ecd024aa2f5bcf",
      "parents": [
        "4258e97856a2b8ad860887e91c03f22fcf34e26b"
      ],
      "author": {
        "name": "jhorvitz",
        "email": "jhorvitz@google.com",
        "time": "Mon Oct 26 13:34:35 2026 -0700"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Mon Oct 26 13:36:00 2026 -0700"
      },
      "message": "Remove preconditions check for running test targets. Output services may stage runfiles independently of `--build_runfile_links`.\n\nPiperOrigin-RevId: 1007514176\nChange-Id: I2a614925e50d6994c79d0ab9682396d7b24cfab9\n"
    },
    {
      "commit": "4258e97856a2b8ad860887e91c03f22fcf34e26b",
      "tree": "beaf93b2cd556defa43ed02b3f105ce16a2f6d3c",
      "parents": [
        "644166cef7aa95e3d2fdef840351fff1a0f8ffa2"
      ],
      "author": {
        "name": "Fabian Meumertzheim",
        "email": "fabian@meumertzhe.im",
        "time": "Mon Oct 26 12:27:41 2026 -0700"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Mon Oct 26 12:29:00 2026 -0700"
      },
      "message": "Detect file changes at full timestamp precision (#32028)\n\n### Description\n\n`FileStatus` gains `getLastModifiedTimeNanos` and `getLastChangeTimeNanos`, which the Unix and Windows file systems report with the full precision the operating system provides (in units of 1 ns and 100 ns, respectively) and other file systems derive from their millisecond times. The digest cache, `FileContentsProxy` (and thus the hermetic sandbox\u0027s check for inputs modified during execution) and the mtime check of directories use them, while the millisecond getters keep serving code that treats file times as times of day. A `long` holds nanoseconds since the Unix epoch until 2262-04-11T23:47:16.854775807Z, so the times fit into the fields that held milliseconds before and only file times after that date would overflow.\n\nThe in-memory sandbox stash and the worker sandbox take the timestamp they compare change times against from the file system by touching the stash root and reading back its change time, and treat a file whose change time isn\u0027t strictly before it as modified.\n\n### Motivation\n\nBazel truncated file modification and change times to milliseconds, so a file rewritten in place with the same size within the same millisecond looked unchanged to all of the checks above, even if the file system recorded distinct times for the two writes. APFS does, and so do Linux file systems with multigrain timestamps (Linux 6.13+) if the file\u0027s times were read in between. On APFS, 4478 of 5000 back-to-back same-size rewrites of a file through `UnixFileSystem` kept the same digest cache key with millisecond times, and none did with full-precision times. Other Linux file systems and older kernels stamp files from a clock that only advances once per scheduler tick, which more precision doesn\u0027t help with.\n\nThe sandbox stash compared change times against `System.currentTimeMillis()`, but a file system may stamp files from a clock that is coarser than or lags behind the system clock, such as Linux\u0027s coarse clock that only advances once per scheduler tick. A file modified right after the timestamp was taken could thus get a change time at or before it and be kept in the stash.\n\n### Build API Changes\n\nNo\n\n### Release Notes\n\nRELNOTES: Bazel detects file changes using file modification and change times at the full precision provided by the operating system instead of at millisecond precision.\n\nCloses #32028\n\nCOPYBARA_INTEGRATE_REVIEW\u003dhttps://github.com/bazelbuild/bazel/pull/32028 from fmeum:nanosecond-file-times 3ed4e0c7d6dd9a5b1106062ca94247e91b3bf583\nPiperOrigin-RevId: 1007464032\nChange-Id: Iaae0e19f5cb7263f1966d8504bc5512734c2da46\n"
    },
    {
      "commit": "644166cef7aa95e3d2fdef840351fff1a0f8ffa2",
      "tree": "a64a015eb4eead9c721dd72dcc20efe4fd4b8f6e",
      "parents": [
        "5368549646b60617e195ac13d162e79490d8fa57"
      ],
      "author": {
        "name": "twerth",
        "email": "twerth@google.com",
        "time": "Mon Oct 26 11:38:50 2026 -0700"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Mon Oct 26 11:40:16 2026 -0700"
      },
      "message": "Modularize \u0027actions:actions\u0027 by extracting satellite targets and pruning sources.\n\nPrune satellite and leaf classes (ActionContextMarker, ResourceEstimator, and ToolProvider) from monolithic \u0027actions:actions\u0027 srcs, extracting dedicated libraries while preserving backward compatibility via export shims.\n\nPiperOrigin-RevId: 1007427953\nChange-Id: I7ee0e65c837eaa9728b605715751fdadc1ba168a\n"
    },
    {
      "commit": "5368549646b60617e195ac13d162e79490d8fa57",
      "tree": "828ef435c1e39f6337e75d9a6bfb0fad7f3f3d55",
      "parents": [
        "cbf8d4776281443192b1cb34f52e2bb2b0d7984b"
      ],
      "author": {
        "name": "Fabian Meumertzheim",
        "email": "fabian@meumertzhe.im",
        "time": "Mon Oct 26 11:01:17 2026 -0700"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Mon Oct 26 11:02:55 2026 -0700"
      },
      "message": "Document that a failed download may leave a partial file (#31837)\n\n### Description\n\nDocuments on the `allow_fail` parameter of `repository_ctx.download` and `module_ctx.download` that a failed download may leave a partially downloaded file at the output path, or one that doesn\u0027t match `sha256` or `integrity`.\n\n### Motivation\n\nDeleting the output of a failed download instead would break rules that resume it, e.g. with a `Range` header in `headers`, and would also delete a file that was at the output path before the download.\n\n### Build API Changes\n\nNo\n\n### Release Notes\n\nRELNOTES: None\n\nCloses #31837\n\nCOPYBARA_INTEGRATE_REVIEW\u003dhttps://github.com/bazelbuild/bazel/pull/31837 from fmeum:download-cleanup-partial-output 6fbd98d48e8dbd07172fa6757afa760dc22e0aed\nPiperOrigin-RevId: 1007401272\nChange-Id: I764008f7e677d7fe6543ad341908ea6f41c8ea26\n"
    },
    {
      "commit": "cbf8d4776281443192b1cb34f52e2bb2b0d7984b",
      "tree": "e3999ce07f0b47271c83e267caa974316696abe2",
      "parents": [
        "a12fee9956e5e073ede9c32f2ee6bf21f0c83162"
      ],
      "author": {
        "name": "Fabian Meumertzheim",
        "email": "fabian@meumertzhe.im",
        "time": "Mon Oct 26 10:50:49 2026 -0700"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Mon Oct 26 10:52:33 2026 -0700"
      },
      "message": "Fix three causes of spurious shell integration test failures (#32056)\n\n### Description\n\nThis fixes three causes of spurious failures of `//src/test/shell/bazel:external_integration_test`:\n\n* `test_deferred_download_smoke` and `test_deferred_download_two_parallel_downloads` serve fixed payloads with a known checksum. Once a run has stored them in a repository cache that outlives it, later runs get them from the cache without contacting the test server, so the test blocks forever writing to the fifo that the server would have read and times out. The payloads now contain a random suffix.\n* `test_http_timeout` depends on what the kernel does with connections beyond the listen backlog of the single-threaded test server, whose only handler never returns. Linux and macOS 15 drop them silently, so Bazel reports a connect timeout. On macOS 27, which has SYN cookies enabled by default, the handshake completes and the connection is then reset, so every download attempt fails with \"Connection reset by peer\" and \"timed out\" never appears in the log. In `timeout` mode, the server now handles every connection in its own thread so that each attempt times out reading the response.\n* Bash builds that use libintl, such as Homebrew\u0027s bash 5.3, can crash with SIGSEGV in a forked subshell when they restore their own locale after a temporary assignment such as `LC_ALL\u003dC cmd`, since libintl then looks up the preferred languages through CoreFoundation, which isn\u0027t fork-safe. This happens in the `timestamp` function of `unittest.bash`, which then fails the test without any output before `set_up` runs, and in the same way in `generate-xml.sh`. Both now set `LC_ALL` via `env`, which leaves the locale of bash itself untouched.\n\n### Motivation\n\nAll three fail locally on macOS 27 with `--test_env\u003dREPOSITORY_CACHE\u003d$(bazel info repository_cache)`: the first two tests every time, the bash crash intermittently. In a stress test, 4 of 48 Homebrew bash processes crashed in every subshell that ran `LC_ALL\u003dC python3 -c pass` in a function, and none did with `env LC_ALL\u003dC`. CI wipes the repository cache before every job, so there the deferred download tests can only hang when a flaky attempt is retried within the same job.\n\n### Build API Changes\n\nNo\n\n### Release Notes\n\nRELNOTES: None\n\nCloses #32056\n\nCOPYBARA_INTEGRATE_REVIEW\u003dhttps://github.com/bazelbuild/bazel/pull/32056 from fmeum:fix-local-external-test-failures 70c6cdbd450bf2ab16101922009ba5ab2ea950d9\nPiperOrigin-RevId: 1007393679\nChange-Id: Ib62aabbc5ad716a4650af643af7c4136c9cff56f\n"
    },
    {
      "commit": "a12fee9956e5e073ede9c32f2ee6bf21f0c83162",
      "tree": "363c9cf569327ca265e96851936ed9db28ca7de0",
      "parents": [
        "09a6f4abdfb0c9cb7746c6037b47a0eacb1d0766"
      ],
      "author": {
        "name": "Fabian Meumertzheim",
        "email": "fabian@meumertzhe.im",
        "time": "Mon Oct 26 10:39:37 2026 -0700"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Mon Oct 26 10:41:39 2026 -0700"
      },
      "message": "Speed up one_version\u0027s check for R inner classes (#32051)\n\n### Description\n\n`one_version` skips Android `R` inner classes by checking `absl::StrContains(name, \"/R$\")`. Like any `std::string_view::find`, this calls `memchr` for the needle\u0027s first character and compares the whole needle at each hit, so it calls `memchr` once for every `/` in a class name. It now searches for `R` instead and checks the characters around it. `R` is the rarest of the three characters in class names: the 322k class names below contain 4.5 `/`, 0.56 `$` and 0.17 `R` per name on average.\n\nThe result is the same: the reports are byte-identical on the inputs below, and both checks agree on all 322k class names plus edge cases. Checking only the first `$` or only the characters after the last `/` wasn\u0027t measurably faster end to end, but would change the result for package names that contain `$` or start with `R$`.\n\n### Motivation\n\nFaster `one_version` actions with both the current java_tools toolchains and the hermetic LLVM ones proposed in #32040. Mean wall time in ms, before → after:\n\n| Input | macOS arm64, Xcode | Linux arm64, gcc + glibc | Linux arm64, hermetic LLVM + musl + mimalloc |\n|---|---|---|---|\n| The 7 `one_version` actions of `//src:java_tools_zip` | 38.1 → 38.1 | 7.3 → 6.7 | 7.0 → 6.5 |\n| 121 jars with 35 violations | 11.1 → 10.4 | 3.4 → 2.8 | 4.3 → 3.9 |\n| 329 jars with 322k classes | 122.0 → 111.8 | 107.2 → 98.7 | 78.9 → 70.5 |\n\n### Build API Changes\n\nNo\n\n### Release Notes\n\nRELNOTES: None\n\nCloses #32051\n\nCOPYBARA_INTEGRATE_REVIEW\u003dhttps://github.com/bazelbuild/bazel/pull/32051 from fmeum:one-version-cheaper-r-check d8e5368adfaaa374092c7fc674bbd145b2cc386e\nPiperOrigin-RevId: 1007386186\nChange-Id: Ibbf9508120f1756110605cf1422df4fc614b2505\n"
    },
    {
      "commit": "09a6f4abdfb0c9cb7746c6037b47a0eacb1d0766",
      "tree": "f1d91989a970cad79fdf6675b5eb5aa1049e18e7",
      "parents": [
        "a3afa5a457c695d06726334c1adb5fc8a7f1d827"
      ],
      "author": {
        "name": "twerth",
        "email": "twerth@google.com",
        "time": "Mon Oct 26 10:36:40 2026 -0700"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Mon Oct 26 10:39:37 2026 -0700"
      },
      "message": "Modularize \u0027runtime/commands:commands\u0027 by extracting RunCommandLine and NoTestsFound.\n\nDecompose monolithic \u0027commands:commands\u0027 target by extracting command execution helpers into dedicated libraries while maintaining backward-compatible export shims.\n\nPiperOrigin-RevId: 1007384208\nChange-Id: Ib032633b046fa0b37ddae388189f9836c7a96ad4\n"
    },
    {
      "commit": "a3afa5a457c695d06726334c1adb5fc8a7f1d827",
      "tree": "a7d021e2b74b58212862e496d054db5e75420581",
      "parents": [
        "06d3beb684cde7c4100c6ac6afbd11a4f6a96c08"
      ],
      "author": {
        "name": "David Zbarsky",
        "email": "dzbarsky@gmail.com",
        "time": "Mon Oct 26 10:35:32 2026 -0700"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Mon Oct 26 10:37:07 2026 -0700"
      },
      "message": "Reuse the runfiles parent buffer and avoid empty iterators (#32069)\n\nRunfiles.filterListForObscuringSymlinks reuses its ArrayList of parents across entries and clears it before checking each entry, including after an early obstruction. Adding parents by index avoids allocating an iterator for empty lists.\n\nIn the original 65,536-shared-file fixture, allocation fell from 31 to 24 MiB per mapping. Median time for 512 tests with 20,000 shared files fell from 5.783 to 5.306 s; 34 RunfilesTest and SourceManifestActionTest cases passed. This commit contains the complete original two-commit change and passes git diff --check upstream.\n\n@fmeum\n\nCloses #32069\n\nCOPYBARA_INTEGRATE_REVIEW\u003dhttps://github.com/bazelbuild/bazel/pull/32069 from dzbarsky:dzbarsky/upstream-bazel-146 8afd99dc10ba765c8e89d709aa163ba7e6be7bb8\nPiperOrigin-RevId: 1007383463\nChange-Id: Ia82138c5637761ae985d90396939530ee227d3f0\n"
    },
    {
      "commit": "06d3beb684cde7c4100c6ac6afbd11a4f6a96c08",
      "tree": "5f781e1cda1fce0c9524cd3aaae5b86911d5f7ea",
      "parents": [
        "1f8fd2c8ec05ed45c2cd9014f60064b365d7e14e"
      ],
      "author": {
        "name": "plf",
        "email": "plf@google.com",
        "time": "Mon Oct 26 10:24:10 2026 -0700"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Mon Oct 26 10:25:54 2026 -0700"
      },
      "message": "Remove unused PlatformConfigurationProvider.resolveMnemonic.\n\nIt has no callers. It also computed mnemonics against the top-level baseline with only the platform replaced, i.e. without the platform\u0027s mappings, so it could disagree with the mnemonic that `BuildConfigurationFunction` computes.\n\nRELNOTES:none\nPiperOrigin-RevId: 1007375576\nChange-Id: Id907ea6d39cb4c191a006a85f568f48bec354d1b\n"
    },
    {
      "commit": "1f8fd2c8ec05ed45c2cd9014f60064b365d7e14e",
      "tree": "80283f50a567c109ba252122fc1d473db112b6f1",
      "parents": [
        "3d8f9fed2b8052193a92ee08db40e33c86c2491d"
      ],
      "author": {
        "name": "tjgq",
        "email": "tjgq@google.com",
        "time": "Mon Oct 26 10:22:36 2026 -0700"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Mon Oct 26 10:23:55 2026 -0700"
      },
      "message": "Correctly presize HashMaps.\n\n`new HashMap(size)` allocates a capacity of `size`, so the map will grow once the default load factor of 0.75 is reached. `HashMap.newHashMap(size)` ensures no growth is required to accommodate `size` mappings.\n\nPiperOrigin-RevId: 1007374524\nChange-Id: Ie729dba7c70ad211ca5daedfc164d953f49406d6\n"
    },
    {
      "commit": "3d8f9fed2b8052193a92ee08db40e33c86c2491d",
      "tree": "a5d69eea8d611b15c64e0b48d7630dce33365142",
      "parents": [
        "c28d26767ef0d265dcbb2190ece7e768211232e1"
      ],
      "author": {
        "name": "Son Luong Ngoc",
        "email": "sluongng@gmail.com",
        "time": "Mon Oct 26 09:58:53 2026 -0700"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Mon Oct 26 10:00:17 2026 -0700"
      },
      "message": "remote: avoid tiny zstd upload blocks (#31528)\n\n### Description\n\nBazel\u0027s zstd upload adapter uses a 512-byte pipe and flushes after\nat most 491 source bytes. This forces short compressed blocks and\nadds encoding and pipe overhead.\n\nReplace the pipe with a reusable 16 KiB input buffer and a bounded\noutput collector. Let zstd choose when to emit blocks, drain that\noutput before reading more input, and finish the frame at EOF. Keep\nsource cleanup and retries from an uncompressed resume offset unchanged.\n\nLimit each upload chunk to eight compressed reads, plus EOF lookahead.\nThis avoids reading a large, highly compressible blob just to fill\none chunk before checking upload readiness. Returning partly filled\nchunks can add WriteRequest messages for such inputs.\n\nTwo matched benchmarks compare this change with the old implementation.\nThe tables show medians; change is (after / before - 1) * 100.\n\nThe compression-and-chunking benchmark uses 1,348 historical source\ninputs totaling 35,742,901 raw bytes, with zstd-jni 1.5.6-9 at level 3:\n\n    Metric                         Before       After Change %\n    ------------------------- ----------- ----------- --------\n    Encoded bytes              10,429,640   7,893,477   -24.3%\n    Elapsed time, ms              170.257      74.355   -56.3%\n    Thread CPU, ms                169.217      73.350   -56.7%\n    Java allocation, MB           250.704     254.813    +1.6%\n\nEach arm uses three JVMs, with seven measured rounds after two warmups\nper JVM. Times cover resident inputs, normalized to one encoding per\ninput, and include compressor creation, encoding, chunking and cleanup.\nThey exclude loading and verification. This uses JDK 27 on a shared AMD\nRyzen AI MAX+ 395 host; MB is decimal. One-shot compression produces\n7,899,530 bytes as a control, not as a bounded streaming fix.\n\nThe end-to-end benchmark builds //src:bazel from the same fixed\nsource with the before and after clients. Each run starts with a fresh\noutput base, empty remote blob/action caches and fresh executor file\ncache. Disk cache is disabled; repository download/content caches\nand image layers are warm.  A local BuildBuddy server and executor\n(cbc28103a282) run on the same shared host, using a pinned Ubuntu\n24.04/GCC 13.3 image. Both clients embed JDK 26.0.1. Builds use 32\njobs; the executor advertises 16 CPUs.\n\n    Build metric                   Before       After Change %\n    ------------------------- ----------- ----------- --------\n    Command wall, s               517.537     516.352    -0.2%\n    Client CPU, s                 224.269     205.670    -8.3%\n    Client peak memory, MiB     3,437.117   3,378.918    -1.7%\n    Upload payload, bytes     571,625,818 535,215,489    -6.4%\n    Same-blob payload, bytes  568,918,992 528,362,873    -7.1%\n    WriteRequest messages         117,089     115,263    -1.6%\n\nThere are three runs per arm, ordered before/after, after/before, then\nbefore/after. All six request the same 4,699 remote action digests\nand produce identical binaries, with no remote/disk cache hits,\nunexpected RPC failures or retries. Paired wall changes are -4.6%,\n-3.5% and +3.7%.  Median wall time is essentially flat; these runs\ndo not establish a build-speed improvement.\n\nUpload bytes count client Write payload, excluding network framing\nand executor transfers. Uploaded sets differ slightly, so the\nsame-blob row compares only the 51,539 compressed blobs uploaded\nin every run (918,011,952 raw bytes). Most small blobs still fit in\none message, so message count falls less than payload bytes in this\nbuild. Client CPU includes the batch JVM and waited local children,\nnot server/executor CPU or encode-only work. Peak memory is the largest\nprocess resident-memory high-water mark, not the sum across processes.\n\nThe tradeoff is more retained memory per compressor. Including the\nunchanged JNI destination array, Java buffer payload rises from about\n129.0 KiB to 160.5 KiB initially, and to 272.5 KiB at the collector\ncapacity observed for incompressible inputs: 31.5-143.5 KiB extra per\nstream. These observed capacities are not strict maxima. They exclude\nobjects, native zstd memory, upload messages and transient growth.\nBuffering remains independent of blob size; generated 64 and 512\nMiB inputs complete under a 32 MiB Java heap. Lower measured process\nmemory does not negate the higher per-stream cost.\n\nAt 10,000 initialized compressors, the observed larger-capacity case\nadds about 1.37 GiB of Java-array payload, not a total-memory bound.\nJobs limit actions, not blob fanout; asynchronous uploads can outlive\njob slots. RPC slots do not cap compressors retained during retry\nbackoff, so those limits alone do not bound total compressor memory.\n\n### Motivation\n\nReduce compressed upload size and client encoding work without buffering whole blobs.\n\n### Build API Changes\n\nNo.\n\n### Checklist\n\n- [x] I have added tests for the new use cases.\n- [x] Documentation is not applicable (no setup or API changes).\n\n### Release Notes\n\nRELNOTES: Reduce zstd-compressed remote upload size and encoding overhead.\n\nCloses #31528\n\nCOPYBARA_INTEGRATE_REVIEW\u003dhttps://github.com/bazelbuild/bazel/pull/31528 from sluongng:sluongng/zstd-streaming-upload-perf 87009db24809f51f9c12b53a555dfa96751a594e\nPiperOrigin-RevId: 1007356225\nChange-Id: I695120fa944ea95d83ae25ac7e1da07557fbf8b0\n"
    },
    {
      "commit": "c28d26767ef0d265dcbb2190ece7e768211232e1",
      "tree": "fa83cc7d75b36c78a2a775e883b7513c4626640f",
      "parents": [
        "be5a5326e326a92e1db1550ceca2fdee371370a9"
      ],
      "author": {
        "name": "twerth",
        "email": "twerth@google.com",
        "time": "Mon Oct 26 09:39:03 2026 -0700"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Mon Oct 26 09:40:23 2026 -0700"
      },
      "message": "Modularize \u0027packages:packages\u0027 by extracting Starlark environment and aspect propagation targets.\n\nCarve out BazelStarlarkEnvironment, StarlarkGlobals, AspectPropagationEdgesSupplier, and AttributeValueSource into dedicated libraries with backward-compatible export shims.\n\nPiperOrigin-RevId: 1007342297\nChange-Id: I94189c844710c39675117305d7e8ba65b283e385\n"
    },
    {
      "commit": "be5a5326e326a92e1db1550ceca2fdee371370a9",
      "tree": "0b22d620ff6a7c1d44018253414813b135c03e08",
      "parents": [
        "d62e90b8140bd347f1b1a71155148f5b3e861e59"
      ],
      "author": {
        "name": "Fabian Meumertzheim",
        "email": "fabian@meumertzhe.im",
        "time": "Mon Oct 26 08:59:47 2026 -0700"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Mon Oct 26 09:00:58 2026 -0700"
      },
      "message": "Validate a missing repo mapping like it was recorded by a repo rule (#31516)\n\n### Description\n\n`RecordedRepoMapping.getValue` now reports a mapping to a non-visible repo as `null`, which is what `Label()` in a repo rule records for an apparent repo name that isn\u0027t mapped. `RepositoryMapping#get` never returns `null`, so the value was previously the apparent name.\n\n### Motivation\n\nA repo rule that constructs a `Label` with an unmapped apparent repo name, e.g. for an optional dependency, recorded `REPO_MAPPING:,optional_missing \\0` but validated it as `optional_missing`, so neither its marker file nor its remote repo contents cache entry was ever up to date and the repo was fetched again by every server and every fresh output base. Reported in https://github.com/bazelbuild/bazel/pull/31452#issuecomment-5971363627.\n\nWork towards #31456\n\n### Build API Changes\n\nNo\n\n### Release Notes\n\nRELNOTES: None\n\nCloses #31516\n\nCOPYBARA_INTEGRATE_REVIEW\u003dhttps://github.com/bazelbuild/bazel/pull/31516 from fmeum:rrcc-missing-repo-mapping-value d960e2fac7430725013f2955e8b35c9382785d31\nPiperOrigin-RevId: 1007317635\nChange-Id: Ifd41cd6145d503aa6728de0853d284e223f41f38\n"
    },
    {
      "commit": "d62e90b8140bd347f1b1a71155148f5b3e861e59",
      "tree": "41a26637954a432520753391f3acbb4ef5a8a673",
      "parents": [
        "75cefd2c1daf4b4f328d22b9c5075136aab0d97b"
      ],
      "author": {
        "name": "twerth",
        "email": "twerth@google.com",
        "time": "Mon Oct 26 08:47:34 2026 -0700"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Mon Oct 26 08:48:54 2026 -0700"
      },
      "message": "Modularize \u0027packages:packages\u0027 by extracting leaf utility and restriction libraries.\n\nDecompose monolithic \u0027packages:packages\u0027 further by carving out decoupled leaf targets (syntax checkers, resolvers, allowlists, and globals) into dedicated libraries, preserving backward compatibility through temporary export shims.\n\nPiperOrigin-RevId: 1007309495\nChange-Id: Ie48b74b3ef20936d3b461c6a7d6600ae5addde1c\n"
    },
    {
      "commit": "75cefd2c1daf4b4f328d22b9c5075136aab0d97b",
      "tree": "3bf678d94197eb83f378b187bd84587dedb54fb8",
      "parents": [
        "05d1592af5bf6cc7978c2f8c0d20ec2f6e8471d2"
      ],
      "author": {
        "name": "jhorvitz",
        "email": "jhorvitz@google.com",
        "time": "Mon Oct 26 08:40:31 2026 -0700"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Mon Oct 26 08:42:22 2026 -0700"
      },
      "message": "Add `--extra_default_output_groups`.\n\nOutput groups listed in this flag are treated as part of the default set: they are automatically dropped when an unprefixed `--output_groups` overrides the defaults. This provides a mechanism to add extra output groups in blazerc while still dropping them when `--output_groups` is passed manually (with no `+`).\n\n`--extra_default_output_groups` are automatically added to `--hide_output_group_results`.\n\nPiperOrigin-RevId: 1007305118\nChange-Id: Ic35f21e4f92764be922ea0ec25b7c4bc46ca1b2e\n"
    },
    {
      "commit": "05d1592af5bf6cc7978c2f8c0d20ec2f6e8471d2",
      "tree": "34d1b1c99ecbb2cf665c5c7b3e97df1f00cff6f0",
      "parents": [
        "8e95bd49dd21866c3497658152f71cad41ce10b8"
      ],
      "author": {
        "name": "Showta Ishizaki",
        "email": "zakinko@snowrabbit.org",
        "time": "Mon Oct 26 08:37:09 2026 -0700"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Mon Oct 26 08:38:18 2026 -0700"
      },
      "message": "Do not replace /dev/null with a regular file in WriteFile (#31038)\n\nWriteFile unlinks its target before creating it with O_CREAT. The unlink is\nthere so a running executable can be replaced, since you cannot open one with\nO_TRUNC; it has been in the function since the first import, when WriteFile\u0027s\njob was to write executables: the open used mode 0755 and the comment said so.\n\n`//src/test/cpp/util:file_test` writes to /dev/null, in TestWriteFile and again\nwith a four-gigabyte NUL-filled buffer in TestLargeFileWrite. As an ordinary\nuser the unlink fails and the write reaches the device, so nothing happens.\nAs root it succeeds and the node becomes a regular file.\n\nOn GitHub\u0027s ubuntu-latest runner, where /dev is devtmpfs, at 870abbbd,\nrunning the test as root:\n\n    before   /dev/null  character special file  crw-rw-rw-  1:3\n    //src/test/cpp/util:file_test    PASSED\n    after    /dev/null  regular file            -rw-r--r--  0:0  size\u003d215\n\nDebian 13 in a container and NetBSD 11.0/amd64 do the same. On NetBSD,\npolling once a second while TestLargeFileWrite runs:\n\n    t\u003d7  Character Device  size\u003d0\n    t\u003d8  Regular File      size\u003d4000000000\n    t\u003d9  Regular File      size\u003d0\n\n/dev holds a four-gigabyte file for about a second, until the next thing that\nredirects to /dev/null truncates it.\n\nWhat follows the missing device is harder to find than the device itself:\n`2\u003e/dev/null` becomes a write, and the next program to read /dev/null gets\nwhatever was left there.\n\nfile_windows.cc already returns early for /dev/null. This is the same three\nlines on the POSIX side. The POSIX test then writes to /dev/null and checks\nthat it is still a device: as an ordinary user that cannot fail, and as root\nit fails there instead of quietly corrupting everything that runs after it.\n\n    without the change, as root   file_posix_test.cc:336  Expected: true   FAILED\n    with the change, as root      PASSED, /dev/null still 1:3\n\nfile_test passes as an ordinary user on ubuntu-latest, macos-latest and\nwindows-latest (the Windows build does not compile either file touched here).\nThe tests that fail as root do so before and after alike:\nFilePosixTest.CanAccess and FileTest.TestRemoveRecursivelyPosix.\n\nCloses #31038\n\nCOPYBARA_INTEGRATE_REVIEW\u003dhttps://github.com/bazelbuild/bazel/pull/31038 from zakinko:devnull-unlink 387d25a62bacb37fe62dd69b59d2af2aac450fb5\nPiperOrigin-RevId: 1007302902\nChange-Id: I8330d24a86a55799473113849ff10b0f327d928f\n"
    },
    {
      "commit": "8e95bd49dd21866c3497658152f71cad41ce10b8",
      "tree": "b8074f43557c4757417f05dc2686ce6cbc487371",
      "parents": [
        "e02771bfc26eb9af50d6e7aeeda8bb4bdf949876"
      ],
      "author": {
        "name": "tjgq",
        "email": "tjgq@google.com",
        "time": "Mon Oct 26 07:30:18 2026 -0700"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Mon Oct 26 07:31:27 2026 -0700"
      },
      "message": "Reuse scratch buffer in MetadataDigestUtils#fromMetadata and ActionCache.Entry.Builder#computeMapDigest.\n\nPiperOrigin-RevId: 1007263843\nChange-Id: I9612102683d692e7d6ca60871922f6105244fd38\n"
    },
    {
      "commit": "e02771bfc26eb9af50d6e7aeeda8bb4bdf949876",
      "tree": "fd95d9617d2df035590e81bed67a097b2fdd0685",
      "parents": [
        "b8768c615e0a505114c2cf209183843dbc832075"
      ],
      "author": {
        "name": "Googler",
        "email": "noreply@google.com",
        "time": "Mon Oct 26 06:47:03 2026 -0700"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Mon Oct 26 06:48:48 2026 -0700"
      },
      "message": "Restrict CcStarlarkInternal.absoluteSymlink to configured FDO and Propeller paths.\n\n`CcStarlarkInternal.absoluteSymlink` (`cc_common.absolute_symlink`) is only used by C++ toolchain FDO and Propeller profile rules (`fdo_context.bzl`) to create symlinks to profile paths configured in `CppConfiguration` (`fdo_path()`, `cs_fdo_path()`, `propeller_optimize_absolute_cc_profile()`, and `propeller_optimize_absolute_ld_profile()`). However, because `cc_common.absolute_symlink` only checked the package allowlist (`//third_party/bazel_rules/rules_cc/...`), any Starlark file under `rules_cc` could call `cc_common.absolute_symlink` with an arbitrary `target_path` without setting any FDO command-line flags, creating symlinks to arbitrary filesystem paths that action execution follows when uploading inputs.\n\nValidate in `CcStarlarkInternal.absoluteSymlink` that `targetPath` matches one of the configured FDO or Propeller absolute profile paths on `CppConfiguration`, throwing an `EvalException` otherwise.\n\nPiperOrigin-RevId: 1007242396\nChange-Id: I938d8e4b04f0edc8bb40e6e03e98731040d7b392\n"
    },
    {
      "commit": "b8768c615e0a505114c2cf209183843dbc832075",
      "tree": "03eee51bad7e06a50487b11eb2c22ad562348b13",
      "parents": [
        "cffbcb6bc0f501550cee96b7d0d59218337b524c"
      ],
      "author": {
        "name": "twerth",
        "email": "twerth@google.com",
        "time": "Mon Oct 26 06:08:29 2026 -0700"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Mon Oct 26 06:09:33 2026 -0700"
      },
      "message": "Document include scanning header map capacity bounds in `CcCompilationContext`.\n\nClarify that the 4K and 2K upper bounds keep backing arrays under ~100 KB, safely within G1 PLAB and survivor thresholds to prevent premature Old Gen promotion.\n\nPiperOrigin-RevId: 1007224515\nChange-Id: I33172b1d50342d2f54909e0dee5847b018b65e4e\n"
    },
    {
      "commit": "cffbcb6bc0f501550cee96b7d0d59218337b524c",
      "tree": "91fc1d75b0f472f543ac2e7a95277183294e753d",
      "parents": [
        "f0d5be50701f21475f89e3719edb199c3adff183"
      ],
      "author": {
        "name": "tjgq",
        "email": "tjgq@google.com",
        "time": "Mon Oct 26 04:47:28 2026 -0700"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Mon Oct 26 04:48:45 2026 -0700"
      },
      "message": "Return String instead of char[] from FileSystemUtils.readContentsAsLatin1.\n\nOther than a test, every caller immediately converts the char[] to a String anyway (currently incurring in a byte[] -\u003e char[] -\u003e byte[] conversion).\n\nPiperOrigin-RevId: 1007188204\nChange-Id: I07a578dc2a8d09e03ed3b86e74ff09471c3b2ac0\n"
    },
    {
      "commit": "f0d5be50701f21475f89e3719edb199c3adff183",
      "tree": "dc59dc312365ea4112a1002763a8350decd2d747",
      "parents": [
        "adc59c0850a1d6a4b6cc0543eb3fbe4f9561c0b2"
      ],
      "author": {
        "name": "tjgq",
        "email": "tjgq@google.com",
        "time": "Mon Oct 26 04:42:14 2026 -0700"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Mon Oct 26 04:43:24 2026 -0700"
      },
      "message": "Avoid allocating on 1-byte writes to a RecordAlignedBufferedOutputStream.\n\nPiperOrigin-RevId: 1007186119\nChange-Id: I779205e8970419e7f581ecbeee20af2b5ca510fa\n"
    },
    {
      "commit": "adc59c0850a1d6a4b6cc0543eb3fbe4f9561c0b2",
      "tree": "88639736f50cd8d4899159b02d8efab51af8501d",
      "parents": [
        "9dffa1db02bdc9701b500c322ee85b5091fde5a7"
      ],
      "author": {
        "name": "Fabian Meumertzheim",
        "email": "fabian@buildbuddy.io",
        "time": "Mon Oct 26 03:00:47 2026 -0700"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Mon Oct 26 03:03:06 2026 -0700"
      },
      "message": "Infer the version of registry modules if omitted in `module()` (#31824)\n\n### Description\nThe version of a module fetched from a registry is already known from the registry, so it doesn\u0027t have to be repeated in its `MODULE.bazel` file. If `version` is omitted, it now defaults to the version the module is published under. A version that differs from the registry version is still an error.\n\n### Motivation\nAfter this has reached sufficiently many releases, publishing BCR modules can become easier.\n\n### Build API Changes\n\nNo\n\n### Checklist\n\n- [x] I have added tests for the new use cases (if any).\n- [x] I have updated the documentation (if applicable).\n\n### Release Notes\n\nRELNOTES: None\n\nCloses #31824\n\nCOPYBARA_INTEGRATE_REVIEW\u003dhttps://github.com/bazelbuild/bazel/pull/31824 from fmeum:ccr-dfee5640-g90koe 4f8d89e1204d3103d64e871a51a9da1fbd2b0d0f\nPiperOrigin-RevId: 1007137485\nChange-Id: I98ad5c9d92b29edbb1522db750f86e87b3797d5b\n"
    },
    {
      "commit": "9dffa1db02bdc9701b500c322ee85b5091fde5a7",
      "tree": "dac8715af19389e6a97e2029659325b953870afe",
      "parents": [
        "5c76c31625f98d3db3adb0cccebb0810371aae87"
      ],
      "author": {
        "name": "Tamir Duberstein",
        "email": "tamird@gmail.com",
        "time": "Mon Oct 26 02:59:11 2026 -0700"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Mon Oct 26 03:00:48 2026 -0700"
      },
      "message": "Guard discovery using evaluated action inputs (#31998)\n\n### Description\n\nPass the inputs evaluated for the current invocation to the input-discovery guard, together with the action\u0027s scheduling dependencies. Previously pruned inputs restored on the action are evaluated after discovery, before the execution guard protects them.\n\n### Motivation\n\nA pruning action resets its original input set, while ActionExecutionFunction initially evaluates only inputs restored from its action cache. After a rewind switches the synchronizer to fine-grained locks, discovery can therefore try to expand a pruned runfiles tree whose metadata has not been requested. This crashes in RemoteRewoundActionSynchronizer.lockKeysFor, as observed while rebuilding a kernel with remote caching [1]. The existing metadata invariant remains enforced.\n\nThe crash stack from [1]:\n\n```text\njava.lang.RuntimeException: Unrecoverable error while evaluating node \u0027ActionLookupData{actionLookupKey\u003dActionTemplateExpansionKey{actionLookupKey\u003dConfiguredTargetKey{label\u003d//test/kernel:kernel_6_6_build, config\u003dBuildConfigurationKey[0358dac2367b24cc5bcd0c1c1892392ded9fb1c9afaef15f1292bc073297b5a5]}, actionIndex\u003d148}, actionIndex\u003d36}\u0027 (requested by nodes \u0027File:[[\u003cexecution_root\u003e]bazel-out/x86_64-unknown-linux-musl-fastbuild/bin]test/kernel/kernel_6_6_build.scans3\u0027)\n\tat com.google.devtools.build.skyframe.AbstractParallelEvaluator$Evaluate.runCore(AbstractParallelEvaluator.java:555)\n\tat com.google.devtools.build.lib.concurrent.QuiescingTask.exec(QuiescingTask.java:78)\n\tat java.base/java.util.concurrent.ForkJoinTask.doExec(Unknown Source)\n\tat java.base/java.util.concurrent.ForkJoinPool$WorkQueue.topLevelExec(Unknown Source)\n\tat java.base/java.util.concurrent.ForkJoinPool.runWorker(Unknown Source)\n\tat java.base/java.util.concurrent.ForkJoinWorkerThread.run(Unknown Source)\nCaused by: java.lang.NullPointerException: File:[[\u003cexecution_root\u003e]bazel-out/rbe_x86_64_linux-opt-exec/bin]external/pahole+/pahole.runfiles\n\tat com.google.common.base.Preconditions.checkNotNull(Preconditions.java:975)\n\tat com.google.devtools.build.lib.remote.RemoteRewoundActionSynchronizer.lockKeysFor(RemoteRewoundActionSynchronizer.java:411)\n\tat com.google.devtools.build.lib.remote.RemoteRewoundActionSynchronizer.lambda$inputKeysFor$0(RemoteRewoundActionSynchronizer.java:395)\n\tat com.google.common.collect.Iterators$6.transform(Iterators.java:830)\n\tat com.google.common.collect.TransformedIterator.next(TransformedIterator.java:51)\n\tat com.google.common.collect.TransformedIterator.next(TransformedIterator.java:51)\n\tat com.google.common.collect.Iterators$ConcatenatedIterator.hasNext(Iterators.java:1421)\n\tat com.github.benmanes.caffeine.cache.LocalLoadingCache.loadSequentially(LocalLoadingCache.java:72)\n\tat com.github.benmanes.caffeine.cache.LocalLoadingCache.getAll(LocalLoadingCache.java:65)\n\tat com.google.devtools.build.lib.remote.RemoteRewoundActionSynchronizer.lockArtifactsForConsumption(RemoteRewoundActionSynchronizer.java:369)\n\tat com.google.devtools.build.lib.remote.RemoteRewoundActionSynchronizer.enterInputDiscovery(RemoteRewoundActionSynchronizer.java:288)\n\tat com.google.devtools.build.lib.skyframe.SkyframeActionExecutor.discoverInputs(SkyframeActionExecutor.java:1064)\n\tat com.google.devtools.build.lib.skyframe.ActionExecutionFunction.checkCacheAndExecuteIfNeeded(ActionExecutionFunction.java:778)\n\tat com.google.devtools.build.lib.skyframe.ActionExecutionFunction.computeInternal(ActionExecutionFunction.java:355)\n\tat com.google.devtools.build.lib.skyframe.ActionExecutionFunction.compute(ActionExecutionFunction.java:207)\n\tat com.google.devtools.build.skyframe.AbstractParallelEvaluator$Evaluate.runCore(AbstractParallelEvaluator.java:474)\n\t... 5 more\n```\n\nThe regression uses ordinary unused_inputs_list, a declared tool with an unused runfiles tree, a changed source, and an evicted remote blob. It forces rewinding before rediscovery and checks recovery with and without a disk cache. The existing synchronizer test continues to verify scheduling-dependency producer protection independently of the passed input set.\n\n### Build API Changes\n\nNo\n\n### Checklist\n\n- [x] I have added tests for the new use cases.\n- [x] I have updated the input-discovery contract and synchronization proof.\n\n### Release Notes\n\nRELNOTES: Fix a crash when input pruning and remote action rewinding interact with runfiles trees.\n\n[1]: https://github.com/aya-rs/aya/actions/runs/39850538176/job/120075173645\n\nWritten and submitted by Codex on behalf of Tamir Duberstein.\n\nCloses #31998\n\nCOPYBARA_INTEGRATE_REVIEW\u003dhttps://github.com/bazelbuild/bazel/pull/31998 from tamird:codex/pruned-input-discovery-locks 4244111d58f0a07584ccf3d4a1c52925d747c18b\nPiperOrigin-RevId: 1007136610\nChange-Id: I8bd94abad3244e72861b1cc1200452e6830d3000\n"
    },
    {
      "commit": "5c76c31625f98d3db3adb0cccebb0810371aae87",
      "tree": "2ca15412750ac537a871a9c7847a1c8eba1dcef6",
      "parents": [
        "b76654bb2e438be5ae9a8d6d5e2d3f1ae8690ffb"
      ],
      "author": {
        "name": "David Zbarsky",
        "email": "dzbarsky@gmail.com",
        "time": "Mon Oct 26 02:50:26 2026 -0700"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Mon Oct 26 02:51:31 2026 -0700"
      },
      "message": "Unescape recorded repository inputs before parsing (#31728)\n\nUnescape recorded repository-input keys before `RepoRecordedInput` parses them. Restoring a repository contents cache entry now correctly reads watched file and directory names containing escaped separators, so changes to those inputs invalidate the repository.\n\nCloses #31728\n\nCOPYBARA_INTEGRATE_REVIEW\u003dhttps://github.com/bazelbuild/bazel/pull/31728 from dzbarsky:codex/bazel-pr107-upstream 762f80840cc4f35696acf0553bed87f5d3de03e5\nPiperOrigin-RevId: 1007132689\nChange-Id: Iab99e8aaa5621b3a2c6d313fa28e3ea35a1e1ee5\n"
    },
    {
      "commit": "b76654bb2e438be5ae9a8d6d5e2d3f1ae8690ffb",
      "tree": "39d88a111863d477dc368f10e33d6e222c983a51",
      "parents": [
        "999632c2e8724d2a05fdbbd7b00bc421338072ce"
      ],
      "author": {
        "name": "cushon",
        "email": "cushon@google.com",
        "time": "Mon Oct 26 02:33:48 2026 -0700"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Mon Oct 26 02:35:10 2026 -0700"
      },
      "message": "Guard passing --output_root_relative_path to Turbine behind a flag.\n\nReplace `JavaSemantics.turbineOutputRootRelativePath()` with `--experimental_turbine_output_root_relative_path` (defaulting to `false`), so passing `--output_root_relative_path` to Turbine in `JavaHeaderCompileAction` can be enabled explicitly when the toolchain\u0027s Turbine binary supports the flag (https://github.com/bazelbuild/bazel/pull/31597).\n\nPiperOrigin-RevId: 1007124709\nChange-Id: Icf5d8183f722b4432316a3f2c51c829f7d4b4f95\n"
    },
    {
      "commit": "999632c2e8724d2a05fdbbd7b00bc421338072ce",
      "tree": "7a480b625f4435dfd95a788660cd81028f923af1",
      "parents": [
        "a5c50fcb65841b505ec72840d83381a704e70afa"
      ],
      "author": {
        "name": "shahan",
        "email": "shahan@google.com",
        "time": "Sun Oct 25 22:52:25 2026 -0700"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Sun Oct 25 22:53:45 2026 -0700"
      },
      "message": "Update LambdaCodec to avoid Unsafe usage.\n\nPiperOrigin-RevId: 1007024113\nChange-Id: I5884888b40575000a2ce3de8035f72ebd8ba4c48\n"
    },
    {
      "commit": "a5c50fcb65841b505ec72840d83381a704e70afa",
      "tree": "bd53ef1493186895db7207302aef79e837d9478e",
      "parents": [
        "48d6db7602819e66cfddffa510aef86351e45044"
      ],
      "author": {
        "name": "Googler",
        "email": "noreply@google.com",
        "time": "Sat Oct 24 08:33:46 2026 -0700"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Sat Oct 24 08:35:14 2026 -0700"
      },
      "message": "Override TopLevelAspectsKey.toString() to show aspect details.\n\nPreviously `TopLevelAspectsKey` inherited the default `toString()` implementation, so crash messages and debug logs only showed an identity hash instead of the aspect classes, target, and parameters.\n\nPiperOrigin-RevId: 1006309156\nChange-Id: Ie9a52c2b83d56b01d7d99ec028ab715a133dd476\n"
    },
    {
      "commit": "48d6db7602819e66cfddffa510aef86351e45044",
      "tree": "18aade9ccfb044704a3d474bc4c82c3bc7a1f509",
      "parents": [
        "178308eeb67d92d7387ad114177aed659e75c781"
      ],
      "author": {
        "name": "trybka",
        "email": "trybka@google.com",
        "time": "Fri Oct 23 22:27:25 2026 -0700"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Fri Oct 23 22:28:31 2026 -0700"
      },
      "message": "Restrict private builtins cc_common APIs to rules_cc.\n\nThe builtins `cc_common` wrappers for private APIs (`check_experimental_cc_shared_library`, `incompatible_disable_objc_library_transition`, `add_go_exec_groups_to_binary_rules`, `get_tool_requirement_for_action`, `implementation_deps_allowed_by_allowlist`, `register_swig_action`) were gated by `PRIVATE_STARLARKIFICATION_ALLOWLIST`, a broad list covering Android, Apple, Go, Java, protobuf, Rust, Python, and other rule sets. In practice the only remaining callers are in rules_cc, which reaches the native `cc_common` through rules_impl/native_cc_common.bzl and enforces its own allowlist in cc/private/visibility.bzl.\n\nRemove `PRIVATE_STARLARKIFICATION_ALLOWLIST` from cc_helper_internal.bzl and gate these APIs in both the Blaze (cc_common.bzl) and Bazel (cc_common_bazel.bzl) flavors with a rules_cc-only list, shared with `internal_DO_NOT_USE`.\n\nPiperOrigin-RevId: 1006104177\nChange-Id: I1761503297722b2a51d87a2b6cd526f90b6a1dad\n"
    },
    {
      "commit": "178308eeb67d92d7387ad114177aed659e75c781",
      "tree": "edfceb6b9a3dc7df6e91162576e4509524d42094",
      "parents": [
        "2084c45a3d7a782cbb480f364862174e2fd39333"
      ],
      "author": {
        "name": "arostovtsev",
        "email": "arostovtsev@google.com",
        "time": "Fri Oct 23 21:54:11 2026 -0700"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Fri Oct 23 21:55:28 2026 -0700"
      },
      "message": "Avoid retaining `TypeTable` in non-toplevel `StarlarkFunction`s\n\nOnce static type checking and toplevel evaluation of a .bzl file are complete, most of the data in `TypeTable` is no longer needed. Previously, every `StarlarkFunction` retained a reference to its file\u0027s `TypeTable`, keeping the entire `TypeTable` alive.\n\nInstead, have `StarlarkFunction` store a shared array of function types for the current module (indexed by function ID) which we extract from the type table. (Strictly speaking, a `StarlarkFunction` needs to know only the type of itself and of the nested functions that it declares; but storing the entire array - as long as the array instance is shared by all functions in the module - results in simpler code, and wastes almost no memory in practice, as measured by benchmarks on large builds.) We still need to store `TypeTable` for `\u003ctoplevel\u003e` and `\u003cexpr\u003e` `StarlarkFunction`-s, but the toplevel `StarlarkFunction`-s are temporaries, and will get GC-ed after toplevel evaluation.\n\nAlso, take the opportunity to lazily initialize `TypeTable.typeConstructors` and `TypeTable.errors`.\n\nContinuing to work towards minimizing the memory impact of enabling static type checking by default.\n\nWorking towards #27370\n\nPiperOrigin-RevId: 1006090973\nChange-Id: I556e0f600db1a4ac9aaaebae370107beafd83248\n"
    },
    {
      "commit": "2084c45a3d7a782cbb480f364862174e2fd39333",
      "tree": "5d9f2f80755801da4098747616897f772ef46233",
      "parents": [
        "a1ec46d7f7bb58eee59bdf5730ad5693186fd4cc"
      ],
      "author": {
        "name": "shahan",
        "email": "shahan@google.com",
        "time": "Fri Oct 23 16:28:21 2026 -0700"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Fri Oct 23 16:29:22 2026 -0700"
      },
      "message": "Move upload layout computation into UploadLayout, formerly SelectionPartition.\n\nPure refactoring; no behavior change.\n\nFileOpNodeMemoizingLookup.computeLeafIdsAndUploadOrder produced two results from\none walk: dense leaf IDs, computed by the private NodeGraphLayout, and the\nupload order, computed by SelectionPartition. Moves the method, its\nDenseLeafIdsAndUploadOrder result and NodeGraphLayout into SelectionPartition,\nso that the whole layout lives in one class and FileOpNodeMemoizingLookup goes\nback to only materializing nodes.\n\nSince the class now assigns leaf IDs as well as partitioning the selection, it\nis renamed to UploadLayout, and its test to UploadLayoutTest.\n\n- UploadLayout.computeLeafIdsAndUploadOrder is static and takes the lookup,\n  whose isSkipped and resolvedNode become package-private.\n- The computeLeafIdsAndUploadOrder tests stay in FileOpNodeMemoizingLookupTest,\n  which has the build fixture they need, and only change their call site.\n\nPiperOrigin-RevId: 1005947594\nChange-Id: I596d781841be1ab599a6de8253fc1c60f0571e0e\n"
    },
    {
      "commit": "a1ec46d7f7bb58eee59bdf5730ad5693186fd4cc",
      "tree": "7fac07e9cd3f7a8a8411dfcdb9a90a3a576b3963",
      "parents": [
        "c6cc07f481b2f401dbfd53f5414786dbc1215f8d"
      ],
      "author": {
        "name": "shahan",
        "email": "shahan@google.com",
        "time": "Fri Oct 23 15:58:09 2026 -0700"
      },
      "committer": {
        "name": "Copybara-Service",
        "email": "copybara-worker@google.com",
        "time": "Fri Oct 23 15:59:45 2026 -0700"
      },
      "message": "Report Skycache sync upload phase timings in BuildMetrics.\n\nFrontierSerializer logs how a synchronous upload\u0027s wall time splits across\nmaterializing the node graph, computing leaf IDs and upload order, driving\nuploads, and awaiting writes. This also records those timings in a new\nBuildMetrics.RemoteAnalysisCacheStatistics.UploadPhaseTimings message, so they\nreach the Build Event Protocol and, through BuildMetrics, Blaze\u0027s logs.\n\n- FrontierSerializer builds UploadPhaseTimings once, for both the log line and\n  a new UploadPhaseTimingsEvent posted on the event bus.\n- RemoteAnalysisCachingEventListener records the event, and MetricsCollector\n  copies it into RemoteAnalysisCacheStatistics.\n- Asynchronous uploads do not report timings yet.\n\nPiperOrigin-RevId: 1005928761\nChange-Id: I58647ce3518481fc762ae8a53c21ab279b4e9c6f\n"
    }
  ],
  "next": "c6cc07f481b2f401dbfd53f5414786dbc1215f8d"
}
